diff --git a/CODEOWNERS b/CODEOWNERS new file mode 100644 index 0000000..995a9c5 --- /dev/null +++ b/CODEOWNERS @@ -0,0 +1,2 @@ +#ECCN:EAR99 +#GUSINFO:Open Source,Open Source Workflow diff --git a/lib/beta/tableau.extensions.1.latest.js b/lib/beta/tableau.extensions.1.latest.js deleted file mode 100644 index e55d068..0000000 --- a/lib/beta/tableau.extensions.1.latest.js +++ /dev/null @@ -1,13130 +0,0 @@ -/******/ (() => { // webpackBootstrap -/******/ var __webpack_modules__ = ({ - -/***/ "../../node_modules/guid/guid.js": -/*!***************************************!*\ - !*** ../../node_modules/guid/guid.js ***! - \***************************************/ -/***/ ((module) => { - -(function () { - var validator = new RegExp("^[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}$", "i"); - - function gen(count) { - var out = ""; - for (var i=0; i { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -const TableauEvent_1 = __webpack_require__(/*! ./TableauEvent */ "./lib/src/ExtensionsApi/Events/TableauEvent.js"); -class DashboardLayoutChangedEvent extends TableauEvent_1.TableauEvent { - constructor(_dashboardLayoutChangeDetails) { - super(Contract.TableauEventType.DashboardLayoutChanged); - this._dashboardLayoutChangeDetails = _dashboardLayoutChangeDetails; - } - get dashboardLayoutChangeDetails() { - return this._dashboardLayoutChangeDetails; - } -} -exports.DashboardLayoutChangedEvent = DashboardLayoutChangedEvent; - - -/***/ }), - -/***/ "./lib/src/ExtensionsApi/Events/FilterChangedEvent.js": -/*!************************************************************!*\ - !*** ./lib/src/ExtensionsApi/Events/FilterChangedEvent.js ***! - \************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); -const TableauWorksheetEvent_1 = __webpack_require__(/*! ./TableauWorksheetEvent */ "./lib/src/ExtensionsApi/Events/TableauWorksheetEvent.js"); -class FilterChangedEvent extends TableauWorksheetEvent_1.TableauWorksheetEvent { - constructor(worksheet, _fieldName, _fieldId) { - super(api_external_contract_js_1.TableauEventType.FilterChanged, worksheet); - this._fieldName = _fieldName; - this._fieldId = _fieldId; - } - get fieldName() { - return this._fieldName; - } - get fieldId() { - return this._fieldId; - } - getFilterAsync() { - return this._worksheet.getFiltersAsync().then((filters) => { - // TODO: Filtering of the filters should eventually be done platform side. - const eventedFilter = this.fieldId - ? filters.find((filter) => filter.fieldId === this.fieldId, this) - : filters.find((filter) => filter.fieldName === this.fieldName, this); - if (!eventedFilter) { - // We shouldn't hit this unless the filter was removed from the worksheet - // after the event was raised. - throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.MissingFilter, `cannot find filter: ${this._fieldName}`); - } - return eventedFilter; - }); - } -} -exports.FilterChangedEvent = FilterChangedEvent; - - -/***/ }), - -/***/ "./lib/src/ExtensionsApi/Events/MarksSelectedEvent.js": -/*!************************************************************!*\ - !*** ./lib/src/ExtensionsApi/Events/MarksSelectedEvent.js ***! - \************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -const TableauWorksheetEvent_1 = __webpack_require__(/*! ./TableauWorksheetEvent */ "./lib/src/ExtensionsApi/Events/TableauWorksheetEvent.js"); -class MarksSelectedEvent extends TableauWorksheetEvent_1.TableauWorksheetEvent { - constructor(worksheet) { - super(api_external_contract_js_1.TableauEventType.MarkSelectionChanged, worksheet); - } - getMarksAsync() { - return this.worksheet.getSelectedMarksAsync(); - } -} -exports.MarksSelectedEvent = MarksSelectedEvent; - - -/***/ }), - -/***/ "./lib/src/ExtensionsApi/Events/ParameterChangedEvent.js": -/*!***************************************************************!*\ - !*** ./lib/src/ExtensionsApi/Events/ParameterChangedEvent.js ***! - \***************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); -const Parameter_1 = __webpack_require__(/*! ../Models/Parameter */ "./lib/src/ExtensionsApi/Models/Parameter.js"); -const ServiceRegistryUtil_1 = __webpack_require__(/*! ../Services/ServiceRegistryUtil */ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js"); -const TableauSheetEvent_1 = __webpack_require__(/*! ./TableauSheetEvent */ "./lib/src/ExtensionsApi/Events/TableauSheetEvent.js"); -class ParameterChangedEvent extends TableauSheetEvent_1.TableauSheetEvent { - constructor(_globalFieldName, sheet) { - super(api_external_contract_js_1.TableauEventType.ParameterChanged, sheet); - this._globalFieldName = _globalFieldName; - } - getParameterAsync() { - // Call down to our service to get the parameter back via its field name - const service = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("parameters-service" /* Parameters */); - return service.findParameterByGlobalFieldNameAsync(this._globalFieldName).then((parameterImpl) => { - if (parameterImpl === undefined) { - throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.MissingParameter, `Cannot find parameter: ${this._globalFieldName}`); - } - return new Parameter_1.Parameter(parameterImpl, this.sheet); - }); - } -} -exports.ParameterChangedEvent = ParameterChangedEvent; - - -/***/ }), - -/***/ "./lib/src/ExtensionsApi/Events/SummaryDataChangedEvent.js": -/*!*****************************************************************!*\ - !*** ./lib/src/ExtensionsApi/Events/SummaryDataChangedEvent.js ***! - \*****************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -const TableauWorksheetEvent_1 = __webpack_require__(/*! ./TableauWorksheetEvent */ "./lib/src/ExtensionsApi/Events/TableauWorksheetEvent.js"); -class SummaryDataChangedEvent extends TableauWorksheetEvent_1.TableauWorksheetEvent { - constructor(worksheet) { - super(api_external_contract_js_1.TableauEventType.SummaryDataChanged, worksheet); - } -} -exports.SummaryDataChangedEvent = SummaryDataChangedEvent; - - -/***/ }), - -/***/ "./lib/src/ExtensionsApi/Events/TableauEvent.js": -/*!******************************************************!*\ - !*** ./lib/src/ExtensionsApi/Events/TableauEvent.js ***! - \******************************************************/ -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -class TableauEvent { - constructor(type) { - this._type = type; - } - get type() { - return this._type; - } -} -exports.TableauEvent = TableauEvent; - - -/***/ }), - -/***/ "./lib/src/ExtensionsApi/Events/TableauSheetEvent.js": -/*!***********************************************************!*\ - !*** ./lib/src/ExtensionsApi/Events/TableauSheetEvent.js ***! - \***********************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const TableauEvent_1 = __webpack_require__(/*! ./TableauEvent */ "./lib/src/ExtensionsApi/Events/TableauEvent.js"); -class TableauSheetEvent extends TableauEvent_1.TableauEvent { - constructor(type, sheet) { - super(type); - this._sheet = sheet; - } - get sheet() { - return this._sheet; - } -} -exports.TableauSheetEvent = TableauSheetEvent; - - -/***/ }), - -/***/ "./lib/src/ExtensionsApi/Events/TableauWorksheetEvent.js": -/*!***************************************************************!*\ - !*** ./lib/src/ExtensionsApi/Events/TableauWorksheetEvent.js ***! - \***************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const TableauSheetEvent_1 = __webpack_require__(/*! ./TableauSheetEvent */ "./lib/src/ExtensionsApi/Events/TableauSheetEvent.js"); -class TableauWorksheetEvent extends TableauSheetEvent_1.TableauSheetEvent { - constructor(type, _worksheet) { - super(type, _worksheet); - this._worksheet = _worksheet; - } - get worksheet() { - return this._worksheet; - } -} -exports.TableauWorksheetEvent = TableauWorksheetEvent; - - -/***/ }), - -/***/ "./lib/src/ExtensionsApi/Events/WorkbookFormattingChangedEvent.js": -/*!************************************************************************!*\ - !*** ./lib/src/ExtensionsApi/Events/WorkbookFormattingChangedEvent.js ***! - \************************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -const TableauEvent_1 = __webpack_require__(/*! ./TableauEvent */ "./lib/src/ExtensionsApi/Events/TableauEvent.js"); -class WorkbookFormattingChangedEvent extends TableauEvent_1.TableauEvent { - constructor(_formatting) { - super(Contract.TableauEventType.WorkbookFormattingChanged); - this._formatting = _formatting; - } - get formatting() { - return this._formatting; - } -} -exports.WorkbookFormattingChangedEvent = WorkbookFormattingChangedEvent; - - -/***/ }), - -/***/ "./lib/src/ExtensionsApi/Events/WorksheetFormattingChangedEvent.js": -/*!*************************************************************************!*\ - !*** ./lib/src/ExtensionsApi/Events/WorksheetFormattingChangedEvent.js ***! - \*************************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -const TableauWorksheetEvent_1 = __webpack_require__(/*! ./TableauWorksheetEvent */ "./lib/src/ExtensionsApi/Events/TableauWorksheetEvent.js"); -class WorksheetFormattingChangedEvent extends TableauWorksheetEvent_1.TableauWorksheetEvent { - constructor(worksheet, _formatting) { - super(Contract.TableauEventType.WorksheetFormattingChanged, worksheet); - this._formatting = _formatting; - } - get formatting() { - return this._formatting; - } -} -exports.WorksheetFormattingChangedEvent = WorksheetFormattingChangedEvent; - - -/***/ }), - -/***/ "./lib/src/ExtensionsApi/Impl/BentonSansFontNameConstants.js": -/*!*******************************************************************!*\ - !*** ./lib/src/ExtensionsApi/Impl/BentonSansFontNameConstants.js ***! - \*******************************************************************/ -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.BentonSansFontFamilyName = 'Benton Sans'; -exports.BentonSansLowDPIFontFamilyName = 'Benton Sans Low-DPI'; -exports.BentonSansBookFontFaceName = 'Benton Sans Book'; -exports.BentonSansBookItalicFontFaceName = 'Benton Sans Book Italic'; -exports.BentonSansSemiDemiFontFaceName = 'Benton Sans SemiDemi'; -exports.BentonSansSemiDemiItalicFontFaceName = 'Benton Sans SemiDemi Italic'; -exports.BentonSansLightFontFaceName = 'Benton Sans Light'; -exports.BentonSansMediumFontFaceName = 'Benton Sans Medium'; -exports.SupportedBentonSansFontFaces = [ - exports.BentonSansBookFontFaceName, - exports.BentonSansBookItalicFontFaceName, - exports.BentonSansSemiDemiFontFaceName, - exports.BentonSansSemiDemiItalicFontFaceName, - exports.BentonSansLightFontFaceName, - exports.BentonSansMediumFontFaceName, -]; - - -/***/ }), - -/***/ "./lib/src/ExtensionsApi/Impl/ConnectedServer.js": -/*!*******************************************************!*\ - !*** ./lib/src/ExtensionsApi/Impl/ConnectedServer.js ***! - \*******************************************************/ -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -class ConnectedServer { - constructor(_userId, _siteId, _siteNamespace, _workbookId) { - this._userId = _userId; - this._siteId = _siteId; - this._siteNamespace = _siteNamespace; - this._workbookId = _workbookId; - } - get userId() { - return this._userId; - } - get siteId() { - return this._siteId; - } - get siteNamespace() { - return this._siteNamespace; - } - get workbookId() { - return this._workbookId; - } -} -exports.ConnectedServer = ConnectedServer; - - -/***/ }), - -/***/ "./lib/src/ExtensionsApi/Impl/ExtensionWorkbookImpl.js": -/*!*************************************************************!*\ - !*** ./lib/src/ExtensionsApi/Impl/ExtensionWorkbookImpl.js ***! - \*************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); -const ServiceRegistryUtil_1 = __webpack_require__(/*! ../Services/ServiceRegistryUtil */ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js"); -class ExtensionWorkbookImpl extends api_shared_js_1.WorkbookImpl { - getAllDataSourcesAsync() { - const service = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("data-source-service" /* DataSourceService */); - return service.getAllDataSourcesAsync().then((result) => { - const dataSchema = result; - const dataSources = []; - // Loop through all data sources and add them. - Object.values(dataSchema.dataSources).forEach((ds) => { - dataSources.push(this.createDataSourceFromInfo(ds)); - }); - return dataSources; - }); - } - createDataSourceFromInfo(dataSourceInfo) { - const dataSourceImpl = new api_shared_js_1.DataSourceImpl(dataSourceInfo, ServiceRegistryUtil_1.ExtensionsRegistryId); - const dataSource = new api_shared_js_1.DataSource(dataSourceImpl); - dataSourceImpl.initializeWithPublicInterfaces(dataSource); - return dataSource; - } -} -exports.ExtensionWorkbookImpl = ExtensionWorkbookImpl; - - -/***/ }), - -/***/ "./lib/src/ExtensionsApi/Impl/ExtensionsImpl.js": -/*!******************************************************!*\ - !*** ./lib/src/ExtensionsApi/Impl/ExtensionsImpl.js ***! - \******************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); -const Dashboard_1 = __webpack_require__(/*! ../Models/Dashboard */ "./lib/src/ExtensionsApi/Models/Dashboard.js"); -const Workbook_1 = __webpack_require__(/*! ../Models/Workbook */ "./lib/src/ExtensionsApi/Models/Workbook.js"); -const Worksheet_1 = __webpack_require__(/*! ../Models/Worksheet */ "./lib/src/ExtensionsApi/Models/Worksheet.js"); -const DashboardContent_1 = __webpack_require__(/*! ../Namespaces/DashboardContent */ "./lib/src/ExtensionsApi/Namespaces/DashboardContent.js"); -const Environment_1 = __webpack_require__(/*! ../Namespaces/Environment */ "./lib/src/ExtensionsApi/Namespaces/Environment.js"); -const Settings_1 = __webpack_require__(/*! ../Namespaces/Settings */ "./lib/src/ExtensionsApi/Namespaces/Settings.js"); -const UI_1 = __webpack_require__(/*! ../Namespaces/UI */ "./lib/src/ExtensionsApi/Namespaces/UI.js"); -const WorkbookFormattingEnvUtil_1 = __webpack_require__(/*! ../Namespaces/WorkbookFormattingEnvUtil */ "./lib/src/ExtensionsApi/Namespaces/WorkbookFormattingEnvUtil.js"); -const WorksheetContent_1 = __webpack_require__(/*! ../Namespaces/WorksheetContent */ "./lib/src/ExtensionsApi/Namespaces/WorksheetContent.js"); -const RegisterAllExtensionsServices_1 = __webpack_require__(/*! ../Services/RegisterAllExtensionsServices */ "./lib/src/ExtensionsApi/Services/RegisterAllExtensionsServices.js"); -const ServiceRegistryUtil_1 = __webpack_require__(/*! ../Services/ServiceRegistryUtil */ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js"); -const BentonSansFontNameConstants_1 = __webpack_require__(/*! ./BentonSansFontNameConstants */ "./lib/src/ExtensionsApi/Impl/BentonSansFontNameConstants.js"); -const ExtensionWorkbookImpl_1 = __webpack_require__(/*! ./ExtensionWorkbookImpl */ "./lib/src/ExtensionsApi/Impl/ExtensionWorkbookImpl.js"); -const LegacyInternalApiDispatcherHolder_1 = __webpack_require__(/*! ./LegacyInternalApiDispatcherHolder */ "./lib/src/ExtensionsApi/Impl/LegacyInternalApiDispatcherHolder.js"); -const SettingsImpl_1 = __webpack_require__(/*! ./SettingsImpl */ "./lib/src/ExtensionsApi/Impl/SettingsImpl.js"); -const TableauBookFontNameConstants_1 = __webpack_require__(/*! ./TableauBookFontNameConstants */ "./lib/src/ExtensionsApi/Impl/TableauBookFontNameConstants.js"); -const UIImpl_1 = __webpack_require__(/*! ./UIImpl */ "./lib/src/ExtensionsApi/Impl/UIImpl.js"); -class ExtensionsImpl { - initializeAsync(isExtensionDialog, contextMenuCallbacks) { - if (!this._initializationPromise) { - this._initializationPromise = new Promise((resolve, reject) => { - var _a; - const initOptions = { isAlpha: api_shared_js_1.ApiVersion.Instance.isAlpha }; - // First thing we want to do is check to see if there is a desktop dispatcher already registered for us - if (LegacyInternalApiDispatcherHolder_1.LegacyInternalApiDispatcherHolder.hasDesktopApiDispatcherPromise(initOptions)) { - // Running in a pre-2019.3 desktop, use our legacy dispatcher promise - const desktopDispatcherPromise = LegacyInternalApiDispatcherHolder_1.LegacyInternalApiDispatcherHolder.getDesktopDispatcherPromise(initOptions); - (_a = desktopDispatcherPromise) === null || _a === void 0 ? void 0 : _a.then((dispatcherFactory) => this.onDispatcherReceived(dispatcherFactory, isExtensionDialog, contextMenuCallbacks)).then((openPayload) => { - resolve(openPayload); - }).catch((error) => { - reject(error); - }); - } - else { - // We must be running in server, so we should try to kick of the server dispatcher bootstrapping - const onDispatcherReceivedCallback = this.onDispatcherReceived.bind(this); - api_shared_js_1.doCrossFrameBootstrap(window, api_internal_contract_js_1.INTERNAL_CONTRACT_VERSION, initOptions) - .then((factory) => { - return onDispatcherReceivedCallback(factory, isExtensionDialog, contextMenuCallbacks); - }) - .then((openPayload) => { - resolve(openPayload); - }) - .catch((error) => { - reject(error); - }); - } - }); - } - return this._initializationPromise; - } - createVizImageAsync(inputSpec) { - const vizService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("viz-service" /* Viz */); - return vizService.createVizImageAsync(inputSpec); - } - setClickThroughAsync(clickThroughEnabled) { - const uiService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("UIService" /* UIService */); - return uiService.setClickThroughAsync(clickThroughEnabled, this.extensionZoneId); - } - isDashboardExtensionLocator(locator) { - const dashboardExtensionLocator = locator; - if (!dashboardExtensionLocator.dashboardPath) { - throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, 'Unexpected error during initialization.'); - } - return true; - } - onDispatcherReceived(dispatcherFactory, isExtensionDialog, contextMenuFunctions) { - let dispatcher = dispatcherFactory(api_internal_contract_js_1.INTERNAL_CONTRACT_VERSION); - // Call to register all the services which will use the newly initialized dispatcher - RegisterAllExtensionsServices_1.registerInitializationExtensionsServices(dispatcher); - // Get the initialization service and initialize this extension - const initializationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("InitializationService" /* InitializationService */); - const callbackMapKeys = contextMenuFunctions ? Object.keys(contextMenuFunctions) : []; - return initializationService.initializeDashboardExtensionsAsync(isExtensionDialog, callbackMapKeys).then((result) => { - // If we receive an invalid plaform version, this means that platform is runnning 1.4 or 2.1 and - // doesn't pass the platform version to external. In this case we assume the platform version to be 1.9 - const platformVersion = result.extensionEnvironment.platformVersion - ? result.extensionEnvironment.platformVersion - : { major: 1, minor: 9, fix: 0 }; - // Wrap our existing dispatcher in a dispatcher that can downgrade/upgrade for an older platform. - if (api_shared_js_1.VersionedExternalApiDispatcher.needsVersionConverter(platformVersion)) { - dispatcher = new api_shared_js_1.VersionedExternalApiDispatcher(dispatcher, platformVersion); - } - // Registration of services must happen before initializing content and environment - // Extensions doesn't need to pass in a registryId. By default, the service registry instance is associated with registryId=0. - api_shared_js_1.registerAllSharedServices(dispatcher, ServiceRegistryUtil_1.ExtensionsRegistryId); - RegisterAllExtensionsServices_1.registerAllExtensionsServices(dispatcher); - if (result.extensionDashboardInfo && this.isDashboardExtensionLocator(result.extensionInstance.locator)) { - this.dashboardContent = this.initializeDashboardContent(result.extensionDashboardInfo, result.extensionInstance.locator.dashboardPath); - this.extensionZoneId = result.extensionDashboardInfo.extensionZoneId; - } - if (result.extensionWorksheetInfo) { - this.worksheetContent = this.initializeWorksheetContent(result.extensionWorksheetInfo); - } - this.environment = new Environment_1.Environment(result.extensionEnvironment); - this.settings = this.initializeSettings(result.extensionSettingsInfo); - this.ui = new UI_1.UI(new UIImpl_1.UIImpl()); - this.workbook = new Workbook_1.Workbook(new ExtensionWorkbookImpl_1.ExtensionWorkbookImpl()); - if (result.extensionEnvironment.workbookFormatting) { - this.initializeTableauFonts(dispatcher, result.extensionEnvironment.workbookFormatting); - this.applyAllFormatting(result.extensionEnvironment.workbookFormatting); - } - // After initialization has completed, setup listeners for the callback functions that - // are meant to be triggered whenever a context menu item is clicked. - this.initializeContextMenuCallbacks(contextMenuFunctions); - // Also set up listeners for ExtensionStylesChangedEvent - this.initializeWorkbookFormattingChangedEventCallback(dispatcher); - // In the normal initialization case, this will be an empty string. When returning from initializeAsync to the - // developer, we just ingore that string. In the case of initializing from an extension dialog, this string - // is an optional payload sent from the parent extension. - return result.extensionDialogPayload; - }); - } - applyAllFormatting(formattingModel) { - if (!this._styleElement) { - this._styleElement = document.createElement('style'); - this._styleElement.id = 'Tableau-Extension-Formatting'; - document.head.appendChild(this._styleElement); - } - if (!this._styleElement.sheet || !formattingModel) { - return; - } - const stylesheet = this._styleElement.sheet; - while (stylesheet.cssRules.length > 0) { - stylesheet.deleteRule(stylesheet.cssRules.length - 1); - } - formattingModel.formattingSheets.map((currentFormattingSheet) => { - this.applyFormattingSheetToStyleSheet(currentFormattingSheet, stylesheet); - }); - } - applyFormattingSheetToStyleSheet(currentFormattingSheet, stylesheet) { - let styleInfo = ''; - const cssProperties = currentFormattingSheet.cssProperties; - if (cssProperties.fontFamily) { - styleInfo += 'font-family: ' + cssProperties.fontFamily.toString() + '; '; - } - if (cssProperties.fontSize) { - styleInfo += 'font-size: ' + cssProperties.fontSize.toString() + '; '; - } - if (cssProperties.fontWeight) { - styleInfo += 'font-weight: ' + cssProperties.fontWeight.toString() + '; '; - } - if (cssProperties.fontStyle) { - styleInfo += 'font-style: ' + cssProperties.fontStyle.toString() + '; '; - } - if (cssProperties.textDecoration) { - styleInfo += 'text-decoration: ' + cssProperties.textDecoration.toString() + '; '; - } - if (cssProperties.color) { - styleInfo += 'color: ' + cssProperties.color + '; '; - } - const selector = '.' + currentFormattingSheet.classNameKey; - const rule = selector + ' { ' + styleInfo + ' }'; - stylesheet.insertRule(rule, stylesheet.cssRules.length); - } - initializeWorkbookFormattingChangedEventCallback(dispatcher) { - const notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("notification-service" /* Notification */); - // Unregister function not used since these notifications should be - // observed for the full lifetime of the extension. - notificationService.registerHandler(api_internal_contract_js_1.NotificationId.WorkbookFormattingChanged, () => true, (eventFormatting) => { - if (eventFormatting) { - this.initializeTableauFonts(dispatcher, eventFormatting); - this.applyAllFormatting(eventFormatting); - } - }); - } - initializeTableauFonts(dispatcher, workbookFormatting) { - const fontNames = [...BentonSansFontNameConstants_1.SupportedBentonSansFontFaces, ...TableauBookFontNameConstants_1.SupportedTableauFontFaces]; - workbookFormatting.formattingSheets.forEach((formattingSheet) => { - if (formattingSheet.cssProperties.fontFamily) { - fontNames.push(formattingSheet.cssProperties.fontFamily); - } - }); - if (fontNames.length > 0) { - const parameters = { [api_internal_contract_js_1.ParameterId.FontNameListItems]: fontNames }; - dispatcher - .execute(api_internal_contract_js_1.VerbId.GetFonts, parameters) - .then((response) => { - this.loadFonts(response.result); - }) - .catch(); - } - } - loadFonts(fonts) { - fonts.forEach((fontNameAndInfo) => { - if (TableauBookFontNameConstants_1.SupportedTableauFontFaces.includes(fontNameAndInfo.fontName)) { - this.loadTableauFonts(fontNameAndInfo); - } - else if (BentonSansFontNameConstants_1.SupportedBentonSansFontFaces.includes(fontNameAndInfo.fontName)) { - this.loadBentonSansFonts(fontNameAndInfo); - } - else { - document.fonts.add(new FontFace(fontNameAndInfo.fontName, fontNameAndInfo.fontBinaryInfo)); - } - }); - } - initializeDashboardContent(info, sheetPath) { - // sheets are always active for Extensions - const sheetInfoImpl = new api_shared_js_1.SheetInfoImpl(info.name, api_external_contract_js_1.SheetType.Dashboard, { width: info.size.w, height: info.size.h }, undefined, true); - const dashboardImpl = new api_shared_js_1.DashboardImpl(sheetInfoImpl, info.zones, sheetPath, ServiceRegistryUtil_1.ExtensionsRegistryId, null, info.activeDashboardObjectId); - const dashboard = new Dashboard_1.Dashboard(dashboardImpl); - return new DashboardContent_1.DashboardContent(dashboard); - } - initializeWorksheetContent(info) { - const sheetInfoImpl = new api_shared_js_1.SheetInfoImpl(info.visualId.worksheet, api_external_contract_js_1.SheetType.Worksheet, { width: info.size.w, height: info.size.h }, undefined, // index property is embedding specific - true); - const worksheetImpl = new api_shared_js_1.WorksheetImpl(sheetInfoImpl, ServiceRegistryUtil_1.ExtensionsRegistryId, info.visualId, null, // parentDashboard is always null for worksheet in WorksheetContent - null, // parentStoryPoint is only used for embedding - info.backgroundColor, WorkbookFormattingEnvUtil_1.WorkbookFormattingEnvUtil.convertToWorkbookFormatting(info.formatting)); - const worksheet = new Worksheet_1.Worksheet(worksheetImpl); - return new WorksheetContent_1.WorksheetContent(worksheet); - } - initializeSettings(settingsInfo) { - const settingsImpl = new SettingsImpl_1.SettingsImpl(settingsInfo); - return new Settings_1.Settings(settingsImpl); - } - initializeContextMenuCallbacks(contextMenuFunctions) { - const notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("notification-service" /* Notification */); - // Unregister function not used since these notifications should be - // observed for the full lifetime of the extension. - notificationService.registerHandler(api_internal_contract_js_1.NotificationId.ContextMenuClick, () => { - // Let through any context menu event, these are already filtered on api-core - // based on the extension locator. - return true; - }, (event) => { - // Execute the function associated with this context menu ID - if (contextMenuFunctions) { - if (!contextMenuFunctions[event.id]) { - throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, `Received unexpected context menu Id from event: ${event.id}`); - } - contextMenuFunctions[event.id](); - } - }); - } - loadTableauFonts(fontNameAndInfo) { - switch (fontNameAndInfo.fontName) { - case TableauBookFontNameConstants_1.TableauBookFontFaceName: - document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauBookFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'normal', style: 'normal' })); - break; - case TableauBookFontNameConstants_1.TableauLightFontFaceName: - document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauLightFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'normal', style: 'normal' })); - break; - case TableauBookFontNameConstants_1.TableauRegularFontFaceName: - document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauRegularFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'normal', style: 'normal' })); - break; - case TableauBookFontNameConstants_1.TableauSemiBoldFontFaceName: - document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauSemiboldFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'normal', style: 'normal' })); - document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauRegularFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'bold', style: 'normal' })); - break; - case TableauBookFontNameConstants_1.TableauBoldFontFaceName: - document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauBoldFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'normal', style: 'normal' })); - document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauBoldFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'bold', style: 'normal' })); - document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauMediumFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'bold', style: 'normal' })); - document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauSemiboldFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'bold', style: 'normal' })); - break; - case TableauBookFontNameConstants_1.TableauMediumFontFaceName: - document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauMediumFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'normal', style: 'normal' })); - document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauLightFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'bold', style: 'normal' })); - document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauBookFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'bold', style: 'normal' })); - break; - default: - throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, `'attempted to load unsupported font: ${fontNameAndInfo.fontName}.'`); - } - } - loadBentonSansFonts(fontNameAndInfo) { - switch (fontNameAndInfo.fontName) { - case BentonSansFontNameConstants_1.BentonSansBookFontFaceName: - document.fonts.add(new FontFace(BentonSansFontNameConstants_1.BentonSansFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'normal', style: 'normal' })); - document.fonts.add(new FontFace(BentonSansFontNameConstants_1.BentonSansLowDPIFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: '100', style: 'normal' })); - break; - case BentonSansFontNameConstants_1.BentonSansLightFontFaceName: - document.fonts.add(new FontFace(BentonSansFontNameConstants_1.BentonSansFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: '100', style: 'normal' })); - break; - case BentonSansFontNameConstants_1.BentonSansMediumFontFaceName: - document.fonts.add(new FontFace(BentonSansFontNameConstants_1.BentonSansFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'bold', style: 'normal' })); - document.fonts.add(new FontFace(BentonSansFontNameConstants_1.BentonSansLowDPIFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'bold', style: 'normal' })); - break; - case BentonSansFontNameConstants_1.BentonSansSemiDemiFontFaceName: - document.fonts.add(new FontFace(BentonSansFontNameConstants_1.BentonSansLowDPIFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'normal', style: 'normal' })); - break; - case BentonSansFontNameConstants_1.BentonSansBookItalicFontFaceName: - document.fonts.add(new FontFace(BentonSansFontNameConstants_1.BentonSansFontFamilyName, fontNameAndInfo.fontBinaryInfo, { style: 'italic' })); - break; - case BentonSansFontNameConstants_1.BentonSansSemiDemiItalicFontFaceName: - document.fonts.add(new FontFace(BentonSansFontNameConstants_1.BentonSansLowDPIFontFamilyName, fontNameAndInfo.fontBinaryInfo, { style: 'italic' })); - break; - default: - throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, `'attempted to load unsupported font: ${fontNameAndInfo.fontName}.'`); - } - } -} -exports.ExtensionsImpl = ExtensionsImpl; - - -/***/ }), - -/***/ "./lib/src/ExtensionsApi/Impl/LegacyInternalApiDispatcherHolder.js": -/*!*************************************************************************!*\ - !*** ./lib/src/ExtensionsApi/Impl/LegacyInternalApiDispatcherHolder.js ***! - \*************************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -/** - * LegacyInternalApiDispatcherHolder has been moved (and renamed) from api-internal-contract. - * It supports running a newer external library against a pre 2019.3 desktop. - * Starting in 2019.3, we have a merged bootstrap style for both desktop and server. - * In addition, the alpha checking that is happening here is not necessary in external-api-js - * after 2019.3 because that checking happens in api-platform-js (ApiDispatcherTest.ts) - * TFSID: 1091561 tracks an improvement to this system to make it less complex and tie it directly to - * tableau beta release versions. - * @deprecated - */ -// eslint-disable-next-line @typescript-eslint/no-namespace -var LegacyInternalApiDispatcherHolder; -(function (LegacyInternalApiDispatcherHolder) { - /** - * @param options - */ - function getDesktopDispatcherPromise(options) { - var _a; - if ((!options || typeof options.isAlpha === 'undefined') && !window.__warningIssued) { - // tslint:disable-next-line:no-console - console.warn('This is a beta version of the Extensions API. Please upgrade to an official release.'); - window.__warningIssued = true; - } - else if (((_a = options) === null || _a === void 0 ? void 0 : _a.isAlpha) && window.__platformIsOfficialRelease) { - window.__tableauDesktopDispatcher - .then((dispatcherFactory) => { - const dispatcher = dispatcherFactory(api_internal_contract_js_1.INTERNAL_CONTRACT_VERSION); - dispatcher.execute(api_internal_contract_js_1.VerbId.BlockExtension, {}).catch(); - }) - .catch(); - } - // this will be undefined if promise is rejected or throws - return window.__tableauDesktopDispatcher; - } - LegacyInternalApiDispatcherHolder.getDesktopDispatcherPromise = getDesktopDispatcherPromise; - /** - * @param options - */ - function hasDesktopApiDispatcherPromise(options) { - return !!getDesktopDispatcherPromise(options); - } - LegacyInternalApiDispatcherHolder.hasDesktopApiDispatcherPromise = hasDesktopApiDispatcherPromise; -})(LegacyInternalApiDispatcherHolder = exports.LegacyInternalApiDispatcherHolder || (exports.LegacyInternalApiDispatcherHolder = {})); - - -/***/ }), - -/***/ "./lib/src/ExtensionsApi/Impl/SettingsImpl.js": -/*!****************************************************!*\ - !*** ./lib/src/ExtensionsApi/Impl/SettingsImpl.js ***! - \****************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); -const TableauEvent_1 = __webpack_require__(/*! ../Events/TableauEvent */ "./lib/src/ExtensionsApi/Events/TableauEvent.js"); -const ServiceRegistryUtil_1 = __webpack_require__(/*! ../Services/ServiceRegistryUtil */ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js"); -class SettingsChangedEvent extends TableauEvent_1.TableauEvent { - constructor(_newSettings) { - super(Contract.TableauEventType.SettingsChanged); - this._newSettings = _newSettings; - } - get newSettings() { - return this._newSettings; - } -} -class SettingsImpl { - constructor(settingsInfo) { - // Since promises can't be introspected for state, keep a variable that - // indicates a save is in progress, so that set/erase can't be called during a save. - this._saveInProgress = false; - this.initializeSettings(settingsInfo); - } - erase(key) { - api_shared_js_1.ErrorHelpers.verifyParameter(key, 'key'); - // Only make a modification if we have the key already - if (this._currentSettings[key]) { - this.verifySettingsAreUnlocked(); - delete this._currentSettings[key]; - this._isModified = true; - } - } - get(key) { - api_shared_js_1.ErrorHelpers.verifyParameter(key, 'key'); - return this._currentSettings[key]; - } - getAll() { - // Returns a mutable copy of the settings - return Object.assign({}, this._currentSettings); - } - get isModified() { - return this._isModified; - } - saveAsync() { - this.verifySettingsAreUnlocked(); - // Just resolve immediately if settings are unchanged - if (!this._isModified) { - return Promise.resolve(this._currentSettings); - } - this._saveInProgress = true; - // Use the settings service to save settings to twb - const settingsService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("SettingsService" /* SettingsService */); - return settingsService.saveSettingsAsync(this._currentSettings).then((newSettings) => { - this._saveInProgress = false; - this._isModified = false; - if (this._currentSettings === undefined) { - this._currentSettings = newSettings; - } - else { - Object.assign(this._currentSettings, newSettings); - } - return newSettings; - }, (reason) => { - this._saveInProgress = false; - return Promise.reject(reason); - }); - } - set(key, value) { - api_shared_js_1.ErrorHelpers.verifyStringParameter(key, 'key'); // Key shouldn't be an empty string. - api_shared_js_1.ErrorHelpers.verifyParameter(value, 'value'); // Empty string value is allowed. - this.verifySettingsAreUnlocked(); - this._currentSettings[key] = value; - this._isModified = true; - } - /** - * Initializes all events relevant to settings object. This is only a settingsUpdate event currently. - * - * @returns {Array} Collection of event managers to pass to an EventListenerManager. - */ - initializeEvents() { - const results = new Array(); - let notificationService; - try { - notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("notification-service" /* Notification */); - } - catch (e) { - // If we don't have this service registered, just return - return results; - } - const settingsChangedEvent = new api_shared_js_1.SingleEventManagerImpl(Contract.TableauEventType.SettingsChanged); - notificationService.registerHandler(api_internal_contract_js_1.NotificationId.SettingsChanged, () => true, (event) => { - this._currentSettings = event.newSettings; - settingsChangedEvent.triggerEvent(() => new SettingsChangedEvent(event.newSettings)); - }); - results.push(settingsChangedEvent); - return results; - } - initializeSettings(settingsInfo) { - api_shared_js_1.ErrorHelpers.verifyParameter(settingsInfo, 'settingsInfo'); - api_shared_js_1.ErrorHelpers.verifyParameter(settingsInfo.settingsValues, 'settingsInfo.SettingsValues'); - this._currentSettings = settingsInfo.settingsValues; - // Reset the isModified flag - this._isModified = false; - } - /** - * This helper should be called before any local update to this.currentSettings. - * Checks if a current save call is still in progress and throws an error if so. - */ - verifySettingsAreUnlocked() { - if (this._saveInProgress) { - throw new api_shared_js_1.TableauError(Contract.ErrorCodes.SettingSaveInProgress, SettingsImpl.ASYNC_SAVE_IN_PROGRESS); - } - } -} -exports.SettingsImpl = SettingsImpl; -SettingsImpl.ASYNC_SAVE_IN_PROGRESS = 'Async Save is in progress, updating settings is not allowed.'; - - -/***/ }), - -/***/ "./lib/src/ExtensionsApi/Impl/TableauBookFontNameConstants.js": -/*!********************************************************************!*\ - !*** ./lib/src/ExtensionsApi/Impl/TableauBookFontNameConstants.js ***! - \********************************************************************/ -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.TableauBookFontFamilyName = 'Tableau Book'; -exports.TableauLightFontFamilyName = 'Tableau Light'; -exports.TableauRegularFontFamilyName = 'Tableau Regular'; -exports.TableauMediumFontFamilyName = 'Tableau Medium'; -exports.TableauSemiboldFontFamilyName = 'Tableau Semibold'; -exports.TableauBoldFontFamilyName = 'Tableau Bold'; -exports.TableauBookFontFaceName = 'Tableau Book'; -exports.TableauBoldFontFaceName = 'Tableau Bold'; -exports.TableauLightFontFaceName = 'Tableau Light'; -exports.TableauMediumFontFaceName = 'Tableau Medium'; -exports.TableauRegularFontFaceName = 'Tableau Regular'; -exports.TableauSemiBoldFontFaceName = 'Tableau Semi Bold'; -exports.SupportedTableauFontFaces = [ - exports.TableauBookFontFaceName, - exports.TableauBoldFontFaceName, - exports.TableauLightFontFaceName, - exports.TableauMediumFontFaceName, - exports.TableauRegularFontFaceName, - exports.TableauSemiBoldFontFaceName, -]; - - -/***/ }), - -/***/ "./lib/src/ExtensionsApi/Impl/UIImpl.js": -/*!**********************************************!*\ - !*** ./lib/src/ExtensionsApi/Impl/UIImpl.js ***! - \**********************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); -const TableauEvent_1 = __webpack_require__(/*! ../Events/TableauEvent */ "./lib/src/ExtensionsApi/Events/TableauEvent.js"); -const ServiceRegistryUtil_1 = __webpack_require__(/*! ../Services/ServiceRegistryUtil */ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js"); -class DialogMessageEvent extends TableauEvent_1.TableauEvent { - constructor(message) { - super(Contract.TableauEventType.DialogMessageReceived); - this.message = message; - } -} -exports.DialogMessageEvent = DialogMessageEvent; -class UIImpl { - constructor() { } - displayDialogAsync(url, payload, options) { - const uiService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("UIService" /* UIService */); - const notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("notification-service" /* Notification */); - return new Promise((resolve, reject) => { - uiService - .displayDialogAsync(url, payload || '', options) - .then(() => { - const unregisterFn = notificationService.registerHandler(api_internal_contract_js_1.NotificationId.ExtensionDialogUpdate, () => { - // Let through any dialog update event - return true; - }, (event) => { - if (event.isCloseEvent) { - if (event.closePayload === undefined) { - throw new api_shared_js_1.TableauError(Contract.ErrorCodes.InternalError, 'closePayload is undefined'); - } - resolve(event.closePayload); - } - else { - reject(new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.DialogClosedByUser, 'Extension dialog closed by user.')); - } - unregisterFn(); - }); - }) - .catch((error) => { - reject(error); - }); - }); - } - sendDialogMessageAsync(message, targetDialogUrl) { - const uiService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("UIService" /* UIService */); - uiService.sendDialogMessageAsync(message, targetDialogUrl); - } - closeDialog(payload) { - const uiService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("UIService" /* UIService */); - uiService.closeDialog(payload); - } - /** - * Initializes all events relevant to UI object. - * - * @returns {Array} Collection of event managers to pass to an EventListenerManager. - */ - initializeEvents() { - const results = new Array(); - let notificationService; - try { - notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("notification-service" /* Notification */); - } - catch (e) { - // If we don't have this service registered, just return - return results; - } - const dialogMessageEvent = new api_shared_js_1.SingleEventManagerImpl(Contract.TableauEventType.DialogMessageReceived); - notificationService.registerHandler(api_internal_contract_js_1.NotificationId.ExtensionDialogMessage, () => true, (event) => { - dialogMessageEvent.triggerEvent(() => new DialogMessageEvent(event.message)); - }); - results.push(dialogMessageEvent); - return results; - } -} -exports.UIImpl = UIImpl; - - -/***/ }), - -/***/ "./lib/src/ExtensionsApi/Models/Dashboard.js": -/*!***************************************************!*\ - !*** ./lib/src/ExtensionsApi/Models/Dashboard.js ***! - \***************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); -const DashboardLayoutChangedEvent_1 = __webpack_require__(/*! ../Events/DashboardLayoutChangedEvent */ "./lib/src/ExtensionsApi/Events/DashboardLayoutChangedEvent.js"); -const WorkbookFormattingChangedEvent_1 = __webpack_require__(/*! ../Events/WorkbookFormattingChangedEvent */ "./lib/src/ExtensionsApi/Events/WorkbookFormattingChangedEvent.js"); -const ServiceRegistryUtil_1 = __webpack_require__(/*! ../Services/ServiceRegistryUtil */ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js"); -const DashboardObject_1 = __webpack_require__(/*! ./DashboardObject */ "./lib/src/ExtensionsApi/Models/DashboardObject.js"); -const Sheet_1 = __webpack_require__(/*! ./Sheet */ "./lib/src/ExtensionsApi/Models/Sheet.js"); -const Worksheet_1 = __webpack_require__(/*! ./Worksheet */ "./lib/src/ExtensionsApi/Models/Worksheet.js"); -class Dashboard extends Sheet_1.Sheet { - constructor(_dashboardImpl) { - super(_dashboardImpl); - this._dashboardImpl = _dashboardImpl; - _dashboardImpl.initializeWithPublicInterfaces(); - this.initializeEvents().forEach((e) => this.addNewEventType(e)); - } - get worksheets() { - return this._dashboardImpl.worksheetsImpl.map((worksheetImpl) => { - return new Worksheet_1.Worksheet(worksheetImpl); - }); - } - get objects() { - return this._dashboardImpl.objects.map((dashboardObjectImpl) => { - return new DashboardObject_1.DashboardObject(dashboardObjectImpl); - }); - } - get activeDashboardObjectId() { - return this._dashboardImpl.activeDashboardObjectId; - } - get activeDashboardName() { - return this._dashboardImpl.activeDashboardName; - } - setZoneVisibilityAsync(zoneVisibilityMap) { - return this._dashboardImpl.setDashboardObjectVisibilityAsync(zoneVisibilityMap); - } - setDashboardObjectVisibilityAsync(dashboardObjectVisibilityMap) { - return this._dashboardImpl.setDashboardObjectVisibilityAsync(dashboardObjectVisibilityMap); - } - getDashboardObjectById(dashboardObjectId) { - const zone = this._dashboardImpl.getDashboardObjectById(dashboardObjectId); - return zone && new DashboardObject_1.DashboardObject(zone); - } - initializeEvents() { - const results = new Array(); - // Initializing events and registering notification service - let notificationService; - try { - notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("notification-service" /* Notification */); - } - catch (e) { - // If we don't have this service registered, just return (allows unit testing without NotificationService mock) - return results; - } - const dashboardLayoutChangedEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.DashboardLayoutChanged); - notificationService.registerHandler(api_internal_contract_js_1.NotificationId.DashboardLayoutChanged, () => true, (event) => { - const dashboardObjectChanges = this._dashboardImpl.updateZones(event.zones, event.activeZoneId, event.activeDashboardName); - dashboardLayoutChangedEvent.triggerEvent(() => new DashboardLayoutChangedEvent_1.DashboardLayoutChangedEvent(dashboardObjectChanges)); - }); - results.push(dashboardLayoutChangedEvent); - const workbookFormattingChangedEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.WorkbookFormattingChanged); - notificationService.registerHandler(api_internal_contract_js_1.NotificationId.WorkbookFormattingChanged, () => true, (eventFormatting) => { - workbookFormattingChangedEvent.triggerEvent(() => new WorkbookFormattingChangedEvent_1.WorkbookFormattingChangedEvent(eventFormatting)); - }); - results.push(workbookFormattingChangedEvent); - return results; - } - moveAndResizeDashboardObjectsAsync(dashboardObjectPositionAndSizeUpdateArray) { - return this._dashboardImpl.moveAndResizeDashboardObjectsAsync(dashboardObjectPositionAndSizeUpdateArray); - } - replayAnimationAsync(replaySpeed) { - return this._dashboardImpl.replayAnimationAsync(replaySpeed); - } - getFiltersAsync() { - return this._dashboardImpl.getFiltersAsync(); - } - applyFilterAsync(fieldName, values, updateType, options) { - return this._dashboardImpl.applyFilterAsync(fieldName, values, updateType, options); - } -} -exports.Dashboard = Dashboard; - - -/***/ }), - -/***/ "./lib/src/ExtensionsApi/Models/DashboardObject.js": -/*!*********************************************************!*\ - !*** ./lib/src/ExtensionsApi/Models/DashboardObject.js ***! - \*********************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const Dashboard_1 = __webpack_require__(/*! ./Dashboard */ "./lib/src/ExtensionsApi/Models/Dashboard.js"); -const Worksheet_1 = __webpack_require__(/*! ./Worksheet */ "./lib/src/ExtensionsApi/Models/Worksheet.js"); -/** - * Implementation of the dashboard objects - the zones in a dashboard. - */ -class DashboardObject { - constructor(_dashboardObjectImpl) { - this._dashboardObjectImpl = _dashboardObjectImpl; - } - get dashboard() { - return new Dashboard_1.Dashboard(this._dashboardObjectImpl.dashboardImpl); - } - get type() { - return this._dashboardObjectImpl.type; - } - get position() { - return this._dashboardObjectImpl.position; - } - get size() { - return this._dashboardObjectImpl.size; - } - get worksheet() { - if (this._dashboardObjectImpl.worksheetImpl) { - return new Worksheet_1.Worksheet(this._dashboardObjectImpl.worksheetImpl); - } - return undefined; - } - get name() { - return this._dashboardObjectImpl.name; - } - get isFloating() { - return this._dashboardObjectImpl.isFloating; - } - get isVisible() { - return this._dashboardObjectImpl.isVisible; - } - get id() { - return this._dashboardObjectImpl.id; - } - get fieldId() { - return this._dashboardObjectImpl.fieldId; - } -} -exports.DashboardObject = DashboardObject; - - -/***/ }), - -/***/ "./lib/src/ExtensionsApi/Models/Parameter.js": -/*!***************************************************!*\ - !*** ./lib/src/ExtensionsApi/Models/Parameter.js ***! - \***************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); -const ParameterChangedEvent_1 = __webpack_require__(/*! ../Events/ParameterChangedEvent */ "./lib/src/ExtensionsApi/Events/ParameterChangedEvent.js"); -const ServiceRegistryUtil_1 = __webpack_require__(/*! ../Services/ServiceRegistryUtil */ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js"); -/** - * Implementation of the Parameter contract. Calls down to the impl - * class for almost all of the work it does. - */ -class Parameter extends api_shared_js_1.EventListenerManager { - constructor(parameterImpl, sheet) { - super(); - this.parameterImpl = parameterImpl; - // Initialize our event handling for this class - this.initializeEvents(sheet).forEach((e) => this.addNewEventType(e)); - } - get name() { - return this.parameterImpl.name; - } - get currentValue() { - return this.parameterImpl.currentValue; - } - get dataType() { - return this.parameterImpl.dataType; - } - get allowableValues() { - return this.parameterImpl.allowableValues; - } - get id() { - return this.parameterImpl.id; - } - changeValueAsync(newValue) { - return this.parameterImpl.changeValueAsync(newValue); - } - /** - * Helper method which goes through and registers each event type this impl knows about - * with the NotificationService. It returns an array of SingleEventManager objects which - * can then be passed to an EventListenerManager to handle user registration / unregistration. - * - * @param sheet The sheet object which will be included with the event notifications - * @returns {Array} Collection of event managers to pass to an EventListenerManager - */ - initializeEvents(sheet) { - api_shared_js_1.ErrorHelpers.verifyInternalValue(sheet, 'sheet'); - const results = new Array(); - let notificationService; - try { - notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("notification-service" /* Notification */); - } - catch (e) { - // If we don't have this service registered, just return - return results; - } - // Initialize all of the event managers we'll need (one for each event type) - const parameterEvent = new api_shared_js_1.SingleEventManagerImpl(Contract.TableauEventType.ParameterChanged); - notificationService.registerHandler(api_internal_contract_js_1.NotificationId.ParameterChanged, (model) => { - const fieldName = model; - return fieldName === this.parameterImpl.id; - }, (fieldName) => { - parameterEvent.triggerEvent(() => new ParameterChangedEvent_1.ParameterChangedEvent(fieldName, sheet)); - }); - results.push(parameterEvent); - return results; - } -} -exports.Parameter = Parameter; - - -/***/ }), - -/***/ "./lib/src/ExtensionsApi/Models/Sheet.js": -/*!***********************************************!*\ - !*** ./lib/src/ExtensionsApi/Models/Sheet.js ***! - \***********************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); -const Parameter_1 = __webpack_require__(/*! ./Parameter */ "./lib/src/ExtensionsApi/Models/Parameter.js"); -class Sheet extends api_shared_js_1.EventListenerManager { - constructor(_sheetImpl) { - super(); - this._sheetImpl = _sheetImpl; - } - get name() { - return this._sheetImpl.name; - } - get sheetType() { - return this._sheetImpl.sheetType; - } - get size() { - if (this.isValidSize(this._sheetImpl.size)) { - return this._sheetImpl.size; - } - throw new api_shared_js_1.TableauError(Contract.EmbeddingErrorCodes.ImplementationError, 'Size not implemented'); - } - isValidSize(size) { - const testSize = size; - if (testSize.width !== undefined && testSize.height !== undefined) { - return true; - } - return false; - } - findParameterAsync(parameterName) { - return this._sheetImpl.findParameterAsync(parameterName).then((parameterImpl) => { - if (parameterImpl) { - return new Promise((resolve) => resolve(new Parameter_1.Parameter(parameterImpl, this))); - } - else { - return new Promise((resolve) => resolve(undefined)); - } - }); - } - getParametersAsync() { - return this._sheetImpl.getParametersAsync().then((parametersImpl) => { - return parametersImpl.map((parameterImpl) => { - return new Parameter_1.Parameter(parameterImpl, this); - }); - }); - } -} -exports.Sheet = Sheet; - - -/***/ }), - -/***/ "./lib/src/ExtensionsApi/Models/Workbook.js": -/*!**************************************************!*\ - !*** ./lib/src/ExtensionsApi/Models/Workbook.js ***! - \**************************************************/ -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -class Workbook { - constructor(_workbookImpl) { - this._workbookImpl = _workbookImpl; - } - getAllDataSourcesAsync() { - return this._workbookImpl.getAllDataSourcesAsync(); - } -} -exports.Workbook = Workbook; - - -/***/ }), - -/***/ "./lib/src/ExtensionsApi/Models/Worksheet.js": -/*!***************************************************!*\ - !*** ./lib/src/ExtensionsApi/Models/Worksheet.js ***! - \***************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); -const FilterChangedEvent_1 = __webpack_require__(/*! ../Events/FilterChangedEvent */ "./lib/src/ExtensionsApi/Events/FilterChangedEvent.js"); -const MarksSelectedEvent_1 = __webpack_require__(/*! ../Events/MarksSelectedEvent */ "./lib/src/ExtensionsApi/Events/MarksSelectedEvent.js"); -const SummaryDataChangedEvent_1 = __webpack_require__(/*! ../Events/SummaryDataChangedEvent */ "./lib/src/ExtensionsApi/Events/SummaryDataChangedEvent.js"); -const WorksheetFormattingChangedEvent_1 = __webpack_require__(/*! ../Events/WorksheetFormattingChangedEvent */ "./lib/src/ExtensionsApi/Events/WorksheetFormattingChangedEvent.js"); -const ServiceRegistryUtil_1 = __webpack_require__(/*! ../Services/ServiceRegistryUtil */ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js"); -const Dashboard_1 = __webpack_require__(/*! ./Dashboard */ "./lib/src/ExtensionsApi/Models/Dashboard.js"); -const Sheet_1 = __webpack_require__(/*! ./Sheet */ "./lib/src/ExtensionsApi/Models/Sheet.js"); -class Worksheet extends Sheet_1.Sheet { - constructor(_worksheetImpl) { - super(_worksheetImpl); - this._worksheetImpl = _worksheetImpl; - // Call to initialize events and then call down to the event listener manager to handle things - this.initializeEvents().forEach((e) => this.addNewEventType(e)); - } - get parentDashboard() { - // This should never happen for Extensions if the DashboardImpls are created correctly - if (this._worksheetImpl.parentDashboard == null) { - throw new api_shared_js_1.TableauError(Contract.SharedErrorCodes.ImplementationError, `Parent dashboard not implemented`); - } - return new Dashboard_1.Dashboard(this._worksheetImpl.parentDashboard); - } - get backgroundColor() { - if (this._worksheetImpl.backgroundColor == null) { - throw new api_shared_js_1.TableauError(Contract.SharedErrorCodes.ImplementationError, `Worksheet background color is not available`); - } - return this._worksheetImpl.backgroundColor; - } - get formatting() { - if (this._worksheetImpl.formatting == null) { - throw new api_shared_js_1.TableauError(Contract.SharedErrorCodes.ImplementationError, `Worksheet formatting information is not available`); - } - return this._worksheetImpl.formatting; - } - /** - * Helper method which goes through and registers each event type this impl knows about - * with the NotificationService. It returns an array of SingleEventManager objects which - * can then be passed to an EventListenerManager to handle user registration / unregistration. - * - * @param {Worksheet} worksheet The worksheet object which will be included with the event notifications - * @returns {Array} Collection of event managers to pass to an EventListenerManager - */ - initializeEvents() { - const results = new Array(); - let notificationService; - try { - notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("notification-service" /* Notification */); - } - catch (e) { - // If we don't have this service registered, just return - return results; - } - // Initialize all of the event managers we'll need (one for each event type) - const marksEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.MarkSelectionChanged); - notificationService.registerHandler(api_internal_contract_js_1.NotificationId.SelectedMarksChanged, (model) => { - const visualId = model; - return this.visualIdsAreEqual(visualId, this._worksheetImpl.visualId); - }, () => marksEvent.triggerEvent(() => new MarksSelectedEvent_1.MarksSelectedEvent(this))); - const filterEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.FilterChanged); - notificationService.registerHandler(api_internal_contract_js_1.NotificationId.FilterChanged, (model) => { - const filterEventResponse = model; - return this._worksheetImpl.visualId.worksheet === filterEventResponse.visualId.worksheet; - }, (event) => { - filterEvent.triggerEvent(() => new FilterChangedEvent_1.FilterChangedEvent(this, event.fieldName, event.fieldId)); - }); - const summaryDataEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.SummaryDataChanged); - notificationService.registerHandler(api_internal_contract_js_1.NotificationId.SummaryDataChanged, (model) => { - const summaryDataEventResponse = model; - return this._worksheetImpl.visualId.worksheet === summaryDataEventResponse.visualId.worksheet; - }, (event) => { - summaryDataEvent.triggerEvent(() => new SummaryDataChangedEvent_1.SummaryDataChangedEvent(this)); - }); - const worksheetFormattingChangedEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.WorksheetFormattingChanged); - notificationService.registerHandler(api_internal_contract_js_1.NotificationId.WorksheetFormattingChanged, (model) => { - const worksheetFormattingChangedEvent = model; - return this._worksheetImpl.visualId.worksheet === worksheetFormattingChangedEvent.visualId.worksheet; - }, (eventFormatting) => { - worksheetFormattingChangedEvent.triggerEvent(() => new WorksheetFormattingChangedEvent_1.WorksheetFormattingChangedEvent(this, eventFormatting)); - }); - results.push(marksEvent); - results.push(filterEvent); - results.push(summaryDataEvent); - results.push(worksheetFormattingChangedEvent); - return results; - } - applyFilterAsync(fieldName, values, updateType, options) { - return this._worksheetImpl.applyFilterAsync(fieldName, values, updateType, options); - } - applyRangeFilterAsync(fieldName, filterOptions) { - return this._worksheetImpl.applyRangeFilterAsync(fieldName, filterOptions); - } - applyHierarchicalFilterAsync(fieldName, values, updateType, options) { - return this._worksheetImpl.applyHierarchicalFilterAsync(fieldName, values, updateType, options); - } - applyRelativeDateFilterAsync(fieldName, options) { - return this._worksheetImpl.applyRelativeDateFilterAsync(fieldName, options); - } - clearFilterAsync(fieldName) { - return this._worksheetImpl.clearFilterAsync(fieldName); - } - getDataSourcesAsync() { - return this._worksheetImpl.getDataSourcesAsync(); - } - getFiltersAsync() { - return this._worksheetImpl.getFiltersAsync(); - } - getSelectedMarksAsync() { - return this._worksheetImpl.getSelectedMarksAsync(); - } - getHighlightedMarksAsync() { - return this._worksheetImpl.getHighlightedMarksAsync(); - } - getSummaryDataAsync(options) { - return this._worksheetImpl.getSummaryDataAsync(options); - } - getSummaryDataReaderAsync(pageRowCount, options) { - return this._worksheetImpl.getSummaryDataReaderAsync(pageRowCount, options); - } - getSummaryColumnsInfoAsync() { - return this._worksheetImpl.getSummaryColumnsInfoAsync(); - } - getUnderlyingDataAsync(options) { - console.warn('Worksheet.getUnderlyingDataAsync is deprecated. Please use ' + - 'Worksheet.getUnderlyingTablesAsync and Worksheet.getUnderlyingTableDataAsync'); - return this._worksheetImpl.getUnderlyingDataAsync(options); - } - getUnderlyingTablesAsync() { - return this._worksheetImpl.getUnderlyingTablesAsync(); - } - getUnderlyingTableDataAsync(logicalTableId, options) { - return this._worksheetImpl.getUnderlyingTableDataAsync(logicalTableId, options); - } - getUnderlyingTableDataReaderAsync(logicalTableId, pageRowCount, options) { - return this._worksheetImpl.getUnderlyingTableDataReaderAsync(logicalTableId, pageRowCount, options); - } - getVisualSpecificationAsync() { - return this._worksheetImpl.getVisualSpecificationAsync(); - } - addMarksCardFieldsAsync(marksCardIndex, encodingType, columns, startIndex) { - return this._worksheetImpl.addMarksCardFieldsAsync(marksCardIndex, encodingType, columns, startIndex); - } - moveMarksCardFieldAsync(marksCardIndex, fromIndex, toIndex, fieldCount = 1) { - return this._worksheetImpl.moveMarksCardFieldAsync(marksCardIndex, fromIndex, toIndex, fieldCount); - } - spliceMarksCardFieldsAsync(marksCardIndex, encodingType, startIndex, deleteCount, columns) { - return this._worksheetImpl.spliceMarksCardFieldsAsync(marksCardIndex, encodingType, startIndex, deleteCount, columns); - } - clearSelectedMarksAsync() { - return this._worksheetImpl.clearSelectedMarksAsync(); - } - selectMarksByIDAsync(marksInfo, updateType) { - return this._worksheetImpl.selectMarksByIdAsync(marksInfo, updateType); - } - selectMarksByValueAsync(selections, selectionUpdateType) { - return this._worksheetImpl.selectMarksByValueAsync(selections, selectionUpdateType); - } - selectMarksByIdAsync(selections, selectionUpdateType) { - return this._worksheetImpl.selectMarksByIdAsync(selections, selectionUpdateType); - } - annotateMarkAsync(mark, annotationText) { - return this._worksheetImpl.annotateMarkAsync(mark, annotationText); - } - getAnnotationsAsync() { - return this._worksheetImpl.getAnnotationsAsync(); - } - removeAnnotationAsync(annotation) { - return this._worksheetImpl.removeAnnotationAsync(annotation); - } - hoverTupleAsync(hoveredTuple, tooltip, allowHoverActions = true) { - return this._worksheetImpl.hoverTupleAsync(hoveredTuple, tooltip, allowHoverActions); - } - selectTuplesAsync(selectedTuples, selectOption, tooltip) { - return this._worksheetImpl.selectTuplesAsync(selectedTuples, selectOption, tooltip); - } - getTooltipTextAsync(tupleId) { - return this._worksheetImpl.getTooltipTextAsync(tupleId); - } - leaveMarkNavigationAsync() { - return this._worksheetImpl.leaveMarkNavigationAsync(); - } - editAliasesDialogAsync(fieldName) { - return this._worksheetImpl.editAliasesDialogAsync(fieldName); - } - visualIdsAreEqual(a, b) { - return (a && - b && - a.worksheet === b.worksheet && - a.dashboard === b.dashboard && - a.storyboard === b.storyboard && - a.storyPointID === b.storyPointID); - } -} -exports.Worksheet = Worksheet; - - -/***/ }), - -/***/ "./lib/src/ExtensionsApi/Namespaces/DashboardContent.js": -/*!**************************************************************!*\ - !*** ./lib/src/ExtensionsApi/Namespaces/DashboardContent.js ***! - \**************************************************************/ -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -/** - * Implementation of the external DashboardContent namespace. - * This does not follow the Impl pattern as DashboardContent is - * currently just a (single) property bag. - */ -class DashboardContent { - constructor(_dashboard) { - this._dashboard = _dashboard; - } - get dashboard() { - return this._dashboard; - } -} -exports.DashboardContent = DashboardContent; - - -/***/ }), - -/***/ "./lib/src/ExtensionsApi/Namespaces/Environment.js": -/*!*********************************************************!*\ - !*** ./lib/src/ExtensionsApi/Namespaces/Environment.js ***! - \*********************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); -const ConnectedServer_1 = __webpack_require__(/*! ../Impl/ConnectedServer */ "./lib/src/ExtensionsApi/Impl/ConnectedServer.js"); -const WorkbookFormattingEnvUtil_1 = __webpack_require__(/*! ./WorkbookFormattingEnvUtil */ "./lib/src/ExtensionsApi/Namespaces/WorkbookFormattingEnvUtil.js"); -/** - * Implementation of the external environment namespace. - * Environment does not follow the Impl pattern as it is - * just a property bag. - * First class extensions can get to ConnectedServer with: environment['connectedServer'] - */ -class Environment { - constructor(extensionEnvironment) { - this._apiVersion = api_shared_js_1.ApiVersion.Instance && api_shared_js_1.ApiVersion.Instance.formattedValue; // maj.min.fix (no build) - this._context = api_shared_js_1.InternalToExternalEnumMappings.extensionContext.convert(extensionEnvironment.extensionContext); - this._formatting = WorkbookFormattingEnvUtil_1.WorkbookFormattingEnvUtil.convertToWorkbookFormatting(extensionEnvironment.workbookFormatting); - this._language = extensionEnvironment.extensionLanguage; - this._country = extensionEnvironment.extensionCountry; - this._locale = extensionEnvironment.extensionLocale; - this._mode = api_shared_js_1.InternalToExternalEnumMappings.extensionMode.convert(extensionEnvironment.extensionMode); - this._operatingSystem = extensionEnvironment.operatingSystem; - this._tableauVersion = extensionEnvironment.tableauVersion; - this._uniqueUserId = extensionEnvironment.uniqueUserId; - // If we have a userId, then we are a first class extension - if (extensionEnvironment.userId) { - this.connectedServer = new ConnectedServer_1.ConnectedServer(extensionEnvironment.userId, extensionEnvironment.siteId, extensionEnvironment.siteNamespace, extensionEnvironment.workbookId); - this.featureFlags = extensionEnvironment.featureFlags; - } - } - get apiVersion() { - return this._apiVersion; - } - get context() { - return this._context; - } - get workbookFormatting() { - return this._formatting; - } - get language() { - return this._language; - } - get country() { - return this._country; - } - get locale() { - return this._locale; - } - get mode() { - return this._mode; - } - get operatingSystem() { - return this._operatingSystem; - } - get tableauVersion() { - return this._tableauVersion; - } - get uniqueUserId() { - return this._uniqueUserId; - } -} -exports.Environment = Environment; - - -/***/ }), - -/***/ "./lib/src/ExtensionsApi/Namespaces/Extensions.js": -/*!********************************************************!*\ - !*** ./lib/src/ExtensionsApi/Namespaces/Extensions.js ***! - \********************************************************/ -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -/** - * Implementation of the external Extensions namespace. - */ -class Extensions { - constructor(extensionImpl) { - this.extensionImpl = extensionImpl; - this.extensionImpl = extensionImpl; - } - get dashboardContent() { - return this.extensionImpl.dashboardContent; - } - get worksheetContent() { - return this.extensionImpl.worksheetContent; - } - get environment() { - return this.extensionImpl.environment; - } - get settings() { - return this.extensionImpl.settings; - } - get ui() { - return this.extensionImpl.ui; - } - get workbook() { - return this.extensionImpl.workbook; - } - get dashboardObjectId() { - return this.extensionImpl.extensionZoneId; - } - initializeAsync(contextMenuCallbacks) { - return this.extensionImpl.initializeAsync(false, contextMenuCallbacks).then(); - } - initializeDialogAsync() { - return this.extensionImpl.initializeAsync(true); - } - createVizImageAsync(inputSpec) { - return this.extensionImpl.createVizImageAsync(inputSpec); - } - setClickThroughAsync(clickThroughEnabled) { - return this.extensionImpl.setClickThroughAsync(clickThroughEnabled); - } -} -exports.Extensions = Extensions; - - -/***/ }), - -/***/ "./lib/src/ExtensionsApi/Namespaces/Settings.js": -/*!******************************************************!*\ - !*** ./lib/src/ExtensionsApi/Namespaces/Settings.js ***! - \******************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); -/** - * Implementation of the external settings namespace. - */ -class Settings extends api_shared_js_1.EventListenerManager { - constructor(_settingsImpl) { - super(); - this._settingsImpl = _settingsImpl; - // Initialize our event handling for this class - this._settingsImpl.initializeEvents().forEach((e) => this.addNewEventType(e)); - } - erase(key) { - this._settingsImpl.erase(key); - } - get(key) { - return this._settingsImpl.get(key); - } - getAll() { - return this._settingsImpl.getAll(); - } - get isModified() { - return this._settingsImpl.isModified; - } - saveAsync() { - return this._settingsImpl.saveAsync(); - } - set(key, value) { - this._settingsImpl.set(key, value); - } -} -exports.Settings = Settings; - - -/***/ }), - -/***/ "./lib/src/ExtensionsApi/Namespaces/UI.js": -/*!************************************************!*\ - !*** ./lib/src/ExtensionsApi/Namespaces/UI.js ***! - \************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); -/** - * Implementation of the external UI namespace. - */ -class UI extends api_shared_js_1.EventListenerManager { - constructor(_impl) { - super(); - this._impl = _impl; - // Initialize our event handling for this class - this._impl.initializeEvents().forEach((e) => this.addNewEventType(e)); - } - displayDialogAsync(url, payload, options) { - return this._impl.displayDialogAsync(url, payload, options); - } - sendDialogMessageAsync(message, targetDialogUrl) { - return this._impl.sendDialogMessageAsync(message, targetDialogUrl); - } - closeDialog(payload) { - this._impl.closeDialog(payload); - } -} -exports.UI = UI; - - -/***/ }), - -/***/ "./lib/src/ExtensionsApi/Namespaces/WorkbookFormattingEnvUtil.js": -/*!***********************************************************************!*\ - !*** ./lib/src/ExtensionsApi/Namespaces/WorkbookFormattingEnvUtil.js ***! - \***********************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); -class WorkbookFormattingEnvUtil { - static convertToWorkbookFormatting(workbookFormattingModel) { - if (!workbookFormattingModel) { - return undefined; - } - else { - const formattingMap = workbookFormattingModel.formattingSheets.map((currentFormattingSheet) => { - const formattingSheet = { - classNameKey: api_shared_js_1.InternalToExternalEnumMappings.classNameKey.convert(currentFormattingSheet.classNameKey), - cssProperties: getCssProperties(currentFormattingSheet.classNameKey, currentFormattingSheet.cssProperties), - }; - return formattingSheet; - }); - const result = { - formattingSheets: formattingMap, - }; - return result; - } - } -} -exports.WorkbookFormattingEnvUtil = WorkbookFormattingEnvUtil; -function getCssProperties(classNameKey, cssProperties) { - if (classNameKey === "tableau-row-dividers" /* RowDividers */ || classNameKey === "tableau-column-dividers" /* ColumnDividers */) { - return { - borderColor: cssProperties.borderColor, - borderStyle: cssProperties.borderStyle, - borderWidth: cssProperties.borderWidth, - }; - } - return { - fontFamily: cssProperties.fontFamily, - fontSize: cssProperties.fontSize, - fontWeight: cssProperties.fontWeight, - fontStyle: cssProperties.fontStyle, - textDecoration: cssProperties.textDecoration, - color: cssProperties.color, - }; -} - - -/***/ }), - -/***/ "./lib/src/ExtensionsApi/Namespaces/WorksheetContent.js": -/*!**************************************************************!*\ - !*** ./lib/src/ExtensionsApi/Namespaces/WorksheetContent.js ***! - \**************************************************************/ -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -/** - * Implementation of the external WorksheetContent namespace. - * This does not follow the Impl pattern as WorksheetContent is - * currently just a (single) property bag. - */ -class WorksheetContent { - constructor(_worksheet) { - this._worksheet = _worksheet; - } - get worksheet() { - return this._worksheet; - } -} -exports.WorksheetContent = WorksheetContent; - - -/***/ }), - -/***/ "./lib/src/ExtensionsApi/Services/Impl/InitializationServiceImpl.js": -/*!**************************************************************************!*\ - !*** ./lib/src/ExtensionsApi/Services/Impl/InitializationServiceImpl.js ***! - \**************************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); -class InitializationServiceImpl extends api_shared_js_1.ServiceImplBase { - get serviceName() { - return "InitializationService" /* InitializationService */; - } - initializeDashboardExtensionsAsync(isExtensionDialog, contextMenuIds) { - const params = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'initializeDashboardExtensionsAsync', - [api_internal_contract_js_1.ParameterId.ExtensionContextMenuIds]: contextMenuIds, - [api_internal_contract_js_1.ParameterId.IsExtensionDialog]: isExtensionDialog, - }; - return this.execute(api_internal_contract_js_1.VerbId.InitializeExtension, params).then((response) => { - // TODO - Validate return value - const result = response.result; - return result; - }); - } -} -exports.InitializationServiceImpl = InitializationServiceImpl; - - -/***/ }), - -/***/ "./lib/src/ExtensionsApi/Services/Impl/SettingsServiceImpl.js": -/*!********************************************************************!*\ - !*** ./lib/src/ExtensionsApi/Services/Impl/SettingsServiceImpl.js ***! - \********************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); -class SettingsServiceImpl extends api_shared_js_1.ServiceImplBase { - get serviceName() { - return "SettingsService" /* SettingsService */; - } - saveSettingsAsync(settings) { - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'saveSettingsAsync', - [api_internal_contract_js_1.ParameterId.SettingsValues]: settings, - }; - return this.execute(api_internal_contract_js_1.VerbId.SaveExtensionSettings, parameters).then((value) => { - const result = value.result; - if (!result || !result.settingsValues) { - throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, 'Unexpected error savings settings.'); - } - return result.settingsValues; - }); - } -} -exports.SettingsServiceImpl = SettingsServiceImpl; - - -/***/ }), - -/***/ "./lib/src/ExtensionsApi/Services/Impl/UIServiceImpl.js": -/*!**************************************************************!*\ - !*** ./lib/src/ExtensionsApi/Services/Impl/UIServiceImpl.js ***! - \**************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); -const DEFAULT_DIALOG_HEIGHT = 400; // in pixels -const DEFAULT_DIALOG_WIDTH = 600; // in pixels -const DEFAULT_DIALOG_STYLE = api_external_contract_js_1.DialogStyle.Window; -class UIServiceImpl extends api_shared_js_1.ServiceImplBase { - get serviceName() { - return "UIService" /* UIService */; - } - displayDialogAsync(url, payload, options) { - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'displayDialogAsync', - [api_internal_contract_js_1.ParameterId.ExtensionDialogUrl]: url, - [api_internal_contract_js_1.ParameterId.ExtensionDialogPayload]: payload, - }; - const h = options && options.height ? options.height : DEFAULT_DIALOG_HEIGHT; - const w = options && options.width ? options.width : DEFAULT_DIALOG_WIDTH; - const dialogStyle = options && options.dialogStyle ? options.dialogStyle : DEFAULT_DIALOG_STYLE; - // On the platform side, we do something reasonable regardess of whether the passed - // height and width are too large or too small. But this likely indicates a developer error, - // so we throw an error here to help with debugging. - if (h <= 0 || w <= 0) { - throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, 'Size parameters for displayDialogAsync must be positive'); - } - parameters[api_internal_contract_js_1.ParameterId.ExtensionDialogH] = h; - parameters[api_internal_contract_js_1.ParameterId.ExtensionDialogW] = w; - api_shared_js_1.ErrorHelpers.verifyEnumValue(dialogStyle, api_external_contract_js_1.DialogStyle, 'DialogStyle'); - parameters[api_internal_contract_js_1.ParameterId.ExtensionDialogStyle] = api_shared_js_1.ExternalToInternalEnumMappings.dialogStyles.convert(dialogStyle); - return this.execute(api_internal_contract_js_1.VerbId.DisplayDialog, parameters).then((response) => { - const dialogResult = response.result; - switch (dialogResult) { - case api_internal_contract_js_1.ExtensionDialogResult.DialogAlreadyOpen: - throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.DialogAlreadyOpen, 'There already exists an open dialog for this extension.'); - case api_internal_contract_js_1.ExtensionDialogResult.InvalidDomain: - throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidDomainDialog, 'The url of an extension dialog must match the domain of the parent extension.'); - default: - // Success case - return; - } - }); - } - closeDialog(payload) { - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'closeDialog', - }; - if (payload) { - parameters[api_internal_contract_js_1.ParameterId.ExtensionDialogPayload] = payload; - } - return this.execute(api_internal_contract_js_1.VerbId.CloseDialog, parameters).then(() => { - return; - }); - } - sendDialogMessageAsync(message, targetDialogUrl) { - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'sendDialogMessage', - [api_internal_contract_js_1.ParameterId.ExtensionDialogMessage]: message, - }; - if (targetDialogUrl) { - parameters[api_internal_contract_js_1.ParameterId.ExtensionDialogUrl] = targetDialogUrl; - } - return this.execute(api_internal_contract_js_1.VerbId.SendDialogMessage, parameters).then(() => { - return; - }); - } - setClickThroughAsync(clickThroughEnabled, extensionZoneId) { - api_shared_js_1.ErrorHelpers.verifyParameterType(clickThroughEnabled, 'boolean', 'clickThroughEnabled'); - if (extensionZoneId === undefined || extensionZoneId <= 0) { - throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, 'Extension Id is invalid.'); - } - const parameters = { - [api_internal_contract_js_1.ParameterId.ExtensionZoneId]: extensionZoneId, - [api_internal_contract_js_1.ParameterId.ClickThroughEnabled]: clickThroughEnabled, - }; - return this.execute(api_internal_contract_js_1.VerbId.SetClickThrough, parameters).then(() => { - return; - }); - } -} -exports.UIServiceImpl = UIServiceImpl; - - -/***/ }), - -/***/ "./lib/src/ExtensionsApi/Services/RegisterAllExtensionsServices.js": -/*!*************************************************************************!*\ - !*** ./lib/src/ExtensionsApi/Services/RegisterAllExtensionsServices.js ***! - \*************************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); -const InitializationServiceImpl_1 = __webpack_require__(/*! ./Impl/InitializationServiceImpl */ "./lib/src/ExtensionsApi/Services/Impl/InitializationServiceImpl.js"); -const SettingsServiceImpl_1 = __webpack_require__(/*! ./Impl/SettingsServiceImpl */ "./lib/src/ExtensionsApi/Services/Impl/SettingsServiceImpl.js"); -const UIServiceImpl_1 = __webpack_require__(/*! ./Impl/UIServiceImpl */ "./lib/src/ExtensionsApi/Services/Impl/UIServiceImpl.js"); -const ServiceRegistryUtil_1 = __webpack_require__(/*! ./ServiceRegistryUtil */ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js"); -function registerAllExtensionsServices(dispatcher) { - api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).registerService(new SettingsServiceImpl_1.SettingsServiceImpl(dispatcher, ServiceRegistryUtil_1.ExtensionsRegistryId)); - api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).registerService(new UIServiceImpl_1.UIServiceImpl(dispatcher, ServiceRegistryUtil_1.ExtensionsRegistryId)); -} -exports.registerAllExtensionsServices = registerAllExtensionsServices; -function registerInitializationExtensionsServices(dispatcher) { - api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).registerService(new InitializationServiceImpl_1.InitializationServiceImpl(dispatcher, ServiceRegistryUtil_1.ExtensionsRegistryId)); -} -exports.registerInitializationExtensionsServices = registerInitializationExtensionsServices; - - -/***/ }), - -/***/ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js": -/*!***************************************************************!*\ - !*** ./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js ***! - \***************************************************************/ -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.ExtensionsRegistryId = 0; - - -/***/ }), - -/***/ "../api-external-contract-js/lib/src/EmbeddingApiExternalContract.js": -/*!***************************************************************************!*\ - !*** ../api-external-contract-js/lib/src/EmbeddingApiExternalContract.js ***! - \***************************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -// This file re-exports everything which is part of the extensions api public interface -function __export(m) { - for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; -} -Object.defineProperty(exports, "__esModule", ({ value: true })); -__export(__webpack_require__(/*! ./ExternalContract/Embedding/AskDataInterfaces */ "../api-external-contract-js/lib/src/ExternalContract/Embedding/AskDataInterfaces.js")); -var Enums_1 = __webpack_require__(/*! ./ExternalContract/Embedding/Enums */ "../api-external-contract-js/lib/src/ExternalContract/Embedding/Enums.js"); -exports.ApiMenuType = Enums_1.ApiMenuType; -exports.CrosstabFileFormat = Enums_1.CrosstabFileFormat; -exports.DeviceType = Enums_1.DeviceType; -exports.EmbeddingErrorCodes = Enums_1.EmbeddingErrorCodes; -exports.EmbeddingTableauEventType = Enums_1.TableauEventType; -exports.FileFormats = Enums_1.FileFormats; -exports.PrintOrientation = Enums_1.PrintOrientation; -exports.PrintPageSize = Enums_1.PrintPageSize; -exports.PrintScaling = Enums_1.PrintScaling; -exports.PulseErrorMessageVisibility = Enums_1.PulseErrorMessageVisibility; -exports.PulseLayout = Enums_1.PulseLayout; -exports.PulseTimeDimension = Enums_1.PulseTimeDimension; -exports.SheetSizeBehavior = Enums_1.SheetSizeBehavior; -exports.TableauDialogType = Enums_1.TableauDialogType; -exports.Toolbar = Enums_1.Toolbar; -__export(__webpack_require__(/*! ./ExternalContract/Embedding/PulseInterfaces */ "../api-external-contract-js/lib/src/ExternalContract/Embedding/PulseInterfaces.js")); -__export(__webpack_require__(/*! ./ExternalContract/Embedding/VizInterfaces */ "../api-external-contract-js/lib/src/ExternalContract/Embedding/VizInterfaces.js")); -__export(__webpack_require__(/*! ./ExternalContract/Embedding/WebComponentInterfaces */ "../api-external-contract-js/lib/src/ExternalContract/Embedding/WebComponentInterfaces.js")); -__export(__webpack_require__(/*! ./SharedApiExternalContract */ "../api-external-contract-js/lib/src/SharedApiExternalContract.js")); - - -/***/ }), - -/***/ "../api-external-contract-js/lib/src/ExtensionsApiExternalContract.js": -/*!****************************************************************************!*\ - !*** ../api-external-contract-js/lib/src/ExtensionsApiExternalContract.js ***! - \****************************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -// This file re-exports everything which is part of the extensions api public interface -function __export(m) { - for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; -} -Object.defineProperty(exports, "__esModule", ({ value: true })); -var Tableau_1 = __webpack_require__(/*! ./ExternalContract/Extensions/Namespaces/Tableau */ "../api-external-contract-js/lib/src/ExternalContract/Extensions/Namespaces/Tableau.js"); -exports.ErrorCodes = Tableau_1.ErrorCodes; -exports.ExtensionContext = Tableau_1.ExtensionContext; -exports.ExtensionMode = Tableau_1.ExtensionMode; -exports.TableauEventType = Tableau_1.TableauEventType; -exports.VizImageEncodingType = Tableau_1.VizImageEncodingType; -exports.VizImagePaletteType = Tableau_1.VizImagePaletteType; -exports.VizImageSizeSettingAlignmentType = Tableau_1.VizImageSizeSettingAlignmentType; -exports.VizImageSizeSettingType = Tableau_1.VizImageSizeSettingType; -exports.VizImageSortDirectionType = Tableau_1.VizImageSortDirectionType; -__export(__webpack_require__(/*! ./SharedApiExternalContract */ "../api-external-contract-js/lib/src/SharedApiExternalContract.js")); - - -/***/ }), - -/***/ "../api-external-contract-js/lib/src/ExternalContract.js": -/*!***************************************************************!*\ - !*** ../api-external-contract-js/lib/src/ExternalContract.js ***! - \***************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -/** - * This is your main. This is where you re-export everything you want to be publicly available. - * - * The build enforces that the file has the same name as the global variable that is exported. - */ -function __export(m) { - for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; -} -Object.defineProperty(exports, "__esModule", ({ value: true })); -__export(__webpack_require__(/*! ./EmbeddingApiExternalContract */ "../api-external-contract-js/lib/src/EmbeddingApiExternalContract.js")); -__export(__webpack_require__(/*! ./ExtensionsApiExternalContract */ "../api-external-contract-js/lib/src/ExtensionsApiExternalContract.js")); - - -/***/ }), - -/***/ "../api-external-contract-js/lib/src/ExternalContract/Embedding/AskDataInterfaces.js": -/*!*******************************************************************************************!*\ - !*** ../api-external-contract-js/lib/src/ExternalContract/Embedding/AskDataInterfaces.js ***! - \*******************************************************************************************/ -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -/** - * The names of the string constants you can use as HTML attributes for the web component. - * @ignore - * @deprecated - */ -var AskDataAttributes; -(function (AskDataAttributes) { - AskDataAttributes["Origin"] = "origin"; - AskDataAttributes["ShowEmbed"] = "show-embed"; - AskDataAttributes["ShowPin"] = "show-pin"; - AskDataAttributes["ShowSave"] = "show-save"; - AskDataAttributes["ShowShare"] = "show-share"; -})(AskDataAttributes = exports.AskDataAttributes || (exports.AskDataAttributes = {})); - - -/***/ }), - -/***/ "../api-external-contract-js/lib/src/ExternalContract/Embedding/Enums.js": -/*!*******************************************************************************!*\ - !*** ../api-external-contract-js/lib/src/ExternalContract/Embedding/Enums.js ***! - \*******************************************************************************/ -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -// All enum values made available to Embedding developers. -// Enums should be kept in alphabetical order. -// Most of them should match an enum on the server defined at -// workgroup/vqlweb/scriptsharp/src/ApiShared/PublicEnums.cs#L398:17 -Object.defineProperty(exports, "__esModule", ({ value: true })); -/** - * Crosstab file formats available to use with {@link Viz.exportCrosstabAsync} - */ -var CrosstabFileFormat; -(function (CrosstabFileFormat) { - CrosstabFileFormat["CSV"] = "csv"; - CrosstabFileFormat["Excel"] = "xlsx"; -})(CrosstabFileFormat = exports.CrosstabFileFormat || (exports.CrosstabFileFormat = {})); -/** - * Device types available to use with {@link Viz.device} - */ -var DeviceType; -(function (DeviceType) { - DeviceType["Default"] = "default"; - DeviceType["Desktop"] = "desktop"; - DeviceType["Tablet"] = "tablet"; - DeviceType["Phone"] = "phone"; -})(DeviceType = exports.DeviceType || (exports.DeviceType = {})); -/** - * All error codes used by the Embedding API. - */ -var EmbeddingErrorCodes; -(function (EmbeddingErrorCodes) { - /** - * Raised when a request to the auth endpoint fails. - */ - EmbeddingErrorCodes["AuthFailed"] = "auth-failed"; - /** - * The browser is not capable of supporting the Tableau Embedding API - */ - EmbeddingErrorCodes["BrowserNotCapable"] = "browser-not-capable"; - /** - * The permissions on a workbook or a view do not allow downloading the workbook. - */ - EmbeddingErrorCodes["DownloadWorkbookNotAllowed"] = "download-workbook-not-allowed"; - /** - * Thrown when an error occurs while attempting to perform a filter operation. - */ - EmbeddingErrorCodes["FilterCannotBePerformed"] = "filter-cannot-be-performed"; - /** - * Thrown when attempting to switch to a sheet by index that does not exist in the workbook. - */ - EmbeddingErrorCodes["IndexOutOfRange"] = "index-out-of-range"; - /** - * Thrown when an error occurs within the Tableau Embedding API. Contact Tableau Support. - */ - EmbeddingErrorCodes["InternalError"] = "internal-error"; - /** - * An operation was attempted on a custom view that does not exist. - */ - EmbeddingErrorCodes["InvalidCustomViewName"] = "invalid-custom-view-name"; - /** - * An invalid date was specified in a method that required a date parameter. - */ - EmbeddingErrorCodes["InvalidDateParameter"] = "invalid-date-parameter"; - /** - * Either a filter operation was attempted on a field that does not exist in the data source, or the value supplied - * in the filter operation is the wrong data type or format. - */ - EmbeddingErrorCodes["invalidFilterFieldNameOrValue"] = "invalid-filter-field-name"; - /** - * A parameter is not the correct data type or format. The name of the parameter is specified in the Error.message - * field. - */ - EmbeddingErrorCodes["InvalidParameter"] = "invalid-parameter"; - /** - * The currently applied time dimension could not be determined or is invalid. - */ - EmbeddingErrorCodes["InvalidTimeDimension"] = "invalid-time-dimension"; - /** - * A negative size was specified or the maxSize value is less than minSize in Sheet.changeSizeAsync(). - */ - EmbeddingErrorCodes["InvalidSize"] = "invalid-size"; - /** - * Attempted to get an authoring worksheet when the current sheet is not a worksheet. - * @ignore - */ - EmbeddingErrorCodes["InvalidSheetType"] = "invalid-sheet-type"; - /** - * A behavior value was found that is not included in the SheetSizeBehavior enum. - */ - EmbeddingErrorCodes["InvalidSizeBehavior"] = "invalid-size-behavior"; - /** - * A behavior other than SheetSizeBehavior.Automatic was specified in Sheet.changeSizeAsync() when the sheet is a - * Worksheet instance. - */ - EmbeddingErrorCodes["InvalidSizeBehaviorOnWorksheet"] = "invalid-size-behavior-on-worksheet"; - /** - * The URL specified in the Viz class constructor is not valid. - */ - EmbeddingErrorCodes["InvalidUrl"] = "invalid-url"; - /** - * The maxSize field is missing in Sheet.changeSizeAsync() when specifying SheetSizeBehavior.AtMost. - */ - EmbeddingErrorCodes["MissingMaxSize"] = "missing-max-size"; - /** - * The minSize field is missing in Sheet.changeSizeAsync() when specifying SheetSizeBehavior.AtLeast. - */ - EmbeddingErrorCodes["MissingMinSize"] = "missing-min-size"; - /** - * The minSize or maxSize field is missing in Sheet.changeSizeAsync() when specifying SheetSizeBehavior.Range. - */ - EmbeddingErrorCodes["MissingMinMaxSize"] = "missing-min-max-size"; - /** - * Can occur if the embedding app interacts with a parameter that has been removed from the worksheet. - */ - EmbeddingErrorCodes["MissingParameter"] = "missing-parameter"; - /** - * The rangeN field is missing for a relative date filter of type LASTN or NEXTN. - */ - EmbeddingErrorCodes["MissingRangeNForRelativeDateFilters"] = "missing-range-n-for-relative-date-filters"; - /** - * An attempt was made to access Sheet.getUrl() on a hidden sheet. Hidden sheets do not have URLs. - */ - EmbeddingErrorCodes["NoUrlForHiddenWorksheet"] = "no-url-for-hidden-worksheet"; - /** - * One or both of the parentElement or the URL parameters is not specified in the Viz constructor. - */ - EmbeddingErrorCodes["NoUrlOrParentElementNotFound"] = "no-url-or-parent-element-not-found"; - /** - * An operation was attempted on a sheet that is not active or embedded within the active dashboard. - */ - EmbeddingErrorCodes["NotActiveSheet"] = "not-active-sheet"; - /** - * A required parameter was not specified, null, or an empty string/array. - */ - EmbeddingErrorCodes["NullOrEmptyParameter"] = "null-or-empty-parameter"; - /** - * An operation was attempted on a sheet that does not exist in the workbook. - */ - EmbeddingErrorCodes["SheetNotInWorkbook"] = "sheet-not-in-workbook"; - /** - * An operation is performed on a CustomView object that is no longer valid (it has been removed). - */ - EmbeddingErrorCodes["StaleDataReference"] = "stale-data-reference"; - /** - * Unknown error triggered during the auth flow. - */ - EmbeddingErrorCodes["UnknownAuthError"] = "unknown-auth-error"; - /** - * An unknown event name was specified in the call to Viz.addEventListener or Viz.removeEventListener. - */ - EmbeddingErrorCodes["UnsupportedEventName"] = "unsupported-event-name"; - /** - * A Viz object has already been created as a child of the parentElement specified in the Viz constructor. - */ - EmbeddingErrorCodes["VizAlreadyInManager"] = "viz-already-in-manager"; - /** - * Function is not supported in the embedding api. - */ - EmbeddingErrorCodes["ImplementationError"] = "wrong-implementation"; - /** - * @NotImplemented - */ - EmbeddingErrorCodes["NotImplemented"] = "not-implemented"; - /** - * Unknown error during event initialization - */ - EmbeddingErrorCodes["EventInitializationError"] = "event-initialization-error"; - /** - * Version of the embedding api not supported by the version of tableau - */ - EmbeddingErrorCodes["IncompatibleVersionError"] = "incompatible-version-error"; - /** - * Unknown {@link TableauDialogType} passed in to Viz.displayDialogAsync. - */ - EmbeddingErrorCodes["UnknownDialogType"] = "unknown-dialog-type"; - /** - * Can occur if the API interacts with a filter that has been removed from the worksheet. - * Can also occurs if a {@link FilterType} has not been implemented. - */ - EmbeddingErrorCodes["FilterMissingOrNotImplemented"] = "filter-missing-not-implemented"; - /** - * Can occur if story point ids no longer match. - */ - EmbeddingErrorCodes["StoryPointIdMismatch"] = "storypoint-id-mismatch"; -})(EmbeddingErrorCodes = exports.EmbeddingErrorCodes || (exports.EmbeddingErrorCodes = {})); -/** - * Formats available to use with displayStaticImage in @VizInterfaces - */ -var FileFormats; -(function (FileFormats) { - FileFormats["PDF"] = "pdf"; - FileFormats["PNG"] = "png"; -})(FileFormats = exports.FileFormats || (exports.FileFormats = {})); -var PrintOrientation; -(function (PrintOrientation) { - PrintOrientation["Portrait"] = "portrait"; - PrintOrientation["Landscape"] = "landscape"; -})(PrintOrientation = exports.PrintOrientation || (exports.PrintOrientation = {})); -var PrintPageSize; -(function (PrintPageSize) { - PrintPageSize["Letter"] = "letter"; - PrintPageSize["Legal"] = "legal"; - PrintPageSize["Note"] = "note"; - PrintPageSize["Folio"] = "folio"; - PrintPageSize["Tabloid"] = "tabloid"; - PrintPageSize["Ledger"] = "ledger"; - PrintPageSize["Statement"] = "statement"; - PrintPageSize["Executive"] = "executive"; - PrintPageSize["A3"] = "A3"; - PrintPageSize["A4"] = "A4"; - PrintPageSize["A5"] = "A5"; - PrintPageSize["B4"] = "B4"; - PrintPageSize["B5"] = "B5"; - PrintPageSize["Quarto"] = "quarto"; - PrintPageSize["Unspecified"] = "unspecified"; -})(PrintPageSize = exports.PrintPageSize || (exports.PrintPageSize = {})); -var PrintScaling; -(function (PrintScaling) { - PrintScaling["Automatic"] = "automatic"; - PrintScaling["Perc25"] = "25%"; - PrintScaling["Perc50"] = "50%"; - PrintScaling["Perc60"] = "60%"; - PrintScaling["Perc75"] = "75%"; - PrintScaling["Perc80"] = "80%"; - PrintScaling["Perc90"] = "90%"; - PrintScaling["Perc100"] = "100%"; - PrintScaling["Perc200"] = "200%"; - PrintScaling["Perc400"] = "400%"; - PrintScaling["AtMost1PageHigh"] = "at-most-1-page-high"; - PrintScaling["AtMost2PagesHigh"] = "at-most-2-pages-high"; - PrintScaling["AtMost1PageWide"] = "at-most-1-page-wide"; - PrintScaling["AtMost2PagesWide"] = "at-most-2-pages-wide"; -})(PrintScaling = exports.PrintScaling || (exports.PrintScaling = {})); -var RevertVizSelection; -(function (RevertVizSelection) { - RevertVizSelection["All"] = "all"; - RevertVizSelection["Axes"] = "axes"; - RevertVizSelection["Filters"] = "filters"; - RevertVizSelection["Sorts"] = "sorts"; - RevertVizSelection["Shelves"] = "shelves"; -})(RevertVizSelection = exports.RevertVizSelection || (exports.RevertVizSelection = {})); -var ToolbarButtons; -(function (ToolbarButtons) { - ToolbarButtons["Alerts"] = "alerts"; - ToolbarButtons["AskData"] = "askData"; - ToolbarButtons["CustomViews"] = "customViews"; - ToolbarButtons["DataDetails"] = "dataDetails"; - ToolbarButtons["Share"] = "share"; - ToolbarButtons["Subscribe"] = "subscribe"; -})(ToolbarButtons = exports.ToolbarButtons || (exports.ToolbarButtons = {})); -var Toolbar; -(function (Toolbar) { - Toolbar["Top"] = "top"; - Toolbar["Bottom"] = "bottom"; - Toolbar["Hidden"] = "hidden"; -})(Toolbar = exports.Toolbar || (exports.Toolbar = {})); -var SheetSizeBehavior; -(function (SheetSizeBehavior) { - SheetSizeBehavior["Automatic"] = "automatic"; - SheetSizeBehavior["Exactly"] = "exactly"; - SheetSizeBehavior["Range"] = "range"; - SheetSizeBehavior["AtLeast"] = "atleast"; - SheetSizeBehavior["AtMost"] = "atmost"; -})(SheetSizeBehavior = exports.SheetSizeBehavior || (exports.SheetSizeBehavior = {})); -var PulseLayout; -(function (PulseLayout) { - PulseLayout["Default"] = "default"; - PulseLayout["Card"] = "card"; - PulseLayout["Ban"] = "ban"; -})(PulseLayout = exports.PulseLayout || (exports.PulseLayout = {})); -var PulseTimeDimension; -(function (PulseTimeDimension) { - PulseTimeDimension["Today"] = "Today"; - PulseTimeDimension["Yesterday"] = "Yesterday"; - PulseTimeDimension["WeekToDate"] = "WeekToDate"; - PulseTimeDimension["LastWeek"] = "LastWeek"; - PulseTimeDimension["MonthToDate"] = "MonthToDate"; - PulseTimeDimension["LastMonth"] = "LastMonth"; - PulseTimeDimension["QuarterToDate"] = "QuarterToDate"; - PulseTimeDimension["LastQuarter"] = "LastQuarter"; - PulseTimeDimension["YearToDate"] = "YearToDate"; - PulseTimeDimension["LastYear"] = "LastYear"; -})(PulseTimeDimension = exports.PulseTimeDimension || (exports.PulseTimeDimension = {})); -var PulseErrorMessageVisibility; -(function (PulseErrorMessageVisibility) { - PulseErrorMessageVisibility["Visible"] = "visible"; - PulseErrorMessageVisibility["Hidden"] = "hidden"; - PulseErrorMessageVisibility["Suppressed"] = "suppressed"; -})(PulseErrorMessageVisibility = exports.PulseErrorMessageVisibility || (exports.PulseErrorMessageVisibility = {})); -/** - * Be careful when adding new event types. Extensions and embedding follow two different patterns on how events are named. - * Events should be all lower case and without hyphens or underscores. - */ -/** - * Represents the type of tableau embedding event that can be listened for. - */ -var TableauEventType; -(function (TableauEventType) { - /** - * Raised when a custom view has finished loading. This event is raised after the callback function for {@link FirstInteractive} (if any) has been called. - * - * @category Viewing - */ - TableauEventType["CustomViewLoaded"] = "customviewloaded"; - /** - * Raised when a custom view has been removed. - * - * @category Viewing - */ - TableauEventType["CustomViewRemoved"] = "customviewremoved"; - /** - * Raised when a custom view has been saved (newly created or updated). - * - * @category Viewing - */ - TableauEventType["CustomViewSaved"] = "customviewsaved"; - /** - * Raised when a custom view has been set as the default view for a workbook. - * - * @category Viewing - */ - TableauEventType["CustomViewSetDefault"] = "customviewsetdefault"; - /** Raised when the user clicks on the Edit Button. - * - * @category Viewing - */ - TableauEventType["EditButtonClicked"] = "editbuttonclicked"; - /** Raised when the user clicks on the Edit In Desktop Button. - * - * @category Authoring, Viewing - */ - TableauEventType["EditInDesktopButtonClicked"] = "editindesktopbuttonclicked"; - /** Raised when any filter has changed state. You can use this event type with TableauViz objects. - * - * @category Viewing - */ - TableauEventType["FilterChanged"] = "filterchanged"; - /** Fired when viz size is known - * - * @category Authoring, Viewing - */ - TableauEventType["FirstVizSizeKnown"] = "firstvizsizeknown"; - /** Fired when a viz first becomes interactive - * - * @category Authoring, Viewing, Pulse - */ - TableauEventType["FirstInteractive"] = "firstinteractive"; - /** Raised when a custom mark context menu is clicked. - * - * @category Viewing - */ - TableauEventType["CustomMarkContextMenuEvent"] = "custommarkcontextmenu"; - /** The selected marks on a visualization have changed. You can use this event type with TableauViz objects. - * - * @category Viewing - */ - TableauEventType["MarkSelectionChanged"] = "markselectionchanged"; - /** A parameter has had its value modified. You can use this event type with [[Parameter]] objects. - * - * @category Viewing - */ - TableauEventType["ParameterChanged"] = "parameterchanged"; - /** Raised when a toolbar button or control becomes available or becomes unavailable. - * - * @category Viewing - */ - TableauEventType["ToolbarStateChanged"] = "toolbarstatechanged"; - /** Raised when the workbook is ready to close. This notification is sent when using embedded web authoring functionality. - * - * @category Authoring - */ - TableauEventType["WorkbookReadyToClose"] = "workbookreadytoclose"; - /** Raised when the workbook has been published. This notification is sent when using embedded web authoring functionality. - * - * @category Authoring - */ - TableauEventType["WorkbookPublished"] = "workbookpublished"; - /** Raised when "publish as" is successful. This notification is sent when using embedded web authoring functionality. - * - * @category Authoring - */ - TableauEventType["WorkbookPublishedAs"] = "workbookpublishedas"; - /** - * Raised when a URL action occurs. See the {@link UrlActionEvent} class. - * - * @category Viewing - */ - TableauEventType["UrlAction"] = "urlaction"; - /** - * Raised after a tab switch occurs (the active sheet has changed). Guarantees the viz object will be interactive after this. - * - * @category Viewing - */ - TableauEventType["TabSwitched"] = "tabswitched"; - /** - * - * Raised after a new story point becomes active. - * - * @category Viewing - */ - TableauEventType["StoryPointSwitched"] = "storypointswitched"; - /** - * - * Raised when an error occurs while loading the contents of the webcomponent. - * - * @category Authoring, Viewing, AskData - */ - TableauEventType["VizLoadError"] = "vizloaderror"; - /** - * Raised after the iframe src attribute has been updated - * - * @category Authoring, Viewing, AskData - */ - TableauEventType["IframeSrcUpdated"] = "iframesrcupdated"; - /** - * Raised when changes are made to summary data. - * - * @category Viewing - */ - TableauEventType["SummaryDataChanged"] = "summarydatachanged"; - /** - * Raised when tableau (viz-client) is ready to receive an auth token. - * Used for authentication in salesforce native mode. - * - * @hidden - * @category Authoring, Viewing, - */ - TableauEventType["ReadyToReceiveAuthToken"] = "readytoreceiveauthtoken"; - /** - * Fired when the Pulse metric size is known - * - * @category Pulse - */ - TableauEventType["FirstPulseMetricSizeKnown"] = "firstpulsemetricsizeknown"; - /** - * Fired when an internal Pulse error is encountered. - * - * @category Pulse - */ - TableauEventType["PulseError"] = "pulseerror"; - /** - * Fired when the Pulse filters change - * - * @category Pulse - */ - TableauEventType["PulseFiltersChanged"] = "pulsefilterschanged"; - /** - * Fired when a Pulse insight is discovered - * - * @category Pulse - */ - TableauEventType["PulseInsightDiscovered"] = "pulseinsightdiscovered"; - /** - * Fired when the Pulse metric size changes - * - * @category Pulse - */ - TableauEventType["PulseMetricSizeChanged"] = "pulsemetricsizechanged"; - /** - * Fired when the Pulse metric time dimension changes - * - * @category Pulse - */ - TableauEventType["PulseTimeDimensionChanged"] = "pulsetimedimensionchanged"; - /** - * Fired when the Pulse URL changes - * - * @category Pulse - */ - TableauEventType["PulseUrlChanged"] = "pulseurlchanged"; -})(TableauEventType = exports.TableauEventType || (exports.TableauEventType = {})); -/** - * Represents the location of a context menu where users can add external menu items. - */ -var ApiMenuType; -(function (ApiMenuType) { - /** External menu item will be injected in ubertip dialog */ - ApiMenuType["Ubertip"] = "ubertip"; -})(ApiMenuType = exports.ApiMenuType || (exports.ApiMenuType = {})); -/** You can use this type with a {@link Viz} object. */ -var TableauDialogType; -(function (TableauDialogType) { - /** - * Used to display the download PDF dialog. - */ - TableauDialogType["ExportPDF"] = "export-pdf"; - /** - * Used to display the download PowerPoint dialog. - */ - TableauDialogType["ExportPowerPoint"] = "export-powerpoint"; - /** - * Used to display the download Data dialog. - */ - TableauDialogType["ExportData"] = "export-data"; - /** - * Used to display the download CrossTab dialog. - */ - TableauDialogType["ExportCrossTab"] = "export-cross-tab"; - /** - * Used to display the download Workbook dialog. - */ - TableauDialogType["ExportWorkbook"] = "export-workbook"; - /** - * Used to display the Share dialog. - */ - TableauDialogType["Share"] = "share"; -})(TableauDialogType = exports.TableauDialogType || (exports.TableauDialogType = {})); - - -/***/ }), - -/***/ "../api-external-contract-js/lib/src/ExternalContract/Embedding/PulseInterfaces.js": -/*!*****************************************************************************************!*\ - !*** ../api-external-contract-js/lib/src/ExternalContract/Embedding/PulseInterfaces.js ***! - \*****************************************************************************************/ -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -/** - * The names of the string constants you can use as HTML attributes for the web component. - * @ignore - */ -var PulseAttributes; -(function (PulseAttributes) { - PulseAttributes["DisableExploreFilter"] = "disable-explore-filter"; - PulseAttributes["Layout"] = "layout"; - PulseAttributes["OnFirstInteractive"] = "onFirstInteractive"; - PulseAttributes["OnFirstPulseMetricSizeKnown"] = "onFirstPulseMetricSizeKnown"; - PulseAttributes["OnPulseUrlError"] = "onPulseError"; - PulseAttributes["OnPulseFiltersChanged"] = "onPulseFiltersChanged"; - PulseAttributes["OnPulseInsightDiscovered"] = "onPulseInsightDiscovered"; - PulseAttributes["OnPulseMetricSizeChanged"] = "onPulseMetricSizeChanged"; - PulseAttributes["OnPulseTimeDimensionChanged"] = "onPulseTimeDimensionChanged"; - PulseAttributes["OnPulseUrlChanged"] = "onPulseUrlChanged"; - PulseAttributes["TimeDimension"] = "time-dimension"; - PulseAttributes["TokenOptional"] = "token-optional"; -})(PulseAttributes = exports.PulseAttributes || (exports.PulseAttributes = {})); -/** - * The names of the string constants you can use as child tags for TableauPulse custom element. - */ -var PulseChildElements; -(function (PulseChildElements) { - /** - * Custom styles applicable to the embedded iframe element itself (not inside it). - */ - PulseChildElements["IframeStyle"] = "iframe-style"; - /** - * A parameter to be used in the Pulse theme. - */ - PulseChildElements["ThemeParameter"] = "theme-parameter"; - /** - * Contains a list of filter parameters. - */ - PulseChildElements["PulseFilter"] = "pulse-filter"; -})(PulseChildElements = exports.PulseChildElements || (exports.PulseChildElements = {})); -/** - * The attributes of the child elements of . - */ -var PulseChildElementAttributes; -(function (PulseChildElementAttributes) { - PulseChildElementAttributes["Name"] = "name"; - PulseChildElementAttributes["Field"] = "field"; - PulseChildElementAttributes["Value"] = "value"; - PulseChildElementAttributes["Type"] = "type"; -})(PulseChildElementAttributes = exports.PulseChildElementAttributes || (exports.PulseChildElementAttributes = {})); - - -/***/ }), - -/***/ "../api-external-contract-js/lib/src/ExternalContract/Embedding/VizInterfaces.js": -/*!***************************************************************************************!*\ - !*** ../api-external-contract-js/lib/src/ExternalContract/Embedding/VizInterfaces.js ***! - \***************************************************************************************/ -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -/** - * The shared string constants you can use as HTML attributes for the and web component. - * @ignore - */ -var VizSharedAttributes; -(function (VizSharedAttributes) { - VizSharedAttributes["TouchOptimize"] = "touch-optimize"; - VizSharedAttributes["HideEditInDesktopButton"] = "hide-edit-in-desktop-button"; - VizSharedAttributes["SuppressDefaultEditBehavior"] = "suppress-default-edit-behavior"; - VizSharedAttributes["DisableVersionCheck"] = "disable-version-check"; - VizSharedAttributes["OnEditInDesktopButtonClicked"] = "onEditInDesktopButtonClicked"; - VizSharedAttributes["OnFirstVizSizeKnown"] = "onFirstVizSizeKnown"; - VizSharedAttributes["OnFirstInteractive"] = "onFirstInteractive"; -})(VizSharedAttributes = exports.VizSharedAttributes || (exports.VizSharedAttributes = {})); -/** - * The names of the string constants you can use as HTML attributes for the web component. - * @ignore - */ -var VizAttributes; -(function (VizAttributes) { - VizAttributes["DisableUrlActionsPopups"] = "disable-url-actions"; - VizAttributes["HideTabs"] = "hide-tabs"; - VizAttributes["Toolbar"] = "toolbar"; - VizAttributes["InstanceIdToClone"] = "instance-id-to-clone"; - VizAttributes["Device"] = "device"; - VizAttributes["HideEditButton"] = "hide-edit-button"; - VizAttributes["OnEditButtonClicked"] = "onEditButtonClicked"; - VizAttributes["OnFilterChanged"] = "onFilterChanged"; - VizAttributes["OnCustomMarkContextMenuEvent"] = "onCustomMarkContextMenuEvent"; - VizAttributes["OnMarkSelectionChanged"] = "onMarkSelectionChanged"; - VizAttributes["OnParameterChanged"] = "onParameterChanged"; - VizAttributes["OnToolbarStateChanged"] = "onToolbarStateChanged"; - VizAttributes["OnUrlAction"] = "onUrlAction"; - VizAttributes["OnTabSwitched"] = "onTabSwitched"; - VizAttributes["OnCustomViewLoaded"] = "onCustomViewLoaded"; - VizAttributes["OnCustomViewRemoved"] = "onCustomViewRemoved"; - VizAttributes["OnCustomViewSaved"] = "onCustomViewSaved"; - VizAttributes["OnCustomViewSetDefault"] = "onCustomViewSetDefault"; - VizAttributes["OnStoryPointSwitched"] = "onStoryPointSwitched"; - VizAttributes["OnSummaryDataChanged"] = "onSummaryDataChanged"; - VizAttributes["OnReadyToReceiveAuthToken"] = "onReadyToReceiveAuthToken"; -})(VizAttributes = exports.VizAttributes || (exports.VizAttributes = {})); -/** - * The names of the string constants you can use as HTML attributes for the web component. - * @ignore - */ -var VizAuthoringAttributes; -(function (VizAuthoringAttributes) { - VizAuthoringAttributes["OnWorkbookPublished"] = "onWorkbookPublished"; - VizAuthoringAttributes["OnWorkbookPublishedAs"] = "onWorkbookPublishedAs"; - VizAuthoringAttributes["OnWorkbookReadyToClose"] = "onWorkbookReadyToClose"; - VizAuthoringAttributes["HideCloseButton"] = "hide-close-button"; -})(VizAuthoringAttributes = exports.VizAuthoringAttributes || (exports.VizAuthoringAttributes = {})); -/** - * The names of the string constants you can use as child tags for TableauViz and TableauAuthoringViz custom elements. - */ -var VizChildElements; -(function (VizChildElements) { - /** - * Contains a list of filter parameters. Available only in viewing mode. - */ - VizChildElements["VizFilter"] = "viz-filter"; - /** - * Contains a name and value for a parameter. Available only in viewing mode. - */ - VizChildElements["VizParameter"] = "viz-parameter"; - /** - * Contains a list of custom parameters. Available in both viewing and authoring modes. - */ - VizChildElements["CustomParameter"] = "custom-parameter"; - /** - * Custom styles applicable to the embedded iframe element itself (not inside it). Available in both viewing and authoring modes. - */ - VizChildElements["IframeStyle"] = "iframe-style"; -})(VizChildElements = exports.VizChildElements || (exports.VizChildElements = {})); -var VizChildElementAttributes; -(function (VizChildElementAttributes) { - VizChildElementAttributes["Field"] = "field"; - VizChildElementAttributes["Value"] = "value"; - VizChildElementAttributes["Name"] = "name"; -})(VizChildElementAttributes = exports.VizChildElementAttributes || (exports.VizChildElementAttributes = {})); - - -/***/ }), - -/***/ "../api-external-contract-js/lib/src/ExternalContract/Embedding/WebComponentInterfaces.js": -/*!************************************************************************************************!*\ - !*** ../api-external-contract-js/lib/src/ExternalContract/Embedding/WebComponentInterfaces.js ***! - \************************************************************************************************/ -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -/** - * The names of the common string constants you can use as HTML attributes for the tableau web component. - * @ignore - */ -var WebComponentAttributes; -(function (WebComponentAttributes) { - WebComponentAttributes["Src"] = "src"; - WebComponentAttributes["Width"] = "width"; - WebComponentAttributes["Height"] = "height"; - WebComponentAttributes["Token"] = "token"; - WebComponentAttributes["Debug"] = "debug"; - WebComponentAttributes["IframeAuth"] = "iframe-auth"; - WebComponentAttributes["OnVizLoadError"] = "onvizloaderror"; - WebComponentAttributes["ForceTokenSync"] = "force-token-sync"; -})(WebComponentAttributes = exports.WebComponentAttributes || (exports.WebComponentAttributes = {})); -/** - * The names of the embedded iframe attributes whose values can be controlled. - * @ignore - */ -var EmbeddedIframeAttributes; -(function (EmbeddedIframeAttributes) { - EmbeddedIframeAttributes["Loading"] = "iframe-attr-loading"; - EmbeddedIframeAttributes["Style"] = "iframe-attr-style"; - EmbeddedIframeAttributes["Class"] = "iframe-attr-class"; -})(EmbeddedIframeAttributes = exports.EmbeddedIframeAttributes || (exports.EmbeddedIframeAttributes = {})); -/** - * The names of the string constants you can use as child tags for TableauViz, TableauAuthoringViz and TableauAskData custom elements. - * @ignore - */ -var WebComponentChildElements; -(function (WebComponentChildElements) { - /** - * Contains a list of custom parameters. Available in viz viewing, viz authoring and askdata. - */ - WebComponentChildElements["CustomParameter"] = "custom-parameter"; - /** - * Custom styles applicable to the embedded iframe element itself (not inside it). - */ - WebComponentChildElements["IframeStyle"] = "iframe-style"; -})(WebComponentChildElements = exports.WebComponentChildElements || (exports.WebComponentChildElements = {})); -var WebComponentChildElementAttributes; -(function (WebComponentChildElementAttributes) { - WebComponentChildElementAttributes["Field"] = "field"; - WebComponentChildElementAttributes["Value"] = "value"; - WebComponentChildElementAttributes["Name"] = "name"; -})(WebComponentChildElementAttributes = exports.WebComponentChildElementAttributes || (exports.WebComponentChildElementAttributes = {})); - - -/***/ }), - -/***/ "../api-external-contract-js/lib/src/ExternalContract/Extensions/Namespaces/Tableau.js": -/*!*********************************************************************************************!*\ - !*** ../api-external-contract-js/lib/src/ExternalContract/Extensions/Namespaces/Tableau.js ***! - \*********************************************************************************************/ -/***/ ((module) => { - -"use strict"; - -// All enum values made available to Extensions developers. -// Enums should be kept in alphabetical order. -var Tableau; -(function (Tableau) { - /** - * All error codes used by the Extensions API. - */ - let ErrorCodes; - (function (ErrorCodes) { - /** - * Thrown when caller attempts to execute command before initialization has completed. - */ - ErrorCodes["APINotInitialized"] = "api-not-initialized"; - /** - * Thrown when caller attempts to execute command while extension is not visible. - */ - ErrorCodes["VisibilityError"] = "visibility-error"; - /** - * Only one dialog can be opened at time with the UI namespace functionality. - */ - ErrorCodes["DialogAlreadyOpen"] = "dialog-already-open"; - /** - * The open dialog was closed by the user. - */ - ErrorCodes["DialogClosedByUser"] = "dialog-closed-by-user"; - /** - * An error occurred within the Tableau Extensions API. Contact Tableau Support. - */ - ErrorCodes["InternalError"] = "internal-error"; - /** - * A dialog must start on the same domain as the parent extenion. - */ - ErrorCodes["InvalidDomainDialog"] = "invalid-dialog-domain"; - /** - * A parameter is not the correct data type or format. The name of the parameter is specified in the Error.message field. - */ - ErrorCodes["InvalidParameter"] = "invalid-parameter"; - /** - * Can occur if the extension interacts with a filter that has been removed from the worksheet. - */ - ErrorCodes["MissingFilter"] = "missing-filter"; - /** - * Can occur if the extension interacts with a parameter that has been removed from the worksheet. - */ - ErrorCodes["MissingParameter"] = "missing-parameter"; - /** - * Internal Server Error - */ - ErrorCodes["ServerError"] = "server-error"; - /** - * Developer cannot save settings while another save is still in progress. - */ - ErrorCodes["SettingSaveInProgress"] = "setting-save-in-progress"; - /** - * An unknown event name was specified in the call to `addEventListener` or `removeEventListener`. - */ - ErrorCodes["UnsupportedEventName"] = "unsupported-event-name"; - /** - * A method was used for a type of data source that doesn't support that method (see getActiveTablesAsync for an example) - */ - ErrorCodes["UnsupportedMethodForDataSourceType"] = "unsupported-method-for-data-source-type"; - })(ErrorCodes = Tableau.ErrorCodes || (Tableau.ErrorCodes = {})); - /** - * The context in which the Extensions is currently running. - */ - let ExtensionContext; - (function (ExtensionContext) { - ExtensionContext["Desktop"] = "desktop"; - ExtensionContext["Server"] = "server"; - ExtensionContext["Cloud"] = "cloud"; - ExtensionContext["PublicWeb"] = "public-web"; - ExtensionContext["PublicDesktop"] = "public-desktop"; - })(ExtensionContext = Tableau.ExtensionContext || (Tableau.ExtensionContext = {})); - /** - * The mode in which the Extensions is currently running. - */ - let ExtensionMode; - (function (ExtensionMode) { - ExtensionMode["Authoring"] = "authoring"; - ExtensionMode["Viewing"] = "viewing"; - })(ExtensionMode = Tableau.ExtensionMode || (Tableau.ExtensionMode = {})); - /** - * Represents the type of event that can be listened for. - */ - let TableauEventType; - (function (TableauEventType) { - /** - * @experimental - * Raised when a message is received that was sent by a dialog or extension via `sendDialogMessageAsync`.*/ - TableauEventType["DialogMessageReceived"] = "dialog-message-received"; - /** Raised when any filter has changed state. You can use this event type with [Worksheet](../interfaces/worksheet.html) objects.*/ - TableauEventType["FilterChanged"] = "filter-changed"; - /** The selected marks on a visualization has changed. - * You can use this event type with [Worksheet](../interfaces/worksheet.html) objects. */ - TableauEventType["MarkSelectionChanged"] = "mark-selection-changed"; - /** The summary data backing a worksheet has changed - * You can use this event type with [Worksheet](../interfaces/worksheet.html) objects.*/ - TableauEventType["SummaryDataChanged"] = "summary-data-changed"; - /** A parameter has had its value modified. You can use this event type with [[Parameter]] objects. */ - TableauEventType["ParameterChanged"] = "parameter-changed"; - /** Settings have been changed for this extension. You can use this event type with [[Settings]] objects. */ - TableauEventType["SettingsChanged"] = "settings-changed"; - /** The dashboard layout has changed - * @category Dashboard Extensions - */ - TableauEventType["DashboardLayoutChanged"] = "dashboard-layout-changed"; - /** The workbook formatting has changed - * @category Dashboard Extensions - */ - TableauEventType["WorkbookFormattingChanged"] = "workbook-formatting-changed"; - /** The worksheet formatting has changed - * @category Viz Extensions - */ - TableauEventType["WorksheetFormattingChanged"] = "worksheet-formatting-changed"; - })(TableauEventType = Tableau.TableauEventType || (Tableau.TableauEventType = {})); - /** - * Enum that represents the data type of encodings for createVizImageAsync. - * @since 1.6.0 - */ - let VizImageEncodingType; - (function (VizImageEncodingType) { - VizImageEncodingType["Discrete"] = "discrete"; - VizImageEncodingType["Continuous"] = "continuous"; - })(VizImageEncodingType = Tableau.VizImageEncodingType || (Tableau.VizImageEncodingType = {})); - /** - * Enum that represents the sort direction for createVizImageAsync. - * @since 1.8.0 and Tableau 2021.4 - */ - let VizImageSortDirectionType; - (function (VizImageSortDirectionType) { - VizImageSortDirectionType["Ascending"] = "ascending"; - VizImageSortDirectionType["Descending"] = "descending"; - })(VizImageSortDirectionType = Tableau.VizImageSortDirectionType || (Tableau.VizImageSortDirectionType = {})); - /** - * Enum that represents the palette type for createVizImageAsync. - * @since 1.8.0 and Tableau 2021.4 - */ - let VizImagePaletteType; - (function (VizImagePaletteType) { - VizImagePaletteType["CustomDiverging"] = "custom-diverging"; - VizImagePaletteType["CustomSequential"] = "custom-sequential"; - })(VizImagePaletteType = Tableau.VizImagePaletteType || (Tableau.VizImagePaletteType = {})); - /** - * Enum that represents the Size Setting type for createVizImageAsync. - * @since 1.8.0 and Tableau 2021.4 - */ - let VizImageSizeSettingType; - (function (VizImageSizeSettingType) { - VizImageSizeSettingType["Fixed"] = "fixed"; - VizImageSizeSettingType["Manual"] = "manual"; - })(VizImageSizeSettingType = Tableau.VizImageSizeSettingType || (Tableau.VizImageSizeSettingType = {})); - /** - * Enum that represents the Size Setting alignment type for createVizImageAsync. - * @since 1.8.0 and Tableau 2021.4 - */ - let VizImageSizeSettingAlignmentType; - (function (VizImageSizeSettingAlignmentType) { - VizImageSizeSettingAlignmentType["Right"] = "right"; - VizImageSizeSettingAlignmentType["Left"] = "left"; - VizImageSizeSettingAlignmentType["Center"] = "center"; - })(VizImageSizeSettingAlignmentType = Tableau.VizImageSizeSettingAlignmentType || (Tableau.VizImageSizeSettingAlignmentType = {})); -})(Tableau || (Tableau = {})); -module.exports = Tableau; - - -/***/ }), - -/***/ "../api-external-contract-js/lib/src/ExternalContract/Shared/Enums.js": -/*!****************************************************************************!*\ - !*** ../api-external-contract-js/lib/src/ExternalContract/Shared/Enums.js ***! - \****************************************************************************/ -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -var SharedErrorCodes; -(function (SharedErrorCodes) { - /** - * A CSV or Excel file failed to be created in Viz.exportCrosstabAsync(). - */ - SharedErrorCodes["CrosstabCreationError"] = "crosstab-creation-error"; - /** - * A CSV file failed to be created in Viz.exportDataAsync(). - */ - SharedErrorCodes["DataCreationError"] = "data-creation-error"; - /** - * An invalid aggregation was specified for the filter, such as setting a range filter to "SUM(Sales)" instead of - * "Sales". - */ - SharedErrorCodes["InvalidAggregationFieldName"] = "invalid-aggregation-field-name"; - /** - * A filter operation was attempted on a field that does not exist in the data source. - */ - SharedErrorCodes["InvalidFilterFieldName"] = "invalid-filter-name"; - /** - * A filter operation was attempted using a value that is the wrong data type or format. - */ - SharedErrorCodes["InvalidFilterFieldValue"] = "invalid-filter-fieldValue"; - /** - * An invalid date value was specified in a Sheet.selectMarksAsync() call for a date field. - */ - SharedErrorCodes["InvalidSelectionDate"] = "invalid-selection-date"; - /** - * A field was specified in a Sheet.selectMarksAsync() call that does not exist in the data source. - */ - SharedErrorCodes["InvalidSelectionFieldName"] = "invalid-selection-fieldName"; - /** - * An invalid value was specified in a Sheet.selectMarksAsync() call. - */ - SharedErrorCodes["InvalidSelectionValue"] = "invalid-selection-value"; - /** - * A parameter did not include a valid sheet selection for exporting. - */ - SharedErrorCodes["InvalidSelectionSheet"] = "invalid-selection-sheet"; - /** - * An error occurred within the Tableau API. Contact Tableau Support. - */ - SharedErrorCodes["InternalError"] = "internal-error"; - /** - * A parameter is not the correct data type or format. The name of the parameter is specified in the Error.message field. - */ - SharedErrorCodes["InvalidParameter"] = "invalid-parameter"; - /** - * A PDF file failed to be created in Viz.exportPDFAsync(). - */ - SharedErrorCodes["PDFCreationError"] = "pdf-creation-error"; - /** - * A PowerPoint file failed to be created in Viz.exportPowerPointAsync(). - */ - SharedErrorCodes["PowerPointCreationError"] = "powerpoint-creation-error"; - /** - * An operation was attempted on a sheet that is not active or embedded within the active dashboard. - */ - SharedErrorCodes["NotActiveSheet"] = "not-active-sheet"; - /** - * Property or Function is not supported within the Tableau API. - */ - SharedErrorCodes["ImplementationError"] = "wrong-implementation"; - /** - * Can occur when two incompatible calls are triggered together. - */ - SharedErrorCodes["ApiExecutionError"] = "api-execution-error"; - /** - * A general-purpose server error occurred. Details are contained in the Error object. - */ - SharedErrorCodes["ServerError"] = "server-error"; - /** - * Can occur when an api call times out. - */ - SharedErrorCodes["Timeout"] = "timeout"; -})(SharedErrorCodes = exports.SharedErrorCodes || (exports.SharedErrorCodes = {})); - - -/***/ }), - -/***/ "../api-external-contract-js/lib/src/ExternalContract/Shared/Namespaces/Tableau.js": -/*!*****************************************************************************************!*\ - !*** ../api-external-contract-js/lib/src/ExternalContract/Shared/Namespaces/Tableau.js ***! - \*****************************************************************************************/ -/***/ ((module) => { - -"use strict"; - -/** - * The tableau namespace exists for organization and to avoid polluting - * the global namespace. It contains no constructs other than sub-namespaces and the Tableau enumerations. - */ -var Tableau; -(function (Tableau) { - let AnalyticsObjectType; - (function (AnalyticsObjectType) { - AnalyticsObjectType["Cluster"] = "cluster"; - AnalyticsObjectType["Forecast"] = "forecast"; - AnalyticsObjectType["TrendLine"] = "trend-line"; - })(AnalyticsObjectType = Tableau.AnalyticsObjectType || (Tableau.AnalyticsObjectType = {})); - let AnnotationType; - (function (AnnotationType) { - AnnotationType["Mark"] = "mark"; - AnnotationType["Point"] = "point"; - AnnotationType["Area"] = "area"; - })(AnnotationType = Tableau.AnnotationType || (Tableau.AnnotationType = {})); - let ColumnType; - (function (ColumnType) { - ColumnType["Discrete"] = "discrete"; - ColumnType["Continuous"] = "continuous"; - ColumnType["Unknown"] = "unknown"; - })(ColumnType = Tableau.ColumnType || (Tableau.ColumnType = {})); - let ClassNameKey; - (function (ClassNameKey) { - ClassNameKey["WorksheetTitle"] = "tableau-worksheet-title"; - ClassNameKey["Worksheet"] = "tableau-worksheet"; - ClassNameKey["Tooltip"] = "tableau-tooltip"; - ClassNameKey["StoryTitle"] = "tableau-story-title"; - ClassNameKey["DashboardTitle"] = "tableau-dashboard-title"; - ClassNameKey["Pane"] = "tableau-pane"; - ClassNameKey["RowDividers"] = "tableau-row-dividers"; - ClassNameKey["ColumnDividers"] = "tableau-column-dividers"; - })(ClassNameKey = Tableau.ClassNameKey || (Tableau.ClassNameKey = {})); - /** - * What the object represents in a dashboard. - */ - let DashboardObjectType; - (function (DashboardObjectType) { - DashboardObjectType["Blank"] = "blank"; - DashboardObjectType["Worksheet"] = "worksheet"; - DashboardObjectType["QuickFilter"] = "quick-filter"; - DashboardObjectType["ParameterControl"] = "parameter-control"; - DashboardObjectType["PageFilter"] = "page-filter"; - DashboardObjectType["Legend"] = "legend"; - DashboardObjectType["Title"] = "title"; - DashboardObjectType["Text"] = "text"; - DashboardObjectType["Image"] = "image"; - DashboardObjectType["WebPage"] = "web-page"; - DashboardObjectType["Extension"] = "extension"; - })(DashboardObjectType = Tableau.DashboardObjectType || (Tableau.DashboardObjectType = {})); - /** - * Enum that represents the visibility state of a dashboard object. - * @since 1.7.0 - */ - let DashboardObjectVisibilityType; - (function (DashboardObjectVisibilityType) { - /** Used for turning on the visibility of a dashboard object.*/ - DashboardObjectVisibilityType["Show"] = "show"; - /** Used for turning off the visibility of a dashboard object.*/ - DashboardObjectVisibilityType["Hide"] = "hide"; - })(DashboardObjectVisibilityType = Tableau.DashboardObjectVisibilityType || (Tableau.DashboardObjectVisibilityType = {})); - /** - * The different types of data a value can have - */ - let DataType; - (function (DataType) { - DataType["String"] = "string"; - DataType["Int"] = "int"; - DataType["Float"] = "float"; - DataType["Bool"] = "bool"; - DataType["Date"] = "date"; - DataType["DateTime"] = "date-time"; - DataType["Spatial"] = "spatial"; - DataType["Unknown"] = "unknown"; - })(DataType = Tableau.DataType || (Tableau.DataType = {})); - /** - * Enum that represents the changes that occur to a dashboard object. - */ - let DashboardLayoutChange; - (function (DashboardLayoutChange) { - /** A dashboard object was added */ - DashboardLayoutChange["Added"] = "added"; - /** A dashboard object was removed */ - DashboardLayoutChange["Removed"] = "removed"; - /** A dashboard object's floating state changed */ - DashboardLayoutChange["IsFloatingChanged"] = "is-floating-changed"; - /** A dashboard object's visibility changed */ - DashboardLayoutChange["IsVisibleChanged"] = "is-visible-changed"; - /** A dashboard object's position changed */ - DashboardLayoutChange["PositionChanged"] = "position-changed"; - /** A dashboard object's size changed */ - DashboardLayoutChange["SizeChanged"] = "size-changed"; - /** A dashboard object was renamed */ - DashboardLayoutChange["NameChanged"] = "name-changed"; - /** A dashboard object is selected */ - DashboardLayoutChange["Selected"] = "selected"; - /** A dashboard object is deselected */ - DashboardLayoutChange["Deselected"] = "deselected"; - /** Navigate to another dashboard */ - DashboardLayoutChange["DashboardChanged"] = "dashboard-changed"; - })(DashboardLayoutChange = Tableau.DashboardLayoutChange || (Tableau.DashboardLayoutChange = {})); - /** - * Valid date ranges for a relative date filter. - */ - let DateRangeType; - (function (DateRangeType) { - DateRangeType["Last"] = "last"; - DateRangeType["LastN"] = "last-n"; - DateRangeType["Next"] = "next"; - DateRangeType["NextN"] = "next-n"; - DateRangeType["Current"] = "current"; - DateRangeType["ToDate"] = "to-date"; - })(DateRangeType = Tableau.DateRangeType || (Tableau.DateRangeType = {})); - /** - * Enum that represents the types of dialog popup styles. - */ - let DialogStyle; - (function (DialogStyle) { - DialogStyle["Window"] = "window"; - DialogStyle["Modal"] = "modal"; - DialogStyle["Modeless"] = "modeless"; - })(DialogStyle = Tableau.DialogStyle || (Tableau.DialogStyle = {})); - let EncodingType; - (function (EncodingType) { - EncodingType["Column"] = "column"; - EncodingType["Row"] = "row"; - EncodingType["Page"] = "page"; - EncodingType["Filter"] = "filter"; - EncodingType["MarksType"] = "marks-type"; - EncodingType["MeasureValues"] = "measure-values"; - EncodingType["Color"] = "color"; - EncodingType["Size"] = "size"; - EncodingType["Label"] = "label"; - EncodingType["Detail"] = "detail"; - EncodingType["Tooltip"] = "tooltip"; - EncodingType["Shape"] = "shape"; - EncodingType["Path"] = "path"; - EncodingType["Angle"] = "angle"; - EncodingType["Geometry"] = "geometry"; - EncodingType["Custom"] = "custom"; - })(EncodingType = Tableau.EncodingType || (Tableau.EncodingType = {})); - /** - * Type of aggregation on a field. - */ - let FieldAggregationType; - (function (FieldAggregationType) { - FieldAggregationType["Sum"] = "sum"; - FieldAggregationType["Avg"] = "avg"; - FieldAggregationType["Min"] = "min"; - FieldAggregationType["Max"] = "max"; - FieldAggregationType["Stdev"] = "stdev"; - FieldAggregationType["Stdevp"] = "stdevp"; - FieldAggregationType["Var"] = "var"; - FieldAggregationType["Varp"] = "varp"; - FieldAggregationType["Collect"] = "collect"; - FieldAggregationType["Count"] = "count"; - FieldAggregationType["Countd"] = "countd"; - FieldAggregationType["Median"] = "median"; - FieldAggregationType["Attr"] = "attr"; - FieldAggregationType["None"] = "none"; - FieldAggregationType["Year"] = "year"; - FieldAggregationType["Qtr"] = "qtr"; - FieldAggregationType["Month"] = "month"; - FieldAggregationType["Day"] = "day"; - FieldAggregationType["Hour"] = "hour"; - FieldAggregationType["Minute"] = "minute"; - FieldAggregationType["Second"] = "second"; - FieldAggregationType["Week"] = "week"; - FieldAggregationType["Weekday"] = "weekday"; - FieldAggregationType["MonthYear"] = "month-year"; - FieldAggregationType["Mdy"] = "mdy"; - FieldAggregationType["End"] = "end"; - FieldAggregationType["TruncYear"] = "trunc-year"; - FieldAggregationType["TruncQtr"] = "trunc-qtr"; - FieldAggregationType["TruncMonth"] = "trunc-month"; - FieldAggregationType["TruncWeek"] = "trunc-week"; - FieldAggregationType["TruncDay"] = "trunc-day"; - FieldAggregationType["TruncHour"] = "trunc-hour"; - FieldAggregationType["TruncMinute"] = "trunc-minute"; - FieldAggregationType["TruncSecond"] = "trunc-second"; - FieldAggregationType["Quart1"] = "quart1"; - FieldAggregationType["Quart3"] = "quart3"; - FieldAggregationType["Skewness"] = "skewness"; - FieldAggregationType["Kurtosis"] = "kurtosis"; - FieldAggregationType["InOut"] = "in-out"; - FieldAggregationType["User"] = "user"; - })(FieldAggregationType = Tableau.FieldAggregationType || (Tableau.FieldAggregationType = {})); - /** - * Role of a field. - */ - let FieldRoleType; - (function (FieldRoleType) { - FieldRoleType["Dimension"] = "dimension"; - FieldRoleType["Measure"] = "measure"; - FieldRoleType["Unknown"] = "unknown"; - })(FieldRoleType = Tableau.FieldRoleType || (Tableau.FieldRoleType = {})); - /** - * An enumeration of the valid types of filters that can be applied. - */ - let FilterType; - (function (FilterType) { - FilterType["Categorical"] = "categorical"; - FilterType["Range"] = "range"; - FilterType["Hierarchical"] = "hierarchical"; - FilterType["RelativeDate"] = "relative-date"; - })(FilterType = Tableau.FilterType || (Tableau.FilterType = {})); - /** - * The different update types for applying filter - */ - let FilterUpdateType; - (function (FilterUpdateType) { - FilterUpdateType["Add"] = "add"; - FilterUpdateType["All"] = "all"; - FilterUpdateType["Replace"] = "replace"; - FilterUpdateType["Remove"] = "remove"; - })(FilterUpdateType = Tableau.FilterUpdateType || (Tableau.FilterUpdateType = {})); - /** - * The domain type for a filter - */ - let FilterDomainType; - (function (FilterDomainType) { - /** - * The domain values that are relevant to the specified filter - * i.e. the domain is restricted by a previous filter - */ - FilterDomainType["Relevant"] = "relevant"; - /** - * list of all possible domain values from database - */ - FilterDomainType["Database"] = "database"; - })(FilterDomainType = Tableau.FilterDomainType || (Tableau.FilterDomainType = {})); - /** - * The option for specifying which values to include for filtering - * Indicates what to do with null values for a given filter or mark selection call. - */ - let FilterNullOption; - (function (FilterNullOption) { - FilterNullOption["NullValues"] = "null-values"; - FilterNullOption["NonNullValues"] = "non-null-values"; - FilterNullOption["AllValues"] = "all-values"; - })(FilterNullOption = Tableau.FilterNullOption || (Tableau.FilterNullOption = {})); - /** - * Enum that serves as a filter on the DataValues returned from `getSummaryDataReaderAsync`, - * `getUnderlyingTableDataReaderAsync` and `getLogicalTableDataReaderAsync`. - * This is an optimization of returned data values only. Tableau versions prior to 2021.2 - * will pass the data across and populate the DataValue properties. - * Please note that all properties not requested will be `undefined` in the DataValue results. - * @since 1.5.0 - */ - let IncludeDataValuesOption; - (function (IncludeDataValuesOption) { - /** DataValues will include all properties.*/ - IncludeDataValuesOption["AllValues"] = "all-values"; - /** DataValues will only include value and nativeValue properties.*/ - IncludeDataValuesOption["OnlyNativeValues"] = "only-native-values"; - /** DataValues will only include formattedValue properties. */ - IncludeDataValuesOption["OnlyFormattedValues"] = "only-formatted-values"; - })(IncludeDataValuesOption = Tableau.IncludeDataValuesOption || (Tableau.IncludeDataValuesOption = {})); - /** - * Type of mark for a given marks card in a viz. - */ - let MarkType; - (function (MarkType) { - MarkType["Bar"] = "bar"; - MarkType["Line"] = "line"; - MarkType["Area"] = "area"; - MarkType["Square"] = "square"; - MarkType["Circle"] = "circle"; - MarkType["Shape"] = "shape"; - MarkType["Text"] = "text"; - MarkType["Map"] = "map"; - MarkType["Pie"] = "pie"; - MarkType["GanttBar"] = "gantt-bar"; - MarkType["Polygon"] = "polygon"; - MarkType["Heatmap"] = "heatmap"; - MarkType["VizExtension"] = "viz-extension"; - })(MarkType = Tableau.MarkType || (Tableau.MarkType = {})); - /** - * An enumeration describing the different types of allowable values. - * This is used for restricting the domain of a parameter - */ - let ParameterValueType; - (function (ParameterValueType) { - ParameterValueType["All"] = "all"; - ParameterValueType["List"] = "list"; - ParameterValueType["Range"] = "range"; - })(ParameterValueType = Tableau.ParameterValueType || (Tableau.ParameterValueType = {})); - /** - * Date period used in filters and in parameters. - */ - let PeriodType; - (function (PeriodType) { - PeriodType["Years"] = "years"; - PeriodType["Quarters"] = "quarters"; - PeriodType["Months"] = "months"; - PeriodType["Weeks"] = "weeks"; - PeriodType["Days"] = "days"; - PeriodType["Hours"] = "hours"; - PeriodType["Minutes"] = "minutes"; - PeriodType["Seconds"] = "seconds"; - })(PeriodType = Tableau.PeriodType || (Tableau.PeriodType = {})); - let QuickTableCalcType; - (function (QuickTableCalcType) { - QuickTableCalcType["RunningTotal"] = "running-total"; - QuickTableCalcType["Difference"] = "difference"; - QuickTableCalcType["PercentDifference"] = "percent-difference"; - QuickTableCalcType["PercentOfTotal"] = "percent-of-total"; - QuickTableCalcType["Rank"] = "rank"; - QuickTableCalcType["Percentile"] = "percentile"; - QuickTableCalcType["MovingAverage"] = "moving-average"; - QuickTableCalcType["YTDTotal"] = "ytd-total"; - QuickTableCalcType["CompoundGrowthRate"] = "compound-growth-rate"; - QuickTableCalcType["YearOverYearGrowth"] = "year-over-year-growth"; - QuickTableCalcType["YTDGrowth"] = "ytd-growth"; - QuickTableCalcType["Undefined"] = "undefined"; - })(QuickTableCalcType = Tableau.QuickTableCalcType || (Tableau.QuickTableCalcType = {})); - /** - * Enum for specifying the selection type for select marks api. - */ - let SelectionUpdateType; - (function (SelectionUpdateType) { - SelectionUpdateType["Replace"] = "select-replace"; - SelectionUpdateType["Add"] = "select-add"; - SelectionUpdateType["Remove"] = "select-remove"; - })(SelectionUpdateType = Tableau.SelectionUpdateType || (Tableau.SelectionUpdateType = {})); - /** - * Enum for specifying the select option for the `extensions.Worksheet.selectTuplesAsync` method. - */ - let SelectOptions; - (function (SelectOptions) { - /** - * Clears existing selection before selecting the tuples specified - */ - SelectOptions["Simple"] = "select-options-simple"; - /** - * Adds specified tuples to the existing selection - */ - SelectOptions["Toggle"] = "select-options-toggle"; - })(SelectOptions = Tableau.SelectOptions || (Tableau.SelectOptions = {})); - /** - * The type of sheet a [[Sheet]] object represents - */ - let SheetType; - (function (SheetType) { - SheetType["Dashboard"] = "dashboard"; - SheetType["Story"] = "story"; - SheetType["Worksheet"] = "worksheet"; - })(SheetType = Tableau.SheetType || (Tableau.SheetType = {})); - let SortDirection; - (function (SortDirection) { - SortDirection["Increasing"] = "increasing"; - SortDirection["Decreasing"] = "decreasing"; - })(SortDirection = Tableau.SortDirection || (Tableau.SortDirection = {})); - let TrendLineModelType; - (function (TrendLineModelType) { - TrendLineModelType["Linear"] = "linear"; - TrendLineModelType["Logarithmic"] = "logarithmic"; - TrendLineModelType["Exponential"] = "exponential"; - TrendLineModelType["Polynomial"] = "polynomial"; - })(TrendLineModelType = Tableau.TrendLineModelType || (Tableau.TrendLineModelType = {})); - /** - * Enum that represents the replay speed of an animation. - * @since 1.7.0 - */ - let ReplaySpeedType; - (function (ReplaySpeedType) { - /** Used for setting the replay speed of an animation to 0.5x.*/ - ReplaySpeedType["Slow"] = "slow"; - /** Used for setting the replay speed of an animation to 1.0x.*/ - ReplaySpeedType["Normal"] = "normal"; - /** Used for setting the replay speed of an animation to 2.0x.*/ - ReplaySpeedType["Fast"] = "fast"; - })(ReplaySpeedType = Tableau.ReplaySpeedType || (Tableau.ReplaySpeedType = {})); - /** - * Enum that represents the selection state of a level in a hierarchical filter - * @since Extensions 1.10.0 - */ - let HierarchicalLevelSelectionState; - (function (HierarchicalLevelSelectionState) { - HierarchicalLevelSelectionState["AllSelected"] = "all-selected"; - HierarchicalLevelSelectionState["NoneSelected"] = "none-selected"; - HierarchicalLevelSelectionState["SomeSelected"] = "some-selected"; - HierarchicalLevelSelectionState["UnknownSelected"] = "unknown-selected"; - })(HierarchicalLevelSelectionState = Tableau.HierarchicalLevelSelectionState || (Tableau.HierarchicalLevelSelectionState = {})); - Tableau.ZoneVisibilityType = Object.assign({}, DashboardObjectVisibilityType); -})(Tableau || (Tableau = {})); -module.exports = Tableau; - - -/***/ }), - -/***/ "../api-external-contract-js/lib/src/SharedApiExternalContract.js": -/*!************************************************************************!*\ - !*** ../api-external-contract-js/lib/src/SharedApiExternalContract.js ***! - \************************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -// This file re-exports everything which is part of the shared api public interface -function __export(m) { - for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; -} -Object.defineProperty(exports, "__esModule", ({ value: true })); -__export(__webpack_require__(/*! ./ExternalContract/Shared/Enums */ "../api-external-contract-js/lib/src/ExternalContract/Shared/Enums.js")); -var Tableau_1 = __webpack_require__(/*! ./ExternalContract/Shared/Namespaces/Tableau */ "../api-external-contract-js/lib/src/ExternalContract/Shared/Namespaces/Tableau.js"); -exports.AnalyticsObjectType = Tableau_1.AnalyticsObjectType; -exports.AnnotationType = Tableau_1.AnnotationType; -exports.ClassNameKey = Tableau_1.ClassNameKey; -exports.ColumnType = Tableau_1.ColumnType; -exports.DashboardLayoutChange = Tableau_1.DashboardLayoutChange; -exports.DashboardObjectType = Tableau_1.DashboardObjectType; -exports.DashboardObjectVisibilityType = Tableau_1.DashboardObjectVisibilityType; -exports.DataType = Tableau_1.DataType; -exports.DateRangeType = Tableau_1.DateRangeType; -exports.DialogStyle = Tableau_1.DialogStyle; -exports.EncodingType = Tableau_1.EncodingType; -exports.FieldAggregationType = Tableau_1.FieldAggregationType; -exports.FieldRoleType = Tableau_1.FieldRoleType; -exports.FilterDomainType = Tableau_1.FilterDomainType; -exports.FilterNullOption = Tableau_1.FilterNullOption; -exports.FilterType = Tableau_1.FilterType; -exports.FilterUpdateType = Tableau_1.FilterUpdateType; -exports.HierarchicalLevelSelectionState = Tableau_1.HierarchicalLevelSelectionState; -exports.IncludeDataValuesOption = Tableau_1.IncludeDataValuesOption; -exports.MarkType = Tableau_1.MarkType; -exports.ParameterValueType = Tableau_1.ParameterValueType; -exports.PeriodType = Tableau_1.PeriodType; -exports.QuickTableCalcType = Tableau_1.QuickTableCalcType; -exports.ReplaySpeedType = Tableau_1.ReplaySpeedType; -exports.SelectOptions = Tableau_1.SelectOptions; -exports.SelectionUpdateType = Tableau_1.SelectionUpdateType; -exports.SheetType = Tableau_1.SheetType; -exports.SortDirection = Tableau_1.SortDirection; -exports.TrendLineModelType = Tableau_1.TrendLineModelType; -exports.ZoneVisibilityType = Tableau_1.ZoneVisibilityType; - - -/***/ }), - -/***/ "../api-internal-contract-js/lib/src/JsApiInternalContract.js": -/*!********************************************************************!*\ - !*** ../api-internal-contract-js/lib/src/JsApiInternalContract.js ***! - \********************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -/** - * This is your main. This is where you re-export everything you want to be publicly available. - * - * The build enforces that the file has the same name as the global variable that is exported. - */ -function __export(m) { - for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; -} -Object.defineProperty(exports, "__esModule", ({ value: true })); -// Export the version of the internal contract to be available at runtime -// This file is generated by yarn publish:bump via scripts/publish-check.ts -// updateInternalContractRuntimeVersion in the monorepo root. -const internalContractVersion = __webpack_require__(/*! ../internal-contract-version.json */ "../api-internal-contract-js/lib/internal-contract-version.json"); -exports.INTERNAL_CONTRACT_VERSION = internalContractVersion; -__export(__webpack_require__(/*! ./contract/DataTypeConverter */ "../api-internal-contract-js/lib/src/contract/DataTypeConverter.js")); -__export(__webpack_require__(/*! ./contract/Enums */ "../api-internal-contract-js/lib/src/contract/Enums.js")); -__export(__webpack_require__(/*! ./contract/Notifications */ "../api-internal-contract-js/lib/src/contract/Notifications.js")); -__export(__webpack_require__(/*! ./contract/Parameters */ "../api-internal-contract-js/lib/src/contract/Parameters.js")); -__export(__webpack_require__(/*! ./contract/Verbs */ "../api-internal-contract-js/lib/src/contract/Verbs.js")); -__export(__webpack_require__(/*! ./interface/AskDataInterface */ "../api-internal-contract-js/lib/src/interface/AskDataInterface.js")); -__export(__webpack_require__(/*! ./interface/PulseInterface */ "../api-internal-contract-js/lib/src/interface/PulseInterface.js")); -__export(__webpack_require__(/*! ./interface/VqlInterface */ "../api-internal-contract-js/lib/src/interface/VqlInterface.js")); -__export(__webpack_require__(/*! ./messaging/CrossFrameMessenger */ "../api-internal-contract-js/lib/src/messaging/CrossFrameMessenger.js")); -__export(__webpack_require__(/*! ./messaging/interface/MessageTypes */ "../api-internal-contract-js/lib/src/messaging/interface/MessageTypes.js")); -__export(__webpack_require__(/*! ./versioning/external/ExternalIdentityVersionConverter */ "../api-internal-contract-js/lib/src/versioning/external/ExternalIdentityVersionConverter.js")); -__export(__webpack_require__(/*! ./versioning/external/ExternalVersionConverterFactory */ "../api-internal-contract-js/lib/src/versioning/external/ExternalVersionConverterFactory.js")); -__export(__webpack_require__(/*! ./versioning/VersionConverterFactory */ "../api-internal-contract-js/lib/src/versioning/VersionConverterFactory.js")); -// Export the version number of messaging for consumers to use. -// Be very careful making any updates to this contract which break version compatibility. -exports.MESSAGING_VERSION = { - major: 1, - minor: 0, - fix: 0, -}; - - -/***/ }), - -/***/ "../api-internal-contract-js/lib/src/contract/DataTypeConverter.js": -/*!*************************************************************************!*\ - !*** ../api-internal-contract-js/lib/src/contract/DataTypeConverter.js ***! - \*************************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const Enums_1 = __webpack_require__(/*! ./Enums */ "../api-internal-contract-js/lib/src/contract/Enums.js"); -class DataTypeConverter { - static isSpecial(valueAsString) { - // Prior to ShowDataTablePresModel, special values come to us as - // '%null%', '%all%', '%wildcard%', '%missing%'... - // While this function will never return true for ShowDataTablePresModel conversion, - // it is as cheap as passing around a version and checking that. - // (See DataValueFormatter.cpp) - if (valueAsString.length > 2 && valueAsString[0] === '%' && valueAsString[valueAsString.length - 1] === '%') { - return true; - } - return false; - } - // tslint:disable-next-line:no-any - static parseBoolean(booleanString) { - // boolean values come to us as 'true'|'false' - const normalizedBoolean = booleanString.toLowerCase(); - return normalizedBoolean !== 'true' && normalizedBoolean !== 'false' ? this.specialValueIndicator : normalizedBoolean === 'true'; - } - // tslint:disable-next-line:no-any - static parseNumber(valueAsString) { - const value = Number(valueAsString); - return isNaN(value) ? this.specialValueIndicator : value; - } - static parseDate(dateAsString) { - // Note that without a time, the date is assumed to be UTC - // Input of 2020-03-25 is printed as: Mar 24 2020 17:00:00 GMT-0700 - // This matches style used in existing convertFilterValuePresModel - const value = new Date(dateAsString); - return Number.isNaN(value.getTime()) ? null : value; - } - static parseDateTime(dateAsString) { - // With a time, the date is assumed to be UTC. - // Our date format is always: yyyy-mm-dd hh:mm:ss - // Unfortunately, IE11 can't parse that format so we add a T between the day and time. - // We also add a Z so that it is UTC. (Without the Z, some browsers assume local, and others UTC) - // Even though we've dropped support for IE11, it's riskier/costlier to make updates here. - const formattedDateString = dateAsString.replace(' ', 'T').concat('Z'); - const value = new Date(formattedDateString); - return Number.isNaN(value.getTime()) ? null : value; - } - // It would be nice to merge this and the method FilterConverter::convertFilterValuePresModel in api-platform-js - static convertValueAsStringToValue(valueAsString, type) { - // This is both DataDictionary and ShowDataTablePresModel compatible. - // In the DataDictionary, valueAsString can be '%null%' or '%missing%', while in - // ShowDataTablePresModel, we can get 'null' or 'missing', or '%null%' for string special values. - // For either of these cases, we return specialValueIndicator (or the original special string). - // To maintain backwards compatibilty, this converter: - // 1. returns a string for any special values - // 2. returns a string for any date - // Parameter min/max values can be undefined, so result is also undefined - if (valueAsString === undefined || valueAsString === null) { - return undefined; - } - if (this.isSpecial(valueAsString)) { - return valueAsString; - } - switch (type) { - case Enums_1.DataType.Bool: - return this.parseBoolean(valueAsString); - case Enums_1.DataType.Int: - case Enums_1.DataType.Float: - // Return special value '%null%' for any failure in parsing. - // We need to do that because ShowDataTablePresModel will give us strings like 'null' - // for special values. - return this.parseNumber(valueAsString); - case Enums_1.DataType.Date: - // For ShowDataTablePresModel, special values will be "null" which will fail to parse. - // In that case, we return '%null%'. - return this.parseDate(valueAsString) === null ? this.specialValueIndicator : valueAsString; - case Enums_1.DataType.DateTime: - // For ShowDataTablePresModel, special values will be "null" which will fail to parse. - // In that case, we return '%null%' - return this.parseDateTime(valueAsString) === null ? this.specialValueIndicator : valueAsString; - case Enums_1.DataType.Spatial: - case Enums_1.DataType.String: - default: - return valueAsString; - } - } - // tslint:disable-next-line:no-any - static convertValueToNativeValue(value, type) { - // This converts from our 1.2 API that returns strings for specials, and dates as strings. - // It takes the special case of '%null%' and returns a null. - // For dates, it returns a Date object rather than a string. - // convertValueToNativeValue should be used to build a DataValue.nativeValue field. - // Parameter min/max can be undefined. If that is the case, nativeValue is treated like a special - if (value === undefined || value === null) { - return null; - } - switch (type) { - case Enums_1.DataType.Bool: - return typeof value === 'string' ? null : value; - case Enums_1.DataType.Int: - case Enums_1.DataType.Float: - return typeof value === 'string' ? null : value; - case Enums_1.DataType.Date: - // Convert the string to Date object (or null if parsing fails ... we assume special) - return this.parseDate(value); - case Enums_1.DataType.DateTime: - // Convert the string to Date object (or null if parsing fails ... we assume special) - return this.parseDateTime(value); - case Enums_1.DataType.String: - return this.isSpecial(value) ? null : value; - case Enums_1.DataType.Spatial: - default: - return value; - } - } - // tslint:disable-next-line:no-any - static convertStringValueToNativeValue(value, type) { - // This handles the conversion from string directly to native value for all types - return this.convertValueToNativeValue(this.convertValueAsStringToValue(value, type), type); - } -} -exports.DataTypeConverter = DataTypeConverter; -DataTypeConverter.specialValueIndicator = '%null%'; - - -/***/ }), - -/***/ "../api-internal-contract-js/lib/src/contract/Enums.js": -/*!*************************************************************!*\ - !*** ../api-internal-contract-js/lib/src/contract/Enums.js ***! - \*************************************************************/ -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -var ExtensionContext; -(function (ExtensionContext) { - ExtensionContext["Desktop"] = "desktop"; - ExtensionContext["Server"] = "server"; - ExtensionContext["Unknown"] = "unknown"; - ExtensionContext["Cloud"] = "cloud"; - ExtensionContext["PublicWeb"] = "public-web"; - ExtensionContext["PublicDesktop"] = "public-desktop"; -})(ExtensionContext = exports.ExtensionContext || (exports.ExtensionContext = {})); -var ExtensionMode; -(function (ExtensionMode) { - ExtensionMode["Authoring"] = "authoring"; - ExtensionMode["Viewing"] = "viewing"; - ExtensionMode["Unknown"] = "unknown"; -})(ExtensionMode = exports.ExtensionMode || (exports.ExtensionMode = {})); -var AnnotateEnum; -(function (AnnotateEnum) { - AnnotateEnum["Mark"] = "mark"; - AnnotateEnum["Point"] = "point"; - AnnotateEnum["Area"] = "area"; -})(AnnotateEnum = exports.AnnotateEnum || (exports.AnnotateEnum = {})); -var ColumnType; -(function (ColumnType) { - ColumnType["Discrete"] = "discrete"; - ColumnType["Continuous"] = "continuous"; - ColumnType["Unknown"] = "unknown"; -})(ColumnType = exports.ColumnType || (exports.ColumnType = {})); -var DashboardObjectType; -(function (DashboardObjectType) { - DashboardObjectType["Blank"] = "blank"; - DashboardObjectType["Worksheet"] = "worksheet"; - DashboardObjectType["QuickFilter"] = "quick-filter"; - DashboardObjectType["ParameterControl"] = "parameter-control"; - DashboardObjectType["PageFilter"] = "page-filter"; - DashboardObjectType["Legend"] = "legend"; - DashboardObjectType["Title"] = "title"; - DashboardObjectType["Text"] = "text"; - DashboardObjectType["Image"] = "image"; - DashboardObjectType["WebPage"] = "web-page"; - DashboardObjectType["Extension"] = "extension"; -})(DashboardObjectType = exports.DashboardObjectType || (exports.DashboardObjectType = {})); -var DataType; -(function (DataType) { - DataType["String"] = "string"; - DataType["Int"] = "int"; - DataType["Float"] = "float"; - DataType["Bool"] = "bool"; - DataType["Date"] = "date"; - DataType["DateTime"] = "date-time"; - DataType["Spatial"] = "spatial"; - DataType["Unknown"] = "unknown"; -})(DataType = exports.DataType || (exports.DataType = {})); -var DialogStyle; -(function (DialogStyle) { - DialogStyle["Window"] = "window"; - DialogStyle["Modal"] = "modal"; - DialogStyle["Modeless"] = "modeless"; -})(DialogStyle = exports.DialogStyle || (exports.DialogStyle = {})); -var EncodedDataType; -(function (EncodedDataType) { - EncodedDataType["Number"] = "number"; - EncodedDataType["String"] = "string"; - EncodedDataType["Date"] = "date"; - EncodedDataType["Boolean"] = "boolean"; -})(EncodedDataType = exports.EncodedDataType || (exports.EncodedDataType = {})); -var ErrorCodes; -(function (ErrorCodes) { - ErrorCodes["INITIALIZATION_ERROR"] = "initialization-error"; - ErrorCodes["INTERNAL_ERROR"] = "internal-error"; - ErrorCodes["MISSING_ENUM_MAPPING"] = "missing-enum-mapping"; - ErrorCodes["MISSING_PARAMETER"] = "missing-parameter"; - ErrorCodes["PERMISSION_DENIED"] = "permission-denied"; - ErrorCodes["PRES_MODEL_PARSING_ERROR"] = "pres-model-parsing-error"; - ErrorCodes["VERSION_NOT_CONFIGURED"] = "version-not-configured"; - ErrorCodes["VISIBILITY_ERROR"] = "visibility-error"; - ErrorCodes["UNKNOWN_VERB_ID"] = "unknown-verb-id"; -})(ErrorCodes = exports.ErrorCodes || (exports.ErrorCodes = {})); -var FieldAggregationType; -(function (FieldAggregationType) { - FieldAggregationType["Sum"] = "sum"; - FieldAggregationType["Avg"] = "avg"; - FieldAggregationType["Min"] = "min"; - FieldAggregationType["Max"] = "max"; - FieldAggregationType["Stdev"] = "stdev"; - FieldAggregationType["Stdevp"] = "stdevp"; - FieldAggregationType["Var"] = "var"; - FieldAggregationType["Varp"] = "varp"; - FieldAggregationType["Collect"] = "collect"; - FieldAggregationType["Count"] = "count"; - FieldAggregationType["Countd"] = "countd"; - FieldAggregationType["Median"] = "median"; - FieldAggregationType["Attr"] = "attr"; - FieldAggregationType["None"] = "none"; - FieldAggregationType["Year"] = "year"; - FieldAggregationType["Qtr"] = "qtr"; - FieldAggregationType["Month"] = "month"; - FieldAggregationType["Day"] = "day"; - FieldAggregationType["Hour"] = "hour"; - FieldAggregationType["Minute"] = "minute"; - FieldAggregationType["Second"] = "second"; - FieldAggregationType["Week"] = "week"; - FieldAggregationType["Weekday"] = "weekday"; - FieldAggregationType["MonthYear"] = "month-year"; - FieldAggregationType["Mdy"] = "mdy"; - FieldAggregationType["End"] = "end"; - FieldAggregationType["TruncYear"] = "trunc-year"; - FieldAggregationType["TruncQtr"] = "trunc-qtr"; - FieldAggregationType["TruncMonth"] = "trunc-month"; - FieldAggregationType["TruncWeek"] = "trunc-week"; - FieldAggregationType["TruncDay"] = "trunc-day"; - FieldAggregationType["TruncHour"] = "trunc-hour"; - FieldAggregationType["TruncMinute"] = "trunc-minute"; - FieldAggregationType["TruncSecond"] = "trunc-second"; - FieldAggregationType["Quart1"] = "quart1"; - FieldAggregationType["Quart3"] = "quart3"; - FieldAggregationType["Skewness"] = "skewness"; - FieldAggregationType["Kurtosis"] = "kurtosis"; - FieldAggregationType["InOut"] = "in-out"; - FieldAggregationType["User"] = "user"; -})(FieldAggregationType = exports.FieldAggregationType || (exports.FieldAggregationType = {})); -var FieldRoleType; -(function (FieldRoleType) { - FieldRoleType["Dimension"] = "dimension"; - FieldRoleType["Measure"] = "measure"; - FieldRoleType["Unknown"] = "unknown"; -})(FieldRoleType = exports.FieldRoleType || (exports.FieldRoleType = {})); -/** - * The different update types for applying filter. - */ -var FilterUpdateType; -(function (FilterUpdateType) { - FilterUpdateType["Add"] = "add"; - FilterUpdateType["All"] = "all"; - FilterUpdateType["Replace"] = "replace"; - FilterUpdateType["Remove"] = "remove"; -})(FilterUpdateType = exports.FilterUpdateType || (exports.FilterUpdateType = {})); -var SheetType; -(function (SheetType) { - SheetType["Dashboard"] = "dashboard"; - SheetType["Story"] = "story"; - SheetType["Worksheet"] = "worksheet"; -})(SheetType = exports.SheetType || (exports.SheetType = {})); -var DomainRestrictionType; -(function (DomainRestrictionType) { - DomainRestrictionType["All"] = "all"; - DomainRestrictionType["List"] = "list"; - DomainRestrictionType["Range"] = "range"; -})(DomainRestrictionType = exports.DomainRestrictionType || (exports.DomainRestrictionType = {})); -var DateStepPeriod; -(function (DateStepPeriod) { - DateStepPeriod["Years"] = "years"; - DateStepPeriod["Quarters"] = "quarters"; - DateStepPeriod["Months"] = "months"; - DateStepPeriod["Weeks"] = "weeks"; - DateStepPeriod["Days"] = "days"; - DateStepPeriod["Hours"] = "hours"; - DateStepPeriod["Minutes"] = "minutes"; - DateStepPeriod["Seconds"] = "seconds"; -})(DateStepPeriod = exports.DateStepPeriod || (exports.DateStepPeriod = {})); -/** - * The option for specifying which values to include for filtering. - */ -var FilterNullOption; -(function (FilterNullOption) { - FilterNullOption["NullValues"] = "nullvalues"; - FilterNullOption["NonNullValues"] = "nonnullvalues"; - FilterNullOption["AllValues"] = "allvalues"; -})(FilterNullOption = exports.FilterNullOption || (exports.FilterNullOption = {})); -/** - * The type of filter domain - */ -var FilterDomainType; -(function (FilterDomainType) { - FilterDomainType["Relevant"] = "relevant"; - FilterDomainType["Database"] = "database"; -})(FilterDomainType = exports.FilterDomainType || (exports.FilterDomainType = {})); -/** - * Internal enum for specifying the selection type for select marks api. - */ -var SelectionUpdateType; -(function (SelectionUpdateType) { - SelectionUpdateType["Replace"] = "select-replace"; - SelectionUpdateType["Add"] = "select-add"; - SelectionUpdateType["Remove"] = "select-remove"; -})(SelectionUpdateType = exports.SelectionUpdateType || (exports.SelectionUpdateType = {})); -/** - * Internal enum for specifying the select option for the select tuples api. - */ -var SelectOptions; -(function (SelectOptions) { - SelectOptions["Simple"] = "select-options-simple"; - SelectOptions["Toggle"] = "select-options-toggle"; - SelectOptions["Menu"] = "select-options-menu"; - SelectOptions["Range"] = "select-options-range"; - SelectOptions["Search"] = "select-options-search"; -})(SelectOptions = exports.SelectOptions || (exports.SelectOptions = {})); -/** - * Internal enum for specifying the included values type for range selection. - */ -var QuantitativeIncludedValues; -(function (QuantitativeIncludedValues) { - QuantitativeIncludedValues["IncludeNull"] = "include-null"; - QuantitativeIncludedValues["IncludeNonNull"] = "include-non-null"; - QuantitativeIncludedValues["IncludeAll"] = "include-all"; -})(QuantitativeIncludedValues = exports.QuantitativeIncludedValues || (exports.QuantitativeIncludedValues = {})); -/** - * Internal enum for specifying a hierarchical level selection state. - */ -var HierarchicalLevelSelectionState; -(function (HierarchicalLevelSelectionState) { - HierarchicalLevelSelectionState["AllSelected"] = "all-selected"; - HierarchicalLevelSelectionState["NoneSelected"] = "none-selected"; - HierarchicalLevelSelectionState["SomeSelected"] = "some-selected"; - HierarchicalLevelSelectionState["UnknownSelected"] = "unknown-selected"; -})(HierarchicalLevelSelectionState = exports.HierarchicalLevelSelectionState || (exports.HierarchicalLevelSelectionState = {})); -/** - * Type of mark for a given marks card in a viz. - */ -var MarkType; -(function (MarkType) { - MarkType["Bar"] = "bar"; - MarkType["Line"] = "line"; - MarkType["Area"] = "area"; - MarkType["Square"] = "square"; - MarkType["Circle"] = "circle"; - MarkType["Shape"] = "shape"; - MarkType["Text"] = "text"; - MarkType["Map"] = "map"; - MarkType["Pie"] = "pie"; - MarkType["GanttBar"] = "gantt-bar"; - MarkType["Polygon"] = "polygon"; - MarkType["Heatmap"] = "heatmap"; - MarkType["VizExtension"] = "viz-extension"; -})(MarkType = exports.MarkType || (exports.MarkType = {})); -/** - * Internal enum for specifying the type of filter - */ -var FilterType; -(function (FilterType) { - FilterType["Categorical"] = "categorical"; - FilterType["Range"] = "range"; - FilterType["RelativeDate"] = "relativeDate"; - FilterType["Hierarchical"] = "hierarchical"; -})(FilterType = exports.FilterType || (exports.FilterType = {})); -/** - * Internal enum for specifying the DateRangeType of a relative date filter - */ -var DateRangeType; -(function (DateRangeType) { - /** - * Refers to the last day, week, month, etc. of the date period. - */ - DateRangeType["Last"] = "last"; - /** - * Refers to the last N days, weeks, months, etc. of the date period. - */ - DateRangeType["LastN"] = "lastN"; - /** - * Refers to the next day, week, month, etc. of the date period. - */ - DateRangeType["Next"] = "next"; - /** - * Refers to the next N days, weeks, months, etc. of the date period. - */ - DateRangeType["NextN"] = "nextN"; - /** - * Refers to the current day, week, month, etc. of the date period. - */ - DateRangeType["Current"] = "current"; - /** - * Refers to everything up to and including the current day, week, month, etc. of the date period. - */ - DateRangeType["ToDate"] = "toDate"; -})(DateRangeType = exports.DateRangeType || (exports.DateRangeType = {})); -/** - * Used to determine if the launching of an extension dialog succeeded or failed. - */ -var ExtensionDialogResult; -(function (ExtensionDialogResult) { - ExtensionDialogResult["DialogAlreadyOpen"] = "dialog-already-open"; - ExtensionDialogResult["InvalidDomain"] = "invalid-domain"; - ExtensionDialogResult["Success"] = "success"; -})(ExtensionDialogResult = exports.ExtensionDialogResult || (exports.ExtensionDialogResult = {})); -/** - * Used to optimize the getSummaryData/getUnderlyingTableData results - * Mapped from external IncludeDataValuesOption - */ -var ApiShowDataTableFormat; -(function (ApiShowDataTableFormat) { - ApiShowDataTableFormat["NativeValuesOnly"] = "native-values-only"; - ApiShowDataTableFormat["FormattedValuesOnly"] = "formatted-values-only"; - ApiShowDataTableFormat["NativeAndFormattedValues"] = "native-and-formatted-values"; -})(ApiShowDataTableFormat = exports.ApiShowDataTableFormat || (exports.ApiShowDataTableFormat = {})); -/** - * Used to set page size for export layout options. - */ -var PageSizeOption; -(function (PageSizeOption) { - PageSizeOption["Letter"] = "letter"; - PageSizeOption["Legal"] = "legal"; - PageSizeOption["Note"] = "note"; - PageSizeOption["Folio"] = "folio"; - PageSizeOption["Tabloid"] = "tabloid"; - PageSizeOption["Ledger"] = "ledger"; - PageSizeOption["Statement"] = "statement"; - PageSizeOption["Executive"] = "executive"; - PageSizeOption["A3"] = "a3"; - PageSizeOption["A4"] = "a4"; - PageSizeOption["A5"] = "a5"; - PageSizeOption["B4"] = "b4"; - PageSizeOption["B5"] = "b5"; - PageSizeOption["Quarto"] = "quarto"; - PageSizeOption["Unspecified"] = "unspecified"; -})(PageSizeOption = exports.PageSizeOption || (exports.PageSizeOption = {})); -/** - * Used to set the page orientation mode for export layout options. - */ -var PageOrientation; -(function (PageOrientation) { - PageOrientation["Printer"] = "printer"; - PageOrientation["Portrait"] = "portrait"; - PageOrientation["Landscape"] = "landscape"; -})(PageOrientation = exports.PageOrientation || (exports.PageOrientation = {})); -/** - * Used to set scale mode for export layout options. - */ -var ScaleMode; -(function (ScaleMode) { - ScaleMode["ScaleAuto"] = "auto"; - ScaleMode["ScalePercentage"] = "percent"; - ScaleMode["ScaleFitPages"] = "fit-pages"; -})(ScaleMode = exports.ScaleMode || (exports.ScaleMode = {})); -/** - * Used by setFitAndScaleValues to scale percent values - */ -var PageScalingOption; -(function (PageScalingOption) { - PageScalingOption["ScalePctAuto"] = "auto"; - PageScalingOption["ScalePct400"] = "pct400"; - PageScalingOption["ScalePct200"] = "pct200"; - PageScalingOption["ScalePct100"] = "pct100"; - PageScalingOption["ScalePct90"] = "pct90"; - PageScalingOption["ScalePct80"] = "pct80"; - PageScalingOption["ScalePct75"] = "pct75"; - PageScalingOption["ScalePct60"] = "pct60"; - PageScalingOption["ScalePct50"] = "pct50"; - PageScalingOption["ScalePct25"] = "pct25"; -})(PageScalingOption = exports.PageScalingOption || (exports.PageScalingOption = {})); -/** - * Used by setFitAndScaleValues to scale fit page values - */ -var FitPages; -(function (FitPages) { - FitPages["FitOneHigh"] = "fit0x1"; - FitPages["FitTwoHigh"] = "fit0x2"; - FitPages["FitOneWide"] = "fit1x0"; - FitPages["FitTwoWide"] = "fit2x0"; -})(FitPages = exports.FitPages || (exports.FitPages = {})); -/** - * Used by getVisualSpecificationAsync - */ -var EncodingType; -(function (EncodingType) { - EncodingType["Color"] = "color"; - EncodingType["Size"] = "size"; - EncodingType["Label"] = "label"; - EncodingType["Detail"] = "detail"; - EncodingType["Tooltip"] = "tooltip"; - EncodingType["Shape"] = "shape"; - EncodingType["Path"] = "path"; - EncodingType["Angle"] = "angle"; - EncodingType["Geometry"] = "geometry"; - EncodingType["Custom"] = "custom"; -})(EncodingType = exports.EncodingType || (exports.EncodingType = {})); -var PulseTimeDimension; -(function (PulseTimeDimension) { - PulseTimeDimension["Today"] = "Today"; - PulseTimeDimension["Yesterday"] = "Yesterday"; - PulseTimeDimension["WeekToDate"] = "WeekToDate"; - PulseTimeDimension["LastWeek"] = "LastWeek"; - PulseTimeDimension["MonthToDate"] = "MonthToDate"; - PulseTimeDimension["LastMonth"] = "LastMonth"; - PulseTimeDimension["QuarterToDate"] = "QuarterToDate"; - PulseTimeDimension["LastQuarter"] = "LastQuarter"; - PulseTimeDimension["YearToDate"] = "YearToDate"; - PulseTimeDimension["LastYear"] = "LastYear"; -})(PulseTimeDimension = exports.PulseTimeDimension || (exports.PulseTimeDimension = {})); -var PulseErrorMessageVisibility; -(function (PulseErrorMessageVisibility) { - PulseErrorMessageVisibility["Visible"] = "visible"; - PulseErrorMessageVisibility["Hidden"] = "hidden"; - PulseErrorMessageVisibility["Suppressed"] = "suppressed"; -})(PulseErrorMessageVisibility = exports.PulseErrorMessageVisibility || (exports.PulseErrorMessageVisibility = {})); - - -/***/ }), - -/***/ "../api-internal-contract-js/lib/src/contract/Notifications.js": -/*!*********************************************************************!*\ - !*** ../api-internal-contract-js/lib/src/contract/Notifications.js ***! - \*********************************************************************/ -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -var NotificationId; -(function (NotificationId) { - NotificationId["CustomMarkContextMenuClicked"] = "custom-mark-context-menu-clicked"; - NotificationId["ContextMenuClick"] = "context-menu-click"; - NotificationId["CustomViewRemoved"] = "custom-view-removed"; - NotificationId["CustomViewSaved"] = "custom-view-saved"; - NotificationId["CustomViewSetDefault"] = "custom-view-set-default"; - NotificationId["CustomViewsLoaded"] = "custom-views-loaded"; - NotificationId["DashboardLayoutChanged"] = "dashboard-layout-changed"; - NotificationId["EditButtonClicked"] = "edit-button-clicked"; - NotificationId["EditInDesktopButtonClicked"] = "edit-in-desktop-button-clicked"; - NotificationId["ExtensionDialogUpdate"] = "extension-dialog-update"; - NotificationId["ExtensionDialogMessage"] = "extension-dialog-message"; - NotificationId["FilterChanged"] = "filter-changed"; - NotificationId["FirstVizSizeKnown"] = "first-viz-size-known"; - NotificationId["FirstPulseMetricSizeKnown"] = "first-pulse-metric-size-known"; - NotificationId["ParameterChanged"] = "parameter-changed"; - NotificationId["PulseError"] = "pulse-error"; - NotificationId["PulseFiltersChanged"] = "pulse-filters-changed"; - NotificationId["PulseMetricSizeChanged"] = "pulse-metric-size-changed"; - NotificationId["PulseInsightDiscovered"] = "pulse-insight-discovered"; - NotificationId["PulseInteractive"] = "pulse-interactive"; - NotificationId["PulseTimeDimensionChanged"] = "pulse-time-dimension-changed"; - NotificationId["PulseUrlChanged"] = "pulse-url-changed"; - NotificationId["SelectedMarksChanged"] = "selected-marks-changed"; - NotificationId["SettingsChanged"] = "settings-changed"; - NotificationId["SummaryDataChanged"] = "summary-data-changed"; - NotificationId["TestConversionNotification"] = "test-conversion-notification"; - NotificationId["ToolbarStateChanged"] = "toolbar-state-changed"; - NotificationId["VizInteractive"] = "viz-interactive"; - NotificationId["AskDataInteractive"] = "ask-data-interactive"; - NotificationId["WorkbookReadyToClose"] = "workbook-ready-to-close"; - NotificationId["WorkbookFormattingChanged"] = "workbook-formatting-changed"; - NotificationId["WorkbookPublished"] = "workbook-published"; - NotificationId["WorkbookPublishedAs"] = "workbook-published-as"; - NotificationId["WorksheetFormattingChanged"] = "worksheet-formatting-changed"; - NotificationId["UrlAction"] = "url-action"; - NotificationId["TabSwitched"] = "tab-switched"; - NotificationId["StoryPointSwitched"] = "story-point-switched"; - NotificationId["ReadyToReceiveAuthToken"] = "ready-to-receive-auth-token"; -})(NotificationId = exports.NotificationId || (exports.NotificationId = {})); - - -/***/ }), - -/***/ "../api-internal-contract-js/lib/src/contract/Parameters.js": -/*!******************************************************************!*\ - !*** ../api-internal-contract-js/lib/src/contract/Parameters.js ***! - \******************************************************************/ -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -// PLEASE KEEP IN ALPHABETICAL ORDER. This helps with visually finding entries, knowing where to put -// new ones, and merge conflicts. -var ParameterId; -(function (ParameterId) { - ParameterId["ActiveTablesInfo"] = "active-tables-info"; - ParameterId["AnchorDate"] = "anchor-date"; - ParameterId["AnnotateEnum"] = "annotate-enum"; - ParameterId["AnnotationList"] = "annotation-list"; - ParameterId["ApplyWorksheetFormatting"] = "apply-worksheet-formatting"; - ParameterId["CategoricalDomain"] = "categorical-domain"; - ParameterId["ClickThroughEnabled"] = "click-through-enabled"; - ParameterId["Columns"] = "columns"; - ParameterId["ColumnsToInclude"] = "columns-to-include"; - ParameterId["ColumnsToIncludeById"] = "columns-to-include-by-id"; - ParameterId["ConnectionDescriptionSummaries"] = "connection-description-summaries"; - ParameterId["CurrentSheetType"] = "current-sheet-type"; - ParameterId["CustomView"] = "custom-view"; - ParameterId["CustomViewIsDefault"] = "custom-view-is-default"; - ParameterId["CustomViewIsPublic"] = "custom-view-is-public"; - ParameterId["CustomViewLuid"] = "custom-view-luid"; - ParameterId["CustomViewName"] = "custom-view-name"; - ParameterId["CustomViews"] = "custom-views"; - ParameterId["Dashboard"] = "dashboard"; - ParameterId["DashboardFilters"] = "dashboard-filters"; - ParameterId["DashboardName"] = "dashboard"; - ParameterId["DashboardObjectPositionAndSizeUpdate"] = "dashboard-object-position-and-size-update"; - ParameterId["DashboardObjectPositionAndSizeUpdateList"] = "dashboard-object-position-and-size-update-list"; - ParameterId["DataRowIndex"] = "data-row-index"; - ParameterId["DataSchema"] = "data-schema"; - ParameterId["DataSource"] = "data-source"; - ParameterId["DataSourceDataTable"] = "data-source-data-table"; - ParameterId["DataSourceId"] = "data-source-id"; - ParameterId["DataSourceName"] = "data-source-name"; - ParameterId["DataTable"] = "data-table"; - ParameterId["DataTableReader"] = "data-table-reader"; - ParameterId["DateRangeType"] = "date-range-type"; - ParameterId["DeleteCount"] = "delete-count"; - ParameterId["DeltaTimeMs"] = "delta-time-ms"; - ParameterId["DimValSelectionModels"] = "dimensionValueSelectionModels"; - ParameterId["DomainType"] = "domain-type"; - ParameterId["EmbeddingAbstractQuery"] = "embedding-abstract-query"; - ParameterId["EmbeddingBootstrapInfo"] = "embedding-bootstrap-info"; - ParameterId["EncodingType"] = "encoding-type"; - ParameterId["ExportCrosstabSheetMap"] = "export-crosstab-sheet-map"; - ParameterId["ExportFile"] = "export-file"; - ParameterId["ExportOriginUrl"] = "export-origin-url"; - ParameterId["ExportPdfOptions"] = "export-pdf-options"; - ParameterId["ExtensionBootstrapInfo"] = "extension-bootstrap-info"; - ParameterId["ExtensionContextMenuIds"] = "extension-context-menu-ids"; - ParameterId["ExtensionDialogH"] = "extension-dialog-height"; - ParameterId["ExtensionDialogMessage"] = "extension-dialog-message"; - ParameterId["ExtensionDialogPayload"] = "extension-dialog-payload"; - ParameterId["ExtensionDialogResult"] = "extension-dialog-result"; - ParameterId["ExtensionDialogStyle"] = "extension-dialog-style"; - ParameterId["ExtensionDialogUrl"] = "extension-dialog-url"; - ParameterId["ExtensionDialogW"] = "extension-dialog-width"; - ParameterId["ExtensionLocator"] = "extension-locator"; - ParameterId["ExtensionSettingsInfo"] = "extension-settings-info"; - ParameterId["ExtensionZoneId"] = "extension-zone-id"; - ParameterId["ExternalMenuDescription"] = "external-menu-description"; - ParameterId["ExternalMenuHeader"] = "external-menu-header"; - ParameterId["ExternalMenuItemDisplayName"] = "external-menu-item-display-name"; - ParameterId["ExternalMenuItemId"] = "external-menu-item-id"; - ParameterId["Field"] = "field"; - ParameterId["FieldCount"] = "field-count"; - ParameterId["FieldId"] = "field-id"; - ParameterId["FieldName"] = "field-name"; - ParameterId["FilterLevels"] = "filter-levels"; - ParameterId["FilterRangeMax"] = "filter-range-max"; - ParameterId["FilterRangeMin"] = "filter-range-min"; - ParameterId["FilterRangeNullOption"] = "filter-range-null-option"; - ParameterId["FilterUpdateType"] = "filter-update-type"; - ParameterId["FilterValues"] = "filter-values"; - ParameterId["FontNameListItems"] = "font-name-list-items"; - ParameterId["FormattedText"] = "formatted-text"; - ParameterId["FunctionName"] = "function-name"; - ParameterId["FromIndex"] = "from-index"; - ParameterId["HierValSelectionModels"] = "hierarchicalValueSelectionModels"; - ParameterId["HighlightedData"] = "highlighted-data"; - ParameterId["HoverTupleInteraction"] = "hover-tuple-interaction"; - ParameterId["IgnoreAliases"] = "ignore-aliases"; - ParameterId["IgnoreSelection"] = "ignore-selection"; - ParameterId["IncludeAllColumns"] = "include-all-columns"; - ParameterId["InvalidAggFieldName"] = "invalid-agg-field-name"; - ParameterId["InvalidDates"] = "invalid-dates"; - ParameterId["InvalidFieldCaption"] = "invalid-field-caption"; - ParameterId["InvalidFields"] = "invalid-fields"; - ParameterId["InvalidValues"] = "invalid-values"; - ParameterId["IsAnalyticsAssistantAvailable"] = "is-analytics-assistant-available"; - ParameterId["IsExcludeMode"] = "is-exclude"; - ParameterId["IsExtensionDialog"] = "is-extension-dialog"; - ParameterId["IsFromCalcDialog"] = "is-from-calc-dialog"; - ParameterId["JoinDescription"] = "join-description"; - ParameterId["LogicalTableId"] = "logical-table-id"; - ParameterId["LogicalTableInfoList"] = "logical-table-info-list"; - ParameterId["MarksCardIndex"] = "marks-card-index"; - ParameterId["MaxHeight"] = "max-height"; - ParameterId["MaxRows"] = "max-rows"; - ParameterId["MaxWidth"] = "max-width"; - ParameterId["MinHeight"] = "min-height"; - ParameterId["MinWidth"] = "min-width"; - ParameterId["PageRowCount"] = "page-row-count"; - ParameterId["ParameterCaption"] = "paremeter-caption"; - ParameterId["ParameterError"] = "parameter-error"; - ParameterId["ParameterFieldName"] = "parameter-field-name"; - ParameterId["ParameterInfo"] = "parameter-info"; - ParameterId["ParameterInfos"] = "parameter-infos"; - ParameterId["ParameterValue"] = "parameter-value"; - ParameterId["PeriodType"] = "period-type"; - ParameterId["PulseFieldName"] = "fieldName"; - ParameterId["PulseFieldNames"] = "fieldNames"; - ParameterId["PulseFilterDomainType"] = "domainType"; - ParameterId["PulseFilterDomainSearchTerm"] = "searchTerm"; - ParameterId["PulsePageSize"] = "pageSize"; - ParameterId["PulseNextPageToken"] = "nextPageToken"; - ParameterId["PulseFilters"] = "filters"; - ParameterId["PulseTimeDimension"] = "timeDimension"; - ParameterId["QuantitativeDomain"] = "quantitative-dmain"; - ParameterId["QuantRangeSelectionModels"] = "quantativeRangeSelectionModels"; - ParameterId["RangeN"] = "range-n"; - ParameterId["ReplaySpeed"] = "replay-speed"; - ParameterId["SelectedData"] = "selected-data"; - ParameterId["SelectedSheetNames"] = "selected-sheet-names"; - ParameterId["Selection"] = "selection"; - ParameterId["SelectionList"] = "selection-list"; - ParameterId["SelectionUpdateType"] = "selectionUpdateType"; - ParameterId["SelectTuplesInteraction"] = "select-tuples-interaction"; - ParameterId["SendNotifications"] = "send-notifications"; - ParameterId["SettingsValues"] = "settings-values"; - ParameterId["SharedFilterSheets"] = "shared-filter-sheets"; - ParameterId["SharedFiltersInfo"] = "shared-filters-info"; - ParameterId["SheetIdentifier"] = "sheet-identifier"; - ParameterId["SheetName"] = "sheet-name"; - ParameterId["SheetPath"] = "sheet-path"; - ParameterId["ShouldRefreshDS"] = "should-refresh-ds"; - ParameterId["ShowDataTableFormat"] = "show-data-table-format"; - ParameterId["StartIndex"] = "start-index"; - ParameterId["State"] = "state"; - ParameterId["StoryPointIndex"] = "story-point-index"; - ParameterId["StoryPointInfo"] = "story-point-info"; - ParameterId["SwitchToSheetName"] = "switch-to-sheet-name"; - ParameterId["TargetPoint"] = "target-point"; - ParameterId["TestConversionParameter"] = "test-conversion-parameter"; - ParameterId["Text"] = "formatted-text"; - ParameterId["ToIndex"] = "to-index"; - ParameterId["TooltipContext"] = "tooltip-context"; - ParameterId["TooltipTextRequest"] = "tooltip-text-request"; - ParameterId["TooltipText"] = "tooltip-text"; - ParameterId["UnderlyingDataTable"] = "underlying-data-table"; - ParameterId["UnderlyingSummaryDataTable"] = "underlying-summary-data-table"; - ParameterId["Url"] = "url"; - ParameterId["UseTabDelimiters"] = "use-tab-delimiters"; - ParameterId["ViewDataTableCacheId"] = "view-data-table-cache-id"; - ParameterId["ViewDataTableId"] = "view-data-table-id"; - ParameterId["VisualId"] = "visual-id"; - ParameterId["VisualSpecification"] = "visual-specification"; - ParameterId["VizAPIInputJson"] = "vizapi-input-json"; - ParameterId["VizAPIStateWithDataModel"] = "vizapi-state-with-data-model"; - ParameterId["VizAPIStateWarningMsg"] = "vizapi-state-warning-msg"; - ParameterId["VizAPISVG"] = "vizapi-svg"; - ParameterId["WorksheetName"] = "worksheet-name"; - ParameterId["WorksheetFilters"] = "worksheet-filters"; - ParameterId["ZoneIdsVisibilityMap"] = "zone-ids-visibility-map"; -})(ParameterId = exports.ParameterId || (exports.ParameterId = {})); - - -/***/ }), - -/***/ "../api-internal-contract-js/lib/src/contract/Verbs.js": -/*!*************************************************************!*\ - !*** ../api-internal-contract-js/lib/src/contract/Verbs.js ***! - \*************************************************************/ -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -// Declare this key type and export the NotificationId to make this behave like a string enum. -// -// PLEASE KEEP IN ALPHABETICAL ORDER. This helps with visually finding entries, knowing where to put -// new ones, and merge conflicts. -var VerbId; -(function (VerbId) { - VerbId["ActivateNextStoryPoint"] = "activate-next-story-point"; - VerbId["ActivatePreviousStoryPoint"] = "activate-previous-story-point"; - VerbId["ActivateSheet"] = "activateSheet"; - VerbId["ActivateStoryPoint"] = "activate-story-point"; - VerbId["AddMarksCardFields"] = "add-marks-card-fields"; - VerbId["AppendExternalMenuItem"] = "append-external-menu-item"; - VerbId["ApplyCategoricalFilter"] = "categorical-filter"; - VerbId["ApplyPulseFilters"] = "apply-pulse-filters"; - VerbId["ApplyPulseTimeDimension"] = "apply-pulse-time-dimension"; - VerbId["ApplyRangeFilter"] = "range-filter"; - VerbId["ApplyRelativeDateFilter"] = "apply-relative-date-Filter"; - VerbId["Authenticate"] = "authenticate"; - VerbId["BlockExtension"] = "block-extension"; - VerbId["ChangeParameterValue"] = "change-parameter-value"; - VerbId["ChangeSharedFilter"] = "change-shared-filter"; - VerbId["ClearAllPulseFilters"] = "clear-all-pulse-filters"; - VerbId["ClearFilter"] = "clear-filter"; - VerbId["ClearPulseFilters"] = "clear-pulse-filters"; - VerbId["ClearSelectedMarks"] = "clear-selected-marks"; - VerbId["CloseDialog"] = "close-dialog"; - VerbId["CreateAnnotation"] = "create-annotation"; - VerbId["DashboardCategoricalFilter"] = "dashboard-categorical-filter"; - VerbId["DisplayDialog"] = "display-dialog"; - VerbId["DownloadWorkbook"] = "download-workbook"; - VerbId["EditAliasesDialog"] = "edit-aliases-dialog"; - VerbId["ExecuteExternalMenuItem"] = "execute-external-menu-item"; - VerbId["ExportCrosstab"] = "export-crosstab"; - VerbId["ExportCrosstabCsvDownload"] = "export-crosstab-csv-download"; - VerbId["ExportCrosstabExcelDownload"] = "export-crosstab-excel-download"; - VerbId["ExportData"] = "export-data"; - VerbId["ExportDataDownload"] = "export-data-download"; - VerbId["ExportImage"] = "export-image"; - VerbId["ExportPdf"] = "export-pdf"; - VerbId["ExportPdfDownload"] = "export-pdf-download"; - VerbId["ExportPowerpoint"] = "export-powerpoint"; - VerbId["ExportPowerpointDownload"] = "export-powerpoint-download"; - VerbId["FindParameter"] = "find-parameter"; - VerbId["GetActiveTables"] = "get-active-tables"; - VerbId["GetAllDataSources"] = "get-all-data-sources"; - VerbId["GetAnnotations"] = "get-annotations"; - VerbId["GetCategoricalDomain"] = "get-categorical-domain"; - VerbId["GetConnectionDescriptionSummaries"] = "get-connection-description-summaries"; - VerbId["GetCurrentSrc"] = "get-current-src"; - VerbId["GetCustomViews"] = "get-custom-views"; - VerbId["GetDashboardFilters"] = "get-dashboard-filters"; - VerbId["GetDataSource"] = "get-datasource"; - VerbId["GetDataSourceData"] = "get-datasource-data"; - VerbId["GetDataSources"] = "get-data-sources"; - VerbId["GetDataSummaryData"] = "get-summary-data"; - VerbId["GetDataSummaryDataReader"] = "get-summary-data-reader"; - VerbId["GetDataTableReaderPage"] = "get-data-table-reader-page"; - VerbId["GetEmbeddingAbstractQueryWithDataModel"] = "get-embedding-abstract-query-with-data-model"; - VerbId["GetEmbeddingClientInfo"] = "get-embedding-client-info"; - VerbId["GetVizStateWithDataModel"] = "get-viz-state-with-data-model"; - VerbId["GetExportCrosstabSheetMap"] = "get-export-crosstab-sheet-map"; - VerbId["GetExportPdfOptions"] = "get-export-pdf-options"; - VerbId["GetField"] = "get-field"; - VerbId["GetFieldAndDataSource"] = "get-field-and-datasource"; - VerbId["GetVisualSpecification"] = "get-visual-specification"; - VerbId["GetFilters"] = "get-filters"; - VerbId["GetFonts"] = "get-fonts"; - VerbId["GetHighlightedMarks"] = "get-highlighted-marks"; - VerbId["GetJoinDescription"] = "get-join-description"; - VerbId["GetLogicalTableData"] = "get-logical-table-data"; - VerbId["GetLogicalTableDataReader"] = "get-logical-table-data-reader"; - VerbId["GetLogicalTables"] = "get-logical-tables"; - VerbId["GetParametersForSheet"] = "get-parameters-for-sheet"; - VerbId["GetPulseCategoricalDomain"] = "get-pulse-categorical-domain"; - VerbId["GetPulseFilters"] = "get-pulse-filters"; - VerbId["GetPulseTimeDimension"] = "get-pulse-time-dimension"; - VerbId["GetRangeDomain"] = "get-range-domain"; - VerbId["GetSelectedMarks"] = "get-selected-marks"; - VerbId["GetSharedFilter"] = "get-shared-filter"; - VerbId["GetTooltipText"] = "get-tooltip-text"; - VerbId["GetUnderlyingData"] = "get-underlying-data"; - VerbId["GetUnderlyingTableData"] = "get-underlying-table-data"; - VerbId["GetUnderlyingTableDataReader"] = "get-underlying-table-data-reader"; - VerbId["GetUnderlyingTables"] = "get-underlying-tables"; - VerbId["HierarchicalFilter"] = "hierachical-filter"; - VerbId["InitializeExtension"] = "initialize-extension"; - VerbId["IsAnalyticsAssistantAvailable"] = "is-analytics-assistant-available"; - VerbId["LaunchAnalyticsAssistant"] = "launch-analytics-assistant"; - VerbId["MoveAndResizeZones"] = "move-and-resize-zones"; - VerbId["MoveMarksCardField"] = "move-marks-card-field"; - VerbId["RaiseLeaveMarkNavNotification"] = "raise-leave-mark-nav-notification"; - VerbId["RaiseHoverTupleNotification"] = "raise-hover-tuple-notification"; - VerbId["RaiseSelectTuplesNotification"] = "raise-select-tuples-notification"; - VerbId["Redo"] = "redo"; - VerbId["RefreshDataSource"] = "refresh-data-source"; - VerbId["ReleaseDataTableReader"] = "release-data-table-reader"; - VerbId["RemoveAnnotation"] = "remove-annotation"; - VerbId["RemoveCustomView"] = "remove-custom-view"; - VerbId["RemoveExternalMenuItem"] = "remove-external-menu-item"; - VerbId["RenameExternalMenu"] = "rename-external-menu"; - VerbId["ReplayAnimation"] = "replay-animation"; - VerbId["RevertStoryPoint"] = "revert-story-point"; - VerbId["RevertWorkbook"] = "revert-workbook"; - VerbId["SaveExtensionSettings"] = "save-extension-settings"; - VerbId["SaveWorkbookAsCustomView"] = "save-workbook-as-custom-view"; - VerbId["SelectByValue"] = "select-by-value"; - VerbId["SetActiveCustomViewAsDefault"] = "set-active-custom-view-as-default"; - VerbId["SetAutoUpdate"] = "set-auto-update"; - VerbId["SetClickThrough"] = "set-click-through"; - VerbId["SendDialogMessage"] = "send-dialog-message"; - VerbId["SetVizStateWithDataModel"] = "set-viz-state-with-data-model"; - VerbId["SetSheetSize"] = "set-sheet-size"; - VerbId["SetZoneVisibility"] = "set-zone-visibility"; - VerbId["Share"] = "share"; - VerbId["ShowCustomView"] = "show-custom-view"; - VerbId["SpliceMarksCardFields"] = "splice-marks-card-fields"; - VerbId["TestConversionVerb"] = "test-conversion-verb"; - VerbId["Undo"] = "undo"; - VerbId["UpdateCustomView"] = "update-custom-view"; - VerbId["VizAPI"] = "viz-api"; -})(VerbId = exports.VerbId || (exports.VerbId = {})); - - -/***/ }), - -/***/ "../api-internal-contract-js/lib/src/interface/AskDataInterface.js": -/*!*************************************************************************!*\ - !*** ../api-internal-contract-js/lib/src/interface/AskDataInterface.js ***! - \*************************************************************************/ -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -var AskDataOptionNames; -(function (AskDataOptionNames) { - AskDataOptionNames["token"] = "token"; - AskDataOptionNames["origin"] = "origin"; - AskDataOptionNames["showEmbed"] = "showEmbed"; - AskDataOptionNames["showPin"] = "showPin"; - AskDataOptionNames["showSave"] = "showSave"; - AskDataOptionNames["showShare"] = "showShare"; - AskDataOptionNames["debug"] = ":jsdebug"; - AskDataOptionNames["ApiID"] = ":apiID"; - AskDataOptionNames["ApiExternalVersion"] = ":apiExternalVersion"; - AskDataOptionNames["ApiInternalVersion"] = ":apiInternalVersion"; - AskDataOptionNames["AskDataWebComponent"] = ":askDataWebComponent"; -})(AskDataOptionNames = exports.AskDataOptionNames || (exports.AskDataOptionNames = {})); - - -/***/ }), - -/***/ "../api-internal-contract-js/lib/src/interface/PulseInterface.js": -/*!***********************************************************************!*\ - !*** ../api-internal-contract-js/lib/src/interface/PulseInterface.js ***! - \***********************************************************************/ -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -var PulseOptionNames; -(function (PulseOptionNames) { - PulseOptionNames["embed"] = "embed"; - PulseOptionNames["token"] = "token"; - PulseOptionNames["disableExploreFilter"] = "disableExploreFilter"; - PulseOptionNames["layout"] = "embed_layout"; - PulseOptionNames["theme"] = "embed_theme"; - PulseOptionNames["ApiExternalVersion"] = ":apiExternalVersion"; - PulseOptionNames["ApiInternalVersion"] = ":apiInternalVersion"; - PulseOptionNames["PulseWebComponent"] = ":pulseWebComponent"; -})(PulseOptionNames = exports.PulseOptionNames || (exports.PulseOptionNames = {})); - - -/***/ }), - -/***/ "../api-internal-contract-js/lib/src/interface/VqlInterface.js": -/*!*********************************************************************!*\ - !*** ../api-internal-contract-js/lib/src/interface/VqlInterface.js ***! - \*********************************************************************/ -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -/** - * These strings were *manually copied* from the server, - * workgroup/src/silos/tableau-server/libraries/tab-controller-vizql/src/com/tableausoftware/ - * controller/vizql/constants/ParameterKeys.java#L9 - * should be exported instead - * parameters that vizql will accept in an embedding URL - **/ -var VqlParameterNames; -(function (VqlParameterNames) { - VqlParameterNames["ONE"] = "1"; - VqlParameterNames["ALERTS"] = ":alerts"; - VqlParameterNames["ALIAS"] = "alias"; - VqlParameterNames["ALLOW_DEFERRED_BOOTSTRAP"] = ":allowDeferredBootstrap"; - VqlParameterNames["ALLOW_AUTOGEN_WORKSHEET_PHONE_LAYOUTS"] = "allowAutogenWorksheetPhoneLayouts"; - VqlParameterNames["API_ID"] = ":apiID"; - VqlParameterNames["APP"] = ":app"; - VqlParameterNames["ATTACHMENT"] = "attachment"; - VqlParameterNames["IS_IPAD_APP"] = "app"; - VqlParameterNames["ANIMATE_TRANSITION"] = ":animate_transition"; - VqlParameterNames["ASCENDING"] = "ascending"; - VqlParameterNames["AUTHENTICATION"] = "authentication"; - VqlParameterNames["ATTRIBUTES"] = "attributes"; - VqlParameterNames["AUTHORING_SHEET"] = ":authSheet"; - VqlParameterNames["AXIS"] = "axis"; - VqlParameterNames["BOOTSTRAP_WHEN_NOTIFIED"] = ":bootstrapWhenNotified"; - VqlParameterNames["BROWSER_BACK_BUTTON_UNDO"] = ":browserBackButtonUndo"; - VqlParameterNames["BROWSER_RENDERING_ON"] = "isBrowserRendering"; - VqlParameterNames["BROWSER_RENDERING_THRESHOLD"] = "browserRenderingThreshold"; - VqlParameterNames["CHARSET"] = "charset"; - VqlParameterNames["CLIENT_DIMENSION"] = "clientDimension"; - VqlParameterNames["CLIENT_IP"] = "client_ip"; - VqlParameterNames["CLIENT_NUM"] = "clientNum"; - VqlParameterNames["COLON_EMBEDDED"] = ":embedded"; - VqlParameterNames["COLON_MOBILE"] = ":mobile"; - VqlParameterNames["COLON_DEEP_LINKING_DISABLED"] = ":deepLinkingDisabled"; - VqlParameterNames["COLON_WATERMARK"] = ":watermark"; - VqlParameterNames["COMMENTS"] = ":comments"; - VqlParameterNames["COMMENTING_ENABLED"] = ":commentingEnabled"; - VqlParameterNames["COMMENTING_MENTIONS_ENABLED"] = ":commentingMentions"; - VqlParameterNames["CONNECTION"] = "connection"; - VqlParameterNames["CREATED_BY_FEATURE"] = "createdByFeature"; - VqlParameterNames["CRYPTED_PASSWORD"] = "crypted"; - VqlParameterNames["CSSDEBUG"] = ":cssdebug"; - VqlParameterNames["CSV"] = "csv"; - VqlParameterNames["CUSTOM_VIEWS"] = ":customViews"; - VqlParameterNames["CV"] = ":cv"; - VqlParameterNames["CV_ID"] = "cvId"; - VqlParameterNames["DASHBOARD_PORT_SIZE"] = "dashboardPortSize"; - VqlParameterNames["DATA_DETAILS"] = ":dataDetails"; - VqlParameterNames["DATASOURCE"] = "datasource"; - VqlParameterNames["DEBUG"] = ":debug"; - VqlParameterNames["DELAY"] = ":delay"; - VqlParameterNames["DEPTH"] = "depth"; - VqlParameterNames["DEVICE_TYPE"] = ":device"; - VqlParameterNames["DEVICE_PIXEL_RATIO"] = "devicePixelRatio"; - VqlParameterNames["DEVICE_PREVIEW_MODE"] = ":devicepreviewmode"; - VqlParameterNames["DIMENSIONS"] = ":dimensions"; - VqlParameterNames["DISABLE_SHARED_SESSIONS"] = ":disable_shared_sessions"; - VqlParameterNames["DISABLE_URL_ACTIONS_POPUPS"] = ":disableUrlActionsPopups"; - VqlParameterNames["DIRECTION"] = "direction"; - VqlParameterNames["DISPLAY_OVERLAY"] = ":display_overlay"; - VqlParameterNames["DISPLAY_SHARE"] = ":display_share"; - VqlParameterNames["DISPLAY_SPINNER"] = ":display_spinner"; - VqlParameterNames["DISPLAY_STATIC_IMAGE"] = ":display_static_image"; - VqlParameterNames["DISPLAY_TABS"] = "display_tabs"; - VqlParameterNames["DISPLAY_VIEW_COUNT"] = ":display_count"; - VqlParameterNames["IGNORE_STICKY_SESSION"] = ":ignore_sticky_session"; - VqlParameterNames["INCREMENT_VIEW_COUNT"] = ":increment_view_count"; - VqlParameterNames["DOCMODE"] = "docmode"; - VqlParameterNames["DOMAIN"] = "domain"; - VqlParameterNames["DO_WORK"] = "do_work"; - VqlParameterNames["DX"] = "dx"; - VqlParameterNames["DY"] = "dy"; - VqlParameterNames["EDIT_DATA_ALERT"] = ":editDataAlert"; - VqlParameterNames["EMBED"] = ":embed"; - VqlParameterNames["EMBEDDED"] = "embedded"; - VqlParameterNames["ENCRYPTED"] = "encrypted"; - VqlParameterNames["API_EXTERNAL_VERSION"] = ":apiExternalVersion"; - VqlParameterNames["API_INTERNAL_VERSION"] = ":apiInternalVersion"; - VqlParameterNames["EXCLUDE"] = "exclude"; - VqlParameterNames["EXPORT_FORMAT"] = ":export_format"; - VqlParameterNames["FIELDNAME"] = "fieldname"; - VqlParameterNames["FIELD_NAME"] = "field_name"; - VqlParameterNames["FIELD_SEP"] = "field_sep"; - VqlParameterNames["FILE"] = "file"; - VqlParameterNames["FILTER_TILE_SIZE"] = "filterTileSize"; - VqlParameterNames["FN"] = "fn"; - VqlParameterNames["FOCUS"] = "focus"; - VqlParameterNames["FORCE_CACHE"] = "force_cache"; - VqlParameterNames["FORMAT"] = "format"; - VqlParameterNames["FORMAT_DATA_VALUE_LOCALLY"] = "formatDataValueLocally"; - VqlParameterNames["FROM_WG"] = ":from_wg"; - VqlParameterNames["GRAPHQL_DATABASE_ID"] = ":graphQLDatabaseId"; - VqlParameterNames["GRAPHQL_TABLE_ID"] = ":graphQLTableId"; - VqlParameterNames["GUID"] = ":guid"; - VqlParameterNames["H"] = "h"; - VqlParameterNames["HIDDEN"] = "hidden"; - VqlParameterNames["HIDE_CLOSE_BUTTON"] = ":hideCloseButton"; - VqlParameterNames["HIDE_EDIT_BUTTON"] = ":hideEditButton"; - VqlParameterNames["HIDE_EDIT_IN_DESKTOP_BUTTON"] = ":hideEditInDesktopButton"; - VqlParameterNames["HIGH_DPI"] = ":highdpi"; - VqlParameterNames["IMAGE_SIZE_LIMIT"] = "imageSizeLimit"; - VqlParameterNames["TRANSPARENT_LINE_MARKS_LIMIT"] = "transparentLineMarkLimit"; - VqlParameterNames["CLIENT_RENDER_PIXEL_LIMIT"] = "clientRenderPixelLimit"; - VqlParameterNames["IN"] = "in"; - VqlParameterNames["INSTANCE_ID"] = ":iid"; - VqlParameterNames["IS_GUEST_REDIRECT_FROM_VIZPORTAL"] = ":isGuestRedirectFromVizportal"; - VqlParameterNames["IS_MARK_ANIMATION_ENABLED"] = "isMarkAnimationEnabled"; - VqlParameterNames["IS_VIZPORTAL"] = ":isVizPortal"; - VqlParameterNames["INPUT_"] = "input_string"; - VqlParameterNames["JSDEBUG"] = ":jsdebug"; - VqlParameterNames["JSON"] = "json"; - VqlParameterNames["JSON_ONLY"] = ":jsonOnly"; - VqlParameterNames["KEEPFILE"] = "keepfile"; - VqlParameterNames["KEY"] = "key"; - VqlParameterNames["LANGUAGE"] = "language"; - VqlParameterNames["LANGUAGE_REQUESTED"] = ":language"; - VqlParameterNames["LINKTARGET"] = ":linktarget"; - VqlParameterNames["LOAD_ORDER_ID"] = ":loadOrderID"; - VqlParameterNames["LOAD_NEWEST_REVISION"] = ":loadNewestRevision"; - VqlParameterNames["LOCAL_PATHS"] = ":localPaths"; - VqlParameterNames["LOCALE"] = "locale"; - VqlParameterNames["LOCATION_ID"] = "locationid"; - VqlParameterNames["LOCATION_TYPE"] = "locationtype"; - VqlParameterNames["WORKBOOK_LOCALE"] = "workbookLocale"; - VqlParameterNames["MAXROWS"] = "maxrows"; - VqlParameterNames["MAX_AGE"] = "maxAge"; - VqlParameterNames["MAX_ROWS"] = "maxRows"; - VqlParameterNames["METHOD"] = "method"; - VqlParameterNames["MOBILE"] = "mobile"; - VqlParameterNames["MODIFIER"] = "modifier"; - VqlParameterNames["NAME"] = "name"; - VqlParameterNames["NAV_TYPE"] = "navType"; - VqlParameterNames["NAV_SRC"] = "navSrc"; - VqlParameterNames["NOATTACHMENT"] = "no-attachment"; - VqlParameterNames["NO_OVERWRITE"] = "no_overwrite"; - VqlParameterNames["OPEN_AUTHORING_IN_TOP_WINDOW"] = ":openAuthoringInTopWindow"; - VqlParameterNames["OPENID_HD"] = ":openid_hd"; - VqlParameterNames["OPENID_LOGIN_HINT"] = ":openid_login_hint"; - VqlParameterNames["OAUTHREQUEST"] = "oauthrequest"; - VqlParameterNames["OAUTH_CREDENTIAL_IDS"] = "oauth_credential_ids"; - VqlParameterNames["OFFLINE_MODE"] = ":offlinemode"; - VqlParameterNames["ORIGIN"] = ":origin"; - VqlParameterNames["OVERLAY"] = ":overlay"; - VqlParameterNames["P"] = "p"; - VqlParameterNames["PATH"] = "path"; - VqlParameterNames["PANE_RESOLVER_X"] = "paneResolverX"; - VqlParameterNames["PANE_RESOLVER_Y"] = "paneResolverY"; - VqlParameterNames["PARAM"] = "param"; - VqlParameterNames["PARENT_ID"] = "parent_id"; - VqlParameterNames["PASSWORD"] = "password"; - VqlParameterNames["PATTERN"] = "pattern"; - VqlParameterNames["PIXEL_RATIO"] = ":pixelratio"; - VqlParameterNames["PREFIX"] = ":prefix"; - VqlParameterNames["PREVIEW"] = ":preview"; - VqlParameterNames["PRIMARY_CONTENT_URL"] = "primary_content_url"; - VqlParameterNames["PROJECT"] = "project"; - VqlParameterNames["PROTOCOL"] = "protocol"; - VqlParameterNames["PSEUDO"] = ":pseudo"; - VqlParameterNames["QUERY"] = "query"; - VqlParameterNames["R"] = "r"; - VqlParameterNames["RANGE_TYPE"] = "range_type"; - VqlParameterNames["RECORD_SEP"] = "record_sep"; - VqlParameterNames["RECORD_CLIENT_PERFORMANCE"] = ":record_client_performance"; - VqlParameterNames["RECORD_PERFORMANCE"] = ":record_performance"; - VqlParameterNames["RECOVER_OLD_SESSION_ID"] = ":recover_old_session_id"; - VqlParameterNames["RECOVER_SESSION_STATE_TICKETS"] = ":recover_session_state_tickets"; - VqlParameterNames["REFRESH"] = ":refresh"; - VqlParameterNames["REFRESHUNMODIFIED"] = ":refreshunmodified"; - VqlParameterNames["REGION"] = "region"; - VqlParameterNames["RELOAD_ON_CUSTOM_VIEW_SAVE"] = ":reloadOnCustomViewSave"; - VqlParameterNames["RENDER"] = ":render"; - VqlParameterNames["RENDER_MAPS_CLIENT_SIDE"] = "renderMapsClientSide"; - VqlParameterNames["RETRY"] = ":retry"; - VqlParameterNames["REUSE"] = "reuse"; - VqlParameterNames["REUSE_FOREVER"] = "reuse_forever"; - VqlParameterNames["REVERT"] = ":revert"; - VqlParameterNames["SAVE_DB_PASSWORDS"] = "save_db_passwords"; - VqlParameterNames["SELECT_X"] = "select_x"; - VqlParameterNames["SELECT_Y"] = "select_y"; - VqlParameterNames["SESSION_FEATURE_PREFIX"] = ":ff_"; - VqlParameterNames["SESSION_FLAGS"] = ":session_feature_flags"; - VqlParameterNames["SHARE_BUTTON"] = "share_button"; - VqlParameterNames["SHEET_ID"] = "sheet_id"; - VqlParameterNames["SHARED"] = "shared"; - VqlParameterNames["SHOWALL"] = "showall"; - VqlParameterNames["SHOW_APP_BANNER"] = ":showAppBanner"; - VqlParameterNames["SHOW_ASK_DATA"] = ":showAskData"; - VqlParameterNames["SHOW_PARAMS"] = "showParams"; - VqlParameterNames["SHOW_SHARE_OPTIONS"] = ":showShareOptions"; - VqlParameterNames["SIZE"] = ":size"; - VqlParameterNames["SOURCE"] = "source"; - VqlParameterNames["STATE"] = "state"; - VqlParameterNames["STICKY_SESSION_KEY"] = "stickySessionKey"; - VqlParameterNames["SUBSCRIPTIONS"] = ":subscriptions"; - VqlParameterNames["SUMMARY"] = "summary"; - VqlParameterNames["SUPPRESS_DEFAULT_EDIT_BEHAVIOR"] = ":suppressDefaultEditBehavior"; - VqlParameterNames["SYNC_SESSION"] = ":sync_session"; - VqlParameterNames["SYNC_SESSION_STATE"] = "sync_session_state"; - VqlParameterNames["TABS"] = ":tabs"; - VqlParameterNames["TARGET"] = "target"; - VqlParameterNames["TARGET_SITE"] = "target_site"; - VqlParameterNames["TOOLBAR"] = ":toolbar"; - VqlParameterNames["TOOLTIP"] = ":tooltip"; - VqlParameterNames["TS"] = "ts"; - VqlParameterNames["UNDERLYING_TABLE_ID"] = "underlying_table_id"; - VqlParameterNames["UNDERLYING_TABLE_CAPTION"] = "underlying_table_caption"; - VqlParameterNames["UPDATE_TYPE"] = "update_type"; - VqlParameterNames["USE_GUEST"] = ":useGuest"; - VqlParameterNames["USE_INLINE_IMAGES"] = "use_inline_images"; - VqlParameterNames["USERAGENT"] = "useragent"; - VqlParameterNames["USERNAME"] = "username"; - VqlParameterNames["VALUE"] = "value"; - VqlParameterNames["VERBOSE_MODE"] = "verboseMode"; - VqlParameterNames["VIEW_ID"] = "views_id"; - VqlParameterNames["VIZ_SNAPSHOT_ID"] = "viz_snapshot_id"; - VqlParameterNames["VW"] = ":vw"; - VqlParameterNames["W"] = "w"; - VqlParameterNames["WORKSHEET_PORT_SIZE"] = "worksheetPortSize"; - VqlParameterNames["WATERMARK"] = "watermark"; - VqlParameterNames["WATERMARK_MARGIN"] = ":watermark_margin"; - VqlParameterNames["WB"] = ":wb"; - VqlParameterNames["WHICH"] = "which"; - VqlParameterNames["X"] = "x"; - VqlParameterNames["Y"] = "y"; - VqlParameterNames["ZID"] = "zid"; - VqlParameterNames["ZONE_ID"] = "zone_id"; - VqlParameterNames["KEYCHAIN_VERSION"] = "keychain_version"; - VqlParameterNames["DATASOURCE_ID"] = "datasource_id"; - VqlParameterNames["DATASOURCE_NAME"] = "datasource_name"; - VqlParameterNames["LENS_ID"] = "lens_id"; - VqlParameterNames["WIDTH"] = "width"; - VqlParameterNames["HEIGHT"] = "height"; - // Default Layout params - VqlParameterNames["LAYOUT_VIEWS"] = "views"; - VqlParameterNames["LAYOUT_MENUS"] = "menus"; - VqlParameterNames["LAYOUT_GEOMETRY"] = "geometry"; - VqlParameterNames["LAYOUT_PAGES"] = "pages"; - VqlParameterNames["LAYOUT_CACHEURL"] = "cacheurl"; - VqlParameterNames["LAYOUT_SHEET"] = "sheet"; - VqlParameterNames["LAYOUT_DEPTH"] = "depth"; -})(VqlParameterNames || (VqlParameterNames = {})); -/** - * parameters that are only relevant when working with Tableau Public - * maybe not really necessry to split them out - */ -var PublicParameterNames; -(function (PublicParameterNames) { - PublicParameterNames["SHOW_VIZ_HOME"] = ":showVizHome"; - // display view count -})(PublicParameterNames || (PublicParameterNames = {})); -/** - * Map the parameter names as used in the url to what we call them publicly in the embedding library. - * The only parameters listed here should be the ones that get sent to vizql - * - this should match the interface at external-contract:VizInterfaces:VizSettings - */ -var VizOptionNames; -(function (VizOptionNames) { - // publicName = internalStringValue - VizOptionNames["Size"] = ":size"; - VizOptionNames["Embed"] = ":embed"; - VizOptionNames["ApiInternalVersion"] = ":apiInternalVersion"; - VizOptionNames["ApiExternalVersion"] = ":apiExternalVersion"; - VizOptionNames["ShowVizHome"] = ":showVizHome"; - VizOptionNames["Jsdebug"] = ":jsdebug"; - VizOptionNames["BootstrapWhenNotified"] = ":bootstrapWhenNotified"; - VizOptionNames["NavType"] = "navType"; - VizOptionNames["NavSrc"] = "navSrc"; - VizOptionNames["debug"] = ":jsdebug"; - VizOptionNames["ApiID"] = ":apiID"; - VizOptionNames["disableUrlActionsPopups"] = ":disableUrlActionsPopups"; - VizOptionNames["hideTabs"] = ":tabs"; - VizOptionNames["toolbar"] = ":toolbar"; - VizOptionNames["device"] = ":device"; - VizOptionNames["instanceIdToClone"] = ":iid"; - VizOptionNames["touchOptimize"] = "mobile"; - VizOptionNames["hideEditButton"] = ":hideEditButton"; - VizOptionNames["hideEditInDesktopButton"] = ":hideEditInDesktopButton"; - VizOptionNames["suppressDefaultEditBehavior"] = ":suppressDefaultEditBehavior"; - VizOptionNames["hideCloseButton"] = ":hideCloseButton"; -})(VizOptionNames = exports.VizOptionNames || (exports.VizOptionNames = {})); - - -/***/ }), - -/***/ "../api-internal-contract-js/lib/src/messaging/CrossFrameMessenger.js": -/*!****************************************************************************!*\ - !*** ../api-internal-contract-js/lib/src/messaging/CrossFrameMessenger.js ***! - \****************************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const guid = __webpack_require__(/*! guid */ "../../node_modules/guid/guid.js"); -const JsApiInternalContract_1 = __webpack_require__(/*! ../JsApiInternalContract */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -const CrossFramePreparedMessage_1 = __webpack_require__(/*! ./CrossFramePreparedMessage */ "../api-internal-contract-js/lib/src/messaging/CrossFramePreparedMessage.js"); -const MessageTypeChecks_1 = __webpack_require__(/*! ./MessageTypeChecks */ "../api-internal-contract-js/lib/src/messaging/MessageTypeChecks.js"); -const MessageTypes_1 = __webpack_require__(/*! ./interface/MessageTypes */ "../api-internal-contract-js/lib/src/messaging/interface/MessageTypes.js"); -/** - * The CrossFrameMessenger is the primary export from the api-messaging module. An instance of - * this class can be instantiated on both sides of a frame boundary to facilitate communication - * in both directions between the frames. This class implements both the dispatcher and the listener - * portions, but doesn't require callers to care about both. - */ -class CrossFrameMessenger { - /** - * Creates an instance of CrossFrameMessenger. If you would like to use the CrossFrameMessenger as a MessageListener, - * be sure to call StartListening and register message handlers. - * @param thisWindow The window object which the CrossFrameMessenger lives. An onMessage listener will be added here. - * @param [otherWindow] Optional otherWindow which messages will be posted to. - * If defined, incoming messages must originate from otherWindow to be passed on - * @param [otherWindowOrigin] The target origin which otherWindow must have in order to receive dispatched messages. - * This value will be sent as the targetOrigin of a postMessage - * (https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage) - */ - constructor(thisWindow, otherWindow, otherWindowOrigin) { - this.thisWindow = thisWindow; - this.otherWindow = otherWindow; - this.otherWindowOrigin = otherWindowOrigin; - // Make sure to call StartListening - } - ///// MessageListener Implementation - startListening() { - // Check if we already are listening, if not, hook up a message listener - if (!this.unregisterFunction) { - const boundHandler = this.onMessageReceived.bind(this); - this.thisWindow.addEventListener('message', boundHandler, true); - this.unregisterFunction = () => this.thisWindow.removeEventListener('message', boundHandler, true); - } - } - stopListening() { - // Stop listening if we have started listening - if (this.unregisterFunction) { - this.unregisterFunction(); - this.unregisterFunction = undefined; - } - } - setInitializeMessageHandler(handler) { - this.initializeMessageHandler = handler; - } - setCommandResponseMessageHandler(handler) { - this.commandResponseMessageHandler = handler; - } - setCommandMessageHandler(handler) { - this.commandMessageHandler = handler; - } - setNotificationMessageHandler(handler) { - this.notificationMessageHandler = handler; - } - setHandshakeMessageHandler(handler) { - this.handshakeMessageHandler = handler; - } - ///// MessageDispatcher Implementation - /** - * @param apiVersion api-internal-contract-js version (exported in JsApiInternalConntract) - * @param crossFrameVersion crossframe messaging version (exported in JsApiInternalConntract) - * @param options additional options that can be passed at initialization (information about the version of - * external being used for example) - */ - prepareInitializationMessage(apiVersion, crossFrameVersion, options) { - const message = { - msgGuid: guid.raw(), - msgType: MessageTypes_1.MessageType.Initialize, - crossFrameVersion: crossFrameVersion, - apiVersion: apiVersion, - options: options, - }; - return this.prepareMessage(message); - } - prepareCommandMessage(verbId, parameters) { - const message = { - msgGuid: guid.raw(), - msgType: MessageTypes_1.MessageType.Command, - verbId: verbId, - parameters: parameters, - }; - return this.prepareMessage(message); - } - prepareCommandResponseMessage(commandGuid, data, error) { - const message = { - msgGuid: guid.raw(), - msgType: MessageTypes_1.MessageType.CommandResponse, - commandGuid: commandGuid, - data: data, - error: error, - }; - if (error) { - // stringify error object to remove unserializable fields like functions and prevent serialization errors - message.error = JSON.parse(JSON.stringify(error)); - } - return this.prepareMessage(message); - } - prepareNotificationMessage(notificationId, data) { - const message = { - msgGuid: guid.raw(), - msgType: MessageTypes_1.MessageType.Notification, - notificationId: notificationId, - data: data, - }; - return this.prepareMessage(message); - } - prepareAckMessage() { - const message = { - msgGuid: guid.raw(), - msgType: MessageTypes_1.MessageType.Ack, - platformVersion: JsApiInternalContract_1.INTERNAL_CONTRACT_VERSION, - }; - return this.prepareMessage(message); - } - /** - * Prepares a pending message for sending and returns the prepared message - * - * @param msg The message to be sent to this.otherWindow - * @returns The prepared message - */ - prepareMessage(msg) { - if (!this.otherWindow || !this.otherWindowOrigin) { - throw 'Other window not initialized, cannot dispatch messages'; - } - const preparedMessage = new CrossFramePreparedMessage_1.CrossFramePreparedMessage(msg, this.otherWindow, this.otherWindowOrigin); - return preparedMessage; - } - /** - * Called when a message is received. Does some validation of the message, and then - * calls an appropriate message handler if one is defined - * - * @param event The incoming MessageEvent - */ - onMessageReceived(event) { - // If we have an otherWindow defined, make sure the message is coming from there - if (this.otherWindow && event.source !== this.otherWindow) { - return; - } - // Do some validation on event.data to make sure that we have received a real message - if (!event.data) { - return; - } - const message = event.data; - if (!MessageTypeChecks_1.isMessage(message)) { - return; - } - // Check the declared message type, validate the message, and call an appropriate hander if one exists - switch (message.msgType) { - case MessageTypes_1.MessageType.Initialize: { - if (!MessageTypeChecks_1.isInitMessage(message) || !this.initializeMessageHandler) { - return; - } - this.initializeMessageHandler(message, event.source); - break; - } - case MessageTypes_1.MessageType.CommandResponse: { - if (!MessageTypeChecks_1.isCommandResponseMessage(message) || !this.commandResponseMessageHandler) { - return; - } - this.commandResponseMessageHandler(message, event.source); - break; - } - case MessageTypes_1.MessageType.Command: { - if (!MessageTypeChecks_1.isCommandMessage(message) || !this.commandMessageHandler) { - return; - } - this.commandMessageHandler(message, event.source); - break; - } - case MessageTypes_1.MessageType.Notification: { - if (!MessageTypeChecks_1.isNotificationMessage(message) || !this.notificationMessageHandler) { - return; - } - this.notificationMessageHandler(message, event.source); - break; - } - case MessageTypes_1.MessageType.Handshake: { - if (!MessageTypeChecks_1.isHandshakeMessage(message) || !this.handshakeMessageHandler) { - return; - } - this.handshakeMessageHandler(message, event.source); - break; - } - default: - // Just ignore this since we don't know how to handle the message type - } - } - setOtherWindow(otherWindow) { - this.otherWindow = otherWindow; - } - setOtherWindowOrigin(origin) { - this.otherWindowOrigin = origin; - } -} -exports.CrossFrameMessenger = CrossFrameMessenger; - - -/***/ }), - -/***/ "../api-internal-contract-js/lib/src/messaging/CrossFramePreparedMessage.js": -/*!**********************************************************************************!*\ - !*** ../api-internal-contract-js/lib/src/messaging/CrossFramePreparedMessage.js ***! - \**********************************************************************************/ -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -/** - * Implementation of the PreparedMessage interface used to post messages between - * two frames using window.postMessage - */ -class CrossFramePreparedMessage { - /** - * Creates an instance of CrossFramePreparedMessage. - * @param _message The message to be sent - * @param _target The target window where the message will be sent - * @param _origin The targetOrigin where this message can be received - */ - constructor(_message, _target, _origin) { - this._message = _message; - this._target = _target; - this._origin = _origin; - } - get messageGuid() { - return this._message.msgGuid; - } - send() { - this._target.postMessage(this._message, this._origin); - return this; - } -} -exports.CrossFramePreparedMessage = CrossFramePreparedMessage; - - -/***/ }), - -/***/ "../api-internal-contract-js/lib/src/messaging/MessageTypeChecks.js": -/*!**************************************************************************!*\ - !*** ../api-internal-contract-js/lib/src/messaging/MessageTypeChecks.js ***! - \**************************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const guid = __webpack_require__(/*! guid */ "../../node_modules/guid/guid.js"); -const Notifications_1 = __webpack_require__(/*! ../contract/Notifications */ "../api-internal-contract-js/lib/src/contract/Notifications.js"); -const MessageTypes_1 = __webpack_require__(/*! ./interface/MessageTypes */ "../api-internal-contract-js/lib/src/messaging/interface/MessageTypes.js"); -const expectedEmptyNotifications = new Set([ - Notifications_1.NotificationId.EditButtonClicked, - Notifications_1.NotificationId.EditInDesktopButtonClicked, - Notifications_1.NotificationId.WorkbookPublished, - Notifications_1.NotificationId.WorkbookReadyToClose, - Notifications_1.NotificationId.ReadyToReceiveAuthToken, -]); -/* tslint:disable no-any */ -function isMessage(data) { - if (!data) { - return false; - } - const message = data; - if (!message || !message.msgGuid || !message.msgType) { - return false; - } - if (!guid.isGuid(message.msgGuid)) { - return false; - } - if (typeof message.msgType !== 'string') { - return false; - } - const messageTypes = [ - MessageTypes_1.MessageType.Command, - MessageTypes_1.MessageType.CommandResponse, - MessageTypes_1.MessageType.Initialize, - MessageTypes_1.MessageType.Notification, - MessageTypes_1.MessageType.Handshake, - ]; - if (messageTypes.indexOf(message.msgType) < 0) { - return false; - } - return true; -} -exports.isMessage = isMessage; -function isVersion(versionNumber) { - if (!versionNumber) { - return false; - } - const v = versionNumber; - if (typeof v !== 'object') { - return false; - } - if (typeof v.fix !== 'number' || typeof v.minor !== 'number' || typeof v.major !== 'number') { - return false; - } - return true; -} -exports.isVersion = isVersion; -function isInitMessage(message) { - if (!isMessage(message)) { - return false; - } - const initMessage = message; - if (initMessage.msgType !== MessageTypes_1.MessageType.Initialize) { - return false; - } - if (!initMessage.apiVersion || !isVersion(initMessage.apiVersion)) { - return false; - } - if (!initMessage.crossFrameVersion || !isVersion(initMessage.crossFrameVersion)) { - return false; - } - return true; -} -exports.isInitMessage = isInitMessage; -function isCommandResponseMessage(message) { - if (!isMessage(message)) { - return false; - } - const crMessage = message; - if (crMessage.msgType !== MessageTypes_1.MessageType.CommandResponse) { - return false; - } - if (!guid.isGuid(crMessage.commandGuid)) { - return false; - } - if (!crMessage.data && !crMessage.error) { - return false; - } - return true; -} -exports.isCommandResponseMessage = isCommandResponseMessage; -function isCommandMessage(message) { - if (!isMessage(message)) { - return false; - } - const commandMessage = message; - if (commandMessage.msgType !== MessageTypes_1.MessageType.Command) { - return false; - } - if (!commandMessage.parameters || typeof commandMessage.parameters !== 'object') { - return false; - } - if (!commandMessage.verbId || typeof commandMessage.verbId !== 'string') { - return false; - } - return true; -} -exports.isCommandMessage = isCommandMessage; -function isNotificationMessage(message) { - if (!isMessage(message)) { - return false; - } - const notificationMessage = message; - if (notificationMessage.msgType !== MessageTypes_1.MessageType.Notification) { - return false; - } - if (!notificationMessage.data && !expectedEmptyNotifications.has(notificationMessage.notificationId)) { - return false; - } - if (!notificationMessage.notificationId || typeof notificationMessage.notificationId !== 'string') { - return false; - } - return true; -} -exports.isNotificationMessage = isNotificationMessage; -function isHandshakeMessage(message) { - if (!isMessage(message)) { - return false; - } - const handshakeMessage = message; - if (handshakeMessage.msgType !== MessageTypes_1.MessageType.Handshake) { - return false; - } - return true; -} -exports.isHandshakeMessage = isHandshakeMessage; - - -/***/ }), - -/***/ "../api-internal-contract-js/lib/src/messaging/interface/MessageTypes.js": -/*!*******************************************************************************!*\ - !*** ../api-internal-contract-js/lib/src/messaging/interface/MessageTypes.js ***! - \*******************************************************************************/ -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -/** - * Enum defining the 4 different types of messages we have defined - */ -var MessageType; -(function (MessageType) { - MessageType["Initialize"] = "initialize"; - MessageType["Notification"] = "notification"; - MessageType["Command"] = "command"; - MessageType["CommandResponse"] = "command-response"; - MessageType["Handshake"] = "v-handshake"; - MessageType["Ack"] = "v-ack"; -})(MessageType = exports.MessageType || (exports.MessageType = {})); - - -/***/ }), - -/***/ "../api-internal-contract-js/lib/src/versioning/IdentityVersionConverter.js": -/*!**********************************************************************************!*\ - !*** ../api-internal-contract-js/lib/src/versioning/IdentityVersionConverter.js ***! - \**********************************************************************************/ -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -// tslint:disable:no-any -/** - * This version converter doesn't actually do anything but is useful for testing or when we have - * a matching platform and internal version number - */ -class IdentityVersionConverter { - upgradeExecuteCall(verb, parameters) { - return { - verb: verb, - parameters: parameters, - }; - } - downgradeExecuteReturn(executeResponse) { - return executeResponse; - } - downgradeNotification(notification) { - return notification; - } -} -exports.IdentityVersionConverter = IdentityVersionConverter; - - -/***/ }), - -/***/ "../api-internal-contract-js/lib/src/versioning/StackingVersionConverter.js": -/*!**********************************************************************************!*\ - !*** ../api-internal-contract-js/lib/src/versioning/StackingVersionConverter.js ***! - \**********************************************************************************/ -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -// tslint:disable:no-any -/** - * The version converter is designed to allow the platform and external modules - * to seemlessly communicate over two different versions of the internal API. The only - * mode it supports is external's version <= platform's version. When executing - * commands, it is used to upgrade the external representation to what platform knows on the way in - * and downgrade the representations on the way out. Similarly for notifications, it can - * downgrade those on the way from platform to external. - */ -class StackingVersionConverter { - /** - * Creates a new instance of the StackingVersionConverter - * - * @param _externalMajorVersion The major version of the internal contract api-external-js is using - * @param _platformMajorVersion The major version of the internal contract the api-platform-js is using - * @param _upgradeExecuteTranslations Ordered list of the translations to perform when upgrading cmd parameters - * @param _downgradeExecuteTranslations Ordered list of downgrade translations to perform after a cmd - * @param _downgradeNotificationTranslations Ordered list of downgrade translations to perform on a notification - */ - constructor(_externalMajorVersion, _platformMajorVersion, _upgradeExecuteTranslations, _downgradeExecuteTranslations, _downgradeNotificationTranslations) { - this._externalMajorVersion = _externalMajorVersion; - this._platformMajorVersion = _platformMajorVersion; - this._upgradeExecuteTranslations = _upgradeExecuteTranslations; - this._downgradeExecuteTranslations = _downgradeExecuteTranslations; - this._downgradeNotificationTranslations = _downgradeNotificationTranslations; - if (this._externalMajorVersion > this._platformMajorVersion) { - throw new Error(`Cannot convert between external version ${this._externalMajorVersion} and ${this._platformMajorVersion}`); - } - } - /** - * Creates a new instance of the StackingVersionConverter - * - * @param _externalVersion The version of the internal contract api-external-js is using - * @param _platformVersion The version of the internal contract the api-platform-js is using - * @param _upgradeExecuteTranslations Ordered list of the translations to perform when upgrading cmd parameters - * @param _downgradeExecuteTranslations Ordered list of downgrade translations to perform after a cmd - * @param _downgradeNotificationTranslations Ordered list of downgrade translations to perform on a notification - */ - static fromData(externalVersion, platformVersion, upgradeExecuteTranslations, downgradeExecuteTranslations, downgradeNotificationTranslations) { - return new this(externalVersion.major, platformVersion.major, upgradeExecuteTranslations, downgradeExecuteTranslations, downgradeNotificationTranslations); - } - upgradeExecuteCall(verb, parameters) { - // Perform the upgrade of the verb and parameters to the level that platform is using - let upgraded = { verb: verb, parameters: parameters }; - for (const upgradeTranslation of this._upgradeExecuteTranslations) { - upgraded = upgradeTranslation(upgraded.verb, upgraded.parameters); - } - return upgraded; - } - downgradeExecuteReturn(executeResponse) { - // Downgrade the response to what the external module is expecting - let downgraded = executeResponse; - for (const downgradeTranslation of this._downgradeExecuteTranslations) { - downgraded = downgradeTranslation(downgraded); - } - return downgraded; - } - downgradeNotification(notification) { - // Downgrade the notification to what the external module is expecting - let downgraded = notification; - for (const downgradeTranslation of this._downgradeNotificationTranslations) { - downgraded = downgradeTranslation(downgraded); - } - return downgraded; - } -} -exports.StackingVersionConverter = StackingVersionConverter; - - -/***/ }), - -/***/ "../api-internal-contract-js/lib/src/versioning/VersionConverterFactory.js": -/*!*********************************************************************************!*\ - !*** ../api-internal-contract-js/lib/src/versioning/VersionConverterFactory.js ***! - \*********************************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const IdentityVersionConverter_1 = __webpack_require__(/*! ./IdentityVersionConverter */ "../api-internal-contract-js/lib/src/versioning/IdentityVersionConverter.js"); -const StackingVersionConverter_1 = __webpack_require__(/*! ./StackingVersionConverter */ "../api-internal-contract-js/lib/src/versioning/StackingVersionConverter.js"); -const VersionTranslations_1 = __webpack_require__(/*! ./VersionTranslations */ "../api-internal-contract-js/lib/src/versioning/VersionTranslations.js"); -/** - * @returns true if lhs < rhs (ignoring fix number) - * @param lhs - * @param rhs - */ -function VersionLessThan(lhs, rhs) { - if (lhs.major > rhs.major) { - return false; - } - if (lhs.major < rhs.major) { - return true; - } - return lhs.minor < rhs.minor; -} -exports.VersionLessThan = VersionLessThan; -/** - * @returns true if lhs == rhs (ignoring fix number) - * @param lhs - * @param rhs - */ -function VersionEqualTo(lhs, rhs) { - return lhs.major === rhs.major && lhs.minor === rhs.minor; -} -exports.VersionEqualTo = VersionEqualTo; -// A mapping from an older client version of internal-contract to the current platform version of this contract. -// Each version bump can have an array of translations to perform in order. Notice that this is -// different than the major upgrades/downgrades above because it handles both major and minor version changes. -// Also please note: downgradeExecuteCall is handled on the client/external side rather than platform side. -// When updating the major or minor version of our internal-contract, you will need to update these data structures. -// * If there are translations to add, add them to the version to "upgrade from" or "downgrade to". -exports.ExecuteMinorUpgrades = { - 1: { - 9: [], - }, -}; -exports.ExecuteMinorDowngrades = { - 1: { - 5: [VersionTranslations_1.DowngradeWorksheetNames], - 9: [], - 175: [VersionTranslations_1.DowngradeWorksheetFomatting175], - 182: [VersionTranslations_1.DowngradeExtensionEnvironmentContext], - }, -}; -exports.NotificationMinorDowngrades = { - 1: { - 9: [], - 10: [VersionTranslations_1.DowngradeFlipboardZoneID], - 175: [VersionTranslations_1.DowngradeWorksheetFomattingNotification175], - }, -}; -/** - * Creates a new InternalContractVersionConverter which has the ability to upgrade and downgrade the contract - * between the two versions, which are specified. If externalMajorVersion is greater than platformMajorVersion, - * an error will be thrown because we won't know how to do those conversions. - * This converter can handle both major and minor updates when the platform version is greater than external version. - * - * @param externalVersion VersionNumber of the internal api which the external module is using - * @param platformVersion VersionNumber of the internal api which the platform is using - */ -function CreateVersionConverter(externalVersion, platformVersion) { - return CreateVersionConverterWithTranslators(externalVersion, platformVersion, exports.ExecuteMinorUpgrades, exports.ExecuteMinorDowngrades, exports.NotificationMinorDowngrades); -} -exports.CreateVersionConverter = CreateVersionConverter; -/** - * Implementation of CreateVersionConverter. This function takes the upgrade, downgrade, and - * notification arrays so that all the logic can be tested. - * - * @param externalVersion VersionNumber of the internal api which the external module is using - * @param platformVersion VersionNumber of the internal api which the platform is using - * @param upgrades MajorMinorTranslators for upgrades - * @param downgrades MajorMinorTranslators for downgrades - * @param notificationDowngrades MajorMinorTranslators for notification downgrades - */ -function CreateVersionConverterWithTranslators(externalVersion, platformVersion, upgrades, downgrades, notificationDowngrades) { - const externalMajorVersion = externalVersion.major; - const externalMinorVersion = externalVersion.minor; - const platformMajorVersion = platformVersion.major; - if (externalMajorVersion > platformMajorVersion) { - throw new Error(`External version must be less than or equal to platform version. - externalMajorVersion=${externalMajorVersion} platformMajorVersion=${platformMajorVersion}`); - } - // If we are using the exact same versions (major.minor), just use the identity converter - if (VersionEqualTo(externalVersion, platformVersion)) { - return new IdentityVersionConverter_1.IdentityVersionConverter(); - } - // Walk the span between the versions we have here and collect the upgrade and downgrades necessary - const neededExecuteUpgrades = GetNeededTranslations(externalMajorVersion, platformMajorVersion, externalMinorVersion, upgrades); - const neededExecuteDowngrades = GetNeededTranslations(externalMajorVersion, platformMajorVersion, externalMinorVersion, downgrades); - const neededNotificationDowngrades = GetNeededTranslations(externalMajorVersion, platformMajorVersion, externalMinorVersion, notificationDowngrades); - // We want to apply the downgrades in reverse order in case of dependencies between them - neededExecuteDowngrades.reverse(); - neededNotificationDowngrades.reverse(); - return StackingVersionConverter_1.StackingVersionConverter.fromData(externalVersion, platformVersion, neededExecuteUpgrades, neededExecuteDowngrades, neededNotificationDowngrades); -} -exports.CreateVersionConverterWithTranslators = CreateVersionConverterWithTranslators; -function GetNeededTranslations(externalMajorVersion, platformMajorVersion, externalMinorVersion, majorMinorTranslators) { - const neededTranslations = []; - for (let major = externalMajorVersion; major <= platformMajorVersion; major++) { - if (major in majorMinorTranslators) { - const start = major === externalMajorVersion ? externalMinorVersion : 0; - const maximumMinorVersion = GetMaximumMinorIndex(Object.keys(majorMinorTranslators[major])); - for (let minor = start; minor <= maximumMinorVersion; minor++) { - if (minor in majorMinorTranslators[major]) { - neededTranslations.push(...majorMinorTranslators[major][minor]); - } - } - } - } - return neededTranslations; -} -function GetMaximumMinorIndex(minorVersions) { - return minorVersions.map((a) => Number(a)).reduce((a, b) => (a > b ? a : b)); -} -exports.GetMaximumMinorIndex = GetMaximumMinorIndex; - - -/***/ }), - -/***/ "../api-internal-contract-js/lib/src/versioning/VersionTranslations.js": -/*!*****************************************************************************!*\ - !*** ../api-internal-contract-js/lib/src/versioning/VersionTranslations.js ***! - \*****************************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const JsApiInternalContract_1 = __webpack_require__(/*! ../JsApiInternalContract */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -const Notifications_1 = __webpack_require__(/*! ../contract/Notifications */ "../api-internal-contract-js/lib/src/contract/Notifications.js"); -// This is where we will start to define some of these translations. -// When modifying existing models, add the requisite conversion functions here, then use them -// in the VersionConverterFactory implementation. Import old versions as you would any other module -// 0 <-> Translations -// Uncomment this line to import from the V0 definition of the API -// import * as V0 from '@tableau-api-internal-contract-js_v0'; -// 1 <-> 2 Translations -// Uncomment this line to import from the V1 definition of the API -// import * as V1 from '@tableau-api-internal-contract-js_v1'; -function DowngradeWorksheetNames(executeResponse) { - // Fix the dashboard friendly name issue. The structures are compatible, - // so we still return the original reply, but we copy the SheetInfo.name - // into the DashboardZone.name, where v1 wants to find it. - const bootstrapInfo = executeResponse.result; - if (bootstrapInfo.extensionDashboardInfo !== undefined) { - bootstrapInfo.extensionDashboardInfo.zones.forEach((zone) => { - if (zone.sheetInfo) { - zone.name = zone.sheetInfo.name; - } - }); - } - return executeResponse; -} -exports.DowngradeWorksheetNames = DowngradeWorksheetNames; -function DowngradeFlipboardZoneID(notification) { - // Fix the FlipboardZoneId issue. Older external versions still check for flipboardZoneIDs. - // When running against a newer server, if flipboardZoneId is absent, set it to default(0). - if (notification.notificationId === Notifications_1.NotificationId.SelectedMarksChanged) { - const visualModel = notification.data; - if (visualModel.flipboardZoneID === undefined) { - visualModel.flipboardZoneID = 0; - } - } - return notification; -} -exports.DowngradeFlipboardZoneID = DowngradeFlipboardZoneID; -// Filter out formatting sheets that are specified in the classNames list -function DowngradeWorksheetFormatting(executeResponse, classNames) { - var _a, _b; - const bootstrapInfo = executeResponse.result; - if ((_b = (_a = bootstrapInfo) === null || _a === void 0 ? void 0 : _a.extensionWorksheetInfo) === null || _b === void 0 ? void 0 : _b.formatting) - bootstrapInfo.extensionWorksheetInfo.formatting.formattingSheets = - bootstrapInfo.extensionWorksheetInfo.formatting.formattingSheets.filter((x) => !classNames.includes(x.classNameKey)); - return executeResponse; -} -// Filter out formatting sheets that are specified in the classNames list -// Filter out formatting sheets that are specified in the classNames list -function DowngradeWorksheetFormattingNotification(notification, classNames) { - if (notification.notificationId === Notifications_1.NotificationId.WorksheetFormattingChanged) { - const formatting = notification.data; - notification.data = formatting.formattingSheets.filter((x) => !classNames.includes(x.classNameKey)); - } - return notification; -} -// We added new enum values for ClassNameKeys enum in 176. Need to filter them out if the client version is <176 -const ClassNameKeysToFilter175 = ["tableau-row-dividers" /* RowDividers */, "tableau-column-dividers" /* ColumnDividers */, "tableau-pane" /* Pane */]; -exports.DowngradeWorksheetFomatting175 = (response) => DowngradeWorksheetFormatting(response, ClassNameKeysToFilter175); -exports.DowngradeWorksheetFomattingNotification175 = (notification) => DowngradeWorksheetFormattingNotification(notification, ClassNameKeysToFilter175); -function DowngradeExtensionEnvironmentContext(executeResponse) { - // Fix the extension environment context issue. Replaces new enum values that go unrecognized - // by older extensions with their respective older enum values. - const bootstrapInfo = executeResponse.result; - if (bootstrapInfo.extensionEnvironment !== undefined) { - const context = bootstrapInfo.extensionEnvironment.extensionContext; - if (context === JsApiInternalContract_1.ExtensionContext.PublicWeb || context === JsApiInternalContract_1.ExtensionContext.Cloud) { - bootstrapInfo.extensionEnvironment.extensionContext = JsApiInternalContract_1.ExtensionContext.Server; - } - else if (context === JsApiInternalContract_1.ExtensionContext.PublicDesktop) { - bootstrapInfo.extensionEnvironment.extensionContext = JsApiInternalContract_1.ExtensionContext.Desktop; - } - } - return executeResponse; -} -exports.DowngradeExtensionEnvironmentContext = DowngradeExtensionEnvironmentContext; - - -/***/ }), - -/***/ "../api-internal-contract-js/lib/src/versioning/external/ExternalIdentityVersionConverter.js": -/*!***************************************************************************************************!*\ - !*** ../api-internal-contract-js/lib/src/versioning/external/ExternalIdentityVersionConverter.js ***! - \***************************************************************************************************/ -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -// tslint:disable:no-any -/** - * This version converter doesn't actually do anything but is useful for testing or when we have - * a matching platform and external version number - */ -class ExternalIdentityVersionConverter { - downgradeExecuteCall(verb, parameters) { - return { - verb: verb, - parameters: parameters, - }; - } - upgradeExecuteReturn(executeResponse, verb, parameters) { - return executeResponse; - } - upgradeNotification(notification) { - return notification; - } -} -exports.ExternalIdentityVersionConverter = ExternalIdentityVersionConverter; - - -/***/ }), - -/***/ "../api-internal-contract-js/lib/src/versioning/external/ExternalStackingVersionConverter.js": -/*!***************************************************************************************************!*\ - !*** ../api-internal-contract-js/lib/src/versioning/external/ExternalStackingVersionConverter.js ***! - \***************************************************************************************************/ -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -// tslint:disable:no-any -/** - * The version converter is designed to allow the platform and external modules - * to seemlessly communicate over two different versions of the internal API. This converter - * supports external's version(minor) >= platform's version(minor). When executing - * commands, it is used to downgrade the external representation to what platform knows on the way in - * and upgrade the representations on the way out. - */ -class ExternalStackingVersionConverter { - /** - * Creates a new instance of the StackingVersionConverter - * - * @param _externalVersion The version of the internal contract api-external-js is using - * @param _platformVersion The version of the internal contract the api-platform-js is using - * @param _downgradeExecuteCallTranslations Ordered list of the translations to perform when downgrading cmd parameters - * @param _upgradeExecuteReturnTranslations Ordered list of upgrade translations to perform after a cmd is executed - * @param _upgradeNotificationTranslations Ordered list of upgrade notfications to perform on events - */ - constructor(_externalVersion, _platformVersion, _downgradeExecuteCallTranslations, _upgradeExecuteReturnTranslations, _upgradeNotificationTranslations) { - this._externalVersion = _externalVersion; - this._platformVersion = _platformVersion; - this._downgradeExecuteCallTranslations = _downgradeExecuteCallTranslations; - this._upgradeExecuteReturnTranslations = _upgradeExecuteReturnTranslations; - this._upgradeNotificationTranslations = _upgradeNotificationTranslations; - if (this._externalVersion.major > this._platformVersion.major) { - throw new Error(`Cannot convert between external version ${this._externalVersion.major} - and ${this._platformVersion.major}`); - } - } - downgradeExecuteCall(verb, parameters) { - // Perform the downgrade of the verb and parameters to the level that platform is using - let downgraded = { verb: verb, parameters: parameters }; - for (const downgradeTranslation of this._downgradeExecuteCallTranslations) { - downgraded = downgradeTranslation(downgraded.verb, downgraded.parameters); - } - return downgraded; - } - upgradeExecuteReturn(executeResponse, verb, parameters) { - // Perform the upgrade of the response to what the external module is expecting - let upgraded = executeResponse; - for (const upgradeTranslation of this._upgradeExecuteReturnTranslations) { - upgraded = upgradeTranslation(upgraded, verb, parameters); - } - return upgraded; - } - upgradeNotification(notification) { - // Perform the upgrade of notification to what the external module is expecting - let upgraded = notification; - for (const upgradeNotification of this._upgradeNotificationTranslations) { - upgraded = upgradeNotification(upgraded); - } - return upgraded; - } -} -exports.ExternalStackingVersionConverter = ExternalStackingVersionConverter; - - -/***/ }), - -/***/ "../api-internal-contract-js/lib/src/versioning/external/ExternalVersionConverterFactory.js": -/*!**************************************************************************************************!*\ - !*** ../api-internal-contract-js/lib/src/versioning/external/ExternalVersionConverterFactory.js ***! - \**************************************************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const VersionConverterFactory_1 = __webpack_require__(/*! ../VersionConverterFactory */ "../api-internal-contract-js/lib/src/versioning/VersionConverterFactory.js"); -const ExternalIdentityVersionConverter_1 = __webpack_require__(/*! ./ExternalIdentityVersionConverter */ "../api-internal-contract-js/lib/src/versioning/external/ExternalIdentityVersionConverter.js"); -const ExternalStackingVersionConverter_1 = __webpack_require__(/*! ./ExternalStackingVersionConverter */ "../api-internal-contract-js/lib/src/versioning/external/ExternalStackingVersionConverter.js"); -// A mapping from the current client version of internal-contract to an older platform version of the contract. -// Each version bump can have an array of translations to perform in order. -// These translations handle downgradeExecuteCall and upgradeExecuteReturn and are meant to be called on the -// client/external side. -// When updating the major or minor version of our internal-contract, you will need to update these data structures. -// * If there are translations to add, add them to the version to 'upgrade from' or 'downgrade to'. -exports.ExecuteMinorDowngradeCallExternal = { - 1: { - 9: [], - }, -}; -exports.ExecuteMinorUpgradeReturnExternal = { - 1: { - 9: [], - }, -}; -exports.ExecuteMinorUpgradeNotification = { - 1: { - 9: [], - }, -}; -/** - * Creates a new ExternalContractVersionConverter which has the ability to upgrade and downgrade - * the contract between the two versions which are specified. If externalMajorVersion is less than - * platformMajorVersion, an ExternalIdentityVersionConverter will be returned. - * Handles upgrade/downgrade for both major and minor updates. - * - * @param externalVersion VersionNumber of the internal api which the external module is using - * @param platformVersion VersionNumber of the internal api which the platform is using - */ -function CreateExternalCompatibleVersionConverter(externalVersion, platformVersion) { - return CreateExternalCompatibleVersionConverterWithTranslators(externalVersion, platformVersion, exports.ExecuteMinorDowngradeCallExternal, exports.ExecuteMinorUpgradeReturnExternal, exports.ExecuteMinorUpgradeNotification); -} -exports.CreateExternalCompatibleVersionConverter = CreateExternalCompatibleVersionConverter; -/** - * Implementation of CreateExternalCompatibleVersionConverterWithTranslators. - * This function takes the upgrade, downgrade arrays so that all the logic can be tested. - * - * @param externalVersion VersionNumber of the internal contract which the external module is using - * @param platformVersion VersionNumber of the internal contract which the platform is using - * @param upgrades MajorMinorTranslators for response upgrades - * @param downgrades MajorMinorTranslators for execute call downgrades - */ -function CreateExternalCompatibleVersionConverterWithTranslators(externalVersion, platformVersion, downgrades, upgrades, upgradeNotifications) { - const externalMajorVersion = externalVersion.major; - const platformMajorVersion = platformVersion.major; - const platformMinorVersion = platformVersion.minor; - // This check is present in VersionConverterFactory. We throw the same error here as well. - // Hence we only need to check the minor versions for translations. - if (externalMajorVersion > platformMajorVersion) { - throw new Error(`External version must be less than or equal to platform version. - externalMajorVersion=${externalMajorVersion} platformMajorVersion=${platformMajorVersion}`); - } - if (externalMajorVersion < platformMajorVersion || VersionConverterFactory_1.VersionEqualTo(externalVersion, platformVersion)) { - return new ExternalIdentityVersionConverter_1.ExternalIdentityVersionConverter(); - } - // Walk the span between the versions we have here and collect the upgrade and downgrades necessary - const neededExecuteCallDowngrade = GetNeededExternalTranslations(platformMajorVersion, platformMinorVersion, downgrades); - const neededExecuteReturnUpgrades = GetNeededExternalTranslations(platformMajorVersion, platformMinorVersion, upgrades); - const neededNotificationUpgrades = GetNeededExternalTranslations(platformMajorVersion, platformMinorVersion, upgradeNotifications); - // Reverse the downgrade calls, so that we start the downgrade from the external version to the platform version - neededExecuteCallDowngrade.reverse(); - return new ExternalStackingVersionConverter_1.ExternalStackingVersionConverter(externalVersion, platformVersion, neededExecuteCallDowngrade, neededExecuteReturnUpgrades, neededNotificationUpgrades); -} -exports.CreateExternalCompatibleVersionConverterWithTranslators = CreateExternalCompatibleVersionConverterWithTranslators; -function GetNeededExternalTranslations(platformMajorVersion, platformMinorVersion, majorMinorTranslators) { - const neededTranslations = []; - if (platformMajorVersion in majorMinorTranslators) { - const start = platformMinorVersion; - const maximumMinorVersion = VersionConverterFactory_1.GetMaximumMinorIndex(Object.keys(majorMinorTranslators[platformMajorVersion])); - for (let minor = start; minor <= maximumMinorVersion; minor++) { - if (minor in majorMinorTranslators[platformMajorVersion]) { - neededTranslations.push(...majorMinorTranslators[platformMajorVersion][minor]); - } - } - } - return neededTranslations; -} - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared.js": -/*!*********************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared.js ***! - \*********************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -// Export everything which had been previously in the api-shared module -function __export(m) { - for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; -} -Object.defineProperty(exports, "__esModule", ({ value: true })); -var ApiVersion_1 = __webpack_require__(/*! ./ApiShared/ApiVersion */ "../api-shared-js/lib/src/ApiShared/ApiVersion.js"); -exports.ApiVersion = ApiVersion_1.ApiVersion; -__export(__webpack_require__(/*! ./ApiShared/CrossFrame/CrossFrameBootstrap */ "../api-shared-js/lib/src/ApiShared/CrossFrame/CrossFrameBootstrap.js")); -var CrossFrameDispatcher_1 = __webpack_require__(/*! ./ApiShared/CrossFrame/CrossFrameDispatcher */ "../api-shared-js/lib/src/ApiShared/CrossFrame/CrossFrameDispatcher.js"); -exports.CrossFrameDispatcher = CrossFrameDispatcher_1.CrossFrameDispatcher; -var DataSource_1 = __webpack_require__(/*! ./ApiShared/DataSource */ "../api-shared-js/lib/src/ApiShared/DataSource.js"); -exports.DataSource = DataSource_1.DataSource; -var ExternalToInternalEnumMappings_1 = __webpack_require__(/*! ./ApiShared/EnumMappings/ExternalToInternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/ExternalToInternalEnumMappings.js"); -exports.ExternalToInternalEnumMappings = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings; -var InternalToExternalEnumMappings_1 = __webpack_require__(/*! ./ApiShared/EnumMappings/InternalToExternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js"); -exports.InternalToExternalEnumMappings = InternalToExternalEnumMappings_1.InternalToExternalEnumMappings; -var EventListenerManager_1 = __webpack_require__(/*! ./ApiShared/EventListenerManager */ "../api-shared-js/lib/src/ApiShared/EventListenerManager.js"); -exports.EventListenerManager = EventListenerManager_1.EventListenerManager; -var Field_1 = __webpack_require__(/*! ./ApiShared/Field */ "../api-shared-js/lib/src/ApiShared/Field.js"); -exports.Field = Field_1.Field; -var CustomViewImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/CustomViewImpl */ "../api-shared-js/lib/src/ApiShared/Impl/CustomViewImpl.js"); -exports.CustomViewImpl = CustomViewImpl_1.CustomViewImpl; -var DashboardImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/DashboardImpl */ "../api-shared-js/lib/src/ApiShared/Impl/DashboardImpl.js"); -exports.DashboardImpl = DashboardImpl_1.DashboardImpl; -var DashboardObjectImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/DashboardObjectImpl */ "../api-shared-js/lib/src/ApiShared/Impl/DashboardObjectImpl.js"); -exports.DashboardObjectImpl = DashboardObjectImpl_1.DashboardObjectImpl; -var DataSourceImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/DataSourceImpl */ "../api-shared-js/lib/src/ApiShared/Impl/DataSourceImpl.js"); -exports.DataSourceImpl = DataSourceImpl_1.DataSourceImpl; -var ParameterImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/ParameterImpl */ "../api-shared-js/lib/src/ApiShared/Impl/ParameterImpl.js"); -exports.ParameterImpl = ParameterImpl_1.ParameterImpl; -var SheetImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/SheetImpl */ "../api-shared-js/lib/src/ApiShared/Impl/SheetImpl.js"); -exports.SheetImpl = SheetImpl_1.SheetImpl; -var SheetInfoImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/SheetInfoImpl */ "../api-shared-js/lib/src/ApiShared/Impl/SheetInfoImpl.js"); -exports.SheetInfoImpl = SheetInfoImpl_1.SheetInfoImpl; -var SingleEventManagerImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/SingleEventManagerImpl */ "../api-shared-js/lib/src/ApiShared/Impl/SingleEventManagerImpl.js"); -exports.SingleEventManagerImpl = SingleEventManagerImpl_1.SingleEventManagerImpl; -var StoryImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/StoryImpl */ "../api-shared-js/lib/src/ApiShared/Impl/StoryImpl.js"); -exports.StoryImpl = StoryImpl_1.StoryImpl; -var StoryPointImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/StoryPointImpl */ "../api-shared-js/lib/src/ApiShared/Impl/StoryPointImpl.js"); -exports.StoryPointImpl = StoryPointImpl_1.StoryPointImpl; -var StoryPointInfoImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/StoryPointInfoImpl */ "../api-shared-js/lib/src/ApiShared/Impl/StoryPointInfoImpl.js"); -exports.StoryPointInfoImpl = StoryPointInfoImpl_1.StoryPointInfoImpl; -var WorkbookImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/WorkbookImpl */ "../api-shared-js/lib/src/ApiShared/Impl/WorkbookImpl.js"); -exports.WorkbookImpl = WorkbookImpl_1.WorkbookImpl; -var WorksheetImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/WorksheetImpl */ "../api-shared-js/lib/src/ApiShared/Impl/WorksheetImpl.js"); -exports.WorksheetImpl = WorksheetImpl_1.WorksheetImpl; -var Point_1 = __webpack_require__(/*! ./ApiShared/Point */ "../api-shared-js/lib/src/ApiShared/Point.js"); -exports.Point = Point_1.Point; -__export(__webpack_require__(/*! ./ApiShared/Services/RegisterAllSharedServices */ "../api-shared-js/lib/src/ApiShared/Services/RegisterAllSharedServices.js")); -__export(__webpack_require__(/*! ./ApiShared/Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js")); -var ClientInfoServiceImpl_1 = __webpack_require__(/*! ./ApiShared/Services/impl/ClientInfoServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/ClientInfoServiceImpl.js"); -exports.ClientInfoServiceImpl = ClientInfoServiceImpl_1.ClientInfoServiceImpl; -var NotificationServiceImpl_1 = __webpack_require__(/*! ./ApiShared/Services/impl/NotificationServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImpl.js"); -exports.NotificationServiceImpl = NotificationServiceImpl_1.NotificationServiceImpl; -var NotificationServiceImplBase_1 = __webpack_require__(/*! ./ApiShared/Services/impl/NotificationServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImplBase.js"); -exports.NotificationServiceImplBase = NotificationServiceImplBase_1.NotificationServiceImplBase; -exports.Registration = NotificationServiceImplBase_1.Registration; -var ServiceImplBase_1 = __webpack_require__(/*! ./ApiShared/Services/impl/ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); -exports.ServiceImplBase = ServiceImplBase_1.ServiceImplBase; -var SizeServiceImpl_1 = __webpack_require__(/*! ./ApiShared/Services/impl/SizeServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/SizeServiceImpl.js"); -exports.SizeServiceImpl = SizeServiceImpl_1.SizeServiceImpl; -var StoryActivationServiceImpl_1 = __webpack_require__(/*! ./ApiShared/Services/impl/StoryActivationServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/StoryActivationServiceImpl.js"); -exports.StoryActivationServiceImpl = StoryActivationServiceImpl_1.StoryActivationServiceImpl; -var TableauError_1 = __webpack_require__(/*! ./ApiShared/TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); -exports.TableauError = TableauError_1.TableauError; -var Deferred_1 = __webpack_require__(/*! ./ApiShared/Utils/Deferred */ "../api-shared-js/lib/src/ApiShared/Utils/Deferred.js"); -exports.Deferred = Deferred_1.Deferred; -var ErrorHelpers_1 = __webpack_require__(/*! ./ApiShared/Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); -exports.ErrorHelpers = ErrorHelpers_1.ErrorHelpers; -var ExportHelpers_1 = __webpack_require__(/*! ./ApiShared/Utils/ExportHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ExportHelpers.js"); -exports.ExportHelpers = ExportHelpers_1.ExportHelpers; -var SheetUtils_1 = __webpack_require__(/*! ./ApiShared/Utils/SheetUtils */ "../api-shared-js/lib/src/ApiShared/Utils/SheetUtils.js"); -exports.SheetUtils = SheetUtils_1.SheetUtils; -var VersionNumber_1 = __webpack_require__(/*! ./ApiShared/VersionNumber */ "../api-shared-js/lib/src/ApiShared/VersionNumber.js"); -exports.VersionNumber = VersionNumber_1.VersionNumber; -var VersionedExternalApiDispatcher_1 = __webpack_require__(/*! ./VersionedExternalApiDispatcher */ "../api-shared-js/lib/src/VersionedExternalApiDispatcher.js"); -exports.VersionedExternalApiDispatcher = VersionedExternalApiDispatcher_1.VersionedExternalApiDispatcher; - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/ApiVersion.js": -/*!********************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/ApiVersion.js ***! - \********************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const VersionNumber_1 = __webpack_require__(/*! ./VersionNumber */ "../api-shared-js/lib/src/ApiShared/VersionNumber.js"); -/** - * This is the singleton wrapper of VersionNumber - */ -class ApiVersion { - /** - * Gets the singleton instance of the version number. - */ - static get Instance() { - return ApiVersion._instance; - } - static SetVersionNumber(numString, isAlpha) { - ApiVersion._instance = new VersionNumber_1.VersionNumber(numString, isAlpha); - } -} -exports.ApiVersion = ApiVersion; - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/ConnectionSummary.js": -/*!***************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/ConnectionSummary.js ***! - \***************************************************************/ -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -/** - * Implementation of a connection summary. - * This does not follow the Impl pattern as it is just a property bag. - */ -class ConnectionSummary { - constructor(_connectionInfo) { - this._connectionInfo = _connectionInfo; - } - get name() { - return this._connectionInfo.name; - } - get id() { - return this._connectionInfo.id; - } - get serverURI() { - return this._connectionInfo.serverURI; - } - get type() { - return this._connectionInfo.type; - } -} -exports.ConnectionSummary = ConnectionSummary; - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/CrossFrame/CrossFrameBootstrap.js": -/*!****************************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/CrossFrame/CrossFrameBootstrap.js ***! - \****************************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -const CrossFrameDispatcher_1 = __webpack_require__(/*! ./CrossFrameDispatcher */ "../api-shared-js/lib/src/ApiShared/CrossFrame/CrossFrameDispatcher.js"); -// Checks to see if we are running in an iframe currently: https://stackoverflow.com/a/326076/8821153 -function inIframe(thisWindow) { - try { - return thisWindow.self !== thisWindow.parent; - } - catch (e) { - return true; - } -} -/** - * Attempts to bootstrap the extension with a cross-frame parent where Tableau is running - * - * @param thisWindow The window which we are running in (injected for unit testing purposes) - * @param internalContractVersion The version number of the internal contract we are using - * @returns A promise which is doing the actual bootstrapping - */ -function doCrossFrameBootstrap(thisWindow, internalContractVersion, options) { - return new Promise((resolve, reject) => { - let parent; - // Normally, we are running inside an iframe. The exception to this is - // when we are running as an extension inside a dialog as part of the UINamespace - // functionality. In that case, we want the opener of this window rather than the parent. - if (!inIframe(thisWindow)) { - parent = thisWindow.opener; - } - else { - parent = thisWindow.parent; - } - if (!parent) { - reject('This extension is not running inside an iframe, desktop, or popup window. Initialization failed.'); - } - // Create the messenger which will do he communication between this window and our parent - // Since we don't know where we are running yet, we have to make this initial origin '*'. Once - // we have successfully initialized our extension, we will limit where we send messages - const messenger = new api_internal_contract_js_1.CrossFrameMessenger(thisWindow, parent, '*'); - // Prepare to send an initialization message to the parent frame - const initializationMessage = messenger.prepareInitializationMessage(internalContractVersion, api_internal_contract_js_1.MESSAGING_VERSION, options); - // When we receive a response back from the parent, we check to make sure the guids match and then we know - // that the parent is aware of us and we can start communicating - messenger.setCommandResponseMessageHandler(function (msg) { - // Verify we are getting a response from our initialize message - if (msg.commandGuid === initializationMessage.messageGuid) { - // The versioning of the dispatcher happens on the other side of our frame, and - // in a wrapper on this side. This one doesn't have any version knowledge. - const dispatcherFactory = () => new CrossFrameDispatcher_1.CrossFrameDispatcher(messenger); - resolve(dispatcherFactory); - } - }); - // Now that our handlers are ready, start listening and send our initialization message - messenger.startListening(); - initializationMessage.send(); - }); -} -exports.doCrossFrameBootstrap = doCrossFrameBootstrap; - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/CrossFrame/CrossFrameDispatcher.js": -/*!*****************************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/CrossFrame/CrossFrameDispatcher.js ***! - \*****************************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -/** - * This is an implementation of the InternalApiDispatcher interface which functions by passing messages - * across a frame boundary. This is usually between the code where our javscript library has been included - * by a 3rd party dev and another frame where Tableau server has content. - */ -class CrossFrameDispatcher { - /** - * Creates an instance of CrossFrameDispatcher which will use the given messenger to communicate - * @param _messenger an instantiated and listening messenger object - */ - constructor(_messenger) { - this._messenger = _messenger; - // Collection of pending promises which are waiting to be resolved. When we receive a response back from the other frame, - // these promises can be either resolved or rejected - this._pendingPromises = {}; - // The collection of notification handlers which have been registered with this dispatcher - this._notificationHandlers = []; - if (!this._messenger) { - throw 'Missing messenger object'; - } - // Set up our message handlers. We only care about incoming notifications and command responses - this._messenger.setCommandResponseMessageHandler(this.onCommandResponse.bind(this)); - this._messenger.setNotificationMessageHandler(this.onNotification.bind(this)); - } - ////// Start InternalApiDispatcher implementation - execute(verb, parameters) { - // To execute a verb, we first prepare a command message and then define a promise. - const preparedMessage = this._messenger.prepareCommandMessage(verb, parameters); - const promise = new Promise((resolve, reject) => { - // Save off the pending promise by the messageGuid we are about to send. When a response is - // received, we'll be able to resolve this promise with the result - this._pendingPromises[preparedMessage.messageGuid] = { resolve: resolve, reject: reject }; - }); - // Actually send the message and return the promise - preparedMessage.send(); - return promise; - } - registerNotificationHandler(handler) { - this._notificationHandlers.push(handler); - } - unregisterNotificationHandler(handler) { - this._notificationHandlers = this._notificationHandlers.filter((h) => h !== handler); - } - ////// End InternalApiDispatcher implementation - onCommandResponse(response) { - // We got a command response, look through the pending promises and resolve - if (Object.keys(this._pendingPromises).indexOf(response.commandGuid) < 0) { - return; // We don't have any reference to this command, just return - } - const pendingPromise = this._pendingPromises[response.commandGuid]; - // If we have an error defined, reject the promise - if (response.error) { - pendingPromise.reject(response.error); - } - // If we have data defined, resolve the promise - if (response.data) { - pendingPromise.resolve({ result: response.data }); - } - // Clean up our pending promises object - delete this._pendingPromises[response.commandGuid]; - } - onNotification(notificationMessage) { - // Go through each notification handler we have registered and let them know a notification came in - for (const handler of this._notificationHandlers) { - try { - handler({ notificationId: notificationMessage.notificationId, data: notificationMessage.data }); - } - catch (e) { - // Incase of a IncompatibleVersionError, re-throw the error. - if (e.errorCode === api_external_contract_js_1.EmbeddingErrorCodes.IncompatibleVersionError) { - throw e; - } - // Else Ignore so if one handler errors, the other still get the message. - } - } - } -} -exports.CrossFrameDispatcher = CrossFrameDispatcher; - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/DataSource.js": -/*!********************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/DataSource.js ***! - \********************************************************/ -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -class DataSource { - constructor(_dataSourceImpl) { - this._dataSourceImpl = _dataSourceImpl; - } - get name() { - return this._dataSourceImpl.name; - } - get id() { - return this._dataSourceImpl.id; - } - get fields() { - return this._dataSourceImpl.fields; - } - get extractUpdateTime() { - return this._dataSourceImpl.extractUpdateTime; - } - get isExtract() { - return this._dataSourceImpl.isExtract; - } - get isPublished() { - return this._dataSourceImpl.isPublished; - } - publishedUrl() { - return this._dataSourceImpl.publishedUrl(); - } - refreshAsync() { - return this._dataSourceImpl.refreshAsync(); - } - getActiveTablesAsync() { - console.warn('DataSource.getActiveTablesAsync is deprecated. Please use DataSource.getLogicalTablesAsync.'); - return this._dataSourceImpl.getActiveTablesAsync(); - } - getConnectionSummariesAsync() { - return this._dataSourceImpl.getConnectionSummariesAsync(); - } - getUnderlyingDataAsync(options) { - console.warn('DataSource.getUnderlyingDataAsync is deprecated. Please use ' + - 'DataSource.getLogicalTablesAsync and DataSource.getLogicalTableDataAsync.'); - return this._dataSourceImpl.getUnderlyingDataAsync(options); - } - getLogicalTablesAsync() { - return this._dataSourceImpl.getLogicalTablesAsync(); - } - getLogicalTableDataAsync(logicalTableId, options) { - return this._dataSourceImpl.getLogicalTableDataAsync(logicalTableId, options); - } - getLogicalTableDataReaderAsync(logicalTableId, pageRowCount, options) { - return this._dataSourceImpl.getLogicalTableDataReaderAsync(logicalTableId, pageRowCount, options); - } -} -exports.DataSource = DataSource; - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/EnumMappings/ExternalToInternalEnumMappings.js": -/*!*****************************************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/EnumMappings/ExternalToInternalEnumMappings.js ***! - \*****************************************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -const EnumConverter_1 = __webpack_require__(/*! ../Utils/EnumConverter */ "../api-shared-js/lib/src/ApiShared/Utils/EnumConverter.js"); -/* tslint:disable:typedef - Disable this to make declaring these classes a bit easier */ -/** - * Maps enums used by the external-api-contract to the enums used - * in the internal-api-contract, which developers code against. - */ -class ExternalToInternalEnumMappings { -} -exports.ExternalToInternalEnumMappings = ExternalToInternalEnumMappings; -ExternalToInternalEnumMappings.filterDomainType = new EnumConverter_1.EnumConverter({ - [api_external_contract_js_1.FilterDomainType.Relevant]: api_internal_contract_js_1.FilterDomainType.Relevant, - [api_external_contract_js_1.FilterDomainType.Database]: api_internal_contract_js_1.FilterDomainType.Database, -}); -ExternalToInternalEnumMappings.nullOptions = new EnumConverter_1.EnumConverter({ - [api_external_contract_js_1.FilterNullOption.AllValues]: api_internal_contract_js_1.FilterNullOption.AllValues, - [api_external_contract_js_1.FilterNullOption.NonNullValues]: api_internal_contract_js_1.FilterNullOption.NonNullValues, - [api_external_contract_js_1.FilterNullOption.NullValues]: api_internal_contract_js_1.FilterNullOption.NullValues, -}); -ExternalToInternalEnumMappings.filterUpdateType = new EnumConverter_1.EnumConverter({ - [api_external_contract_js_1.FilterUpdateType.Add]: api_internal_contract_js_1.FilterUpdateType.Add, - [api_external_contract_js_1.FilterUpdateType.All]: api_internal_contract_js_1.FilterUpdateType.All, - [api_external_contract_js_1.FilterUpdateType.Remove]: api_internal_contract_js_1.FilterUpdateType.Remove, - [api_external_contract_js_1.FilterUpdateType.Replace]: api_internal_contract_js_1.FilterUpdateType.Replace, -}); -ExternalToInternalEnumMappings.setVisibilityType = new EnumConverter_1.EnumConverter({ - [api_external_contract_js_1.ZoneVisibilityType.Show]: true, - [api_external_contract_js_1.ZoneVisibilityType.Hide]: false, -}); -ExternalToInternalEnumMappings.setReplaySpeedType = new EnumConverter_1.EnumConverter({ - // these numbers are duration multipliers - // 2.0, for example, doubles the duration of the replay, slowing it down to 0.5x speed - [api_external_contract_js_1.ReplaySpeedType.Slow]: 2.0, - [api_external_contract_js_1.ReplaySpeedType.Normal]: 1.0, - [api_external_contract_js_1.ReplaySpeedType.Fast]: 0.5, -}); -ExternalToInternalEnumMappings.sheetType = new EnumConverter_1.EnumConverter({ - [api_external_contract_js_1.SheetType.Dashboard]: api_internal_contract_js_1.SheetType.Dashboard, - [api_external_contract_js_1.SheetType.Worksheet]: api_internal_contract_js_1.SheetType.Worksheet, - [api_external_contract_js_1.SheetType.Story]: api_internal_contract_js_1.SheetType.Story, -}); -ExternalToInternalEnumMappings.showDataTableFormatType = new EnumConverter_1.EnumConverter({ - [api_external_contract_js_1.IncludeDataValuesOption.AllValues]: api_internal_contract_js_1.ApiShowDataTableFormat.NativeAndFormattedValues, - [api_external_contract_js_1.IncludeDataValuesOption.OnlyNativeValues]: api_internal_contract_js_1.ApiShowDataTableFormat.NativeValuesOnly, - [api_external_contract_js_1.IncludeDataValuesOption.OnlyFormattedValues]: api_internal_contract_js_1.ApiShowDataTableFormat.FormattedValuesOnly, -}); -ExternalToInternalEnumMappings.periodType = new EnumConverter_1.EnumConverter({ - [api_external_contract_js_1.PeriodType.Years]: api_internal_contract_js_1.DateStepPeriod.Years, - [api_external_contract_js_1.PeriodType.Quarters]: api_internal_contract_js_1.DateStepPeriod.Quarters, - [api_external_contract_js_1.PeriodType.Months]: api_internal_contract_js_1.DateStepPeriod.Months, - [api_external_contract_js_1.PeriodType.Weeks]: api_internal_contract_js_1.DateStepPeriod.Weeks, - [api_external_contract_js_1.PeriodType.Days]: api_internal_contract_js_1.DateStepPeriod.Days, - [api_external_contract_js_1.PeriodType.Hours]: api_internal_contract_js_1.DateStepPeriod.Hours, - [api_external_contract_js_1.PeriodType.Minutes]: api_internal_contract_js_1.DateStepPeriod.Minutes, - [api_external_contract_js_1.PeriodType.Seconds]: api_internal_contract_js_1.DateStepPeriod.Seconds, -}); -ExternalToInternalEnumMappings.dateRangeType = new EnumConverter_1.EnumConverter({ - [api_external_contract_js_1.DateRangeType.Last]: api_internal_contract_js_1.DateRangeType.Last, - [api_external_contract_js_1.DateRangeType.LastN]: api_internal_contract_js_1.DateRangeType.LastN, - [api_external_contract_js_1.DateRangeType.Next]: api_internal_contract_js_1.DateRangeType.Next, - [api_external_contract_js_1.DateRangeType.NextN]: api_internal_contract_js_1.DateRangeType.NextN, - [api_external_contract_js_1.DateRangeType.Current]: api_internal_contract_js_1.DateRangeType.Current, - [api_external_contract_js_1.DateRangeType.ToDate]: api_internal_contract_js_1.DateRangeType.ToDate, -}); -ExternalToInternalEnumMappings.dialogStyles = new EnumConverter_1.EnumConverter({ - [api_external_contract_js_1.DialogStyle.Window]: api_internal_contract_js_1.DialogStyle.Window, - [api_external_contract_js_1.DialogStyle.Modal]: api_internal_contract_js_1.DialogStyle.Modal, - [api_external_contract_js_1.DialogStyle.Modeless]: api_internal_contract_js_1.DialogStyle.Modeless, -}); -/* tslint:enable:typedef */ - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js": -/*!*****************************************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js ***! - \*****************************************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -const EnumConverter_1 = __webpack_require__(/*! ../Utils/EnumConverter */ "../api-shared-js/lib/src/ApiShared/Utils/EnumConverter.js"); -/* tslint:disable:typedef - Disable this to make declaring these classes a bit easier */ -/** - * Maps enums used by the internal-api-contract to the enums used - * in the external-api-contract, which developers code against. - */ -class InternalToExternalEnumMappings { -} -exports.InternalToExternalEnumMappings = InternalToExternalEnumMappings; -InternalToExternalEnumMappings.extensionContext = new EnumConverter_1.EnumConverter({ - [api_internal_contract_js_1.ExtensionContext.Desktop]: api_external_contract_js_1.ExtensionContext.Desktop, - [api_internal_contract_js_1.ExtensionContext.Server]: api_external_contract_js_1.ExtensionContext.Server, - [api_internal_contract_js_1.ExtensionContext.PublicWeb]: api_external_contract_js_1.ExtensionContext.PublicWeb, - [api_internal_contract_js_1.ExtensionContext.PublicDesktop]: api_external_contract_js_1.ExtensionContext.PublicDesktop, - [api_internal_contract_js_1.ExtensionContext.Cloud]: api_external_contract_js_1.ExtensionContext.Cloud, -}); -InternalToExternalEnumMappings.extensionMode = new EnumConverter_1.EnumConverter({ - [api_internal_contract_js_1.ExtensionMode.Authoring]: api_external_contract_js_1.ExtensionMode.Authoring, - [api_internal_contract_js_1.ExtensionMode.Viewing]: api_external_contract_js_1.ExtensionMode.Viewing, -}); -InternalToExternalEnumMappings.columnType = new EnumConverter_1.EnumConverter({ - [api_internal_contract_js_1.ColumnType.Continuous]: api_external_contract_js_1.ColumnType.Continuous, - [api_internal_contract_js_1.ColumnType.Discrete]: api_external_contract_js_1.ColumnType.Discrete, - [api_internal_contract_js_1.ColumnType.Unknown]: api_external_contract_js_1.ColumnType.Unknown, -}); -InternalToExternalEnumMappings.fieldAggregationType = new EnumConverter_1.EnumConverter({ - [api_internal_contract_js_1.FieldAggregationType.Attr]: api_external_contract_js_1.FieldAggregationType.Attr, - [api_internal_contract_js_1.FieldAggregationType.Avg]: api_external_contract_js_1.FieldAggregationType.Avg, - [api_internal_contract_js_1.FieldAggregationType.Collect]: api_external_contract_js_1.FieldAggregationType.Collect, - [api_internal_contract_js_1.FieldAggregationType.Count]: api_external_contract_js_1.FieldAggregationType.Count, - [api_internal_contract_js_1.FieldAggregationType.Countd]: api_external_contract_js_1.FieldAggregationType.Countd, - [api_internal_contract_js_1.FieldAggregationType.Day]: api_external_contract_js_1.FieldAggregationType.Day, - [api_internal_contract_js_1.FieldAggregationType.End]: api_external_contract_js_1.FieldAggregationType.End, - [api_internal_contract_js_1.FieldAggregationType.Hour]: api_external_contract_js_1.FieldAggregationType.Hour, - [api_internal_contract_js_1.FieldAggregationType.InOut]: api_external_contract_js_1.FieldAggregationType.InOut, - [api_internal_contract_js_1.FieldAggregationType.Kurtosis]: api_external_contract_js_1.FieldAggregationType.Kurtosis, - [api_internal_contract_js_1.FieldAggregationType.Max]: api_external_contract_js_1.FieldAggregationType.Max, - [api_internal_contract_js_1.FieldAggregationType.Mdy]: api_external_contract_js_1.FieldAggregationType.Mdy, - [api_internal_contract_js_1.FieldAggregationType.Median]: api_external_contract_js_1.FieldAggregationType.Median, - [api_internal_contract_js_1.FieldAggregationType.Min]: api_external_contract_js_1.FieldAggregationType.Min, - [api_internal_contract_js_1.FieldAggregationType.Minute]: api_external_contract_js_1.FieldAggregationType.Minute, - [api_internal_contract_js_1.FieldAggregationType.MonthYear]: api_external_contract_js_1.FieldAggregationType.MonthYear, - [api_internal_contract_js_1.FieldAggregationType.None]: api_external_contract_js_1.FieldAggregationType.None, - [api_internal_contract_js_1.FieldAggregationType.Qtr]: api_external_contract_js_1.FieldAggregationType.Qtr, - [api_internal_contract_js_1.FieldAggregationType.Quart1]: api_external_contract_js_1.FieldAggregationType.Quart1, - [api_internal_contract_js_1.FieldAggregationType.Quart3]: api_external_contract_js_1.FieldAggregationType.Quart3, - [api_internal_contract_js_1.FieldAggregationType.Second]: api_external_contract_js_1.FieldAggregationType.Second, - [api_internal_contract_js_1.FieldAggregationType.Skewness]: api_external_contract_js_1.FieldAggregationType.Skewness, - [api_internal_contract_js_1.FieldAggregationType.Stdev]: api_external_contract_js_1.FieldAggregationType.Stdev, - [api_internal_contract_js_1.FieldAggregationType.Stdevp]: api_external_contract_js_1.FieldAggregationType.Stdevp, - [api_internal_contract_js_1.FieldAggregationType.Sum]: api_external_contract_js_1.FieldAggregationType.Sum, - [api_internal_contract_js_1.FieldAggregationType.TruncDay]: api_external_contract_js_1.FieldAggregationType.TruncDay, - [api_internal_contract_js_1.FieldAggregationType.TruncHour]: api_external_contract_js_1.FieldAggregationType.TruncHour, - [api_internal_contract_js_1.FieldAggregationType.TruncMinute]: api_external_contract_js_1.FieldAggregationType.TruncMinute, - [api_internal_contract_js_1.FieldAggregationType.TruncMonth]: api_external_contract_js_1.FieldAggregationType.TruncMonth, - [api_internal_contract_js_1.FieldAggregationType.TruncQtr]: api_external_contract_js_1.FieldAggregationType.TruncQtr, - [api_internal_contract_js_1.FieldAggregationType.TruncSecond]: api_external_contract_js_1.FieldAggregationType.TruncSecond, - [api_internal_contract_js_1.FieldAggregationType.TruncWeek]: api_external_contract_js_1.FieldAggregationType.TruncWeek, - [api_internal_contract_js_1.FieldAggregationType.TruncYear]: api_external_contract_js_1.FieldAggregationType.TruncYear, - [api_internal_contract_js_1.FieldAggregationType.User]: api_external_contract_js_1.FieldAggregationType.User, - [api_internal_contract_js_1.FieldAggregationType.Var]: api_external_contract_js_1.FieldAggregationType.Var, - [api_internal_contract_js_1.FieldAggregationType.Varp]: api_external_contract_js_1.FieldAggregationType.Varp, - [api_internal_contract_js_1.FieldAggregationType.Week]: api_external_contract_js_1.FieldAggregationType.Week, - [api_internal_contract_js_1.FieldAggregationType.Weekday]: api_external_contract_js_1.FieldAggregationType.Weekday, - [api_internal_contract_js_1.FieldAggregationType.Year]: api_external_contract_js_1.FieldAggregationType.Year, -}); -InternalToExternalEnumMappings.fieldRoleType = new EnumConverter_1.EnumConverter({ - [api_internal_contract_js_1.FieldRoleType.Dimension]: api_external_contract_js_1.FieldRoleType.Dimension, - [api_internal_contract_js_1.FieldRoleType.Measure]: api_external_contract_js_1.FieldRoleType.Measure, - [api_internal_contract_js_1.FieldRoleType.Unknown]: api_external_contract_js_1.FieldRoleType.Unknown, -}); -InternalToExternalEnumMappings.sheetType = new EnumConverter_1.EnumConverter({ - [api_internal_contract_js_1.SheetType.Dashboard]: api_external_contract_js_1.SheetType.Dashboard, - [api_internal_contract_js_1.SheetType.Story]: api_external_contract_js_1.SheetType.Story, - [api_internal_contract_js_1.SheetType.Worksheet]: api_external_contract_js_1.SheetType.Worksheet, -}); -InternalToExternalEnumMappings.dashboardObjectType = new EnumConverter_1.EnumConverter({ - [api_internal_contract_js_1.DashboardObjectType.Extension]: api_external_contract_js_1.DashboardObjectType.Extension, - [api_internal_contract_js_1.DashboardObjectType.Blank]: api_external_contract_js_1.DashboardObjectType.Blank, - [api_internal_contract_js_1.DashboardObjectType.Image]: api_external_contract_js_1.DashboardObjectType.Image, - [api_internal_contract_js_1.DashboardObjectType.Legend]: api_external_contract_js_1.DashboardObjectType.Legend, - [api_internal_contract_js_1.DashboardObjectType.PageFilter]: api_external_contract_js_1.DashboardObjectType.PageFilter, - [api_internal_contract_js_1.DashboardObjectType.ParameterControl]: api_external_contract_js_1.DashboardObjectType.ParameterControl, - [api_internal_contract_js_1.DashboardObjectType.QuickFilter]: api_external_contract_js_1.DashboardObjectType.QuickFilter, - [api_internal_contract_js_1.DashboardObjectType.Text]: api_external_contract_js_1.DashboardObjectType.Text, - [api_internal_contract_js_1.DashboardObjectType.Title]: api_external_contract_js_1.DashboardObjectType.Title, - [api_internal_contract_js_1.DashboardObjectType.WebPage]: api_external_contract_js_1.DashboardObjectType.WebPage, - [api_internal_contract_js_1.DashboardObjectType.Worksheet]: api_external_contract_js_1.DashboardObjectType.Worksheet, -}); -InternalToExternalEnumMappings.dataType = new EnumConverter_1.EnumConverter({ - [api_internal_contract_js_1.DataType.Bool]: api_external_contract_js_1.DataType.Bool, - [api_internal_contract_js_1.DataType.Date]: api_external_contract_js_1.DataType.Date, - [api_internal_contract_js_1.DataType.DateTime]: api_external_contract_js_1.DataType.DateTime, - [api_internal_contract_js_1.DataType.Float]: api_external_contract_js_1.DataType.Float, - [api_internal_contract_js_1.DataType.Int]: api_external_contract_js_1.DataType.Int, - [api_internal_contract_js_1.DataType.Spatial]: api_external_contract_js_1.DataType.Spatial, - [api_internal_contract_js_1.DataType.String]: api_external_contract_js_1.DataType.String, -}); -InternalToExternalEnumMappings.filterUpdateType = new EnumConverter_1.EnumConverter({ - [api_internal_contract_js_1.FilterUpdateType.Add]: api_external_contract_js_1.FilterUpdateType.Add, - [api_internal_contract_js_1.FilterUpdateType.All]: api_external_contract_js_1.FilterUpdateType.All, - [api_internal_contract_js_1.FilterUpdateType.Remove]: api_external_contract_js_1.FilterUpdateType.Remove, - [api_internal_contract_js_1.FilterUpdateType.Replace]: api_external_contract_js_1.FilterUpdateType.Replace, -}); -InternalToExternalEnumMappings.allowableValues = new EnumConverter_1.EnumConverter({ - [api_internal_contract_js_1.DomainRestrictionType.All]: api_external_contract_js_1.ParameterValueType.All, - [api_internal_contract_js_1.DomainRestrictionType.List]: api_external_contract_js_1.ParameterValueType.List, - [api_internal_contract_js_1.DomainRestrictionType.Range]: api_external_contract_js_1.ParameterValueType.Range, -}); -InternalToExternalEnumMappings.dateStepPeriod = new EnumConverter_1.EnumConverter({ - [api_internal_contract_js_1.DateStepPeriod.Years]: api_external_contract_js_1.PeriodType.Years, - [api_internal_contract_js_1.DateStepPeriod.Quarters]: api_external_contract_js_1.PeriodType.Quarters, - [api_internal_contract_js_1.DateStepPeriod.Months]: api_external_contract_js_1.PeriodType.Months, - [api_internal_contract_js_1.DateStepPeriod.Weeks]: api_external_contract_js_1.PeriodType.Weeks, - [api_internal_contract_js_1.DateStepPeriod.Days]: api_external_contract_js_1.PeriodType.Days, - [api_internal_contract_js_1.DateStepPeriod.Hours]: api_external_contract_js_1.PeriodType.Hours, - [api_internal_contract_js_1.DateStepPeriod.Minutes]: api_external_contract_js_1.PeriodType.Minutes, - [api_internal_contract_js_1.DateStepPeriod.Seconds]: api_external_contract_js_1.PeriodType.Seconds, -}); -InternalToExternalEnumMappings.dateRangeType = new EnumConverter_1.EnumConverter({ - [api_internal_contract_js_1.DateRangeType.Current]: api_external_contract_js_1.DateRangeType.Current, - [api_internal_contract_js_1.DateRangeType.Last]: api_external_contract_js_1.DateRangeType.Last, - [api_internal_contract_js_1.DateRangeType.LastN]: api_external_contract_js_1.DateRangeType.LastN, - [api_internal_contract_js_1.DateRangeType.Next]: api_external_contract_js_1.DateRangeType.Next, - [api_internal_contract_js_1.DateRangeType.NextN]: api_external_contract_js_1.DateRangeType.NextN, - [api_internal_contract_js_1.DateRangeType.ToDate]: api_external_contract_js_1.DateRangeType.ToDate, -}); -InternalToExternalEnumMappings.errorCode = new EnumConverter_1.EnumConverter({ - [api_internal_contract_js_1.ErrorCodes.INITIALIZATION_ERROR]: api_external_contract_js_1.ErrorCodes.InternalError, - [api_internal_contract_js_1.ErrorCodes.INTERNAL_ERROR]: api_external_contract_js_1.ErrorCodes.InternalError, - [api_internal_contract_js_1.ErrorCodes.MISSING_ENUM_MAPPING]: api_external_contract_js_1.ErrorCodes.InternalError, - [api_internal_contract_js_1.ErrorCodes.MISSING_PARAMETER]: api_external_contract_js_1.ErrorCodes.InternalError, - [api_internal_contract_js_1.ErrorCodes.PERMISSION_DENIED]: api_external_contract_js_1.ErrorCodes.InternalError, - [api_internal_contract_js_1.ErrorCodes.PRES_MODEL_PARSING_ERROR]: api_external_contract_js_1.ErrorCodes.InternalError, - [api_internal_contract_js_1.ErrorCodes.UNKNOWN_VERB_ID]: api_external_contract_js_1.ErrorCodes.InternalError, - [api_internal_contract_js_1.ErrorCodes.VERSION_NOT_CONFIGURED]: api_external_contract_js_1.ErrorCodes.APINotInitialized, - [api_internal_contract_js_1.ErrorCodes.VISIBILITY_ERROR]: api_external_contract_js_1.ErrorCodes.VisibilityError, -}, api_external_contract_js_1.ErrorCodes.InternalError); -InternalToExternalEnumMappings.filterType = new EnumConverter_1.EnumConverter({ - [api_internal_contract_js_1.FilterType.Categorical]: api_external_contract_js_1.FilterType.Categorical, - [api_internal_contract_js_1.FilterType.Range]: api_external_contract_js_1.FilterType.Range, - [api_internal_contract_js_1.FilterType.RelativeDate]: api_external_contract_js_1.FilterType.RelativeDate, - [api_internal_contract_js_1.FilterType.Hierarchical]: api_external_contract_js_1.FilterType.Hierarchical, -}); -InternalToExternalEnumMappings.classNameKey = new EnumConverter_1.EnumConverter({ - ["tableau-dashboard-title" /* DashboardTitle */]: api_external_contract_js_1.ClassNameKey.DashboardTitle, - ["tableau-story-title" /* StoryTitle */]: api_external_contract_js_1.ClassNameKey.StoryTitle, - ["tableau-tooltip" /* Tooltip */]: api_external_contract_js_1.ClassNameKey.Tooltip, - ["tableau-worksheet" /* Worksheet */]: api_external_contract_js_1.ClassNameKey.Worksheet, - ["tableau-worksheet-title" /* WorksheetTitle */]: api_external_contract_js_1.ClassNameKey.WorksheetTitle, - ["tableau-pane" /* Pane */]: api_external_contract_js_1.ClassNameKey.Pane, - ["tableau-row-dividers" /* RowDividers */]: api_external_contract_js_1.ClassNameKey.RowDividers, - ["tableau-column-dividers" /* ColumnDividers */]: api_external_contract_js_1.ClassNameKey.ColumnDividers, - // Temporary until we fix 1317266 - Platform hasn't been updated currently because near branch is closed - ['dashboard-title']: api_external_contract_js_1.ClassNameKey.DashboardTitle, - ['story-title']: api_external_contract_js_1.ClassNameKey.StoryTitle, - ['tooltip']: api_external_contract_js_1.ClassNameKey.Tooltip, - ['worksheet']: api_external_contract_js_1.ClassNameKey.Worksheet, - ['worksheet-title']: api_external_contract_js_1.ClassNameKey.WorksheetTitle, - ['pane']: api_external_contract_js_1.ClassNameKey.Pane, - ['row-dividers']: api_external_contract_js_1.ClassNameKey.RowDividers, - ['column-dividers']: api_external_contract_js_1.ClassNameKey.ColumnDividers, -}); -InternalToExternalEnumMappings.hierarchicalLevelSelectionState = new EnumConverter_1.EnumConverter({ - [api_internal_contract_js_1.HierarchicalLevelSelectionState.AllSelected]: api_external_contract_js_1.HierarchicalLevelSelectionState.AllSelected, - [api_internal_contract_js_1.HierarchicalLevelSelectionState.NoneSelected]: api_external_contract_js_1.HierarchicalLevelSelectionState.NoneSelected, - [api_internal_contract_js_1.HierarchicalLevelSelectionState.SomeSelected]: api_external_contract_js_1.HierarchicalLevelSelectionState.SomeSelected, - [api_internal_contract_js_1.HierarchicalLevelSelectionState.UnknownSelected]: api_external_contract_js_1.HierarchicalLevelSelectionState.UnknownSelected, -}); -InternalToExternalEnumMappings.annotationType = new EnumConverter_1.EnumConverter({ - [api_internal_contract_js_1.AnnotateEnum.Area]: api_external_contract_js_1.AnnotationType.Area, - [api_internal_contract_js_1.AnnotateEnum.Mark]: api_external_contract_js_1.AnnotationType.Mark, - [api_internal_contract_js_1.AnnotateEnum.Point]: api_external_contract_js_1.AnnotationType.Point, -}); -InternalToExternalEnumMappings.markType = new EnumConverter_1.EnumConverter({ - [api_internal_contract_js_1.MarkType.Area]: api_external_contract_js_1.MarkType.Area, - [api_internal_contract_js_1.MarkType.Bar]: api_external_contract_js_1.MarkType.Bar, - [api_internal_contract_js_1.MarkType.Circle]: api_external_contract_js_1.MarkType.Circle, - [api_internal_contract_js_1.MarkType.GanttBar]: api_external_contract_js_1.MarkType.GanttBar, - [api_internal_contract_js_1.MarkType.Heatmap]: api_external_contract_js_1.MarkType.Heatmap, - [api_internal_contract_js_1.MarkType.Line]: api_external_contract_js_1.MarkType.Line, - [api_internal_contract_js_1.MarkType.Map]: api_external_contract_js_1.MarkType.Map, - [api_internal_contract_js_1.MarkType.Pie]: api_external_contract_js_1.MarkType.Pie, - [api_internal_contract_js_1.MarkType.Polygon]: api_external_contract_js_1.MarkType.Polygon, - [api_internal_contract_js_1.MarkType.Shape]: api_external_contract_js_1.MarkType.Shape, - [api_internal_contract_js_1.MarkType.Square]: api_external_contract_js_1.MarkType.Square, - [api_internal_contract_js_1.MarkType.Text]: api_external_contract_js_1.MarkType.Text, - [api_internal_contract_js_1.MarkType.VizExtension]: api_external_contract_js_1.MarkType.VizExtension, -}); -/* tslint:enable:typedef */ - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/EventListenerManager.js": -/*!******************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/EventListenerManager.js ***! - \******************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -const TableauError_1 = __webpack_require__(/*! ./TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); -/** - * Class designed to register and unregister handlers from a user. Only those events - * which are added via AddNewEventType will be supported by this instance - */ -class EventListenerManager { - constructor() { - this._eventListenerManagers = {}; - } - addEventListener(eventType, handler) { - if (!this._eventListenerManagers.hasOwnProperty(eventType)) { - throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.UnsupportedEventName, `Cannot add event, unsupported event type: ${eventType}`); - } - return this._eventListenerManagers[eventType].addEventListener(handler); - } - removeEventListener(eventType, handler) { - if (!this._eventListenerManagers.hasOwnProperty(eventType)) { - throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.UnsupportedEventName, `Cannot remove event, unsupported event type: ${eventType}`); - } - return this._eventListenerManagers[eventType].removeEventListener(handler); - } - addNewEventType(eventManager) { - this._eventListenerManagers[eventManager.eventType] = eventManager; - } -} -exports.EventListenerManager = EventListenerManager; - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/Field.js": -/*!***************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Field.js ***! - \***************************************************/ -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -class Field { - constructor(_fieldImpl) { - this._fieldImpl = _fieldImpl; - } - get name() { - return this._fieldImpl.name; - } - get id() { - return this._fieldImpl.id; - } - get description() { - return this._fieldImpl.description; - } - get dataType() { - return this._fieldImpl.dataType; - } - get aggregation() { - return this._fieldImpl.aggregation; - } - get dataSource() { - return this._fieldImpl.dataSource; - } - get role() { - return this._fieldImpl.role; - } - get columnType() { - return this._fieldImpl.columnType; - } - get isCalculatedField() { - return this._fieldImpl.isCalculatedField; - } - get isCombinedField() { - return this._fieldImpl.isCombinedField; - } - get isGenerated() { - return this._fieldImpl.isGenerated; - } - get isGeospatial() { - return this._fieldImpl.isGeospatial; - } - get isHidden() { - return this._fieldImpl.isHidden; - } - get isPresentOnPublishedDatasource() { - return this._fieldImpl.isPresentOnPublishedDatasource; - } -} -exports.Field = Field; - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/Impl/CustomViewImpl.js": -/*!*****************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Impl/CustomViewImpl.js ***! - \*****************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const ApiShared_1 = __webpack_require__(/*! ../../ApiShared */ "../api-shared-js/lib/src/ApiShared.js"); -class CustomViewImpl { - constructor(customViewModel, _registryId) { - this._registryId = _registryId; - this._luid = customViewModel.luid; - this._name = customViewModel.name; - this._shared = customViewModel.shared; - this._isDefault = customViewModel.isDefault; - this._ownerName = customViewModel.owner.userFriendlyName; - this._url = customViewModel.url; - } - get luid() { - return this._luid; - } - get name() { - return this._name; - } - set name(name) { - this._name = name; - } - get shared() { - return this._shared; - } - set shared(shared) { - this._shared = shared; - } - get isDefault() { - return this._isDefault; - } - set isDefault(isDefault) { - this._isDefault = isDefault; - } - get ownerName() { - return this._ownerName; - } - get url() { - return this._url; - } - saveAsync() { - const service = ApiShared_1.ApiServiceRegistry.get(this._registryId).getService("viz-service" /* Viz */); - return service.saveAsync(this); - } -} -exports.CustomViewImpl = CustomViewImpl; - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/Impl/DashboardImpl.js": -/*!****************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Impl/DashboardImpl.js ***! - \****************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -const InternalToExternalEnumMappings_1 = __webpack_require__(/*! ../EnumMappings/InternalToExternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js"); -const Point_1 = __webpack_require__(/*! ../Point */ "../api-shared-js/lib/src/ApiShared/Point.js"); -const ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); -const TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); -const ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); -const DashboardObjectImpl_1 = __webpack_require__(/*! ./DashboardObjectImpl */ "../api-shared-js/lib/src/ApiShared/Impl/DashboardObjectImpl.js"); -const SheetImpl_1 = __webpack_require__(/*! ./SheetImpl */ "../api-shared-js/lib/src/ApiShared/Impl/SheetImpl.js"); -const SheetInfoImpl_1 = __webpack_require__(/*! ./SheetInfoImpl */ "../api-shared-js/lib/src/ApiShared/Impl/SheetInfoImpl.js"); -const WorksheetImpl_1 = __webpack_require__(/*! ./WorksheetImpl */ "../api-shared-js/lib/src/ApiShared/Impl/WorksheetImpl.js"); -class DashboardImpl extends SheetImpl_1.SheetImpl { - constructor(_sheetInfo, _zones, _sheetPath, _registryId, _parentStoryPointImpl, _activeDashboardObjectId = 0) { - super(_sheetInfo, _registryId); - this._zones = _zones; - this._sheetPath = _sheetPath; - this._parentStoryPointImpl = _parentStoryPointImpl; - this._activeDashboardObjectId = _activeDashboardObjectId; - } - get worksheetsImpl() { - return this._worksheetsImpl; - } - get objects() { - return this._objects; - } - get parentStoryPoint() { - return this._parentStoryPointImpl; - } - get activeDashboardObjectId() { - return this._activeDashboardObjectId; - } - get activeDashboardName() { - return this._sheetPath.sheetName; - } - initializeWithPublicInterfaces() { - this._worksheetsImpl = new Array(); - this._objects = new Array(); - this.zoneMap = new Map(); - // Process all the zones which are contained in this dashboard - for (const zone of this._zones) { - let worksheetImpl = undefined; - const zoneSize = { width: zone.width, height: zone.height }; - // As the dashboard is active, all other zones in the dashboard are inactive. - const isActive = false; - if (zone.zoneType === api_internal_contract_js_1.DashboardObjectType.Worksheet || zone.zoneType === api_internal_contract_js_1.DashboardObjectType.QuickFilter) { - let worksheetName = ''; - let worksheetUrl = ''; - let isHidden = false; - if (zone.sheetInfo) { - // zone.sheetInfo was not initialized prior to internal-contract 1.6.0 - worksheetName = zone.sheetInfo.name; - // worksheetUrl & isHidden is for Embedding only - worksheetUrl = zone.sheetInfo.url || ''; - // If there's a url, then it's not hidden - isHidden = worksheetUrl === ''; - } - else { - worksheetName = zone.name; - } - // Indexes, isActive and some more properties in sheetInfoImpl are embedding specific. - // But we init them for both extensions and embedding as the Models will only use what is relevant. - const sheetInfoImpl = new SheetInfoImpl_1.SheetInfoImpl(worksheetName, api_external_contract_js_1.SheetType.Worksheet, zoneSize, this._worksheetsImpl.length, isActive, isHidden, worksheetUrl); - const vizId = { - worksheet: worksheetName, - dashboard: this._sheetInfoImpl.name, - storyboard: this._sheetPath.storyboard, - flipboardZoneID: this._sheetPath.flipboardZoneID, - storyPointID: this._sheetPath.storyPointID, - }; - worksheetImpl = new WorksheetImpl_1.WorksheetImpl(sheetInfoImpl, this._registryId, vizId, this, this._parentStoryPointImpl); - if (zone.zoneType === api_internal_contract_js_1.DashboardObjectType.Worksheet) { - this._worksheetsImpl.push(worksheetImpl); - } - } - const zonePoint = new Point_1.Point(zone.x, zone.y); - const dashboardObjectImpl = new DashboardObjectImpl_1.DashboardObjectImpl(this, InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.dashboardObjectType.convert(zone.zoneType), zonePoint, zoneSize, worksheetImpl, zone.name, zone.isFloating !== undefined ? zone.isFloating : false, // before 1.6.0 we didn't have isFloating, so we assume false - zone.isVisible !== undefined ? zone.isVisible : true, // before 1.6.0 we didn't have isVisible, so we assume true - zone.zoneId, zone.fieldId); - this._objects.push(dashboardObjectImpl); - this.zoneMap.set(zone.zoneId, dashboardObjectImpl); - } - } - setDashboardObjectVisibilityAsync(dashboardObjectVisibilityMap) { - const zoneService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("zone-service" /* Zone */); - return zoneService.setVisibilityAsync(/*Dashboard Name*/ this.name, this.zoneMap, dashboardObjectVisibilityMap); - } - getDashboardObjectById(dashboardObjectId) { - return this.zoneMap.get(dashboardObjectId); - } - updateZones(newZones, newActiveZoneId = 0, newActiveDashboardName = '') { - // getting previous dashboard objects, active zone ID and active dashboard name - const oldDashboardObjects = this._objects; - const oldZoneMap = this.zoneMap; - const oldActiveZoneId = this._activeDashboardObjectId; - const oldActiveDashboardName = this._sheetPath.sheetName; - // updating zones and reinitializing instance variables - this._zones = newZones; - this._activeDashboardObjectId = newActiveZoneId; - if (newActiveDashboardName) { - this._sheetPath.sheetName = newActiveDashboardName; - this._sheetInfoImpl.name = newActiveDashboardName; - } - this.initializeWithPublicInterfaces(); - // getting new dashboard objects - const newDashboardObjects = this._objects; - const newZoneMap = this.zoneMap; - // initializing map for changes - const zoneChanges = new Map(); - // comparing old dashboard objects with new ones - oldDashboardObjects.forEach((oldObject) => { - const oldId = oldObject.id; - // checking if zone was removed - if (!newZoneMap.has(oldId)) { - this.addChange(oldId, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.Removed); - return; - } - const newObject = newZoneMap.get(oldId); - if (oldObject.isFloating !== newObject.isFloating) { - this.addChange(oldId, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.IsFloatingChanged); - } - if (oldObject.isVisible !== newObject.isVisible) { - this.addChange(oldId, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.IsVisibleChanged); - } - if (oldObject.name !== newObject.name) { - this.addChange(oldId, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.NameChanged); - } - if (oldObject.position.x !== newObject.position.x || oldObject.position.y !== newObject.position.y) { - this.addChange(oldId, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.PositionChanged); - } - if (oldObject.size.width !== newObject.size.width || oldObject.size.height !== newObject.size.height) { - this.addChange(oldId, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.SizeChanged); - } - }); - // Checking for any added zones - newDashboardObjects.forEach((newObject) => { - if (!oldZoneMap.has(newObject.id)) { - this.addChange(newObject.id, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.Added); - } - }); - // Checking if zone selection has changed - if (oldActiveZoneId !== newActiveZoneId) { - if (newActiveZoneId !== 0) { - this.addChange(newActiveZoneId, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.Selected); - } - if (oldActiveZoneId !== 0) { - this.addChange(oldActiveZoneId, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.Deselected); - } - } - // Checking if switched to another dashboard - if (newActiveDashboardName && oldActiveDashboardName !== newActiveDashboardName) { - this.addChange(0, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.DashboardChanged); - } - return zoneChanges; - } - addChange(zoneId, zoneChanges, change) { - if (!zoneChanges.has(zoneId)) { - zoneChanges.set(zoneId, []); - } - zoneChanges.get(zoneId).push(change); - } - moveAndResizeDashboardObjectsAsync(dashboardObjectPositionAndSizeUpdateArray) { - const zoneService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("zone-service" /* Zone */); - return zoneService.moveAndResizeAsync(/*Dashboard Name*/ this.name, this.zoneMap, dashboardObjectPositionAndSizeUpdateArray); - } - replayAnimationAsync(replaySpeed) { - const animationService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("animation-service" /* Animation */); - return animationService.replayAsync(replaySpeed); - } - getFiltersAsync() { - this.verifyActiveSheetOrEmbeddedInActiveStoryPoint(); - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); - return service.getDashboardFiltersAsync(); - } - applyFilterAsync(fieldName, values, updateType, options) { - ErrorHelpers_1.ErrorHelpers.verifyEnumValue(updateType, Contract.FilterUpdateType, 'FilterUpdateType'); - ErrorHelpers_1.ErrorHelpers.verifyStringParameter(fieldName, 'fieldName'); - if (!Array.isArray(values)) { - throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, 'values parameter for applyDashboardFilterAsync must be an array'); - } - this.verifyActiveSheetOrEmbeddedInActiveStoryPoint(); - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); - return service.applyDashboardFilterAsync(fieldName, values, updateType, options); - } - // @W-12986439: remove once initializeWithPublicInterfaces is moved to the constructor for this class - // This method only exists since worksheetsImpl can be undefined, but we need the worksheet names in the Export APIs - getWorksheetNamesFromZones() { - const worksheetNames = []; - for (const zone of this._zones) { - if (zone.zoneType !== api_internal_contract_js_1.DashboardObjectType.Worksheet) { - continue; - } - // zone.sheetInfo was not initialized prior to internal-contract 1.6.0 - const worksheetName = zone.sheetInfo ? zone.sheetInfo.name : zone.name; - worksheetNames.push(worksheetName); - } - return worksheetNames; - } - verifyActiveSheetOrEmbeddedInActiveStoryPoint() { - const isRootAndActiveDashboard = this.active; - const isWithinActiveStoryPoint = this.parentStoryPoint != null && this.parentStoryPoint.active; - if (!isRootAndActiveDashboard && !isWithinActiveStoryPoint) { - throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.NotActiveSheet, 'Operation not allowed on non-active sheet'); - } - } -} -exports.DashboardImpl = DashboardImpl; - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/Impl/DashboardObjectImpl.js": -/*!**********************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Impl/DashboardObjectImpl.js ***! - \**********************************************************************/ -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -/** - * Implementation of the dashboard objects - the zones in a dashboard. - * This does not follow the Impl pattern as it is just a property bag. - */ -class DashboardObjectImpl { - constructor(_dashboardImpl, _type, _position, _size, _worksheetImpl, _name, _isFloating, _isVisible, _id, _fieldId) { - this._dashboardImpl = _dashboardImpl; - this._type = _type; - this._position = _position; - this._size = _size; - this._worksheetImpl = _worksheetImpl; - this._name = _name; - this._isFloating = _isFloating; - this._isVisible = _isVisible; - this._id = _id; - this._fieldId = _fieldId; - } - get dashboardImpl() { - return this._dashboardImpl; - } - get type() { - return this._type; - } - get position() { - return this._position; - } - get size() { - return this._size; - } - get worksheetImpl() { - return this._worksheetImpl; - } - get name() { - return this._name; - } - get isFloating() { - return this._isFloating; - } - get isVisible() { - return this._isVisible; - } - get id() { - return this._id; - } - get fieldId() { - return this._fieldId; - } -} -exports.DashboardObjectImpl = DashboardObjectImpl; - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/Impl/DataSourceImpl.js": -/*!*****************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Impl/DataSourceImpl.js ***! - \*****************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -const ConnectionSummary_1 = __webpack_require__(/*! ../ConnectionSummary */ "../api-shared-js/lib/src/ApiShared/ConnectionSummary.js"); -const Field_1 = __webpack_require__(/*! ../Field */ "../api-shared-js/lib/src/ApiShared/Field.js"); -const LogicalTable_1 = __webpack_require__(/*! ../LogicalTable */ "../api-shared-js/lib/src/ApiShared/LogicalTable.js"); -const ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); -const TableSummary_1 = __webpack_require__(/*! ../TableSummary */ "../api-shared-js/lib/src/ApiShared/TableSummary.js"); -const ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); -const FieldImpl_1 = __webpack_require__(/*! ./FieldImpl */ "../api-shared-js/lib/src/ApiShared/Impl/FieldImpl.js"); -class DataSourceImpl { - constructor(_dataSourceInfo, _registryId) { - this._dataSourceInfo = _dataSourceInfo; - this._registryId = _registryId; - this._fields = _dataSourceInfo.fields.map((fieldModel) => { - const fieldImpl = new FieldImpl_1.FieldImpl(fieldModel, this); - return new Field_1.Field(fieldImpl); - }); - } - get name() { - return this._dataSourceInfo.name; - } - get id() { - return this._dataSourceInfo.id; - } - get extractUpdateTime() { - return this._dataSourceInfo.extractUpdateTime; - } - get fields() { - return this._fields; - } - get isExtract() { - return this._dataSourceInfo.isExtract; - } - get isPublished() { - return this._dataSourceInfo.isPublished; - } - publishedUrl() { - return this._dataSourceInfo.publishedUrl; - } - getMaxPageRowLimit() { - return 10000; - } - refreshAsync() { - const dataSourceService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */); - return dataSourceService.refreshAsync(this._dataSourceInfo.id); - } - getConnectionSummariesAsync() { - const dataSourceService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */); - return dataSourceService.getConnectionSummariesAsync(this._dataSourceInfo.id).then((summaries) => { - return summaries.map((summary) => new ConnectionSummary_1.ConnectionSummary(summary)); - }); - } - getActiveTablesAsync() { - const dataSourceService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */); - return dataSourceService.getActiveTablesAsync(this._dataSourceInfo.id).then((tableInfos) => { - return tableInfos.map((tableInfo) => new TableSummary_1.TableSummary(tableInfo)); - }); - } - getUnderlyingDataAsync(options) { - const getDataService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); - options = options || {}; - return getDataService.getDataSourceDataAsync(this.id, !!options.ignoreAliases, options.maxRows || 0, // 0 and [] are defaults - options.columnsToInclude || [], options.columnsToIncludeById || [], options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues); - } - getLogicalTableDataAsync(logicalTableId, options) { - const getDataService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); - options = options || {}; - return getDataService.getLogicalTableDataAsync(this.id, logicalTableId, !!options.ignoreAliases, options.maxRows || 0, // 0 and [] are defaults - options.columnsToInclude || [], options.columnsToIncludeById || [], options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues); - } - getLogicalTableDataReaderAsync(logicalTableId, pageRowCount, options) { - const getDataService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); - options = options || {}; - return getDataService.getLogicalTableDataReaderAsync(this.id, logicalTableId, pageRowCount || this.getMaxPageRowLimit(), !!options.ignoreAliases, options.columnsToIncludeById || [], options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues); - } - initializeWithPublicInterfaces(dataSource) { - ErrorHelpers_1.ErrorHelpers.verifyInternalValue(dataSource, 'dataSource'); - this._fields = this._dataSourceInfo.fields.map((fieldModel) => { - const fieldImpl = new FieldImpl_1.FieldImpl(fieldModel, dataSource); - return new Field_1.Field(fieldImpl); - }); - } - getLogicalTablesAsync() { - const dataSourceService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */); - return dataSourceService.getLogicalTablesAsync(this.id).then((logicalTableInfos) => { - return logicalTableInfos.map((logicalTableInfo) => new LogicalTable_1.LogicalTable(logicalTableInfo)); - }); - } -} -exports.DataSourceImpl = DataSourceImpl; - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/Impl/FieldImpl.js": -/*!************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Impl/FieldImpl.js ***! - \************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -const InternalContract = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -const InternalToExternalEnumMappings_1 = __webpack_require__(/*! ../EnumMappings/InternalToExternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js"); -class FieldImpl { - constructor(_fieldInfo, _parentDataSource) { - this._fieldInfo = _fieldInfo; - this._parentDataSource = _parentDataSource; - } - get name() { - return this._fieldInfo.name; - } - get id() { - return this._fieldInfo.id; - } - get description() { - return this._fieldInfo.description; - } - get dataType() { - var _a; - return _a = this._fieldInfo.dataType, (_a !== null && _a !== void 0 ? _a : Contract.DataType.Unknown); - } - get aggregation() { - return InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.fieldAggregationType.convert(this._fieldInfo.aggregation); - } - get dataSource() { - if (!this._parentDataSource) - throw new Error(`Data source information is not available for this field. Please use getFieldAsync method to get field's data source information`); - return this._parentDataSource; - } - get role() { - return InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.fieldRoleType.convert(this._fieldInfo.role); - } - get columnType() { - let definedValue = this._fieldInfo.columnType || InternalContract.ColumnType.Unknown; - return InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.columnType.convert(definedValue); - } - get isCalculatedField() { - return this._fieldInfo.isCalculatedField; - } - get isCombinedField() { - return this._fieldInfo.isCombinedField; - } - get isGenerated() { - return this._fieldInfo.isGenerated; - } - get isGeospatial() { - return this._fieldInfo.isGeospatial; - } - get isHidden() { - return this._fieldInfo.isHidden; - } - get isPresentOnPublishedDatasource() { - return this._fieldInfo.isPresentOnPublishedDatasource; - } -} -exports.FieldImpl = FieldImpl; - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/Impl/ParameterImpl.js": -/*!****************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Impl/ParameterImpl.js ***! - \****************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -const InternalToExternalEnumMappings_1 = __webpack_require__(/*! ../EnumMappings/InternalToExternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js"); -const ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); -const DataValueFactory_1 = __webpack_require__(/*! ../Utils/DataValueFactory */ "../api-shared-js/lib/src/ApiShared/Utils/DataValueFactory.js"); -const ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); -const Param_1 = __webpack_require__(/*! ../Utils/Param */ "../api-shared-js/lib/src/ApiShared/Utils/Param.js"); -class ParameterImpl { - constructor(parameterInfo, _registryId) { - this._registryId = _registryId; - this.setParameterInfo(parameterInfo); - } - get name() { - return this._parameterInfo.name; - } - get currentValue() { - return DataValueFactory_1.DataValueFactory.MakeParameterDataValue(this._parameterInfo.currentValue, this._parameterInfo.dataType); - } - get dataType() { - return InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.dataType.convert(this._parameterInfo.dataType); - } - get id() { - return this._globalFieldName; - } - get allowableValues() { - return this._allowableValues; - } - changeValueAsync(newValue) { - ErrorHelpers_1.ErrorHelpers.verifyParameter(newValue, 'newValue'); - const coercedValue = Param_1.Param.serializeParameterValue(newValue); - const parametersService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("parameters-service" /* Parameters */); - return parametersService.changeParameterValueAsync(this._globalFieldName, coercedValue).then((parameterInfo) => { - this.setParameterInfo(parameterInfo); - return this.currentValue; - }); - } - setParameterInfo(parameterInfo) { - this._parameterInfo = parameterInfo; - this._globalFieldName = parameterInfo.fieldName; - const type = InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.allowableValues.convert(parameterInfo.allowableValuesType); - let listValues; - let minValue; - let maxValue; - let stepSize; - let dateStepPeriod; - if (type === api_external_contract_js_1.ParameterValueType.List) { - const values = parameterInfo.allowableValues || []; - listValues = values.map((val) => DataValueFactory_1.DataValueFactory.MakeParameterDataValue(val, parameterInfo.dataType)); - } - else if (type === api_external_contract_js_1.ParameterValueType.Range) { - minValue = parameterInfo.minValue && DataValueFactory_1.DataValueFactory.MakeParameterDataValue(parameterInfo.minValue, parameterInfo.dataType); - maxValue = parameterInfo.maxValue && DataValueFactory_1.DataValueFactory.MakeParameterDataValue(parameterInfo.maxValue, parameterInfo.dataType); - stepSize = parameterInfo.stepSize; - dateStepPeriod = parameterInfo.dateStepPeriod && InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.dateStepPeriod.convert(parameterInfo.dateStepPeriod); - } - this._allowableValues = { - type: type, - allowableValues: listValues, - minValue: minValue, - maxValue: maxValue, - stepSize: stepSize, - dateStepPeriod: dateStepPeriod, - }; - } -} -exports.ParameterImpl = ParameterImpl; - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/Impl/SheetImpl.js": -/*!************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Impl/SheetImpl.js ***! - \************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -const ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); -const TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); -const ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); -const Param_1 = __webpack_require__(/*! ../Utils/Param */ "../api-shared-js/lib/src/ApiShared/Utils/Param.js"); -const SheetUtils_1 = __webpack_require__(/*! ../Utils/SheetUtils */ "../api-shared-js/lib/src/ApiShared/Utils/SheetUtils.js"); -class SheetImpl { - constructor(_sheetInfoImpl, _registryId) { - this._sheetInfoImpl = _sheetInfoImpl; - this._registryId = _registryId; - } - get name() { - return this._sheetInfoImpl.name; - } - get sheetType() { - return this._sheetInfoImpl.sheetType; - } - get sheetPath() { - return this._sheetInfoImpl.sheetPath; - } - get size() { - return this._sheetInfoImpl.sheetSize; - } - get hidden() { - if (this._sheetInfoImpl.isHidden !== undefined) { - return this._sheetInfoImpl.isHidden; - } - throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.ImplementationError, `isHidden not implemented`); - } - get active() { - if (this._sheetInfoImpl.isActive !== undefined) { - return this._sheetInfoImpl.isActive; - } - throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.ImplementationError, `active not implemented`); - } - set active(active) { - if (this._sheetInfoImpl.isActive !== undefined) { - this._sheetInfoImpl.active = active; - } - } - get index() { - if (this._sheetInfoImpl.index !== undefined) { - return this._sheetInfoImpl.index; - } - throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.ImplementationError, `index not implemented`); - } - get url() { - if (this._sheetInfoImpl.url !== undefined) { - return this._sheetInfoImpl.url; - } - throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.ImplementationError, `url not implemented`); - } - getSheetSize() { - if (!SheetUtils_1.SheetUtils.isValidSheetSize(this.size)) { - throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.InternalError, 'size is not of type SheetSize'); - } - return this.size; - } - findParameterAsync(parameterName) { - ErrorHelpers_1.ErrorHelpers.verifyParameter(parameterName, 'parameterName'); - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("parameters-service" /* Parameters */); - return service.findParameterByNameAsync(parameterName); - } - getParametersAsync() { - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("parameters-service" /* Parameters */); - return service.getParametersForSheetAsync(this.sheetPath); - } - changeSizeAsync(newSize) { - const invalidSizeError = new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.InvalidSize, 'Invalid sheet size parameter'); - if (!newSize || !newSize.behavior) { - throw invalidSizeError; - } - const partialSheetSize = this.normalizeSheetSize(newSize); - const isAutomatic = partialSheetSize.behavior === Contract.SheetSizeBehavior.Automatic; - if (!isAutomatic && !partialSheetSize.minSize && !partialSheetSize.maxSize) { - throw invalidSizeError; - } - if (!isAutomatic && this.sheetType === Contract.SheetType.Worksheet) { - throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.InvalidSizeBehaviorOnWorksheet, 'Only SheetSizeBehavior.Automatic is allowed on Worksheets'); - } - if (isAutomatic && this.getSheetSize().behavior === partialSheetSize.behavior) { - return Promise.resolve(newSize); - } - const processedNewSize = this.processNewSize(partialSheetSize); - const sizeService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("size-service" /* Size */); - return sizeService.changeSizeAsync(this.name, processedNewSize).then(() => { - const clientInfoService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("client-info-service" /* ClientInfo */); - return clientInfoService.getClientInfoAsync().then((bootstrapInfo) => { - const sheet = bootstrapInfo.publishedSheets.find((s) => s.name === this.name); - if (!sheet) { - throw new TableauError_1.TableauError(Contract.SharedErrorCodes.InternalError, `Can't find sheet with name ${this.name}`); - } - const sheetSize = SheetUtils_1.SheetUtils.getSheetSizeFromSizeConstraints(sheet.sizeConstraint); - this._sheetInfoImpl.sheetSize = sheetSize; - return sheetSize; - }); - }); - } - normalizeSheetSize(newSize) { - const { behavior } = newSize; - ErrorHelpers_1.ErrorHelpers.verifyEnumValue(behavior, Contract.SheetSizeBehavior, 'SheetSizeBehavior'); - const minSize = SheetImpl.parseDimensions(newSize.minSize); - const maxSize = SheetImpl.parseDimensions(newSize.maxSize); - return { behavior, minSize, maxSize }; - } - processNewSize(newSize) { - var _a, _b, _c, _d; - const { behavior, minSize: minSizeMaybe, maxSize: maxSizeMaybe } = newSize; - const hasMinWidth = !Param_1.Param.isNullOrUndefined((_a = minSizeMaybe) === null || _a === void 0 ? void 0 : _a.width); - const hasMinHeight = !Param_1.Param.isNullOrUndefined((_b = minSizeMaybe) === null || _b === void 0 ? void 0 : _b.height); - const hasMaxWidth = !Param_1.Param.isNullOrUndefined((_c = maxSizeMaybe) === null || _c === void 0 ? void 0 : _c.width); - const hasMaxHeight = !Param_1.Param.isNullOrUndefined((_d = maxSizeMaybe) === null || _d === void 0 ? void 0 : _d.height); - const hasValidMinSize = hasMinWidth && hasMinHeight; - const hasValidMaxSize = hasMaxWidth && hasMaxHeight; - switch (behavior) { - case Contract.SheetSizeBehavior.Automatic: { - return { behavior }; - } - case Contract.SheetSizeBehavior.AtMost: { - if (!maxSizeMaybe || !hasValidMaxSize) { - throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.MissingMaxSize, 'Missing maxSize for SheetSizeBehavior.AtMost'); - } - const maxSize = { width: maxSizeMaybe.width, height: maxSizeMaybe.height }; - if (maxSize.width < 0 || maxSize.height < 0) { - throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.InvalidSize, 'Size value cannot be less than zero'); - } - return { behavior, maxSize }; - } - case Contract.SheetSizeBehavior.AtLeast: { - if (!minSizeMaybe || !hasValidMinSize) { - throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.MissingMinSize, 'Missing minSize for SheetSizeBehavior.AtLeast'); - } - const minSize = { width: minSizeMaybe.width, height: minSizeMaybe.height }; - if (minSize.width < 0 || minSize.height < 0) { - throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.InvalidSize, 'Size value cannot be less than zero'); - } - return { behavior, minSize }; - } - case Contract.SheetSizeBehavior.Range: { - if (!minSizeMaybe || !maxSizeMaybe || !hasValidMinSize || !hasValidMaxSize) { - throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.MissingMinMaxSize, 'Missing minSize or maxSize for SheetSizeBehavior.Range'); - } - const minSize = { width: minSizeMaybe.width, height: minSizeMaybe.height }; - const maxSize = { width: maxSizeMaybe.width, height: maxSizeMaybe.height }; - if (minSize.width < 0 || - minSize.height < 0 || - maxSize.width < 0 || - maxSize.height < 0 || - minSize.width > maxSize.width || - minSize.height > maxSize.height) { - throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.InvalidSize, 'Missing minSize or maxSize for SheetSizeBehavior.Range'); - } - return { behavior, minSize, maxSize }; - } - case Contract.SheetSizeBehavior.Exactly: { - if (minSizeMaybe && maxSizeMaybe) { - if (hasValidMinSize && hasValidMaxSize) { - const minSize = { width: minSizeMaybe.width, height: minSizeMaybe.height }; - const maxSize = { width: maxSizeMaybe.width, height: maxSizeMaybe.height }; - if (minSize.width !== maxSize.width || minSize.height !== maxSize.height) { - throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.InvalidSize, 'Conflicting size values for SheetSizeBehavior.Exactly'); - } - return { behavior, minSize, maxSize }; - } - if (hasValidMinSize) { - const minSize = { width: minSizeMaybe.width, height: minSizeMaybe.height }; - return { behavior, minSize, maxSize: minSize }; - } - if (hasValidMaxSize) { - const maxSize = { width: maxSizeMaybe.width, height: maxSizeMaybe.height }; - return { behavior, minSize: maxSize, maxSize }; - } - } - throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.InvalidSize, 'Invalid sheet size parameter'); - } - default: { - throw new TableauError_1.TableauError(Contract.SharedErrorCodes.InternalError, `Unsupported sheet size behavior: ${behavior}`); - } - } - } -} -exports.SheetImpl = SheetImpl; -SheetImpl.parseDimensions = (size) => { - const empty = { width: undefined, height: undefined }; - if (!size) { - return empty; - } - const { success: widthParsed, parsed: parsedWidth } = Param_1.Param.tryParseNumber(size.width); - const { success: heightParsed, parsed: parsedHeight } = Param_1.Param.tryParseNumber(size.height); - if (widthParsed && heightParsed) { - return { width: parsedWidth, height: parsedHeight }; - } - if (widthParsed) { - return { width: parsedWidth }; - } - if (heightParsed) { - return { height: parsedHeight }; - } - return empty; -}; - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/Impl/SheetInfoImpl.js": -/*!****************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Impl/SheetInfoImpl.js ***! - \****************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -class SheetInfoImpl { - constructor(_name, _sheetType, _sheetSize, _index, _isActive, _isHidden, _url) { - this._name = _name; - this._sheetType = _sheetType; - this._sheetSize = _sheetSize; - this._index = _index; - this._isActive = _isActive; - this._isHidden = _isHidden; - this._url = _url; - } - get name() { - return this._name; - } - set name(sheetName) { - this._name = sheetName; - } - get sheetSize() { - return this._sheetSize; - } - set sheetSize(value) { - this._sheetSize = value; - } - get sheetType() { - return this._sheetType; - } - get sheetPath() { - return { - sheetName: this.name, - isDashboard: this.sheetType === api_external_contract_js_1.SheetType.Dashboard, - }; - } - get index() { - return this._index; - } - get isActive() { - return this._isActive; - } - set active(active) { - this._isActive = active; - } - get isHidden() { - return this._isHidden; - } - get url() { - return this._url; - } -} -exports.SheetInfoImpl = SheetInfoImpl; - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/Impl/SingleEventManagerImpl.js": -/*!*************************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Impl/SingleEventManagerImpl.js ***! - \*************************************************************************/ -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -/** - * This class implements the SingleEventManager interface for a single type of Tableau event - * - * @template TEventType The Tableau event type this class specializes - */ -class SingleEventManagerImpl { - constructor(eventType) { - this._eventType = eventType; - this._handlers = []; - } - get eventType() { - return this._eventType; - } - addEventListener(handler) { - this._handlers.push(handler); - return () => this.removeEventListener(handler); - } - removeEventListener(handler) { - const beforeCount = this._handlers.length; - this._handlers = this._handlers.filter((h) => h !== handler); - return beforeCount > this._handlers.length; - } - triggerEvent(eventGenerator) { - for (const handler of this._handlers) { - try { - const eventModel = eventGenerator(); - handler(eventModel); - } - catch (e) { - // Since this handler could be outside our control, just catch anything it throws and continue on - continue; - } - } - } -} -exports.SingleEventManagerImpl = SingleEventManagerImpl; - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/Impl/StoryImpl.js": -/*!************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Impl/StoryImpl.js ***! - \************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -const ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); -const TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); -const ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); -const ShortLivedDeferred_1 = __webpack_require__(/*! ../Utils/ShortLivedDeferred */ "../api-shared-js/lib/src/ApiShared/Utils/ShortLivedDeferred.js"); -const SheetImpl_1 = __webpack_require__(/*! ./SheetImpl */ "../api-shared-js/lib/src/ApiShared/Impl/SheetImpl.js"); -const StoryPointImpl_1 = __webpack_require__(/*! ./StoryPointImpl */ "../api-shared-js/lib/src/ApiShared/Impl/StoryPointImpl.js"); -const StoryPointInfoImpl_1 = __webpack_require__(/*! ./StoryPointInfoImpl */ "../api-shared-js/lib/src/ApiShared/Impl/StoryPointInfoImpl.js"); -class StoryImpl extends SheetImpl_1.SheetImpl { - constructor(_sheetInfoImpl, storyModel, _publishedSheetInfos, _registryId) { - super(_sheetInfoImpl, _registryId); - this._sheetInfoImpl = _sheetInfoImpl; - this._publishedSheetInfos = _publishedSheetInfos; - this._registryId = _registryId; - this._storyPointInfoImpls = []; - this._deferred = new ShortLivedDeferred_1.ShortLivedDeferred(); - this.initializeStory(storyModel); - } - initializeStory(storyModel) { - storyModel.storyPoints.forEach((storyPointModel) => { - const isActive = storyPointModel.index === storyModel.activeStoryPointIndex; - const storyPointInfoImpl = new StoryPointInfoImpl_1.StoryPointInfoImpl(storyPointModel.caption, storyPointModel.index, storyPointModel.storyPointId, isActive, storyPointModel.updated, this); - this._storyPointInfoImpls.push(storyPointInfoImpl); - if (isActive) { - this._activeStoryPointImpl = new StoryPointImpl_1.StoryPointImpl(storyPointInfoImpl, this._publishedSheetInfos, this._registryId, storyPointModel.containedSheetInfo); - } - }); - } - updateStoryInfo(index, storyPointModel) { - if (!this._storyPointInfoImpls) { - return; - } - let storyInfoImpl = this._storyPointInfoImpls[index]; - if (storyInfoImpl.storyPointId !== storyPointModel.storyPointId) { - throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.StoryPointIdMismatch, `We should not be updating a story point when the IDs don't match. Existing storyPointID=${storyInfoImpl.storyPointId}, newStoryPointID=${storyPointModel.storyPointId}`); - } - storyInfoImpl.caption = storyPointModel.caption; - storyInfoImpl.updated = storyPointModel.updated; - if (this._activeStoryPointImpl.storyPointId === storyPointModel.storyPointId) { - this._activeStoryPointImpl.updated = storyInfoImpl.updated; - } - } - updateStory(storyPointModel) { - if (!this._storyPointInfoImpls) { - return; - } - this._storyPointInfoImpls.forEach((storyPointInfoImpl) => { - const isActive = storyPointInfoImpl.storyPointId === storyPointModel.storyPointId; - if (isActive) { - // update the state - storyPointInfoImpl.caption = storyPointModel.caption; - storyPointInfoImpl.index = storyPointModel.index; - storyPointInfoImpl.active = true; - storyPointInfoImpl.updated = storyPointModel.updated; - // re-initialize activeStoryPointImpl - this._activeStoryPointImpl = new StoryPointImpl_1.StoryPointImpl(storyPointInfoImpl, this._publishedSheetInfos, this._registryId, storyPointModel.containedSheetInfo); - } - else { - // set old ones to false - storyPointInfoImpl.active = false; - } - }); - if (this.activeStoryPoint) { - this._deferred.resolve(this.activeStoryPoint); - } - } - get activeStoryPoint() { - return this._activeStoryPointImpl; - } - get storyPointsInfo() { - return this._storyPointInfoImpls; - } - get isActive() { - return this._sheetInfoImpl.active; - } - get isHidden() { - return !!this._sheetInfoImpl.isHidden; - } - activateNextStoryPointAsync() { - if (this._activeStoryPointImpl.index === this._storyPointInfoImpls.length - 1) { - return Promise.resolve(this._activeStoryPointImpl); - } - let promise = this._deferred.getNewPromiseOrThrowIfBusy(); - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("story-activation-service" /* StoryActivation */); - service.activateNextStoryPointAsync(); - return promise; - } - activatePreviousStoryPointAsync() { - if (this._activeStoryPointImpl.index === 0) { - return Promise.resolve(this._activeStoryPointImpl); - } - let promise = this._deferred.getNewPromiseOrThrowIfBusy(); - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("story-activation-service" /* StoryActivation */); - service.activatePreviousStoryPointAsync(); - return promise; - } - activateStoryPointAsync(index) { - ErrorHelpers_1.ErrorHelpers.verifyParameter(index, 'index'); - ErrorHelpers_1.ErrorHelpers.verifyParameterType(index, 'number', 'index'); - if (index < 0 || index >= this._storyPointInfoImpls.length) { - throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.IndexOutOfRange, 'The index passed to this command is out of range.'); - } - if (index === this._activeStoryPointImpl.index) { - return Promise.resolve(this._activeStoryPointImpl); - } - let promise = this._deferred.getNewPromiseOrThrowIfBusy(); - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("story-activation-service" /* StoryActivation */); - service.activateStoryPointAsync(index); - return promise; - } - revertStoryPointAsync(index) { - ErrorHelpers_1.ErrorHelpers.verifyParameter(index, 'index'); - ErrorHelpers_1.ErrorHelpers.verifyParameterType(index, 'number', 'index'); - if (index < 0 || index >= this._storyPointInfoImpls.length) { - throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.IndexOutOfRange, 'The index passed to this command is out of range.'); - } - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("story-activation-service" /* StoryActivation */); - return service.revertStoryPointAsync(index).then((response) => { - this.updateStoryInfo(response.index, response); - const storyPointInfoImpl = new StoryPointInfoImpl_1.StoryPointInfoImpl(response.caption, response.index, response.storyPointId, false, response.updated, this); - return storyPointInfoImpl; - }); - } - clearPendingPromises() { - if (this._deferred) { - this._deferred.reject('All pending promises cleared'); - } - } -} -exports.StoryImpl = StoryImpl; - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/Impl/StoryPointImpl.js": -/*!*****************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Impl/StoryPointImpl.js ***! - \*****************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -const TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); -const SheetUtils_1 = __webpack_require__(/*! ../Utils/SheetUtils */ "../api-shared-js/lib/src/ApiShared/Utils/SheetUtils.js"); -const DashboardImpl_1 = __webpack_require__(/*! ./DashboardImpl */ "../api-shared-js/lib/src/ApiShared/Impl/DashboardImpl.js"); -const SheetInfoImpl_1 = __webpack_require__(/*! ./SheetInfoImpl */ "../api-shared-js/lib/src/ApiShared/Impl/SheetInfoImpl.js"); -const WorksheetImpl_1 = __webpack_require__(/*! ./WorksheetImpl */ "../api-shared-js/lib/src/ApiShared/Impl/WorksheetImpl.js"); -class StoryPointImpl { - constructor(_storyPointInfoImpl, sheetInfos, registryId, containedSheetInfo) { - this._storyPointInfoImpl = _storyPointInfoImpl; - if (containedSheetInfo) { - this._containedSheetImpl = this.createContainedSheet(containedSheetInfo, sheetInfos, registryId); - } - } - get index() { - return this._storyPointInfoImpl.index; - } - get caption() { - return this._storyPointInfoImpl.caption; - } - get active() { - return this._storyPointInfoImpl.active; - } - get updated() { - return this._storyPointInfoImpl.updated; - } - set updated(updated) { - this._storyPointInfoImpl.updated = updated; - } - get parentStory() { - return this._storyPointInfoImpl.parentStory; - } - get containedSheet() { - return this._containedSheetImpl; - } - get storyPointId() { - return this._storyPointInfoImpl.storyPointId; - } - createContainedSheet(containedSheetInfo, sheetInfos, registryId) { - const containedSheetIdx = -1; - const publishedSheetInfo = SheetUtils_1.SheetUtils.getPublishedSheetInfoByName(containedSheetInfo.name, sheetInfos); - const containedSheetSize = SheetUtils_1.SheetUtils.createAutomaticSize(); - const isContainedSheetHidden = publishedSheetInfo === undefined; - const containedSheetUrl = publishedSheetInfo ? publishedSheetInfo.url : ''; - // Contained sheets aren't active - the containing sheet is active. - const containedSheetActive = false; - const containedSheetInfoImpl = new SheetInfoImpl_1.SheetInfoImpl(containedSheetInfo.name, SheetUtils_1.SheetUtils.getSheetTypeEnum(containedSheetInfo.sheetType), containedSheetSize, containedSheetIdx, containedSheetActive, isContainedSheetHidden, containedSheetUrl); - let sheetImpl; - switch (containedSheetInfoImpl.sheetType) { - case Contract.SheetType.Worksheet: { - const vizId = { - worksheet: containedSheetInfoImpl.name, - }; - sheetImpl = new WorksheetImpl_1.WorksheetImpl(containedSheetInfoImpl, registryId, vizId, null, this); - break; - } - case Contract.SheetType.Dashboard: { - const sheetPath = { - sheetName: containedSheetInfoImpl.name, - isDashboard: true, - }; - sheetImpl = new DashboardImpl_1.DashboardImpl(containedSheetInfoImpl, containedSheetInfo.dashboardZones, sheetPath, registryId, this); - break; - } - default: { - throw new TableauError_1.TableauError(Contract.SharedErrorCodes.ServerError, 'Invalid SheetType'); - } - } - return sheetImpl; - } -} -exports.StoryPointImpl = StoryPointImpl; - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/Impl/StoryPointInfoImpl.js": -/*!*********************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Impl/StoryPointInfoImpl.js ***! - \*********************************************************************/ -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -class StoryPointInfoImpl { - constructor(_caption, _index, _storyPointId, _active, _updated, _parentStoryImpl) { - this._caption = _caption; - this._index = _index; - this._storyPointId = _storyPointId; - this._active = _active; - this._updated = _updated; - this._parentStoryImpl = _parentStoryImpl; - } - get caption() { - return this._caption; - } - set caption(caption) { - this._caption = caption; - } - get index() { - return this._index; - } - set index(index) { - this._index = index; - } - get storyPointId() { - return this._storyPointId; - } - get active() { - return this._active; - } - set active(isActive) { - this._active = isActive; - } - get updated() { - return this._updated; - } - set updated(isUpdated) { - this._updated = isUpdated; - } - get parentStory() { - return this._parentStoryImpl; - } -} -exports.StoryPointInfoImpl = StoryPointInfoImpl; - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/Impl/WorkbookImpl.js": -/*!***************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Impl/WorkbookImpl.js ***! - \***************************************************************/ -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -class WorkbookImpl { -} -exports.WorkbookImpl = WorkbookImpl; - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/Impl/WorksheetImpl.js": -/*!****************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Impl/WorksheetImpl.js ***! - \****************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -const DataSource_1 = __webpack_require__(/*! ../DataSource */ "../api-shared-js/lib/src/ApiShared/DataSource.js"); -const LogicalTable_1 = __webpack_require__(/*! ../LogicalTable */ "../api-shared-js/lib/src/ApiShared/LogicalTable.js"); -const GetDataService_1 = __webpack_require__(/*! ../Services/GetDataService */ "../api-shared-js/lib/src/ApiShared/Services/GetDataService.js"); -const ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); -const TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); -const ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); -const DataSourceImpl_1 = __webpack_require__(/*! ./DataSourceImpl */ "../api-shared-js/lib/src/ApiShared/Impl/DataSourceImpl.js"); -const SheetImpl_1 = __webpack_require__(/*! ./SheetImpl */ "../api-shared-js/lib/src/ApiShared/Impl/SheetImpl.js"); -class WorksheetImpl extends SheetImpl_1.SheetImpl { - constructor(sheetInfoImpl, _registryId, _visualId, _parentDashboardImpl, _parentStoryPointImpl, _backgroundColor = null, _formatting = null) { - super(sheetInfoImpl, _registryId); - this._visualId = _visualId; - this._parentDashboardImpl = _parentDashboardImpl; - this._parentStoryPointImpl = _parentStoryPointImpl; - this._backgroundColor = _backgroundColor; - this._formatting = _formatting; - } - get parentDashboard() { - return this._parentDashboardImpl; - } - get parentStoryPoint() { - return this._parentStoryPointImpl; - } - get visualId() { - return this._visualId; - } - getMaxPageRowLimit() { - return 10000; - } - get backgroundColor() { - return this._backgroundColor; - } - get formatting() { - return this._formatting; - } - applyFilterAsync(fieldName, values, updateType, options) { - ErrorHelpers_1.ErrorHelpers.verifyEnumValue(updateType, Contract.FilterUpdateType, 'Contract.FilterUpdateType'); - this.verifyActiveSheet(); - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); - return service.applyFilterAsync(this.visualId, fieldName, values, updateType, options); - } - applyRangeFilterAsync(fieldName, filterOptions) { - ErrorHelpers_1.ErrorHelpers.verifyParameter(fieldName, 'fieldName'); - ErrorHelpers_1.ErrorHelpers.verifyParameter(filterOptions, 'filterOptions'); - if (filterOptions.nullOption) { - ErrorHelpers_1.ErrorHelpers.verifyEnumValue(filterOptions.nullOption, api_external_contract_js_1.FilterNullOption, 'FilterNullOption'); - } - else { - ErrorHelpers_1.ErrorHelpers.verifyRangeParamType(filterOptions.min, filterOptions.max); - } - this.verifyActiveSheet(); - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); - return service.applyRangeFilterAsync(this.visualId, fieldName, filterOptions); - } - applyHierarchicalFilterAsync(fieldName, values, updateType, options) { - ErrorHelpers_1.ErrorHelpers.verifyParameter(fieldName, 'fieldName'); - ErrorHelpers_1.ErrorHelpers.verifyParameter(values, 'values'); - ErrorHelpers_1.ErrorHelpers.verifyEnumValue(updateType, Contract.FilterUpdateType, 'Contract.FilterUpdateType'); - if (!Array.isArray(values) && !values.levels) { - throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, 'values parameter for applyHierarchicalFilterAsync must be an array or contain a levels key'); - } - this.verifyActiveSheet(); - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); - return service.applyHierarchicalFilterAsync(this.visualId, fieldName, values, updateType, options); - } - clearFilterAsync(fieldName) { - ErrorHelpers_1.ErrorHelpers.verifyParameter(fieldName, 'fieldName'); - this.verifyActiveSheet(); - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); - return service.clearFilterAsync(this.visualId, fieldName); - } - applyRelativeDateFilterAsync(fieldName, options) { - ErrorHelpers_1.ErrorHelpers.verifyStringParameter(fieldName, 'fieldName'); - ErrorHelpers_1.ErrorHelpers.verifyParameter(options, 'options'); - ErrorHelpers_1.ErrorHelpers.verifyEnumValue(options.periodType, api_external_contract_js_1.PeriodType, 'PeriodType'); - ErrorHelpers_1.ErrorHelpers.verifyEnumValue(options.rangeType, api_external_contract_js_1.DateRangeType, 'DateRangeType'); - this.verifyActiveSheet(); - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); - return service.applyRelativeDateFilterAsync(this.visualId, fieldName, options); - } - getDataSourcesAsync() { - this.verifyActiveSheet(); - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */); - return service.getDataSourcesAsync(this.visualId).then((result) => { - const dataSchema = result; - const worksheetDataSourceInfo = dataSchema.worksheetDataSchemaMap[this.name]; - const dataSources = []; - // First, add the primary datasource. By convention, it comes first in the returned array. - const primaryId = worksheetDataSourceInfo.primaryDataSource; - dataSources.push(this.createDataSourceFromInfo(dataSchema.dataSources[primaryId])); - // Then, loop through any secondary data sources and add them. - for (const secondaryId of worksheetDataSourceInfo.referencedDataSourceList) { - if (secondaryId !== primaryId) { - dataSources.push(this.createDataSourceFromInfo(dataSchema.dataSources[secondaryId])); - } - } - return dataSources; - }); - } - getFiltersAsync() { - this.verifyActiveSheet(); - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); - return service.getFiltersAsync(this.visualId); - } - getSelectedMarksAsync() { - this.verifyActiveSheet(); - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); - return service.getSelectedMarksAsync(this.visualId); - } - getHighlightedMarksAsync() { - this.verifyActiveSheet(); - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); - return service.getHighlightedMarksAsync(this.visualId); - } - getSummaryDataAsync(options) { - var _a; - this.verifyActiveSheet(); - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); - options = options || {}; - return service.getUnderlyingDataAsync(this.visualId, GetDataService_1.GetDataType.Summary, !!options.ignoreAliases, !!options.ignoreSelection, true, options.columnsToIncludeById || [], options.maxRows || 0, options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues, (_a = options.applyWorksheetFormatting, (_a !== null && _a !== void 0 ? _a : false))); - } - getSummaryDataReaderAsync(pageRowCount, options) { - var _a; - this.verifyActiveSheet(); - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); - options = options || {}; - return service.getSummaryDataReaderAsync(this.visualId, pageRowCount || this.getMaxPageRowLimit(), !!options.ignoreAliases, !!options.ignoreSelection, true, // includeAllColumns (can be overridden by columnsToIncludeById) - options.columnsToIncludeById || [], options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues, (_a = options.applyWorksheetFormatting, (_a !== null && _a !== void 0 ? _a : false))); - } - getVisualSpecificationAsync() { - this.verifyActiveSheet(); - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("visual-model-service" /* VisualModel */); - return service.getVisualSpecificationAsync(this.visualId); - } - addMarksCardFieldsAsync(marksCardIndex, encodingType, columns, startIndex) { - this.verifyActiveSheet(); - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("visual-model-service" /* VisualModel */); - return service.addMarksCardFieldsAsync(this.visualId, marksCardIndex, encodingType, columns, startIndex); - } - moveMarksCardFieldAsync(marksCardIndex, fromIndex, toIndex, fieldCount) { - this.verifyActiveSheet(); - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("visual-model-service" /* VisualModel */); - return service.moveMarksCardFieldAsync(this.visualId, marksCardIndex, fromIndex, toIndex, fieldCount); - } - spliceMarksCardFieldsAsync(marksCardIndex, encodingType, startIndex, deleteCount, columns) { - this.verifyActiveSheet(); - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("visual-model-service" /* VisualModel */); - return service.spliceMarksCardFieldsAsync(this.visualId, marksCardIndex, encodingType, startIndex, deleteCount, columns); - } - getSummaryColumnsInfoAsync() { - this.verifyActiveSheet(); - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); - return service.getSummaryColumnsInfoAsync(this.visualId); - } - getUnderlyingDataAsync(options) { - var _a; - this.verifyActiveSheet(); - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); - options = options || {}; - return service.getUnderlyingDataAsync(this.visualId, GetDataService_1.GetDataType.Underlying, !!options.ignoreAliases, !!options.ignoreSelection, !!options.includeAllColumns, options.columnsToIncludeById || [], options.maxRows || 0, options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues, (_a = options.applyWorksheetFormatting, (_a !== null && _a !== void 0 ? _a : false))); - } - getUnderlyingTablesAsync() { - this.verifyActiveSheet(); - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */); - return service.getUnderlyingTablesAsync(this.visualId).then((logicalTableInfos) => { - return logicalTableInfos.map((logicalTableInfo) => new LogicalTable_1.LogicalTable(logicalTableInfo)); - }); - } - getUnderlyingTableDataAsync(logicalTableId, options) { - var _a; - this.verifyActiveSheet(); - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); - options = options || {}; - return service.getUnderlyingTableDataAsync(this.visualId, logicalTableId, !!options.ignoreAliases, !!options.ignoreSelection, !!options.includeAllColumns, options.columnsToIncludeById || [], options.maxRows || 0, options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues, (_a = options.applyWorksheetFormatting, (_a !== null && _a !== void 0 ? _a : false))); - } - getUnderlyingTableDataReaderAsync(logicalTableId, pageRowCount, options) { - var _a; - this.verifyActiveSheet(); - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); - options = options || {}; - return service.getUnderlyingTableDataReaderAsync(this.visualId, logicalTableId, pageRowCount || this.getMaxPageRowLimit(), !!options.ignoreAliases, !!options.ignoreSelection, !!options.includeAllColumns, options.columnsToIncludeById || [], options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues, (_a = options.applyWorksheetFormatting, (_a !== null && _a !== void 0 ? _a : false))); - } - clearSelectedMarksAsync() { - this.verifyActiveSheet(); - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("selection-service" /* Selection */); - return service.clearSelectedMarksAsync(this.visualId); - } - selectMarksByValueAsync(selections, selectionUpdateType) { - ErrorHelpers_1.ErrorHelpers.verifyParameter(selections, 'fieldName'); - ErrorHelpers_1.ErrorHelpers.verifyEnumValue(selectionUpdateType, api_external_contract_js_1.SelectionUpdateType, 'SelectionUpdateType'); - this.verifyActiveSheet(); - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("selection-service" /* Selection */); - return service.selectMarksByValueAsync(this.visualId, selections, selectionUpdateType); - } - selectMarksByIdAsync(selections, selectionUpdateType) { - ErrorHelpers_1.ErrorHelpers.verifyParameter(selections, 'fieldName'); - ErrorHelpers_1.ErrorHelpers.verifyEnumValue(selectionUpdateType, api_external_contract_js_1.SelectionUpdateType, 'SelectionUpdateType'); - this.verifyActiveSheet(); - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("selection-service" /* Selection */); - return service.selectMarksByIdAsync(this.visualId, selections, selectionUpdateType); - } - annotateMarkAsync(mark, annotationText) { - ErrorHelpers_1.ErrorHelpers.verifyParameter(mark, 'mark'); - this.verifyActiveSheet(); - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("annotation-service" /* Annotation */); - return service.annotateMarkAsync(this.visualId, mark, annotationText); - } - getAnnotationsAsync() { - this.verifyActiveSheet(); - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("annotation-service" /* Annotation */); - return service.getAnnotationsAsync(this.visualId); - } - removeAnnotationAsync(annotation) { - ErrorHelpers_1.ErrorHelpers.verifyParameter(annotation, 'annotation'); - this.verifyActiveSheet(); - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("annotation-service" /* Annotation */); - return service.removeAnnotationAsync(this.visualId, annotation); - } - appendContextMenuAsync(targetMenu, config) { - this.verifyActiveSheet(); - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("external-context-menu-service" /* ExternalContextMenu */); - return service.appendContextMenuAsync(this.visualId.worksheet, targetMenu, config); - } - removeContextMenuAsync(targetMenu, menuItemId) { - this.verifyActiveSheet(); - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("external-context-menu-service" /* ExternalContextMenu */); - return service.removeContextMenuAsync(this.visualId.worksheet, targetMenu, menuItemId); - } - executeContextMenuAsync(targetMenu, menuItemId) { - this.verifyActiveSheet(); - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("external-context-menu-service" /* ExternalContextMenu */); - return service.executeContextMenuAsync(this.visualId.worksheet, targetMenu, menuItemId); - } - renameContextMenuAsync(targetMenu, menuHeader, menuDescription) { - this.verifyActiveSheet(); - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("external-context-menu-service" /* ExternalContextMenu */); - return service.renameContextMenuAsync(this.visualId.worksheet, targetMenu, menuHeader, menuDescription); - } - hoverTupleAsync(hoveredTuple, tooltip, allowHoverActions) { - if (this.isInsideDashboardExtension()) { - return Promise.reject(new TableauError_1.TableauError(Contract.SharedErrorCodes.ImplementationError, `hoverTupleAsync is not supported in dashboard extensions`)); - } - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("selection-service" /* Selection */); - return service.hoverTupleAsync(this.visualId, hoveredTuple, tooltip, allowHoverActions); - } - selectTuplesAsync(selectedTuples, selectOption, tooltip) { - if (this.isInsideDashboardExtension()) { - return Promise.reject(new TableauError_1.TableauError(Contract.SharedErrorCodes.ImplementationError, `selectTuplesAsync is not supported in dashboard extensions`)); - } - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("selection-service" /* Selection */); - return service.selectTuplesAsync(this.visualId, selectedTuples, selectOption, tooltip); - } - getTooltipTextAsync(tupleId) { - if (this.isInsideDashboardExtension()) { - return Promise.reject(new TableauError_1.TableauError(Contract.SharedErrorCodes.ImplementationError, `getTooltipTextAsync is not supported in dashboard extensions`)); - } - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("accessibility" /* Accessibility */); - return service.getTooltipTextAsync(this.visualId, tupleId); - } - leaveMarkNavigationAsync() { - if (this.isInsideDashboardExtension()) { - return Promise.reject(new TableauError_1.TableauError(Contract.SharedErrorCodes.ImplementationError, `leaveMarkNavigationAsync is not supported in dashboard extensions`)); - } - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("accessibility" /* Accessibility */); - return service.leaveMarkNavigationAsync(this.visualId); - } - editAliasesDialogAsync(fieldName) { - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("visual-model-service" /* VisualModel */); - return service.editAliasesDialogAsync(fieldName); - } - createDataSourceFromInfo(dataSourceInfo) { - const dataSourceImpl = new DataSourceImpl_1.DataSourceImpl(dataSourceInfo, this._registryId); - const dataSource = new DataSource_1.DataSource(dataSourceImpl); - dataSourceImpl.initializeWithPublicInterfaces(dataSource); - return dataSource; - } - verifyActiveSheet() { - const isRootAndActiveWorksheet = this.active; - const isInsideActiveDashboard = this.isInsideActiveDashboard(); - const isInsideActiveStoryPoint = this.isInsideActiveStoryPoint(); - if (!isRootAndActiveWorksheet && !isInsideActiveDashboard && !isInsideActiveStoryPoint) { - throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.NotActiveSheet, 'Operation not allowed on non-active sheet'); - } - } - isInsideActiveStoryPoint() { - return this._parentStoryPointImpl && this._parentStoryPointImpl.active; - } - isInsideActiveDashboard() { - return this._parentDashboardImpl && this._parentDashboardImpl.active; - } - isInsideDashboardExtension() { - return this._parentDashboardImpl !== null; - } -} -exports.WorksheetImpl = WorksheetImpl; - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/LogicalTable.js": -/*!**********************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/LogicalTable.js ***! - \**********************************************************/ -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -/** - * Implementation of a logical table. - * This does not follow the Impl pattern as it is just a property bag. - */ -class LogicalTable { - constructor(_logicalTable) { - this._logicalTable = _logicalTable; - } - get id() { - return this._logicalTable.id; - } - get caption() { - return this._logicalTable.caption; - } -} -exports.LogicalTable = LogicalTable; - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/Models/AccessibilityModels.js": -/*!************************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Models/AccessibilityModels.js ***! - \************************************************************************/ -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -class TooltipTextRequestModel { - constructor(visualIdPresModel, tupleId) { - this.visualIdPresModel = visualIdPresModel; - this.tupleId = tupleId; - } -} -exports.TooltipTextRequestModel = TooltipTextRequestModel; - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/Models/FilterModels.js": -/*!*****************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Models/FilterModels.js ***! - \*****************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -const ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); -const ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); -class Filter { - constructor(_worksheetName, _fieldName, _filterType, _fieldId, _registryId) { - this._worksheetName = _worksheetName; - this._fieldName = _fieldName; - this._filterType = _filterType; - this._fieldId = _fieldId; - this._registryId = _registryId; - } - get worksheetName() { - return this._worksheetName; - } - get fieldName() { - return this._fieldName; - } - get fieldId() { - return this._fieldId; - } - get filterType() { - return this._filterType; - } - getFieldAsync() { - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */); - return service.getFieldAsync(this._fieldId); - } - getAppliedWorksheetsAsync() { - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); - return service.getAppliedWorksheetsAsync(this._worksheetName, this._fieldId); - } - setAppliedWorksheetsAsync(applyToWorksheets) { - ErrorHelpers_1.ErrorHelpers.verifyParameter(applyToWorksheets, 'applyToWorksheets'); - const uniqueWorksheets = new Set(applyToWorksheets); - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); - return service.setAppliedWorksheetsAsync(this._worksheetName, this._fieldName, this._fieldId, Array.from(uniqueWorksheets)); - } -} -exports.Filter = Filter; -class CategoricalFilter extends Filter { - constructor(worksheetName, fieldName, fieldId, filterType, registryId, _appliedValues, _isExcludeMode, _isAllSelected) { - super(worksheetName, fieldName, filterType, fieldId, registryId); - this._appliedValues = _appliedValues; - this._isExcludeMode = _isExcludeMode; - this._isAllSelected = _isAllSelected; - } - get isAllSelected() { - return this._isAllSelected; - } - get appliedValues() { - return this._appliedValues; - } - get isExcludeMode() { - return this._isExcludeMode; - } - getDomainAsync(domainType) { - if (!domainType) { - domainType = api_external_contract_js_1.FilterDomainType.Relevant; - } - ErrorHelpers_1.ErrorHelpers.verifyEnumValue(domainType, api_external_contract_js_1.FilterDomainType, 'FilterDomainType'); - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); - return service.getCategoricalDomainAsync(this._worksheetName, this._fieldId, domainType); - } -} -exports.CategoricalFilter = CategoricalFilter; -class HierarchicalDataValue { - constructor(_value, _hierarchicalPath, _level) { - this._value = _value; - this._hierarchicalPath = _hierarchicalPath; - this._level = _level; - } - get value() { - return this._value; - } - get hierarchicalPath() { - return this._hierarchicalPath; - } - get level() { - return this._level; - } -} -exports.HierarchicalDataValue = HierarchicalDataValue; -class HierarchicalLevelDetail { - constructor(_name, _levelSelectionState) { - this._name = _name; - this._levelSelectionState = _levelSelectionState; - } - get name() { - return this._name; - } - get levelSelectionState() { - return this._levelSelectionState; - } -} -exports.HierarchicalLevelDetail = HierarchicalLevelDetail; -class HierarchicalFilter extends Filter { - constructor(worksheetName, fieldName, fieldId, filterType, registryId, _dimensionName, _hierarchyCaption, _numberOfLevels, _levelDetails, _appliedValues, _isAllSelected) { - super(worksheetName, fieldName, filterType, fieldId, registryId); - this._dimensionName = _dimensionName; - this._hierarchyCaption = _hierarchyCaption; - this._numberOfLevels = _numberOfLevels; - this._levelDetails = _levelDetails; - this._appliedValues = _appliedValues; - this._isAllSelected = _isAllSelected; - } - getDomainAsync(domainType) { - throw new Error('Method not implemented.'); - } - get dimensionName() { - return this._dimensionName; - } - get hierarchyCaption() { - return this._hierarchyCaption; - } - get numberOfLevels() { - return this._numberOfLevels; - } - get levelDetails() { - return this._levelDetails; - } - get isAllSelected() { - return this._isAllSelected; - } - get appliedValues() { - return this._appliedValues; - } -} -exports.HierarchicalFilter = HierarchicalFilter; -class RangeFilter extends Filter { - constructor(worksheetName, fieldName, fieldId, filterType, registryId, _min, _max, _includeNullValues) { - super(worksheetName, fieldName, filterType, fieldId, registryId); - this._min = _min; - this._max = _max; - this._includeNullValues = _includeNullValues; - } - get minValue() { - return this._min; - } - get maxValue() { - return this._max; - } - get includeNullValues() { - return this._includeNullValues; - } - getDomainAsync(domainType) { - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); - if (!domainType) { - domainType = api_external_contract_js_1.FilterDomainType.Relevant; - } - ErrorHelpers_1.ErrorHelpers.verifyEnumValue(domainType, api_external_contract_js_1.FilterDomainType, 'FilterDomainType'); - return service.getRangeDomainAsync(this._worksheetName, this._fieldId, domainType); - } -} -exports.RangeFilter = RangeFilter; -class RelativeDateFilter extends Filter { - constructor(worksheetName, fieldName, fieldId, filterType, registryId, _anchorDate, _periodType, _rangeType, _rangeN) { - super(worksheetName, fieldName, filterType, fieldId, registryId); - this._anchorDate = _anchorDate; - this._periodType = _periodType; - this._rangeType = _rangeType; - this._rangeN = _rangeN; - } - get anchorDate() { - return this._anchorDate; - } - get periodType() { - return this._periodType; - } - get rangeType() { - return this._rangeType; - } - get rangeN() { - return this._rangeN; - } -} -exports.RelativeDateFilter = RelativeDateFilter; -class CategoricalDomain { - constructor(_values, _domainType) { - this._values = _values; - this._domainType = _domainType; - } - get values() { - return this._values; - } - get type() { - return this._domainType; - } -} -exports.CategoricalDomain = CategoricalDomain; -class RangeDomain { - constructor(_min, _max, _domainType) { - this._min = _min; - this._max = _max; - this._domainType = _domainType; - } - get type() { - return this._domainType; - } - get min() { - return this._min; - } - get max() { - return this._max; - } -} -exports.RangeDomain = RangeDomain; - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/Models/GetDataModels.js": -/*!******************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Models/GetDataModels.js ***! - \******************************************************************/ -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -class DataTable { - constructor(_data, _columns, _totalRowCount, _isTotalRowCountLimited, _isSummaryData, _marksInfo) { - this._data = _data; - this._columns = _columns; - this._totalRowCount = _totalRowCount; - this._isTotalRowCountLimited = _isTotalRowCountLimited; - this._isSummaryData = _isSummaryData; - this._marksInfo = _marksInfo; - this._name = _isSummaryData ? 'Summary Data Table' : 'Underlying Data Table'; - } - get name() { - return this._name; - } - get data() { - return this._data; - } - get columns() { - return this._columns; - } - get marksInfo() { - return this._marksInfo; - } - get totalRowCount() { - return this._totalRowCount; - } - get isTotalRowCountLimited() { - return this._isTotalRowCountLimited; - } - get isSummaryData() { - return this._isSummaryData; - } -} -exports.DataTable = DataTable; -class MarkInfo { - constructor(_type, _color, _tupleId) { - this._type = _type; - this._color = _color; - this._tupleId = _tupleId; - } - get type() { - return this._type; - } - get color() { - return this._color; - } - get tupleId() { - return this._tupleId; - } -} -exports.MarkInfo = MarkInfo; -class Column { - constructor(_fieldName, _fieldId, _dataType, _isReferenced, _index) { - this._fieldName = _fieldName; - this._fieldId = _fieldId; - this._dataType = _dataType; - this._isReferenced = _isReferenced; - this._index = _index; - } - get fieldName() { - return this._fieldName; - } - get fieldId() { - return this._fieldId; - } - get dataType() { - return this._dataType; - } - get isReferenced() { - return this._isReferenced; - } - get index() { - return this._index; - } -} -exports.Column = Column; -class DataValue { - /* tslint:disable:no-any */ - constructor(_value, _nativeValue, _formattedValue, _aliasValue, _hasAlias) { - this._value = _value; - this._nativeValue = _nativeValue; - this._formattedValue = _formattedValue; - this._aliasValue = _aliasValue; - this._hasAlias = _hasAlias; - } - get value() { - return this._value; - } - get nativeValue() { - return this._nativeValue; - } - get formattedValue() { - return this._formattedValue; - } - get aliasValue() { - return this._aliasValue; - } - get hasAlias() { - return this._hasAlias; - } -} -exports.DataValue = DataValue; - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/Models/GetDataTableReaderModels.js": -/*!*****************************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Models/GetDataTableReaderModels.js ***! - \*****************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - -"use strict"; - -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -const ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); -const ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); -class DataTableReader { - constructor(_id, _totalRowCount, _pageRowCount, _registryId) { - this._id = _id; - this._totalRowCount = _totalRowCount; - this._pageRowCount = _pageRowCount; - this._registryId = _registryId; - this._pageCount = Math.ceil(_totalRowCount / _pageRowCount); - } - get totalRowCount() { - return this._totalRowCount; - } - get pageCount() { - return this._pageCount; - } - getPageAsync(pageNumber) { - ErrorHelpers_1.ErrorHelpers.verifyRange(pageNumber, 0, this._pageCount); - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); - return service.getPageAsync(this._id, pageNumber, this._pageRowCount); - } - getAllPagesAsync(maxRows) { - return __awaiter(this, void 0, void 0, function* () { - const firstPage = yield this.getPageAsync(0); - maxRows = maxRows || this.totalRowCount; - const rowsRequested = Math.min(maxRows, this.totalRowCount); - const pagesRequested = Math.ceil(rowsRequested / this._pageRowCount); - // Fetch up to 400 pages, with a default of 10,000 pageRowCount that gives us 4,000,000 rows - const pagesToFetch = Math.min(pagesRequested, 400); - const isDataLimited = pagesToFetch < pagesRequested; - let remainingData = []; - for (let i = 1; i < pagesToFetch; i++) { - const page = yield this.getPageAsync(i); - remainingData.push(page.data); - } - let fullData = firstPage.data.concat(...remainingData); - // This slices the array only if maxRows has been set and is less than totalRowCount - fullData.length = rowsRequested; - return { - name: firstPage.name, - data: fullData, - columns: firstPage.columns, - totalRowCount: isDataLimited ? pagesToFetch * this._pageRowCount : rowsRequested, - isTotalRowCountLimited: isDataLimited, - isSummaryData: firstPage.isSummaryData, - }; - }); - } - releaseAsync() { - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); - return service.releaseAsync(this._id); - } -} -exports.DataTableReader = DataTableReader; - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/Models/SelectionModels.js": -/*!********************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Models/SelectionModels.js ***! - \********************************************************************/ -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -/** - * Selection Model. - */ -class SelectionModel { -} -exports.SelectionModel = SelectionModel; -/** - * Value based selection model. Meant for hierarchical, range and categorical selections. - */ -class ValueSelectionModel extends SelectionModel { - constructor() { - super(...arguments); - this.selectValues = []; - } -} -exports.ValueSelectionModel = ValueSelectionModel; -/** - * Hierarchical value selection model - */ -class HierarchicalSelectionModel extends ValueSelectionModel { -} -exports.HierarchicalSelectionModel = HierarchicalSelectionModel; -/** - * Range based value selection model - */ -class RangeSelectionModel extends SelectionModel { -} -exports.RangeSelectionModel = RangeSelectionModel; -/** - * Dimension value selection model - */ -class DimensionSelectionModel extends ValueSelectionModel { -} -exports.DimensionSelectionModel = DimensionSelectionModel; -/** - * Tuple based selection model - */ -class TupleSelectionModel { - constructor() { - this.objectIds = []; - } -} -exports.TupleSelectionModel = TupleSelectionModel; -/** - * Container class to populate all the selection models when parsing input - */ -class SelectionModelsContainer { - constructor() { - this.hierModelArr = []; - this.dimModelArr = []; - this.quantModelArr = []; - } -} -exports.SelectionModelsContainer = SelectionModelsContainer; -class SelectTuplesInteractionModel { - constructor(visualIdPresModel, tupleIds = [], selectOptions, tooltipContext) { - this.visualIdPresModel = visualIdPresModel; - this.tupleIds = tupleIds; - this.selectOptions = selectOptions; - this.tooltipContext = tooltipContext; - } -} -exports.SelectTuplesInteractionModel = SelectTuplesInteractionModel; -class HoverTupleInteractionModel { - constructor(visualIdPresModel, tupleId, tooltipContext, allowHoverActions) { - this.visualIdPresModel = visualIdPresModel; - this.tupleId = tupleId; - this.tooltipContext = tooltipContext; - this.allowHoverActions = allowHoverActions; - } -} -exports.HoverTupleInteractionModel = HoverTupleInteractionModel; - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/Point.js": -/*!***************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Point.js ***! - \***************************************************/ -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -class Point { - constructor(_x, _y) { - this._x = _x; - this._y = _y; - } - get x() { - return this._x; - } - get y() { - return this._y; - } -} -exports.Point = Point; - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/Services/GetDataService.js": -/*!*********************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Services/GetDataService.js ***! - \*********************************************************************/ -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -/** - * Defines which type of getData call to make. - */ -var GetDataType; -(function (GetDataType) { - GetDataType["Summary"] = "summary"; - GetDataType["Underlying"] = "underlying"; -})(GetDataType = exports.GetDataType || (exports.GetDataType = {})); - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/Services/RegisterAllSharedServices.js": -/*!********************************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Services/RegisterAllSharedServices.js ***! - \********************************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const ServiceRegistry_1 = __webpack_require__(/*! ./ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); -const AccessibilityServiceImpl_1 = __webpack_require__(/*! ./impl/AccessibilityServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/AccessibilityServiceImpl.js"); -const AnimationServiceImpl_1 = __webpack_require__(/*! ./impl/AnimationServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/AnimationServiceImpl.js"); -const AnnotationServiceImpl_1 = __webpack_require__(/*! ./impl/AnnotationServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/AnnotationServiceImpl.js"); -const DataSourceServiceImpl_1 = __webpack_require__(/*! ./impl/DataSourceServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/DataSourceServiceImpl.js"); -const ExportServiceImpl_1 = __webpack_require__(/*! ./impl/ExportServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/ExportServiceImpl.js"); -const ExternalContextMenuServiceImpl_1 = __webpack_require__(/*! ./impl/ExternalContextMenuServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/ExternalContextMenuServiceImpl.js"); -const FilterServiceImpl_1 = __webpack_require__(/*! ./impl/FilterServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/FilterServiceImpl.js"); -const GetDataServiceImpl_1 = __webpack_require__(/*! ./impl/GetDataServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/GetDataServiceImpl.js"); -const NotificationServiceImpl_1 = __webpack_require__(/*! ./impl/NotificationServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImpl.js"); -const ParametersServiceImpl_1 = __webpack_require__(/*! ./impl/ParametersServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/ParametersServiceImpl.js"); -const SelectionServiceImpl_1 = __webpack_require__(/*! ./impl/SelectionServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/SelectionServiceImpl.js"); -const SizeServiceImpl_1 = __webpack_require__(/*! ./impl/SizeServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/SizeServiceImpl.js"); -const VisualModelServiceImpl_1 = __webpack_require__(/*! ./impl/VisualModelServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/VisualModelServiceImpl.js"); -const VizServiceImpl_1 = __webpack_require__(/*! ./impl/VizServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/VizServiceImpl.js"); -const ZoneServiceImpl_1 = __webpack_require__(/*! ./impl/ZoneServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/ZoneServiceImpl.js"); -function registerAllSharedServices(dispatcher, registryId) { - ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new AnimationServiceImpl_1.AnimationServiceImpl(dispatcher, registryId)); - ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new DataSourceServiceImpl_1.DataSourceServiceImpl(dispatcher, registryId)); - ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new ExportServiceImpl_1.ExportServiceImpl(dispatcher, registryId)); - ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new GetDataServiceImpl_1.GetDataServiceImpl(dispatcher, registryId)); - ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new FilterServiceImpl_1.FilterServiceImpl(dispatcher, registryId)); - ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new NotificationServiceImpl_1.NotificationServiceImpl(dispatcher)); - ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new ParametersServiceImpl_1.ParametersServiceImpl(dispatcher, registryId)); - ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new SelectionServiceImpl_1.SelectionServiceImpl(dispatcher, registryId)); - ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new AnnotationServiceImpl_1.AnnotationServiceImpl(dispatcher, registryId)); - ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new ZoneServiceImpl_1.ZoneServiceImpl(dispatcher, registryId)); - ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new SizeServiceImpl_1.SizeServiceImpl(dispatcher, registryId)); - ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new VisualModelServiceImpl_1.VisualModelServiceImpl(dispatcher, registryId)); - ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new VizServiceImpl_1.VizServiceImpl(dispatcher, registryId)); - ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new ExternalContextMenuServiceImpl_1.ExternalContextMenuServiceImpl(dispatcher, registryId)); - ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new AccessibilityServiceImpl_1.AccessibilityServiceImpl(dispatcher, registryId)); -} -exports.registerAllSharedServices = registerAllSharedServices; - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js": -/*!**********************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js ***! - \**********************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -const TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); -if (typeof window !== 'undefined') { - window.__tableauApiServiceRegistry = window.__tableauApiServiceRegistry || {}; -} -class ServiceRegistryImpl { - constructor() { - this._services = {}; - } - registerService(service) { - this._services[service.serviceName] = service; - } - getService(serviceName) { - if (!this._services.hasOwnProperty(serviceName)) { - throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, `Service not registered: ${serviceName}`); - } - return this._services[serviceName]; - } -} -/** - * Static class used for getting access to the single instance - * of the ApiServiceRegistry associated with the registryId. - * - * Extensions by design don't need to store/access multiple service registries. Their single instance of ServiceRegistry is - * stored/access with registryId = 0. - * - * Whereas Embedding needs to be aware of which ServiceRegistry to use when there are multiple vizzes embedded. - * An example of how window.__tableauApiServiceRegistry will look when there are two vizzes: { 0 : ServiceRegistry, 1 : ServiceRegistry} - * where registry ID of 0 & 1 refers to viz's internal identifier (which is generated by VizManager). - */ -class ApiServiceRegistry { - /** - * Gets the singleton instance of the ServiceRegistry - */ - static get(registryId) { - if (!window.__tableauApiServiceRegistry || !window.__tableauApiServiceRegistry[registryId]) { - ApiServiceRegistry.setInstance(registryId, new ServiceRegistryImpl()); - } - if (!window.__tableauApiServiceRegistry[registryId]) { - throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, 'Service registry failed'); - } - return window.__tableauApiServiceRegistry[registryId]; - } - /** - * Helper method that sets the service registry instance for the corresponding registryId. Can be used by unit tests - * - * @param {ServiceRegistry} serviceRegistry The new registry - */ - static setInstance(registryId, serviceRegistry) { - if (!window.__tableauApiServiceRegistry) { - window.__tableauApiServiceRegistry = {}; - } - window.__tableauApiServiceRegistry[registryId] = serviceRegistry; - } - /** - * Only used by unit tests - */ - static clearRegistry() { - window.__tableauApiServiceRegistry = {}; - } - // Private to avoid anyone constructing this - constructor() { } -} -exports.ApiServiceRegistry = ApiServiceRegistry; - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/AccessibilityServiceImpl.js": -/*!************************************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Services/impl/AccessibilityServiceImpl.js ***! - \************************************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -const AccessibilityModels_1 = __webpack_require__(/*! ../../Models/AccessibilityModels */ "../api-shared-js/lib/src/ApiShared/Models/AccessibilityModels.js"); -const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); -class AccessibilityServiceImpl extends ServiceImplBase_1.ServiceImplBase { - get serviceName() { - return "accessibility" /* Accessibility */; - } - getTooltipTextAsync(visualId, tupleId) { - let tooltipTextRequest = new AccessibilityModels_1.TooltipTextRequestModel(visualId, tupleId); - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'getTooltipTextAsync', - [api_internal_contract_js_1.ParameterId.TooltipTextRequest]: tooltipTextRequest, - }; - return this.execute(api_internal_contract_js_1.VerbId.GetTooltipText, parameters).then((response) => { - return response.result; - }); - } - leaveMarkNavigationAsync(visualId) { - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'leaveMarkNavigationAsync', - [api_internal_contract_js_1.ParameterId.VisualId]: visualId, - }; - return this.execute(api_internal_contract_js_1.VerbId.RaiseLeaveMarkNavNotification, parameters).then((response) => { - return; - }); - } -} -exports.AccessibilityServiceImpl = AccessibilityServiceImpl; - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/AnimationServiceImpl.js": -/*!********************************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Services/impl/AnimationServiceImpl.js ***! - \********************************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -const ExternalToInternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/ExternalToInternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/ExternalToInternalEnumMappings.js"); -const ErrorHelpers_1 = __webpack_require__(/*! ../../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); -const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); -class AnimationServiceImpl extends ServiceImplBase_1.ServiceImplBase { - get serviceName() { - return "animation-service" /* Animation */; - } - replayAsync(replaySpeed) { - const parameters = { - [api_internal_contract_js_1.ParameterId.ReplaySpeed]: 1.0, - }; - ErrorHelpers_1.ErrorHelpers.verifyEnumValue(replaySpeed, api_external_contract_js_1.ReplaySpeedType, 'ReplaySpeedType'); - parameters[api_internal_contract_js_1.ParameterId.ReplaySpeed] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.setReplaySpeedType.convert(replaySpeed); - return this.execute(api_internal_contract_js_1.VerbId.ReplayAnimation, parameters).then((response) => { - return; - }); - } -} -exports.AnimationServiceImpl = AnimationServiceImpl; - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/AnnotationServiceImpl.js": -/*!*********************************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Services/impl/AnnotationServiceImpl.js ***! - \*********************************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -const InternalToExternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/InternalToExternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js"); -const SelectionModels_1 = __webpack_require__(/*! ../../Models/SelectionModels */ "../api-shared-js/lib/src/ApiShared/Models/SelectionModels.js"); -const TableauError_1 = __webpack_require__(/*! ../../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); -const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); -class AnnotationServiceImpl extends ServiceImplBase_1.ServiceImplBase { - get serviceName() { - return "annotation-service" /* Annotation */; - } - /** - * Method to annotate a mark on the given worksheet. - * - * @param visualId - * @param mark - * @param annotationText - */ - annotateMarkAsync(visualId, mark, annotationText) { - const selectionModelContainer = this.parseMarkSelectionIds([mark]); - const dummyTargetPoint = { x: 0, y: 0 }; - const formattedText = `${annotationText}`; - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'annotateMarkAsync', - [api_internal_contract_js_1.ParameterId.VisualId]: visualId, - [api_internal_contract_js_1.ParameterId.AnnotateEnum]: api_internal_contract_js_1.AnnotateEnum.Mark, - [api_internal_contract_js_1.ParameterId.TargetPoint]: dummyTargetPoint, - [api_internal_contract_js_1.ParameterId.SelectionList]: [selectionModelContainer.selection], - [api_internal_contract_js_1.ParameterId.FormattedText]: formattedText, - }; - return this.execute(api_internal_contract_js_1.VerbId.CreateAnnotation, parameters).then((response) => { - // Expecting an empty model and hence the void response. - return; - }); - } - /** - * Method to retrieve annotations for the given worksheet. - * - * @param visualId - * @returns {Promise>} - */ - getAnnotationsAsync(visualId) { - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'getAnnotationsAsync', - [api_internal_contract_js_1.ParameterId.VisualId]: visualId, - }; - return this.execute(api_internal_contract_js_1.VerbId.GetAnnotations, parameters).then((response) => { - const annotationsList = response.result; - return this.annotationFilterMap(annotationsList); - }); - } - /** - * Method to remove an annotation from a given worksheet. - * - * @param visualId - * @param annotation - */ - removeAnnotationAsync(visualId, annotation) { - const selectionModelContainer = this.parseAnnotationSelectionIds([annotation]); - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'removeAnnotationAsync', - [api_internal_contract_js_1.ParameterId.VisualId]: visualId, - [api_internal_contract_js_1.ParameterId.SelectionList]: [selectionModelContainer.selection], - }; - return this.execute(api_internal_contract_js_1.VerbId.RemoveAnnotation, parameters).then((response) => { - // Expecting an empty model and hence the void response. - return; - }); - } - /** - * Method to prepare the pres models for selection by MarksInfo - * @param marks - */ - parseMarkSelectionIds(marks) { - const ids = []; - const selectionModelContainer = new SelectionModels_1.SelectionModelsContainer(); - marks.forEach((mark) => { - const tupleId = mark.tupleId; - if (tupleId !== undefined && tupleId !== null && tupleId > 0) { - ids.push(tupleId.toString()); // collect the tuple ids - } - else { - throw new TableauError_1.TableauError(Contract.ErrorCodes.InternalError, 'invalid tupleId'); - } - }); - if (ids.length !== 0) { - // tuple ids based selection - const tupleSelectionModel = new SelectionModels_1.TupleSelectionModel(); - tupleSelectionModel.selectionType = 'tuples'; - tupleSelectionModel.objectIds = ids; - selectionModelContainer.selection = tupleSelectionModel; - } - return selectionModelContainer; - } - /** - * Method to prepare the pres models for selection by MarkAnnotationInfo - * @param marks - */ - parseAnnotationSelectionIds(annotations) { - const ids = []; - const selectionModelContainer = new SelectionModels_1.SelectionModelsContainer(); - annotations.forEach((annotation) => { - const annotationId = annotation.annotationId; - if (annotationId !== undefined && annotationId !== null && annotationId >= 0) { - ids.push(annotationId.toString()); // collect the annotation ids - } - else { - throw new TableauError_1.TableauError(Contract.ErrorCodes.InternalError, 'invalid annotationId'); - } - }); - if (ids.length !== 0) { - // annotation ids based selection - const tupleSelectionModel = new SelectionModels_1.TupleSelectionModel(); - tupleSelectionModel.selectionType = 'annotations'; - tupleSelectionModel.objectIds = ids; - selectionModelContainer.selection = tupleSelectionModel; - } - return selectionModelContainer; - } - /** - * Method to map Annotation to MarkAnnotationInfo - * @param annotation - * @returns {Annotation} - */ - mapAnnotation(annotation) { - return { - annotationHTML: annotation.annotationText, - annotationId: annotation.annotationId, - annotationText: annotation.annotationPlainText, - annotationType: InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.annotationType.convert(annotation.annotateEnum), - tupleId: annotation.tupleId, - }; - } - /** - * Filter the Annotations to Mark Annotations, and map them to MarkAnnotationInfo - * @param annotations - * @returns {Array} - */ - annotationFilterMap(annotations) { - const annotationInfos = annotations.map((annotation) => this.mapAnnotation(annotation)); - return annotationInfos; - } -} -exports.AnnotationServiceImpl = AnnotationServiceImpl; - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/ClientInfoServiceImpl.js": -/*!*********************************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Services/impl/ClientInfoServiceImpl.js ***! - \*********************************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); -class ClientInfoServiceImpl extends ServiceImplBase_1.ServiceImplBase { - get serviceName() { - return "client-info-service" /* ClientInfo */; - } - getClientInfoAsync() { - const verb = api_internal_contract_js_1.VerbId.GetEmbeddingClientInfo; - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'getClientInfoAsync', - }; - return this.execute(verb, parameters).then((response) => { - const clientInfo = response.result; - return clientInfo; - }); - } -} -exports.ClientInfoServiceImpl = ClientInfoServiceImpl; - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/DataSourceServiceImpl.js": -/*!*********************************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Services/impl/DataSourceServiceImpl.js ***! - \*********************************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -const DataSource_1 = __webpack_require__(/*! ../../DataSource */ "../api-shared-js/lib/src/ApiShared/DataSource.js"); -const Field_1 = __webpack_require__(/*! ../../Field */ "../api-shared-js/lib/src/ApiShared/Field.js"); -const DataSourceImpl_1 = __webpack_require__(/*! ../../Impl/DataSourceImpl */ "../api-shared-js/lib/src/ApiShared/Impl/DataSourceImpl.js"); -const FieldImpl_1 = __webpack_require__(/*! ../../Impl/FieldImpl */ "../api-shared-js/lib/src/ApiShared/Impl/FieldImpl.js"); -const TableauError_1 = __webpack_require__(/*! ../../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); -const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); -class DataSourceServiceImpl extends ServiceImplBase_1.ServiceImplBase { - // Since Object Model is supported since Tableau 2020.2, DataSourceServiceImpl can be initialized with the - // platform version when OM was supported. Once we drop support for Tableau versions <= 2020.1, all additional - // code in here for Object Model can be removed. - constructor(dispatcher, registryId) { - super(dispatcher, registryId); - } - get serviceName() { - return "data-source-service" /* DataSourceService */; - } - refreshAsync(dataSourceId) { - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'refreshAsync', - [api_internal_contract_js_1.ParameterId.DeltaTimeMs]: 0, - [api_internal_contract_js_1.ParameterId.ShouldRefreshDS]: true, - }; - // On server: Not passing the datasource id will refresh all datasources. - if (dataSourceId) { - parameters[api_internal_contract_js_1.ParameterId.DataSourceId] = dataSourceId; - } - return this.execute(api_internal_contract_js_1.VerbId.RefreshDataSource, parameters).then((response) => { - return; - }); - } - getActiveTablesAsync(dataSourceId) { - const joinParameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'getActiveTablesAsync', - [api_internal_contract_js_1.ParameterId.DataSourceId]: dataSourceId, - }; - // Get the description of the tables used by this connection - return this.execute(api_internal_contract_js_1.VerbId.GetActiveTables, joinParameters).then((joinResponse) => { - const tableInfos = joinResponse.result; - // getActiveTables is unsupported for cubes and GA. We do not have a connection type property - // available from the platform (intentionally, to reduce code churn as new connections are added). - // Instead,just check if any tables are returned. This array will be empty for any non-table based datasource. - if (tableInfos.tables.length === 0) { - throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.UnsupportedMethodForDataSourceType, `getActiveTables is not supported for: ${dataSourceId}`); - } - return tableInfos.tables; - }); - } - getDataSourcesAsync(visualId) { - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'getDataSourcesAsync', - [api_internal_contract_js_1.ParameterId.VisualId]: visualId, - }; - return this.execute(api_internal_contract_js_1.VerbId.GetDataSources, parameters).then((response) => { - const dataSchema = response.result; - return dataSchema; - }); - } - getAllDataSourcesAsync() { - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'getAllDataSourcesAsync', - }; - return this.execute(api_internal_contract_js_1.VerbId.GetAllDataSources, parameters).then((response) => { - const dataSchema = response.result; - return dataSchema; - }); - } - getConnectionSummariesAsync(dataSourceId) { - const params = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'getConnectionSummariesAsync', - [api_internal_contract_js_1.ParameterId.DataSourceId]: dataSourceId, - }; - // Get the description of the tables used by this connection - return this.execute(api_internal_contract_js_1.VerbId.GetConnectionDescriptionSummaries, params).then((response) => { - const descriptionSummaries = response.result; - return descriptionSummaries; - }); - } - getFieldAsync(globalfieldName) { - const verb = api_internal_contract_js_1.VerbId.GetFieldAndDataSource; - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'getFieldAsync', - [api_internal_contract_js_1.ParameterId.FieldId]: globalfieldName, - }; - return this.execute(verb, parameters).then((response) => { - const dataSource = response.result[api_internal_contract_js_1.ParameterId.DataSource]; - const field = response.result[api_internal_contract_js_1.ParameterId.Field]; - return this.convertField(field, this.convertDataSource(dataSource)); - }); - } - getLogicalTablesAsync(dataSourceId) { - const params = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'getLogicalTablesAsync', - [api_internal_contract_js_1.ParameterId.DataSourceId]: dataSourceId, - }; - return this.execute(api_internal_contract_js_1.VerbId.GetLogicalTables, params).then((response) => { - return response.result; - }); - } - getUnderlyingTablesAsync(visualId) { - const params = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'getUnderlyingTablesAsync', - [api_internal_contract_js_1.ParameterId.VisualId]: visualId, - }; - return this.execute(api_internal_contract_js_1.VerbId.GetUnderlyingTables, params).then((response) => { - return response.result; - }); - } - convertField(field, dataSource) { - return new Field_1.Field(new FieldImpl_1.FieldImpl(field, dataSource)); - } - convertDataSource(dataSource) { - return new DataSource_1.DataSource(new DataSourceImpl_1.DataSourceImpl(dataSource, this._registryId)); - } -} -exports.DataSourceServiceImpl = DataSourceServiceImpl; - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/ExportServiceImpl.js": -/*!*****************************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Services/impl/ExportServiceImpl.js ***! - \*****************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - -"use strict"; - -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -const ExternalToInternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/ExternalToInternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/ExternalToInternalEnumMappings.js"); -const ExportHelpers_1 = __webpack_require__(/*! ../../Utils/ExportHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ExportHelpers.js"); -const ErrorHelpers_1 = __webpack_require__(/*! ../../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); -const TableauError_1 = __webpack_require__(/*! ../../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); -const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); -class ExportServiceImpl extends ServiceImplBase_1.ServiceImplBase { - get serviceName() { - return "export-service" /* Export */; - } - getExportCrosstabSheetMapAsync(currentSheetType) { - const verb = api_internal_contract_js_1.VerbId.GetExportCrosstabSheetMap; - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'getExportCrosstabSheetMapAsync', - [api_internal_contract_js_1.ParameterId.CurrentSheetType]: ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.sheetType.convert(currentSheetType), - }; - return this.execute(verb, parameters).then((response) => { - const result = response.result; - return result; - }); - } - exportCrosstabAsync(sheetName, format, exportableWorksheetNames, currentSheetType) { - return __awaiter(this, void 0, void 0, function* () { - ErrorHelpers_1.ErrorHelpers.verifySheetName(exportableWorksheetNames, sheetName); - ErrorHelpers_1.ErrorHelpers.verifyEnumValue(format, api_external_contract_js_1.CrosstabFileFormat, 'CrosstabFileFormat'); - // The pres layer command for exporting Crosstab uses SimpleSheetIdentifiers instead of sheet names. - // The extensions-and-embedding-api current does not store references to the SimpleSheetIdentifiers of its sheets - // so we call a pres layer command that gives us the SimpleSheetIdentifier for each sheet name that appears in the - // export Crosstab dialog popup. - const sheetNameToIdMap = yield this.getExportCrosstabSheetMapAsync(currentSheetType); - if (!sheetNameToIdMap[sheetName]) { - throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, 'missing sheet doc id from sheetMap'); - } - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'exportCrosstabAsync', - [api_internal_contract_js_1.ParameterId.SheetIdentifier]: sheetNameToIdMap[sheetName], - [api_internal_contract_js_1.ParameterId.SendNotifications]: true, - }; - // pres layer command invoked depends on the crosstab file format - let verb; - switch (format) { - case api_external_contract_js_1.CrosstabFileFormat.CSV: - verb = api_internal_contract_js_1.VerbId.ExportCrosstabCsvDownload; - // CSV only parameter: see browser-clients/export-crosstab-options-dialog repo - parameters[api_internal_contract_js_1.ParameterId.UseTabDelimiters] = true; - break; - case api_external_contract_js_1.CrosstabFileFormat.Excel: - verb = api_internal_contract_js_1.VerbId.ExportCrosstabExcelDownload; - break; - default: - throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, 'unsupported Crosstab file format.'); - } - return this.execute(verb, parameters) - .then((response) => { - const result = response.result; - return result; - }) - .catch(() => { - throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.CrosstabCreationError, 'An unexpected error occurred while generating the document.'); - }); - }); - } - exportDataAsync(visualId, options) { - var _a; - ErrorHelpers_1.ErrorHelpers.verifyExportDataOptions(options); - // Remove any duplicates from the input array - const columnsAsSet = new Set(options.columnsToIncludeById); - const columnsToIncludeById = Array.from(columnsAsSet); - const verb = api_internal_contract_js_1.VerbId.ExportDataDownload; - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'exportDataAsync', - [api_internal_contract_js_1.ParameterId.VisualId]: visualId, - [api_internal_contract_js_1.ParameterId.IgnoreAliases]: (_a = options.ignoreAliases, (_a !== null && _a !== void 0 ? _a : false)), - [api_internal_contract_js_1.ParameterId.ColumnsToIncludeById]: columnsToIncludeById, - }; - return this.execute(verb, parameters) - .then(() => { }) - .catch(() => { - throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.DataCreationError, 'An unexpected error occurred while generating the document.'); - }); - } - exportPowerPointAsync(sheetNames, exportScenarios) { - ErrorHelpers_1.ErrorHelpers.verifySheetNamesForPDFAndPPT(sheetNames, exportScenarios); - // Note: the ExportOriginUrl param is listed as optional for the pres layer command we are invoking; however, - // recent changes were made that enforced the use of the empty string when invoking this command with no ExportOriginUrl. - // see browser-clients/export-powerpoint-options-dialog repo. - const verb = api_internal_contract_js_1.VerbId.ExportPowerpointDownload; - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'exportPowerPointAsync', - [api_internal_contract_js_1.ParameterId.ExportOriginUrl]: '', - [api_internal_contract_js_1.ParameterId.SelectedSheetNames]: sheetNames, - }; - return this.execute(verb, parameters) - .then((response) => { - const result = response.result; - return result; - }) - .catch(() => { - throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.PowerPointCreationError, 'An error occured while attempting to generate the PowerPoint file.'); - }); - } - exportPDFAsync(sheetNames, externalExportPdfOptions, exportScenarios) { - return __awaiter(this, void 0, void 0, function* () { - ErrorHelpers_1.ErrorHelpers.verifyExportPDFOptions(externalExportPdfOptions); - ErrorHelpers_1.ErrorHelpers.verifySheetNamesForPDFAndPPT(sheetNames, exportScenarios); - const internalExportPdfOptions = yield this.getExportPDFOptionsAsync(); - ExportHelpers_1.ExportHelpers.updateInternalExportPDFOptions(internalExportPdfOptions, externalExportPdfOptions, sheetNames); - const verb = api_internal_contract_js_1.VerbId.ExportPdfDownload; - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'exportPDFAsync', - [api_internal_contract_js_1.ParameterId.ExportPdfOptions]: internalExportPdfOptions, - }; - return this.execute(verb, parameters) - .then((response) => { - const result = response.result; - return result; - }) - .catch(() => { - throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.PDFCreationError, 'Unable to create PDF because something went wrong. Try again.'); - }); - }); - } - getExportPDFOptionsAsync() { - const verb = api_internal_contract_js_1.VerbId.GetExportPdfOptions; - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'getExportPdfOptionsAsync', - }; - return this.execute(verb, parameters).then((response) => { - const result = response.result; - return result; - }); - } -} -exports.ExportServiceImpl = ExportServiceImpl; - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/ExternalContextMenuServiceImpl.js": -/*!******************************************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Services/impl/ExternalContextMenuServiceImpl.js ***! - \******************************************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); -class ExternalContextMenuServiceImpl extends ServiceImplBase_1.ServiceImplBase { - get serviceName() { - return "external-context-menu-service" /* ExternalContextMenu */; - } - appendContextMenuAsync(sheetName, targetMenu, config) { - const verb = api_internal_contract_js_1.VerbId.AppendExternalMenuItem; - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'appendContextMenuAsync', - [api_internal_contract_js_1.ParameterId.WorksheetName]: sheetName, - [api_internal_contract_js_1.ParameterId.ExternalMenuItemDisplayName]: config.displayName, - }; - return this.execute(verb, parameters).then((response) => { - const newMenuItemId = response.result; - return newMenuItemId; - }); - } - removeContextMenuAsync(sheetName, targetMenu, menuItemId) { - const verb = api_internal_contract_js_1.VerbId.RemoveExternalMenuItem; - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'removeContextMenuAsync', - [api_internal_contract_js_1.ParameterId.WorksheetName]: sheetName, - [api_internal_contract_js_1.ParameterId.ExternalMenuItemId]: menuItemId, - }; - return this.execute(verb, parameters).then((response) => { - return; - }); - } - executeContextMenuAsync(sheetName, targetMenu, menuItemId) { - const verb = api_internal_contract_js_1.VerbId.ExecuteExternalMenuItem; - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'executeContextMenuAsync', - [api_internal_contract_js_1.ParameterId.WorksheetName]: sheetName, - [api_internal_contract_js_1.ParameterId.ExternalMenuItemId]: menuItemId, - }; - return this.execute(verb, parameters).then((response) => { - return; - }); - } - renameContextMenuAsync(sheetName, targetMenu, menuHeader, menuDescription) { - const verb = api_internal_contract_js_1.VerbId.RenameExternalMenu; - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'renameContextMenuAsync', - [api_internal_contract_js_1.ParameterId.WorksheetName]: sheetName, - [api_internal_contract_js_1.ParameterId.ExternalMenuHeader]: menuHeader, - [api_internal_contract_js_1.ParameterId.ExternalMenuDescription]: menuDescription, - }; - return this.execute(verb, parameters).then((response) => { - return; - }); - } -} -exports.ExternalContextMenuServiceImpl = ExternalContextMenuServiceImpl; - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/FilterServiceImpl.js": -/*!*****************************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Services/impl/FilterServiceImpl.js ***! - \*****************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - -"use strict"; - -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -const InternalContract = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -const ApiShared_1 = __webpack_require__(/*! ../../../ApiShared */ "../api-shared-js/lib/src/ApiShared.js"); -const ExternalToInternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/ExternalToInternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/ExternalToInternalEnumMappings.js"); -const InternalToExternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/InternalToExternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js"); -const FilterModels_1 = __webpack_require__(/*! ../../Models/FilterModels */ "../api-shared-js/lib/src/ApiShared/Models/FilterModels.js"); -const DataValueFactory_1 = __webpack_require__(/*! ../../Utils/DataValueFactory */ "../api-shared-js/lib/src/ApiShared/Utils/DataValueFactory.js"); -const Param_1 = __webpack_require__(/*! ../../Utils/Param */ "../api-shared-js/lib/src/ApiShared/Utils/Param.js"); -const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); -class FilterServiceImpl extends ServiceImplBase_1.ServiceImplBase { - get serviceName() { - return "filter-service" /* Filter */; - } - applyFilterAsync(visualId, fieldName, values, updateType, filterOptions) { - const verb = api_internal_contract_js_1.VerbId.ApplyCategoricalFilter; - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'applyFilterAsync', - }; - parameters[api_internal_contract_js_1.ParameterId.VisualId] = visualId; - parameters[api_internal_contract_js_1.ParameterId.FieldName] = fieldName; - if (!Array.isArray(values)) { - throw new ApiShared_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, 'values parameter for applyFilterAsync must be an array'); - } - parameters[api_internal_contract_js_1.ParameterId.FilterValues] = values; - parameters[api_internal_contract_js_1.ParameterId.FilterUpdateType] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.filterUpdateType.convert(updateType); - parameters[api_internal_contract_js_1.ParameterId.IsExcludeMode] = - filterOptions === undefined || filterOptions.isExcludeMode === undefined ? false : filterOptions.isExcludeMode; - return this.execute(verb, parameters).then((response) => { - return fieldName; - }); - } - applyRangeFilterAsync(visualId, fieldName, filterOptions) { - const verb = api_internal_contract_js_1.VerbId.ApplyRangeFilter; - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'applyRangeFilterAsync', - }; - if (filterOptions.min !== undefined && filterOptions.min !== null) { - let min; - if (filterOptions.min instanceof Date) { - min = Param_1.Param.serializeDateForPlatform(filterOptions.min); - } - else { - min = filterOptions.min; - } - parameters[api_internal_contract_js_1.ParameterId.FilterRangeMin] = min; - } - if (filterOptions.max !== undefined && filterOptions.max !== null) { - let max; - if (filterOptions.max instanceof Date) { - max = Param_1.Param.serializeDateForPlatform(filterOptions.max); - } - else { - max = filterOptions.max; - } - parameters[api_internal_contract_js_1.ParameterId.FilterRangeMax] = max; - } - // The null option is used with min+max for 'include-range' or 'include-range-or-null' - if (filterOptions.nullOption) { - parameters[api_internal_contract_js_1.ParameterId.FilterRangeNullOption] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.nullOptions.convert(filterOptions.nullOption); - } - parameters[api_internal_contract_js_1.ParameterId.FieldName] = fieldName; - parameters[api_internal_contract_js_1.ParameterId.VisualId] = visualId; - return this.execute(verb, parameters).then((response) => { - this.apiFilterHandlerCheckForCommandError(response.result); - return fieldName; - }); - } - applyHierarchicalFilterAsync(visualId, fieldName, values, updateType, filterOptions) { - const verb = api_internal_contract_js_1.VerbId.HierarchicalFilter; - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'applyHierarchicalFilterAsync', - }; - parameters[api_internal_contract_js_1.ParameterId.VisualId] = visualId; - parameters[api_internal_contract_js_1.ParameterId.FieldName] = fieldName; - const hierarchicalLevels = values.levels; - if (Array.isArray(hierarchicalLevels) && hierarchicalLevels.length > 0) { - parameters[api_internal_contract_js_1.ParameterId.FilterLevels] = hierarchicalLevels; - } - else if (values.length > 0) { - parameters[api_internal_contract_js_1.ParameterId.FilterValues] = values; - } - else { - // the server command expects empty list for clearing the filter - // it also expects eithers FilterLevels or FilterValues to be set - parameters[api_internal_contract_js_1.ParameterId.FilterLevels] = []; - } - parameters[api_internal_contract_js_1.ParameterId.FilterUpdateType] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.filterUpdateType.convert(updateType); - parameters[api_internal_contract_js_1.ParameterId.IsExcludeMode] = filterOptions && !!filterOptions.isExcludeMode; - return this.execute(verb, parameters).then((response) => { - return fieldName; - }); - } - clearFilterAsync(visualId, fieldName) { - const verb = api_internal_contract_js_1.VerbId.ClearFilter; - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'clearFilterAsync', - }; - parameters[api_internal_contract_js_1.ParameterId.VisualId] = visualId; - parameters[api_internal_contract_js_1.ParameterId.FieldName] = fieldName; - return this.execute(verb, parameters).then((resposne) => { - return fieldName; - }); - } - applyRelativeDateFilterAsync(visualId, fieldName, options) { - const verb = api_internal_contract_js_1.VerbId.ApplyRelativeDateFilter; - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'applyRelativeDateFilterAsync', - }; - parameters[api_internal_contract_js_1.ParameterId.VisualId] = visualId; - parameters[api_internal_contract_js_1.ParameterId.FieldName] = fieldName; - parameters[api_internal_contract_js_1.ParameterId.PeriodType] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.periodType.convert(options.periodType); - parameters[api_internal_contract_js_1.ParameterId.DateRangeType] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.dateRangeType.convert(options.rangeType); - if (options.rangeType === api_external_contract_js_1.DateRangeType.LastN || options.rangeType === api_external_contract_js_1.DateRangeType.NextN) { - if (options.rangeN === undefined || options.rangeN === null) { - throw new ApiShared_1.TableauError(api_external_contract_js_1.EmbeddingErrorCodes.MissingRangeNForRelativeDateFilters, 'Missing rangeN field for a relative date filter of LASTN or NEXTN.'); - } - parameters[api_internal_contract_js_1.ParameterId.RangeN] = options.rangeN; - } - if (options.anchorDate !== undefined && options.anchorDate !== null) { - parameters[api_internal_contract_js_1.ParameterId.AnchorDate] = this.convertAnchorDate(options.anchorDate); - } - return this.execute(verb, parameters).then((response) => { - return response.result; - }); - } - getFiltersAsync(visualId) { - const verb = api_internal_contract_js_1.VerbId.GetFilters; - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'getFiltersAsync', - }; - parameters[api_internal_contract_js_1.ParameterId.VisualId] = visualId; - return this.execute(verb, parameters).then((response) => { - const filters = response.result; - return this.convertDomainFilters(filters); - }); - } - getCategoricalDomainAsync(worksheetName, fieldId, domainType) { - const verb = api_internal_contract_js_1.VerbId.GetCategoricalDomain; - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'getCategoricalDomainAsync', - }; - parameters[api_internal_contract_js_1.ParameterId.VisualId] = { - worksheet: worksheetName, - }; - parameters[api_internal_contract_js_1.ParameterId.FieldId] = fieldId; - parameters[api_internal_contract_js_1.ParameterId.DomainType] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.filterDomainType.convert(domainType); - return this.execute(verb, parameters).then((response) => { - const domain = response.result; - return this.convertCategoricalDomain(domain, domainType); - }); - } - getRangeDomainAsync(worksheetName, fieldId, domainType) { - const verb = api_internal_contract_js_1.VerbId.GetRangeDomain; - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'getRangeDomainAsync', - }; - parameters[api_internal_contract_js_1.ParameterId.VisualId] = { - worksheet: worksheetName, - }; - parameters[api_internal_contract_js_1.ParameterId.FieldId] = fieldId; - parameters[api_internal_contract_js_1.ParameterId.DomainType] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.filterDomainType.convert(domainType); - return this.execute(verb, parameters).then((response) => { - const domain = response.result; - return this.convertRangeDomain(domain, domainType); - }); - } - getDashboardFiltersAsync() { - const verb = api_internal_contract_js_1.VerbId.GetDashboardFilters; - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'getDashboardFiltersAsync', - }; - return this.execute(verb, parameters).then((response) => { - const filters = response.result; - return this.convertDomainFilters(filters); - }); - } - applyDashboardFilterAsync(fieldName, values, updateType, filterOptions) { - const verb = api_internal_contract_js_1.VerbId.DashboardCategoricalFilter; - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'applyDashboardFilterAsync', - }; - parameters[api_internal_contract_js_1.ParameterId.FieldName] = fieldName; - parameters[api_internal_contract_js_1.ParameterId.FilterValues] = values; - parameters[api_internal_contract_js_1.ParameterId.FilterUpdateType] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.filterUpdateType.convert(updateType); - parameters[api_internal_contract_js_1.ParameterId.IsExcludeMode] = filterOptions && !!filterOptions.isExcludeMode; - return this.execute(verb, parameters).then((response) => { - return response.result; - }); - } - getAppliedWorksheetsAsync(worksheetName, fieldId) { - var _a; - return __awaiter(this, void 0, void 0, function* () { - const sharedFilterModel = yield this.executeGetAppliedWorksheets(worksheetName, fieldId, 'getAppliedWorksheetsAsync'); - const worksheetNames = []; - (_a = sharedFilterModel.worksheets) === null || _a === void 0 ? void 0 : _a.map((worksheetInfo) => { - if (worksheetInfo.isSelected) { - worksheetNames.push(worksheetInfo.worksheetName); - } - }); - return worksheetNames; - }); - } - setAppliedWorksheetsAsync(worksheetName, fieldName, fieldId, applyToWorksheets) { - return __awaiter(this, void 0, void 0, function* () { - const sharedFilterModel = yield this.executeGetAppliedWorksheets(worksheetName, fieldId, 'getAppliedWorksheetsAsyncInternal'); - if (!sharedFilterModel || !sharedFilterModel.worksheets) { - throw new ApiShared_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, 'This filter does not apply to multiple worksheets'); - } - const allowedWorksheets = []; - let activeWorksheet = ''; - sharedFilterModel.worksheets.forEach((worksheet) => { - // Get active worksheet - if (worksheet.isActive) { - activeWorksheet = worksheet.worksheetName; - } - // Populate allowed worksheets - if (worksheet.isSelected || worksheet.isEnabled) { - allowedWorksheets.push(worksheet.worksheetName); - } - }); - if (activeWorksheet === '') { - throw new ApiShared_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, 'No active worksheet'); - } - if (!applyToWorksheets.includes(activeWorksheet)) { - throw new ApiShared_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, `${activeWorksheet} must be included in the applied worksheets`); - } - applyToWorksheets.forEach((sheet) => { - // check if it's present within compatible sheets - if (!allowedWorksheets.includes(sheet)) { - throw new ApiShared_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, `The field ${fieldName} isn't applicable to the worksheet ${sheet}`); - } - }); - const verb = api_internal_contract_js_1.VerbId.ChangeSharedFilter; - const parameters = {}; - parameters[api_internal_contract_js_1.ParameterId.FunctionName] = 'setAppliedWorksheetsAsync'; - parameters[api_internal_contract_js_1.ParameterId.VisualId] = { - worksheet: worksheetName, - }; - parameters[api_internal_contract_js_1.ParameterId.FieldId] = fieldId; - parameters[api_internal_contract_js_1.ParameterId.SharedFilterSheets] = applyToWorksheets; - return this.execute(verb, parameters).then((response) => { - return applyToWorksheets; - }); - }); - } - // Helper Methods - executeGetAppliedWorksheets(worksheetName, fieldId, telemetryFunctionName) { - const verb = api_internal_contract_js_1.VerbId.GetSharedFilter; - const parameters = {}; - parameters[api_internal_contract_js_1.ParameterId.FunctionName] = telemetryFunctionName; - parameters[api_internal_contract_js_1.ParameterId.VisualId] = { - worksheet: worksheetName, - }; - parameters[api_internal_contract_js_1.ParameterId.FieldId] = fieldId; - return this.execute(verb, parameters).then((response) => { - const sharedFilterModel = response.result; - return sharedFilterModel; - }); - } - convertDomainFilters(domainFilters) { - const filters = []; - domainFilters.forEach((domainFilter) => { - switch (domainFilter.filterType) { - case api_internal_contract_js_1.FilterType.Categorical: { - const filter = domainFilter; - if (filter) { - filters.push(this.convertCategoricalFilter(filter)); - } - else { - throw new Error('Invalid Categorical Filter'); - } - break; - } - case api_internal_contract_js_1.FilterType.Hierarchical: { - const filter = domainFilter; - if (filter) { - filters.push(this.convertHierarchicalFilter(filter)); - } - else { - throw new Error('Invalid Hierarchical Filter'); - } - break; - } - case api_internal_contract_js_1.FilterType.Range: { - const filter = domainFilter; - if (filter) { - filters.push(this.convertRangeFilter(filter)); - } - else { - throw new Error('Invalid Range Filter'); - } - break; - } - case api_internal_contract_js_1.FilterType.RelativeDate: { - const filter = domainFilter; - if (filter) { - filters.push(this.convertRelativeDateFilter(filter)); - } - else { - throw new Error('Invalid Relative Date Filter'); - } - break; - } - default: { - break; - } - } - }); - return filters; - } - convertCategoricalFilter(domainFilter) { - const appliedValues = domainFilter.values.map((dv) => { - return DataValueFactory_1.DataValueFactory.MakeFilterDataValue(dv); - }); - return new FilterModels_1.CategoricalFilter(domainFilter.visualId.worksheet, domainFilter.fieldCaption, domainFilter.fieldName, api_internal_contract_js_1.FilterType.Categorical, this._registryId, appliedValues, domainFilter.isExclude, domainFilter.isAllSelected); - } - convertHierarchicalFilter(domainFilter) { - const appliedValues = domainFilter.values.map((hierarchicalDataValue) => { - return new FilterModels_1.HierarchicalDataValue(DataValueFactory_1.DataValueFactory.MakeFilterDataValue(hierarchicalDataValue.value), hierarchicalDataValue.hierarchicalPath, hierarchicalDataValue.level); - }); - const levelDetails = domainFilter.levelInfo.map((aLevel) => { - return new FilterModels_1.HierarchicalLevelDetail(aLevel.name, InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.hierarchicalLevelSelectionState.convert(aLevel.levelSelectionState)); - }); - return new FilterModels_1.HierarchicalFilter(domainFilter.visualId.worksheet, domainFilter.fieldCaption, domainFilter.fieldName, api_internal_contract_js_1.FilterType.Hierarchical, this._registryId, domainFilter.dimensionName, domainFilter.hierarchyCaption, domainFilter.levels, levelDetails, appliedValues, domainFilter.isAllSelected); - } - convertRangeFilter(domainFilter) { - const minValue = DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domainFilter.min); - const maxValue = DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domainFilter.max); - return new FilterModels_1.RangeFilter(domainFilter.visualId.worksheet, domainFilter.fieldCaption, domainFilter.fieldName, api_internal_contract_js_1.FilterType.Range, this._registryId, minValue, maxValue, domainFilter.includeNullValues); - } - convertRelativeDateFilter(domainFilter) { - const anchorDateValue = DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domainFilter.anchorDate); - return new FilterModels_1.RelativeDateFilter(domainFilter.visualId.worksheet, domainFilter.fieldCaption, domainFilter.fieldName, api_external_contract_js_1.FilterType.RelativeDate, this._registryId, anchorDateValue, InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.dateStepPeriod.convert(domainFilter.periodType), InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.dateRangeType.convert(domainFilter.rangeType), domainFilter.rangeN); - } - convertCategoricalDomain(domain, domainType) { - const values = domain.values.map((domainDv) => { - return DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domainDv); - }); - return new FilterModels_1.CategoricalDomain(values, domainType); - } - convertRangeDomain(domain, domainType) { - const min = DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domain.min); - const max = DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domain.max); - return new FilterModels_1.RangeDomain(min, max, domainType); - } - convertAnchorDate(anchorDate) { - // Converts a Date object into a string format that the server expects for date/time values. - // If anchorDate doesn't represent a valid Date object, any of these would be NaN. - const year = anchorDate.getUTCFullYear(); - const month = anchorDate.getUTCMonth() + 1; - const day = anchorDate.getUTCDate(); - const hh = anchorDate.getUTCHours(); - const mm = anchorDate.getUTCMinutes(); - const sec = anchorDate.getUTCSeconds(); - if (isNaN(year) || isNaN(month) || isNaN(day) || isNaN(hh) || isNaN(mm) || isNaN(sec)) { - throw new ApiShared_1.TableauError(api_external_contract_js_1.EmbeddingErrorCodes.InvalidDateParameter, 'Invalid date parameter: anchorDate'); - } - const result = `${year}-${month}-${day} ${hh}:${mm}:${sec}`; - return result; - } - apiFilterHandlerCheckForCommandError(serverPm) { - if (!serverPm[InternalContract.ParameterId.ParameterError]) { - return; - } - if (serverPm[InternalContract.ParameterId.InvalidFieldCaption]) { - throw new ApiShared_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidFilterFieldName, serverPm[InternalContract.ParameterId.InvalidFieldCaption]); - } - if (serverPm[InternalContract.ParameterId.InvalidValues]) { - throw new ApiShared_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidFilterFieldValue, serverPm[InternalContract.ParameterId.InvalidValues]); - } - if (serverPm[InternalContract.ParameterId.InvalidAggFieldName]) { - throw new ApiShared_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidAggregationFieldName, serverPm[InternalContract.ParameterId.InvalidAggFieldName]); - } - throw new ApiShared_1.TableauError(api_external_contract_js_1.SharedErrorCodes.ServerError, 'Server Error'); - } -} -exports.FilterServiceImpl = FilterServiceImpl; - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/GetDataServiceImpl.js": -/*!******************************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Services/impl/GetDataServiceImpl.js ***! - \******************************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -const uuid_1 = __webpack_require__(/*! uuid */ "../api-shared-js/node_modules/uuid/dist/esm-browser/index.js"); -const ApiShared_1 = __webpack_require__(/*! ../../../ApiShared */ "../api-shared-js/lib/src/ApiShared.js"); -const ExternalToInternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/ExternalToInternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/ExternalToInternalEnumMappings.js"); -const GetDataModels_1 = __webpack_require__(/*! ../../Models/GetDataModels */ "../api-shared-js/lib/src/ApiShared/Models/GetDataModels.js"); -const GetDataTableReaderModels_1 = __webpack_require__(/*! ../../Models/GetDataTableReaderModels */ "../api-shared-js/lib/src/ApiShared/Models/GetDataTableReaderModels.js"); -const DataValueFactory_1 = __webpack_require__(/*! ../../Utils/DataValueFactory */ "../api-shared-js/lib/src/ApiShared/Utils/DataValueFactory.js"); -const GetDataService_1 = __webpack_require__(/*! ../GetDataService */ "../api-shared-js/lib/src/ApiShared/Services/GetDataService.js"); -const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); -class GetDataServiceImpl extends ServiceImplBase_1.ServiceImplBase { - constructor() { - super(...arguments); - // The extension/embedding instance uses the same cache for all DataTableReaders. - this.viewDataTableCacheId = uuid_1.v4(); - } - get serviceName() { - return "get-data-service" /* GetData */; - } - getMaxRowLimit() { - return 10000; - } - getViewDataTableCacheId() { - return this.viewDataTableCacheId; - } - getLimitedMaxRows(requestedRows, rowCountLimit) { - return requestedRows > 0 && requestedRows < rowCountLimit ? requestedRows : rowCountLimit; - } - getUnderlyingDataAsync(visualId, getType, ignoreAliases, ignoreSelection, includeAllColumns, columnsToIncludeById, maxRows, includeDataValuesOption, applyWorksheetFormatting) { - // Create all of our parameters - const summaryData = getType === GetDataService_1.GetDataType.Summary; - const functionName = summaryData ? 'getSummaryDataAsync' : 'getUnderlyingDataAsync'; - const verb = summaryData ? api_internal_contract_js_1.VerbId.GetDataSummaryData : api_internal_contract_js_1.VerbId.GetUnderlyingData; - const requestMaxRows = verb === api_internal_contract_js_1.VerbId.GetUnderlyingData ? this.getLimitedMaxRows(maxRows, this.getMaxRowLimit() + 1) : maxRows; - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: functionName, - }; - parameters[api_internal_contract_js_1.ParameterId.VisualId] = visualId; - parameters[api_internal_contract_js_1.ParameterId.IgnoreAliases] = ignoreAliases; - parameters[api_internal_contract_js_1.ParameterId.IgnoreSelection] = ignoreSelection; - parameters[api_internal_contract_js_1.ParameterId.IncludeAllColumns] = includeAllColumns; - parameters[api_internal_contract_js_1.ParameterId.ColumnsToIncludeById] = this.verifyIncludeColumnArray(columnsToIncludeById); - parameters[api_internal_contract_js_1.ParameterId.MaxRows] = requestMaxRows; - parameters[api_internal_contract_js_1.ParameterId.ShowDataTableFormat] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption); - parameters[api_internal_contract_js_1.ParameterId.ApplyWorksheetFormatting] = applyWorksheetFormatting; - return this.execute(verb, parameters).then((response) => { - const responseData = response.result; - return this.processResultsTable(responseData.data, responseData.isSummary); - }); - } - getSummaryDataReaderAsync(visualId, pageRowCount, ignoreAliases, ignoreSelection, includeAllColumns, columnsToIncludeById, includeDataValuesOption, applyWorksheetFormatting) { - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'getSummaryDataReaderAsync', - [api_internal_contract_js_1.ParameterId.ViewDataTableCacheId]: this.getViewDataTableCacheId(), - [api_internal_contract_js_1.ParameterId.VisualId]: visualId, - [api_internal_contract_js_1.ParameterId.PageRowCount]: pageRowCount, - [api_internal_contract_js_1.ParameterId.IgnoreAliases]: ignoreAliases, - [api_internal_contract_js_1.ParameterId.IgnoreSelection]: ignoreSelection, - [api_internal_contract_js_1.ParameterId.IncludeAllColumns]: includeAllColumns, - [api_internal_contract_js_1.ParameterId.ColumnsToIncludeById]: this.verifyIncludeColumnArray(columnsToIncludeById), - [api_internal_contract_js_1.ParameterId.ShowDataTableFormat]: ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption), - [api_internal_contract_js_1.ParameterId.ApplyWorksheetFormatting]: applyWorksheetFormatting, - }; - return this.execute(api_internal_contract_js_1.VerbId.GetDataSummaryDataReader, parameters).then((response) => { - const responseData = response.result; - return new GetDataTableReaderModels_1.DataTableReader(responseData.id, responseData.totalRowCount, pageRowCount, this._registryId); - }); - } - getSummaryColumnsInfoAsync(visualId) { - // Create all the parameters for GetDataType of Summary with 1 row, and only native values - // Then return just the columns - const verb = api_internal_contract_js_1.VerbId.GetDataSummaryData; - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'getSummaryColumnsInfoAsync', - [api_internal_contract_js_1.ParameterId.VisualId]: visualId, - [api_internal_contract_js_1.ParameterId.IgnoreAliases]: true, - [api_internal_contract_js_1.ParameterId.IgnoreSelection]: true, - [api_internal_contract_js_1.ParameterId.IncludeAllColumns]: true, - [api_internal_contract_js_1.ParameterId.MaxRows]: 1, - [api_internal_contract_js_1.ParameterId.ShowDataTableFormat]: api_internal_contract_js_1.ApiShowDataTableFormat.NativeValuesOnly, - }; - return this.execute(verb, parameters).then((response) => { - const underlyingDataTable = response.result; - const dataTable = underlyingDataTable.data; - const columns = dataTable.headers.map((h) => new GetDataModels_1.Column(h.fieldCaption, h.fieldName, h.dataType, h.isReferenced, h.index)); - return columns; - }); - } - getSelectedMarksAsync(visualId) { - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'getSelectedMarksAsync', - [api_internal_contract_js_1.ParameterId.VisualId]: visualId, - }; - return this.execute(api_internal_contract_js_1.VerbId.GetSelectedMarks, parameters).then((response) => { - const responseData = response.result; - return { - data: responseData.data.map((table) => this.processResultsTable(table, true)), - }; - }); - } - getHighlightedMarksAsync(visualId) { - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'getHighlightedMarksAsync', - [api_internal_contract_js_1.ParameterId.VisualId]: visualId, - }; - return this.execute(api_internal_contract_js_1.VerbId.GetHighlightedMarks, parameters).then((response) => { - const responseData = response.result; - return { - data: responseData.data.map((table) => this.processResultsTable(table, true)), - }; - }); - } - getDataSourceDataAsync(dataSourceId, ignoreAliases, maxRows, columnsToInclude, columnsToIncludeById, includeDataValuesOption) { - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'getDataSourceDataAsync', - [api_internal_contract_js_1.ParameterId.DataSourceId]: dataSourceId, - [api_internal_contract_js_1.ParameterId.IgnoreAliases]: ignoreAliases, - [api_internal_contract_js_1.ParameterId.MaxRows]: this.getLimitedMaxRows(maxRows, this.getMaxRowLimit() + 1), - [api_internal_contract_js_1.ParameterId.ColumnsToInclude]: this.verifyIncludeColumnArray(columnsToInclude), - [api_internal_contract_js_1.ParameterId.ColumnsToIncludeById]: this.verifyIncludeColumnArray(columnsToIncludeById), - [api_internal_contract_js_1.ParameterId.ShowDataTableFormat]: ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption), - }; - return this.execute(api_internal_contract_js_1.VerbId.GetDataSourceData, parameters).then((response) => { - const responseData = response.result; - return this.processResultsTable(responseData.data, false); - }); - } - getLogicalTableDataAsync(datasourceId, logicalTableId, ignoreAliases, maxRows, columnsToInclude, columnsToIncludeById, includeDataValuesOption) { - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'getLogicalTableDataAsync', - [api_internal_contract_js_1.ParameterId.ColumnsToInclude]: columnsToInclude, - [api_internal_contract_js_1.ParameterId.ColumnsToIncludeById]: this.verifyIncludeColumnArray(columnsToIncludeById), - [api_internal_contract_js_1.ParameterId.DataSourceId]: datasourceId, - [api_internal_contract_js_1.ParameterId.IgnoreAliases]: ignoreAliases, - [api_internal_contract_js_1.ParameterId.LogicalTableId]: logicalTableId, - [api_internal_contract_js_1.ParameterId.MaxRows]: this.getLimitedMaxRows(maxRows, this.getMaxRowLimit() + 1), - [api_internal_contract_js_1.ParameterId.ShowDataTableFormat]: ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption), - }; - return this.execute(api_internal_contract_js_1.VerbId.GetLogicalTableData, parameters).then((response) => { - const responseData = response.result; - return this.processResultsTable(responseData.data, false); - }); - } - getLogicalTableDataReaderAsync(datasourceId, logicalTableId, pageRowCount, ignoreAliases, columnsToIncludeById, includeDataValuesOption) { - pageRowCount = this.getLimitedMaxRows(pageRowCount, this.getMaxRowLimit()); - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'getLogicalTableDataReaderAsync', - [api_internal_contract_js_1.ParameterId.ViewDataTableCacheId]: this.getViewDataTableCacheId(), - [api_internal_contract_js_1.ParameterId.DataSourceId]: datasourceId, - [api_internal_contract_js_1.ParameterId.LogicalTableId]: logicalTableId, - [api_internal_contract_js_1.ParameterId.PageRowCount]: pageRowCount, - [api_internal_contract_js_1.ParameterId.IgnoreAliases]: ignoreAliases, - [api_internal_contract_js_1.ParameterId.ColumnsToIncludeById]: this.verifyIncludeColumnArray(columnsToIncludeById), - [api_internal_contract_js_1.ParameterId.ShowDataTableFormat]: ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption), - }; - return this.execute(api_internal_contract_js_1.VerbId.GetLogicalTableDataReader, parameters).then((response) => { - const responseData = response.result; - return new GetDataTableReaderModels_1.DataTableReader(responseData.id, responseData.totalRowCount, pageRowCount, this._registryId); - }); - } - getUnderlyingTableDataAsync(visualId, logicalTableId, ignoreAliases, ignoreSelection, includeAllColumns, columnsToIncludeById, maxRows, includeDataValuesOption, applyWorksheetFormatting) { - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'getUnderlyingTableDataAsync', - [api_internal_contract_js_1.ParameterId.VisualId]: visualId, - [api_internal_contract_js_1.ParameterId.LogicalTableId]: logicalTableId, - [api_internal_contract_js_1.ParameterId.IgnoreAliases]: ignoreAliases, - [api_internal_contract_js_1.ParameterId.IgnoreSelection]: ignoreSelection, - [api_internal_contract_js_1.ParameterId.IncludeAllColumns]: includeAllColumns, - [api_internal_contract_js_1.ParameterId.ColumnsToIncludeById]: this.verifyIncludeColumnArray(columnsToIncludeById), - [api_internal_contract_js_1.ParameterId.MaxRows]: this.getLimitedMaxRows(maxRows, this.getMaxRowLimit() + 1), - [api_internal_contract_js_1.ParameterId.ShowDataTableFormat]: ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption), - [api_internal_contract_js_1.ParameterId.ApplyWorksheetFormatting]: applyWorksheetFormatting, - }; - return this.execute(api_internal_contract_js_1.VerbId.GetUnderlyingTableData, parameters).then((response) => { - const responseData = response.result; - return this.processResultsTable(responseData.data, false); - }); - } - getUnderlyingTableDataReaderAsync(visualId, logicalTableId, pageRowCount, ignoreAliases, ignoreSelection, includeAllColumns, columnsToIncludeById, includeDataValuesOption, applyWorksheetFormatting) { - pageRowCount = this.getLimitedMaxRows(pageRowCount, this.getMaxRowLimit()); - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'getUnderlyingTableDataReaderAsync', - [api_internal_contract_js_1.ParameterId.ViewDataTableCacheId]: this.getViewDataTableCacheId(), - [api_internal_contract_js_1.ParameterId.VisualId]: visualId, - [api_internal_contract_js_1.ParameterId.LogicalTableId]: logicalTableId, - [api_internal_contract_js_1.ParameterId.IgnoreAliases]: ignoreAliases, - [api_internal_contract_js_1.ParameterId.IgnoreSelection]: ignoreSelection, - [api_internal_contract_js_1.ParameterId.IncludeAllColumns]: includeAllColumns, - [api_internal_contract_js_1.ParameterId.ColumnsToIncludeById]: this.verifyIncludeColumnArray(columnsToIncludeById), - [api_internal_contract_js_1.ParameterId.ShowDataTableFormat]: ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption), - [api_internal_contract_js_1.ParameterId.PageRowCount]: pageRowCount, - [api_internal_contract_js_1.ParameterId.ApplyWorksheetFormatting]: applyWorksheetFormatting, - }; - return this.execute(api_internal_contract_js_1.VerbId.GetUnderlyingTableDataReader, parameters).then((response) => { - const responseData = response.result; - return new GetDataTableReaderModels_1.DataTableReader(responseData.id, responseData.totalRowCount, pageRowCount, this._registryId); - }); - } - getPageAsync(tableId, pageNumber, pageSize) { - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'getPageAsync', - [api_internal_contract_js_1.ParameterId.ViewDataTableCacheId]: this.getViewDataTableCacheId(), - [api_internal_contract_js_1.ParameterId.ViewDataTableId]: tableId, - [api_internal_contract_js_1.ParameterId.DataRowIndex]: pageNumber * pageSize, - }; - return this.execute(api_internal_contract_js_1.VerbId.GetDataTableReaderPage, parameters).then((response) => { - const responseData = response.result; - return this.processResultsPage(responseData, tableId === GetDataServiceImpl.summaryTableId ? true : false); - }); - } - releaseAsync(tableId) { - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'release', - [api_internal_contract_js_1.ParameterId.ViewDataTableCacheId]: this.getViewDataTableCacheId(), - [api_internal_contract_js_1.ParameterId.ViewDataTableId]: tableId, - }; - return this.execute(api_internal_contract_js_1.VerbId.ReleaseDataTableReader, parameters).then((response) => { - return; - }); - } - verifyIncludeColumnArray(columns) { - // columns must be a valid array - if (!Array.isArray(columns)) { - throw new ApiShared_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, 'columnsToInclude and columnsToIncludeById must be valid arrays'); - } - // Remove any duplicates from the input array - const columnsAsSet = new Set(columns); - return Array.from(columnsAsSet); - } - processResultsTable(responseData, isSummary) { - const headers = responseData.headers.map((h) => new GetDataModels_1.Column(h.fieldCaption, h.fieldName, h.dataType, h.isReferenced, h.index)); - // TODO This should be controlled by a flag indicating whether this api will respond marks info or not - let marks; - if (responseData.marks) { - marks = responseData.marks.map((h) => new GetDataModels_1.MarkInfo(h.type, h.color, h.tupleId)); - } - // Limit+1 is our sentinal that underlying data contains more rows than user is allowed to fetch. - // Remove the last element so we always return MaxRowLimit - const isTotalRowCountLimited = isSummary === false && responseData.dataTable.length === this.getMaxRowLimit() + 1; - if (isTotalRowCountLimited) { - responseData.dataTable.length -= 1; - } - const table = responseData.dataTable.map((row) => { - return row.map((cell, index) => { - return DataValueFactory_1.DataValueFactory.MakeTableDataValue(cell, headers[index].dataType); - }); - }); - if (marks) { - return new GetDataModels_1.DataTable(table, headers, table.length, isTotalRowCountLimited, isSummary, marks); - } - return new GetDataModels_1.DataTable(table, headers, table.length, isTotalRowCountLimited, isSummary); - } - processResultsPage(responseData, isSummary) { - const headers = responseData.headers.map((h) => new GetDataModels_1.Column(h.fieldCaption, h.fieldName, h.dataType, h.isReferenced, h.index)); - let marks; - if (responseData.marks) { - marks = responseData.marks.map((h) => new GetDataModels_1.MarkInfo(h.type, h.color, h.tupleId)); - } - const table = responseData.dataTable.map((row) => { - return row.map((cell, index) => { - return DataValueFactory_1.DataValueFactory.MakeTableDataValue(cell, headers[index].dataType); - }); - }); - if (marks) { - return new GetDataModels_1.DataTable(table, headers, table.length, false, isSummary, marks); - } - return new GetDataModels_1.DataTable(table, headers, table.length, false, isSummary); - } -} -exports.GetDataServiceImpl = GetDataServiceImpl; -GetDataServiceImpl.summaryTableId = ''; - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImpl.js": -/*!***********************************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImpl.js ***! - \***********************************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const NotificationServiceImplBase_1 = __webpack_require__(/*! ./NotificationServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImplBase.js"); -class NotificationServiceImpl extends NotificationServiceImplBase_1.NotificationServiceImplBase { - get serviceName() { - return "notification-service" /* Notification */; - } -} -exports.NotificationServiceImpl = NotificationServiceImpl; - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImplBase.js": -/*!***************************************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImplBase.js ***! - \***************************************************************************************/ -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -class Registration { - constructor(_filterFn, _callbackFn) { - this._filterFn = _filterFn; - this._callbackFn = _callbackFn; - // Nothing Here - } - onNotification(notificationModel) { - if (this._filterFn(notificationModel)) { - this._callbackFn(notificationModel); - } - } -} -exports.Registration = Registration; -class NotificationServiceImplBase { - constructor(dispatcher) { - this.dispatcher = dispatcher; - this._handlers = {}; - this.dispatcher.registerNotificationHandler(this.onNotification.bind(this)); - } - registerHandler(id, filterFn, handler) { - const handlers = this._handlers[id] || new Array(); - const registration = new Registration(filterFn, handler); - handlers.push(registration); - this._handlers[id] = handlers; - return () => this.removeRegistration(id, registration); - } - hasHandlersForNotificationType(id) { - // eslint-disable-next-line no-prototype-builtins - return this._handlers.hasOwnProperty(id); - } - onNotification(notification) { - if (!this.hasHandlersForNotificationType(notification.notificationId)) { - return; - } - // Go through and check for all the handlers of this particular notification - this._handlers[notification.notificationId].forEach((h) => h.onNotification(notification.data)); - } - removeRegistration(id, registration) { - if (!this.hasHandlersForNotificationType(id)) { - return; - } - this._handlers[id] = this._handlers[id].filter((reg) => reg !== registration); - } -} -exports.NotificationServiceImplBase = NotificationServiceImplBase; - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/ParametersServiceImpl.js": -/*!*********************************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Services/impl/ParametersServiceImpl.js ***! - \*********************************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -const ParameterImpl_1 = __webpack_require__(/*! ../../Impl/ParameterImpl */ "../api-shared-js/lib/src/ApiShared/Impl/ParameterImpl.js"); -const TableauError_1 = __webpack_require__(/*! ../../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); -const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); -class ParametersServiceImpl extends ServiceImplBase_1.ServiceImplBase { - get serviceName() { - return "parameters-service" /* Parameters */; - } - getParametersForSheetAsync(sheetPath) { - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'getParametersForSheetAsync', - [api_internal_contract_js_1.ParameterId.SheetPath]: sheetPath, - }; - return this.getParametersAsync(parameters); - } - getAllParametersAsync() { - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'getParametersForSheetAsync', - }; - return this.getParametersAsync(parameters); - } - getParametersAsync(inputParameters) { - return this.execute(api_internal_contract_js_1.VerbId.GetParametersForSheet, inputParameters).then((response) => { - const result = response.result; - return result.map((parameterInfo) => { - return new ParameterImpl_1.ParameterImpl(parameterInfo, this._registryId); - }); - }); - } - changeParameterValueAsync(fieldName, newValue) { - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'changeParameterValueAsync', - [api_internal_contract_js_1.ParameterId.ParameterFieldName]: fieldName, - [api_internal_contract_js_1.ParameterId.ParameterValue]: newValue, - }; - return this.execute(api_internal_contract_js_1.VerbId.ChangeParameterValue, parameters).then((response) => { - const result = response.result; - return result; - }); - } - findParameterByNameAsync(name) { - return this.findParameterAsync(name, undefined); - } - findParameterByGlobalFieldNameAsync(fieldName) { - return this.findParameterAsync(undefined, fieldName); - } - findParameterAsync(name, fieldName) { - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'findParameterAsync', - }; - if (name !== undefined) { - parameters[api_internal_contract_js_1.ParameterId.ParameterCaption] = name; - } - else if (fieldName !== undefined) { - parameters[api_internal_contract_js_1.ParameterId.ParameterFieldName] = fieldName; - } - else { - throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, 'name or fieldName must be provided to find parameter'); - } - return this.execute(api_internal_contract_js_1.VerbId.FindParameter, parameters).then((response) => { - const instanceOfParameterInfo = (object) => { - return 'fieldName' in object; - }; - // We need to check to see if we got a valid response back again - if (instanceOfParameterInfo(response.result)) { - const result = response.result; - return new ParameterImpl_1.ParameterImpl(result, this._registryId); - } - else { - return undefined; - } - }); - } -} -exports.ParametersServiceImpl = ParametersServiceImpl; - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/SelectionServiceImpl.js": -/*!********************************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Services/impl/SelectionServiceImpl.js ***! - \********************************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -const SelectionModels_1 = __webpack_require__(/*! ../../Models/SelectionModels */ "../api-shared-js/lib/src/ApiShared/Models/SelectionModels.js"); -const TableauError_1 = __webpack_require__(/*! ../../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); -const Param_1 = __webpack_require__(/*! ../../Utils/Param */ "../api-shared-js/lib/src/ApiShared/Utils/Param.js"); -const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); -class SelectionServiceImpl extends ServiceImplBase_1.ServiceImplBase { - get serviceName() { - return "selection-service" /* Selection */; - } - /** - * Method to clear all the selected marks for the given worksheet. - * - * @param visualId - */ - clearSelectedMarksAsync(visualId) { - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'clearSelectedMarksAsync', - [api_internal_contract_js_1.ParameterId.VisualId]: visualId, - }; - return this.execute(api_internal_contract_js_1.VerbId.ClearSelectedMarks, parameters).then((response) => { - return; // Expecting an empty model and hence the void response. - }); - } - /** - * Method to select marks for the given worksheet. - * - * @param visualId - * @param selectionCriteria - * @param selectionUpdateType - */ - selectMarksByValueAsync(visualId, selectionCriterias, selectionUpdateType) { - if (selectionCriterias.length === 0) { - throw new TableauError_1.TableauError(Contract.ErrorCodes.InvalidParameter, 'Selection criteria missing for selecting marks by value'); - } - const selectionType = this.validateSelectionUpdateType(selectionUpdateType); - const selectionModelContainer = this.parseSelectionMarks(selectionCriterias); - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'selectMarksByValueAsync', - [api_internal_contract_js_1.ParameterId.VisualId]: visualId, - [api_internal_contract_js_1.ParameterId.SelectionUpdateType]: selectionType, - }; - if (selectionModelContainer.hierModelArr && selectionModelContainer.hierModelArr.length) { - parameters[api_internal_contract_js_1.ParameterId.HierValSelectionModels] = selectionModelContainer.hierModelArr; - } - if (selectionModelContainer.quantModelArr && selectionModelContainer.quantModelArr.length) { - parameters[api_internal_contract_js_1.ParameterId.QuantRangeSelectionModels] = selectionModelContainer.quantModelArr; - } - if (selectionModelContainer.dimModelArr && selectionModelContainer.dimModelArr.length) { - parameters[api_internal_contract_js_1.ParameterId.DimValSelectionModels] = selectionModelContainer.dimModelArr; - } - return this.execute(api_internal_contract_js_1.VerbId.SelectByValue, parameters).then((response) => { - this.apiFilterHandlerCheckForCommandError(response.result); - return; - }); - } - /** - * Method to execute hover actions and render tooltip for a given tuple representing a mark in the visualization. - * If the tooltip parameter is included it will show the tooltip on hover. If not, no tooltip is shown. - * - * @param visualId - * @param hoveredTuple - * @param tooltip - * @returns empty promise that resolves when the extension host has successfully been informed of the request and rejects on error - */ - hoverTupleAsync(visualId, hoveredTuple, tooltip, allowHoverActions) { - let interactionModel = new SelectionModels_1.HoverTupleInteractionModel(visualId, this.ensureTupleIDIsNonNegative(hoveredTuple), tooltip, allowHoverActions); - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'hoverTupleAsync', - [api_internal_contract_js_1.ParameterId.HoverTupleInteraction]: interactionModel, - }; - return this.execute(api_internal_contract_js_1.VerbId.RaiseHoverTupleNotification, parameters).then((response) => { - return; - }); - } - /** - * Method to modify selection, execute select actions and render tooltip for a given list of tuples representing a mark or marks in the visualization. - * If the tooltip parameter is included it will show the tooltip on select. If not, no tooltip is shown. - * - * @param visualId - * @param selectedTuples - * @param selectOption - * @param tooltip - * @returns empty promise that resolves when the extension host has successfully been informed of the request and rejects on error - */ - selectTuplesAsync(visualId, selectedTuples, selectOption, tooltip) { - let interactionModel = new SelectionModels_1.SelectTuplesInteractionModel(visualId, selectedTuples, selectOption, tooltip); - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'selectTuplesAsync', - [api_internal_contract_js_1.ParameterId.SelectTuplesInteraction]: interactionModel, - }; - return this.execute(api_internal_contract_js_1.VerbId.RaiseSelectTuplesNotification, parameters).then((response) => { - return; - }); - } - apiFilterHandlerCheckForCommandError(serverPm) { - if (!serverPm[api_internal_contract_js_1.ParameterId.ParameterError]) { - return; - } - if (serverPm[api_internal_contract_js_1.ParameterId.InvalidFields]) { - throw new TableauError_1.TableauError(Contract.SharedErrorCodes.InvalidSelectionFieldName, serverPm[api_internal_contract_js_1.ParameterId.InvalidFields]); - } - if (serverPm[api_internal_contract_js_1.ParameterId.InvalidValues]) { - throw new TableauError_1.TableauError(Contract.SharedErrorCodes.InvalidSelectionValue, serverPm[api_internal_contract_js_1.ParameterId.InvalidValues]); - } - if (serverPm[api_internal_contract_js_1.ParameterId.InvalidDates]) { - throw new TableauError_1.TableauError(Contract.SharedErrorCodes.InvalidSelectionDate, serverPm[api_internal_contract_js_1.ParameterId.InvalidDates]); - } - } - /** - * Method to select marks for the given worksheet. - * - * @param visualId - * @param MarkInfo - * @param selectionUpdateType - */ - selectMarksByIdAsync(visualId, marks, selectionUpdateType) { - if (marks.length === 0) { - throw new TableauError_1.TableauError(Contract.ErrorCodes.InvalidParameter, 'Marks info missing for selecting marks by Id'); - } - const selectionType = this.validateSelectionUpdateType(selectionUpdateType); - const selectionModelContainer = this.parseSelectionIds(marks); - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'selectMarksByIdAsync', - [api_internal_contract_js_1.ParameterId.VisualId]: visualId, - [api_internal_contract_js_1.ParameterId.SelectionUpdateType]: selectionType, - [api_internal_contract_js_1.ParameterId.Selection]: selectionModelContainer.selection, - }; - return this.execute(api_internal_contract_js_1.VerbId.SelectByValue, parameters).then((response) => { - // Expecting an empty model and hence the void response. - return; - // TODO Investigate the error response with multiple output params and throw error accordingly. - }); - } - /** - * Method to prepare the pres models for selection by MarksInfo - * @param marks - */ - parseSelectionIds(marks) { - const ids = []; - const selectionModelContainer = new SelectionModels_1.SelectionModelsContainer(); - for (let i = 0; i < marks.length; i++) { - const tupleId = marks[i].tupleId; - if (tupleId !== undefined && tupleId !== null) { - // If tuple id is provided use that instead of pair - ids.push(tupleId.toString()); // collect the tuple ids - } - else { - throw new TableauError_1.TableauError(Contract.ErrorCodes.InternalError, 'tupleId parsing error'); - } - } - if (ids.length !== 0) { - // tuple ids based selection - const tupleSelectionModel = new SelectionModels_1.TupleSelectionModel(); - tupleSelectionModel.selectionType = 'tuples'; - tupleSelectionModel.objectIds = ids; - selectionModelContainer.selection = tupleSelectionModel; - } - return selectionModelContainer; - } - /** - * Method to prepare the pres models for selection by values. - * - * Supports 3 types for selection: - * 1) Hierarchical value based selection - * 2) Range value based selection - * 3) Dimension value based selection - * - * @param marks - */ - parseSelectionMarks(selectionCriterias) { - const selectionModelContainer = new SelectionModels_1.SelectionModelsContainer(); - for (let i = 0; i < selectionCriterias.length; i++) { - const st = selectionCriterias[i]; - if (!(st.fieldName && st.value !== undefined && st.value !== null)) { - throw new TableauError_1.TableauError(Contract.ErrorCodes.InternalError, 'Selection Criteria parsing error'); - } - const catRegex = new RegExp('([[A-Za-z0-9]+]).*', 'g'); - const rangeOption = st.value; - if (catRegex.test(st.fieldName)) { - // Hierarchical value selection - const hierModel = this.addToParamsList(st.fieldName, st.value); - selectionModelContainer.hierModelArr.push(hierModel); - } - else if (rangeOption.min !== undefined && rangeOption.max !== undefined) { - // Range value selection - const quantModel = this.addToRangeParamsList(st.fieldName, rangeOption); - selectionModelContainer.quantModelArr.push(quantModel); - } - else { - // Dimension value selection - const dimModel = this.addToParamsList(st.fieldName, st.value); - selectionModelContainer.dimModelArr.push(dimModel); - } - } - return selectionModelContainer; - } - /** - * Method to transform the key value pair into value based pres model object. - * - * @param valueSelectionModel - * @param fieldName - * @param value - */ - addToParamsList(fieldName, value) { - const valueSelectionModel = new SelectionModels_1.ValueSelectionModel(); - const markValues = []; - if (value instanceof Array) { - const valueArr = value; - for (let i = 0; i < valueArr.length; i++) { - markValues.push(Param_1.Param.serializeParameterValue(valueArr[i])); - } - } - else { - markValues.push(Param_1.Param.serializeParameterValue(value)); - } - valueSelectionModel.qualifiedFieldCaption = fieldName; - valueSelectionModel.selectValues = markValues; - return valueSelectionModel; - } - /** - * Method to transform the key value pair into range based selection pres model. - * - * TODO: Need to handle the parsing of date type values. - * - * @param valueSelectionModel - * @param fieldName - * @param value - */ - addToRangeParamsList(fieldName, value) { - const rangeSelectionModel = new SelectionModels_1.RangeSelectionModel(); - rangeSelectionModel.qualifiedFieldCaption = fieldName; - if (value.max !== undefined && value.max !== null) { - rangeSelectionModel.maxValue = Param_1.Param.serializeParameterValue(value.max); - } - if (value.min !== undefined && value.min !== null) { - rangeSelectionModel.minValue = Param_1.Param.serializeParameterValue(value.min); - } - rangeSelectionModel.included = this.validateNullOptionType(value.nullOption); - return rangeSelectionModel; - } - /** - * Method to validate the selection update type. - * - * @param selectionUpdateType - */ - validateSelectionUpdateType(selectionUpdateType) { - if (selectionUpdateType === Contract.SelectionUpdateType.Replace) { - return api_internal_contract_js_1.SelectionUpdateType.Replace; - } - else if (selectionUpdateType === Contract.SelectionUpdateType.Add) { - return api_internal_contract_js_1.SelectionUpdateType.Add; - } - else if (selectionUpdateType === Contract.SelectionUpdateType.Remove) { - return api_internal_contract_js_1.SelectionUpdateType.Remove; - } - return api_internal_contract_js_1.SelectionUpdateType.Replace; - } - /** - * Method to validate the include type for range selection. - * - * @param nullOption - */ - validateNullOptionType(nullOption) { - if (nullOption) { - if (nullOption === Contract.FilterNullOption.NullValues) { - return api_internal_contract_js_1.QuantitativeIncludedValues.IncludeNull; - } - else if (nullOption === Contract.FilterNullOption.NonNullValues) { - return api_internal_contract_js_1.QuantitativeIncludedValues.IncludeNonNull; - } - else if (nullOption === Contract.FilterNullOption.AllValues) { - return api_internal_contract_js_1.QuantitativeIncludedValues.IncludeAll; - } - } - return api_internal_contract_js_1.QuantitativeIncludedValues.IncludeAll; - } - ensureTupleIDIsNonNegative(tupleId) { - if (tupleId && tupleId > 0) { - return tupleId; - } - // 0 will not refer to a valid tuple (since tuple ids are 1-based), - // but can be used for clearing the current hover or selection - return 0; - } -} -exports.SelectionServiceImpl = SelectionServiceImpl; - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js": -/*!***************************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js ***! - \***************************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const InternalToExternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/InternalToExternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js"); -const TableauError_1 = __webpack_require__(/*! ../../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); -const EnumConverter_1 = __webpack_require__(/*! ../../Utils/EnumConverter */ "../api-shared-js/lib/src/ApiShared/Utils/EnumConverter.js"); -/** - * Each ServceImpl should extend this base class for the sake of - * proper error handling. This base handles the conversion - * from internal errors to external errors that we throw to developers - */ -class ServiceImplBase { - constructor(_dispatcher, _registryId) { - this._dispatcher = _dispatcher; - this._registryId = _registryId; - } - execute(verb, params) { - return this._dispatcher.execute(verb, params).catch((error) => { - // Any internal error that comes from the dispatcher should be converted - // to an external error using the enum mapper for error codes. - const internalError = error; - const externalErrorCode = InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.errorCode.convert(internalError.errorCode, EnumConverter_1.ShouldThrow.No); - throw new TableauError_1.TableauError(externalErrorCode, internalError.message); - }); - } -} -exports.ServiceImplBase = ServiceImplBase; - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/SizeServiceImpl.js": -/*!***************************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Services/impl/SizeServiceImpl.js ***! - \***************************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); -class SizeServiceImpl extends ServiceImplBase_1.ServiceImplBase { - get serviceName() { - return "size-service" /* Size */; - } - changeSizeAsync(name, newSize) { - var _a, _b, _c, _d; - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'changeSizeAsync', - [api_internal_contract_js_1.ParameterId.SheetName]: name, - [api_internal_contract_js_1.ParameterId.MinHeight]: ((_a = newSize.minSize) === null || _a === void 0 ? void 0 : _a.height) || 0, - [api_internal_contract_js_1.ParameterId.MinWidth]: ((_b = newSize.minSize) === null || _b === void 0 ? void 0 : _b.width) || 0, - [api_internal_contract_js_1.ParameterId.MaxHeight]: ((_c = newSize.maxSize) === null || _c === void 0 ? void 0 : _c.height) || 0, - [api_internal_contract_js_1.ParameterId.MaxWidth]: ((_d = newSize.maxSize) === null || _d === void 0 ? void 0 : _d.width) || 0, - }; - return this.execute(api_internal_contract_js_1.VerbId.SetSheetSize, parameters).then((_response) => { - return; - }); - } -} -exports.SizeServiceImpl = SizeServiceImpl; - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/StoryActivationServiceImpl.js": -/*!**************************************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Services/impl/StoryActivationServiceImpl.js ***! - \**************************************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); -class StoryActivationServiceImpl extends ServiceImplBase_1.ServiceImplBase { - get serviceName() { - return "story-activation-service" /* StoryActivation */; - } - activateNextStoryPointAsync() { - const verb = api_internal_contract_js_1.VerbId.ActivateNextStoryPoint; - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'activateNextStoryPointAsync', - }; - return this.execute(verb, parameters).then((response) => { - return; - }); - } - activatePreviousStoryPointAsync() { - const verb = api_internal_contract_js_1.VerbId.ActivatePreviousStoryPoint; - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'activatePreviousStoryPointAsync', - }; - return this.execute(verb, parameters).then((response) => { - return; - }); - } - activateStoryPointAsync(index) { - const verb = api_internal_contract_js_1.VerbId.ActivateStoryPoint; - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'activateStoryPointAsync', - }; - parameters[api_internal_contract_js_1.ParameterId.StoryPointIndex] = index; - return this.execute(verb, parameters).then((response) => { - return; - }); - } - revertStoryPointAsync(index) { - const verb = api_internal_contract_js_1.VerbId.RevertStoryPoint; - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'revertStoryPointAsync', - }; - parameters[api_internal_contract_js_1.ParameterId.StoryPointIndex] = index; - return this.execute(verb, parameters).then((response) => { - return response.result; - }); - } -} -exports.StoryActivationServiceImpl = StoryActivationServiceImpl; - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/VisualModelServiceImpl.js": -/*!**********************************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Services/impl/VisualModelServiceImpl.js ***! - \**********************************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); -class VisualModelServiceImpl extends ServiceImplBase_1.ServiceImplBase { - get serviceName() { - return "visual-model-service" /* VisualModel */; - } - getVisualSpecificationAsync(visualId) { - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'getVisualSpecificationAsync', - [api_internal_contract_js_1.ParameterId.WorksheetName]: visualId.worksheet, - }; - return this.execute(api_internal_contract_js_1.VerbId.GetVisualSpecification, parameters).then((response) => { - const result = response.result; - return result; - }); - } - addMarksCardFieldsAsync(visualId, marksCardIndex, encodingType, columns, startIndex) { - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'addMarksCardFieldsAsync', - [api_internal_contract_js_1.ParameterId.WorksheetName]: visualId.worksheet, - [api_internal_contract_js_1.ParameterId.MarksCardIndex]: marksCardIndex, - [api_internal_contract_js_1.ParameterId.EncodingType]: encodingType, - [api_internal_contract_js_1.ParameterId.Columns]: columns, - [api_internal_contract_js_1.ParameterId.StartIndex]: startIndex, - }; - return this.execute(api_internal_contract_js_1.VerbId.AddMarksCardFields, parameters).then(() => { - return; - }); - } - moveMarksCardFieldAsync(visualId, marksCardIndex, fromIndex, toIndex, fieldCount = 1) { - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'addMarksCardFieldsAsync', - [api_internal_contract_js_1.ParameterId.WorksheetName]: visualId.worksheet, - [api_internal_contract_js_1.ParameterId.MarksCardIndex]: marksCardIndex, - [api_internal_contract_js_1.ParameterId.FromIndex]: fromIndex, - [api_internal_contract_js_1.ParameterId.ToIndex]: toIndex, - [api_internal_contract_js_1.ParameterId.FieldCount]: fieldCount, - }; - return this.execute(api_internal_contract_js_1.VerbId.MoveMarksCardField, parameters).then(() => { - return; - }); - } - spliceMarksCardFieldsAsync(visualId, marksCardIndex, encodingType, startIndex, deleteCount, columns) { - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'spliceMarksCardFieldsAsync', - [api_internal_contract_js_1.ParameterId.WorksheetName]: visualId.worksheet, - [api_internal_contract_js_1.ParameterId.MarksCardIndex]: marksCardIndex, - [api_internal_contract_js_1.ParameterId.EncodingType]: encodingType, - [api_internal_contract_js_1.ParameterId.StartIndex]: startIndex, - [api_internal_contract_js_1.ParameterId.DeleteCount]: deleteCount, - [api_internal_contract_js_1.ParameterId.Columns]: columns, - }; - return this.execute(api_internal_contract_js_1.VerbId.SpliceMarksCardFields, parameters).then(() => { - return; - }); - } - editAliasesDialogAsync(fieldName) { - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'editAliasesDialogAsync', - [api_internal_contract_js_1.ParameterId.FieldId]: fieldName, - }; - return this.execute(api_internal_contract_js_1.VerbId.EditAliasesDialog, parameters).then(() => { - return; - }); - } -} -exports.VisualModelServiceImpl = VisualModelServiceImpl; - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/VizServiceImpl.js": -/*!**************************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Services/impl/VizServiceImpl.js ***! - \**************************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -const CustomViewImpl_1 = __webpack_require__(/*! ../../Impl/CustomViewImpl */ "../api-shared-js/lib/src/ApiShared/Impl/CustomViewImpl.js"); -const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); -class VizServiceImpl extends ServiceImplBase_1.ServiceImplBase { - get serviceName() { - return "viz-service" /* Viz */; - } - createVizImageAsync(inputSpec) { - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'createVizImageAsync', - [api_internal_contract_js_1.ParameterId.VizAPIInputJson]: JSON.stringify(inputSpec), - }; - return this.execute(api_internal_contract_js_1.VerbId.VizAPI, parameters).then((response) => { - const result = response.result; - return result; - }); - } - activateSheetAsync(name) { - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'activateSheetAsync', - [api_internal_contract_js_1.ParameterId.SwitchToSheetName]: name, - }; - return this.execute(api_internal_contract_js_1.VerbId.ActivateSheet, parameters).then(() => { - return; - }); - } - getCustomViewsAsync() { - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'getCustomViewsAsync', - }; - return this.execute(api_internal_contract_js_1.VerbId.GetCustomViews, parameters).then((response) => { - const customViews = response.result; - return customViews.map((customView) => { - return new CustomViewImpl_1.CustomViewImpl(customView, this._registryId); - }); - }); - } - showCustomViewAsync(customViewName) { - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'showCustomViewAsync', - [api_internal_contract_js_1.ParameterId.CustomViewName]: customViewName || '', - }; - return this.execute(api_internal_contract_js_1.VerbId.ShowCustomView, parameters).then((response) => { - var _a; - const customView = response.result; - return ((_a = customView) === null || _a === void 0 ? void 0 : _a.luid) ? new CustomViewImpl_1.CustomViewImpl(customView, this._registryId) : undefined; - }); - } - removeCustomViewAsync(customViewName) { - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'removeCustomViewAsync', - [api_internal_contract_js_1.ParameterId.CustomViewName]: customViewName, - }; - return this.execute(api_internal_contract_js_1.VerbId.RemoveCustomView, parameters).then((response) => { - const customView = response.result; - return new CustomViewImpl_1.CustomViewImpl(customView, this._registryId); - }); - } - saveCustomViewAsync(customViewName) { - // CustomViewIsDefault is a required parameter, but our API has not been updated to allow it to be specified yet. - // We should add a 'default' parameter to the interface. - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'saveCustomViewAsync', - [api_internal_contract_js_1.ParameterId.CustomViewName]: customViewName, - [api_internal_contract_js_1.ParameterId.CustomViewIsDefault]: false, - }; - return this.execute(api_internal_contract_js_1.VerbId.SaveWorkbookAsCustomView, parameters).then((response) => { - const customView = response.result; - return new CustomViewImpl_1.CustomViewImpl(customView, this._registryId); - }); - } - setActiveCustomViewAsDefaultAsync() { - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'setActiveCustomViewAsDefaultAsync', - }; - return this.execute(api_internal_contract_js_1.VerbId.SetActiveCustomViewAsDefault, parameters).then(() => { - return; - }); - } - saveAsync(customView) { - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'saveAsync', - [api_internal_contract_js_1.ParameterId.CustomViewLuid]: customView.luid, - [api_internal_contract_js_1.ParameterId.CustomViewName]: customView.name, - [api_internal_contract_js_1.ParameterId.CustomViewIsDefault]: customView.isDefault, - [api_internal_contract_js_1.ParameterId.CustomViewIsPublic]: customView.shared, - }; - return this.execute(api_internal_contract_js_1.VerbId.UpdateCustomView, parameters).then((response) => { - const customView = response.result; - return new CustomViewImpl_1.CustomViewImpl(customView, this._registryId); - }); - } - getCurrentSrcAsync() { - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'getCurrentSrcAsync', - }; - return this.execute(api_internal_contract_js_1.VerbId.GetCurrentSrc, parameters).then((response) => response.result); - } -} -exports.VizServiceImpl = VizServiceImpl; - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/ZoneServiceImpl.js": -/*!***************************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Services/impl/ZoneServiceImpl.js ***! - \***************************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -const ExternalToInternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/ExternalToInternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/ExternalToInternalEnumMappings.js"); -const ErrorHelpers_1 = __webpack_require__(/*! ../../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); -const Param_1 = __webpack_require__(/*! ../../Utils/Param */ "../api-shared-js/lib/src/ApiShared/Utils/Param.js"); -const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); -class ZoneServiceImpl extends ServiceImplBase_1.ServiceImplBase { - get serviceName() { - return "zone-service" /* Zone */; - } - setVisibilityAsync(dashboard, dashboardZoneMap, zoneVisibilityMap) { - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'setVisibilityAsync', - [api_internal_contract_js_1.ParameterId.Dashboard]: dashboard, - [api_internal_contract_js_1.ParameterId.ZoneIdsVisibilityMap]: {}, - }; - // zoneVisibilityMap can be either an object or a Map - convert it to a Map - const parameterAsMap = Param_1.Param.convertParameterToMap(zoneVisibilityMap, 'zoneVisibilityMap'); - parameterAsMap.forEach((value, key) => { - ErrorHelpers_1.ErrorHelpers.verifyZoneIsValid(dashboardZoneMap, Number.parseInt(key, 10)); - ErrorHelpers_1.ErrorHelpers.verifyEnumValue(value, api_external_contract_js_1.DashboardObjectVisibilityType, 'DashboardObjectVisibilityType'); - parameters[api_internal_contract_js_1.ParameterId.ZoneIdsVisibilityMap][key] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.setVisibilityType.convert(value); - }); - return this.execute(api_internal_contract_js_1.VerbId.SetZoneVisibility, parameters).then((response) => { - return; - }); - } - moveAndResizeAsync(dashboard, dashboardZoneMap, dashboardObjectPositionAndSizeUpdateArray) { - const parameters = { - [api_internal_contract_js_1.ParameterId.Dashboard]: dashboard, - [api_internal_contract_js_1.ParameterId.DashboardObjectPositionAndSizeUpdateList]: dashboardObjectPositionAndSizeUpdateArray, - }; - dashboardObjectPositionAndSizeUpdateArray.forEach((dashboardObject) => { - ErrorHelpers_1.ErrorHelpers.verifyZoneIsValidAndFloating(dashboardZoneMap, dashboardObject.dashboardObjectID); - ErrorHelpers_1.ErrorHelpers.verifyWidthAndHeightOfDashboardObjectPositionAndSizeUpdate(dashboardObject); - }); - return this.execute(api_internal_contract_js_1.VerbId.MoveAndResizeZones, parameters).then((response) => { - return; - }); - } -} -exports.ZoneServiceImpl = ZoneServiceImpl; - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/TableSummary.js": -/*!**********************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/TableSummary.js ***! - \**********************************************************/ -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -/** - * Implementation of a table summary. - * This does not follow the Impl pattern as it is just a property bag. - */ -class TableSummary { - constructor(_tableInfo) { - this._tableInfo = _tableInfo; - } - get name() { - return this._tableInfo.name; - } - get id() { - return this._tableInfo.id; - } - get connectionId() { - return this._tableInfo.connectionId; - } - get customSQL() { - return this._tableInfo.customSQL; - } -} -exports.TableSummary = TableSummary; - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/TableauError.js": -/*!**********************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/TableauError.js ***! - \**********************************************************/ -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -/** - * Custom error class that extends the default JavaScript Error object. - * This allows us to provide a field with a specific error code - * so that developers can more easily programmatically respond - * to error scenarios. - */ -class TableauError extends Error { - constructor(_errorCode, message) { - super(`${_errorCode}: ${message}`); - this._errorCode = _errorCode; - /*tslint:disable-next-line */ - // https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work - // Error inheritance does not work propertly when compiling to ES5, this is a workaround to force - // the proto chain to be built correctly. See the github link above for details. - Object.setPrototypeOf(this, TableauError.prototype); - } - get errorCode() { - return this._errorCode; - } -} -exports.TableauError = TableauError; - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/Utils/DataValueFactory.js": -/*!********************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Utils/DataValueFactory.js ***! - \********************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const InternalContract = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -const GetDataModels_1 = __webpack_require__(/*! ../Models/GetDataModels */ "../api-shared-js/lib/src/ApiShared/Models/GetDataModels.js"); -/** - * In version 2 of the interface, we should collapse value into nativeValue, and do all this work over - * in the platform. - */ -class DataValueFactory { - static MakeParameterDataValue(internalDataValue, dataType) { - // Parameter values are all strings, convert from string to value - return new GetDataModels_1.DataValue(internalDataValue.value, InternalContract.DataTypeConverter.convertStringValueToNativeValue(internalDataValue.value, dataType), internalDataValue.formattedValue, internalDataValue.aliasedValue, internalDataValue.hasAlias); - } - static MakeFilterDataValue(internalDataValue) { - // Filters already have native type in value, just use that for nativeValue also - return new GetDataModels_1.DataValue(internalDataValue.value, internalDataValue.value, internalDataValue.formattedValue); - } - static MakeTableDataValue(internalDataValue, dataType) { - // DataTables contain boolean | number | string | date as string | '%null% - // convertValueToNativeValue converts dates as string to dates, and any special to null - // (boolean, numbers, strings are passed through) - // Because of IncludeDataValuesOption - we can have undefined values, which are different than any special - return new GetDataModels_1.DataValue(internalDataValue.value, internalDataValue.value !== undefined - ? InternalContract.DataTypeConverter.convertValueToNativeValue(internalDataValue.value, dataType) - : undefined, internalDataValue.formattedValue); - } -} -exports.DataValueFactory = DataValueFactory; - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/Utils/Deferred.js": -/*!************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Utils/Deferred.js ***! - \************************************************************/ -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -/** - * A Promise wrapper class allowing for resolving/rejecting the Promise outside the context of its constructor. - * - * @export - * @class Deferred - * @template TResolve The type used to resolve the promise. - * @template TReject The type used to reject the promise. Defaults to any. - * @link https://stackoverflow.com/a/34637436 - */ -class Deferred { - /** - * Creates an instance of Deferred. - */ - constructor() { - this._promise = new Promise((resolve, reject) => { - this._resolve = resolve; - this._reject = reject; - }); - } - /** - * Gets the Promise. - * - * @readonly - * @type {Promise} - */ - get promise() { - return this._promise; - } - /** - * Resolves the wrapped Promise. - * - * @param {(TResolve | PromiseLike)} response The argument to be resolved by the Promise. - * @returns {*} {void} - */ - resolve(response) { - if (!this._resolve) { - return; - } - this._resolve(response); - } - /** - * - * - * @param {TReject} [reason] The reason why the Promise rejected. - * @returns {*} {void} - */ - reject(reason) { - if (!this._reject) { - return; - } - this._reject(reason); - } -} -exports.Deferred = Deferred; -exports.UnregisterTimeoutInMilliseconds = 30000; - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/Utils/EnumConverter.js": -/*!*****************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Utils/EnumConverter.js ***! - \*****************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -const TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); -/** - * This class converts from a source enum value to destination enum - * value given a mapping from source to destination when constructed. - * - * Note: This exact same class is defined in api-core. Given its small - * nature, it is not worth having in a separate project to share this between - * api-core and api-shared. If more utility functionality is added that is used by api-core - * and api-shared but has no other dependecies, a utiltity project might be merited, - * and this class could be moved. - */ -class EnumConverter { - constructor(_mappings, _defaultVal) { - this._mappings = _mappings; - this._defaultVal = _defaultVal; - } - convert(enumVal, throwIfMissing = ShouldThrow.Yes) { - if (this._mappings.hasOwnProperty(enumVal)) { - return this._mappings[enumVal]; - } - if (this._defaultVal !== undefined && throwIfMissing !== ShouldThrow.Yes) { - return this._defaultVal; - } - throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, `Enum Mapping not found for: ${enumVal}`); - } -} -exports.EnumConverter = EnumConverter; -var ShouldThrow; -(function (ShouldThrow) { - ShouldThrow["Yes"] = "yes"; - ShouldThrow["No"] = "no"; -})(ShouldThrow = exports.ShouldThrow || (exports.ShouldThrow = {})); - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js": -/*!****************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js ***! - \****************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -const TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); -const Param_1 = __webpack_require__(/*! ./Param */ "../api-shared-js/lib/src/ApiShared/Utils/Param.js"); -/** - * This class is used to construct common errors throughout the external - * projects (api-shared, extensions-api, etc.). It has some duplication with - * the ErrorHelpers class in api-core, but is separate due to the need to throw - * an external TableauError vs. an InternalTableauError. - */ -class ErrorHelpers { - /** - * Throws with code InternalError. - * - * @param apiName name of api that was called. - */ - static apiNotImplemented(apiName) { - return new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, `${apiName} API not yet implemented.`); - } - /** - * Throws an internal error if argument is null or undefined. - * - * @param argumentValue value to verify - * @param argumentName name of argument to verify - */ - /*tslint:disable-next-line */ - static verifyInternalValue(argumentValue, argumentName) { - if (argumentValue === null || argumentValue === undefined) { - throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, `${argumentValue} is invalid value for: ${argumentName}`); - } - } - /** - * Throws an InvalidParameter error if argument is null or undefined. - * - * @param argumentValue value to verify - * @param argumentName name of argument to verify - */ - /*tslint:disable-next-line */ - static verifyParameter(argumentValue, argumentName) { - if (argumentValue === null || argumentValue === undefined) { - throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, `${argumentValue} is invalid value for parameter: ${argumentName}`); - } - } - /** - * Throws an InvalidParameter error if argument is not the specified type. - * For objects, it just tests that it is an object - * - * @param argumentValue value to verify - * @param expectedType expected result of typeof - * @param argumentName name of argument to verify - */ - /*tslint:disable-next-line */ - static verifyParameterType(argumentValue, expectedType, argumentName) { - if (typeof argumentValue !== expectedType) { - throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, `${argumentValue} has invalid type for parameter: ${argumentName}.`); - } - } - /** - * Throws an InvalidParameter error if argument is empty string, null or undefined. - * - * @param argumentValue value to verify - * @param argumentName name of argument to verify - */ - /*tslint:disable-next-line */ - static verifyStringParameter(argumentValue, argumentName) { - if (argumentValue === null || argumentValue === undefined || argumentValue === '') { - throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, `${argumentValue} is invalid value for paramter: ${argumentName}`); - } - } - /** - * Verifies passed value is a valid value for that enum. - * - * String enums are {string : string} dictionaries which are not reverse mappable - * This is an ugly workaround - * - * @param enumValue value to verify - * @param enumType enum to verify against - */ - /*tslint:disable-next-line */ - static isValidEnumValue(enumValue, enumType) { - let isValid = false; - Object.keys(enumType).forEach((enumKey) => { - if (enumType[enumKey] === enumValue.toString()) { - isValid = true; - } - }); - return isValid; - } - /** - * Verifies passed value is a valid value for that enum. - * Throws an InvalidParameter error if the enum value is not valid. - * - * String enums are {string : string} dictionaries which are not reverse mappable - * This is an ugly workaround - * - * @param enumValue value to verify - * @param enumType enum to verify against - * @param enumName enum name for clear error message - */ - /*tslint:disable-next-line */ - static verifyEnumValue(enumValue, enumType, enumName) { - if (!ErrorHelpers.isValidEnumValue(enumValue, enumType)) { - throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, `${enumValue} is invalid value for enum: ${enumName}.`); - } - } - /** - * Verifies passed value is between [min, max) ... min <= value < max - * Throws an InvalidParameter error if the value is not valid. - * - * - * @param value value to verify - * @param min value must be >= min - * @param max value must be < max - */ - static verifyRange(value, min, max) { - let isValid = min <= value && value < max; - if (!isValid) { - throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, `${value} is invalid value for range: [${min}..${max})`); - } - } - /** - * Verifies the params min and max for applying range filter. - * Throws with error code InvalidParameter if range is invalid. - * - * @param min range min - * @param max range max - */ - static verifyRangeParamType(min, max) { - const isMinDefined = min !== undefined; - const isMaxDefined = max !== undefined; - if (!isMinDefined && !isMaxDefined) { - throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, 'Unexpected invalid param value, at least one of min or max is required.'); - } - if (isMinDefined && !Param_1.Param.isTypeNumber(min) && !Param_1.Param.isTypeDate(min)) { - throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, 'Unexpected invalid param value, only Date and number are allowed for parameter min.'); - } - if (isMaxDefined && !Param_1.Param.isTypeNumber(max) && !Param_1.Param.isTypeDate(max)) { - throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, 'Unexpected invalid param value, only Date and number are allowed for parameter max.'); - } - if (isMinDefined && isMaxDefined && typeof min !== typeof max) { - throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, 'Unexpected invalid param value, parameters min and max should be of the same type.'); - } - } - /** - * Verifies that the zoneId is present in the current dashboard. - * Throws with error code InvalidParameter if either condition is false. - * - * @param dashboardZoneMap A map of zoneId's to the corresponding dashboard object. - * @param zoneID ZoneId to be validated - */ - static verifyZoneIsValid(dashboardZoneMap, zoneID) { - if (dashboardZoneMap.has(zoneID)) { - return; - } - throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, `Unexpected invalid param value, Dashboard Object Id: ${zoneID} is not present in dashboard.`); - } - /** - * Verifies that the zone is present and floating in the current dashboard. - * Throws with error code InvalidParameter if either condition is false. - * - * @param dashboardZoneMap A map of zoneId's to the corresponding dashboard object. - * @param zoneID ZoneId to be validated - */ - static verifyZoneIsValidAndFloating(dashboardZoneMap, zoneID) { - if (dashboardZoneMap.has(zoneID) && dashboardZoneMap.get(zoneID).isFloating) { - return; - } - throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, `Unexpected invalid param value, Dashboard Object Id: ${zoneID} is not present or is a fixed zone in the dashboard.`); - } - /** - * Verifies that width and height are > 0 for each DashboardObjectPositionAndSizeUpdate object. - * Throws with error code InvalidParameter if either condition is false. - * - * @param dashboardObjectPositionAndSizeUpdate DashboardObjectPositionAndSizeUpdate object for which width and height will be validated - */ - static verifyWidthAndHeightOfDashboardObjectPositionAndSizeUpdate(dashboardObjectPositionAndSizeUpdate) { - if (dashboardObjectPositionAndSizeUpdate.width < 0 || dashboardObjectPositionAndSizeUpdate.height < 0) { - throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, `Unexpected invalid param value for dashboard object ID ${dashboardObjectPositionAndSizeUpdate.dashboardObjectID}:` + - ` negative widths and heights are not allowed.`); - } - } - /** - * Verifies is the given sheet name is in the list of sheets names allowed for exporting. - * Throws with error code InvalidParameter if the condition above is false. - * - * @param exportableSheetNames A list of sheet names allowed for exporting - * @param sheetName the name of the sheet selected for export - */ - static verifySheetName(exportableSheetNames, sheetName) { - if (!exportableSheetNames.includes(sheetName)) { - throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidSelectionSheet, 'sheetName parameter must belong to a worksheet within the current view'); - } - } - /** - * Verifies the ExportDataOptions object - * Throws with error code InvalidParameter if the parameter is not of ExportDataOptions type. - * - * @param options The ExportDataOptions object used to configure the output CSV file for exportDataAsync. - */ - static verifyExportDataOptions(options) { - if ((!Param_1.Param.isNullOrUndefined(options.ignoreAliases) && !Param_1.Param.isTypeBool(options.ignoreAliases)) || - (!Param_1.Param.isNullOrUndefined(options.columnsToIncludeById) && !Array.isArray(options.columnsToIncludeById))) - throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, 'options paramater must be of type ExportDataOptions'); - } - /** - * Verifies if the sheet names are included in any of the export scenarios. - * Throws with error code InvalidParameter if the parameter is not an array. - * Throws with error code InvalidSelectionSheet if there are array entries that dont exist or if there is mixing between sheets from the dashboard and sheet from the workbook. - * - * @param sheetNames List of sheet names selected for exporting. - * @param exportScenarios an object containing the current sheet name, exportable sheets from the dashboard, and exportable sheets from the workbook. - */ - static verifySheetNamesForPDFAndPPT(sheetNames, exportScenarios) { - if (!Array.isArray(sheetNames)) - throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, 'sheetNames parameter must be an array'); - if (sheetNames.length === 0) - throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, 'sheetNames should not be empty'); - const isIncludedInDashboard = sheetNames.every((sheetName) => exportScenarios.exportableSheetNamesFromDashboard.includes(sheetName)); - if (isIncludedInDashboard) { - return; - } - const isIncludedInWorkbook = sheetNames.every((sheetName) => exportScenarios.exportableSheetNamesFromWorkbook.includes(sheetName)); - if (isIncludedInWorkbook) { - return; - } - const isCurrentSheet = sheetNames.length === 1 && sheetNames[0] === exportScenarios.currentSheetName; - if (isCurrentSheet) { - return; - } - // Export requirement: all sheet names must be included in the list of exportable sheets in the dashboard or - // all sheet names must be included in the list of exportable sheets in the workbook, or the sheet name is the current sheet - throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidSelectionSheet, 'sheetNames parameter must have all its entries be exportable sheet names from the dashboard or all its entries be exportable sheet names from the workbook'); - } - /** - * Verifies the external ExportPDFOptions object's properties. - * Throws with error code InvalidParameter if the parameter is not of external ExportPDFOptions type. - * - * @param options The external user-facing ExportPDFOptions object used to configure the output PDF file for exportPDFAsync. - */ - static verifyExportPDFOptions(options) { - try { - this.verifyEnumValue(options.orientation, api_external_contract_js_1.PrintOrientation, 'PrintOrientation'); - this.verifyEnumValue(options.pageSize, api_external_contract_js_1.PrintPageSize, 'PrintPageSize'); - this.verifyEnumValue(options.scaling, api_external_contract_js_1.PrintScaling, 'PrintScaling'); - } - catch (_a) { - throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, 'options parameter must be of type ExportPDFOptions'); - } - } -} -exports.ErrorHelpers = ErrorHelpers; - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/Utils/ExportHelpers.js": -/*!*****************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Utils/ExportHelpers.js ***! - \*****************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -const TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); -/** - * Helper methods for Export APIs. - * - * @class ExportHelpers - */ -class ExportHelpers { - /** - * Modifies the internal ExportPDFOptions' properties based on the given PDF export configuration. - * This method will construct the internal ExportPDFOptions identically to how the 'Export PDF' dialog constructs the ExportPdfOptionsPresModel. - * See the handleExportClick method in @browser-clients/export-pdf-options-dialog for reference. - * - * @param internalExportPdfOptions The internal ExportPDFOptions pres model used to configure the output PDF file. - * @param externalExportPdfOptions The external ExportPDFOptions user-facing object passed to exportPDFAsync. - * @param sheetNames The list of sheets selected for export. - */ - static updateInternalExportPDFOptions(internalExportPdfOptions, externalExportPdfOptions, sheetNames) { - internalExportPdfOptions.currentSheet = sheetNames[0]; - this.updateExportLayoutOptions(internalExportPdfOptions, externalExportPdfOptions); - this.updateSheetOptions(internalExportPdfOptions, sheetNames); - } - /** - * Helper method for updateInternalExportPDFOptions. - * Modifies the exportLayoutOptions property of the internal ExportPDFOptions based on the external ExportPDFOptions. - * See the getExportLayoutOptions method in @browser-clients/export-pdf-options-dialog for reference. - * - * @param internalExportPdfOptions The internal ExportPDFOptions pres model used to configure the output PDF file. - * @param externalExportPdfOptions The external ExportPDFOptions user-facing object passed to exportPDFAsync. - */ - static updateExportLayoutOptions(internalExportPdfOptions, externalExportPdfOptions) { - const exportLayoutOptions = internalExportPdfOptions.exportLayoutOptions; - // setting the image height and width properties to their default values - exportLayoutOptions.imageHeight = this.DefaultLayoutOptions.imageHeight; - exportLayoutOptions.imageWidth = this.DefaultLayoutOptions.imageWidth; - // setting the orientation value for the exportLayoutOptions - switch (externalExportPdfOptions.orientation) { - case api_external_contract_js_1.PrintOrientation.Landscape: - exportLayoutOptions.pageOrientationOption = api_internal_contract_js_1.PageOrientation.Landscape; - break; - case api_external_contract_js_1.PrintOrientation.Portrait: - exportLayoutOptions.pageOrientationOption = api_internal_contract_js_1.PageOrientation.Portrait; - break; - default: - throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, 'invalid orientation for ExportPDFOption'); - } - // setting the page size value for the exportLayoutOptions - switch (externalExportPdfOptions.pageSize) { - case api_external_contract_js_1.PrintPageSize.A3: - exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.A3; - break; - case api_external_contract_js_1.PrintPageSize.A4: - exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.A4; - break; - case api_external_contract_js_1.PrintPageSize.A5: - exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.A5; - break; - case api_external_contract_js_1.PrintPageSize.B4: - exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.B4; - break; - case api_external_contract_js_1.PrintPageSize.B5: - exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.B5; - break; - case api_external_contract_js_1.PrintPageSize.Executive: - exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.Executive; - break; - case api_external_contract_js_1.PrintPageSize.Folio: - exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.Folio; - break; - case api_external_contract_js_1.PrintPageSize.Ledger: - exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.Ledger; - break; - case api_external_contract_js_1.PrintPageSize.Legal: - exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.Legal; - break; - case api_external_contract_js_1.PrintPageSize.Letter: - exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.Letter; - break; - case api_external_contract_js_1.PrintPageSize.Note: - exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.Note; - break; - case api_external_contract_js_1.PrintPageSize.Quarto: - exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.Quarto; - break; - case api_external_contract_js_1.PrintPageSize.Statement: - exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.Statement; - break; - case api_external_contract_js_1.PrintPageSize.Tabloid: - exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.Tabloid; - break; - case api_external_contract_js_1.PrintPageSize.Unspecified: - exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.Unspecified; - break; - default: - throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, 'invalid pageSize for ExportPDFOption'); - } - // setting the scaling values for the exportLayoutOptions - switch (externalExportPdfOptions.scaling) { - case api_external_contract_js_1.PrintScaling.AtMost1PageHigh: - this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.FitPages.FitOneHigh); - break; - case api_external_contract_js_1.PrintScaling.AtMost1PageWide: - this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.FitPages.FitOneWide); - break; - case api_external_contract_js_1.PrintScaling.AtMost2PagesHigh: - this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.FitPages.FitTwoHigh); - break; - case api_external_contract_js_1.PrintScaling.AtMost2PagesWide: - this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.FitPages.FitTwoWide); - break; - case api_external_contract_js_1.PrintScaling.Automatic: - this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.PageScalingOption.ScalePctAuto); - break; - case api_external_contract_js_1.PrintScaling.Perc100: - this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.PageScalingOption.ScalePct100); - break; - case api_external_contract_js_1.PrintScaling.Perc200: - this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.PageScalingOption.ScalePct200); - break; - case api_external_contract_js_1.PrintScaling.Perc25: - this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.PageScalingOption.ScalePct25); - break; - case api_external_contract_js_1.PrintScaling.Perc400: - this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.PageScalingOption.ScalePct400); - break; - case api_external_contract_js_1.PrintScaling.Perc50: - this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.PageScalingOption.ScalePct50); - break; - case api_external_contract_js_1.PrintScaling.Perc60: - this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.PageScalingOption.ScalePct60); - break; - case api_external_contract_js_1.PrintScaling.Perc75: - this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.PageScalingOption.ScalePct75); - break; - case api_external_contract_js_1.PrintScaling.Perc80: - this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.PageScalingOption.ScalePct80); - break; - case api_external_contract_js_1.PrintScaling.Perc90: - this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.PageScalingOption.ScalePct90); - break; - default: - throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, 'invalid scaling for ExportPDFOption'); - } - } - /** - * Helper method for updateInternalExportPDFOptions. - * Modifies the sheetOptions property of the internal ExportPDFOptions based on the sheets selected for export. - * See the handleExportClick method in @browser-clients/export-pdf-options-dialog for reference. - * - * @param internalExportPdfOptions The internal ExportPDFOptions pres model used to configure the output PDF file. - * @param sheetNames The list of sheets selected for export. - */ - static updateSheetOptions(internalExportPdfOptions, sheetNames) { - const { exportLayoutOptions, sheetOptions } = internalExportPdfOptions; - // updating the export layouts options for each sheet and selecting sheet for export if included in list - for (const sheetOption of sheetOptions) { - sheetOption.exportLayoutOptions = exportLayoutOptions; - sheetOption.isSelected = sheetNames.includes(sheetOption.sheet); - } - } - /** - * Helper method for updateExportLayoutOptons. - * This method is a spoof of the getFitAndScaleValues method used in @browser-clients/export-pdf-options to set the exportLayoutOptions' scaling properties. - * In the future, this file should be refactored to import the method directly from @browser-clients/export-pdf-options. - * - * @param scalingSelection string used for setting the exportLayoutOptions based on the PrintScaling property from the ExternalExportPDFOptions. - * @param exportLayoutOptions the ExportLayoutOptions used by the internal ExportPDFOptions pres model. - */ - static setFitAndScaleValues(exportLayoutOptions, scalingSelection) { - let { pageFitHorizontal, pageFitVertical, pageScaleMode, pageScalePercent } = this.DefaultLayoutOptions; - const fitMatch = this.fitRegex.exec(scalingSelection); - const percentMatch = this.pctRegex.exec(scalingSelection); - if (fitMatch) { - [pageFitHorizontal, pageFitVertical] = fitMatch.slice(1).map((value) => Number(value)); - pageScaleMode = api_internal_contract_js_1.ScaleMode.ScaleFitPages; - } - else if (percentMatch) { - [pageScalePercent] = percentMatch.slice(1).map((value) => Number(value)); - pageScaleMode = api_internal_contract_js_1.ScaleMode.ScalePercentage; - } - // getFitAndScaleValues returns the properties below, but instead this method will set them. - exportLayoutOptions.pageFitHorizontal = pageFitHorizontal; - exportLayoutOptions.pageFitVertical = pageFitVertical; - exportLayoutOptions.pageScaleMode = pageScaleMode; - exportLayoutOptions.pageScalePercent = pageScalePercent; - } -} -exports.ExportHelpers = ExportHelpers; -ExportHelpers.DefaultDataOptions = { - ignoreAliases: false, - columnsToIncludeById: [], -}; -ExportHelpers.DefaultPDFOptions = { - scaling: api_external_contract_js_1.PrintScaling.Automatic, - pageSize: api_external_contract_js_1.PrintPageSize.Letter, - orientation: api_external_contract_js_1.PrintOrientation.Portrait, -}; -ExportHelpers.DefaultLayoutOptions = { - imageHeight: 0, - imageWidth: 0, - pageFitHorizontal: 1, - pageFitVertical: 1, - pageOrientationOption: api_internal_contract_js_1.PageOrientation.Portrait, - pageScaleMode: api_internal_contract_js_1.ScaleMode.ScaleAuto, - pageScalePercent: 100, - pageSizeOption: api_internal_contract_js_1.PageSizeOption.Letter, -}; -ExportHelpers.fitRegex = new RegExp('fit([0-9]+)x([0-9]+)'); -ExportHelpers.pctRegex = new RegExp('pct([0-9]+)'); - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/Utils/Param.js": -/*!*********************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Utils/Param.js ***! - \*********************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -const TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); -const ErrorHelpers_1 = __webpack_require__(/*! ./ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); -class Param { - /** - * serializes the date into the format that the server expects. - * @param date the date to serialize - */ - static serializeDateForPlatform(date) { - const year = date.getUTCFullYear(); - const month = date.getUTCMonth() + 1; - const day = date.getUTCDate(); - const hh = date.getUTCHours(); - const mm = date.getUTCMinutes(); - const sec = date.getUTCSeconds(); - return `${year}-${month}-${day} ${hh}:${mm}:${sec}`; - } - static serializeBooleanForPlatform(bool) { - return bool ? 'true' : 'false'; - } - static serializeNumberForPlatform(num) { - return num.toString(10); - } - /** - * Verifies the input is a number - */ - /* tslint:disable-next-line:no-any */ - static isTypeNumber(input) { - return typeof input === 'number' || input instanceof Number; - } - /** - * Verifies the input is a Date - */ - /* tslint:disable-next-line:no-any */ - static isTypeDate(input) { - return input instanceof Date; - } - /* tslint:disable-next-line:no-any */ - static isTypeString(input) { - return typeof input === 'string' || input instanceof String; - } - /* tslint:disable-next-line:no-any */ - static isTypeBool(input) { - return typeof input === 'boolean' || input instanceof Boolean; - } - /** - * Determines if the input is null or undefined - */ - /* tslint:disable-next-line:no-any */ - static isNullOrUndefined(input) { - return input === null || input === undefined; - } - /* tslint:disable-next-line:no-any */ - static serializeParameterValue(value) { - if (Param.isTypeNumber(value)) { - return Param.serializeNumberForPlatform(value); - } - else if (Param.isTypeDate(value)) { - return Param.serializeDateForPlatform(value); - } - else if (Param.isTypeBool(value)) { - return Param.serializeBooleanForPlatform(value); - } - else if (Param.isTypeString(value)) { - return value; - } - else { - throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, `Unexpected invalid value for: ${value}`); - } - } - /** - * Verifies that the parameter is already a Map, or converts an object to a Map. - * If the parameter is an object, we convert it to a Map using Object.entries. - * @throws if the parameter is not an object or Map - */ - // tslint:disable-next-line:no-any - static convertParameterToMap(param, paramName) { - ErrorHelpers_1.ErrorHelpers.verifyParameterType(param, 'object', paramName); - if (Array.isArray(param)) { - throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, `Expecting object or Map for: ${paramName}.`); - } - return param instanceof Map ? param : new Map(Object.entries(param)); - } - /* tslint:disable-next-line:no-any */ - static tryParseNumber(value) { - if (Param.isNullOrUndefined(value)) { - return { success: false }; - } - if (Param.isTypeNumber(value)) { - return { parsed: value, success: true }; - } - const valueString = value.toString(); - if (valueString === 'NaN') { - // 'NaN' parses as NaN which is indistinguishable from a failed parse. - return { parsed: NaN, success: true }; - } - const parsed = parseFloat(valueString); - if (isNaN(parsed)) { - return { success: false }; - } - return { parsed, success: true }; - } -} -exports.Param = Param; - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/Utils/SheetUtils.js": -/*!**************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Utils/SheetUtils.js ***! - \**************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -const TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); -class SheetUtils { - // This is a direct port from SheetSize.cs - SheetSizeFactory - static getSheetSizeFromSizeConstraints(sizeConstraint) { - const { minWidth, minHeight, maxWidth, maxHeight } = sizeConstraint; - if (minHeight === 0 && minWidth === 0) { - if (maxHeight === 0 && maxWidth === 0) { - return { - behavior: Contract.SheetSizeBehavior.Automatic, - }; - } - return { - behavior: Contract.SheetSizeBehavior.AtMost, - maxSize: { width: maxWidth, height: maxHeight }, - }; - } - if (maxHeight === 0 && maxWidth === 0) { - return { - behavior: Contract.SheetSizeBehavior.AtLeast, - minSize: { width: minWidth, height: minHeight }, - }; - } - if (maxHeight === minHeight && maxWidth === minWidth && minWidth > 0) { - return { - behavior: Contract.SheetSizeBehavior.Exactly, - minSize: { width: minWidth, height: minHeight }, - maxSize: { width: minWidth, height: minHeight }, - }; - } - // 'Fit Width' for a DSD layout - const isDsdLayout = minWidth === 0 && maxWidth === 0; - return { - behavior: Contract.SheetSizeBehavior.Range, - minSize: { width: minWidth, height: minHeight }, - maxSize: { width: isDsdLayout ? 2147483647 : maxWidth, height: maxHeight }, - }; - } - static createAutomaticSize() { - let behavior = Contract.SheetSizeBehavior.Automatic; - let minSize = { width: 0, height: 0 }; - let maxSize = { width: 0, height: 0 }; - return { behavior, minSize, maxSize }; - } - static getPublishedSheetInfoByName(name, sheetInfos) { - const sheetInfo = sheetInfos.find((sheet) => sheet.name === name); - return sheetInfo; - } - static getSheetTypeEnum(internalSheetType) { - let sheetType; - switch (internalSheetType) { - case api_internal_contract_js_1.SheetType.Worksheet: { - sheetType = Contract.SheetType.Worksheet; - break; - } - case api_internal_contract_js_1.SheetType.Dashboard: { - sheetType = Contract.SheetType.Dashboard; - break; - } - case api_internal_contract_js_1.SheetType.Story: { - sheetType = Contract.SheetType.Story; - break; - } - default: { - throw new TableauError_1.TableauError(Contract.SharedErrorCodes.ServerError, 'Invalid SheetType'); - } - } - return sheetType; - } - static isValidSheetSize(sizeObject) { - return sizeObject.behavior !== undefined; - } -} -exports.SheetUtils = SheetUtils; - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/Utils/ShortLivedDeferred.js": -/*!**********************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Utils/ShortLivedDeferred.js ***! - \**********************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -const TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); -const Deferred_1 = __webpack_require__(/*! ./Deferred */ "../api-shared-js/lib/src/ApiShared/Utils/Deferred.js"); -/** - * A Deferred wrapper class adding functionality to reject unresponsive promises after timeout - * - * this class handles two things: - - * 1. Adds timeout logic for deferred - * 2. It blocks multiple calls from executing at the same time. - * - * @export - * @class ShortLivedDeferred - * @template TResolve The type used to resolve the promise. - * @template TReject The type used to reject the promise. Defaults to any. - * - */ -class ShortLivedDeferred { - constructor(_timeoutInMilliseconds = Deferred_1.UnregisterTimeoutInMilliseconds) { - this._timeoutInMilliseconds = _timeoutInMilliseconds; - } - getNewPromiseOrThrowIfBusy() { - if (this._deferred) { - throw new TableauError_1.TableauError(Contract.SharedErrorCodes.ApiExecutionError, 'This api cannot be executed till previous call is resolved.'); - } - this._deferred = new Deferred_1.Deferred(); - this._timeoutId = setTimeout(() => { - const error = new TableauError_1.TableauError(Contract.SharedErrorCodes.Timeout, `Api failed to complete in ${this._timeoutInMilliseconds / 1000} seconds`); - this.reject(error); - }, this._timeoutInMilliseconds); - return this._deferred.promise; - } - resolve(response) { - if (this._deferred) { - clearTimeout(this._timeoutId); - this._deferred.resolve(response); - this._deferred = undefined; - } - } - reject(error) { - if (this._deferred) { - clearTimeout(this._timeoutId); - this._deferred.reject(error); - this._deferred = undefined; - } - } -} -exports.ShortLivedDeferred = ShortLivedDeferred; - - -/***/ }), - -/***/ "../api-shared-js/lib/src/ApiShared/VersionNumber.js": -/*!***********************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/VersionNumber.js ***! - \***********************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -const TableauError_1 = __webpack_require__(/*! ./TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); -/** - * Represents the current version of the extensions, embedding - * and extensions-api-types library - */ -class VersionNumber { - // private constructor so everyone uses the singleton instance - // build numbers have this form: M.m.f-pre.N - constructor(versionString, isAlpha) { - const partStr = versionString.split('-'); - this.build = this.getBuildNumber(partStr[1]); - versionString = partStr[0]; - const parts = versionString.split('.').map((p) => parseInt(p, 10)); - if (parts.length !== 3) { - throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, `Invalid version number: ${versionString}`); - } - this.major = parts[0]; - this.minor = parts[1]; - this.fix = parts[2]; - this.isAlpha = isAlpha; - } - getBuildNumber(preReleaseString) { - const noBuildNumber = -1; - if (!preReleaseString) { - return noBuildNumber; - } - // The preRelease string has this form: pre.N, but we don't depend on the actual string being 'pre' - const partStr = preReleaseString.split('.'); - return partStr[1] ? parseInt(partStr[1], 10) : noBuildNumber; - } - get formattedValue() { - return `${this.major}.${this.minor}.${this.fix}`; - } - get fullFormattedValue() { - return `${this.major}.${this.minor}.${this.fix}-pre.${this.build}`; - } -} -exports.VersionNumber = VersionNumber; - - -/***/ }), - -/***/ "../api-shared-js/lib/src/VersionedExternalApiDispatcher.js": -/*!******************************************************************!*\ - !*** ../api-shared-js/lib/src/VersionedExternalApiDispatcher.js ***! - \******************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -/** - * Implementation of the InternalApiDispatcher which supports upgrading and downgrading the input - * internal contract to the version that this module is built against - * - * @class VersionedExternalApiDispatcher - * @implements {InternalApiDispatcher} - */ -class VersionedExternalApiDispatcher { - /** - * Creates a new instance of the VersionedExternalApiDispatcher - * We have multiple version converting dispatchers that work together. - * If needed, the VersionedExternalApiDispatcher wraps either the InternalApiDispatcher (desktop) - * or the CrossFrameDispatcher (server). - * The Internal/CrossFrame dispatchers handle an updated platform with an older external library. - * (The CrossFrameDispatcher sends messages across the frame, and it is handled by the PresLayerHandler.) - * Meanwhile, the VersionedExternalApiDispatcher handles an updated external library with an older platform. - - * @param _apiDelegateDispatcher The delegate that does the actual work. - * @param platformVersionNumber The version of the internal contract which the platform module is using. - * This number will be used to figure out how to downgrade incoming commands and upgrade the results - */ - constructor(_apiDelegateDispatcher, platformVersionNumber) { - this._apiDelegateDispatcher = _apiDelegateDispatcher; - this._versionConverter = api_internal_contract_js_1.CreateExternalCompatibleVersionConverter(api_internal_contract_js_1.INTERNAL_CONTRACT_VERSION, platformVersionNumber); - this._notificationHandlers = []; - _apiDelegateDispatcher.registerNotificationHandler((notification) => { - if (this._notificationHandlers.length === 0) { - return; - } - const upgradedNotification = this._versionConverter.upgradeNotification(notification); - this._notificationHandlers.forEach((handler) => { - handler(upgradedNotification); - }); - }); - } - static needsVersionConverter(platformVersion) { - // If our platform is less than external library version, then we need a converter - return api_internal_contract_js_1.VersionLessThan(platformVersion, api_internal_contract_js_1.INTERNAL_CONTRACT_VERSION); - } - execute(verb, parameters) { - try { - const downgradeParameters = this._versionConverter.downgradeExecuteCall(verb, parameters); - return this._apiDelegateDispatcher.execute(downgradeParameters.verb, downgradeParameters.parameters).then((response) => { - const upgradeResponse = this._versionConverter.upgradeExecuteReturn(response, verb, parameters); - return upgradeResponse; - }); - } - catch (e) { - return Promise.reject(e); - } - } - registerNotificationHandler(handler) { - this._notificationHandlers.push(handler); - } - unregisterNotificationHandler(handler) { - this._notificationHandlers = this._notificationHandlers.filter((h) => h !== handler); - } -} -exports.VersionedExternalApiDispatcher = VersionedExternalApiDispatcher; - - -/***/ }), - -/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/index.js": -/*!********************************************************************!*\ - !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/index.js ***! - \********************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ NIL: () => (/* reexport safe */ _nil_js__WEBPACK_IMPORTED_MODULE_4__["default"]), -/* harmony export */ parse: () => (/* reexport safe */ _parse_js__WEBPACK_IMPORTED_MODULE_8__["default"]), -/* harmony export */ stringify: () => (/* reexport safe */ _stringify_js__WEBPACK_IMPORTED_MODULE_7__["default"]), -/* harmony export */ v1: () => (/* reexport safe */ _v1_js__WEBPACK_IMPORTED_MODULE_0__["default"]), -/* harmony export */ v3: () => (/* reexport safe */ _v3_js__WEBPACK_IMPORTED_MODULE_1__["default"]), -/* harmony export */ v4: () => (/* reexport safe */ _v4_js__WEBPACK_IMPORTED_MODULE_2__["default"]), -/* harmony export */ v5: () => (/* reexport safe */ _v5_js__WEBPACK_IMPORTED_MODULE_3__["default"]), -/* harmony export */ validate: () => (/* reexport safe */ _validate_js__WEBPACK_IMPORTED_MODULE_6__["default"]), -/* harmony export */ version: () => (/* reexport safe */ _version_js__WEBPACK_IMPORTED_MODULE_5__["default"]) -/* harmony export */ }); -/* harmony import */ var _v1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./v1.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/v1.js"); -/* harmony import */ var _v3_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./v3.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/v3.js"); -/* harmony import */ var _v4_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./v4.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/v4.js"); -/* harmony import */ var _v5_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./v5.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/v5.js"); -/* harmony import */ var _nil_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./nil.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/nil.js"); -/* harmony import */ var _version_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./version.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/version.js"); -/* harmony import */ var _validate_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./validate.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/validate.js"); -/* harmony import */ var _stringify_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./stringify.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/stringify.js"); -/* harmony import */ var _parse_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./parse.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/parse.js"); - - - - - - - - - - -/***/ }), - -/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/md5.js": -/*!******************************************************************!*\ - !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/md5.js ***! - \******************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* - * Browser-compatible JavaScript MD5 - * - * Modification of JavaScript MD5 - * https://github.com/blueimp/JavaScript-MD5 - * - * Copyright 2011, Sebastian Tschan - * https://blueimp.net - * - * Licensed under the MIT license: - * https://opensource.org/licenses/MIT - * - * Based on - * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message - * Digest Algorithm, as defined in RFC 1321. - * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009 - * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet - * Distributed under the BSD License - * See http://pajhome.org.uk/crypt/md5 for more info. - */ -function md5(bytes) { - if (typeof bytes === 'string') { - var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape - - bytes = new Uint8Array(msg.length); - - for (var i = 0; i < msg.length; ++i) { - bytes[i] = msg.charCodeAt(i); - } - } - - return md5ToHexEncodedArray(wordsToMd5(bytesToWords(bytes), bytes.length * 8)); -} -/* - * Convert an array of little-endian words to an array of bytes - */ - - -function md5ToHexEncodedArray(input) { - var output = []; - var length32 = input.length * 32; - var hexTab = '0123456789abcdef'; - - for (var i = 0; i < length32; i += 8) { - var x = input[i >> 5] >>> i % 32 & 0xff; - var hex = parseInt(hexTab.charAt(x >>> 4 & 0x0f) + hexTab.charAt(x & 0x0f), 16); - output.push(hex); - } - - return output; -} -/** - * Calculate output length with padding and bit length - */ - - -function getOutputLength(inputLength8) { - return (inputLength8 + 64 >>> 9 << 4) + 14 + 1; -} -/* - * Calculate the MD5 of an array of little-endian words, and a bit length. - */ - - -function wordsToMd5(x, len) { - /* append padding */ - x[len >> 5] |= 0x80 << len % 32; - x[getOutputLength(len) - 1] = len; - var a = 1732584193; - var b = -271733879; - var c = -1732584194; - var d = 271733878; - - for (var i = 0; i < x.length; i += 16) { - var olda = a; - var oldb = b; - var oldc = c; - var oldd = d; - a = md5ff(a, b, c, d, x[i], 7, -680876936); - d = md5ff(d, a, b, c, x[i + 1], 12, -389564586); - c = md5ff(c, d, a, b, x[i + 2], 17, 606105819); - b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330); - a = md5ff(a, b, c, d, x[i + 4], 7, -176418897); - d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426); - c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341); - b = md5ff(b, c, d, a, x[i + 7], 22, -45705983); - a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416); - d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417); - c = md5ff(c, d, a, b, x[i + 10], 17, -42063); - b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162); - a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682); - d = md5ff(d, a, b, c, x[i + 13], 12, -40341101); - c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290); - b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329); - a = md5gg(a, b, c, d, x[i + 1], 5, -165796510); - d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632); - c = md5gg(c, d, a, b, x[i + 11], 14, 643717713); - b = md5gg(b, c, d, a, x[i], 20, -373897302); - a = md5gg(a, b, c, d, x[i + 5], 5, -701558691); - d = md5gg(d, a, b, c, x[i + 10], 9, 38016083); - c = md5gg(c, d, a, b, x[i + 15], 14, -660478335); - b = md5gg(b, c, d, a, x[i + 4], 20, -405537848); - a = md5gg(a, b, c, d, x[i + 9], 5, 568446438); - d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690); - c = md5gg(c, d, a, b, x[i + 3], 14, -187363961); - b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501); - a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467); - d = md5gg(d, a, b, c, x[i + 2], 9, -51403784); - c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473); - b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734); - a = md5hh(a, b, c, d, x[i + 5], 4, -378558); - d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463); - c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562); - b = md5hh(b, c, d, a, x[i + 14], 23, -35309556); - a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060); - d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353); - c = md5hh(c, d, a, b, x[i + 7], 16, -155497632); - b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640); - a = md5hh(a, b, c, d, x[i + 13], 4, 681279174); - d = md5hh(d, a, b, c, x[i], 11, -358537222); - c = md5hh(c, d, a, b, x[i + 3], 16, -722521979); - b = md5hh(b, c, d, a, x[i + 6], 23, 76029189); - a = md5hh(a, b, c, d, x[i + 9], 4, -640364487); - d = md5hh(d, a, b, c, x[i + 12], 11, -421815835); - c = md5hh(c, d, a, b, x[i + 15], 16, 530742520); - b = md5hh(b, c, d, a, x[i + 2], 23, -995338651); - a = md5ii(a, b, c, d, x[i], 6, -198630844); - d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415); - c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905); - b = md5ii(b, c, d, a, x[i + 5], 21, -57434055); - a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571); - d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606); - c = md5ii(c, d, a, b, x[i + 10], 15, -1051523); - b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799); - a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359); - d = md5ii(d, a, b, c, x[i + 15], 10, -30611744); - c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380); - b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649); - a = md5ii(a, b, c, d, x[i + 4], 6, -145523070); - d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379); - c = md5ii(c, d, a, b, x[i + 2], 15, 718787259); - b = md5ii(b, c, d, a, x[i + 9], 21, -343485551); - a = safeAdd(a, olda); - b = safeAdd(b, oldb); - c = safeAdd(c, oldc); - d = safeAdd(d, oldd); - } - - return [a, b, c, d]; -} -/* - * Convert an array bytes to an array of little-endian words - * Characters >255 have their high-byte silently ignored. - */ - - -function bytesToWords(input) { - if (input.length === 0) { - return []; - } - - var length8 = input.length * 8; - var output = new Uint32Array(getOutputLength(length8)); - - for (var i = 0; i < length8; i += 8) { - output[i >> 5] |= (input[i / 8] & 0xff) << i % 32; - } - - return output; -} -/* - * Add integers, wrapping at 2^32. This uses 16-bit operations internally - * to work around bugs in some JS interpreters. - */ - - -function safeAdd(x, y) { - var lsw = (x & 0xffff) + (y & 0xffff); - var msw = (x >> 16) + (y >> 16) + (lsw >> 16); - return msw << 16 | lsw & 0xffff; -} -/* - * Bitwise rotate a 32-bit number to the left. - */ - - -function bitRotateLeft(num, cnt) { - return num << cnt | num >>> 32 - cnt; -} -/* - * These functions implement the four basic operations the algorithm uses. - */ - - -function md5cmn(q, a, b, x, s, t) { - return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b); -} - -function md5ff(a, b, c, d, x, s, t) { - return md5cmn(b & c | ~b & d, a, b, x, s, t); -} - -function md5gg(a, b, c, d, x, s, t) { - return md5cmn(b & d | c & ~d, a, b, x, s, t); -} - -function md5hh(a, b, c, d, x, s, t) { - return md5cmn(b ^ c ^ d, a, b, x, s, t); -} - -function md5ii(a, b, c, d, x, s, t) { - return md5cmn(c ^ (b | ~d), a, b, x, s, t); -} - -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (md5); - -/***/ }), - -/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/nil.js": -/*!******************************************************************!*\ - !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/nil.js ***! - \******************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ('00000000-0000-0000-0000-000000000000'); - -/***/ }), - -/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/parse.js": -/*!********************************************************************!*\ - !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/parse.js ***! - \********************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _validate_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./validate.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/validate.js"); - - -function parse(uuid) { - if (!(0,_validate_js__WEBPACK_IMPORTED_MODULE_0__["default"])(uuid)) { - throw TypeError('Invalid UUID'); - } - - var v; - var arr = new Uint8Array(16); // Parse ########-....-....-....-............ - - arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24; - arr[1] = v >>> 16 & 0xff; - arr[2] = v >>> 8 & 0xff; - arr[3] = v & 0xff; // Parse ........-####-....-....-............ - - arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8; - arr[5] = v & 0xff; // Parse ........-....-####-....-............ - - arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8; - arr[7] = v & 0xff; // Parse ........-....-....-####-............ - - arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8; - arr[9] = v & 0xff; // Parse ........-....-....-....-############ - // (Use "/" to avoid 32-bit truncation when bit-shifting high-order bytes) - - arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff; - arr[11] = v / 0x100000000 & 0xff; - arr[12] = v >>> 24 & 0xff; - arr[13] = v >>> 16 & 0xff; - arr[14] = v >>> 8 & 0xff; - arr[15] = v & 0xff; - return arr; -} - -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (parse); - -/***/ }), - -/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/regex.js": -/*!********************************************************************!*\ - !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/regex.js ***! - \********************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i); - -/***/ }), - -/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/rng.js": -/*!******************************************************************!*\ - !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/rng.js ***! - \******************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ rng) -/* harmony export */ }); -// Unique ID creation requires a high quality random # generator. In the browser we therefore -// require the crypto API and do not support built-in fallback to lower quality random number -// generators (like Math.random()). -var getRandomValues; -var rnds8 = new Uint8Array(16); -function rng() { - // lazy load so that environments that need to polyfill have a chance to do so - if (!getRandomValues) { - // getRandomValues needs to be invoked in a context where "this" is a Crypto implementation. Also, - // find the complete implementation of crypto (msCrypto) on IE11. - getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || typeof msCrypto !== 'undefined' && typeof msCrypto.getRandomValues === 'function' && msCrypto.getRandomValues.bind(msCrypto); - - if (!getRandomValues) { - throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported'); - } - } - - return getRandomValues(rnds8); -} - -/***/ }), - -/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/sha1.js": -/*!*******************************************************************!*\ - !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/sha1.js ***! - \*******************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -// Adapted from Chris Veness' SHA1 code at -// http://www.movable-type.co.uk/scripts/sha1.html -function f(s, x, y, z) { - switch (s) { - case 0: - return x & y ^ ~x & z; - - case 1: - return x ^ y ^ z; - - case 2: - return x & y ^ x & z ^ y & z; - - case 3: - return x ^ y ^ z; - } -} - -function ROTL(x, n) { - return x << n | x >>> 32 - n; -} - -function sha1(bytes) { - var K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6]; - var H = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0]; - - if (typeof bytes === 'string') { - var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape - - bytes = []; - - for (var i = 0; i < msg.length; ++i) { - bytes.push(msg.charCodeAt(i)); - } - } else if (!Array.isArray(bytes)) { - // Convert Array-like to Array - bytes = Array.prototype.slice.call(bytes); - } - - bytes.push(0x80); - var l = bytes.length / 4 + 2; - var N = Math.ceil(l / 16); - var M = new Array(N); - - for (var _i = 0; _i < N; ++_i) { - var arr = new Uint32Array(16); - - for (var j = 0; j < 16; ++j) { - arr[j] = bytes[_i * 64 + j * 4] << 24 | bytes[_i * 64 + j * 4 + 1] << 16 | bytes[_i * 64 + j * 4 + 2] << 8 | bytes[_i * 64 + j * 4 + 3]; - } - - M[_i] = arr; - } - - M[N - 1][14] = (bytes.length - 1) * 8 / Math.pow(2, 32); - M[N - 1][14] = Math.floor(M[N - 1][14]); - M[N - 1][15] = (bytes.length - 1) * 8 & 0xffffffff; - - for (var _i2 = 0; _i2 < N; ++_i2) { - var W = new Uint32Array(80); - - for (var t = 0; t < 16; ++t) { - W[t] = M[_i2][t]; - } - - for (var _t = 16; _t < 80; ++_t) { - W[_t] = ROTL(W[_t - 3] ^ W[_t - 8] ^ W[_t - 14] ^ W[_t - 16], 1); - } - - var a = H[0]; - var b = H[1]; - var c = H[2]; - var d = H[3]; - var e = H[4]; - - for (var _t2 = 0; _t2 < 80; ++_t2) { - var s = Math.floor(_t2 / 20); - var T = ROTL(a, 5) + f(s, b, c, d) + e + K[s] + W[_t2] >>> 0; - e = d; - d = c; - c = ROTL(b, 30) >>> 0; - b = a; - a = T; - } - - H[0] = H[0] + a >>> 0; - H[1] = H[1] + b >>> 0; - H[2] = H[2] + c >>> 0; - H[3] = H[3] + d >>> 0; - H[4] = H[4] + e >>> 0; - } - - return [H[0] >> 24 & 0xff, H[0] >> 16 & 0xff, H[0] >> 8 & 0xff, H[0] & 0xff, H[1] >> 24 & 0xff, H[1] >> 16 & 0xff, H[1] >> 8 & 0xff, H[1] & 0xff, H[2] >> 24 & 0xff, H[2] >> 16 & 0xff, H[2] >> 8 & 0xff, H[2] & 0xff, H[3] >> 24 & 0xff, H[3] >> 16 & 0xff, H[3] >> 8 & 0xff, H[3] & 0xff, H[4] >> 24 & 0xff, H[4] >> 16 & 0xff, H[4] >> 8 & 0xff, H[4] & 0xff]; -} - -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (sha1); - -/***/ }), - -/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/stringify.js": -/*!************************************************************************!*\ - !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/stringify.js ***! - \************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _validate_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./validate.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/validate.js"); - -/** - * Convert array of 16 byte values to UUID string format of the form: - * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX - */ - -var byteToHex = []; - -for (var i = 0; i < 256; ++i) { - byteToHex.push((i + 0x100).toString(16).substr(1)); -} - -function stringify(arr) { - var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; - // Note: Be careful editing this code! It's been tuned for performance - // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434 - var uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID. If this throws, it's likely due to one - // of the following: - // - One or more input array values don't map to a hex octet (leading to - // "undefined" in the uuid) - // - Invalid input values for the RFC `version` or `variant` fields - - if (!(0,_validate_js__WEBPACK_IMPORTED_MODULE_0__["default"])(uuid)) { - throw TypeError('Stringified UUID is invalid'); - } - - return uuid; -} - -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (stringify); - -/***/ }), - -/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/v1.js": -/*!*****************************************************************!*\ - !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/v1.js ***! - \*****************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _rng_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./rng.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/rng.js"); -/* harmony import */ var _stringify_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./stringify.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/stringify.js"); - - // **`v1()` - Generate time-based UUID** -// -// Inspired by https://github.com/LiosK/UUID.js -// and http://docs.python.org/library/uuid.html - -var _nodeId; - -var _clockseq; // Previous uuid creation time - - -var _lastMSecs = 0; -var _lastNSecs = 0; // See https://github.com/uuidjs/uuid for API details - -function v1(options, buf, offset) { - var i = buf && offset || 0; - var b = buf || new Array(16); - options = options || {}; - var node = options.node || _nodeId; - var clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; // node and clockseq need to be initialized to random values if they're not - // specified. We do this lazily to minimize issues related to insufficient - // system entropy. See #189 - - if (node == null || clockseq == null) { - var seedBytes = options.random || (options.rng || _rng_js__WEBPACK_IMPORTED_MODULE_0__["default"])(); - - if (node == null) { - // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1) - node = _nodeId = [seedBytes[0] | 0x01, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]]; - } - - if (clockseq == null) { - // Per 4.2.2, randomize (14 bit) clockseq - clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff; - } - } // UUID timestamps are 100 nano-second units since the Gregorian epoch, - // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so - // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs' - // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00. - - - var msecs = options.msecs !== undefined ? options.msecs : Date.now(); // Per 4.2.1.2, use count of uuid's generated during the current clock - // cycle to simulate higher resolution clock - - var nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs) - - var dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression - - if (dt < 0 && options.clockseq === undefined) { - clockseq = clockseq + 1 & 0x3fff; - } // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new - // time interval - - - if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) { - nsecs = 0; - } // Per 4.2.1.2 Throw error if too many uuids are requested - - - if (nsecs >= 10000) { - throw new Error("uuid.v1(): Can't create more than 10M uuids/sec"); - } - - _lastMSecs = msecs; - _lastNSecs = nsecs; - _clockseq = clockseq; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch - - msecs += 12219292800000; // `time_low` - - var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000; - b[i++] = tl >>> 24 & 0xff; - b[i++] = tl >>> 16 & 0xff; - b[i++] = tl >>> 8 & 0xff; - b[i++] = tl & 0xff; // `time_mid` - - var tmh = msecs / 0x100000000 * 10000 & 0xfffffff; - b[i++] = tmh >>> 8 & 0xff; - b[i++] = tmh & 0xff; // `time_high_and_version` - - b[i++] = tmh >>> 24 & 0xf | 0x10; // include version - - b[i++] = tmh >>> 16 & 0xff; // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant) - - b[i++] = clockseq >>> 8 | 0x80; // `clock_seq_low` - - b[i++] = clockseq & 0xff; // `node` - - for (var n = 0; n < 6; ++n) { - b[i + n] = node[n]; - } - - return buf || (0,_stringify_js__WEBPACK_IMPORTED_MODULE_1__["default"])(b); -} - -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (v1); - -/***/ }), - -/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/v3.js": -/*!*****************************************************************!*\ - !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/v3.js ***! - \*****************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _v35_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./v35.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/v35.js"); -/* harmony import */ var _md5_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./md5.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/md5.js"); - - -var v3 = (0,_v35_js__WEBPACK_IMPORTED_MODULE_0__["default"])('v3', 0x30, _md5_js__WEBPACK_IMPORTED_MODULE_1__["default"]); -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (v3); - -/***/ }), - -/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/v35.js": -/*!******************************************************************!*\ - !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/v35.js ***! - \******************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ DNS: () => (/* binding */ DNS), -/* harmony export */ URL: () => (/* binding */ URL), -/* harmony export */ "default": () => (/* export default binding */ __WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _stringify_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./stringify.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/stringify.js"); -/* harmony import */ var _parse_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./parse.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/parse.js"); - - - -function stringToBytes(str) { - str = unescape(encodeURIComponent(str)); // UTF8 escape - - var bytes = []; - - for (var i = 0; i < str.length; ++i) { - bytes.push(str.charCodeAt(i)); - } - - return bytes; -} - -var DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8'; -var URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8'; -/* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__(name, version, hashfunc) { - function generateUUID(value, namespace, buf, offset) { - if (typeof value === 'string') { - value = stringToBytes(value); - } - - if (typeof namespace === 'string') { - namespace = (0,_parse_js__WEBPACK_IMPORTED_MODULE_0__["default"])(namespace); - } - - if (namespace.length !== 16) { - throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)'); - } // Compute hash of namespace and value, Per 4.3 - // Future: Use spread syntax when supported on all platforms, e.g. `bytes = - // hashfunc([...namespace, ... value])` - - - var bytes = new Uint8Array(16 + value.length); - bytes.set(namespace); - bytes.set(value, namespace.length); - bytes = hashfunc(bytes); - bytes[6] = bytes[6] & 0x0f | version; - bytes[8] = bytes[8] & 0x3f | 0x80; - - if (buf) { - offset = offset || 0; - - for (var i = 0; i < 16; ++i) { - buf[offset + i] = bytes[i]; - } - - return buf; - } - - return (0,_stringify_js__WEBPACK_IMPORTED_MODULE_1__["default"])(bytes); - } // Function#name is not settable on some platforms (#270) - - - try { - generateUUID.name = name; // eslint-disable-next-line no-empty - } catch (err) {} // For CommonJS default export support - - - generateUUID.DNS = DNS; - generateUUID.URL = URL; - return generateUUID; -} - -/***/ }), - -/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/v4.js": -/*!*****************************************************************!*\ - !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/v4.js ***! - \*****************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _rng_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./rng.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/rng.js"); -/* harmony import */ var _stringify_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./stringify.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/stringify.js"); - - - -function v4(options, buf, offset) { - options = options || {}; - var rnds = options.random || (options.rng || _rng_js__WEBPACK_IMPORTED_MODULE_0__["default"])(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved` - - rnds[6] = rnds[6] & 0x0f | 0x40; - rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided - - if (buf) { - offset = offset || 0; - - for (var i = 0; i < 16; ++i) { - buf[offset + i] = rnds[i]; - } - - return buf; - } - - return (0,_stringify_js__WEBPACK_IMPORTED_MODULE_1__["default"])(rnds); -} - -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (v4); - -/***/ }), - -/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/v5.js": -/*!*****************************************************************!*\ - !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/v5.js ***! - \*****************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _v35_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./v35.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/v35.js"); -/* harmony import */ var _sha1_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sha1.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/sha1.js"); - - -var v5 = (0,_v35_js__WEBPACK_IMPORTED_MODULE_0__["default"])('v5', 0x50, _sha1_js__WEBPACK_IMPORTED_MODULE_1__["default"]); -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (v5); - -/***/ }), - -/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/validate.js": -/*!***********************************************************************!*\ - !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/validate.js ***! - \***********************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _regex_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./regex.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/regex.js"); - - -function validate(uuid) { - return typeof uuid === 'string' && _regex_js__WEBPACK_IMPORTED_MODULE_0__["default"].test(uuid); -} - -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (validate); - -/***/ }), - -/***/ "../api-shared-js/node_modules/uuid/dist/esm-browser/version.js": -/*!**********************************************************************!*\ - !*** ../api-shared-js/node_modules/uuid/dist/esm-browser/version.js ***! - \**********************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _validate_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./validate.js */ "../api-shared-js/node_modules/uuid/dist/esm-browser/validate.js"); - - -function version(uuid) { - if (!(0,_validate_js__WEBPACK_IMPORTED_MODULE_0__["default"])(uuid)) { - throw TypeError('Invalid UUID'); - } - - return parseInt(uuid.substr(14, 1), 16); -} - -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (version); - -/***/ }), - -/***/ "../api-internal-contract-js/lib/internal-contract-version.json": -/*!**********************************************************************!*\ - !*** ../api-internal-contract-js/lib/internal-contract-version.json ***! - \**********************************************************************/ -/***/ ((module) => { - -"use strict"; -module.exports = /*#__PURE__*/JSON.parse('{"major":1,"minor":188,"fix":0}'); - -/***/ }) - -/******/ }); -/************************************************************************/ -/******/ // The module cache -/******/ var __webpack_module_cache__ = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ // Check if module is in cache -/******/ var cachedModule = __webpack_module_cache__[moduleId]; -/******/ if (cachedModule !== undefined) { -/******/ return cachedModule.exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = __webpack_module_cache__[moduleId] = { -/******/ // no module.id needed -/******/ // no module.loaded needed -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/************************************************************************/ -/******/ /* webpack/runtime/define property getters */ -/******/ (() => { -/******/ // define getter functions for harmony exports -/******/ __webpack_require__.d = (exports, definition) => { -/******/ for(var key in definition) { -/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { -/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); -/******/ } -/******/ } -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/hasOwnProperty shorthand */ -/******/ (() => { -/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) -/******/ })(); -/******/ -/******/ /* webpack/runtime/make namespace object */ -/******/ (() => { -/******/ // define __esModule on exports -/******/ __webpack_require__.r = (exports) => { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ })(); -/******/ -/************************************************************************/ -var __webpack_exports__ = {}; -// This entry need to be wrapped in an IIFE because it need to be in strict mode. -(() => { -"use strict"; -var exports = __webpack_exports__; -/*!**********************************!*\ - !*** ./lib/src/ExtensionsApi.js ***! - \**********************************/ - -/** - * This is your main. This is where you re-export everything you want to be publicly available. - * - * The build enforces that the file has the same name as the global variable that is exported. - */ -Object.defineProperty(exports, "__esModule", ({ value: true })); -const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); -// Due to the way we configured webpack, we should be exporting things which will be under -// a global variable called "tableau". Export everything we want to be visible under tableau -// from this file. -const ExtensionsImpl_1 = __webpack_require__(/*! ./ExtensionsApi/Impl/ExtensionsImpl */ "./lib/src/ExtensionsApi/Impl/ExtensionsImpl.js"); -const Extensions_1 = __webpack_require__(/*! ./ExtensionsApi/Namespaces/Extensions */ "./lib/src/ExtensionsApi/Namespaces/Extensions.js"); -const isAlpha = typeof VERSION_IS_ALPHA !== 'undefined' ? VERSION_IS_ALPHA : false; -api_shared_js_1.ApiVersion.SetVersionNumber( true ? "1.15.0-pre.15" : 0, isAlpha); -const extensionImpl = new ExtensionsImpl_1.ExtensionsImpl(); -exports.extensions = new Extensions_1.Extensions(extensionImpl); -// Export Enums -// These show up under the tableau object. I.e. tableau.ExtensionContext.Server -var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -exports.AnalyticsObjectType = api_external_contract_js_1.AnalyticsObjectType; -exports.AnnotationType = api_external_contract_js_1.AnnotationType; -exports.ClassNameKey = api_external_contract_js_1.ClassNameKey; -exports.ColumnType = api_external_contract_js_1.ColumnType; -exports.DashboardLayoutChange = api_external_contract_js_1.DashboardLayoutChange; -exports.DashboardObjectType = api_external_contract_js_1.DashboardObjectType; -exports.DashboardObjectVisibilityType = api_external_contract_js_1.DashboardObjectVisibilityType; -exports.DataType = api_external_contract_js_1.DataType; -exports.DateRangeType = api_external_contract_js_1.DateRangeType; -exports.DialogStyle = api_external_contract_js_1.DialogStyle; -exports.EncodingType = api_external_contract_js_1.EncodingType; -exports.ErrorCodes = api_external_contract_js_1.ErrorCodes; -exports.ExtensionContext = api_external_contract_js_1.ExtensionContext; -exports.ExtensionMode = api_external_contract_js_1.ExtensionMode; -exports.FieldAggregationType = api_external_contract_js_1.FieldAggregationType; -exports.FieldRoleType = api_external_contract_js_1.FieldRoleType; -exports.FilterDomainType = api_external_contract_js_1.FilterDomainType; -exports.FilterNullOption = api_external_contract_js_1.FilterNullOption; -exports.FilterType = api_external_contract_js_1.FilterType; -exports.FilterUpdateType = api_external_contract_js_1.FilterUpdateType; -exports.HierarchicalLevelSelectionState = api_external_contract_js_1.HierarchicalLevelSelectionState; -exports.IncludeDataValuesOption = api_external_contract_js_1.IncludeDataValuesOption; -exports.MarkType = api_external_contract_js_1.MarkType; -exports.ParameterValueType = api_external_contract_js_1.ParameterValueType; -exports.PeriodType = api_external_contract_js_1.PeriodType; -exports.QuickTableCalcType = api_external_contract_js_1.QuickTableCalcType; -exports.ReplaySpeedType = api_external_contract_js_1.ReplaySpeedType; -exports.SelectionUpdateType = api_external_contract_js_1.SelectionUpdateType; -exports.SelectOptions = api_external_contract_js_1.SelectOptions; -exports.SheetType = api_external_contract_js_1.SheetType; -exports.SortDirection = api_external_contract_js_1.SortDirection; -exports.TableauEventType = api_external_contract_js_1.TableauEventType; -exports.TrendLineModelType = api_external_contract_js_1.TrendLineModelType; -exports.VizImageEncodingType = api_external_contract_js_1.VizImageEncodingType; -exports.VizImagePaletteType = api_external_contract_js_1.VizImagePaletteType; -exports.VizImageSizeSettingAlignmentType = api_external_contract_js_1.VizImageSizeSettingAlignmentType; -exports.VizImageSizeSettingType = api_external_contract_js_1.VizImageSizeSettingType; -exports.VizImageSortDirectionType = api_external_contract_js_1.VizImageSortDirectionType; -exports.ZoneVisibilityType = api_external_contract_js_1.ZoneVisibilityType; - -})(); - -window.tableau = __webpack_exports__; -/******/ })() -; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFDO0FBRXhELGVBQWU7QUFDZiwrRUFBK0U7QUFDL0UseUpBeUMyQztBQXhDekMsNEVBQW1CO0FBQ25CLGtFQUFjO0FBQ2QsOERBQVk7QUFDWiwwREFBVTtBQUNWLGdGQUFxQjtBQUNyQiw0RUFBbUI7QUFDbkIsZ0dBQTZCO0FBQzdCLHNEQUFRO0FBQ1IsZ0VBQWE7QUFDYiw0REFBVztBQUNYLDhEQUFZO0FBQ1osMERBQVU7QUFDVixzRUFBZ0I7QUFDaEIsZ0VBQWE7QUFDYiw4RUFBb0I7QUFDcEIsZ0VBQWE7QUFDYixzRUFBZ0I7QUFDaEIsc0VBQWdCO0FBQ2hCLDBEQUFVO0FBQ1Ysc0VBQWdCO0FBQ2hCLG9HQUErQjtBQUMvQixvRkFBdUI7QUFDdkIsc0RBQVE7QUFDUiwwRUFBa0I7QUFDbEIsMERBQVU7QUFDViwwRUFBa0I7QUFFbEIsb0VBQWU7QUFDZiw0RUFBbUI7QUFDbkIsZ0VBQWE7QUFDYix3REFBUztBQUNULGdFQUFhO0FBQ2Isc0VBQWdCO0FBQ2hCLDBFQUFrQjtBQUNsQiw4RUFBb0I7QUFDcEIsNEVBQW1CO0FBQ25CLHNHQUFnQztBQUNoQyxvRkFBdUI7QUFDdkIsd0ZBQXlCO0FBQ3pCLDBFQUFrQiIsInNvdXJjZXMiOlsid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2d1aWQvZ3VpZC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvRXZlbnRzL0Rhc2hib2FyZExheW91dENoYW5nZWRFdmVudC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvRXZlbnRzL0ZpbHRlckNoYW5nZWRFdmVudC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvRXZlbnRzL01hcmtzU2VsZWN0ZWRFdmVudC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvRXZlbnRzL1BhcmFtZXRlckNoYW5nZWRFdmVudC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvRXZlbnRzL1N1bW1hcnlEYXRhQ2hhbmdlZEV2ZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9FdmVudHMvVGFibGVhdUV2ZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9FdmVudHMvVGFibGVhdVNoZWV0RXZlbnQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0V2ZW50cy9UYWJsZWF1V29ya3NoZWV0RXZlbnQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0V2ZW50cy9Xb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkRXZlbnQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0V2ZW50cy9Xb3Jrc2hlZXRGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9JbXBsL0JlbnRvblNhbnNGb250TmFtZUNvbnN0YW50cy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvSW1wbC9Db25uZWN0ZWRTZXJ2ZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0ltcGwvRXh0ZW5zaW9uV29ya2Jvb2tJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9JbXBsL0V4dGVuc2lvbnNJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9JbXBsL0xlZ2FjeUludGVybmFsQXBpRGlzcGF0Y2hlckhvbGRlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvSW1wbC9TZXR0aW5nc0ltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0ltcGwvVGFibGVhdUJvb2tGb250TmFtZUNvbnN0YW50cy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvSW1wbC9VSUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL01vZGVscy9EYXNoYm9hcmQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL01vZGVscy9EYXNoYm9hcmRPYmplY3QudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL01vZGVscy9QYXJhbWV0ZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL01vZGVscy9TaGVldC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvTW9kZWxzL1dvcmtib29rLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9Nb2RlbHMvV29ya3NoZWV0LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9OYW1lc3BhY2VzL0Rhc2hib2FyZENvbnRlbnQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL05hbWVzcGFjZXMvRW52aXJvbm1lbnQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL05hbWVzcGFjZXMvRXh0ZW5zaW9ucy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvTmFtZXNwYWNlcy9TZXR0aW5ncy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvTmFtZXNwYWNlcy9VSS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvTmFtZXNwYWNlcy9Xb3JrYm9va0Zvcm1hdHRpbmdFbnZVdGlsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9OYW1lc3BhY2VzL1dvcmtzaGVldENvbnRlbnQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL1NlcnZpY2VzL0ltcGwvSW5pdGlhbGl6YXRpb25TZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvU2VydmljZXMvSW1wbC9TZXR0aW5nc1NlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9TZXJ2aWNlcy9JbXBsL1VJU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL1NlcnZpY2VzL1JlZ2lzdGVyQWxsRXh0ZW5zaW9uc1NlcnZpY2VzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnlVdGlsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9FbWJlZGRpbmdBcGlFeHRlcm5hbENvbnRyYWN0LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9FeHRlbnNpb25zQXBpRXh0ZXJuYWxDb250cmFjdC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1leHRlcm5hbC1jb250cmFjdC1qcy9zcmMvRXh0ZXJuYWxDb250cmFjdC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1leHRlcm5hbC1jb250cmFjdC1qcy9zcmMvRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvQXNrRGF0YUludGVyZmFjZXMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL0VudW1zLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9FeHRlcm5hbENvbnRyYWN0L0VtYmVkZGluZy9QdWxzZUludGVyZmFjZXMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1ZpekludGVyZmFjZXMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1dlYkNvbXBvbmVudEludGVyZmFjZXMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9OYW1lc3BhY2VzL1RhYmxlYXUudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL0V4dGVybmFsQ29udHJhY3QvU2hhcmVkL0VudW1zLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9OYW1lc3BhY2VzL1RhYmxlYXUudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL1NoYXJlZEFwaUV4dGVybmFsQ29udHJhY3QudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL0pzQXBpSW50ZXJuYWxDb250cmFjdC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvY29udHJhY3QvRGF0YVR5cGVDb252ZXJ0ZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL2NvbnRyYWN0L0VudW1zLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy9jb250cmFjdC9Ob3RpZmljYXRpb25zLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy9jb250cmFjdC9QYXJhbWV0ZXJzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy9jb250cmFjdC9WZXJicy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvaW50ZXJmYWNlL0Fza0RhdGFJbnRlcmZhY2UudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL2ludGVyZmFjZS9QdWxzZUludGVyZmFjZS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvaW50ZXJmYWNlL1ZxbEludGVyZmFjZS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvbWVzc2FnaW5nL0Nyb3NzRnJhbWVNZXNzZW5nZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL21lc3NhZ2luZy9Dcm9zc0ZyYW1lUHJlcGFyZWRNZXNzYWdlLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy9tZXNzYWdpbmcvTWVzc2FnZVR5cGVDaGVja3MudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL21lc3NhZ2luZy9pbnRlcmZhY2UvTWVzc2FnZVR5cGVzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy92ZXJzaW9uaW5nL0lkZW50aXR5VmVyc2lvbkNvbnZlcnRlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvdmVyc2lvbmluZy9TdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL3ZlcnNpb25pbmcvVmVyc2lvbkNvbnZlcnRlckZhY3RvcnkudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL3ZlcnNpb25pbmcvVmVyc2lvblRyYW5zbGF0aW9ucy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvdmVyc2lvbmluZy9leHRlcm5hbC9FeHRlcm5hbElkZW50aXR5VmVyc2lvbkNvbnZlcnRlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvdmVyc2lvbmluZy9leHRlcm5hbC9FeHRlcm5hbFN0YWNraW5nVmVyc2lvbkNvbnZlcnRlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvdmVyc2lvbmluZy9leHRlcm5hbC9FeHRlcm5hbFZlcnNpb25Db252ZXJ0ZXJGYWN0b3J5LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0FwaVZlcnNpb24udHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvQ29ubmVjdGlvblN1bW1hcnkudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvQ3Jvc3NGcmFtZS9Dcm9zc0ZyYW1lQm9vdHN0cmFwLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0Nyb3NzRnJhbWUvQ3Jvc3NGcmFtZURpc3BhdGNoZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvRGF0YVNvdXJjZS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9FbnVtTWFwcGluZ3MvRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0VudW1NYXBwaW5ncy9JbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvRXZlbnRMaXN0ZW5lck1hbmFnZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvRmllbGQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9DdXN0b21WaWV3SW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9JbXBsL0Rhc2hib2FyZEltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9EYXNoYm9hcmRPYmplY3RJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0ltcGwvRGF0YVNvdXJjZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9GaWVsZEltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9QYXJhbWV0ZXJJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0ltcGwvU2hlZXRJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0ltcGwvU2hlZXRJbmZvSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9JbXBsL1NpbmdsZUV2ZW50TWFuYWdlckltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9TdG9yeUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9TdG9yeVBvaW50SW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9JbXBsL1N0b3J5UG9pbnRJbmZvSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9JbXBsL1dvcmtib29rSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9JbXBsL1dvcmtzaGVldEltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvTG9naWNhbFRhYmxlLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL01vZGVscy9BY2Nlc3NpYmlsaXR5TW9kZWxzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL01vZGVscy9GaWx0ZXJNb2RlbHMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvTW9kZWxzL0dldERhdGFNb2RlbHMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvTW9kZWxzL0dldERhdGFUYWJsZVJlYWRlck1vZGVscy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9Nb2RlbHMvU2VsZWN0aW9uTW9kZWxzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1BvaW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL0dldERhdGFTZXJ2aWNlLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL1JlZ2lzdGVyQWxsU2hhcmVkU2VydmljZXMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvQWNjZXNzaWJpbGl0eVNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvQW5pbWF0aW9uU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9Bbm5vdGF0aW9uU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9DbGllbnRJbmZvU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9EYXRhU291cmNlU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9FeHBvcnRTZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL0V4dGVybmFsQ29udGV4dE1lbnVTZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL0ZpbHRlclNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvR2V0RGF0YVNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvTm90aWZpY2F0aW9uU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9Ob3RpZmljYXRpb25TZXJ2aWNlSW1wbEJhc2UudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9QYXJhbWV0ZXJzU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9TZWxlY3Rpb25TZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1NlcnZpY2VJbXBsQmFzZS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1NpemVTZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1N0b3J5QWN0aXZhdGlvblNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvVmlzdWFsTW9kZWxTZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1ZpelNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvWm9uZVNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1RhYmxlU3VtbWFyeS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9UYWJsZWF1RXJyb3IudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvVXRpbHMvRGF0YVZhbHVlRmFjdG9yeS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9VdGlscy9EZWZlcnJlZC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9VdGlscy9FbnVtQ29udmVydGVyLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1V0aWxzL0Vycm9ySGVscGVycy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9VdGlscy9FeHBvcnRIZWxwZXJzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1V0aWxzL1BhcmFtLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1V0aWxzL1NoZWV0VXRpbHMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvVXRpbHMvU2hvcnRMaXZlZERlZmVycmVkLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1ZlcnNpb25OdW1iZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9WZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvbWQ1LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL25pbC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9wYXJzZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9yZWdleC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9ybmcuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvc2hhMS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9zdHJpbmdpZnkuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdjEuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdjMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdjM1LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3Y0LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3Y1LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3ZhbGlkYXRlLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3ZlcnNpb24uanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly90YWJsZWF1L3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly90YWJsZWF1L3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vdGFibGVhdS93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gKCkge1xuICB2YXIgdmFsaWRhdG9yID0gbmV3IFJlZ0V4cChcIl5bYS16MC05XXs4fS1bYS16MC05XXs0fS1bYS16MC05XXs0fS1bYS16MC05XXs0fS1bYS16MC05XXsxMn0kXCIsIFwiaVwiKTtcblxuICBmdW5jdGlvbiBnZW4oY291bnQpIHtcbiAgICB2YXIgb3V0ID0gXCJcIjtcbiAgICBmb3IgKHZhciBpPTA7IGk8Y291bnQ7IGkrKykge1xuICAgICAgb3V0ICs9ICgoKDErTWF0aC5yYW5kb20oKSkqMHgxMDAwMCl8MCkudG9TdHJpbmcoMTYpLnN1YnN0cmluZygxKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIGZ1bmN0aW9uIEd1aWQoZ3VpZCkge1xuICAgIGlmICghZ3VpZCkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXJndW1lbnQ7IGB2YWx1ZWAgaGFzIG5vIHZhbHVlLlwiKTtcbiAgICAgIFxuICAgIHRoaXMudmFsdWUgPSBHdWlkLkVNUFRZO1xuICAgIFxuICAgIGlmIChndWlkICYmIGd1aWQgaW5zdGFuY2VvZiBHdWlkKSB7XG4gICAgICB0aGlzLnZhbHVlID0gZ3VpZC50b1N0cmluZygpO1xuXG4gICAgfSBlbHNlIGlmIChndWlkICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChndWlkKSA9PT0gXCJbb2JqZWN0IFN0cmluZ11cIiAmJiBHdWlkLmlzR3VpZChndWlkKSkge1xuICAgICAgdGhpcy52YWx1ZSA9IGd1aWQ7XG4gICAgfVxuICAgIFxuICAgIHRoaXMuZXF1YWxzID0gZnVuY3Rpb24ob3RoZXIpIHtcbiAgICAgIC8vIENvbXBhcmluZyBzdHJpbmcgYHZhbHVlYCBhZ2FpbnN0IHByb3ZpZGVkIGBndWlkYCB3aWxsIGF1dG8tY2FsbFxuICAgICAgLy8gdG9TdHJpbmcgb24gYGd1aWRgIGZvciBjb21wYXJpc29uXG4gICAgICByZXR1cm4gR3VpZC5pc0d1aWQob3RoZXIpICYmIHRoaXMudmFsdWUgPT0gb3RoZXI7XG4gICAgfTtcblxuICAgIHRoaXMuaXNFbXB0eSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMudmFsdWUgPT09IEd1aWQuRU1QVFk7XG4gICAgfTtcbiAgICBcbiAgICB0aGlzLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgICB9O1xuICAgIFxuICAgIHRoaXMudG9KU09OID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgICB9O1xuICB9O1xuXG4gIEd1aWQuRU1QVFkgPSBcIjAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMFwiO1xuXG4gIEd1aWQuaXNHdWlkID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgJiYgKHZhbHVlIGluc3RhbmNlb2YgR3VpZCB8fCB2YWxpZGF0b3IudGVzdCh2YWx1ZS50b1N0cmluZygpKSk7XG4gIH07XG5cbiAgR3VpZC5jcmVhdGUgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IEd1aWQoW2dlbigyKSwgZ2VuKDEpLCBnZW4oMSksIGdlbigxKSwgZ2VuKDMpXS5qb2luKFwiLVwiKSk7XG4gIH07XG5cbiAgR3VpZC5yYXcgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gW2dlbigyKSwgZ2VuKDEpLCBnZW4oMSksIGdlbigxKSwgZ2VuKDMpXS5qb2luKFwiLVwiKTtcbiAgfTtcblxuICBpZih0eXBlb2YgbW9kdWxlICE9ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBHdWlkO1xuICB9XG4gIGVsc2UgaWYgKHR5cGVvZiB3aW5kb3cgIT0gJ3VuZGVmaW5lZCcpIHtcbiAgICB3aW5kb3cuR3VpZCA9IEd1aWQ7XG4gIH1cbn0pKCk7XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUV2ZW50IH0gZnJvbSAnLi9UYWJsZWF1RXZlbnQnO1xuXG5leHBvcnQgY2xhc3MgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZEV2ZW50IGV4dGVuZHMgVGFibGVhdUV2ZW50IGltcGxlbWVudHMgQ29udHJhY3QuRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZEV2ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBfZGFzaGJvYXJkTGF5b3V0Q2hhbmdlRGV0YWlsczogQ29udHJhY3QuRGFzaGJvYXJkTGF5b3V0Q2hhbmdlRGV0YWlscykge1xuICAgIHN1cGVyKENvbnRyYWN0LlRhYmxlYXVFdmVudFR5cGUuRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRhc2hib2FyZExheW91dENoYW5nZURldGFpbHMoKTogQ29udHJhY3QuRGFzaGJvYXJkTGF5b3V0Q2hhbmdlRGV0YWlscyB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZExheW91dENoYW5nZURldGFpbHM7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFcnJvckNvZGVzLCBUYWJsZWF1RXZlbnRUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgVGFibGVhdVdvcmtzaGVldEV2ZW50IH0gZnJvbSAnLi9UYWJsZWF1V29ya3NoZWV0RXZlbnQnO1xuXG5leHBvcnQgY2xhc3MgRmlsdGVyQ2hhbmdlZEV2ZW50IGV4dGVuZHMgVGFibGVhdVdvcmtzaGVldEV2ZW50IGltcGxlbWVudHMgQ29udHJhY3QuRmlsdGVyQ2hhbmdlZEV2ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHdvcmtzaGVldDogQ29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0LCBwcml2YXRlIF9maWVsZE5hbWU6IHN0cmluZywgcHJpdmF0ZSBfZmllbGRJZD86IHN0cmluZykge1xuICAgIHN1cGVyKFRhYmxlYXVFdmVudFR5cGUuRmlsdGVyQ2hhbmdlZCwgd29ya3NoZWV0KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmllbGROYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkTmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmllbGRJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9maWVsZElkO1xuICB9XG5cbiAgcHVibGljIGdldEZpbHRlckFzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuRmlsdGVyPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldC5nZXRGaWx0ZXJzQXN5bmMoKS50aGVuPENvbnRyYWN0LkZpbHRlcj4oKGZpbHRlcnMpID0+IHtcbiAgICAgIC8vIFRPRE86IEZpbHRlcmluZyBvZiB0aGUgZmlsdGVycyBzaG91bGQgZXZlbnR1YWxseSBiZSBkb25lIHBsYXRmb3JtIHNpZGUuXG4gICAgICBjb25zdCBldmVudGVkRmlsdGVyID0gdGhpcy5maWVsZElkXG4gICAgICAgID8gZmlsdGVycy5maW5kKChmaWx0ZXIpID0+IGZpbHRlci5maWVsZElkID09PSB0aGlzLmZpZWxkSWQsIHRoaXMpXG4gICAgICAgIDogZmlsdGVycy5maW5kKChmaWx0ZXIpID0+IGZpbHRlci5maWVsZE5hbWUgPT09IHRoaXMuZmllbGROYW1lLCB0aGlzKTtcblxuICAgICAgaWYgKCFldmVudGVkRmlsdGVyKSB7XG4gICAgICAgIC8vIFdlIHNob3VsZG4ndCBoaXQgdGhpcyB1bmxlc3MgdGhlIGZpbHRlciB3YXMgcmVtb3ZlZCBmcm9tIHRoZSB3b3Jrc2hlZXRcbiAgICAgICAgLy8gYWZ0ZXIgdGhlIGV2ZW50IHdhcyByYWlzZWQuXG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5NaXNzaW5nRmlsdGVyLCBgY2Fubm90IGZpbmQgZmlsdGVyOiAke3RoaXMuX2ZpZWxkTmFtZX1gKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGV2ZW50ZWRGaWx0ZXI7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXZlbnRUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVXb3Jrc2hlZXRFdmVudCB9IGZyb20gJy4vVGFibGVhdVdvcmtzaGVldEV2ZW50JztcblxuZXhwb3J0IGNsYXNzIE1hcmtzU2VsZWN0ZWRFdmVudCBleHRlbmRzIFRhYmxlYXVXb3Jrc2hlZXRFdmVudCBpbXBsZW1lbnRzIENvbnRyYWN0Lk1hcmtzU2VsZWN0ZWRFdmVudCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih3b3Jrc2hlZXQ6IENvbnRyYWN0LkV4dGVuc2lvbldvcmtzaGVldCkge1xuICAgIHN1cGVyKFRhYmxlYXVFdmVudFR5cGUuTWFya1NlbGVjdGlvbkNoYW5nZWQsIHdvcmtzaGVldCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TWFya3NBc3luYygpOiBQcm9taXNlPENvbnRyYWN0Lk1hcmtzQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiB0aGlzLndvcmtzaGVldC5nZXRTZWxlY3RlZE1hcmtzQXN5bmMoKTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEVycm9yQ29kZXMsIFRhYmxlYXVFdmVudFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5LCBQYXJhbWV0ZXJzU2VydmljZSwgU2VydmljZU5hbWVzLCBUYWJsZWF1RXJyb3IgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IFBhcmFtZXRlciB9IGZyb20gJy4uL01vZGVscy9QYXJhbWV0ZXInO1xuaW1wb3J0IHsgRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnlVdGlsJztcbmltcG9ydCB7IFRhYmxlYXVTaGVldEV2ZW50IH0gZnJvbSAnLi9UYWJsZWF1U2hlZXRFdmVudCc7XG5cbmV4cG9ydCBjbGFzcyBQYXJhbWV0ZXJDaGFuZ2VkRXZlbnQgZXh0ZW5kcyBUYWJsZWF1U2hlZXRFdmVudCBpbXBsZW1lbnRzIENvbnRyYWN0LlBhcmFtZXRlckNoYW5nZWRFdmVudCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9nbG9iYWxGaWVsZE5hbWU6IHN0cmluZywgc2hlZXQ6IENvbnRyYWN0LkV4dGVuc2lvblNoZWV0KSB7XG4gICAgc3VwZXIoVGFibGVhdUV2ZW50VHlwZS5QYXJhbWV0ZXJDaGFuZ2VkLCBzaGVldCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0UGFyYW1ldGVyQXN5bmMoKTogUHJvbWlzZTxDb250cmFjdC5QYXJhbWV0ZXI+IHtcbiAgICAvLyBDYWxsIGRvd24gdG8gb3VyIHNlcnZpY2UgdG8gZ2V0IHRoZSBwYXJhbWV0ZXIgYmFjayB2aWEgaXRzIGZpZWxkIG5hbWVcbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxQYXJhbWV0ZXJzU2VydmljZT4oU2VydmljZU5hbWVzLlBhcmFtZXRlcnMpO1xuICAgIHJldHVybiBzZXJ2aWNlLmZpbmRQYXJhbWV0ZXJCeUdsb2JhbEZpZWxkTmFtZUFzeW5jKHRoaXMuX2dsb2JhbEZpZWxkTmFtZSkudGhlbigocGFyYW1ldGVySW1wbCkgPT4ge1xuICAgICAgaWYgKHBhcmFtZXRlckltcGwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuTWlzc2luZ1BhcmFtZXRlciwgYENhbm5vdCBmaW5kIHBhcmFtZXRlcjogJHt0aGlzLl9nbG9iYWxGaWVsZE5hbWV9YCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgUGFyYW1ldGVyKHBhcmFtZXRlckltcGwsIHRoaXMuc2hlZXQpO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUV2ZW50VHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1V29ya3NoZWV0RXZlbnQgfSBmcm9tICcuL1RhYmxlYXVXb3Jrc2hlZXRFdmVudCc7XG5cbmV4cG9ydCBjbGFzcyBTdW1tYXJ5RGF0YUNoYW5nZWRFdmVudCBleHRlbmRzIFRhYmxlYXVXb3Jrc2hlZXRFdmVudCBpbXBsZW1lbnRzIENvbnRyYWN0LlN1bW1hcnlEYXRhQ2hhbmdlZEV2ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHdvcmtzaGVldDogQ29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0KSB7XG4gICAgc3VwZXIoVGFibGVhdUV2ZW50VHlwZS5TdW1tYXJ5RGF0YUNoYW5nZWQsIHdvcmtzaGVldCk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXZlbnRUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcblxuZXhwb3J0IGNsYXNzIFRhYmxlYXVFdmVudCBpbXBsZW1lbnRzIENvbnRyYWN0LlRhYmxlYXVFdmVudCB7XG4gIHByaXZhdGUgX3R5cGU6IFRhYmxlYXVFdmVudFR5cGU7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHR5cGU6IFRhYmxlYXVFdmVudFR5cGUpIHtcbiAgICB0aGlzLl90eXBlID0gdHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdHlwZSgpOiBUYWJsZWF1RXZlbnRUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fdHlwZTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFdmVudFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUV2ZW50IH0gZnJvbSAnLi9UYWJsZWF1RXZlbnQnO1xuXG5leHBvcnQgY2xhc3MgVGFibGVhdVNoZWV0RXZlbnQgZXh0ZW5kcyBUYWJsZWF1RXZlbnQgaW1wbGVtZW50cyBDb250cmFjdC5UYWJsZWF1U2hlZXRFdmVudCB7XG4gIHByaXZhdGUgX3NoZWV0OiBDb250cmFjdC5FeHRlbnNpb25TaGVldDtcblxuICBwdWJsaWMgZ2V0IHNoZWV0KCk6IENvbnRyYWN0LkV4dGVuc2lvblNoZWV0IHtcbiAgICByZXR1cm4gdGhpcy5fc2hlZXQ7XG4gIH1cblxuICBwdWJsaWMgY29uc3RydWN0b3IodHlwZTogVGFibGVhdUV2ZW50VHlwZSwgc2hlZXQ6IENvbnRyYWN0LkV4dGVuc2lvblNoZWV0KSB7XG4gICAgc3VwZXIodHlwZSk7XG5cbiAgICB0aGlzLl9zaGVldCA9IHNoZWV0O1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUV2ZW50VHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1U2hlZXRFdmVudCB9IGZyb20gJy4vVGFibGVhdVNoZWV0RXZlbnQnO1xuXG5leHBvcnQgY2xhc3MgVGFibGVhdVdvcmtzaGVldEV2ZW50IGV4dGVuZHMgVGFibGVhdVNoZWV0RXZlbnQgaW1wbGVtZW50cyBDb250cmFjdC5UYWJsZWF1V29ya3NoZWV0RXZlbnQge1xuICBwdWJsaWMgZ2V0IHdvcmtzaGVldCgpOiBDb250cmFjdC5FeHRlbnNpb25Xb3Jrc2hlZXQge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXQ7XG4gIH1cblxuICBwdWJsaWMgY29uc3RydWN0b3IodHlwZTogVGFibGVhdUV2ZW50VHlwZSwgcHJvdGVjdGVkIF93b3Jrc2hlZXQ6IENvbnRyYWN0LkV4dGVuc2lvbldvcmtzaGVldCkge1xuICAgIHN1cGVyKHR5cGUsIF93b3Jrc2hlZXQpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUV2ZW50IH0gZnJvbSAnLi9UYWJsZWF1RXZlbnQnO1xuXG5leHBvcnQgY2xhc3MgV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50IGV4dGVuZHMgVGFibGVhdUV2ZW50IGltcGxlbWVudHMgQ29udHJhY3QuV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2Zvcm1hdHRpbmc6IENvbnRyYWN0Lldvcmtib29rRm9ybWF0dGluZykge1xuICAgIHN1cGVyKENvbnRyYWN0LlRhYmxlYXVFdmVudFR5cGUuV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZvcm1hdHRpbmcoKTogQ29udHJhY3QuV29ya2Jvb2tGb3JtYXR0aW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybWF0dGluZztcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVXb3Jrc2hlZXRFdmVudCB9IGZyb20gJy4vVGFibGVhdVdvcmtzaGVldEV2ZW50JztcblxuZXhwb3J0IGNsYXNzIFdvcmtzaGVldEZvcm1hdHRpbmdDaGFuZ2VkRXZlbnQgZXh0ZW5kcyBUYWJsZWF1V29ya3NoZWV0RXZlbnQgaW1wbGVtZW50cyBDb250cmFjdC5Xb3Jrc2hlZXRGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHdvcmtzaGVldDogQ29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0LCBwcml2YXRlIF9mb3JtYXR0aW5nOiBDb250cmFjdC5Xb3Jrc2hlZXRGb3JtYXR0aW5nKSB7XG4gICAgc3VwZXIoQ29udHJhY3QuVGFibGVhdUV2ZW50VHlwZS5Xb3Jrc2hlZXRGb3JtYXR0aW5nQ2hhbmdlZCwgd29ya3NoZWV0KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZm9ybWF0dGluZygpOiBDb250cmFjdC5Xb3Jrc2hlZXRGb3JtYXR0aW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybWF0dGluZztcbiAgfVxufVxuIiwiaW1wb3J0IHsgTW9kZWwgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG5leHBvcnQgY29uc3QgQmVudG9uU2Fuc0ZvbnRGYW1pbHlOYW1lID0gJ0JlbnRvbiBTYW5zJztcbmV4cG9ydCBjb25zdCBCZW50b25TYW5zTG93RFBJRm9udEZhbWlseU5hbWUgPSAnQmVudG9uIFNhbnMgTG93LURQSSc7XG5cbmV4cG9ydCBjb25zdCBCZW50b25TYW5zQm9va0ZvbnRGYWNlTmFtZSA9ICdCZW50b24gU2FucyBCb29rJztcbmV4cG9ydCBjb25zdCBCZW50b25TYW5zQm9va0l0YWxpY0ZvbnRGYWNlTmFtZSA9ICdCZW50b24gU2FucyBCb29rIEl0YWxpYyc7XG5leHBvcnQgY29uc3QgQmVudG9uU2Fuc1NlbWlEZW1pRm9udEZhY2VOYW1lID0gJ0JlbnRvbiBTYW5zIFNlbWlEZW1pJztcbmV4cG9ydCBjb25zdCBCZW50b25TYW5zU2VtaURlbWlJdGFsaWNGb250RmFjZU5hbWUgPSAnQmVudG9uIFNhbnMgU2VtaURlbWkgSXRhbGljJztcbmV4cG9ydCBjb25zdCBCZW50b25TYW5zTGlnaHRGb250RmFjZU5hbWUgPSAnQmVudG9uIFNhbnMgTGlnaHQnO1xuZXhwb3J0IGNvbnN0IEJlbnRvblNhbnNNZWRpdW1Gb250RmFjZU5hbWUgPSAnQmVudG9uIFNhbnMgTWVkaXVtJztcblxuZXhwb3J0IGNvbnN0IFN1cHBvcnRlZEJlbnRvblNhbnNGb250RmFjZXM6IE1vZGVsW10gPSBbXG4gIEJlbnRvblNhbnNCb29rRm9udEZhY2VOYW1lLFxuICBCZW50b25TYW5zQm9va0l0YWxpY0ZvbnRGYWNlTmFtZSxcbiAgQmVudG9uU2Fuc1NlbWlEZW1pRm9udEZhY2VOYW1lLFxuICBCZW50b25TYW5zU2VtaURlbWlJdGFsaWNGb250RmFjZU5hbWUsXG4gIEJlbnRvblNhbnNMaWdodEZvbnRGYWNlTmFtZSxcbiAgQmVudG9uU2Fuc01lZGl1bUZvbnRGYWNlTmFtZSxcbl07XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuXG5leHBvcnQgY2xhc3MgQ29ubmVjdGVkU2VydmVyIGltcGxlbWVudHMgQ29udHJhY3QuQ29ubmVjdGVkU2VydmVyIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBfdXNlcklkPzogc3RyaW5nLFxuICAgIHByb3RlY3RlZCBfc2l0ZUlkPzogc3RyaW5nLFxuICAgIHByb3RlY3RlZCBfc2l0ZU5hbWVzcGFjZT86IHN0cmluZyxcbiAgICBwcm90ZWN0ZWQgX3dvcmtib29rSWQ/OiBzdHJpbmcsXG4gICkge31cblxuICBwdWJsaWMgZ2V0IHVzZXJJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl91c2VySWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNpdGVJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9zaXRlSWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNpdGVOYW1lc3BhY2UoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fc2l0ZU5hbWVzcGFjZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgd29ya2Jvb2tJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl93b3JrYm9va0lkO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGF0YVNjaGVtYSwgRGF0YVNvdXJjZSBhcyBEYXRhU291cmNlSW5mbyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBBcGlTZXJ2aWNlUmVnaXN0cnksIERhdGFTb3VyY2UsIERhdGFTb3VyY2VJbXBsLCBEYXRhU291cmNlU2VydmljZSwgU2VydmljZU5hbWVzLCBXb3JrYm9va0ltcGwgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IEV4dGVuc2lvbnNSZWdpc3RyeUlkIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5VXRpbCc7XG5cbmV4cG9ydCBjbGFzcyBFeHRlbnNpb25Xb3JrYm9va0ltcGwgZXh0ZW5kcyBXb3JrYm9va0ltcGwge1xuICBwdWJsaWMgZ2V0QWxsRGF0YVNvdXJjZXNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkRhdGFTb3VyY2U+PiB7XG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RGF0YVNvdXJjZVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5EYXRhU291cmNlU2VydmljZSk7XG5cbiAgICByZXR1cm4gc2VydmljZS5nZXRBbGxEYXRhU291cmNlc0FzeW5jKCkudGhlbjxBcnJheTxDb250cmFjdC5EYXRhU291cmNlPj4oKHJlc3VsdCkgPT4ge1xuICAgICAgY29uc3QgZGF0YVNjaGVtYTogRGF0YVNjaGVtYSA9IHJlc3VsdDtcbiAgICAgIGNvbnN0IGRhdGFTb3VyY2VzOiBBcnJheTxDb250cmFjdC5EYXRhU291cmNlPiA9IFtdO1xuXG4gICAgICAvLyBMb29wIHRocm91Z2ggYWxsIGRhdGEgc291cmNlcyBhbmQgYWRkIHRoZW0uXG4gICAgICBPYmplY3QudmFsdWVzKGRhdGFTY2hlbWEuZGF0YVNvdXJjZXMpLmZvckVhY2goKGRzKSA9PiB7XG4gICAgICAgIGRhdGFTb3VyY2VzLnB1c2godGhpcy5jcmVhdGVEYXRhU291cmNlRnJvbUluZm8oZHMpKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gZGF0YVNvdXJjZXM7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZURhdGFTb3VyY2VGcm9tSW5mbyhkYXRhU291cmNlSW5mbzogRGF0YVNvdXJjZUluZm8pOiBEYXRhU291cmNlIHtcbiAgICBjb25zdCBkYXRhU291cmNlSW1wbCA9IG5ldyBEYXRhU291cmNlSW1wbChkYXRhU291cmNlSW5mbywgRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpO1xuICAgIGNvbnN0IGRhdGFTb3VyY2UgPSBuZXcgRGF0YVNvdXJjZShkYXRhU291cmNlSW1wbCk7XG4gICAgZGF0YVNvdXJjZUltcGwuaW5pdGlhbGl6ZVdpdGhQdWJsaWNJbnRlcmZhY2VzKGRhdGFTb3VyY2UpO1xuICAgIHJldHVybiBkYXRhU291cmNlO1xuICB9XG59XG4iLCJpbXBvcnQgeyBFcnJvckNvZGVzLCBTaGVldFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQ29udGV4dE1lbnVFdmVudCxcbiAgRGFzaGJvYXJkRXh0ZW5zaW9uTG9jYXRvcixcbiAgRXhlY3V0ZVBhcmFtZXRlcnMsXG4gIEV4dGVuc2lvbkRhc2hib2FyZEluZm8sXG4gIEV4dGVuc2lvbkxvY2F0b3IsXG4gIEV4dGVuc2lvblNldHRpbmdzSW5mbyxcbiAgRXh0ZW5zaW9uV29ya3NoZWV0SW5mbyxcbiAgRm9udE5hbWVBbmRJbmZvLFxuICBGb3JtYXR0aW5nU2hlZXQsXG4gIElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT04sXG4gIEluaXRpYWxpemF0aW9uT3B0aW9ucyxcbiAgSW50ZXJuYWxBcGlEaXNwYXRjaGVyLFxuICBJbnRlcm5hbEFwaURpc3BhdGNoZXJGYWN0b3J5LFxuICBNb2RlbCxcbiAgTm90aWZpY2F0aW9uSWQsXG4gIFBhcmFtZXRlcklkLFxuICBTaGVldFBhdGgsXG4gIFZlcmJJZCxcbiAgV29ya2Jvb2tGb3JtYXR0aW5nLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LFxuICBBcGlWZXJzaW9uLFxuICBEYXNoYm9hcmRJbXBsLFxuICBOb3RpZmljYXRpb25TZXJ2aWNlLFxuICBTZXJ2aWNlTmFtZXMsXG4gIFNoZWV0SW5mb0ltcGwsXG4gIFRhYmxlYXVFcnJvcixcbiAgVmVyc2lvbmVkRXh0ZXJuYWxBcGlEaXNwYXRjaGVyLFxuICBWaXpTZXJ2aWNlLFxuICBXb3Jrc2hlZXRJbXBsLFxuICBkb0Nyb3NzRnJhbWVCb290c3RyYXAsXG4gIHJlZ2lzdGVyQWxsU2hhcmVkU2VydmljZXMsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkIH0gZnJvbSAnLi4vTW9kZWxzL0Rhc2hib2FyZCc7XG5pbXBvcnQgeyBXb3JrYm9vayB9IGZyb20gJy4uL01vZGVscy9Xb3JrYm9vayc7XG5pbXBvcnQgeyBXb3Jrc2hlZXQgfSBmcm9tICcuLi9Nb2RlbHMvV29ya3NoZWV0JztcbmltcG9ydCB7IERhc2hib2FyZENvbnRlbnQgfSBmcm9tICcuLi9OYW1lc3BhY2VzL0Rhc2hib2FyZENvbnRlbnQnO1xuaW1wb3J0IHsgRW52aXJvbm1lbnQgfSBmcm9tICcuLi9OYW1lc3BhY2VzL0Vudmlyb25tZW50JztcbmltcG9ydCB7IFNldHRpbmdzIH0gZnJvbSAnLi4vTmFtZXNwYWNlcy9TZXR0aW5ncyc7XG5pbXBvcnQgeyBVSSB9IGZyb20gJy4uL05hbWVzcGFjZXMvVUknO1xuaW1wb3J0IHsgV29ya2Jvb2tGb3JtYXR0aW5nRW52VXRpbCB9IGZyb20gJy4uL05hbWVzcGFjZXMvV29ya2Jvb2tGb3JtYXR0aW5nRW52VXRpbCc7XG5pbXBvcnQgeyBXb3Jrc2hlZXRDb250ZW50IH0gZnJvbSAnLi4vTmFtZXNwYWNlcy9Xb3Jrc2hlZXRDb250ZW50JztcbmltcG9ydCB7IEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9FeHRlbnNpb25zU2VydmljZU5hbWVzJztcbmltcG9ydCB7IEluaXRpYWxpemF0aW9uU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0luaXRpYWxpemF0aW9uU2VydmljZSc7XG5pbXBvcnQgeyByZWdpc3RlckFsbEV4dGVuc2lvbnNTZXJ2aWNlcywgcmVnaXN0ZXJJbml0aWFsaXphdGlvbkV4dGVuc2lvbnNTZXJ2aWNlcyB9IGZyb20gJy4uL1NlcnZpY2VzL1JlZ2lzdGVyQWxsRXh0ZW5zaW9uc1NlcnZpY2VzJztcbmltcG9ydCB7IEV4dGVuc2lvbnNSZWdpc3RyeUlkIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5VXRpbCc7XG5pbXBvcnQgeyBVSVNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9VSVNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgQmVudG9uU2Fuc0Jvb2tGb250RmFjZU5hbWUsXG4gIEJlbnRvblNhbnNCb29rSXRhbGljRm9udEZhY2VOYW1lLFxuICBCZW50b25TYW5zRm9udEZhbWlseU5hbWUsXG4gIEJlbnRvblNhbnNMaWdodEZvbnRGYWNlTmFtZSxcbiAgQmVudG9uU2Fuc0xvd0RQSUZvbnRGYW1pbHlOYW1lLFxuICBCZW50b25TYW5zTWVkaXVtRm9udEZhY2VOYW1lLFxuICBCZW50b25TYW5zU2VtaURlbWlGb250RmFjZU5hbWUsXG4gIEJlbnRvblNhbnNTZW1pRGVtaUl0YWxpY0ZvbnRGYWNlTmFtZSxcbiAgU3VwcG9ydGVkQmVudG9uU2Fuc0ZvbnRGYWNlcyxcbn0gZnJvbSAnLi9CZW50b25TYW5zRm9udE5hbWVDb25zdGFudHMnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uV29ya2Jvb2tJbXBsIH0gZnJvbSAnLi9FeHRlbnNpb25Xb3JrYm9va0ltcGwnO1xuaW1wb3J0IHsgTGVnYWN5SW50ZXJuYWxBcGlEaXNwYXRjaGVySG9sZGVyIH0gZnJvbSAnLi9MZWdhY3lJbnRlcm5hbEFwaURpc3BhdGNoZXJIb2xkZXInO1xuaW1wb3J0IHsgU2V0dGluZ3NJbXBsIH0gZnJvbSAnLi9TZXR0aW5nc0ltcGwnO1xuaW1wb3J0IHtcbiAgU3VwcG9ydGVkVGFibGVhdUZvbnRGYWNlcyxcbiAgVGFibGVhdUJvbGRGb250RmFjZU5hbWUsXG4gIFRhYmxlYXVCb2xkRm9udEZhbWlseU5hbWUsXG4gIFRhYmxlYXVCb29rRm9udEZhY2VOYW1lLFxuICBUYWJsZWF1Qm9va0ZvbnRGYW1pbHlOYW1lLFxuICBUYWJsZWF1TGlnaHRGb250RmFjZU5hbWUsXG4gIFRhYmxlYXVMaWdodEZvbnRGYW1pbHlOYW1lLFxuICBUYWJsZWF1TWVkaXVtRm9udEZhY2VOYW1lLFxuICBUYWJsZWF1TWVkaXVtRm9udEZhbWlseU5hbWUsXG4gIFRhYmxlYXVSZWd1bGFyRm9udEZhY2VOYW1lLFxuICBUYWJsZWF1UmVndWxhckZvbnRGYW1pbHlOYW1lLFxuICBUYWJsZWF1U2VtaUJvbGRGb250RmFjZU5hbWUsXG4gIFRhYmxlYXVTZW1pYm9sZEZvbnRGYW1pbHlOYW1lLFxufSBmcm9tICcuL1RhYmxlYXVCb29rRm9udE5hbWVDb25zdGFudHMnO1xuaW1wb3J0IHsgVUlJbXBsIH0gZnJvbSAnLi9VSUltcGwnO1xuXG5leHBvcnQgdHlwZSBDYWxsYmFja01hcCA9IHsgW2tleTogc3RyaW5nXTogKCkgPT4gUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfTtcblxuZXhwb3J0IGNsYXNzIEV4dGVuc2lvbnNJbXBsIHtcbiAgcHJpdmF0ZSBfaW5pdGlhbGl6YXRpb25Qcm9taXNlOiBQcm9taXNlPHN0cmluZz47XG4gIHByaXZhdGUgX3N0eWxlRWxlbWVudDogSFRNTFN0eWxlRWxlbWVudDtcbiAgcHVibGljIGRhc2hib2FyZENvbnRlbnQ/OiBEYXNoYm9hcmRDb250ZW50O1xuICBwdWJsaWMgd29ya3NoZWV0Q29udGVudD86IFdvcmtzaGVldENvbnRlbnQ7XG4gIHB1YmxpYyBlbnZpcm9ubWVudDogRW52aXJvbm1lbnQ7XG4gIHB1YmxpYyBzZXR0aW5nczogU2V0dGluZ3M7XG4gIHB1YmxpYyB1aTogVUk7XG4gIHB1YmxpYyB3b3JrYm9vazogV29ya2Jvb2s7XG4gIHB1YmxpYyBleHRlbnNpb25ab25lSWQ6IG51bWJlcjtcblxuICBwdWJsaWMgaW5pdGlhbGl6ZUFzeW5jKGlzRXh0ZW5zaW9uRGlhbG9nOiBib29sZWFuLCBjb250ZXh0TWVudUNhbGxiYWNrcz86IENhbGxiYWNrTWFwKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoIXRoaXMuX2luaXRpYWxpemF0aW9uUHJvbWlzZSkge1xuICAgICAgdGhpcy5faW5pdGlhbGl6YXRpb25Qcm9taXNlID0gbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGluaXRPcHRpb25zOiBJbml0aWFsaXphdGlvbk9wdGlvbnMgPSB7IGlzQWxwaGE6IEFwaVZlcnNpb24uSW5zdGFuY2UuaXNBbHBoYSB9O1xuICAgICAgICAvLyBGaXJzdCB0aGluZyB3ZSB3YW50IHRvIGRvIGlzIGNoZWNrIHRvIHNlZSBpZiB0aGVyZSBpcyBhIGRlc2t0b3AgZGlzcGF0Y2hlciBhbHJlYWR5IHJlZ2lzdGVyZWQgZm9yIHVzXG4gICAgICAgIGlmIChMZWdhY3lJbnRlcm5hbEFwaURpc3BhdGNoZXJIb2xkZXIuaGFzRGVza3RvcEFwaURpc3BhdGNoZXJQcm9taXNlKGluaXRPcHRpb25zKSkge1xuICAgICAgICAgIC8vIFJ1bm5pbmcgaW4gYSBwcmUtMjAxOS4zIGRlc2t0b3AsIHVzZSBvdXIgbGVnYWN5IGRpc3BhdGNoZXIgcHJvbWlzZVxuICAgICAgICAgIGNvbnN0IGRlc2t0b3BEaXNwYXRjaGVyUHJvbWlzZSA9IExlZ2FjeUludGVybmFsQXBpRGlzcGF0Y2hlckhvbGRlci5nZXREZXNrdG9wRGlzcGF0Y2hlclByb21pc2UoaW5pdE9wdGlvbnMpO1xuICAgICAgICAgIGRlc2t0b3BEaXNwYXRjaGVyUHJvbWlzZVxuICAgICAgICAgICAgPy50aGVuKChkaXNwYXRjaGVyRmFjdG9yeSkgPT4gdGhpcy5vbkRpc3BhdGNoZXJSZWNlaXZlZChkaXNwYXRjaGVyRmFjdG9yeSwgaXNFeHRlbnNpb25EaWFsb2csIGNvbnRleHRNZW51Q2FsbGJhY2tzKSlcbiAgICAgICAgICAgIC50aGVuKChvcGVuUGF5bG9hZCkgPT4ge1xuICAgICAgICAgICAgICByZXNvbHZlKG9wZW5QYXlsb2FkKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBXZSBtdXN0IGJlIHJ1bm5pbmcgaW4gc2VydmVyLCBzbyB3ZSBzaG91bGQgdHJ5IHRvIGtpY2sgb2YgdGhlIHNlcnZlciBkaXNwYXRjaGVyIGJvb3RzdHJhcHBpbmdcbiAgICAgICAgICBjb25zdCBvbkRpc3BhdGNoZXJSZWNlaXZlZENhbGxiYWNrID0gdGhpcy5vbkRpc3BhdGNoZXJSZWNlaXZlZC5iaW5kKHRoaXMpO1xuICAgICAgICAgIGRvQ3Jvc3NGcmFtZUJvb3RzdHJhcCh3aW5kb3csIElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT04sIGluaXRPcHRpb25zKVxuICAgICAgICAgICAgLnRoZW4oKGZhY3Rvcnk6IEludGVybmFsQXBpRGlzcGF0Y2hlckZhY3RvcnkpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIG9uRGlzcGF0Y2hlclJlY2VpdmVkQ2FsbGJhY2soZmFjdG9yeSwgaXNFeHRlbnNpb25EaWFsb2csIGNvbnRleHRNZW51Q2FsbGJhY2tzKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbigob3BlblBheWxvYWQpID0+IHtcbiAgICAgICAgICAgICAgcmVzb2x2ZShvcGVuUGF5bG9hZCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9pbml0aWFsaXphdGlvblByb21pc2U7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlVml6SW1hZ2VBc3luYyhpbnB1dFNwZWM6IG9iamVjdCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3Qgdml6U2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8Vml6U2VydmljZT4oU2VydmljZU5hbWVzLlZpeik7XG5cbiAgICByZXR1cm4gdml6U2VydmljZS5jcmVhdGVWaXpJbWFnZUFzeW5jKGlucHV0U3BlYyk7XG4gIH1cblxuICBwdWJsaWMgc2V0Q2xpY2tUaHJvdWdoQXN5bmMoY2xpY2tUaHJvdWdoRW5hYmxlZDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHVpU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8VUlTZXJ2aWNlPihFeHRlbnNpb25zU2VydmljZU5hbWVzLlVJU2VydmljZSk7XG5cbiAgICByZXR1cm4gdWlTZXJ2aWNlLnNldENsaWNrVGhyb3VnaEFzeW5jKGNsaWNrVGhyb3VnaEVuYWJsZWQsIHRoaXMuZXh0ZW5zaW9uWm9uZUlkKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNEYXNoYm9hcmRFeHRlbnNpb25Mb2NhdG9yKGxvY2F0b3I6IEV4dGVuc2lvbkxvY2F0b3IpOiBsb2NhdG9yIGlzIERhc2hib2FyZEV4dGVuc2lvbkxvY2F0b3Ige1xuICAgIGNvbnN0IGRhc2hib2FyZEV4dGVuc2lvbkxvY2F0b3IgPSBsb2NhdG9yIGFzIERhc2hib2FyZEV4dGVuc2lvbkxvY2F0b3I7XG4gICAgaWYgKCFkYXNoYm9hcmRFeHRlbnNpb25Mb2NhdG9yLmRhc2hib2FyZFBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnVW5leHBlY3RlZCBlcnJvciBkdXJpbmcgaW5pdGlhbGl6YXRpb24uJyk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkRpc3BhdGNoZXJSZWNlaXZlZChcbiAgICBkaXNwYXRjaGVyRmFjdG9yeTogSW50ZXJuYWxBcGlEaXNwYXRjaGVyRmFjdG9yeSxcbiAgICBpc0V4dGVuc2lvbkRpYWxvZzogYm9vbGVhbixcbiAgICBjb250ZXh0TWVudUZ1bmN0aW9ucz86IENhbGxiYWNrTWFwLFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGxldCBkaXNwYXRjaGVyOiBJbnRlcm5hbEFwaURpc3BhdGNoZXIgPSBkaXNwYXRjaGVyRmFjdG9yeShJTlRFUk5BTF9DT05UUkFDVF9WRVJTSU9OKTtcblxuICAgIC8vIENhbGwgdG8gcmVnaXN0ZXIgYWxsIHRoZSBzZXJ2aWNlcyB3aGljaCB3aWxsIHVzZSB0aGUgbmV3bHkgaW5pdGlhbGl6ZWQgZGlzcGF0Y2hlclxuICAgIHJlZ2lzdGVySW5pdGlhbGl6YXRpb25FeHRlbnNpb25zU2VydmljZXMoZGlzcGF0Y2hlcik7XG5cbiAgICAvLyBHZXQgdGhlIGluaXRpYWxpemF0aW9uIHNlcnZpY2UgYW5kIGluaXRpYWxpemUgdGhpcyBleHRlbnNpb25cbiAgICBjb25zdCBpbml0aWFsaXphdGlvblNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEluaXRpYWxpemF0aW9uU2VydmljZT4oXG4gICAgICBFeHRlbnNpb25zU2VydmljZU5hbWVzLkluaXRpYWxpemF0aW9uU2VydmljZSxcbiAgICApO1xuXG4gICAgY29uc3QgY2FsbGJhY2tNYXBLZXlzID0gY29udGV4dE1lbnVGdW5jdGlvbnMgPyBPYmplY3Qua2V5cyhjb250ZXh0TWVudUZ1bmN0aW9ucykgOiBbXTtcbiAgICByZXR1cm4gaW5pdGlhbGl6YXRpb25TZXJ2aWNlLmluaXRpYWxpemVEYXNoYm9hcmRFeHRlbnNpb25zQXN5bmMoaXNFeHRlbnNpb25EaWFsb2csIGNhbGxiYWNrTWFwS2V5cykudGhlbjxzdHJpbmc+KChyZXN1bHQpID0+IHtcbiAgICAgIC8vIElmIHdlIHJlY2VpdmUgYW4gaW52YWxpZCBwbGFmb3JtIHZlcnNpb24sIHRoaXMgbWVhbnMgdGhhdCBwbGF0Zm9ybSBpcyBydW5ubmluZyAxLjQgb3IgMi4xIGFuZFxuICAgICAgLy8gZG9lc24ndCBwYXNzIHRoZSBwbGF0Zm9ybSB2ZXJzaW9uIHRvIGV4dGVybmFsLiBJbiB0aGlzIGNhc2Ugd2UgYXNzdW1lIHRoZSBwbGF0Zm9ybSB2ZXJzaW9uIHRvIGJlIDEuOVxuICAgICAgY29uc3QgcGxhdGZvcm1WZXJzaW9uID0gcmVzdWx0LmV4dGVuc2lvbkVudmlyb25tZW50LnBsYXRmb3JtVmVyc2lvblxuICAgICAgICA/IHJlc3VsdC5leHRlbnNpb25FbnZpcm9ubWVudC5wbGF0Zm9ybVZlcnNpb25cbiAgICAgICAgOiB7IG1ham9yOiAxLCBtaW5vcjogOSwgZml4OiAwIH07XG5cbiAgICAgIC8vIFdyYXAgb3VyIGV4aXN0aW5nIGRpc3BhdGNoZXIgaW4gYSBkaXNwYXRjaGVyIHRoYXQgY2FuIGRvd25ncmFkZS91cGdyYWRlIGZvciBhbiBvbGRlciBwbGF0Zm9ybS5cbiAgICAgIGlmIChWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIubmVlZHNWZXJzaW9uQ29udmVydGVyKHBsYXRmb3JtVmVyc2lvbikpIHtcbiAgICAgICAgZGlzcGF0Y2hlciA9IG5ldyBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIoZGlzcGF0Y2hlciwgcGxhdGZvcm1WZXJzaW9uKTtcbiAgICAgIH1cbiAgICAgIC8vIFJlZ2lzdHJhdGlvbiBvZiBzZXJ2aWNlcyBtdXN0IGhhcHBlbiBiZWZvcmUgaW5pdGlhbGl6aW5nIGNvbnRlbnQgYW5kIGVudmlyb25tZW50XG4gICAgICAvLyBFeHRlbnNpb25zIGRvZXNuJ3QgbmVlZCB0byBwYXNzIGluIGEgcmVnaXN0cnlJZC4gQnkgZGVmYXVsdCwgdGhlIHNlcnZpY2UgcmVnaXN0cnkgaW5zdGFuY2UgaXMgYXNzb2NpYXRlZCB3aXRoIHJlZ2lzdHJ5SWQ9MC5cbiAgICAgIHJlZ2lzdGVyQWxsU2hhcmVkU2VydmljZXMoZGlzcGF0Y2hlciwgRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpO1xuICAgICAgcmVnaXN0ZXJBbGxFeHRlbnNpb25zU2VydmljZXMoZGlzcGF0Y2hlcik7XG5cbiAgICAgIGlmIChyZXN1bHQuZXh0ZW5zaW9uRGFzaGJvYXJkSW5mbyAmJiB0aGlzLmlzRGFzaGJvYXJkRXh0ZW5zaW9uTG9jYXRvcihyZXN1bHQuZXh0ZW5zaW9uSW5zdGFuY2UubG9jYXRvcikpIHtcbiAgICAgICAgdGhpcy5kYXNoYm9hcmRDb250ZW50ID0gdGhpcy5pbml0aWFsaXplRGFzaGJvYXJkQ29udGVudChcbiAgICAgICAgICByZXN1bHQuZXh0ZW5zaW9uRGFzaGJvYXJkSW5mbyxcbiAgICAgICAgICByZXN1bHQuZXh0ZW5zaW9uSW5zdGFuY2UubG9jYXRvci5kYXNoYm9hcmRQYXRoLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmV4dGVuc2lvblpvbmVJZCA9IHJlc3VsdC5leHRlbnNpb25EYXNoYm9hcmRJbmZvLmV4dGVuc2lvblpvbmVJZDtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc3VsdC5leHRlbnNpb25Xb3Jrc2hlZXRJbmZvKSB7XG4gICAgICAgIHRoaXMud29ya3NoZWV0Q29udGVudCA9IHRoaXMuaW5pdGlhbGl6ZVdvcmtzaGVldENvbnRlbnQocmVzdWx0LmV4dGVuc2lvbldvcmtzaGVldEluZm8pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmVudmlyb25tZW50ID0gbmV3IEVudmlyb25tZW50KHJlc3VsdC5leHRlbnNpb25FbnZpcm9ubWVudCk7XG4gICAgICB0aGlzLnNldHRpbmdzID0gdGhpcy5pbml0aWFsaXplU2V0dGluZ3MocmVzdWx0LmV4dGVuc2lvblNldHRpbmdzSW5mbyk7XG4gICAgICB0aGlzLnVpID0gbmV3IFVJKG5ldyBVSUltcGwoKSk7XG4gICAgICB0aGlzLndvcmtib29rID0gbmV3IFdvcmtib29rKG5ldyBFeHRlbnNpb25Xb3JrYm9va0ltcGwoKSk7XG5cbiAgICAgIGlmIChyZXN1bHQuZXh0ZW5zaW9uRW52aXJvbm1lbnQud29ya2Jvb2tGb3JtYXR0aW5nKSB7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZVRhYmxlYXVGb250cyhkaXNwYXRjaGVyLCByZXN1bHQuZXh0ZW5zaW9uRW52aXJvbm1lbnQud29ya2Jvb2tGb3JtYXR0aW5nKTtcbiAgICAgICAgdGhpcy5hcHBseUFsbEZvcm1hdHRpbmcocmVzdWx0LmV4dGVuc2lvbkVudmlyb25tZW50Lndvcmtib29rRm9ybWF0dGluZyk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFmdGVyIGluaXRpYWxpemF0aW9uIGhhcyBjb21wbGV0ZWQsIHNldHVwIGxpc3RlbmVycyBmb3IgdGhlIGNhbGxiYWNrIGZ1bmN0aW9ucyB0aGF0XG4gICAgICAvLyBhcmUgbWVhbnQgdG8gYmUgdHJpZ2dlcmVkIHdoZW5ldmVyIGEgY29udGV4dCBtZW51IGl0ZW0gaXMgY2xpY2tlZC5cbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUNvbnRleHRNZW51Q2FsbGJhY2tzKGNvbnRleHRNZW51RnVuY3Rpb25zKTtcblxuICAgICAgLy8gQWxzbyBzZXQgdXAgbGlzdGVuZXJzIGZvciBFeHRlbnNpb25TdHlsZXNDaGFuZ2VkRXZlbnRcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZVdvcmtib29rRm9ybWF0dGluZ0NoYW5nZWRFdmVudENhbGxiYWNrKGRpc3BhdGNoZXIpO1xuXG4gICAgICAvLyBJbiB0aGUgbm9ybWFsIGluaXRpYWxpemF0aW9uIGNhc2UsIHRoaXMgd2lsbCBiZSBhbiBlbXB0eSBzdHJpbmcuICBXaGVuIHJldHVybmluZyBmcm9tIGluaXRpYWxpemVBc3luYyB0byB0aGVcbiAgICAgIC8vIGRldmVsb3Blciwgd2UganVzdCBpbmdvcmUgdGhhdCBzdHJpbmcuICBJbiB0aGUgY2FzZSBvZiBpbml0aWFsaXppbmcgZnJvbSBhbiBleHRlbnNpb24gZGlhbG9nLCB0aGlzIHN0cmluZ1xuICAgICAgLy8gaXMgYW4gb3B0aW9uYWwgcGF5bG9hZCBzZW50IGZyb20gdGhlIHBhcmVudCBleHRlbnNpb24uXG4gICAgICByZXR1cm4gcmVzdWx0LmV4dGVuc2lvbkRpYWxvZ1BheWxvYWQ7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlBbGxGb3JtYXR0aW5nKGZvcm1hdHRpbmdNb2RlbDogV29ya2Jvb2tGb3JtYXR0aW5nIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9zdHlsZUVsZW1lbnQpIHtcbiAgICAgIHRoaXMuX3N0eWxlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICB0aGlzLl9zdHlsZUVsZW1lbnQuaWQgPSAnVGFibGVhdS1FeHRlbnNpb24tRm9ybWF0dGluZyc7XG4gICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHRoaXMuX3N0eWxlRWxlbWVudCk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9zdHlsZUVsZW1lbnQuc2hlZXQgfHwgIWZvcm1hdHRpbmdNb2RlbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHN0eWxlc2hlZXQ6IENTU1N0eWxlU2hlZXQgPSB0aGlzLl9zdHlsZUVsZW1lbnQuc2hlZXQgYXMgQ1NTU3R5bGVTaGVldDtcbiAgICB3aGlsZSAoc3R5bGVzaGVldC5jc3NSdWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICBzdHlsZXNoZWV0LmRlbGV0ZVJ1bGUoc3R5bGVzaGVldC5jc3NSdWxlcy5sZW5ndGggLSAxKTtcbiAgICB9XG4gICAgZm9ybWF0dGluZ01vZGVsLmZvcm1hdHRpbmdTaGVldHMubWFwKChjdXJyZW50Rm9ybWF0dGluZ1NoZWV0KSA9PiB7XG4gICAgICB0aGlzLmFwcGx5Rm9ybWF0dGluZ1NoZWV0VG9TdHlsZVNoZWV0KGN1cnJlbnRGb3JtYXR0aW5nU2hlZXQsIHN0eWxlc2hlZXQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseUZvcm1hdHRpbmdTaGVldFRvU3R5bGVTaGVldChjdXJyZW50Rm9ybWF0dGluZ1NoZWV0OiBGb3JtYXR0aW5nU2hlZXQsIHN0eWxlc2hlZXQ6IENTU1N0eWxlU2hlZXQpOiB2b2lkIHtcbiAgICBsZXQgc3R5bGVJbmZvID0gJyc7XG5cbiAgICBjb25zdCBjc3NQcm9wZXJ0aWVzID0gY3VycmVudEZvcm1hdHRpbmdTaGVldC5jc3NQcm9wZXJ0aWVzO1xuICAgIGlmIChjc3NQcm9wZXJ0aWVzLmZvbnRGYW1pbHkpIHtcbiAgICAgIHN0eWxlSW5mbyArPSAnZm9udC1mYW1pbHk6ICcgKyBjc3NQcm9wZXJ0aWVzLmZvbnRGYW1pbHkudG9TdHJpbmcoKSArICc7ICc7XG4gICAgfVxuXG4gICAgaWYgKGNzc1Byb3BlcnRpZXMuZm9udFNpemUpIHtcbiAgICAgIHN0eWxlSW5mbyArPSAnZm9udC1zaXplOiAnICsgY3NzUHJvcGVydGllcy5mb250U2l6ZS50b1N0cmluZygpICsgJzsgJztcbiAgICB9XG5cbiAgICBpZiAoY3NzUHJvcGVydGllcy5mb250V2VpZ2h0KSB7XG4gICAgICBzdHlsZUluZm8gKz0gJ2ZvbnQtd2VpZ2h0OiAnICsgY3NzUHJvcGVydGllcy5mb250V2VpZ2h0LnRvU3RyaW5nKCkgKyAnOyAnO1xuICAgIH1cblxuICAgIGlmIChjc3NQcm9wZXJ0aWVzLmZvbnRTdHlsZSkge1xuICAgICAgc3R5bGVJbmZvICs9ICdmb250LXN0eWxlOiAnICsgY3NzUHJvcGVydGllcy5mb250U3R5bGUudG9TdHJpbmcoKSArICc7ICc7XG4gICAgfVxuXG4gICAgaWYgKGNzc1Byb3BlcnRpZXMudGV4dERlY29yYXRpb24pIHtcbiAgICAgIHN0eWxlSW5mbyArPSAndGV4dC1kZWNvcmF0aW9uOiAnICsgY3NzUHJvcGVydGllcy50ZXh0RGVjb3JhdGlvbi50b1N0cmluZygpICsgJzsgJztcbiAgICB9XG5cbiAgICBpZiAoY3NzUHJvcGVydGllcy5jb2xvcikge1xuICAgICAgc3R5bGVJbmZvICs9ICdjb2xvcjogJyArIGNzc1Byb3BlcnRpZXMuY29sb3IgKyAnOyAnO1xuICAgIH1cblxuICAgIGNvbnN0IHNlbGVjdG9yOiBzdHJpbmcgPSAnLicgKyBjdXJyZW50Rm9ybWF0dGluZ1NoZWV0LmNsYXNzTmFtZUtleTtcbiAgICBjb25zdCBydWxlOiBzdHJpbmcgPSBzZWxlY3RvciArICcgeyAnICsgc3R5bGVJbmZvICsgJyB9JztcbiAgICBzdHlsZXNoZWV0Lmluc2VydFJ1bGUocnVsZSwgc3R5bGVzaGVldC5jc3NSdWxlcy5sZW5ndGgpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50Q2FsbGJhY2soZGlzcGF0Y2hlcjogSW50ZXJuYWxBcGlEaXNwYXRjaGVyKTogdm9pZCB7XG4gICAgY29uc3Qgbm90aWZpY2F0aW9uU2VydmljZTogTm90aWZpY2F0aW9uU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8Tm90aWZpY2F0aW9uU2VydmljZT4oXG4gICAgICBTZXJ2aWNlTmFtZXMuTm90aWZpY2F0aW9uLFxuICAgICk7XG4gICAgLy8gVW5yZWdpc3RlciBmdW5jdGlvbiBub3QgdXNlZCBzaW5jZSB0aGVzZSBub3RpZmljYXRpb25zIHNob3VsZCBiZVxuICAgIC8vIG9ic2VydmVkIGZvciB0aGUgZnVsbCBsaWZldGltZSBvZiB0aGUgZXh0ZW5zaW9uLlxuICAgIG5vdGlmaWNhdGlvblNlcnZpY2UucmVnaXN0ZXJIYW5kbGVyKFxuICAgICAgTm90aWZpY2F0aW9uSWQuV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZCxcbiAgICAgICgpID0+IHRydWUsXG4gICAgICAoZXZlbnRGb3JtYXR0aW5nOiBXb3JrYm9va0Zvcm1hdHRpbmcpID0+IHtcbiAgICAgICAgaWYgKGV2ZW50Rm9ybWF0dGluZykge1xuICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZVRhYmxlYXVGb250cyhkaXNwYXRjaGVyLCBldmVudEZvcm1hdHRpbmcpO1xuICAgICAgICAgIHRoaXMuYXBwbHlBbGxGb3JtYXR0aW5nKGV2ZW50Rm9ybWF0dGluZyk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZVRhYmxlYXVGb250cyhkaXNwYXRjaGVyOiBJbnRlcm5hbEFwaURpc3BhdGNoZXIsIHdvcmtib29rRm9ybWF0dGluZzogV29ya2Jvb2tGb3JtYXR0aW5nKTogdm9pZCB7XG4gICAgY29uc3QgZm9udE5hbWVzOiBNb2RlbFtdID0gWy4uLlN1cHBvcnRlZEJlbnRvblNhbnNGb250RmFjZXMsIC4uLlN1cHBvcnRlZFRhYmxlYXVGb250RmFjZXNdO1xuICAgIHdvcmtib29rRm9ybWF0dGluZy5mb3JtYXR0aW5nU2hlZXRzLmZvckVhY2goKGZvcm1hdHRpbmdTaGVldCkgPT4ge1xuICAgICAgaWYgKGZvcm1hdHRpbmdTaGVldC5jc3NQcm9wZXJ0aWVzLmZvbnRGYW1pbHkpIHtcbiAgICAgICAgZm9udE5hbWVzLnB1c2goZm9ybWF0dGluZ1NoZWV0LmNzc1Byb3BlcnRpZXMuZm9udEZhbWlseSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoZm9udE5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0geyBbUGFyYW1ldGVySWQuRm9udE5hbWVMaXN0SXRlbXNdOiBmb250TmFtZXMgfTtcbiAgICAgIGRpc3BhdGNoZXJcbiAgICAgICAgLmV4ZWN1dGUoVmVyYklkLkdldEZvbnRzLCBwYXJhbWV0ZXJzKVxuICAgICAgICAudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICB0aGlzLmxvYWRGb250cyhyZXNwb25zZS5yZXN1bHQgYXMgQXJyYXk8Rm9udE5hbWVBbmRJbmZvPik7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbG9hZEZvbnRzKGZvbnRzOiBBcnJheTxGb250TmFtZUFuZEluZm8+KTogdm9pZCB7XG4gICAgZm9udHMuZm9yRWFjaCgoZm9udE5hbWVBbmRJbmZvKSA9PiB7XG4gICAgICBpZiAoU3VwcG9ydGVkVGFibGVhdUZvbnRGYWNlcy5pbmNsdWRlcyhmb250TmFtZUFuZEluZm8uZm9udE5hbWUpKSB7XG4gICAgICAgIHRoaXMubG9hZFRhYmxlYXVGb250cyhmb250TmFtZUFuZEluZm8pO1xuICAgICAgfSBlbHNlIGlmIChTdXBwb3J0ZWRCZW50b25TYW5zRm9udEZhY2VzLmluY2x1ZGVzKGZvbnROYW1lQW5kSW5mby5mb250TmFtZSkpIHtcbiAgICAgICAgdGhpcy5sb2FkQmVudG9uU2Fuc0ZvbnRzKGZvbnROYW1lQW5kSW5mbyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQobmV3IEZvbnRGYWNlKGZvbnROYW1lQW5kSW5mby5mb250TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVEYXNoYm9hcmRDb250ZW50KGluZm86IEV4dGVuc2lvbkRhc2hib2FyZEluZm8sIHNoZWV0UGF0aDogU2hlZXRQYXRoKTogRGFzaGJvYXJkQ29udGVudCB7XG4gICAgLy8gc2hlZXRzIGFyZSBhbHdheXMgYWN0aXZlIGZvciBFeHRlbnNpb25zXG4gICAgY29uc3Qgc2hlZXRJbmZvSW1wbCA9IG5ldyBTaGVldEluZm9JbXBsKGluZm8ubmFtZSwgU2hlZXRUeXBlLkRhc2hib2FyZCwgeyB3aWR0aDogaW5mby5zaXplLncsIGhlaWdodDogaW5mby5zaXplLmggfSwgdW5kZWZpbmVkLCB0cnVlKTtcbiAgICBjb25zdCBkYXNoYm9hcmRJbXBsID0gbmV3IERhc2hib2FyZEltcGwoc2hlZXRJbmZvSW1wbCwgaW5mby56b25lcywgc2hlZXRQYXRoLCBFeHRlbnNpb25zUmVnaXN0cnlJZCwgbnVsbCwgaW5mby5hY3RpdmVEYXNoYm9hcmRPYmplY3RJZCk7XG4gICAgY29uc3QgZGFzaGJvYXJkID0gbmV3IERhc2hib2FyZChkYXNoYm9hcmRJbXBsKTtcbiAgICByZXR1cm4gbmV3IERhc2hib2FyZENvbnRlbnQoZGFzaGJvYXJkKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZVdvcmtzaGVldENvbnRlbnQoaW5mbzogRXh0ZW5zaW9uV29ya3NoZWV0SW5mbyk6IFdvcmtzaGVldENvbnRlbnQge1xuICAgIGNvbnN0IHNoZWV0SW5mb0ltcGwgPSBuZXcgU2hlZXRJbmZvSW1wbChcbiAgICAgIGluZm8udmlzdWFsSWQud29ya3NoZWV0LFxuICAgICAgU2hlZXRUeXBlLldvcmtzaGVldCxcbiAgICAgIHsgd2lkdGg6IGluZm8uc2l6ZS53LCBoZWlnaHQ6IGluZm8uc2l6ZS5oIH0sXG4gICAgICB1bmRlZmluZWQsIC8vIGluZGV4IHByb3BlcnR5IGlzIGVtYmVkZGluZyBzcGVjaWZpY1xuICAgICAgdHJ1ZSwgLy8gc2hlZXRzIGFyZSBhbHdheXMgYWN0aXZlIGZvciBFeHRlbnNpb25zXG4gICAgKTtcblxuICAgIGNvbnN0IHdvcmtzaGVldEltcGwgPSBuZXcgV29ya3NoZWV0SW1wbChcbiAgICAgIHNoZWV0SW5mb0ltcGwsXG4gICAgICBFeHRlbnNpb25zUmVnaXN0cnlJZCxcbiAgICAgIGluZm8udmlzdWFsSWQsXG4gICAgICBudWxsLCAvLyBwYXJlbnREYXNoYm9hcmQgaXMgYWx3YXlzIG51bGwgZm9yIHdvcmtzaGVldCBpbiBXb3Jrc2hlZXRDb250ZW50XG4gICAgICBudWxsLCAvLyBwYXJlbnRTdG9yeVBvaW50IGlzIG9ubHkgdXNlZCBmb3IgZW1iZWRkaW5nXG4gICAgICBpbmZvLmJhY2tncm91bmRDb2xvcixcbiAgICAgIFdvcmtib29rRm9ybWF0dGluZ0VudlV0aWwuY29udmVydFRvV29ya2Jvb2tGb3JtYXR0aW5nKGluZm8uZm9ybWF0dGluZyksXG4gICAgKTtcbiAgICBjb25zdCB3b3Jrc2hlZXQgPSBuZXcgV29ya3NoZWV0KHdvcmtzaGVldEltcGwpO1xuICAgIHJldHVybiBuZXcgV29ya3NoZWV0Q29udGVudCh3b3Jrc2hlZXQpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplU2V0dGluZ3Moc2V0dGluZ3NJbmZvOiBFeHRlbnNpb25TZXR0aW5nc0luZm8pOiBTZXR0aW5ncyB7XG4gICAgY29uc3Qgc2V0dGluZ3NJbXBsID0gbmV3IFNldHRpbmdzSW1wbChzZXR0aW5nc0luZm8pO1xuICAgIHJldHVybiBuZXcgU2V0dGluZ3Moc2V0dGluZ3NJbXBsKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUNvbnRleHRNZW51Q2FsbGJhY2tzKGNvbnRleHRNZW51RnVuY3Rpb25zPzogQ2FsbGJhY2tNYXApOiB2b2lkIHtcbiAgICBjb25zdCBub3RpZmljYXRpb25TZXJ2aWNlOiBOb3RpZmljYXRpb25TZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxOb3RpZmljYXRpb25TZXJ2aWNlPihcbiAgICAgIFNlcnZpY2VOYW1lcy5Ob3RpZmljYXRpb24sXG4gICAgKTtcblxuICAgIC8vIFVucmVnaXN0ZXIgZnVuY3Rpb24gbm90IHVzZWQgc2luY2UgdGhlc2Ugbm90aWZpY2F0aW9ucyBzaG91bGQgYmVcbiAgICAvLyBvYnNlcnZlZCBmb3IgdGhlIGZ1bGwgbGlmZXRpbWUgb2YgdGhlIGV4dGVuc2lvbi5cbiAgICBub3RpZmljYXRpb25TZXJ2aWNlLnJlZ2lzdGVySGFuZGxlcihcbiAgICAgIE5vdGlmaWNhdGlvbklkLkNvbnRleHRNZW51Q2xpY2ssXG4gICAgICAoKSA9PiB7XG4gICAgICAgIC8vIExldCB0aHJvdWdoIGFueSBjb250ZXh0IG1lbnUgZXZlbnQsIHRoZXNlIGFyZSBhbHJlYWR5IGZpbHRlcmVkIG9uIGFwaS1jb3JlXG4gICAgICAgIC8vIGJhc2VkIG9uIHRoZSBleHRlbnNpb24gbG9jYXRvci5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9LFxuICAgICAgKGV2ZW50OiBDb250ZXh0TWVudUV2ZW50KSA9PiB7XG4gICAgICAgIC8vIEV4ZWN1dGUgdGhlIGZ1bmN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbnRleHQgbWVudSBJRFxuICAgICAgICBpZiAoY29udGV4dE1lbnVGdW5jdGlvbnMpIHtcbiAgICAgICAgICBpZiAoIWNvbnRleHRNZW51RnVuY3Rpb25zW2V2ZW50LmlkXSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludGVybmFsRXJyb3IsIGBSZWNlaXZlZCB1bmV4cGVjdGVkIGNvbnRleHQgbWVudSBJZCBmcm9tIGV2ZW50OiAke2V2ZW50LmlkfWApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnRleHRNZW51RnVuY3Rpb25zW2V2ZW50LmlkXSgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGxvYWRUYWJsZWF1Rm9udHMoZm9udE5hbWVBbmRJbmZvOiBGb250TmFtZUFuZEluZm8pOiB2b2lkIHtcbiAgICBzd2l0Y2ggKGZvbnROYW1lQW5kSW5mby5mb250TmFtZSkge1xuICAgICAgY2FzZSBUYWJsZWF1Qm9va0ZvbnRGYWNlTmFtZTpcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKG5ldyBGb250RmFjZShUYWJsZWF1Qm9va0ZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnbm9ybWFsJywgc3R5bGU6ICdub3JtYWwnIH0pKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVGFibGVhdUxpZ2h0Rm9udEZhY2VOYW1lOlxuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQobmV3IEZvbnRGYWNlKFRhYmxlYXVMaWdodEZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnbm9ybWFsJywgc3R5bGU6ICdub3JtYWwnIH0pKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVGFibGVhdVJlZ3VsYXJGb250RmFjZU5hbWU6XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChcbiAgICAgICAgICBuZXcgRm9udEZhY2UoVGFibGVhdVJlZ3VsYXJGb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHdlaWdodDogJ25vcm1hbCcsIHN0eWxlOiAnbm9ybWFsJyB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVGFibGVhdVNlbWlCb2xkRm9udEZhY2VOYW1lOlxuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQoXG4gICAgICAgICAgbmV3IEZvbnRGYWNlKFRhYmxlYXVTZW1pYm9sZEZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnbm9ybWFsJywgc3R5bGU6ICdub3JtYWwnIH0pLFxuICAgICAgICApO1xuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQobmV3IEZvbnRGYWNlKFRhYmxlYXVSZWd1bGFyRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdib2xkJywgc3R5bGU6ICdub3JtYWwnIH0pKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVGFibGVhdUJvbGRGb250RmFjZU5hbWU6XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChuZXcgRm9udEZhY2UoVGFibGVhdUJvbGRGb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHdlaWdodDogJ25vcm1hbCcsIHN0eWxlOiAnbm9ybWFsJyB9KSk7XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChuZXcgRm9udEZhY2UoVGFibGVhdUJvbGRGb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHdlaWdodDogJ2JvbGQnLCBzdHlsZTogJ25vcm1hbCcgfSkpO1xuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQobmV3IEZvbnRGYWNlKFRhYmxlYXVNZWRpdW1Gb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHdlaWdodDogJ2JvbGQnLCBzdHlsZTogJ25vcm1hbCcgfSkpO1xuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQoXG4gICAgICAgICAgbmV3IEZvbnRGYWNlKFRhYmxlYXVTZW1pYm9sZEZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnYm9sZCcsIHN0eWxlOiAnbm9ybWFsJyB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVGFibGVhdU1lZGl1bUZvbnRGYWNlTmFtZTpcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKFxuICAgICAgICAgIG5ldyBGb250RmFjZShUYWJsZWF1TWVkaXVtRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdub3JtYWwnLCBzdHlsZTogJ25vcm1hbCcgfSksXG4gICAgICAgICk7XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChuZXcgRm9udEZhY2UoVGFibGVhdUxpZ2h0Rm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdib2xkJywgc3R5bGU6ICdub3JtYWwnIH0pKTtcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKG5ldyBGb250RmFjZShUYWJsZWF1Qm9va0ZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnYm9sZCcsIHN0eWxlOiAnbm9ybWFsJyB9KSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYCdhdHRlbXB0ZWQgdG8gbG9hZCB1bnN1cHBvcnRlZCBmb250OiAke2ZvbnROYW1lQW5kSW5mby5mb250TmFtZX0uJ2ApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbG9hZEJlbnRvblNhbnNGb250cyhmb250TmFtZUFuZEluZm86IEZvbnROYW1lQW5kSW5mbyk6IHZvaWQge1xuICAgIHN3aXRjaCAoZm9udE5hbWVBbmRJbmZvLmZvbnROYW1lKSB7XG4gICAgICBjYXNlIEJlbnRvblNhbnNCb29rRm9udEZhY2VOYW1lOlxuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQobmV3IEZvbnRGYWNlKEJlbnRvblNhbnNGb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHdlaWdodDogJ25vcm1hbCcsIHN0eWxlOiAnbm9ybWFsJyB9KSk7XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChcbiAgICAgICAgICBuZXcgRm9udEZhY2UoQmVudG9uU2Fuc0xvd0RQSUZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnMTAwJywgc3R5bGU6ICdub3JtYWwnIH0pLFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBCZW50b25TYW5zTGlnaHRGb250RmFjZU5hbWU6XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChuZXcgRm9udEZhY2UoQmVudG9uU2Fuc0ZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnMTAwJywgc3R5bGU6ICdub3JtYWwnIH0pKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgQmVudG9uU2Fuc01lZGl1bUZvbnRGYWNlTmFtZTpcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKG5ldyBGb250RmFjZShCZW50b25TYW5zRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdib2xkJywgc3R5bGU6ICdub3JtYWwnIH0pKTtcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKFxuICAgICAgICAgIG5ldyBGb250RmFjZShCZW50b25TYW5zTG93RFBJRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdib2xkJywgc3R5bGU6ICdub3JtYWwnIH0pLFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBCZW50b25TYW5zU2VtaURlbWlGb250RmFjZU5hbWU6XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChcbiAgICAgICAgICBuZXcgRm9udEZhY2UoQmVudG9uU2Fuc0xvd0RQSUZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnbm9ybWFsJywgc3R5bGU6ICdub3JtYWwnIH0pLFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBCZW50b25TYW5zQm9va0l0YWxpY0ZvbnRGYWNlTmFtZTpcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKG5ldyBGb250RmFjZShCZW50b25TYW5zRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyBzdHlsZTogJ2l0YWxpYycgfSkpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBCZW50b25TYW5zU2VtaURlbWlJdGFsaWNGb250RmFjZU5hbWU6XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChuZXcgRm9udEZhY2UoQmVudG9uU2Fuc0xvd0RQSUZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgc3R5bGU6ICdpdGFsaWMnIH0pKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgJ2F0dGVtcHRlZCB0byBsb2FkIHVuc3VwcG9ydGVkIGZvbnQ6ICR7Zm9udE5hbWVBbmRJbmZvLmZvbnROYW1lfS4nYCk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBJbml0aWFsaXphdGlvbk9wdGlvbnMsIEludGVybmFsQXBpRGlzcGF0Y2hlckZhY3RvcnksIElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT04sIFZlcmJJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbi8qKlxuICogTGVnYWN5SW50ZXJuYWxBcGlEaXNwYXRjaGVySG9sZGVyIGhhcyBiZWVuIG1vdmVkIChhbmQgcmVuYW1lZCkgZnJvbSBhcGktaW50ZXJuYWwtY29udHJhY3QuXG4gKiBJdCBzdXBwb3J0cyBydW5uaW5nIGEgbmV3ZXIgZXh0ZXJuYWwgbGlicmFyeSBhZ2FpbnN0IGEgcHJlIDIwMTkuMyBkZXNrdG9wLlxuICogU3RhcnRpbmcgaW4gMjAxOS4zLCB3ZSBoYXZlIGEgbWVyZ2VkIGJvb3RzdHJhcCBzdHlsZSBmb3IgYm90aCBkZXNrdG9wIGFuZCBzZXJ2ZXIuXG4gKiBJbiBhZGRpdGlvbiwgdGhlIGFscGhhIGNoZWNraW5nIHRoYXQgaXMgaGFwcGVuaW5nIGhlcmUgaXMgbm90IG5lY2Vzc2FyeSBpbiBleHRlcm5hbC1hcGktanNcbiAqICBhZnRlciAyMDE5LjMgYmVjYXVzZSB0aGF0IGNoZWNraW5nIGhhcHBlbnMgaW4gYXBpLXBsYXRmb3JtLWpzIChBcGlEaXNwYXRjaGVyVGVzdC50cylcbiAqIFRGU0lEOiAxMDkxNTYxIHRyYWNrcyBhbiBpbXByb3ZlbWVudCB0byB0aGlzIHN5c3RlbSB0byBtYWtlIGl0IGxlc3MgY29tcGxleCBhbmQgdGllIGl0IGRpcmVjdGx5IHRvXG4gKiAgdGFibGVhdSBiZXRhIHJlbGVhc2UgdmVyc2lvbnMuXG4gKiBAZGVwcmVjYXRlZFxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5hbWVzcGFjZVxuZXhwb3J0IG5hbWVzcGFjZSBMZWdhY3lJbnRlcm5hbEFwaURpc3BhdGNoZXJIb2xkZXIge1xuICAvKipcbiAgICogQHBhcmFtIG9wdGlvbnNcbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiBnZXREZXNrdG9wRGlzcGF0Y2hlclByb21pc2Uob3B0aW9ucz86IEluaXRpYWxpemF0aW9uT3B0aW9ucyk6IFByb21pc2U8SW50ZXJuYWxBcGlEaXNwYXRjaGVyRmFjdG9yeT4gfCB1bmRlZmluZWQge1xuICAgIGlmICgoIW9wdGlvbnMgfHwgdHlwZW9mIG9wdGlvbnMuaXNBbHBoYSA9PT0gJ3VuZGVmaW5lZCcpICYmICF3aW5kb3cuX193YXJuaW5nSXNzdWVkKSB7XG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKCdUaGlzIGlzIGEgYmV0YSB2ZXJzaW9uIG9mIHRoZSBFeHRlbnNpb25zIEFQSS4gUGxlYXNlIHVwZ3JhZGUgdG8gYW4gb2ZmaWNpYWwgcmVsZWFzZS4nKTtcbiAgICAgIHdpbmRvdy5fX3dhcm5pbmdJc3N1ZWQgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAob3B0aW9ucz8uaXNBbHBoYSAmJiB3aW5kb3cuX19wbGF0Zm9ybUlzT2ZmaWNpYWxSZWxlYXNlKSB7XG4gICAgICB3aW5kb3cuX190YWJsZWF1RGVza3RvcERpc3BhdGNoZXJcbiAgICAgICAgLnRoZW4oKGRpc3BhdGNoZXJGYWN0b3J5KSA9PiB7XG4gICAgICAgICAgY29uc3QgZGlzcGF0Y2hlciA9IGRpc3BhdGNoZXJGYWN0b3J5KElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT04pO1xuICAgICAgICAgIGRpc3BhdGNoZXIuZXhlY3V0ZShWZXJiSWQuQmxvY2tFeHRlbnNpb24sIHt9KS5jYXRjaCgpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKTtcbiAgICB9XG5cbiAgICAvLyB0aGlzIHdpbGwgYmUgdW5kZWZpbmVkIGlmIHByb21pc2UgaXMgcmVqZWN0ZWQgb3IgdGhyb3dzXG4gICAgcmV0dXJuIHdpbmRvdy5fX3RhYmxlYXVEZXNrdG9wRGlzcGF0Y2hlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgKi9cbiAgZXhwb3J0IGZ1bmN0aW9uIGhhc0Rlc2t0b3BBcGlEaXNwYXRjaGVyUHJvbWlzZShvcHRpb25zPzogSW5pdGlhbGl6YXRpb25PcHRpb25zKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhZ2V0RGVza3RvcERpc3BhdGNoZXJQcm9taXNlKG9wdGlvbnMpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgX190YWJsZWF1RGVza3RvcERpc3BhdGNoZXI6IFByb21pc2U8SW50ZXJuYWxBcGlEaXNwYXRjaGVyRmFjdG9yeT47XG4gICAgX19wbGF0Zm9ybUlzT2ZmaWNpYWxSZWxlYXNlOiBib29sZWFuO1xuICAgIF9fd2FybmluZ0lzc3VlZDogYm9vbGVhbjtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEV4dGVuc2lvblNldHRpbmdzSW5mbywgTm90aWZpY2F0aW9uSWQsIFNldHRpbmdzRXZlbnQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LFxuICBFcnJvckhlbHBlcnMsXG4gIE5vdGlmaWNhdGlvblNlcnZpY2UsXG4gIFNlcnZpY2VOYW1lcyxcbiAgU2luZ2xlRXZlbnRNYW5hZ2VyLFxuICBTaW5nbGVFdmVudE1hbmFnZXJJbXBsLFxuICBUYWJsZWF1RXJyb3IsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgVGFibGVhdUV2ZW50IH0gZnJvbSAnLi4vRXZlbnRzL1RhYmxlYXVFdmVudCc7XG5pbXBvcnQgeyBFeHRlbnNpb25zU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZXMvRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcyc7XG5pbXBvcnQgeyBFeHRlbnNpb25zUmVnaXN0cnlJZCB9IGZyb20gJy4uL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeVV0aWwnO1xuaW1wb3J0IHsgU2V0dGluZ3NDb2xsZWN0aW9uLCBTZXR0aW5nc1NlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXR0aW5nc1NlcnZpY2UnO1xuXG5jbGFzcyBTZXR0aW5nc0NoYW5nZWRFdmVudCBleHRlbmRzIFRhYmxlYXVFdmVudCBpbXBsZW1lbnRzIENvbnRyYWN0LlNldHRpbmdzQ2hhbmdlZEV2ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX25ld1NldHRpbmdzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9KSB7XG4gICAgc3VwZXIoQ29udHJhY3QuVGFibGVhdUV2ZW50VHlwZS5TZXR0aW5nc0NoYW5nZWQpO1xuICB9XG5cbiAgcHVibGljIGdldCBuZXdTZXR0aW5ncygpOiBTZXR0aW5nc0NvbGxlY3Rpb24ge1xuICAgIHJldHVybiB0aGlzLl9uZXdTZXR0aW5ncztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU2V0dGluZ3NJbXBsIHtcbiAgcHJpdmF0ZSBzdGF0aWMgQVNZTkNfU0FWRV9JTl9QUk9HUkVTUyA9ICdBc3luYyBTYXZlIGlzIGluIHByb2dyZXNzLCB1cGRhdGluZyBzZXR0aW5ncyBpcyBub3QgYWxsb3dlZC4nO1xuICBwcml2YXRlIF9pc01vZGlmaWVkOiBib29sZWFuO1xuICBwcml2YXRlIF9jdXJyZW50U2V0dGluZ3M6IFNldHRpbmdzQ29sbGVjdGlvbjtcblxuICAvLyBTaW5jZSBwcm9taXNlcyBjYW4ndCBiZSBpbnRyb3NwZWN0ZWQgZm9yIHN0YXRlLCBrZWVwIGEgdmFyaWFibGUgdGhhdFxuICAvLyBpbmRpY2F0ZXMgYSBzYXZlIGlzIGluIHByb2dyZXNzLCBzbyB0aGF0IHNldC9lcmFzZSBjYW4ndCBiZSBjYWxsZWQgZHVyaW5nIGEgc2F2ZS5cbiAgcHJpdmF0ZSBfc2F2ZUluUHJvZ3Jlc3MgPSBmYWxzZTtcblxuICBwdWJsaWMgY29uc3RydWN0b3Ioc2V0dGluZ3NJbmZvOiBFeHRlbnNpb25TZXR0aW5nc0luZm8pIHtcbiAgICB0aGlzLmluaXRpYWxpemVTZXR0aW5ncyhzZXR0aW5nc0luZm8pO1xuICB9XG5cbiAgcHVibGljIGVyYXNlKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihrZXksICdrZXknKTtcblxuICAgIC8vIE9ubHkgbWFrZSBhIG1vZGlmaWNhdGlvbiBpZiB3ZSBoYXZlIHRoZSBrZXkgYWxyZWFkeVxuICAgIGlmICh0aGlzLl9jdXJyZW50U2V0dGluZ3Nba2V5XSkge1xuICAgICAgdGhpcy52ZXJpZnlTZXR0aW5nc0FyZVVubG9ja2VkKCk7XG5cbiAgICAgIGRlbGV0ZSB0aGlzLl9jdXJyZW50U2V0dGluZ3Nba2V5XTtcbiAgICAgIHRoaXMuX2lzTW9kaWZpZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQoa2V5OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIoa2V5LCAna2V5Jyk7XG5cbiAgICByZXR1cm4gdGhpcy5fY3VycmVudFNldHRpbmdzW2tleV07XG4gIH1cblxuICBwdWJsaWMgZ2V0QWxsKCk6IFNldHRpbmdzQ29sbGVjdGlvbiB7XG4gICAgLy8gUmV0dXJucyBhIG11dGFibGUgY29weSBvZiB0aGUgc2V0dGluZ3NcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fY3VycmVudFNldHRpbmdzKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNNb2RpZmllZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNNb2RpZmllZDtcbiAgfVxuXG4gIHB1YmxpYyBzYXZlQXN5bmMoKTogUHJvbWlzZTxTZXR0aW5nc0NvbGxlY3Rpb24+IHtcbiAgICB0aGlzLnZlcmlmeVNldHRpbmdzQXJlVW5sb2NrZWQoKTtcblxuICAgIC8vIEp1c3QgcmVzb2x2ZSBpbW1lZGlhdGVseSBpZiBzZXR0aW5ncyBhcmUgdW5jaGFuZ2VkXG4gICAgaWYgKCF0aGlzLl9pc01vZGlmaWVkKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlPFNldHRpbmdzQ29sbGVjdGlvbj4odGhpcy5fY3VycmVudFNldHRpbmdzKTtcbiAgICB9XG5cbiAgICB0aGlzLl9zYXZlSW5Qcm9ncmVzcyA9IHRydWU7XG5cbiAgICAvLyBVc2UgdGhlIHNldHRpbmdzIHNlcnZpY2UgdG8gc2F2ZSBzZXR0aW5ncyB0byB0d2JcbiAgICBjb25zdCBzZXR0aW5nc1NlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFNldHRpbmdzU2VydmljZT4oXG4gICAgICBFeHRlbnNpb25zU2VydmljZU5hbWVzLlNldHRpbmdzU2VydmljZSxcbiAgICApO1xuXG4gICAgcmV0dXJuIHNldHRpbmdzU2VydmljZS5zYXZlU2V0dGluZ3NBc3luYyh0aGlzLl9jdXJyZW50U2V0dGluZ3MpLnRoZW48U2V0dGluZ3NDb2xsZWN0aW9uPihcbiAgICAgIChuZXdTZXR0aW5ncykgPT4ge1xuICAgICAgICB0aGlzLl9zYXZlSW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9pc01vZGlmaWVkID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLl9jdXJyZW50U2V0dGluZ3MgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMuX2N1cnJlbnRTZXR0aW5ncyA9IG5ld1NldHRpbmdzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5fY3VycmVudFNldHRpbmdzLCBuZXdTZXR0aW5ncyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ld1NldHRpbmdzO1xuICAgICAgfSxcbiAgICAgIChyZWFzb24pID0+IHtcbiAgICAgICAgdGhpcy5fc2F2ZUluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHJlYXNvbik7XG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVN0cmluZ1BhcmFtZXRlcihrZXksICdrZXknKTsgLy8gS2V5IHNob3VsZG4ndCBiZSBhbiBlbXB0eSBzdHJpbmcuXG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcih2YWx1ZSwgJ3ZhbHVlJyk7IC8vIEVtcHR5IHN0cmluZyB2YWx1ZSBpcyBhbGxvd2VkLlxuICAgIHRoaXMudmVyaWZ5U2V0dGluZ3NBcmVVbmxvY2tlZCgpO1xuXG4gICAgdGhpcy5fY3VycmVudFNldHRpbmdzW2tleV0gPSB2YWx1ZTtcbiAgICB0aGlzLl9pc01vZGlmaWVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyBhbGwgZXZlbnRzIHJlbGV2YW50IHRvIHNldHRpbmdzIG9iamVjdC4gIFRoaXMgaXMgb25seSBhIHNldHRpbmdzVXBkYXRlIGV2ZW50IGN1cnJlbnRseS5cbiAgICpcbiAgICogQHJldHVybnMge0FycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj59IENvbGxlY3Rpb24gb2YgZXZlbnQgbWFuYWdlcnMgdG8gcGFzcyB0byBhbiBFdmVudExpc3RlbmVyTWFuYWdlci5cbiAgICovXG4gIHB1YmxpYyBpbml0aWFsaXplRXZlbnRzKCk6IEFycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj4ge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBuZXcgQXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPigpO1xuICAgIGxldCBub3RpZmljYXRpb25TZXJ2aWNlOiBOb3RpZmljYXRpb25TZXJ2aWNlO1xuXG4gICAgdHJ5IHtcbiAgICAgIG5vdGlmaWNhdGlvblNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPE5vdGlmaWNhdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5Ob3RpZmljYXRpb24pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgdGhpcyBzZXJ2aWNlIHJlZ2lzdGVyZWQsIGp1c3QgcmV0dXJuXG4gICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9XG5cbiAgICBjb25zdCBzZXR0aW5nc0NoYW5nZWRFdmVudCA9IG5ldyBTaW5nbGVFdmVudE1hbmFnZXJJbXBsPFNldHRpbmdzQ2hhbmdlZEV2ZW50PihDb250cmFjdC5UYWJsZWF1RXZlbnRUeXBlLlNldHRpbmdzQ2hhbmdlZCk7XG4gICAgbm90aWZpY2F0aW9uU2VydmljZS5yZWdpc3RlckhhbmRsZXIoXG4gICAgICBOb3RpZmljYXRpb25JZC5TZXR0aW5nc0NoYW5nZWQsXG4gICAgICAoKSA9PiB0cnVlLFxuICAgICAgKGV2ZW50OiBTZXR0aW5nc0V2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRTZXR0aW5ncyA9IGV2ZW50Lm5ld1NldHRpbmdzO1xuICAgICAgICBzZXR0aW5nc0NoYW5nZWRFdmVudC50cmlnZ2VyRXZlbnQoKCkgPT4gbmV3IFNldHRpbmdzQ2hhbmdlZEV2ZW50KGV2ZW50Lm5ld1NldHRpbmdzKSk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICByZXN1bHRzLnB1c2goc2V0dGluZ3NDaGFuZ2VkRXZlbnQpO1xuXG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVTZXR0aW5ncyhzZXR0aW5nc0luZm86IEV4dGVuc2lvblNldHRpbmdzSW5mbyk6IHZvaWQge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIoc2V0dGluZ3NJbmZvLCAnc2V0dGluZ3NJbmZvJyk7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihzZXR0aW5nc0luZm8uc2V0dGluZ3NWYWx1ZXMsICdzZXR0aW5nc0luZm8uU2V0dGluZ3NWYWx1ZXMnKTtcblxuICAgIHRoaXMuX2N1cnJlbnRTZXR0aW5ncyA9IHNldHRpbmdzSW5mby5zZXR0aW5nc1ZhbHVlcztcblxuICAgIC8vIFJlc2V0IHRoZSBpc01vZGlmaWVkIGZsYWdcbiAgICB0aGlzLl9pc01vZGlmaWVkID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBoZWxwZXIgc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgYW55IGxvY2FsIHVwZGF0ZSB0byB0aGlzLmN1cnJlbnRTZXR0aW5ncy5cbiAgICogQ2hlY2tzIGlmIGEgY3VycmVudCBzYXZlIGNhbGwgaXMgc3RpbGwgaW4gcHJvZ3Jlc3MgYW5kIHRocm93cyBhbiBlcnJvciBpZiBzby5cbiAgICovXG4gIHByaXZhdGUgdmVyaWZ5U2V0dGluZ3NBcmVVbmxvY2tlZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fc2F2ZUluUHJvZ3Jlc3MpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRXJyb3JDb2Rlcy5TZXR0aW5nU2F2ZUluUHJvZ3Jlc3MsIFNldHRpbmdzSW1wbC5BU1lOQ19TQVZFX0lOX1BST0dSRVNTKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IE1vZGVsIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuZXhwb3J0IGNvbnN0IFRhYmxlYXVCb29rRm9udEZhbWlseU5hbWUgPSAnVGFibGVhdSBCb29rJztcbmV4cG9ydCBjb25zdCBUYWJsZWF1TGlnaHRGb250RmFtaWx5TmFtZSA9ICdUYWJsZWF1IExpZ2h0JztcbmV4cG9ydCBjb25zdCBUYWJsZWF1UmVndWxhckZvbnRGYW1pbHlOYW1lID0gJ1RhYmxlYXUgUmVndWxhcic7XG5leHBvcnQgY29uc3QgVGFibGVhdU1lZGl1bUZvbnRGYW1pbHlOYW1lID0gJ1RhYmxlYXUgTWVkaXVtJztcbmV4cG9ydCBjb25zdCBUYWJsZWF1U2VtaWJvbGRGb250RmFtaWx5TmFtZSA9ICdUYWJsZWF1IFNlbWlib2xkJztcbmV4cG9ydCBjb25zdCBUYWJsZWF1Qm9sZEZvbnRGYW1pbHlOYW1lID0gJ1RhYmxlYXUgQm9sZCc7XG5cbmV4cG9ydCBjb25zdCBUYWJsZWF1Qm9va0ZvbnRGYWNlTmFtZSA9ICdUYWJsZWF1IEJvb2snO1xuZXhwb3J0IGNvbnN0IFRhYmxlYXVCb2xkRm9udEZhY2VOYW1lID0gJ1RhYmxlYXUgQm9sZCc7XG5leHBvcnQgY29uc3QgVGFibGVhdUxpZ2h0Rm9udEZhY2VOYW1lID0gJ1RhYmxlYXUgTGlnaHQnO1xuZXhwb3J0IGNvbnN0IFRhYmxlYXVNZWRpdW1Gb250RmFjZU5hbWUgPSAnVGFibGVhdSBNZWRpdW0nO1xuZXhwb3J0IGNvbnN0IFRhYmxlYXVSZWd1bGFyRm9udEZhY2VOYW1lID0gJ1RhYmxlYXUgUmVndWxhcic7XG5leHBvcnQgY29uc3QgVGFibGVhdVNlbWlCb2xkRm9udEZhY2VOYW1lID0gJ1RhYmxlYXUgU2VtaSBCb2xkJztcblxuZXhwb3J0IGNvbnN0IFN1cHBvcnRlZFRhYmxlYXVGb250RmFjZXM6IE1vZGVsW10gPSBbXG4gIFRhYmxlYXVCb29rRm9udEZhY2VOYW1lLFxuICBUYWJsZWF1Qm9sZEZvbnRGYWNlTmFtZSxcbiAgVGFibGVhdUxpZ2h0Rm9udEZhY2VOYW1lLFxuICBUYWJsZWF1TWVkaXVtRm9udEZhY2VOYW1lLFxuICBUYWJsZWF1UmVndWxhckZvbnRGYWNlTmFtZSxcbiAgVGFibGVhdVNlbWlCb2xkRm9udEZhY2VOYW1lLFxuXTtcbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFcnJvckNvZGVzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IERpYWxvZ01lc3NhZ2VFdmVudCBhcyBEaWFsb2dNZXNzYWdlRXZlbnRDb250cmFjdCwgRGlhbG9nVXBkYXRlRXZlbnQsIE5vdGlmaWNhdGlvbklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeSxcbiAgTm90aWZpY2F0aW9uU2VydmljZSxcbiAgU2VydmljZU5hbWVzLFxuICBTaW5nbGVFdmVudE1hbmFnZXIsXG4gIFNpbmdsZUV2ZW50TWFuYWdlckltcGwsXG4gIFRhYmxlYXVFcnJvcixcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXZlbnQgfSBmcm9tICcuLi9FdmVudHMvVGFibGVhdUV2ZW50JztcbmltcG9ydCB7IEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9FeHRlbnNpb25zU2VydmljZU5hbWVzJztcbmltcG9ydCB7IEV4dGVuc2lvbnNSZWdpc3RyeUlkIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5VXRpbCc7XG5pbXBvcnQgeyBVSVNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9VSVNlcnZpY2UnO1xuXG5leHBvcnQgY2xhc3MgRGlhbG9nTWVzc2FnZUV2ZW50IGV4dGVuZHMgVGFibGVhdUV2ZW50IGltcGxlbWVudHMgQ29udHJhY3QuRGlhbG9nTWVzc2FnZUV2ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihDb250cmFjdC5UYWJsZWF1RXZlbnRUeXBlLkRpYWxvZ01lc3NhZ2VSZWNlaXZlZCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFVJSW1wbCB7XG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBwdWJsaWMgZGlzcGxheURpYWxvZ0FzeW5jKHVybDogc3RyaW5nLCBwYXlsb2FkPzogc3RyaW5nLCBvcHRpb25zPzogQ29udHJhY3QuRGlhbG9nT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgdWlTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxVSVNlcnZpY2U+KEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMuVUlTZXJ2aWNlKTtcbiAgICBjb25zdCBub3RpZmljYXRpb25TZXJ2aWNlOiBOb3RpZmljYXRpb25TZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxOb3RpZmljYXRpb25TZXJ2aWNlPihcbiAgICAgIFNlcnZpY2VOYW1lcy5Ob3RpZmljYXRpb24sXG4gICAgKTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB1aVNlcnZpY2VcbiAgICAgICAgLmRpc3BsYXlEaWFsb2dBc3luYyh1cmwsIHBheWxvYWQgfHwgJycsIG9wdGlvbnMpXG4gICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICBjb25zdCB1bnJlZ2lzdGVyRm4gPSBub3RpZmljYXRpb25TZXJ2aWNlLnJlZ2lzdGVySGFuZGxlcihcbiAgICAgICAgICAgIE5vdGlmaWNhdGlvbklkLkV4dGVuc2lvbkRpYWxvZ1VwZGF0ZSxcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgLy8gTGV0IHRocm91Z2ggYW55IGRpYWxvZyB1cGRhdGUgZXZlbnRcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKGV2ZW50OiBEaWFsb2dVcGRhdGVFdmVudCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoZXZlbnQuaXNDbG9zZUV2ZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmNsb3NlUGF5bG9hZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ2Nsb3NlUGF5bG9hZCBpcyB1bmRlZmluZWQnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShldmVudC5jbG9zZVBheWxvYWQpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuRGlhbG9nQ2xvc2VkQnlVc2VyLCAnRXh0ZW5zaW9uIGRpYWxvZyBjbG9zZWQgYnkgdXNlci4nKSk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB1bnJlZ2lzdGVyRm4oKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNlbmREaWFsb2dNZXNzYWdlQXN5bmMobWVzc2FnZTogc3RyaW5nLCB0YXJnZXREaWFsb2dVcmw/OiBzdHJpbmcpIHtcbiAgICBjb25zdCB1aVNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFVJU2VydmljZT4oRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcy5VSVNlcnZpY2UpO1xuXG4gICAgdWlTZXJ2aWNlLnNlbmREaWFsb2dNZXNzYWdlQXN5bmMobWVzc2FnZSwgdGFyZ2V0RGlhbG9nVXJsKTtcbiAgfVxuXG4gIHB1YmxpYyBjbG9zZURpYWxvZyhwYXlsb2FkPzogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgdWlTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxVSVNlcnZpY2U+KEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMuVUlTZXJ2aWNlKTtcblxuICAgIHVpU2VydmljZS5jbG9zZURpYWxvZyhwYXlsb2FkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyBhbGwgZXZlbnRzIHJlbGV2YW50IHRvIFVJIG9iamVjdC5cbiAgICpcbiAgICogQHJldHVybnMge0FycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj59IENvbGxlY3Rpb24gb2YgZXZlbnQgbWFuYWdlcnMgdG8gcGFzcyB0byBhbiBFdmVudExpc3RlbmVyTWFuYWdlci5cbiAgICovXG4gIHB1YmxpYyBpbml0aWFsaXplRXZlbnRzKCk6IEFycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj4ge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBuZXcgQXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPigpO1xuICAgIGxldCBub3RpZmljYXRpb25TZXJ2aWNlOiBOb3RpZmljYXRpb25TZXJ2aWNlO1xuXG4gICAgdHJ5IHtcbiAgICAgIG5vdGlmaWNhdGlvblNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPE5vdGlmaWNhdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5Ob3RpZmljYXRpb24pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgdGhpcyBzZXJ2aWNlIHJlZ2lzdGVyZWQsIGp1c3QgcmV0dXJuXG4gICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9XG5cbiAgICBjb25zdCBkaWFsb2dNZXNzYWdlRXZlbnQgPSBuZXcgU2luZ2xlRXZlbnRNYW5hZ2VySW1wbDxDb250cmFjdC5EaWFsb2dNZXNzYWdlRXZlbnQ+KENvbnRyYWN0LlRhYmxlYXVFdmVudFR5cGUuRGlhbG9nTWVzc2FnZVJlY2VpdmVkKTtcbiAgICBub3RpZmljYXRpb25TZXJ2aWNlLnJlZ2lzdGVySGFuZGxlcihcbiAgICAgIE5vdGlmaWNhdGlvbklkLkV4dGVuc2lvbkRpYWxvZ01lc3NhZ2UsXG4gICAgICAoKSA9PiB0cnVlLFxuICAgICAgKGV2ZW50OiBEaWFsb2dNZXNzYWdlRXZlbnRDb250cmFjdCkgPT4ge1xuICAgICAgICBkaWFsb2dNZXNzYWdlRXZlbnQudHJpZ2dlckV2ZW50KCgpID0+IG5ldyBEaWFsb2dNZXNzYWdlRXZlbnQoZXZlbnQubWVzc2FnZSkpO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgcmVzdWx0cy5wdXNoKGRpYWxvZ01lc3NhZ2VFdmVudCk7XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IERhc2hib2FyZExheW91dENoYW5nZURldGFpbHMsIFRhYmxlYXVFdmVudFR5cGUsIFdvcmtib29rRm9ybWF0dGluZyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRMYXlvdXRFdmVudCwgTm90aWZpY2F0aW9uSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LFxuICBEYXNoYm9hcmRJbXBsLFxuICBEYXNoYm9hcmRPYmplY3RJbXBsLFxuICBOb3RpZmljYXRpb25TZXJ2aWNlLFxuICBTZXJ2aWNlTmFtZXMsXG4gIFNpbmdsZUV2ZW50TWFuYWdlcixcbiAgU2luZ2xlRXZlbnRNYW5hZ2VySW1wbCxcbiAgV29ya3NoZWV0SW1wbCxcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRMYXlvdXRDaGFuZ2VkRXZlbnQgfSBmcm9tICcuLi9FdmVudHMvRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZEV2ZW50JztcbmltcG9ydCB7IFdvcmtib29rRm9ybWF0dGluZ0NoYW5nZWRFdmVudCB9IGZyb20gJy4uL0V2ZW50cy9Xb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkRXZlbnQnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnlVdGlsJztcbmltcG9ydCB7IERhc2hib2FyZE9iamVjdCB9IGZyb20gJy4vRGFzaGJvYXJkT2JqZWN0JztcbmltcG9ydCB7IFNoZWV0IH0gZnJvbSAnLi9TaGVldCc7XG5pbXBvcnQgeyBXb3Jrc2hlZXQgfSBmcm9tICcuL1dvcmtzaGVldCc7XG5cbmV4cG9ydCBjbGFzcyBEYXNoYm9hcmQgZXh0ZW5kcyBTaGVldCBpbXBsZW1lbnRzIENvbnRyYWN0LkV4dGVuc2lvbkRhc2hib2FyZCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9kYXNoYm9hcmRJbXBsOiBEYXNoYm9hcmRJbXBsKSB7XG4gICAgc3VwZXIoX2Rhc2hib2FyZEltcGwpO1xuICAgIF9kYXNoYm9hcmRJbXBsLmluaXRpYWxpemVXaXRoUHVibGljSW50ZXJmYWNlcygpO1xuICAgIHRoaXMuaW5pdGlhbGl6ZUV2ZW50cygpLmZvckVhY2goKGUpID0+IHRoaXMuYWRkTmV3RXZlbnRUeXBlKGUpKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgd29ya3NoZWV0cygpOiBBcnJheTxDb250cmFjdC5FeHRlbnNpb25Xb3Jrc2hlZXQ+IHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkSW1wbC53b3Jrc2hlZXRzSW1wbC5tYXAoKHdvcmtzaGVldEltcGw6IFdvcmtzaGVldEltcGwpID0+IHtcbiAgICAgIHJldHVybiBuZXcgV29ya3NoZWV0KHdvcmtzaGVldEltcGwpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldCBvYmplY3RzKCk6IEFycmF5PENvbnRyYWN0LkV4dGVuc2lvbkRhc2hib2FyZE9iamVjdD4ge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRJbXBsLm9iamVjdHMubWFwKChkYXNoYm9hcmRPYmplY3RJbXBsOiBEYXNoYm9hcmRPYmplY3RJbXBsKSA9PiB7XG4gICAgICByZXR1cm4gbmV3IERhc2hib2FyZE9iamVjdChkYXNoYm9hcmRPYmplY3RJbXBsKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWN0aXZlRGFzaGJvYXJkT2JqZWN0SWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkSW1wbC5hY3RpdmVEYXNoYm9hcmRPYmplY3RJZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWN0aXZlRGFzaGJvYXJkTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRJbXBsLmFjdGl2ZURhc2hib2FyZE5hbWU7XG4gIH1cblxuICBwdWJsaWMgc2V0Wm9uZVZpc2liaWxpdHlBc3luYyh6b25lVmlzaWJpbGl0eU1hcDogQ29udHJhY3QuWm9uZVZpc2liaWxpdHlNYXApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkSW1wbC5zZXREYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5QXN5bmMoem9uZVZpc2liaWxpdHlNYXApO1xuICB9XG5cbiAgcHVibGljIHNldERhc2hib2FyZE9iamVjdFZpc2liaWxpdHlBc3luYyhkYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5TWFwOiBDb250cmFjdC5EYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5TWFwKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZEltcGwuc2V0RGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eUFzeW5jKGRhc2hib2FyZE9iamVjdFZpc2liaWxpdHlNYXApO1xuICB9XG5cbiAgcHVibGljIGdldERhc2hib2FyZE9iamVjdEJ5SWQoZGFzaGJvYXJkT2JqZWN0SWQ6IG51bWJlcik6IERhc2hib2FyZE9iamVjdCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgem9uZSA9IHRoaXMuX2Rhc2hib2FyZEltcGwuZ2V0RGFzaGJvYXJkT2JqZWN0QnlJZChkYXNoYm9hcmRPYmplY3RJZCk7XG4gICAgcmV0dXJuIHpvbmUgJiYgbmV3IERhc2hib2FyZE9iamVjdCh6b25lKTtcbiAgfVxuXG4gIHB1YmxpYyBpbml0aWFsaXplRXZlbnRzKCk6IEFycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj4ge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBuZXcgQXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPigpO1xuXG4gICAgLy8gSW5pdGlhbGl6aW5nIGV2ZW50cyBhbmQgcmVnaXN0ZXJpbmcgbm90aWZpY2F0aW9uIHNlcnZpY2VcbiAgICBsZXQgbm90aWZpY2F0aW9uU2VydmljZTogTm90aWZpY2F0aW9uU2VydmljZTtcblxuICAgIHRyeSB7XG4gICAgICBub3RpZmljYXRpb25TZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxOb3RpZmljYXRpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuTm90aWZpY2F0aW9uKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIHRoaXMgc2VydmljZSByZWdpc3RlcmVkLCBqdXN0IHJldHVybiAoYWxsb3dzIHVuaXQgdGVzdGluZyB3aXRob3V0IE5vdGlmaWNhdGlvblNlcnZpY2UgbW9jaylcbiAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH1cblxuICAgIGNvbnN0IGRhc2hib2FyZExheW91dENoYW5nZWRFdmVudCA9IG5ldyBTaW5nbGVFdmVudE1hbmFnZXJJbXBsPERhc2hib2FyZExheW91dENoYW5nZWRFdmVudD4oVGFibGVhdUV2ZW50VHlwZS5EYXNoYm9hcmRMYXlvdXRDaGFuZ2VkKTtcbiAgICBub3RpZmljYXRpb25TZXJ2aWNlLnJlZ2lzdGVySGFuZGxlcihcbiAgICAgIE5vdGlmaWNhdGlvbklkLkRhc2hib2FyZExheW91dENoYW5nZWQsXG4gICAgICAoKSA9PiB0cnVlLFxuICAgICAgKGV2ZW50OiBEYXNoYm9hcmRMYXlvdXRFdmVudCkgPT4ge1xuICAgICAgICBjb25zdCBkYXNoYm9hcmRPYmplY3RDaGFuZ2VzOiBEYXNoYm9hcmRMYXlvdXRDaGFuZ2VEZXRhaWxzID0gdGhpcy5fZGFzaGJvYXJkSW1wbC51cGRhdGVab25lcyhcbiAgICAgICAgICBldmVudC56b25lcyxcbiAgICAgICAgICBldmVudC5hY3RpdmVab25lSWQsXG4gICAgICAgICAgZXZlbnQuYWN0aXZlRGFzaGJvYXJkTmFtZSxcbiAgICAgICAgKTtcbiAgICAgICAgZGFzaGJvYXJkTGF5b3V0Q2hhbmdlZEV2ZW50LnRyaWdnZXJFdmVudCgoKSA9PiBuZXcgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZEV2ZW50KGRhc2hib2FyZE9iamVjdENoYW5nZXMpKTtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIHJlc3VsdHMucHVzaChkYXNoYm9hcmRMYXlvdXRDaGFuZ2VkRXZlbnQpO1xuXG4gICAgY29uc3Qgd29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50ID0gbmV3IFNpbmdsZUV2ZW50TWFuYWdlckltcGw8V29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50PihcbiAgICAgIFRhYmxlYXVFdmVudFR5cGUuV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZCxcbiAgICApO1xuXG4gICAgbm90aWZpY2F0aW9uU2VydmljZS5yZWdpc3RlckhhbmRsZXIoXG4gICAgICBOb3RpZmljYXRpb25JZC5Xb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkLFxuICAgICAgKCkgPT4gdHJ1ZSxcbiAgICAgIChldmVudEZvcm1hdHRpbmc6IFdvcmtib29rRm9ybWF0dGluZykgPT4ge1xuICAgICAgICB3b3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkRXZlbnQudHJpZ2dlckV2ZW50KCgpID0+IG5ldyBXb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkRXZlbnQoZXZlbnRGb3JtYXR0aW5nKSk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICByZXN1bHRzLnB1c2god29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50KTtcblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG5cbiAgcHVibGljIG1vdmVBbmRSZXNpemVEYXNoYm9hcmRPYmplY3RzQXN5bmMoXG4gICAgZGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlQXJyYXk6IENvbnRyYWN0LkRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUFycmF5LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkSW1wbC5tb3ZlQW5kUmVzaXplRGFzaGJvYXJkT2JqZWN0c0FzeW5jKGRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUFycmF5KTtcbiAgfVxuXG4gIHB1YmxpYyByZXBsYXlBbmltYXRpb25Bc3luYyhyZXBsYXlTcGVlZDogQ29udHJhY3QuUmVwbGF5U3BlZWRUeXBlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZEltcGwucmVwbGF5QW5pbWF0aW9uQXN5bmMocmVwbGF5U3BlZWQpO1xuICB9XG5cbiAgcHVibGljIGdldEZpbHRlcnNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkZpbHRlcj4+IHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkSW1wbC5nZXRGaWx0ZXJzQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseUZpbHRlckFzeW5jKFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHZhbHVlczogQXJyYXk8c3RyaW5nPixcbiAgICB1cGRhdGVUeXBlOiBDb250cmFjdC5GaWx0ZXJVcGRhdGVUeXBlLFxuICAgIG9wdGlvbnM6IENvbnRyYWN0LkZpbHRlck9wdGlvbnMsXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZEltcGwuYXBwbHlGaWx0ZXJBc3luYyhmaWVsZE5hbWUsIHZhbHVlcywgdXBkYXRlVHlwZSwgb3B0aW9ucyk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRPYmplY3RJbXBsIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmQgfSBmcm9tICcuL0Rhc2hib2FyZCc7XG5pbXBvcnQgeyBXb3Jrc2hlZXQgfSBmcm9tICcuL1dvcmtzaGVldCc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGRhc2hib2FyZCBvYmplY3RzIC0gdGhlIHpvbmVzIGluIGEgZGFzaGJvYXJkLlxuICovXG5leHBvcnQgY2xhc3MgRGFzaGJvYXJkT2JqZWN0IGltcGxlbWVudHMgQ29udHJhY3QuRXh0ZW5zaW9uRGFzaGJvYXJkT2JqZWN0IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2Rhc2hib2FyZE9iamVjdEltcGw6IERhc2hib2FyZE9iamVjdEltcGwpIHt9XG5cbiAgcHVibGljIGdldCBkYXNoYm9hcmQoKTogQ29udHJhY3QuRXh0ZW5zaW9uRGFzaGJvYXJkIHtcbiAgICByZXR1cm4gbmV3IERhc2hib2FyZCh0aGlzLl9kYXNoYm9hcmRPYmplY3RJbXBsLmRhc2hib2FyZEltcGwpO1xuICB9XG5cbiAgcHVibGljIGdldCB0eXBlKCk6IENvbnRyYWN0LkRhc2hib2FyZE9iamVjdFR5cGUge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRPYmplY3RJbXBsLnR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBvc2l0aW9uKCk6IENvbnRyYWN0LlBvaW50IHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkT2JqZWN0SW1wbC5wb3NpdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2l6ZSgpOiBDb250cmFjdC5TaXplIHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkT2JqZWN0SW1wbC5zaXplO1xuICB9XG5cbiAgcHVibGljIGdldCB3b3Jrc2hlZXQoKTogQ29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5fZGFzaGJvYXJkT2JqZWN0SW1wbC53b3Jrc2hlZXRJbXBsKSB7XG4gICAgICByZXR1cm4gbmV3IFdvcmtzaGVldCh0aGlzLl9kYXNoYm9hcmRPYmplY3RJbXBsLndvcmtzaGVldEltcGwpO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZE9iamVjdEltcGwubmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNGbG9hdGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkT2JqZWN0SW1wbC5pc0Zsb2F0aW5nO1xuICB9XG5cbiAgcHVibGljIGdldCBpc1Zpc2libGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZE9iamVjdEltcGwuaXNWaXNpYmxlO1xuICB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRPYmplY3RJbXBsLmlkO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWVsZElkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZE9iamVjdEltcGwuZmllbGRJZDtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IE5vdGlmaWNhdGlvbklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeSxcbiAgRXJyb3JIZWxwZXJzLFxuICBFdmVudExpc3RlbmVyTWFuYWdlcixcbiAgTm90aWZpY2F0aW9uU2VydmljZSxcbiAgUGFyYW1ldGVySW1wbCxcbiAgU2VydmljZU5hbWVzLFxuICBTaW5nbGVFdmVudE1hbmFnZXIsXG4gIFNpbmdsZUV2ZW50TWFuYWdlckltcGwsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgUGFyYW1ldGVyQ2hhbmdlZEV2ZW50IH0gZnJvbSAnLi4vRXZlbnRzL1BhcmFtZXRlckNoYW5nZWRFdmVudCc7XG5pbXBvcnQgeyBFeHRlbnNpb25zUmVnaXN0cnlJZCB9IGZyb20gJy4uL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeVV0aWwnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBQYXJhbWV0ZXIgY29udHJhY3QuIENhbGxzIGRvd24gdG8gdGhlIGltcGxcbiAqIGNsYXNzIGZvciBhbG1vc3QgYWxsIG9mIHRoZSB3b3JrIGl0IGRvZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBQYXJhbWV0ZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyTWFuYWdlciBpbXBsZW1lbnRzIENvbnRyYWN0LlBhcmFtZXRlciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHBhcmFtZXRlckltcGw6IFBhcmFtZXRlckltcGwsIHNoZWV0OiBDb250cmFjdC5FeHRlbnNpb25TaGVldCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICAvLyBJbml0aWFsaXplIG91ciBldmVudCBoYW5kbGluZyBmb3IgdGhpcyBjbGFzc1xuICAgIHRoaXMuaW5pdGlhbGl6ZUV2ZW50cyhzaGVldCkuZm9yRWFjaCgoZSkgPT4gdGhpcy5hZGROZXdFdmVudFR5cGUoZSkpO1xuICB9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1ldGVySW1wbC5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBjdXJyZW50VmFsdWUoKTogQ29udHJhY3QuRGF0YVZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5wYXJhbWV0ZXJJbXBsLmN1cnJlbnRWYWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGF0YVR5cGUoKTogQ29udHJhY3QuRGF0YVR5cGUge1xuICAgIHJldHVybiB0aGlzLnBhcmFtZXRlckltcGwuZGF0YVR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFsbG93YWJsZVZhbHVlcygpOiBDb250cmFjdC5QYXJhbWV0ZXJEb21haW5SZXN0cmljdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1ldGVySW1wbC5hbGxvd2FibGVWYWx1ZXM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1ldGVySW1wbC5pZDtcbiAgfVxuXG4gIHB1YmxpYyBjaGFuZ2VWYWx1ZUFzeW5jKG5ld1ZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgRGF0ZSk6IFByb21pc2U8Q29udHJhY3QuRGF0YVZhbHVlPiB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1ldGVySW1wbC5jaGFuZ2VWYWx1ZUFzeW5jKG5ld1ZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgbWV0aG9kIHdoaWNoIGdvZXMgdGhyb3VnaCBhbmQgcmVnaXN0ZXJzIGVhY2ggZXZlbnQgdHlwZSB0aGlzIGltcGwga25vd3MgYWJvdXRcbiAgICogd2l0aCB0aGUgTm90aWZpY2F0aW9uU2VydmljZS4gSXQgcmV0dXJucyBhbiBhcnJheSBvZiBTaW5nbGVFdmVudE1hbmFnZXIgb2JqZWN0cyB3aGljaFxuICAgKiBjYW4gdGhlbiBiZSBwYXNzZWQgdG8gYW4gRXZlbnRMaXN0ZW5lck1hbmFnZXIgdG8gaGFuZGxlIHVzZXIgcmVnaXN0cmF0aW9uIC8gdW5yZWdpc3RyYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBzaGVldCBUaGUgc2hlZXQgb2JqZWN0IHdoaWNoIHdpbGwgYmUgaW5jbHVkZWQgd2l0aCB0aGUgZXZlbnQgbm90aWZpY2F0aW9uc1xuICAgKiBAcmV0dXJucyB7QXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPn0gQ29sbGVjdGlvbiBvZiBldmVudCBtYW5hZ2VycyB0byBwYXNzIHRvIGFuIEV2ZW50TGlzdGVuZXJNYW5hZ2VyXG4gICAqL1xuICBwdWJsaWMgaW5pdGlhbGl6ZUV2ZW50cyhzaGVldDogQ29udHJhY3QuRXh0ZW5zaW9uU2hlZXQpOiBBcnJheTxTaW5nbGVFdmVudE1hbmFnZXI+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5SW50ZXJuYWxWYWx1ZShzaGVldCwgJ3NoZWV0Jyk7XG5cbiAgICBjb25zdCByZXN1bHRzID0gbmV3IEFycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj4oKTtcbiAgICBsZXQgbm90aWZpY2F0aW9uU2VydmljZTogTm90aWZpY2F0aW9uU2VydmljZTtcblxuICAgIHRyeSB7XG4gICAgICBub3RpZmljYXRpb25TZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxOb3RpZmljYXRpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuTm90aWZpY2F0aW9uKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIHRoaXMgc2VydmljZSByZWdpc3RlcmVkLCBqdXN0IHJldHVyblxuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBhbGwgb2YgdGhlIGV2ZW50IG1hbmFnZXJzIHdlJ2xsIG5lZWQgKG9uZSBmb3IgZWFjaCBldmVudCB0eXBlKVxuICAgIGNvbnN0IHBhcmFtZXRlckV2ZW50ID0gbmV3IFNpbmdsZUV2ZW50TWFuYWdlckltcGw8UGFyYW1ldGVyQ2hhbmdlZEV2ZW50PihDb250cmFjdC5UYWJsZWF1RXZlbnRUeXBlLlBhcmFtZXRlckNoYW5nZWQpO1xuICAgIG5vdGlmaWNhdGlvblNlcnZpY2UucmVnaXN0ZXJIYW5kbGVyKFxuICAgICAgTm90aWZpY2F0aW9uSWQuUGFyYW1ldGVyQ2hhbmdlZCxcbiAgICAgIChtb2RlbCkgPT4ge1xuICAgICAgICBjb25zdCBmaWVsZE5hbWUgPSBtb2RlbCBhcyBzdHJpbmc7XG4gICAgICAgIHJldHVybiBmaWVsZE5hbWUgPT09IHRoaXMucGFyYW1ldGVySW1wbC5pZDtcbiAgICAgIH0sXG4gICAgICAoZmllbGROYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgcGFyYW1ldGVyRXZlbnQudHJpZ2dlckV2ZW50KCgpID0+IG5ldyBQYXJhbWV0ZXJDaGFuZ2VkRXZlbnQoZmllbGROYW1lLCBzaGVldCkpO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgcmVzdWx0cy5wdXNoKHBhcmFtZXRlckV2ZW50KTtcblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXZlbnRMaXN0ZW5lck1hbmFnZXIsIFNoZWV0SW1wbCwgVGFibGVhdUVycm9yIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBQYXJhbWV0ZXIgfSBmcm9tICcuL1BhcmFtZXRlcic7XG5cbmV4cG9ydCBjbGFzcyBTaGVldCBleHRlbmRzIEV2ZW50TGlzdGVuZXJNYW5hZ2VyIGltcGxlbWVudHMgQ29udHJhY3QuRXh0ZW5zaW9uU2hlZXQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfc2hlZXRJbXBsOiBTaGVldEltcGwpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWV0SW1wbC5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBzaGVldFR5cGUoKTogQ29udHJhY3QuU2hlZXRUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fc2hlZXRJbXBsLnNoZWV0VHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2l6ZSgpOiBDb250cmFjdC5TaXplIHtcbiAgICBpZiAodGhpcy5pc1ZhbGlkU2l6ZSh0aGlzLl9zaGVldEltcGwuc2l6ZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zaGVldEltcGwuc2l6ZTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVtYmVkZGluZ0Vycm9yQ29kZXMuSW1wbGVtZW50YXRpb25FcnJvciwgJ1NpemUgbm90IGltcGxlbWVudGVkJyk7XG4gIH1cblxuICBwcml2YXRlIGlzVmFsaWRTaXplKHNpemU6IGFueSk6IHNpemUgaXMgQ29udHJhY3QuU2l6ZSB7XG4gICAgY29uc3QgdGVzdFNpemUgPSBzaXplIGFzIENvbnRyYWN0LlNpemU7XG4gICAgaWYgKHRlc3RTaXplLndpZHRoICE9PSB1bmRlZmluZWQgJiYgdGVzdFNpemUuaGVpZ2h0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBmaW5kUGFyYW1ldGVyQXN5bmMocGFyYW1ldGVyTmFtZTogc3RyaW5nKTogUHJvbWlzZTxDb250cmFjdC5QYXJhbWV0ZXIgfCB1bmRlZmluZWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fc2hlZXRJbXBsLmZpbmRQYXJhbWV0ZXJBc3luYyhwYXJhbWV0ZXJOYW1lKS50aGVuKChwYXJhbWV0ZXJJbXBsKSA9PiB7XG4gICAgICBpZiAocGFyYW1ldGVySW1wbCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8Q29udHJhY3QuUGFyYW1ldGVyPigocmVzb2x2ZSkgPT4gcmVzb2x2ZShuZXcgUGFyYW1ldGVyKHBhcmFtZXRlckltcGwsIHRoaXMpKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8dW5kZWZpbmVkPigocmVzb2x2ZSkgPT4gcmVzb2x2ZSh1bmRlZmluZWQpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRQYXJhbWV0ZXJzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5QYXJhbWV0ZXI+PiB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWV0SW1wbC5nZXRQYXJhbWV0ZXJzQXN5bmMoKS50aGVuKChwYXJhbWV0ZXJzSW1wbCkgPT4ge1xuICAgICAgcmV0dXJuIHBhcmFtZXRlcnNJbXBsLm1hcCgocGFyYW1ldGVySW1wbCkgPT4ge1xuICAgICAgICByZXR1cm4gbmV3IFBhcmFtZXRlcihwYXJhbWV0ZXJJbXBsLCB0aGlzKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uV29ya2Jvb2tJbXBsIH0gZnJvbSAnLi4vSW1wbC9FeHRlbnNpb25Xb3JrYm9va0ltcGwnO1xuXG5leHBvcnQgY2xhc3MgV29ya2Jvb2sgaW1wbGVtZW50cyBDb250cmFjdC5FeHRlbnNpb25Xb3JrYm9vayB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF93b3JrYm9va0ltcGw6IEV4dGVuc2lvbldvcmtib29rSW1wbCkge31cblxuICBwdWJsaWMgZ2V0QWxsRGF0YVNvdXJjZXNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkRhdGFTb3VyY2U+PiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtib29rSW1wbC5nZXRBbGxEYXRhU291cmNlc0FzeW5jKCk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBDb2x1bW4sXG4gIEZpbHRlclVwZGF0ZVR5cGUsXG4gIFNlbGVjdGlvblVwZGF0ZVR5cGUsXG4gIFRhYmxlYXVFdmVudFR5cGUsXG4gIFRvb2x0aXBDb250ZXh0LFxuICBXb3Jrc2hlZXRGb3JtYXR0aW5nLFxufSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRmlsdGVyRXZlbnQsIE5vdGlmaWNhdGlvbklkLCBTdW1tYXJ5RGF0YUV2ZW50LCBWaXN1YWxJZCwgV29ya3NoZWV0Rm9ybWF0dGluZ0V2ZW50IH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeSxcbiAgTm90aWZpY2F0aW9uU2VydmljZSxcbiAgU2VydmljZU5hbWVzLFxuICBTaW5nbGVFdmVudE1hbmFnZXIsXG4gIFNpbmdsZUV2ZW50TWFuYWdlckltcGwsXG4gIFRhYmxlYXVFcnJvcixcbiAgV29ya3NoZWV0SW1wbCxcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBGaWx0ZXJDaGFuZ2VkRXZlbnQgfSBmcm9tICcuLi9FdmVudHMvRmlsdGVyQ2hhbmdlZEV2ZW50JztcbmltcG9ydCB7IE1hcmtzU2VsZWN0ZWRFdmVudCB9IGZyb20gJy4uL0V2ZW50cy9NYXJrc1NlbGVjdGVkRXZlbnQnO1xuaW1wb3J0IHsgU3VtbWFyeURhdGFDaGFuZ2VkRXZlbnQgfSBmcm9tICcuLi9FdmVudHMvU3VtbWFyeURhdGFDaGFuZ2VkRXZlbnQnO1xuaW1wb3J0IHsgV29ya3NoZWV0Rm9ybWF0dGluZ0NoYW5nZWRFdmVudCB9IGZyb20gJy4uL0V2ZW50cy9Xb3Jrc2hlZXRGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50JztcbmltcG9ydCB7IEV4dGVuc2lvbnNSZWdpc3RyeUlkIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5VXRpbCc7XG5pbXBvcnQgeyBEYXNoYm9hcmQgfSBmcm9tICcuL0Rhc2hib2FyZCc7XG5pbXBvcnQgeyBTaGVldCB9IGZyb20gJy4vU2hlZXQnO1xuXG5leHBvcnQgY2xhc3MgV29ya3NoZWV0IGV4dGVuZHMgU2hlZXQgaW1wbGVtZW50cyBDb250cmFjdC5FeHRlbnNpb25Xb3Jrc2hlZXQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIF93b3Jrc2hlZXRJbXBsOiBXb3Jrc2hlZXRJbXBsKSB7XG4gICAgc3VwZXIoX3dvcmtzaGVldEltcGwpO1xuXG4gICAgLy8gQ2FsbCB0byBpbml0aWFsaXplIGV2ZW50cyBhbmQgdGhlbiBjYWxsIGRvd24gdG8gdGhlIGV2ZW50IGxpc3RlbmVyIG1hbmFnZXIgdG8gaGFuZGxlIHRoaW5nc1xuICAgIHRoaXMuaW5pdGlhbGl6ZUV2ZW50cygpLmZvckVhY2goKGUpID0+IHRoaXMuYWRkTmV3RXZlbnRUeXBlKGUpKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcGFyZW50RGFzaGJvYXJkKCk6IENvbnRyYWN0LkV4dGVuc2lvbkRhc2hib2FyZCB7XG4gICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIGZvciBFeHRlbnNpb25zIGlmIHRoZSBEYXNoYm9hcmRJbXBscyBhcmUgY3JlYXRlZCBjb3JyZWN0bHlcbiAgICBpZiAodGhpcy5fd29ya3NoZWV0SW1wbC5wYXJlbnREYXNoYm9hcmQgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5TaGFyZWRFcnJvckNvZGVzLkltcGxlbWVudGF0aW9uRXJyb3IsIGBQYXJlbnQgZGFzaGJvYXJkIG5vdCBpbXBsZW1lbnRlZGApO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgRGFzaGJvYXJkKHRoaXMuX3dvcmtzaGVldEltcGwucGFyZW50RGFzaGJvYXJkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYmFja2dyb3VuZENvbG9yKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuX3dvcmtzaGVldEltcGwuYmFja2dyb3VuZENvbG9yID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuU2hhcmVkRXJyb3JDb2Rlcy5JbXBsZW1lbnRhdGlvbkVycm9yLCBgV29ya3NoZWV0IGJhY2tncm91bmQgY29sb3IgaXMgbm90IGF2YWlsYWJsZWApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmJhY2tncm91bmRDb2xvcjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZm9ybWF0dGluZygpOiBXb3Jrc2hlZXRGb3JtYXR0aW5nIHtcbiAgICBpZiAodGhpcy5fd29ya3NoZWV0SW1wbC5mb3JtYXR0aW5nID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuU2hhcmVkRXJyb3JDb2Rlcy5JbXBsZW1lbnRhdGlvbkVycm9yLCBgV29ya3NoZWV0IGZvcm1hdHRpbmcgaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZWApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmZvcm1hdHRpbmc7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIG1ldGhvZCB3aGljaCBnb2VzIHRocm91Z2ggYW5kIHJlZ2lzdGVycyBlYWNoIGV2ZW50IHR5cGUgdGhpcyBpbXBsIGtub3dzIGFib3V0XG4gICAqIHdpdGggdGhlIE5vdGlmaWNhdGlvblNlcnZpY2UuIEl0IHJldHVybnMgYW4gYXJyYXkgb2YgU2luZ2xlRXZlbnRNYW5hZ2VyIG9iamVjdHMgd2hpY2hcbiAgICogY2FuIHRoZW4gYmUgcGFzc2VkIHRvIGFuIEV2ZW50TGlzdGVuZXJNYW5hZ2VyIHRvIGhhbmRsZSB1c2VyIHJlZ2lzdHJhdGlvbiAvIHVucmVnaXN0cmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge1dvcmtzaGVldH0gd29ya3NoZWV0IFRoZSB3b3Jrc2hlZXQgb2JqZWN0IHdoaWNoIHdpbGwgYmUgaW5jbHVkZWQgd2l0aCB0aGUgZXZlbnQgbm90aWZpY2F0aW9uc1xuICAgKiBAcmV0dXJucyB7QXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPn0gQ29sbGVjdGlvbiBvZiBldmVudCBtYW5hZ2VycyB0byBwYXNzIHRvIGFuIEV2ZW50TGlzdGVuZXJNYW5hZ2VyXG4gICAqL1xuICBwdWJsaWMgaW5pdGlhbGl6ZUV2ZW50cygpOiBBcnJheTxTaW5nbGVFdmVudE1hbmFnZXI+IHtcbiAgICBjb25zdCByZXN1bHRzID0gbmV3IEFycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj4oKTtcbiAgICBsZXQgbm90aWZpY2F0aW9uU2VydmljZTogTm90aWZpY2F0aW9uU2VydmljZTtcblxuICAgIHRyeSB7XG4gICAgICBub3RpZmljYXRpb25TZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxOb3RpZmljYXRpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuTm90aWZpY2F0aW9uKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIHRoaXMgc2VydmljZSByZWdpc3RlcmVkLCBqdXN0IHJldHVyblxuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBhbGwgb2YgdGhlIGV2ZW50IG1hbmFnZXJzIHdlJ2xsIG5lZWQgKG9uZSBmb3IgZWFjaCBldmVudCB0eXBlKVxuICAgIGNvbnN0IG1hcmtzRXZlbnQgPSBuZXcgU2luZ2xlRXZlbnRNYW5hZ2VySW1wbDxNYXJrc1NlbGVjdGVkRXZlbnQ+KFRhYmxlYXVFdmVudFR5cGUuTWFya1NlbGVjdGlvbkNoYW5nZWQpO1xuICAgIG5vdGlmaWNhdGlvblNlcnZpY2UucmVnaXN0ZXJIYW5kbGVyKFxuICAgICAgTm90aWZpY2F0aW9uSWQuU2VsZWN0ZWRNYXJrc0NoYW5nZWQsXG4gICAgICAobW9kZWwpID0+IHtcbiAgICAgICAgY29uc3QgdmlzdWFsSWQgPSBtb2RlbCBhcyBWaXN1YWxJZDtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzdWFsSWRzQXJlRXF1YWwodmlzdWFsSWQsIHRoaXMuX3dvcmtzaGVldEltcGwudmlzdWFsSWQpO1xuICAgICAgfSxcbiAgICAgICgpID0+IG1hcmtzRXZlbnQudHJpZ2dlckV2ZW50KCgpID0+IG5ldyBNYXJrc1NlbGVjdGVkRXZlbnQodGhpcykpLFxuICAgICk7XG5cbiAgICBjb25zdCBmaWx0ZXJFdmVudCA9IG5ldyBTaW5nbGVFdmVudE1hbmFnZXJJbXBsPEZpbHRlckNoYW5nZWRFdmVudD4oVGFibGVhdUV2ZW50VHlwZS5GaWx0ZXJDaGFuZ2VkKTtcbiAgICBub3RpZmljYXRpb25TZXJ2aWNlLnJlZ2lzdGVySGFuZGxlcihcbiAgICAgIE5vdGlmaWNhdGlvbklkLkZpbHRlckNoYW5nZWQsXG4gICAgICAobW9kZWwpID0+IHtcbiAgICAgICAgY29uc3QgZmlsdGVyRXZlbnRSZXNwb25zZSA9IG1vZGVsIGFzIEZpbHRlckV2ZW50O1xuICAgICAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC52aXN1YWxJZC53b3Jrc2hlZXQgPT09IGZpbHRlckV2ZW50UmVzcG9uc2UudmlzdWFsSWQud29ya3NoZWV0O1xuICAgICAgfSxcbiAgICAgIChldmVudDogRmlsdGVyRXZlbnQpID0+IHtcbiAgICAgICAgZmlsdGVyRXZlbnQudHJpZ2dlckV2ZW50KCgpID0+IG5ldyBGaWx0ZXJDaGFuZ2VkRXZlbnQodGhpcywgZXZlbnQuZmllbGROYW1lLCBldmVudC5maWVsZElkKSk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICBjb25zdCBzdW1tYXJ5RGF0YUV2ZW50ID0gbmV3IFNpbmdsZUV2ZW50TWFuYWdlckltcGw8U3VtbWFyeURhdGFDaGFuZ2VkRXZlbnQ+KFRhYmxlYXVFdmVudFR5cGUuU3VtbWFyeURhdGFDaGFuZ2VkKTtcbiAgICBub3RpZmljYXRpb25TZXJ2aWNlLnJlZ2lzdGVySGFuZGxlcihcbiAgICAgIE5vdGlmaWNhdGlvbklkLlN1bW1hcnlEYXRhQ2hhbmdlZCxcbiAgICAgIChtb2RlbCkgPT4ge1xuICAgICAgICBjb25zdCBzdW1tYXJ5RGF0YUV2ZW50UmVzcG9uc2UgPSBtb2RlbCBhcyBTdW1tYXJ5RGF0YUV2ZW50O1xuICAgICAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC52aXN1YWxJZC53b3Jrc2hlZXQgPT09IHN1bW1hcnlEYXRhRXZlbnRSZXNwb25zZS52aXN1YWxJZC53b3Jrc2hlZXQ7XG4gICAgICB9LFxuICAgICAgKGV2ZW50OiBTdW1tYXJ5RGF0YUV2ZW50KSA9PiB7XG4gICAgICAgIHN1bW1hcnlEYXRhRXZlbnQudHJpZ2dlckV2ZW50KCgpID0+IG5ldyBTdW1tYXJ5RGF0YUNoYW5nZWRFdmVudCh0aGlzKSk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICBjb25zdCB3b3Jrc2hlZXRGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50ID0gbmV3IFNpbmdsZUV2ZW50TWFuYWdlckltcGw8V29ya3NoZWV0Rm9ybWF0dGluZ0NoYW5nZWRFdmVudD4oXG4gICAgICBUYWJsZWF1RXZlbnRUeXBlLldvcmtzaGVldEZvcm1hdHRpbmdDaGFuZ2VkLFxuICAgICk7XG5cbiAgICBub3RpZmljYXRpb25TZXJ2aWNlLnJlZ2lzdGVySGFuZGxlcihcbiAgICAgIE5vdGlmaWNhdGlvbklkLldvcmtzaGVldEZvcm1hdHRpbmdDaGFuZ2VkLFxuICAgICAgKG1vZGVsKSA9PiB7XG4gICAgICAgIGNvbnN0IHdvcmtzaGVldEZvcm1hdHRpbmdDaGFuZ2VkRXZlbnQgPSBtb2RlbCBhcyBXb3Jrc2hlZXRGb3JtYXR0aW5nRXZlbnQ7XG4gICAgICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLnZpc3VhbElkLndvcmtzaGVldCA9PT0gd29ya3NoZWV0Rm9ybWF0dGluZ0NoYW5nZWRFdmVudC52aXN1YWxJZC53b3Jrc2hlZXQ7XG4gICAgICB9LFxuICAgICAgKGV2ZW50Rm9ybWF0dGluZzogV29ya3NoZWV0Rm9ybWF0dGluZykgPT4ge1xuICAgICAgICB3b3Jrc2hlZXRGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50LnRyaWdnZXJFdmVudCgoKSA9PiBuZXcgV29ya3NoZWV0Rm9ybWF0dGluZ0NoYW5nZWRFdmVudCh0aGlzLCBldmVudEZvcm1hdHRpbmcpKTtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIHJlc3VsdHMucHVzaChtYXJrc0V2ZW50KTtcbiAgICByZXN1bHRzLnB1c2goZmlsdGVyRXZlbnQpO1xuICAgIHJlc3VsdHMucHVzaChzdW1tYXJ5RGF0YUV2ZW50KTtcbiAgICByZXN1bHRzLnB1c2god29ya3NoZWV0Rm9ybWF0dGluZ0NoYW5nZWRFdmVudCk7XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIHB1YmxpYyBhcHBseUZpbHRlckFzeW5jKFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHZhbHVlczogQXJyYXk8c3RyaW5nPixcbiAgICB1cGRhdGVUeXBlOiBGaWx0ZXJVcGRhdGVUeXBlLFxuICAgIG9wdGlvbnM6IENvbnRyYWN0LkZpbHRlck9wdGlvbnMsXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuYXBwbHlGaWx0ZXJBc3luYyhmaWVsZE5hbWUsIHZhbHVlcywgdXBkYXRlVHlwZSwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlSYW5nZUZpbHRlckFzeW5jKGZpZWxkTmFtZTogc3RyaW5nLCBmaWx0ZXJPcHRpb25zOiBDb250cmFjdC5SYW5nZUZpbHRlck9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmFwcGx5UmFuZ2VGaWx0ZXJBc3luYyhmaWVsZE5hbWUsIGZpbHRlck9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGFwcGx5SGllcmFyY2hpY2FsRmlsdGVyQXN5bmMoXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgdmFsdWVzOiBBcnJheTxzdHJpbmc+LFxuICAgIHVwZGF0ZVR5cGU6IENvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGUsXG4gICAgb3B0aW9uczogQ29udHJhY3QuRmlsdGVyT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5hcHBseUhpZXJhcmNoaWNhbEZpbHRlckFzeW5jKGZpZWxkTmFtZSwgdmFsdWVzLCB1cGRhdGVUeXBlLCBvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseVJlbGF0aXZlRGF0ZUZpbHRlckFzeW5jKGZpZWxkTmFtZTogc3RyaW5nLCBvcHRpb25zOiBDb250cmFjdC5SZWxhdGl2ZURhdGVGaWx0ZXJPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5hcHBseVJlbGF0aXZlRGF0ZUZpbHRlckFzeW5jKGZpZWxkTmFtZSwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJGaWx0ZXJBc3luYyhmaWVsZE5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuY2xlYXJGaWx0ZXJBc3luYyhmaWVsZE5hbWUpO1xuICB9XG5cbiAgcHVibGljIGdldERhdGFTb3VyY2VzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5EYXRhU291cmNlPj4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldERhdGFTb3VyY2VzQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRGaWx0ZXJzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5GaWx0ZXI+PiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0RmlsdGVyc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2VsZWN0ZWRNYXJrc0FzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuTWFya3NDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0U2VsZWN0ZWRNYXJrc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0SGlnaGxpZ2h0ZWRNYXJrc0FzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuTWFya3NDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0SGlnaGxpZ2h0ZWRNYXJrc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3VtbWFyeURhdGFBc3luYyhvcHRpb25zOiBDb250cmFjdC5HZXRTdW1tYXJ5RGF0YU9wdGlvbnMpOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldFN1bW1hcnlEYXRhQXN5bmMob3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3VtbWFyeURhdGFSZWFkZXJBc3luYyhwYWdlUm93Q291bnQ6IG51bWJlciwgb3B0aW9uczogQ29udHJhY3QuR2V0U3VtbWFyeURhdGFPcHRpb25zKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGVSZWFkZXI+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5nZXRTdW1tYXJ5RGF0YVJlYWRlckFzeW5jKHBhZ2VSb3dDb3VudCwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3VtbWFyeUNvbHVtbnNJbmZvQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb2x1bW4+PiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0U3VtbWFyeUNvbHVtbnNJbmZvQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmRlcmx5aW5nRGF0YUFzeW5jKG9wdGlvbnM6IENvbnRyYWN0LkdldFVuZGVybHlpbmdEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ1dvcmtzaGVldC5nZXRVbmRlcmx5aW5nRGF0YUFzeW5jIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgJyArXG4gICAgICAgICdXb3Jrc2hlZXQuZ2V0VW5kZXJseWluZ1RhYmxlc0FzeW5jIGFuZCBXb3Jrc2hlZXQuZ2V0VW5kZXJseWluZ1RhYmxlRGF0YUFzeW5jJyxcbiAgICApO1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldFVuZGVybHlpbmdEYXRhQXN5bmMob3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ1RhYmxlc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuTG9naWNhbFRhYmxlPj4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldFVuZGVybHlpbmdUYWJsZXNBc3luYygpO1xuICB9XG5cbiAgcHVibGljIGdldFVuZGVybHlpbmdUYWJsZURhdGFBc3luYyhsb2dpY2FsVGFibGVJZDogc3RyaW5nLCBvcHRpb25zOiBDb250cmFjdC5HZXRVbmRlcmx5aW5nRGF0YU9wdGlvbnMpOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldFVuZGVybHlpbmdUYWJsZURhdGFBc3luYyhsb2dpY2FsVGFibGVJZCwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ1RhYmxlRGF0YVJlYWRlckFzeW5jKFxuICAgIGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsXG4gICAgcGFnZVJvd0NvdW50OiBudW1iZXIsXG4gICAgb3B0aW9uczogQ29udHJhY3QuR2V0VW5kZXJseWluZ0RhdGFPcHRpb25zLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZVJlYWRlcj4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldFVuZGVybHlpbmdUYWJsZURhdGFSZWFkZXJBc3luYyhsb2dpY2FsVGFibGVJZCwgcGFnZVJvd0NvdW50LCBvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRWaXN1YWxTcGVjaWZpY2F0aW9uQXN5bmMoKTogUHJvbWlzZTxDb250cmFjdC5WaXN1YWxTcGVjaWZpY2F0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0VmlzdWFsU3BlY2lmaWNhdGlvbkFzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgYWRkTWFya3NDYXJkRmllbGRzQXN5bmMoXG4gICAgbWFya3NDYXJkSW5kZXg6IG51bWJlcixcbiAgICBlbmNvZGluZ1R5cGU6IENvbnRyYWN0LkVuY29kaW5nVHlwZSxcbiAgICBjb2x1bW5zOiBBcnJheTxDb250cmFjdC5Db2x1bW4+LFxuICAgIHN0YXJ0SW5kZXg6IG51bWJlcixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuYWRkTWFya3NDYXJkRmllbGRzQXN5bmMobWFya3NDYXJkSW5kZXgsIGVuY29kaW5nVHlwZSwgY29sdW1ucywgc3RhcnRJbmRleCk7XG4gIH1cblxuICBwdWJsaWMgbW92ZU1hcmtzQ2FyZEZpZWxkQXN5bmMobWFya3NDYXJkSW5kZXg6IG51bWJlciwgZnJvbUluZGV4OiBudW1iZXIsIHRvSW5kZXg6IG51bWJlciwgZmllbGRDb3VudCA9IDEpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5tb3ZlTWFya3NDYXJkRmllbGRBc3luYyhtYXJrc0NhcmRJbmRleCwgZnJvbUluZGV4LCB0b0luZGV4LCBmaWVsZENvdW50KTtcbiAgfVxuXG4gIHB1YmxpYyBzcGxpY2VNYXJrc0NhcmRGaWVsZHNBc3luYyhcbiAgICBtYXJrc0NhcmRJbmRleDogbnVtYmVyLFxuICAgIGVuY29kaW5nVHlwZTogQ29udHJhY3QuRW5jb2RpbmdUeXBlLFxuICAgIHN0YXJ0SW5kZXg6IG51bWJlcixcbiAgICBkZWxldGVDb3VudDogbnVtYmVyLFxuICAgIGNvbHVtbnM6IEFycmF5PENvbnRyYWN0LkNvbHVtbj4sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLnNwbGljZU1hcmtzQ2FyZEZpZWxkc0FzeW5jKG1hcmtzQ2FyZEluZGV4LCBlbmNvZGluZ1R5cGUsIHN0YXJ0SW5kZXgsIGRlbGV0ZUNvdW50LCBjb2x1bW5zKTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhclNlbGVjdGVkTWFya3NBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5jbGVhclNlbGVjdGVkTWFya3NBc3luYygpO1xuICB9XG5cbiAgcHVibGljIHNlbGVjdE1hcmtzQnlJREFzeW5jKG1hcmtzSW5mbzogQXJyYXk8Q29udHJhY3QuTWFya0luZm8+LCB1cGRhdGVUeXBlOiBTZWxlY3Rpb25VcGRhdGVUeXBlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuc2VsZWN0TWFya3NCeUlkQXN5bmMobWFya3NJbmZvLCB1cGRhdGVUeXBlKTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RNYXJrc0J5VmFsdWVBc3luYyhzZWxlY3Rpb25zOiBBcnJheTxDb250cmFjdC5TZWxlY3Rpb25Dcml0ZXJpYT4sIHNlbGVjdGlvblVwZGF0ZVR5cGU6IFNlbGVjdGlvblVwZGF0ZVR5cGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5zZWxlY3RNYXJrc0J5VmFsdWVBc3luYyhzZWxlY3Rpb25zLCBzZWxlY3Rpb25VcGRhdGVUeXBlKTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RNYXJrc0J5SWRBc3luYyhzZWxlY3Rpb25zOiBBcnJheTxDb250cmFjdC5NYXJrSW5mbz4sIHNlbGVjdGlvblVwZGF0ZVR5cGU6IFNlbGVjdGlvblVwZGF0ZVR5cGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5zZWxlY3RNYXJrc0J5SWRBc3luYyhzZWxlY3Rpb25zLCBzZWxlY3Rpb25VcGRhdGVUeXBlKTtcbiAgfVxuXG4gIHB1YmxpYyBhbm5vdGF0ZU1hcmtBc3luYyhtYXJrOiBDb250cmFjdC5NYXJrSW5mbywgYW5ub3RhdGlvblRleHQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmFubm90YXRlTWFya0FzeW5jKG1hcmssIGFubm90YXRpb25UZXh0KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBbm5vdGF0aW9uc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuQW5ub3RhdGlvbj4+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5nZXRBbm5vdGF0aW9uc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlQW5ub3RhdGlvbkFzeW5jKGFubm90YXRpb246IENvbnRyYWN0LkFubm90YXRpb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5yZW1vdmVBbm5vdGF0aW9uQXN5bmMoYW5ub3RhdGlvbik7XG4gIH1cblxuICBwdWJsaWMgaG92ZXJUdXBsZUFzeW5jKGhvdmVyZWRUdXBsZT86IG51bWJlciwgdG9vbHRpcD86IFRvb2x0aXBDb250ZXh0IHwgbnVsbCwgYWxsb3dIb3ZlckFjdGlvbnMgPSB0cnVlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuaG92ZXJUdXBsZUFzeW5jKGhvdmVyZWRUdXBsZSwgdG9vbHRpcCwgYWxsb3dIb3ZlckFjdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIHNlbGVjdFR1cGxlc0FzeW5jKHNlbGVjdGVkVHVwbGVzOiBBcnJheTxudW1iZXI+LCBzZWxlY3RPcHRpb246IENvbnRyYWN0LlNlbGVjdE9wdGlvbnMsIHRvb2x0aXA/OiBUb29sdGlwQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLnNlbGVjdFR1cGxlc0FzeW5jKHNlbGVjdGVkVHVwbGVzLCBzZWxlY3RPcHRpb24sIHRvb2x0aXApO1xuICB9XG5cbiAgcHVibGljIGdldFRvb2x0aXBUZXh0QXN5bmModHVwbGVJZDogbnVtYmVyKTogUHJvbWlzZTxTdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5nZXRUb29sdGlwVGV4dEFzeW5jKHR1cGxlSWQpO1xuICB9XG5cbiAgcHVibGljIGxlYXZlTWFya05hdmlnYXRpb25Bc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5sZWF2ZU1hcmtOYXZpZ2F0aW9uQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBlZGl0QWxpYXNlc0RpYWxvZ0FzeW5jKGZpZWxkTmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZWRpdEFsaWFzZXNEaWFsb2dBc3luYyhmaWVsZE5hbWUpO1xuICB9XG5cbiAgcHJpdmF0ZSB2aXN1YWxJZHNBcmVFcXVhbChhOiBWaXN1YWxJZCwgYjogVmlzdWFsSWQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgYSAmJlxuICAgICAgYiAmJlxuICAgICAgYS53b3Jrc2hlZXQgPT09IGIud29ya3NoZWV0ICYmXG4gICAgICBhLmRhc2hib2FyZCA9PT0gYi5kYXNoYm9hcmQgJiZcbiAgICAgIGEuc3Rvcnlib2FyZCA9PT0gYi5zdG9yeWJvYXJkICYmXG4gICAgICBhLnN0b3J5UG9pbnRJRCA9PT0gYi5zdG9yeVBvaW50SURcbiAgICApO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBleHRlcm5hbCBEYXNoYm9hcmRDb250ZW50IG5hbWVzcGFjZS5cbiAqIFRoaXMgZG9lcyBub3QgZm9sbG93IHRoZSBJbXBsIHBhdHRlcm4gYXMgRGFzaGJvYXJkQ29udGVudCBpc1xuICogY3VycmVudGx5IGp1c3QgYSAoc2luZ2xlKSBwcm9wZXJ0eSBiYWcuXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXNoYm9hcmRDb250ZW50IGltcGxlbWVudHMgQ29udHJhY3QuRGFzaGJvYXJkQ29udGVudCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9kYXNoYm9hcmQ6IENvbnRyYWN0LkV4dGVuc2lvbkRhc2hib2FyZCkge31cblxuICBwdWJsaWMgZ2V0IGRhc2hib2FyZCgpOiBDb250cmFjdC5FeHRlbnNpb25EYXNoYm9hcmQge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmQ7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeHRlbnNpb25FbnZpcm9ubWVudCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBBcGlWZXJzaW9uLCBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MgYXMgRW51bU1hcHBpbmdzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBDb25uZWN0ZWRTZXJ2ZXIgfSBmcm9tICcuLi9JbXBsL0Nvbm5lY3RlZFNlcnZlcic7XG5pbXBvcnQgeyBXb3JrYm9va0Zvcm1hdHRpbmdFbnZVdGlsIH0gZnJvbSAnLi9Xb3JrYm9va0Zvcm1hdHRpbmdFbnZVdGlsJztcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgZXh0ZXJuYWwgZW52aXJvbm1lbnQgbmFtZXNwYWNlLlxuICogRW52aXJvbm1lbnQgZG9lcyBub3QgZm9sbG93IHRoZSBJbXBsIHBhdHRlcm4gYXMgaXQgaXNcbiAqIGp1c3QgYSBwcm9wZXJ0eSBiYWcuXG4gKiBGaXJzdCBjbGFzcyBleHRlbnNpb25zIGNhbiBnZXQgdG8gQ29ubmVjdGVkU2VydmVyIHdpdGg6IGVudmlyb25tZW50Wydjb25uZWN0ZWRTZXJ2ZXInXVxuICovXG5leHBvcnQgY2xhc3MgRW52aXJvbm1lbnQgaW1wbGVtZW50cyBDb250cmFjdC5FbnZpcm9ubWVudCB7XG4gIC8qKlRoZSBmb2xsb3dpbmcgaXMgYW4gaW5kZXggc2lnbmF0dXJlLiBJdCBhbGxvd3MgcHJvcGVydGllcyB0byBiZSBhY2Nlc3NlZCBieSBuYW1lLlxuICAgKiBUaGlzIGFsbG93cyB1cyB0byBhZGQgcHJvcGVydGllcyBkeW5hbWljYWxseSAoc2VlIHVzYWdlIG9mIHRoaXMuY29ubmVjdGVkU2VydmVyIGJlbG93KSB3aXRob3V0IFR5cGVzY3JpcHQgZXJyb3JzLlxuICAgKiBUaGUgcmVhc29uIHdlIGRvIHRoaXMgaXMgc28gdGhhdCAzcmQtcGFydHkgZXh0ZW5zaW9uIGRldmVsb3BlcnMgZG8gbm90IHNlZSB0aGUgY29ubmVjdGVkU2VydmVyIHByb3BlcnR5XG4gICAqIHRoYXQgaXMgb25seSBhdmFpbGFibGUgdG8gZmlyc3QgY2xhc3MgZXh0ZW5zaW9uIGRldmVsb3BlcnMuXG4gICAqIFRoZSB0eXBlIG9mIHRoZSBpbmRleCBzaWdhdHVyZSBuZWVkcyB0byBiZSBhIHVuaW9uIG9mIGFsbCBwcm9wZXJ0aWVzIGluIHRoZSBvYmplY3QsIHNpbmNlIHdlIGNvdWxkXG4gICAqIGFjY2VzcyBhbnkgcHJvcGVydHkgdXNpbmcgdGhlIHByb3BlcnR5IGluZGV4IG1ldGhvZC5cbiAgICovXG4gIFt4OiBzdHJpbmddOiBDb25uZWN0ZWRTZXJ2ZXIgfCBzdHJpbmcgfCBDb250cmFjdC5Xb3JrYm9va0Zvcm1hdHRpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfYXBpVmVyc2lvbjogc3RyaW5nO1xuICBwcml2YXRlIF9jb250ZXh0OiBDb250cmFjdC5FeHRlbnNpb25Db250ZXh0O1xuICBwcml2YXRlIF9mb3JtYXR0aW5nPzogQ29udHJhY3QuV29ya2Jvb2tGb3JtYXR0aW5nO1xuICBwcml2YXRlIF9sYW5ndWFnZTogc3RyaW5nO1xuICBwcml2YXRlIF9jb3VudHJ5Pzogc3RyaW5nO1xuICBwcml2YXRlIF9sb2NhbGU6IHN0cmluZztcbiAgcHJpdmF0ZSBfbW9kZTogQ29udHJhY3QuRXh0ZW5zaW9uTW9kZTtcbiAgcHJpdmF0ZSBfb3BlcmF0aW5nU3lzdGVtOiBzdHJpbmc7XG4gIHByaXZhdGUgX3RhYmxlYXVWZXJzaW9uOiBzdHJpbmc7XG4gIHByaXZhdGUgX3VuaXF1ZVVzZXJJZD86IHN0cmluZztcblxuICBwdWJsaWMgY29uc3RydWN0b3IoZXh0ZW5zaW9uRW52aXJvbm1lbnQ6IEV4dGVuc2lvbkVudmlyb25tZW50KSB7XG4gICAgdGhpcy5fYXBpVmVyc2lvbiA9IEFwaVZlcnNpb24uSW5zdGFuY2UgJiYgQXBpVmVyc2lvbi5JbnN0YW5jZS5mb3JtYXR0ZWRWYWx1ZTsgLy8gbWFqLm1pbi5maXggKG5vIGJ1aWxkKVxuICAgIHRoaXMuX2NvbnRleHQgPSBFbnVtTWFwcGluZ3MuZXh0ZW5zaW9uQ29udGV4dC5jb252ZXJ0KGV4dGVuc2lvbkVudmlyb25tZW50LmV4dGVuc2lvbkNvbnRleHQpO1xuICAgIHRoaXMuX2Zvcm1hdHRpbmcgPSBXb3JrYm9va0Zvcm1hdHRpbmdFbnZVdGlsLmNvbnZlcnRUb1dvcmtib29rRm9ybWF0dGluZyhleHRlbnNpb25FbnZpcm9ubWVudC53b3JrYm9va0Zvcm1hdHRpbmcpO1xuICAgIHRoaXMuX2xhbmd1YWdlID0gZXh0ZW5zaW9uRW52aXJvbm1lbnQuZXh0ZW5zaW9uTGFuZ3VhZ2U7XG4gICAgdGhpcy5fY291bnRyeSA9IGV4dGVuc2lvbkVudmlyb25tZW50LmV4dGVuc2lvbkNvdW50cnk7XG4gICAgdGhpcy5fbG9jYWxlID0gZXh0ZW5zaW9uRW52aXJvbm1lbnQuZXh0ZW5zaW9uTG9jYWxlO1xuICAgIHRoaXMuX21vZGUgPSBFbnVtTWFwcGluZ3MuZXh0ZW5zaW9uTW9kZS5jb252ZXJ0KGV4dGVuc2lvbkVudmlyb25tZW50LmV4dGVuc2lvbk1vZGUpO1xuICAgIHRoaXMuX29wZXJhdGluZ1N5c3RlbSA9IGV4dGVuc2lvbkVudmlyb25tZW50Lm9wZXJhdGluZ1N5c3RlbTtcbiAgICB0aGlzLl90YWJsZWF1VmVyc2lvbiA9IGV4dGVuc2lvbkVudmlyb25tZW50LnRhYmxlYXVWZXJzaW9uO1xuICAgIHRoaXMuX3VuaXF1ZVVzZXJJZCA9IGV4dGVuc2lvbkVudmlyb25tZW50LnVuaXF1ZVVzZXJJZDtcblxuICAgIC8vIElmIHdlIGhhdmUgYSB1c2VySWQsIHRoZW4gd2UgYXJlIGEgZmlyc3QgY2xhc3MgZXh0ZW5zaW9uXG4gICAgaWYgKGV4dGVuc2lvbkVudmlyb25tZW50LnVzZXJJZCkge1xuICAgICAgdGhpcy5jb25uZWN0ZWRTZXJ2ZXIgPSBuZXcgQ29ubmVjdGVkU2VydmVyKFxuICAgICAgICBleHRlbnNpb25FbnZpcm9ubWVudC51c2VySWQsXG4gICAgICAgIGV4dGVuc2lvbkVudmlyb25tZW50LnNpdGVJZCxcbiAgICAgICAgZXh0ZW5zaW9uRW52aXJvbm1lbnQuc2l0ZU5hbWVzcGFjZSxcbiAgICAgICAgZXh0ZW5zaW9uRW52aXJvbm1lbnQud29ya2Jvb2tJZCxcbiAgICAgICk7XG5cbiAgICAgIHRoaXMuZmVhdHVyZUZsYWdzID0gZXh0ZW5zaW9uRW52aXJvbm1lbnQuZmVhdHVyZUZsYWdzO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgYXBpVmVyc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9hcGlWZXJzaW9uO1xuICB9XG5cbiAgcHVibGljIGdldCBjb250ZXh0KCk6IENvbnRyYWN0LkV4dGVuc2lvbkNvbnRleHQge1xuICAgIHJldHVybiB0aGlzLl9jb250ZXh0O1xuICB9XG5cbiAgcHVibGljIGdldCB3b3JrYm9va0Zvcm1hdHRpbmcoKTogQ29udHJhY3QuV29ya2Jvb2tGb3JtYXR0aW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybWF0dGluZztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbGFuZ3VhZ2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbGFuZ3VhZ2U7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvdW50cnkoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fY291bnRyeTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbG9jYWxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2xvY2FsZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbW9kZSgpOiBDb250cmFjdC5FeHRlbnNpb25Nb2RlIHtcbiAgICByZXR1cm4gdGhpcy5fbW9kZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgb3BlcmF0aW5nU3lzdGVtKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX29wZXJhdGluZ1N5c3RlbTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdGFibGVhdVZlcnNpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fdGFibGVhdVZlcnNpb247XG4gIH1cblxuICBwdWJsaWMgZ2V0IHVuaXF1ZVVzZXJJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl91bmlxdWVVc2VySWQ7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBDYWxsYmFja01hcCwgRXh0ZW5zaW9uc0ltcGwgfSBmcm9tICcuLi9JbXBsL0V4dGVuc2lvbnNJbXBsJztcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgZXh0ZXJuYWwgRXh0ZW5zaW9ucyBuYW1lc3BhY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBFeHRlbnNpb25zIGltcGxlbWVudHMgQ29udHJhY3QuRXh0ZW5zaW9ucyB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIGV4dGVuc2lvbkltcGw6IEV4dGVuc2lvbnNJbXBsKSB7XG4gICAgdGhpcy5leHRlbnNpb25JbXBsID0gZXh0ZW5zaW9uSW1wbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGFzaGJvYXJkQ29udGVudCgpOiBDb250cmFjdC5EYXNoYm9hcmRDb250ZW50IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5leHRlbnNpb25JbXBsLmRhc2hib2FyZENvbnRlbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHdvcmtzaGVldENvbnRlbnQoKTogQ29udHJhY3QuV29ya3NoZWV0Q29udGVudCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZXh0ZW5zaW9uSW1wbC53b3Jrc2hlZXRDb250ZW50O1xuICB9XG5cbiAgcHVibGljIGdldCBlbnZpcm9ubWVudCgpOiBDb250cmFjdC5FbnZpcm9ubWVudCB7XG4gICAgcmV0dXJuIHRoaXMuZXh0ZW5zaW9uSW1wbC5lbnZpcm9ubWVudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2V0dGluZ3MoKTogQ29udHJhY3QuU2V0dGluZ3Mge1xuICAgIHJldHVybiB0aGlzLmV4dGVuc2lvbkltcGwuc2V0dGluZ3M7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHVpKCk6IENvbnRyYWN0LlVJIHtcbiAgICByZXR1cm4gdGhpcy5leHRlbnNpb25JbXBsLnVpO1xuICB9XG5cbiAgcHVibGljIGdldCB3b3JrYm9vaygpOiBDb250cmFjdC5FeHRlbnNpb25Xb3JrYm9vayB7XG4gICAgcmV0dXJuIHRoaXMuZXh0ZW5zaW9uSW1wbC53b3JrYm9vaztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGFzaGJvYXJkT2JqZWN0SWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5leHRlbnNpb25JbXBsLmV4dGVuc2lvblpvbmVJZDtcbiAgfVxuXG4gIHB1YmxpYyBpbml0aWFsaXplQXN5bmMoY29udGV4dE1lbnVDYWxsYmFja3M/OiBDYWxsYmFja01hcCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmV4dGVuc2lvbkltcGwuaW5pdGlhbGl6ZUFzeW5jKGZhbHNlLCBjb250ZXh0TWVudUNhbGxiYWNrcykudGhlbjx2b2lkPigpO1xuICB9XG5cbiAgcHVibGljIGluaXRpYWxpemVEaWFsb2dBc3luYygpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLmV4dGVuc2lvbkltcGwuaW5pdGlhbGl6ZUFzeW5jKHRydWUpO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZVZpekltYWdlQXN5bmMoaW5wdXRTcGVjOiBvYmplY3QpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLmV4dGVuc2lvbkltcGwuY3JlYXRlVml6SW1hZ2VBc3luYyhpbnB1dFNwZWMpO1xuICB9XG5cbiAgcHVibGljIHNldENsaWNrVGhyb3VnaEFzeW5jKGNsaWNrVGhyb3VnaEVuYWJsZWQ6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5leHRlbnNpb25JbXBsLnNldENsaWNrVGhyb3VnaEFzeW5jKGNsaWNrVGhyb3VnaEVuYWJsZWQpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBTZXR0aW5ncyBhcyBTZXR0aW5nc0NvbnRyYWN0IH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEV2ZW50TGlzdGVuZXJNYW5hZ2VyIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBTZXR0aW5nc0ltcGwgfSBmcm9tICcuLi9JbXBsL1NldHRpbmdzSW1wbCc7XG5pbXBvcnQgeyBTZXR0aW5nc0NvbGxlY3Rpb24gfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXR0aW5nc1NlcnZpY2UnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBleHRlcm5hbCBzZXR0aW5ncyBuYW1lc3BhY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXR0aW5ncyBleHRlbmRzIEV2ZW50TGlzdGVuZXJNYW5hZ2VyIGltcGxlbWVudHMgU2V0dGluZ3NDb250cmFjdCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9zZXR0aW5nc0ltcGw6IFNldHRpbmdzSW1wbCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICAvLyBJbml0aWFsaXplIG91ciBldmVudCBoYW5kbGluZyBmb3IgdGhpcyBjbGFzc1xuICAgIHRoaXMuX3NldHRpbmdzSW1wbC5pbml0aWFsaXplRXZlbnRzKCkuZm9yRWFjaCgoZSkgPT4gdGhpcy5hZGROZXdFdmVudFR5cGUoZSkpO1xuICB9XG5cbiAgcHVibGljIGVyYXNlKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fc2V0dGluZ3NJbXBsLmVyYXNlKGtleSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0KGtleTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fc2V0dGluZ3NJbXBsLmdldChrZXkpO1xuICB9XG5cbiAgcHVibGljIGdldEFsbCgpOiBTZXR0aW5nc0NvbGxlY3Rpb24ge1xuICAgIHJldHVybiB0aGlzLl9zZXR0aW5nc0ltcGwuZ2V0QWxsKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzTW9kaWZpZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzSW1wbC5pc01vZGlmaWVkO1xuICB9XG5cbiAgcHVibGljIHNhdmVBc3luYygpOiBQcm9taXNlPFNldHRpbmdzQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiB0aGlzLl9zZXR0aW5nc0ltcGwuc2F2ZUFzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fc2V0dGluZ3NJbXBsLnNldChrZXksIHZhbHVlKTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEV2ZW50TGlzdGVuZXJNYW5hZ2VyIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBVSUltcGwgfSBmcm9tICcuLi9JbXBsL1VJSW1wbCc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGV4dGVybmFsIFVJIG5hbWVzcGFjZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFVJIGV4dGVuZHMgRXZlbnRMaXN0ZW5lck1hbmFnZXIgaW1wbGVtZW50cyBDb250cmFjdC5VSSB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9pbXBsOiBVSUltcGwpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBvdXIgZXZlbnQgaGFuZGxpbmcgZm9yIHRoaXMgY2xhc3NcbiAgICB0aGlzLl9pbXBsLmluaXRpYWxpemVFdmVudHMoKS5mb3JFYWNoKChlKSA9PiB0aGlzLmFkZE5ld0V2ZW50VHlwZShlKSk7XG4gIH1cblxuICBwdWJsaWMgZGlzcGxheURpYWxvZ0FzeW5jKHVybDogc3RyaW5nLCBwYXlsb2FkPzogc3RyaW5nLCBvcHRpb25zPzogQ29udHJhY3QuRGlhbG9nT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX2ltcGwuZGlzcGxheURpYWxvZ0FzeW5jKHVybCwgcGF5bG9hZCwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgc2VuZERpYWxvZ01lc3NhZ2VBc3luYyhtZXNzYWdlOiBzdHJpbmcsIHRhcmdldERpYWxvZ1VybD86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9pbXBsLnNlbmREaWFsb2dNZXNzYWdlQXN5bmMobWVzc2FnZSwgdGFyZ2V0RGlhbG9nVXJsKTtcbiAgfVxuXG4gIHB1YmxpYyBjbG9zZURpYWxvZyhwYXlsb2FkPzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5faW1wbC5jbG9zZURpYWxvZyhwYXlsb2FkKTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyBhcyBFbnVtTWFwcGluZ3MgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IENsYXNzTmFtZUtleSwgV29ya2Jvb2tGb3JtYXR0aW5nIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuZXhwb3J0IGNsYXNzIFdvcmtib29rRm9ybWF0dGluZ0VudlV0aWwge1xuICBwdWJsaWMgc3RhdGljIGNvbnZlcnRUb1dvcmtib29rRm9ybWF0dGluZyh3b3JrYm9va0Zvcm1hdHRpbmdNb2RlbD86IFdvcmtib29rRm9ybWF0dGluZyk6IENvbnRyYWN0Lldvcmtib29rRm9ybWF0dGluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF3b3JrYm9va0Zvcm1hdHRpbmdNb2RlbCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZm9ybWF0dGluZ01hcDogQXJyYXk8Q29udHJhY3QuRm9ybWF0dGluZ1NoZWV0PiA9IHdvcmtib29rRm9ybWF0dGluZ01vZGVsLmZvcm1hdHRpbmdTaGVldHMubWFwKChjdXJyZW50Rm9ybWF0dGluZ1NoZWV0KSA9PiB7XG4gICAgICAgIGNvbnN0IGZvcm1hdHRpbmdTaGVldDogQ29udHJhY3QuRm9ybWF0dGluZ1NoZWV0ID0ge1xuICAgICAgICAgIGNsYXNzTmFtZUtleTogRW51bU1hcHBpbmdzLmNsYXNzTmFtZUtleS5jb252ZXJ0KGN1cnJlbnRGb3JtYXR0aW5nU2hlZXQuY2xhc3NOYW1lS2V5KSxcbiAgICAgICAgICBjc3NQcm9wZXJ0aWVzOiBnZXRDc3NQcm9wZXJ0aWVzKGN1cnJlbnRGb3JtYXR0aW5nU2hlZXQuY2xhc3NOYW1lS2V5LCBjdXJyZW50Rm9ybWF0dGluZ1NoZWV0LmNzc1Byb3BlcnRpZXMpLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gZm9ybWF0dGluZ1NoZWV0O1xuICAgICAgfSk7XG4gICAgICBjb25zdCByZXN1bHQ6IENvbnRyYWN0Lldvcmtib29rRm9ybWF0dGluZyA9IHtcbiAgICAgICAgZm9ybWF0dGluZ1NoZWV0czogZm9ybWF0dGluZ01hcCxcbiAgICAgIH07XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRDc3NQcm9wZXJ0aWVzKGNsYXNzTmFtZUtleTogQ2xhc3NOYW1lS2V5LCBjc3NQcm9wZXJ0aWVzOiBSZWFjdC5DU1NQcm9wZXJ0aWVzKTogaW1wb3J0KCdyZWFjdCcpLkNTU1Byb3BlcnRpZXMge1xuICBpZiAoY2xhc3NOYW1lS2V5ID09PSBDbGFzc05hbWVLZXkuUm93RGl2aWRlcnMgfHwgY2xhc3NOYW1lS2V5ID09PSBDbGFzc05hbWVLZXkuQ29sdW1uRGl2aWRlcnMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYm9yZGVyQ29sb3I6IGNzc1Byb3BlcnRpZXMuYm9yZGVyQ29sb3IsXG4gICAgICBib3JkZXJTdHlsZTogY3NzUHJvcGVydGllcy5ib3JkZXJTdHlsZSxcbiAgICAgIGJvcmRlcldpZHRoOiBjc3NQcm9wZXJ0aWVzLmJvcmRlcldpZHRoLFxuICAgIH0gYXMgUmVhY3QuQ1NTUHJvcGVydGllcztcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZm9udEZhbWlseTogY3NzUHJvcGVydGllcy5mb250RmFtaWx5LFxuICAgIGZvbnRTaXplOiBjc3NQcm9wZXJ0aWVzLmZvbnRTaXplLFxuICAgIGZvbnRXZWlnaHQ6IGNzc1Byb3BlcnRpZXMuZm9udFdlaWdodCxcbiAgICBmb250U3R5bGU6IGNzc1Byb3BlcnRpZXMuZm9udFN0eWxlLFxuICAgIHRleHREZWNvcmF0aW9uOiBjc3NQcm9wZXJ0aWVzLnRleHREZWNvcmF0aW9uLFxuICAgIGNvbG9yOiBjc3NQcm9wZXJ0aWVzLmNvbG9yLFxuICB9O1xufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgZXh0ZXJuYWwgV29ya3NoZWV0Q29udGVudCBuYW1lc3BhY2UuXG4gKiBUaGlzIGRvZXMgbm90IGZvbGxvdyB0aGUgSW1wbCBwYXR0ZXJuIGFzIFdvcmtzaGVldENvbnRlbnQgaXNcbiAqIGN1cnJlbnRseSBqdXN0IGEgKHNpbmdsZSkgcHJvcGVydHkgYmFnLlxuICovXG5leHBvcnQgY2xhc3MgV29ya3NoZWV0Q29udGVudCBpbXBsZW1lbnRzIENvbnRyYWN0LldvcmtzaGVldENvbnRlbnQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfd29ya3NoZWV0OiBDb250cmFjdC5FeHRlbnNpb25Xb3Jrc2hlZXQpIHt9XG5cbiAgcHVibGljIGdldCB3b3Jrc2hlZXQoKTogQ29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0O1xuICB9XG59XG4iLCJpbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgRXh0ZW5zaW9uQm9vdHN0cmFwSW5mbywgUGFyYW1ldGVySWQsIFZlcmJJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9FeHRlbnNpb25zU2VydmljZU5hbWVzJztcbmltcG9ydCB7IEluaXRpYWxpemF0aW9uU2VydmljZSB9IGZyb20gJy4uL0luaXRpYWxpemF0aW9uU2VydmljZSc7XG5cbmV4cG9ydCBjbGFzcyBJbml0aWFsaXphdGlvblNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgSW5pdGlhbGl6YXRpb25TZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBFeHRlbnNpb25zU2VydmljZU5hbWVzLkluaXRpYWxpemF0aW9uU2VydmljZTtcbiAgfVxuXG4gIHB1YmxpYyBpbml0aWFsaXplRGFzaGJvYXJkRXh0ZW5zaW9uc0FzeW5jKGlzRXh0ZW5zaW9uRGlhbG9nOiBib29sZWFuLCBjb250ZXh0TWVudUlkczogc3RyaW5nW10pOiBQcm9taXNlPEV4dGVuc2lvbkJvb3RzdHJhcEluZm8+IHtcbiAgICBjb25zdCBwYXJhbXM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdpbml0aWFsaXplRGFzaGJvYXJkRXh0ZW5zaW9uc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5FeHRlbnNpb25Db250ZXh0TWVudUlkc106IGNvbnRleHRNZW51SWRzLFxuICAgICAgW1BhcmFtZXRlcklkLklzRXh0ZW5zaW9uRGlhbG9nXTogaXNFeHRlbnNpb25EaWFsb2csXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkluaXRpYWxpemVFeHRlbnNpb24sIHBhcmFtcykudGhlbjxFeHRlbnNpb25Cb290c3RyYXBJbmZvPigocmVzcG9uc2UpID0+IHtcbiAgICAgIC8vIFRPRE8gLSBWYWxpZGF0ZSByZXR1cm4gdmFsdWVcblxuICAgICAgY29uc3QgcmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0IGFzIEV4dGVuc2lvbkJvb3RzdHJhcEluZm87XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBFcnJvckNvZGVzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBFeHRlbnNpb25TZXR0aW5nc0luZm8sIFBhcmFtZXRlcklkLCBWZXJiSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlLCBUYWJsZWF1RXJyb3IgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9FeHRlbnNpb25zU2VydmljZU5hbWVzJztcbmltcG9ydCB7IFNldHRpbmdzQ29sbGVjdGlvbiwgU2V0dGluZ3NTZXJ2aWNlIH0gZnJvbSAnLi4vU2V0dGluZ3NTZXJ2aWNlJztcblxuZXhwb3J0IGNsYXNzIFNldHRpbmdzU2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBTZXR0aW5nc1NlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMuU2V0dGluZ3NTZXJ2aWNlO1xuICB9XG5cbiAgcHVibGljIHNhdmVTZXR0aW5nc0FzeW5jKHNldHRpbmdzOiBTZXR0aW5nc0NvbGxlY3Rpb24pOiBQcm9taXNlPFNldHRpbmdzQ29sbGVjdGlvbj4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdzYXZlU2V0dGluZ3NBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuU2V0dGluZ3NWYWx1ZXNdOiBzZXR0aW5ncyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuU2F2ZUV4dGVuc2lvblNldHRpbmdzLCBwYXJhbWV0ZXJzKS50aGVuPFNldHRpbmdzQ29sbGVjdGlvbj4oKHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSB2YWx1ZS5yZXN1bHQgYXMgRXh0ZW5zaW9uU2V0dGluZ3NJbmZvO1xuXG4gICAgICBpZiAoIXJlc3VsdCB8fCAhcmVzdWx0LnNldHRpbmdzVmFsdWVzKSB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnVW5leHBlY3RlZCBlcnJvciBzYXZpbmdzIHNldHRpbmdzLicpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0LnNldHRpbmdzVmFsdWVzO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBEaWFsb2dPcHRpb25zLCBEaWFsb2dTdHlsZSwgRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgRXh0ZW5zaW9uRGlhbG9nUmVzdWx0LCBQYXJhbWV0ZXJJZCwgVmVyYklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEVycm9ySGVscGVycywgRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzLCBTZXJ2aWNlSW1wbEJhc2UsIFRhYmxlYXVFcnJvciB9IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcyB9IGZyb20gJy4uL0V4dGVuc2lvbnNTZXJ2aWNlTmFtZXMnO1xuaW1wb3J0IHsgVUlTZXJ2aWNlIH0gZnJvbSAnLi4vVUlTZXJ2aWNlJztcblxuY29uc3QgREVGQVVMVF9ESUFMT0dfSEVJR0hUID0gNDAwOyAvLyBpbiBwaXhlbHNcbmNvbnN0IERFRkFVTFRfRElBTE9HX1dJRFRIID0gNjAwOyAvLyBpbiBwaXhlbHNcbmNvbnN0IERFRkFVTFRfRElBTE9HX1NUWUxFOiBEaWFsb2dTdHlsZSA9IERpYWxvZ1N0eWxlLldpbmRvdztcblxuZXhwb3J0IGNsYXNzIFVJU2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBVSVNlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMuVUlTZXJ2aWNlO1xuICB9XG5cbiAgcHVibGljIGRpc3BsYXlEaWFsb2dBc3luYyh1cmw6IHN0cmluZywgcGF5bG9hZDogc3RyaW5nLCBvcHRpb25zPzogRGlhbG9nT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdkaXNwbGF5RGlhbG9nQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkV4dGVuc2lvbkRpYWxvZ1VybF06IHVybCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5FeHRlbnNpb25EaWFsb2dQYXlsb2FkXTogcGF5bG9hZCxcbiAgICB9O1xuXG4gICAgY29uc3QgaDogbnVtYmVyID0gb3B0aW9ucyAmJiBvcHRpb25zLmhlaWdodCA/IG9wdGlvbnMuaGVpZ2h0IDogREVGQVVMVF9ESUFMT0dfSEVJR0hUO1xuICAgIGNvbnN0IHc6IG51bWJlciA9IG9wdGlvbnMgJiYgb3B0aW9ucy53aWR0aCA/IG9wdGlvbnMud2lkdGggOiBERUZBVUxUX0RJQUxPR19XSURUSDtcbiAgICBjb25zdCBkaWFsb2dTdHlsZTogRGlhbG9nU3R5bGUgPSBvcHRpb25zICYmIG9wdGlvbnMuZGlhbG9nU3R5bGUgPyBvcHRpb25zLmRpYWxvZ1N0eWxlIDogREVGQVVMVF9ESUFMT0dfU1RZTEU7XG5cbiAgICAvLyBPbiB0aGUgcGxhdGZvcm0gc2lkZSwgd2UgZG8gc29tZXRoaW5nIHJlYXNvbmFibGUgcmVnYXJkZXNzIG9mIHdoZXRoZXIgdGhlIHBhc3NlZFxuICAgIC8vIGhlaWdodCBhbmQgd2lkdGggYXJlIHRvbyBsYXJnZSBvciB0b28gc21hbGwuICBCdXQgdGhpcyBsaWtlbHkgaW5kaWNhdGVzIGEgZGV2ZWxvcGVyIGVycm9yLFxuICAgIC8vIHNvIHdlIHRocm93IGFuIGVycm9yIGhlcmUgdG8gaGVscCB3aXRoIGRlYnVnZ2luZy5cbiAgICBpZiAoaCA8PSAwIHx8IHcgPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsICdTaXplIHBhcmFtZXRlcnMgZm9yIGRpc3BsYXlEaWFsb2dBc3luYyBtdXN0IGJlIHBvc2l0aXZlJyk7XG4gICAgfVxuXG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5FeHRlbnNpb25EaWFsb2dIXSA9IGg7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5FeHRlbnNpb25EaWFsb2dXXSA9IHc7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUVudW1WYWx1ZTxEaWFsb2dTdHlsZT4oZGlhbG9nU3R5bGUsIERpYWxvZ1N0eWxlLCAnRGlhbG9nU3R5bGUnKTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkV4dGVuc2lvbkRpYWxvZ1N0eWxlXSA9IEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncy5kaWFsb2dTdHlsZXMuY29udmVydChkaWFsb2dTdHlsZSk7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5EaXNwbGF5RGlhbG9nLCBwYXJhbWV0ZXJzKS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgZGlhbG9nUmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0IGFzIEV4dGVuc2lvbkRpYWxvZ1Jlc3VsdDtcbiAgICAgIHN3aXRjaCAoZGlhbG9nUmVzdWx0KSB7XG4gICAgICAgIGNhc2UgRXh0ZW5zaW9uRGlhbG9nUmVzdWx0LkRpYWxvZ0FscmVhZHlPcGVuOlxuICAgICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5EaWFsb2dBbHJlYWR5T3BlbiwgJ1RoZXJlIGFscmVhZHkgZXhpc3RzIGFuIG9wZW4gZGlhbG9nIGZvciB0aGlzIGV4dGVuc2lvbi4nKTtcbiAgICAgICAgY2FzZSBFeHRlbnNpb25EaWFsb2dSZXN1bHQuSW52YWxpZERvbWFpbjpcbiAgICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgICAgICAgRXJyb3JDb2Rlcy5JbnZhbGlkRG9tYWluRGlhbG9nLFxuICAgICAgICAgICAgJ1RoZSB1cmwgb2YgYW4gZXh0ZW5zaW9uIGRpYWxvZyBtdXN0IG1hdGNoIHRoZSBkb21haW4gb2YgdGhlIHBhcmVudCBleHRlbnNpb24uJyxcbiAgICAgICAgICApO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIFN1Y2Nlc3MgY2FzZVxuICAgICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBjbG9zZURpYWxvZyhwYXlsb2FkPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2Nsb3NlRGlhbG9nJyxcbiAgICB9O1xuXG4gICAgaWYgKHBheWxvYWQpIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRXh0ZW5zaW9uRGlhbG9nUGF5bG9hZF0gPSBwYXlsb2FkO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkNsb3NlRGlhbG9nLCBwYXJhbWV0ZXJzKS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIHNlbmREaWFsb2dNZXNzYWdlQXN5bmMobWVzc2FnZTogc3RyaW5nLCB0YXJnZXREaWFsb2dVcmw/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnc2VuZERpYWxvZ01lc3NhZ2UnLFxuICAgICAgW1BhcmFtZXRlcklkLkV4dGVuc2lvbkRpYWxvZ01lc3NhZ2VdOiBtZXNzYWdlLFxuICAgIH07XG5cbiAgICBpZiAodGFyZ2V0RGlhbG9nVXJsKSB7XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkV4dGVuc2lvbkRpYWxvZ1VybF0gPSB0YXJnZXREaWFsb2dVcmw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuU2VuZERpYWxvZ01lc3NhZ2UsIHBhcmFtZXRlcnMpLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNldENsaWNrVGhyb3VnaEFzeW5jKGNsaWNrVGhyb3VnaEVuYWJsZWQ6IGJvb2xlYW4sIGV4dGVuc2lvblpvbmVJZDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlclR5cGUoY2xpY2tUaHJvdWdoRW5hYmxlZCwgJ2Jvb2xlYW4nLCAnY2xpY2tUaHJvdWdoRW5hYmxlZCcpO1xuXG4gICAgaWYgKGV4dGVuc2lvblpvbmVJZCA9PT0gdW5kZWZpbmVkIHx8IGV4dGVuc2lvblpvbmVJZCA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ0V4dGVuc2lvbiBJZCBpcyBpbnZhbGlkLicpO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkV4dGVuc2lvblpvbmVJZF06IGV4dGVuc2lvblpvbmVJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5DbGlja1Rocm91Z2hFbmFibGVkXTogY2xpY2tUaHJvdWdoRW5hYmxlZCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuU2V0Q2xpY2tUaHJvdWdoLCBwYXJhbWV0ZXJzKS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgSW50ZXJuYWxBcGlEaXNwYXRjaGVyIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEFwaVNlcnZpY2VSZWdpc3RyeSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgSW5pdGlhbGl6YXRpb25TZXJ2aWNlSW1wbCB9IGZyb20gJy4vSW1wbC9Jbml0aWFsaXphdGlvblNlcnZpY2VJbXBsJztcbmltcG9ydCB7IFNldHRpbmdzU2VydmljZUltcGwgfSBmcm9tICcuL0ltcGwvU2V0dGluZ3NTZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBVSVNlcnZpY2VJbXBsIH0gZnJvbSAnLi9JbXBsL1VJU2VydmljZUltcGwnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQgfSBmcm9tICcuL1NlcnZpY2VSZWdpc3RyeVV0aWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJBbGxFeHRlbnNpb25zU2VydmljZXMoZGlzcGF0Y2hlcjogSW50ZXJuYWxBcGlEaXNwYXRjaGVyKTogdm9pZCB7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgU2V0dGluZ3NTZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCBFeHRlbnNpb25zUmVnaXN0cnlJZCkpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IFVJU2VydmljZUltcGwoZGlzcGF0Y2hlciwgRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVySW5pdGlhbGl6YXRpb25FeHRlbnNpb25zU2VydmljZXMoZGlzcGF0Y2hlcjogSW50ZXJuYWxBcGlEaXNwYXRjaGVyKTogdm9pZCB7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgSW5pdGlhbGl6YXRpb25TZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCBFeHRlbnNpb25zUmVnaXN0cnlJZCkpO1xufVxuIiwiZXhwb3J0IGNvbnN0IEV4dGVuc2lvbnNSZWdpc3RyeUlkID0gMDtcbiIsIi8vIFRoaXMgZmlsZSByZS1leHBvcnRzIGV2ZXJ5dGhpbmcgd2hpY2ggaXMgcGFydCBvZiB0aGUgZXh0ZW5zaW9ucyBhcGkgcHVibGljIGludGVyZmFjZVxuXG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL0Fza0RhdGFJbnRlcmZhY2VzJztcbmV4cG9ydCB7XG4gIEFwaU1lbnVUeXBlLFxuICBDcm9zc3RhYkZpbGVGb3JtYXQsXG4gIERldmljZVR5cGUsXG4gIEVtYmVkZGluZ0Vycm9yQ29kZXMsXG4gIFRhYmxlYXVFdmVudFR5cGUgYXMgRW1iZWRkaW5nVGFibGVhdUV2ZW50VHlwZSxcbiAgRmlsZUZvcm1hdHMsXG4gIFByaW50T3JpZW50YXRpb24sXG4gIFByaW50UGFnZVNpemUsXG4gIFByaW50U2NhbGluZyxcbiAgUHVsc2VFcnJvck1lc3NhZ2VWaXNpYmlsaXR5LFxuICBQdWxzZUxheW91dCxcbiAgUHVsc2VUaW1lRGltZW5zaW9uLFxuICBTaGVldFNpemVCZWhhdmlvcixcbiAgVGFibGVhdURpYWxvZ1R5cGUsXG4gIFRvb2xiYXIsXG59IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvRW51bXMnO1xuZXhwb3J0IHtcbiAgQ3VzdG9tVmlld0V2ZW50LFxuICBDdXN0b21NYXJrQ29udGV4dE1lbnVFdmVudCBhcyBFbWJlZGRpbmdDdXN0b21NYXJrQ29udGV4dE1lbnVFdmVudCxcbiAgRmlsdGVyQ2hhbmdlZEV2ZW50IGFzIEVtYmVkZGluZ0ZpbHRlckNoYW5nZWRFdmVudCxcbiAgTWFya3NTZWxlY3RlZEV2ZW50IGFzIEVtYmVkZGluZ01hcmtTZWxlY3RlZEV2ZW50LFxuICBQYXJhbWV0ZXJDaGFuZ2VkRXZlbnQgYXMgRW1iZWRkaW5nUGFyYW1ldGVyQ2hhbmdlZEV2ZW50LFxuICBTdW1tYXJ5RGF0YUNoYW5nZWRFdmVudCBhcyBFbWJlZGRpbmdTdW1tYXJ5RGF0YUNoYW5nZWRFdmVudCxcbiAgVGFibGVhdVNoZWV0RXZlbnQgYXMgRW1iZWRkaW5nVGFibGVhdVNoZWV0RXZlbnQsXG4gIFRhYmxlYXVXb3Jrc2hlZXRFdmVudCBhcyBFbWJlZGRpbmdUYWJsZWF1V29ya3NoZWV0RXZlbnQsXG4gIFRvb2xiYXJTdGF0ZUNoYW5nZWRFdmVudCBhcyBFbWJlZGRpbmdUb29sYmFyU3RhdGVDaGFuZ2VkRXZlbnQsXG4gIEZpcnN0UHVsc2VNZXRyaWNTaXplS25vd25FdmVudCxcbiAgRmlyc3RWaXpTaXplS25vd25FdmVudCxcbiAgUHVsc2VFcnJvckV2ZW50LFxuICBQdWxzZUZpbHRlcnNDaGFuZ2VkRXZlbnQsXG4gIFB1bHNlTWV0cmljU2l6ZUNoYW5nZWRFdmVudCxcbiAgUHVsc2VJbnNpZ2h0RGlzY292ZXJlZEV2ZW50LFxuICBQdWxzZVRpbWVEaW1lbnNpb25DaGFuZ2VkRXZlbnQsXG4gIFB1bHNlVXJsQ2hhbmdlZEV2ZW50LFxuICBTdG9yeVBvaW50U3dpdGNoZWRFdmVudCxcbiAgVGFiU3dpdGNoZWRFdmVudCxcbiAgVXJsQWN0aW9uRXZlbnQsXG4gIFZpekxvYWRFcnJvckV2ZW50LFxuICBXb3JrYm9va1B1Ymxpc2hlZEFzRXZlbnQsXG59IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvRXZlbnRJbnRlcmZhY2VzJztcbmV4cG9ydCB7IFBhcmFtZXRlciBhcyBFbWJlZGRpbmdQYXJhbWV0ZXIgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1BhcmFtZXRlckludGVyZmFjZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0VtYmVkZGluZy9QdWxzZUludGVyZmFjZXMnO1xuZXhwb3J0IHtcbiAgQ29udGV4dE1lbnVPcHRpb25zLFxuICBFbWJlZGRpbmdBYnN0cmFjdFF1ZXJ5LFxuICBBdXRob3JpbmdXb3Jrc2hlZXQgYXMgRW1iZWRkaW5nQXV0aG9yaW5nV29ya3NoZWV0LFxuICBEYXNoYm9hcmQgYXMgRW1iZWRkaW5nRGFzaGJvYXJkLFxuICBEYXNoYm9hcmRPYmplY3QgYXMgRW1iZWRkaW5nRGFzaGJvYXJkT2JqZWN0LFxuICBTaGVldCBhcyBFbWJlZGRpbmdTaGVldCxcbiAgRW1iZWRkaW5nVml6U3RhdGVXaXRoRGF0YU1vZGVsLFxuICBXb3Jrc2hlZXQgYXMgRW1iZWRkaW5nV29ya3NoZWV0LFxuICBIaWVyYXJjaGljYWxMZXZlbHMsXG4gIFNoZWV0SW5mbyxcbiAgU2hlZXRTaXplLFxufSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1NoZWV0SW50ZXJmYWNlcyc7XG5leHBvcnQgeyBTdG9yeSwgU3RvcnlQb2ludCwgU3RvcnlQb2ludEluZm8gfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1N0b3J5SW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1RhYmxlYXVFcnJvcic7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1ZpekludGVyZmFjZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0VtYmVkZGluZy9XZWJDb21wb25lbnRJbnRlcmZhY2VzJztcbmV4cG9ydCB7XG4gIEN1c3RvbVZpZXcsXG4gIEF1dGhvcmluZ1dvcmtib29rIGFzIEVtYmVkZGluZ0F1dGhvcmluZ1dvcmtib29rLFxuICBXb3JrYm9vayBhcyBFbWJlZGRpbmdXb3JrYm9vayxcbn0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0VtYmVkZGluZy9Xb3JrYm9va0ludGVyZmFjZSc7XG5leHBvcnQgKiBmcm9tICcuL1NoYXJlZEFwaUV4dGVybmFsQ29udHJhY3QnO1xuIiwiLy8gVGhpcyBmaWxlIHJlLWV4cG9ydHMgZXZlcnl0aGluZyB3aGljaCBpcyBwYXJ0IG9mIHRoZSBleHRlbnNpb25zIGFwaSBwdWJsaWMgaW50ZXJmYWNlXG5cbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FeHRlbnNpb25zL0V2ZW50SW50ZXJmYWNlJztcbmV4cG9ydCB7IERhc2hib2FyZENvbnRlbnQgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9OYW1lc3BhY2VzL0Rhc2hib2FyZENvbnRlbnQnO1xuZXhwb3J0IHsgRW52aXJvbm1lbnQgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9OYW1lc3BhY2VzL0Vudmlyb25tZW50JztcbmV4cG9ydCB7IEV4dGVuc2lvbnMgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9OYW1lc3BhY2VzL0V4dGVuc2lvbnMnO1xuZXhwb3J0IHsgU2V0dGluZ3MgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9OYW1lc3BhY2VzL1NldHRpbmdzJztcbmV4cG9ydCB7XG4gIEVycm9yQ29kZXMsXG4gIEV4dGVuc2lvbkNvbnRleHQsXG4gIEV4dGVuc2lvbk1vZGUsXG4gIFRhYmxlYXVFdmVudFR5cGUsXG4gIFZpekltYWdlRW5jb2RpbmdUeXBlLFxuICBWaXpJbWFnZVBhbGV0dGVUeXBlLFxuICBWaXpJbWFnZVNpemVTZXR0aW5nQWxpZ25tZW50VHlwZSxcbiAgVml6SW1hZ2VTaXplU2V0dGluZ1R5cGUsXG4gIFZpekltYWdlU29ydERpcmVjdGlvblR5cGUsXG59IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FeHRlbnNpb25zL05hbWVzcGFjZXMvVGFibGVhdSc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9OYW1lc3BhY2VzL1VJJztcbmV4cG9ydCB7IFdvcmtzaGVldENvbnRlbnQgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9OYW1lc3BhY2VzL1dvcmtzaGVldENvbnRlbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0V4dGVuc2lvbnMvUGFyYW1ldGVySW50ZXJmYWNlcyc7XG5leHBvcnQge1xuICBEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUsXG4gIERhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUFycmF5LFxuICBEYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5TWFwLFxuICBEYXNoYm9hcmQgYXMgRXh0ZW5zaW9uRGFzaGJvYXJkLFxuICBEYXNoYm9hcmRPYmplY3QgYXMgRXh0ZW5zaW9uRGFzaGJvYXJkT2JqZWN0LFxuICBTaGVldCBhcyBFeHRlbnNpb25TaGVldCxcbiAgV29ya3NoZWV0IGFzIEV4dGVuc2lvbldvcmtzaGVldCxcbiAgUG9pbnQsXG4gIFpvbmVWaXNpYmlsaXR5TWFwLFxufSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9TaGVldEludGVyZmFjZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0V4dGVuc2lvbnMvVGFibGVhdUVycm9yJztcbmV4cG9ydCB7IFdvcmtib29rIGFzIEV4dGVuc2lvbldvcmtib29rIH0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0V4dGVuc2lvbnMvV29ya2Jvb2tJbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vU2hhcmVkQXBpRXh0ZXJuYWxDb250cmFjdCc7XG4iLCIvKipcbiAqIFRoaXMgaXMgeW91ciBtYWluLiBUaGlzIGlzIHdoZXJlIHlvdSByZS1leHBvcnQgZXZlcnl0aGluZyB5b3Ugd2FudCB0byBiZSBwdWJsaWNseSBhdmFpbGFibGUuXG4gKlxuICogVGhlIGJ1aWxkIGVuZm9yY2VzIHRoYXQgdGhlIGZpbGUgaGFzIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGdsb2JhbCB2YXJpYWJsZSB0aGF0IGlzIGV4cG9ydGVkLlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vRW1iZWRkaW5nQXBpRXh0ZXJuYWxDb250cmFjdCc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVuc2lvbnNBcGlFeHRlcm5hbENvbnRyYWN0JztcbiIsImltcG9ydCB7IFdlYkNvbXBvbmVudExvY2FsU2V0dGluZ3MsIFdlYkNvbXBvbmVudFNldHRpbmdzU2hhcmVkIH0gZnJvbSAnLi9XZWJDb21wb25lbnRJbnRlcmZhY2VzJztcblxuLyoqXG4gKiBUaGUgbmFtZXMgb2YgdGhlIHN0cmluZyBjb25zdGFudHMgeW91IGNhbiB1c2UgYXMgSFRNTCBhdHRyaWJ1dGVzIGZvciB0aGUgPHRhYmxlYXUtYXNrLWRhdGE+IHdlYiBjb21wb25lbnQuXG4gKiBAaWdub3JlXG4gKiBAZGVwcmVjYXRlZFxuICovXG5leHBvcnQgZW51bSBBc2tEYXRhQXR0cmlidXRlcyB7XG4gIE9yaWdpbiA9ICdvcmlnaW4nLFxuICBTaG93RW1iZWQgPSAnc2hvdy1lbWJlZCcsXG4gIFNob3dQaW4gPSAnc2hvdy1waW4nLFxuICBTaG93U2F2ZSA9ICdzaG93LXNhdmUnLFxuICBTaG93U2hhcmUgPSAnc2hvdy1zaGFyZScsXG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc2tEYXRhU2V0dGluZ3MgZXh0ZW5kcyBXZWJDb21wb25lbnRTZXR0aW5nc1NoYXJlZCwgV2ViQ29tcG9uZW50TG9jYWxTZXR0aW5ncyB7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZW1iZWQgYnV0dG9uIGlzIGhpZGRlbiBvciB2aXNpYmxlLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtYXNrLWRhdGEgaWQ9XCJ0YWJsZWF1QXNrRGF0YVwiIHNob3ctZW1iZWQ+XG4gICAqIGBgYFxuICAgKi9cbiAgc2hvd0VtYmVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHBpbiBidXR0b24gaXMgaGlkZGVuIG9yIHZpc2libGUuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS1hc2stZGF0YSBpZD1cInRhYmxlYXVBc2tEYXRhXCIgc2hvdy1waW4+XG4gICAqIGBgYFxuICAgKi9cbiAgc2hvd1Bpbj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzYXZlIGJ1dHRvbiBpcyBoaWRkZW4gb3IgdmlzaWJsZS5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LWFzay1kYXRhIGlkPVwidGFibGVhdUFza0RhdGFcIiBzaG93LXNhdmU+XG4gICAqIGBgYFxuICAgKi9cbiAgc2hvd1NhdmU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgc2hhcmUgYnV0dG9uIGlzIGhpZGRlbiBvciB2aXNpYmxlLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtYXNrLWRhdGEgaWQ9XCJ0YWJsZWF1QXNrRGF0YVwiIHNob3ctc2hhcmU+XG4gICAqIGBgYFxuICAgKi9cbiAgc2hvd1NoYXJlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogIFVzZWQgZm9yIHRlbGVtZXRyeVxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtYXNrLWRhdGEgaWQ9XCJ0YWJsZWF1QXNrRGF0YVwiIG9yaWdpbj1cImVtYmVkZGluZ1NpdGVcIj5cbiAgICogYGBgXG4gICAqL1xuICBvcmlnaW4/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIGludGVyZmFjZSBmb3IgdGhlIHRvcCBsZXZlbCBBc2tEYXRhIG9iamVjdC5cbiAqIEBkZXByZWNhdGVkXG4gKiovXG5leHBvcnQgaW50ZXJmYWNlIEFza0RhdGEgZXh0ZW5kcyBBc2tEYXRhU2V0dGluZ3Mge31cbiIsIi8vIEFsbCBlbnVtIHZhbHVlcyBtYWRlIGF2YWlsYWJsZSB0byBFbWJlZGRpbmcgZGV2ZWxvcGVycy5cbi8vIEVudW1zIHNob3VsZCBiZSBrZXB0IGluIGFscGhhYmV0aWNhbCBvcmRlci5cbi8vIE1vc3Qgb2YgdGhlbSBzaG91bGQgbWF0Y2ggYW4gZW51bSBvbiB0aGUgc2VydmVyIGRlZmluZWQgYXRcbi8vIHdvcmtncm91cC92cWx3ZWIvc2NyaXB0c2hhcnAvc3JjL0FwaVNoYXJlZC9QdWJsaWNFbnVtcy5jcyNMMzk4OjE3XG5cbi8qKlxuICogQ3Jvc3N0YWIgZmlsZSBmb3JtYXRzIGF2YWlsYWJsZSB0byB1c2Ugd2l0aCB7QGxpbmsgVml6LmV4cG9ydENyb3NzdGFiQXN5bmN9XG4gKi9cbmV4cG9ydCBlbnVtIENyb3NzdGFiRmlsZUZvcm1hdCB7XG4gIENTViA9ICdjc3YnLFxuICBFeGNlbCA9ICd4bHN4Jyxcbn1cblxuLyoqXG4gKiBEZXZpY2UgdHlwZXMgYXZhaWxhYmxlIHRvIHVzZSB3aXRoIHtAbGluayBWaXouZGV2aWNlfVxuICovXG5leHBvcnQgZW51bSBEZXZpY2VUeXBlIHtcbiAgRGVmYXVsdCA9ICdkZWZhdWx0JyxcbiAgRGVza3RvcCA9ICdkZXNrdG9wJyxcbiAgVGFibGV0ID0gJ3RhYmxldCcsXG4gIFBob25lID0gJ3Bob25lJyxcbn1cblxuLyoqXG4gKiBBbGwgZXJyb3IgY29kZXMgdXNlZCBieSB0aGUgRW1iZWRkaW5nIEFQSS5cbiAqL1xuZXhwb3J0IGVudW0gRW1iZWRkaW5nRXJyb3JDb2RlcyB7XG4gIC8qKlxuICAgKiBSYWlzZWQgd2hlbiBhIHJlcXVlc3QgdG8gdGhlIGF1dGggZW5kcG9pbnQgZmFpbHMuXG4gICAqL1xuICBBdXRoRmFpbGVkID0gJ2F1dGgtZmFpbGVkJyxcbiAgLyoqXG4gICAqIFRoZSBicm93c2VyIGlzIG5vdCBjYXBhYmxlIG9mIHN1cHBvcnRpbmcgdGhlIFRhYmxlYXUgRW1iZWRkaW5nIEFQSVxuICAgKi9cbiAgQnJvd3Nlck5vdENhcGFibGUgPSAnYnJvd3Nlci1ub3QtY2FwYWJsZScsXG4gIC8qKlxuICAgKiBUaGUgcGVybWlzc2lvbnMgb24gYSB3b3JrYm9vayBvciBhIHZpZXcgZG8gbm90IGFsbG93IGRvd25sb2FkaW5nIHRoZSB3b3JrYm9vay5cbiAgICovXG4gIERvd25sb2FkV29ya2Jvb2tOb3RBbGxvd2VkID0gJ2Rvd25sb2FkLXdvcmtib29rLW5vdC1hbGxvd2VkJyxcbiAgLyoqXG4gICAqIFRocm93biB3aGVuIGFuIGVycm9yIG9jY3VycyB3aGlsZSBhdHRlbXB0aW5nIHRvIHBlcmZvcm0gYSBmaWx0ZXIgb3BlcmF0aW9uLlxuICAgKi9cbiAgRmlsdGVyQ2Fubm90QmVQZXJmb3JtZWQgPSAnZmlsdGVyLWNhbm5vdC1iZS1wZXJmb3JtZWQnLFxuICAvKipcbiAgICogVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBzd2l0Y2ggdG8gYSBzaGVldCBieSBpbmRleCB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSB3b3JrYm9vay5cbiAgICovXG4gIEluZGV4T3V0T2ZSYW5nZSA9ICdpbmRleC1vdXQtb2YtcmFuZ2UnLFxuICAvKipcbiAgICogVGhyb3duIHdoZW4gYW4gZXJyb3Igb2NjdXJzIHdpdGhpbiB0aGUgVGFibGVhdSBFbWJlZGRpbmcgQVBJLiBDb250YWN0IFRhYmxlYXUgU3VwcG9ydC5cbiAgICovXG4gIEludGVybmFsRXJyb3IgPSAnaW50ZXJuYWwtZXJyb3InLFxuICAvKipcbiAgICogQW4gb3BlcmF0aW9uIHdhcyBhdHRlbXB0ZWQgb24gYSBjdXN0b20gdmlldyB0aGF0IGRvZXMgbm90IGV4aXN0LlxuICAgKi9cbiAgSW52YWxpZEN1c3RvbVZpZXdOYW1lID0gJ2ludmFsaWQtY3VzdG9tLXZpZXctbmFtZScsXG4gIC8qKlxuICAgKiBBbiBpbnZhbGlkIGRhdGUgd2FzIHNwZWNpZmllZCBpbiBhIG1ldGhvZCB0aGF0IHJlcXVpcmVkIGEgZGF0ZSBwYXJhbWV0ZXIuXG4gICAqL1xuICBJbnZhbGlkRGF0ZVBhcmFtZXRlciA9ICdpbnZhbGlkLWRhdGUtcGFyYW1ldGVyJyxcbiAgLyoqXG4gICAqIEVpdGhlciBhIGZpbHRlciBvcGVyYXRpb24gd2FzIGF0dGVtcHRlZCBvbiBhIGZpZWxkIHRoYXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGRhdGEgc291cmNlLCBvciB0aGUgdmFsdWUgc3VwcGxpZWRcbiAgICogaW4gdGhlIGZpbHRlciBvcGVyYXRpb24gaXMgdGhlIHdyb25nIGRhdGEgdHlwZSBvciBmb3JtYXQuXG4gICAqL1xuICBpbnZhbGlkRmlsdGVyRmllbGROYW1lT3JWYWx1ZSA9ICdpbnZhbGlkLWZpbHRlci1maWVsZC1uYW1lJyxcbiAgLyoqXG4gICAqIEEgcGFyYW1ldGVyIGlzIG5vdCB0aGUgY29ycmVjdCBkYXRhIHR5cGUgb3IgZm9ybWF0LiBUaGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCBpbiB0aGUgRXJyb3IubWVzc2FnZVxuICAgKiBmaWVsZC5cbiAgICovXG4gIEludmFsaWRQYXJhbWV0ZXIgPSAnaW52YWxpZC1wYXJhbWV0ZXInLFxuICAvKipcbiAgICogVGhlIGN1cnJlbnRseSBhcHBsaWVkIHRpbWUgZGltZW5zaW9uIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkIG9yIGlzIGludmFsaWQuXG4gICAqL1xuICBJbnZhbGlkVGltZURpbWVuc2lvbiA9ICdpbnZhbGlkLXRpbWUtZGltZW5zaW9uJyxcbiAgLyoqXG4gICAqIEEgbmVnYXRpdmUgc2l6ZSB3YXMgc3BlY2lmaWVkIG9yIHRoZSBtYXhTaXplIHZhbHVlIGlzIGxlc3MgdGhhbiBtaW5TaXplIGluIFNoZWV0LmNoYW5nZVNpemVBc3luYygpLlxuICAgKi9cbiAgSW52YWxpZFNpemUgPSAnaW52YWxpZC1zaXplJyxcbiAgLyoqXG4gICAqIEF0dGVtcHRlZCB0byBnZXQgYW4gYXV0aG9yaW5nIHdvcmtzaGVldCB3aGVuIHRoZSBjdXJyZW50IHNoZWV0IGlzIG5vdCBhIHdvcmtzaGVldC5cbiAgICogQGlnbm9yZVxuICAgKi9cbiAgSW52YWxpZFNoZWV0VHlwZSA9ICdpbnZhbGlkLXNoZWV0LXR5cGUnLFxuICAvKipcbiAgICogQSBiZWhhdmlvciB2YWx1ZSB3YXMgZm91bmQgdGhhdCBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIFNoZWV0U2l6ZUJlaGF2aW9yIGVudW0uXG4gICAqL1xuICBJbnZhbGlkU2l6ZUJlaGF2aW9yID0gJ2ludmFsaWQtc2l6ZS1iZWhhdmlvcicsXG4gIC8qKlxuICAgKiBBIGJlaGF2aW9yIG90aGVyIHRoYW4gU2hlZXRTaXplQmVoYXZpb3IuQXV0b21hdGljIHdhcyBzcGVjaWZpZWQgaW4gU2hlZXQuY2hhbmdlU2l6ZUFzeW5jKCkgd2hlbiB0aGUgc2hlZXQgaXMgYVxuICAgKiBXb3Jrc2hlZXQgaW5zdGFuY2UuXG4gICAqL1xuICBJbnZhbGlkU2l6ZUJlaGF2aW9yT25Xb3Jrc2hlZXQgPSAnaW52YWxpZC1zaXplLWJlaGF2aW9yLW9uLXdvcmtzaGVldCcsXG4gIC8qKlxuICAgKiBUaGUgVVJMIHNwZWNpZmllZCBpbiB0aGUgVml6IGNsYXNzIGNvbnN0cnVjdG9yIGlzIG5vdCB2YWxpZC5cbiAgICovXG4gIEludmFsaWRVcmwgPSAnaW52YWxpZC11cmwnLFxuICAvKipcbiAgICogVGhlIG1heFNpemUgZmllbGQgaXMgbWlzc2luZyBpbiBTaGVldC5jaGFuZ2VTaXplQXN5bmMoKSB3aGVuIHNwZWNpZnlpbmcgU2hlZXRTaXplQmVoYXZpb3IuQXRNb3N0LlxuICAgKi9cbiAgTWlzc2luZ01heFNpemUgPSAnbWlzc2luZy1tYXgtc2l6ZScsXG4gIC8qKlxuICAgKiBUaGUgbWluU2l6ZSBmaWVsZCBpcyBtaXNzaW5nIGluIFNoZWV0LmNoYW5nZVNpemVBc3luYygpIHdoZW4gc3BlY2lmeWluZyBTaGVldFNpemVCZWhhdmlvci5BdExlYXN0LlxuICAgKi9cbiAgTWlzc2luZ01pblNpemUgPSAnbWlzc2luZy1taW4tc2l6ZScsXG4gIC8qKlxuICAgKiBUaGUgbWluU2l6ZSBvciBtYXhTaXplIGZpZWxkIGlzIG1pc3NpbmcgaW4gU2hlZXQuY2hhbmdlU2l6ZUFzeW5jKCkgd2hlbiBzcGVjaWZ5aW5nIFNoZWV0U2l6ZUJlaGF2aW9yLlJhbmdlLlxuICAgKi9cbiAgTWlzc2luZ01pbk1heFNpemUgPSAnbWlzc2luZy1taW4tbWF4LXNpemUnLFxuICAvKipcbiAgICogQ2FuIG9jY3VyIGlmIHRoZSBlbWJlZGRpbmcgYXBwIGludGVyYWN0cyB3aXRoIGEgcGFyYW1ldGVyIHRoYXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSB3b3Jrc2hlZXQuXG4gICAqL1xuICBNaXNzaW5nUGFyYW1ldGVyID0gJ21pc3NpbmctcGFyYW1ldGVyJyxcbiAgLyoqXG4gICAqIFRoZSByYW5nZU4gZmllbGQgaXMgbWlzc2luZyBmb3IgYSByZWxhdGl2ZSBkYXRlIGZpbHRlciBvZiB0eXBlIExBU1ROIG9yIE5FWFROLlxuICAgKi9cbiAgTWlzc2luZ1JhbmdlTkZvclJlbGF0aXZlRGF0ZUZpbHRlcnMgPSAnbWlzc2luZy1yYW5nZS1uLWZvci1yZWxhdGl2ZS1kYXRlLWZpbHRlcnMnLFxuICAvKipcbiAgICogQW4gYXR0ZW1wdCB3YXMgbWFkZSB0byBhY2Nlc3MgU2hlZXQuZ2V0VXJsKCkgb24gYSBoaWRkZW4gc2hlZXQuIEhpZGRlbiBzaGVldHMgZG8gbm90IGhhdmUgVVJMcy5cbiAgICovXG4gIE5vVXJsRm9ySGlkZGVuV29ya3NoZWV0ID0gJ25vLXVybC1mb3ItaGlkZGVuLXdvcmtzaGVldCcsXG4gIC8qKlxuICAgKiBPbmUgb3IgYm90aCBvZiB0aGUgcGFyZW50RWxlbWVudCBvciB0aGUgVVJMIHBhcmFtZXRlcnMgaXMgbm90IHNwZWNpZmllZCBpbiB0aGUgVml6IGNvbnN0cnVjdG9yLlxuICAgKi9cbiAgTm9VcmxPclBhcmVudEVsZW1lbnROb3RGb3VuZCA9ICduby11cmwtb3ItcGFyZW50LWVsZW1lbnQtbm90LWZvdW5kJyxcbiAgLyoqXG4gICAqIEFuIG9wZXJhdGlvbiB3YXMgYXR0ZW1wdGVkIG9uIGEgc2hlZXQgdGhhdCBpcyBub3QgYWN0aXZlIG9yIGVtYmVkZGVkIHdpdGhpbiB0aGUgYWN0aXZlIGRhc2hib2FyZC5cbiAgICovXG4gIE5vdEFjdGl2ZVNoZWV0ID0gJ25vdC1hY3RpdmUtc2hlZXQnLFxuICAvKipcbiAgICogQSByZXF1aXJlZCBwYXJhbWV0ZXIgd2FzIG5vdCBzcGVjaWZpZWQsIG51bGwsIG9yIGFuIGVtcHR5IHN0cmluZy9hcnJheS5cbiAgICovXG4gIE51bGxPckVtcHR5UGFyYW1ldGVyID0gJ251bGwtb3ItZW1wdHktcGFyYW1ldGVyJyxcbiAgLyoqXG4gICAqIEFuIG9wZXJhdGlvbiB3YXMgYXR0ZW1wdGVkIG9uIGEgc2hlZXQgdGhhdCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgd29ya2Jvb2suXG4gICAqL1xuICBTaGVldE5vdEluV29ya2Jvb2sgPSAnc2hlZXQtbm90LWluLXdvcmtib29rJyxcbiAgLyoqXG4gICAqIEFuIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgb24gYSBDdXN0b21WaWV3IG9iamVjdCB0aGF0IGlzIG5vIGxvbmdlciB2YWxpZCAoaXQgaGFzIGJlZW4gcmVtb3ZlZCkuXG4gICAqL1xuICBTdGFsZURhdGFSZWZlcmVuY2UgPSAnc3RhbGUtZGF0YS1yZWZlcmVuY2UnLFxuICAvKipcbiAgICogVW5rbm93biBlcnJvciB0cmlnZ2VyZWQgZHVyaW5nIHRoZSBhdXRoIGZsb3cuXG4gICAqL1xuICBVbmtub3duQXV0aEVycm9yID0gJ3Vua25vd24tYXV0aC1lcnJvcicsXG4gIC8qKlxuICAgKiBBbiB1bmtub3duIGV2ZW50IG5hbWUgd2FzIHNwZWNpZmllZCBpbiB0aGUgY2FsbCB0byBWaXouYWRkRXZlbnRMaXN0ZW5lciBvciBWaXoucmVtb3ZlRXZlbnRMaXN0ZW5lci5cbiAgICovXG4gIFVuc3VwcG9ydGVkRXZlbnROYW1lID0gJ3Vuc3VwcG9ydGVkLWV2ZW50LW5hbWUnLFxuICAvKipcbiAgICogQSBWaXogb2JqZWN0IGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZCBhcyBhIGNoaWxkIG9mIHRoZSBwYXJlbnRFbGVtZW50IHNwZWNpZmllZCBpbiB0aGUgVml6IGNvbnN0cnVjdG9yLlxuICAgKi9cbiAgVml6QWxyZWFkeUluTWFuYWdlciA9ICd2aXotYWxyZWFkeS1pbi1tYW5hZ2VyJyxcbiAgLyoqXG4gICAqIEZ1bmN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGVtYmVkZGluZyBhcGkuXG4gICAqL1xuICBJbXBsZW1lbnRhdGlvbkVycm9yID0gJ3dyb25nLWltcGxlbWVudGF0aW9uJyxcbiAgLyoqXG4gICAqIEBOb3RJbXBsZW1lbnRlZFxuICAgKi9cbiAgTm90SW1wbGVtZW50ZWQgPSAnbm90LWltcGxlbWVudGVkJyxcbiAgLyoqXG4gICAqIFVua25vd24gZXJyb3IgZHVyaW5nIGV2ZW50IGluaXRpYWxpemF0aW9uXG4gICAqL1xuICBFdmVudEluaXRpYWxpemF0aW9uRXJyb3IgPSAnZXZlbnQtaW5pdGlhbGl6YXRpb24tZXJyb3InLFxuICAvKipcbiAgICogVmVyc2lvbiBvZiB0aGUgZW1iZWRkaW5nIGFwaSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSB2ZXJzaW9uIG9mIHRhYmxlYXVcbiAgICovXG4gIEluY29tcGF0aWJsZVZlcnNpb25FcnJvciA9ICdpbmNvbXBhdGlibGUtdmVyc2lvbi1lcnJvcicsXG5cbiAgLyoqXG4gICAqIFVua25vd24ge0BsaW5rIFRhYmxlYXVEaWFsb2dUeXBlfSBwYXNzZWQgaW4gdG8gVml6LmRpc3BsYXlEaWFsb2dBc3luYy5cbiAgICovXG4gIFVua25vd25EaWFsb2dUeXBlID0gJ3Vua25vd24tZGlhbG9nLXR5cGUnLFxuXG4gIC8qKlxuICAgKiBDYW4gb2NjdXIgaWYgdGhlIEFQSSBpbnRlcmFjdHMgd2l0aCBhIGZpbHRlciB0aGF0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgd29ya3NoZWV0LlxuICAgKiBDYW4gYWxzbyBvY2N1cnMgaWYgYSB7QGxpbmsgRmlsdGVyVHlwZX0gaGFzIG5vdCBiZWVuIGltcGxlbWVudGVkLlxuICAgKi9cbiAgRmlsdGVyTWlzc2luZ09yTm90SW1wbGVtZW50ZWQgPSAnZmlsdGVyLW1pc3Npbmctbm90LWltcGxlbWVudGVkJyxcblxuICAvKipcbiAgICogQ2FuIG9jY3VyIGlmIHN0b3J5IHBvaW50IGlkcyBubyBsb25nZXIgbWF0Y2guXG4gICAqL1xuICBTdG9yeVBvaW50SWRNaXNtYXRjaCA9ICdzdG9yeXBvaW50LWlkLW1pc21hdGNoJyxcbn1cblxuLyoqXG4gKiBGb3JtYXRzIGF2YWlsYWJsZSB0byB1c2Ugd2l0aCBkaXNwbGF5U3RhdGljSW1hZ2UgaW4gQFZpekludGVyZmFjZXNcbiAqL1xuZXhwb3J0IGVudW0gRmlsZUZvcm1hdHMge1xuICBQREYgPSAncGRmJyxcbiAgUE5HID0gJ3BuZycsXG59XG5cbmV4cG9ydCBlbnVtIFByaW50T3JpZW50YXRpb24ge1xuICBQb3J0cmFpdCA9ICdwb3J0cmFpdCcsXG4gIExhbmRzY2FwZSA9ICdsYW5kc2NhcGUnLFxufVxuXG5leHBvcnQgZW51bSBQcmludFBhZ2VTaXplIHtcbiAgTGV0dGVyID0gJ2xldHRlcicsXG4gIExlZ2FsID0gJ2xlZ2FsJyxcbiAgTm90ZSA9ICdub3RlJyxcbiAgRm9saW8gPSAnZm9saW8nLFxuICBUYWJsb2lkID0gJ3RhYmxvaWQnLFxuICBMZWRnZXIgPSAnbGVkZ2VyJyxcbiAgU3RhdGVtZW50ID0gJ3N0YXRlbWVudCcsXG4gIEV4ZWN1dGl2ZSA9ICdleGVjdXRpdmUnLFxuICBBMyA9ICdBMycsXG4gIEE0ID0gJ0E0JyxcbiAgQTUgPSAnQTUnLFxuICBCNCA9ICdCNCcsXG4gIEI1ID0gJ0I1JyxcbiAgUXVhcnRvID0gJ3F1YXJ0bycsXG4gIFVuc3BlY2lmaWVkID0gJ3Vuc3BlY2lmaWVkJyxcbn1cblxuZXhwb3J0IGVudW0gUHJpbnRTY2FsaW5nIHtcbiAgQXV0b21hdGljID0gJ2F1dG9tYXRpYycsXG4gIFBlcmMyNSA9ICcyNSUnLFxuICBQZXJjNTAgPSAnNTAlJyxcbiAgUGVyYzYwID0gJzYwJScsXG4gIFBlcmM3NSA9ICc3NSUnLFxuICBQZXJjODAgPSAnODAlJyxcbiAgUGVyYzkwID0gJzkwJScsXG4gIFBlcmMxMDAgPSAnMTAwJScsXG4gIFBlcmMyMDAgPSAnMjAwJScsXG4gIFBlcmM0MDAgPSAnNDAwJScsXG4gIEF0TW9zdDFQYWdlSGlnaCA9ICdhdC1tb3N0LTEtcGFnZS1oaWdoJyxcbiAgQXRNb3N0MlBhZ2VzSGlnaCA9ICdhdC1tb3N0LTItcGFnZXMtaGlnaCcsXG4gIEF0TW9zdDFQYWdlV2lkZSA9ICdhdC1tb3N0LTEtcGFnZS13aWRlJyxcbiAgQXRNb3N0MlBhZ2VzV2lkZSA9ICdhdC1tb3N0LTItcGFnZXMtd2lkZScsXG59XG5cbmV4cG9ydCBlbnVtIFJldmVydFZpelNlbGVjdGlvbiB7XG4gIEFsbCA9ICdhbGwnLFxuICBBeGVzID0gJ2F4ZXMnLFxuICBGaWx0ZXJzID0gJ2ZpbHRlcnMnLFxuICBTb3J0cyA9ICdzb3J0cycsXG4gIFNoZWx2ZXMgPSAnc2hlbHZlcycsXG59XG5cbmV4cG9ydCBlbnVtIFRvb2xiYXJCdXR0b25zIHtcbiAgQWxlcnRzID0gJ2FsZXJ0cycsXG4gIEFza0RhdGEgPSAnYXNrRGF0YScsXG4gIEN1c3RvbVZpZXdzID0gJ2N1c3RvbVZpZXdzJyxcbiAgRGF0YURldGFpbHMgPSAnZGF0YURldGFpbHMnLFxuICBTaGFyZSA9ICdzaGFyZScsXG4gIFN1YnNjcmliZSA9ICdzdWJzY3JpYmUnLFxufVxuXG5leHBvcnQgZW51bSBUb29sYmFyIHtcbiAgVG9wID0gJ3RvcCcsXG4gIEJvdHRvbSA9ICdib3R0b20nLFxuICBIaWRkZW4gPSAnaGlkZGVuJyxcbn1cblxuZXhwb3J0IGVudW0gU2hlZXRTaXplQmVoYXZpb3Ige1xuICBBdXRvbWF0aWMgPSAnYXV0b21hdGljJyxcbiAgRXhhY3RseSA9ICdleGFjdGx5JyxcbiAgUmFuZ2UgPSAncmFuZ2UnLFxuICBBdExlYXN0ID0gJ2F0bGVhc3QnLFxuICBBdE1vc3QgPSAnYXRtb3N0Jyxcbn1cblxuZXhwb3J0IGVudW0gUHVsc2VMYXlvdXQge1xuICBEZWZhdWx0ID0gJ2RlZmF1bHQnLFxuICBDYXJkID0gJ2NhcmQnLFxuICBCYW4gPSAnYmFuJyxcbn1cblxuZXhwb3J0IGVudW0gUHVsc2VUaW1lRGltZW5zaW9uIHtcbiAgVG9kYXkgPSAnVG9kYXknLFxuICBZZXN0ZXJkYXkgPSAnWWVzdGVyZGF5JyxcbiAgV2Vla1RvRGF0ZSA9ICdXZWVrVG9EYXRlJyxcbiAgTGFzdFdlZWsgPSAnTGFzdFdlZWsnLFxuICBNb250aFRvRGF0ZSA9ICdNb250aFRvRGF0ZScsXG4gIExhc3RNb250aCA9ICdMYXN0TW9udGgnLFxuICBRdWFydGVyVG9EYXRlID0gJ1F1YXJ0ZXJUb0RhdGUnLFxuICBMYXN0UXVhcnRlciA9ICdMYXN0UXVhcnRlcicsXG4gIFllYXJUb0RhdGUgPSAnWWVhclRvRGF0ZScsXG4gIExhc3RZZWFyID0gJ0xhc3RZZWFyJyxcbn1cblxuZXhwb3J0IGVudW0gUHVsc2VFcnJvck1lc3NhZ2VWaXNpYmlsaXR5IHtcbiAgVmlzaWJsZSA9ICd2aXNpYmxlJyxcbiAgSGlkZGVuID0gJ2hpZGRlbicsXG4gIFN1cHByZXNzZWQgPSAnc3VwcHJlc3NlZCcsXG59XG5cbi8qKlxuICogQmUgY2FyZWZ1bCB3aGVuIGFkZGluZyBuZXcgZXZlbnQgdHlwZXMuIEV4dGVuc2lvbnMgYW5kIGVtYmVkZGluZyBmb2xsb3cgdHdvIGRpZmZlcmVudCBwYXR0ZXJucyBvbiBob3cgZXZlbnRzIGFyZSBuYW1lZC5cbiAqIEV2ZW50cyBzaG91bGQgYmUgYWxsIGxvd2VyIGNhc2UgYW5kIHdpdGhvdXQgaHlwaGVucyBvciB1bmRlcnNjb3Jlcy5cbiAqL1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIHR5cGUgb2YgdGFibGVhdSBlbWJlZGRpbmcgZXZlbnQgdGhhdCBjYW4gYmUgbGlzdGVuZWQgZm9yLlxuICovXG5leHBvcnQgZW51bSBUYWJsZWF1RXZlbnRUeXBlIHtcbiAgLyoqXG4gICAqIFJhaXNlZCB3aGVuIGEgY3VzdG9tIHZpZXcgaGFzIGZpbmlzaGVkIGxvYWRpbmcuIFRoaXMgZXZlbnQgaXMgcmFpc2VkIGFmdGVyIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBmb3Ige0BsaW5rIEZpcnN0SW50ZXJhY3RpdmV9IChpZiBhbnkpIGhhcyBiZWVuIGNhbGxlZC5cbiAgICpcbiAgICogQGNhdGVnb3J5IFZpZXdpbmdcbiAgICovXG4gIEN1c3RvbVZpZXdMb2FkZWQgPSAnY3VzdG9tdmlld2xvYWRlZCcsXG5cbiAgLyoqXG4gICAqIFJhaXNlZCB3aGVuIGEgY3VzdG9tIHZpZXcgaGFzIGJlZW4gcmVtb3ZlZC5cbiAgICpcbiAgICogQGNhdGVnb3J5IFZpZXdpbmdcbiAgICovXG4gIEN1c3RvbVZpZXdSZW1vdmVkID0gJ2N1c3RvbXZpZXdyZW1vdmVkJyxcblxuICAvKipcbiAgICogUmFpc2VkIHdoZW4gYSBjdXN0b20gdmlldyBoYXMgYmVlbiBzYXZlZCAobmV3bHkgY3JlYXRlZCBvciB1cGRhdGVkKS5cbiAgICpcbiAgICogQGNhdGVnb3J5IFZpZXdpbmdcbiAgICovXG4gIEN1c3RvbVZpZXdTYXZlZCA9ICdjdXN0b212aWV3c2F2ZWQnLFxuXG4gIC8qKlxuICAgKiBSYWlzZWQgd2hlbiBhIGN1c3RvbSB2aWV3IGhhcyBiZWVuIHNldCBhcyB0aGUgZGVmYXVsdCB2aWV3IGZvciBhIHdvcmtib29rLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgVmlld2luZ1xuICAgKi9cbiAgQ3VzdG9tVmlld1NldERlZmF1bHQgPSAnY3VzdG9tdmlld3NldGRlZmF1bHQnLFxuXG4gIC8qKiBSYWlzZWQgd2hlbiB0aGUgdXNlciBjbGlja3Mgb24gdGhlIEVkaXQgQnV0dG9uLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgVmlld2luZ1xuICAgKi9cbiAgRWRpdEJ1dHRvbkNsaWNrZWQgPSAnZWRpdGJ1dHRvbmNsaWNrZWQnLFxuXG4gIC8qKiBSYWlzZWQgd2hlbiB0aGUgdXNlciBjbGlja3Mgb24gdGhlIEVkaXQgSW4gRGVza3RvcCBCdXR0b24uXG4gICAqXG4gICAqIEBjYXRlZ29yeSBBdXRob3JpbmcsIFZpZXdpbmdcbiAgICovXG4gIEVkaXRJbkRlc2t0b3BCdXR0b25DbGlja2VkID0gJ2VkaXRpbmRlc2t0b3BidXR0b25jbGlja2VkJyxcblxuICAvKiogUmFpc2VkIHdoZW4gYW55IGZpbHRlciBoYXMgY2hhbmdlZCBzdGF0ZS4gWW91IGNhbiB1c2UgdGhpcyBldmVudCB0eXBlIHdpdGggVGFibGVhdVZpeiBvYmplY3RzLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgVmlld2luZ1xuICAgKi9cbiAgRmlsdGVyQ2hhbmdlZCA9ICdmaWx0ZXJjaGFuZ2VkJyxcblxuICAvKiogRmlyZWQgd2hlbiB2aXogc2l6ZSBpcyBrbm93blxuICAgKlxuICAgKiBAY2F0ZWdvcnkgQXV0aG9yaW5nLCBWaWV3aW5nXG4gICAqL1xuICBGaXJzdFZpelNpemVLbm93biA9ICdmaXJzdHZpenNpemVrbm93bicsXG5cbiAgLyoqIEZpcmVkIHdoZW4gYSB2aXogZmlyc3QgYmVjb21lcyBpbnRlcmFjdGl2ZVxuICAgKlxuICAgKiBAY2F0ZWdvcnkgQXV0aG9yaW5nLCBWaWV3aW5nLCBQdWxzZVxuICAgKi9cbiAgRmlyc3RJbnRlcmFjdGl2ZSA9ICdmaXJzdGludGVyYWN0aXZlJyxcblxuICAvKiogUmFpc2VkIHdoZW4gYSBjdXN0b20gbWFyayBjb250ZXh0IG1lbnUgaXMgY2xpY2tlZC5cbiAgICpcbiAgICogQGNhdGVnb3J5IFZpZXdpbmdcbiAgICovXG4gIEN1c3RvbU1hcmtDb250ZXh0TWVudUV2ZW50ID0gJ2N1c3RvbW1hcmtjb250ZXh0bWVudScsXG5cbiAgLyoqIFRoZSBzZWxlY3RlZCBtYXJrcyBvbiBhIHZpc3VhbGl6YXRpb24gaGF2ZSBjaGFuZ2VkLiBZb3UgY2FuIHVzZSB0aGlzIGV2ZW50IHR5cGUgd2l0aCBUYWJsZWF1Vml6IG9iamVjdHMuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBWaWV3aW5nXG4gICAqL1xuICBNYXJrU2VsZWN0aW9uQ2hhbmdlZCA9ICdtYXJrc2VsZWN0aW9uY2hhbmdlZCcsXG5cbiAgLyoqIEEgcGFyYW1ldGVyIGhhcyBoYWQgaXRzIHZhbHVlIG1vZGlmaWVkLiBZb3UgY2FuIHVzZSB0aGlzIGV2ZW50IHR5cGUgd2l0aCBbW1BhcmFtZXRlcl1dIG9iamVjdHMuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBWaWV3aW5nXG4gICAqL1xuICBQYXJhbWV0ZXJDaGFuZ2VkID0gJ3BhcmFtZXRlcmNoYW5nZWQnLFxuXG4gIC8qKiBSYWlzZWQgd2hlbiBhIHRvb2xiYXIgYnV0dG9uIG9yIGNvbnRyb2wgYmVjb21lcyBhdmFpbGFibGUgb3IgYmVjb21lcyB1bmF2YWlsYWJsZS5cbiAgICpcbiAgICogQGNhdGVnb3J5IFZpZXdpbmdcbiAgICovXG4gIFRvb2xiYXJTdGF0ZUNoYW5nZWQgPSAndG9vbGJhcnN0YXRlY2hhbmdlZCcsXG5cbiAgLyoqIFJhaXNlZCB3aGVuIHRoZSB3b3JrYm9vayBpcyByZWFkeSB0byBjbG9zZS4gVGhpcyBub3RpZmljYXRpb24gaXMgc2VudCB3aGVuIHVzaW5nIGVtYmVkZGVkIHdlYiBhdXRob3JpbmcgZnVuY3Rpb25hbGl0eS5cbiAgICpcbiAgICogQGNhdGVnb3J5IEF1dGhvcmluZ1xuICAgKi9cbiAgV29ya2Jvb2tSZWFkeVRvQ2xvc2UgPSAnd29ya2Jvb2tyZWFkeXRvY2xvc2UnLFxuXG4gIC8qKiBSYWlzZWQgd2hlbiB0aGUgd29ya2Jvb2sgaGFzIGJlZW4gcHVibGlzaGVkLiBUaGlzIG5vdGlmaWNhdGlvbiBpcyBzZW50IHdoZW4gdXNpbmcgZW1iZWRkZWQgd2ViIGF1dGhvcmluZyBmdW5jdGlvbmFsaXR5LlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgQXV0aG9yaW5nXG4gICAqL1xuICBXb3JrYm9va1B1Ymxpc2hlZCA9ICd3b3JrYm9va3B1Ymxpc2hlZCcsXG5cbiAgLyoqIFJhaXNlZCB3aGVuIFwicHVibGlzaCBhc1wiIGlzIHN1Y2Nlc3NmdWwuIFRoaXMgbm90aWZpY2F0aW9uIGlzIHNlbnQgd2hlbiB1c2luZyBlbWJlZGRlZCB3ZWIgYXV0aG9yaW5nIGZ1bmN0aW9uYWxpdHkuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBBdXRob3JpbmdcbiAgICovXG4gIFdvcmtib29rUHVibGlzaGVkQXMgPSAnd29ya2Jvb2twdWJsaXNoZWRhcycsXG5cbiAgLyoqXG4gICAqIFJhaXNlZCB3aGVuIGEgVVJMIGFjdGlvbiBvY2N1cnMuIFNlZSB0aGUge0BsaW5rIFVybEFjdGlvbkV2ZW50fSBjbGFzcy5cbiAgICpcbiAgICogQGNhdGVnb3J5IFZpZXdpbmdcbiAgICovXG4gIFVybEFjdGlvbiA9ICd1cmxhY3Rpb24nLFxuXG4gIC8qKlxuICAgKiBSYWlzZWQgYWZ0ZXIgYSB0YWIgc3dpdGNoIG9jY3VycyAodGhlIGFjdGl2ZSBzaGVldCBoYXMgY2hhbmdlZCkuIEd1YXJhbnRlZXMgdGhlIHZpeiBvYmplY3Qgd2lsbCBiZSBpbnRlcmFjdGl2ZSBhZnRlciB0aGlzLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgVmlld2luZ1xuICAgKi9cbiAgVGFiU3dpdGNoZWQgPSAndGFic3dpdGNoZWQnLFxuICAvKipcbiAgICpcbiAgICogUmFpc2VkIGFmdGVyIGEgbmV3IHN0b3J5IHBvaW50IGJlY29tZXMgYWN0aXZlLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgVmlld2luZ1xuICAgKi9cbiAgU3RvcnlQb2ludFN3aXRjaGVkID0gJ3N0b3J5cG9pbnRzd2l0Y2hlZCcsXG4gIC8qKlxuICAgKlxuICAgKiBSYWlzZWQgd2hlbiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgbG9hZGluZyB0aGUgY29udGVudHMgb2YgdGhlIHdlYmNvbXBvbmVudC5cbiAgICpcbiAgICogQGNhdGVnb3J5IEF1dGhvcmluZywgVmlld2luZywgQXNrRGF0YVxuICAgKi9cbiAgVml6TG9hZEVycm9yID0gJ3ZpemxvYWRlcnJvcicsXG4gIC8qKlxuICAgKiBSYWlzZWQgYWZ0ZXIgdGhlIGlmcmFtZSBzcmMgYXR0cmlidXRlIGhhcyBiZWVuIHVwZGF0ZWRcbiAgICpcbiAgICogQGNhdGVnb3J5IEF1dGhvcmluZywgVmlld2luZywgQXNrRGF0YVxuICAgKi9cbiAgSWZyYW1lU3JjVXBkYXRlZCA9ICdpZnJhbWVzcmN1cGRhdGVkJyxcblxuICAvKipcbiAgICogUmFpc2VkIHdoZW4gY2hhbmdlcyBhcmUgbWFkZSB0byBzdW1tYXJ5IGRhdGEuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBWaWV3aW5nXG4gICAqL1xuICBTdW1tYXJ5RGF0YUNoYW5nZWQgPSAnc3VtbWFyeWRhdGFjaGFuZ2VkJyxcblxuICAvKipcbiAgICogUmFpc2VkIHdoZW4gdGFibGVhdSAodml6LWNsaWVudCkgaXMgcmVhZHkgdG8gcmVjZWl2ZSBhbiBhdXRoIHRva2VuLlxuICAgKiBVc2VkIGZvciBhdXRoZW50aWNhdGlvbiBpbiBzYWxlc2ZvcmNlIG5hdGl2ZSBtb2RlLlxuICAgKlxuICAgKiBAaGlkZGVuXG4gICAqIEBjYXRlZ29yeSBBdXRob3JpbmcsIFZpZXdpbmcsXG4gICAqL1xuICBSZWFkeVRvUmVjZWl2ZUF1dGhUb2tlbiA9ICdyZWFkeXRvcmVjZWl2ZWF1dGh0b2tlbicsXG5cbiAgLyoqXG4gICAqIEZpcmVkIHdoZW4gdGhlIFB1bHNlIG1ldHJpYyBzaXplIGlzIGtub3duXG4gICAqXG4gICAqIEBjYXRlZ29yeSBQdWxzZVxuICAgKi9cbiAgRmlyc3RQdWxzZU1ldHJpY1NpemVLbm93biA9ICdmaXJzdHB1bHNlbWV0cmljc2l6ZWtub3duJyxcblxuICAvKipcbiAgICogRmlyZWQgd2hlbiBhbiBpbnRlcm5hbCBQdWxzZSBlcnJvciBpcyBlbmNvdW50ZXJlZC5cbiAgICpcbiAgICogQGNhdGVnb3J5IFB1bHNlXG4gICAqL1xuICBQdWxzZUVycm9yID0gJ3B1bHNlZXJyb3InLFxuXG4gIC8qKlxuICAgKiBGaXJlZCB3aGVuIHRoZSBQdWxzZSBmaWx0ZXJzIGNoYW5nZVxuICAgKlxuICAgKiBAY2F0ZWdvcnkgUHVsc2VcbiAgICovXG4gIFB1bHNlRmlsdGVyc0NoYW5nZWQgPSAncHVsc2VmaWx0ZXJzY2hhbmdlZCcsXG5cbiAgLyoqXG4gICAqIEZpcmVkIHdoZW4gYSBQdWxzZSBpbnNpZ2h0IGlzIGRpc2NvdmVyZWRcbiAgICpcbiAgICogQGNhdGVnb3J5IFB1bHNlXG4gICAqL1xuICBQdWxzZUluc2lnaHREaXNjb3ZlcmVkID0gJ3B1bHNlaW5zaWdodGRpc2NvdmVyZWQnLFxuXG4gIC8qKlxuICAgKiBGaXJlZCB3aGVuIHRoZSBQdWxzZSBtZXRyaWMgc2l6ZSBjaGFuZ2VzXG4gICAqXG4gICAqIEBjYXRlZ29yeSBQdWxzZVxuICAgKi9cbiAgUHVsc2VNZXRyaWNTaXplQ2hhbmdlZCA9ICdwdWxzZW1ldHJpY3NpemVjaGFuZ2VkJyxcblxuICAvKipcbiAgICogRmlyZWQgd2hlbiB0aGUgUHVsc2UgbWV0cmljIHRpbWUgZGltZW5zaW9uIGNoYW5nZXNcbiAgICpcbiAgICogQGNhdGVnb3J5IFB1bHNlXG4gICAqL1xuICBQdWxzZVRpbWVEaW1lbnNpb25DaGFuZ2VkID0gJ3B1bHNldGltZWRpbWVuc2lvbmNoYW5nZWQnLFxuXG4gIC8qKlxuICAgKiBGaXJlZCB3aGVuIHRoZSBQdWxzZSBVUkwgY2hhbmdlc1xuICAgKlxuICAgKiBAY2F0ZWdvcnkgUHVsc2VcbiAgICovXG4gIFB1bHNlVXJsQ2hhbmdlZCA9ICdwdWxzZXVybGNoYW5nZWQnLFxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIGxvY2F0aW9uIG9mIGEgY29udGV4dCBtZW51IHdoZXJlIHVzZXJzIGNhbiBhZGQgZXh0ZXJuYWwgbWVudSBpdGVtcy5cbiAqL1xuZXhwb3J0IGVudW0gQXBpTWVudVR5cGUge1xuICAvKiogRXh0ZXJuYWwgbWVudSBpdGVtIHdpbGwgYmUgaW5qZWN0ZWQgaW4gdWJlcnRpcCBkaWFsb2cgKi9cbiAgVWJlcnRpcCA9ICd1YmVydGlwJyxcbn1cblxuLyoqIFlvdSBjYW4gdXNlIHRoaXMgdHlwZSB3aXRoIGEge0BsaW5rIFZpen0gb2JqZWN0LiAqL1xuZXhwb3J0IGVudW0gVGFibGVhdURpYWxvZ1R5cGUge1xuICAvKipcbiAgICogVXNlZCB0byBkaXNwbGF5IHRoZSBkb3dubG9hZCBQREYgZGlhbG9nLlxuICAgKi9cbiAgRXhwb3J0UERGID0gJ2V4cG9ydC1wZGYnLFxuICAvKipcbiAgICogVXNlZCB0byBkaXNwbGF5IHRoZSBkb3dubG9hZCBQb3dlclBvaW50IGRpYWxvZy5cbiAgICovXG4gIEV4cG9ydFBvd2VyUG9pbnQgPSAnZXhwb3J0LXBvd2VycG9pbnQnLFxuICAvKipcbiAgICogVXNlZCB0byBkaXNwbGF5IHRoZSBkb3dubG9hZCBEYXRhIGRpYWxvZy5cbiAgICovXG4gIEV4cG9ydERhdGEgPSAnZXhwb3J0LWRhdGEnLFxuICAvKipcbiAgICogVXNlZCB0byBkaXNwbGF5IHRoZSBkb3dubG9hZCBDcm9zc1RhYiBkaWFsb2cuXG4gICAqL1xuICBFeHBvcnRDcm9zc1RhYiA9ICdleHBvcnQtY3Jvc3MtdGFiJyxcbiAgLyoqXG4gICAqIFVzZWQgdG8gZGlzcGxheSB0aGUgZG93bmxvYWQgV29ya2Jvb2sgZGlhbG9nLlxuICAgKi9cbiAgRXhwb3J0V29ya2Jvb2sgPSAnZXhwb3J0LXdvcmtib29rJyxcbiAgLyoqXG4gICAqIFVzZWQgdG8gZGlzcGxheSB0aGUgU2hhcmUgZGlhbG9nLlxuICAgKi9cbiAgU2hhcmUgPSAnc2hhcmUnLFxufVxuIiwiaW1wb3J0IHsgRmlsdGVyT3B0aW9ucyB9IGZyb20gJy4uL1NoYXJlZC9GaWx0ZXJJbnRlcmZhY2VzJztcbmltcG9ydCB7IEZpbHRlckRvbWFpblR5cGUsIEZpbHRlclR5cGUsIEZpbHRlclVwZGF0ZVR5cGUgfSBmcm9tICcuLi9TaGFyZWQvTmFtZXNwYWNlcy9UYWJsZWF1JztcbmltcG9ydCB7IFB1bHNlTGF5b3V0LCBQdWxzZVRpbWVEaW1lbnNpb24gfSBmcm9tICcuL0VudW1zJztcbmltcG9ydCB7IFdlYkNvbXBvbmVudExvY2FsU2V0dGluZ3MgfSBmcm9tICcuL1dlYkNvbXBvbmVudEludGVyZmFjZXMnO1xuXG4vKipcbiAqIFRoZSBuYW1lcyBvZiB0aGUgc3RyaW5nIGNvbnN0YW50cyB5b3UgY2FuIHVzZSBhcyBIVE1MIGF0dHJpYnV0ZXMgZm9yIHRoZSA8dGFibGVhdS1wdWxzZT4gd2ViIGNvbXBvbmVudC5cbiAqIEBpZ25vcmVcbiAqL1xuZXhwb3J0IGVudW0gUHVsc2VBdHRyaWJ1dGVzIHtcbiAgRGlzYWJsZUV4cGxvcmVGaWx0ZXIgPSAnZGlzYWJsZS1leHBsb3JlLWZpbHRlcicsXG4gIExheW91dCA9ICdsYXlvdXQnLFxuICBPbkZpcnN0SW50ZXJhY3RpdmUgPSAnb25GaXJzdEludGVyYWN0aXZlJyxcbiAgT25GaXJzdFB1bHNlTWV0cmljU2l6ZUtub3duID0gJ29uRmlyc3RQdWxzZU1ldHJpY1NpemVLbm93bicsXG4gIE9uUHVsc2VVcmxFcnJvciA9ICdvblB1bHNlRXJyb3InLFxuICBPblB1bHNlRmlsdGVyc0NoYW5nZWQgPSAnb25QdWxzZUZpbHRlcnNDaGFuZ2VkJyxcbiAgT25QdWxzZUluc2lnaHREaXNjb3ZlcmVkID0gJ29uUHVsc2VJbnNpZ2h0RGlzY292ZXJlZCcsXG4gIE9uUHVsc2VNZXRyaWNTaXplQ2hhbmdlZCA9ICdvblB1bHNlTWV0cmljU2l6ZUNoYW5nZWQnLFxuICBPblB1bHNlVGltZURpbWVuc2lvbkNoYW5nZWQgPSAnb25QdWxzZVRpbWVEaW1lbnNpb25DaGFuZ2VkJyxcbiAgT25QdWxzZVVybENoYW5nZWQgPSAnb25QdWxzZVVybENoYW5nZWQnLFxuICBUaW1lRGltZW5zaW9uID0gJ3RpbWUtZGltZW5zaW9uJyxcbiAgVG9rZW5PcHRpb25hbCA9ICd0b2tlbi1vcHRpb25hbCcsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHVsc2VTZXR0aW5ncyBleHRlbmRzIFdlYkNvbXBvbmVudExvY2FsU2V0dGluZ3Mge1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGV4cGxvcmUgZmlsdGVyIGlzIGhpZGRlbiBvciB2aXNpYmxlLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtcHVsc2UgaWQ9XCJ0YWJsZWF1UHVsc2VcIiBkaXNhYmxlLWV4cGxvcmUtZmlsdGVyPlxuICAgKiBgYGBcbiAgICovXG4gIGRpc2FibGVFeHBsb3JlRmlsdGVyPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBkZXNpcmVkIGN1c3RvbSBsYXlvdXQgb2YgdGhlIFB1bHNlIG1ldHJpYy5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXB1bHNlIGlkPVwidGFibGVhdVB1bHNlXCIgbGF5b3V0PVwiY2FyZFwiPlxuICAgKiBgYGBcbiAgICovXG4gIGxheW91dD86IFB1bHNlTGF5b3V0O1xuXG4gIC8qKlxuICAgKiBUaGUgdG9rZW4gdXNlZCBmb3IgYXV0aG9yaXphdGlvblxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIHRva2VuPVwic29tZS10b2tlbi1jb250YWluaW5nLWNsaWVudElkXCIgLz5cbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiB0b2tlbj1cInNvbWUtdG9rZW4tY29udGFpbmluZy1jbGllbnRJZFwiIC8+XG4gICAqIDx0YWJsZWF1LXB1bHNlIGlkPVwidGFibGVhdVB1bHNlXCIgdG9rZW49XCJzb21lLXRva2VuLWNvbnRhaW5pbmctY2xpZW50SWRcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIHRva2VuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgb2YgdGhlICdsb2FkaW5nJyBhdHRyaWJ1dGUgb2YgdGhlIGVtYmVkZGVkIGlmcmFtZS5cbiAgICogU2VlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvaWZyYW1lI2xvYWRpbmdcbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBpZnJhbWUtYXR0ci1sb2FkaW5nPVwibGF6eVwiIC8+XG4gICAqIDx0YWJsZWF1LWF1dGhvcmluZy12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgaWZyYW1lLWF0dHItbG9hZGluZz1cImxhenlcIiAvPlxuICAgKiA8dGFibGVhdS1wdWxzZSBpZD1cInRhYmxlYXVQdWxzZVwiIGlmcmFtZS1hdHRyLWxvYWRpbmc9XCJsYXp5XCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBpZnJhbWVBdHRyaWJ1dGVMb2FkaW5nPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgb2YgdGhlICdzdHlsZScgYXR0cmlidXRlIG9mIHRoZSBlbWJlZGRlZCBpZnJhbWUuXG4gICAqXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgaWZyYW1lLWF0dHItc3R5bGU9XCJib3JkZXI6IDFweCBzb2xpZCByZWRcIiAvPlxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIGlmcmFtZS1hdHRyLXN0eWxlPVwiYm9yZGVyOiAxcHggc29saWQgcmVkXCIgLz5cbiAgICogPHRhYmxlYXUtcHVsc2UgaWQ9XCJ0YWJsZWF1UHVsc2VcIiBpZnJhbWUtYXR0ci1zdHlsZT1cImJvcmRlcjogMXB4IHNvbGlkIHJlZFwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgaWZyYW1lQXR0cmlidXRlU3R5bGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSBvZiB0aGUgJ2NsYXNzJyBhdHRyaWJ1dGUgb2YgdGhlIGVtYmVkZGVkIGlmcmFtZSBwcm92aWRpbmcgYWNjZXNzIHRvIGFueVxuICAgKiBjdXN0b20gc2VsZWN0b3JzIGRlZmluZWQgaW4gdGhlIGA8aWZyYW1lLXN0eWxlPmAgY2hpbGQgdGFnLlxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtcHVsc2UgaWQ9XCJ0YWJsZWF1Vml6XCIgaWZyYW1lLWF0dHItY2xhc3M9XCJyZWQtYm9yZGVyXCI+XG4gICAqICAgPGlmcmFtZS1zdHlsZT5cbiAgICogICAgIC5yZWQtYm9yZGVyIHtcbiAgICogICAgICAgYm9yZGVyOiAxcHggc29saWQgcmVkO1xuICAgKiAgICAgfVxuICAgKiAgIDwvaWZyYW1lLXN0eWxlPlxuICAgKiA8L3RhYmxlYXUtcHVsc2U+XG4gICAqIGBgYFxuICAgKi9cbiAgaWZyYW1lQXR0cmlidXRlQ2xhc3M/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBCYXNlNjQtZW5jb2RlZCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIFB1bHNlIHRoZW1lIG9iamVjdC5cbiAgICpcbiAgICovXG4gIHRoZW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIGRlc2lyZWQgdGltZSBkaW1lbnNpb24gdG8gYXBwbHkgdG8gdGhlIFB1bHNlIG1ldHJpYyBieSBkZWZhdWx0LlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtcHVsc2UgaWQ9XCJ0YWJsZWF1UHVsc2VcIiB0aW1lLWRpbWVuc2lvbj1cIk1vbnRoVG9EYXRlXCI+XG4gICAqIGBgYFxuICAgKi9cbiAgdGltZURpbWVuc2lvbj86IFB1bHNlVGltZURpbWVuc2lvbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHRva2VuIGlzIG9wdGlvbmFsLlxuICAgKiBXaGVuIHRydWUsIHRoZSBtZXRyaWMgd2lsbCBhdHRlbXB0IHRvIGxvYWQgZXZlbiB3aXRob3V0IHNwZWNpZnlpbmcgYSB0b2tlbi5cbiAgICogVGhpcyB3YXMgYWRkZWQgc3BlY2lmaWNhbGx5IGZvciB0aGUgTW9iaWxlIHRlYW0gd2hvIHVzZXMgUEtDRSBmbG93IHRvIGluaXRpYXRlIHRoZSBzZXNzaW9uXG4gICAqIGFuZCBzaG91bGQgbm90IGJlIGFkdmVydGlzZWQgdG8gM3JkIHBhcnRpZXMuXG4gICAqXG4gICAqIEBpZ25vcmVcbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXB1bHNlIGlkPVwidGFibGVhdVB1bHNlXCIgdG9rZW4tb3B0aW9uYWw+XG4gICAqIGBgYFxuICAgKi9cbiAgaXNUb2tlbk9wdGlvbmFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUaGUgbmFtZXMgb2YgdGhlIHN0cmluZyBjb25zdGFudHMgeW91IGNhbiB1c2UgYXMgY2hpbGQgdGFncyBmb3IgVGFibGVhdVB1bHNlIGN1c3RvbSBlbGVtZW50LlxuICovXG5leHBvcnQgZW51bSBQdWxzZUNoaWxkRWxlbWVudHMge1xuICAvKipcbiAgICogQ3VzdG9tIHN0eWxlcyBhcHBsaWNhYmxlIHRvIHRoZSBlbWJlZGRlZCBpZnJhbWUgZWxlbWVudCBpdHNlbGYgKG5vdCBpbnNpZGUgaXQpLlxuICAgKi9cbiAgSWZyYW1lU3R5bGUgPSAnaWZyYW1lLXN0eWxlJyxcblxuICAvKipcbiAgICogQSBwYXJhbWV0ZXIgdG8gYmUgdXNlZCBpbiB0aGUgUHVsc2UgdGhlbWUuXG4gICAqL1xuICBUaGVtZVBhcmFtZXRlciA9ICd0aGVtZS1wYXJhbWV0ZXInLFxuXG4gIC8qKlxuICAgKiBDb250YWlucyBhIGxpc3Qgb2YgZmlsdGVyIHBhcmFtZXRlcnMuXG4gICAqL1xuICBQdWxzZUZpbHRlciA9ICdwdWxzZS1maWx0ZXInLFxufVxuXG4vKipcbiAqIFRoZSBhdHRyaWJ1dGVzIG9mIHRoZSA8dGhlbWUtcGFyYW1ldGVyPiBjaGlsZCBlbGVtZW50cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQdWxzZVRoZW1lUHJvcGVydHkge1xuICAvKipcbiAgICogTmFtZSBvZiB0aGUgdGhlbWUgcGFyYW1ldGVyIHRvIGJlIHNldC5cbiAgICovXG4gIG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVmFsdWUgZm9yIHRoZSB0aGVtZSBwYXJhbWV0ZXIgYmVpbmcgc2V0LlxuICAgKi9cbiAgdmFsdWU6IHN0cmluZztcblxuICAvKipcbiAgICogT3B0aW9uYWwgdHlwZSBvZiB0aGVtZSBwYXJhbWV0ZXIgYmVpbmcgc2V0LlxuICAgKi9cbiAgdHlwZTogc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqXG4gKiBUaGUgYXR0cmlidXRlcyBvZiB0aGUgY2hpbGQgZWxlbWVudHMgb2YgPHRhYmxlYXUtcHVsc2U+LlxuICovXG5leHBvcnQgZW51bSBQdWxzZUNoaWxkRWxlbWVudEF0dHJpYnV0ZXMge1xuICBOYW1lID0gJ25hbWUnLFxuICBGaWVsZCA9ICdmaWVsZCcsXG4gIFZhbHVlID0gJ3ZhbHVlJyxcbiAgVHlwZSA9ICd0eXBlJyxcbn1cblxuLyoqXG4gKiBUaGUgUHVsc2UgdGhlbWUgZGF0YSBzdHJ1Y3R1cmUuXG4gKi9cbmV4cG9ydCB0eXBlIFB1bHNlVGhlbWUgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PjtcblxuLyoqXG4gKiBBY3Rpb25zIHJlbGF0ZWQgdG8gZXZlbnRzIGFuZCBzdGF0ZSBvZiB0aGUgUHVsc2UgbWV0cmljXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHVsc2VBY3Rpb25zIHtcbiAgLyoqXG4gICAqIEFwcGxpZXMgdGhlIGxpc3Qgb2YgcHJvdmlkZWQgY2F0ZWdvcmljYWwgZmlsdGVyIHZhbHVlcyB0byB0aGUgUHVsc2UgbWV0cmljLlxuICAgKlxuICAgKiBAcGFyYW0gZmllbGROYW1lICAgICAgVGhlIG5hbWUgb2YgdGhlIGZpZWxkIHRvIGZpbHRlciBvbi5cbiAgICogQHBhcmFtIHZhbHVlcyAgICAgICAgIFRoZSBsaXN0IG9mIHZhbHVlcyB0byBmaWx0ZXIgb24uXG4gICAqIEBwYXJhbSB1cGRhdGVUeXBlICAgICBUaGUgdXBkYXRlIHR5cGUgb2YgdGhpcyBmaWx0ZXIgKGFkZCwgYWxsLCByZW1vdmUsIHJlcGxhY2UpLlxuICAgKiBAcGFyYW0gZmlsdGVyT3B0aW9ucyAgQWR2YW5jZWQgZmlsdGVyIG9wdGlvbnMgKGlzRXhjbHVkZU1vZGUpLlxuICAgKiBAcmV0dXJucyBUaGUgZmllbGQgbmFtZSB0aGF0IHRoZSBmaWx0ZXIgaXMgYXBwbGllZCBvbi5cbiAgICovXG4gIGFwcGx5RmlsdGVyQXN5bmMoZmllbGROYW1lOiBzdHJpbmcsIHZhbHVlczogUHVsc2VGaWVsZFZhbHVlQXJyYXksIHVwZGF0ZVR5cGU6IEZpbHRlclVwZGF0ZVR5cGUsIG9wdGlvbnM6IEZpbHRlck9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz47XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgYXQgbGVhc3Qgb25lIGNhdGVnb3JpY2FsIGZpbHRlciB2YWx1ZSB0byB0aGUgUHVsc2UgbWV0cmljLlxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5PHtcbiAgICogICAgICAgZmllbGROYW1lOiBzdHJpbmc7XG4gICAqICAgICAgIHZhbHVlczogUHVsc2VGaWVsZFZhbHVlQXJyYXk7XG4gICAqICAgICAgIHVwZGF0ZVR5cGU6IEZpbHRlclVwZGF0ZVR5cGU7XG4gICAqICAgICAgIG9wdGlvbnM6IEZpbHRlck9wdGlvbnM7XG4gICAqICAgICB9Pn0gZmlsdGVycyBUaGUgc2V0IG9mIGZpbHRlcnMgdG8gYXBwbHkuXG4gICAqIEByZXR1cm5zIFRoZSBmaWVsZCBuYW1lcyB0aGF0IHRoZSBmaWx0ZXIgd2FzIGFwcGxpZWQgb24uXG4gICAqL1xuICBhcHBseUZpbHRlcnNBc3luYyhcbiAgICBmaWx0ZXJzOiBBcnJheTx7XG4gICAgICBmaWVsZE5hbWU6IHN0cmluZztcbiAgICAgIHZhbHVlczogUHVsc2VGaWVsZFZhbHVlQXJyYXk7XG4gICAgICB1cGRhdGVUeXBlOiBGaWx0ZXJVcGRhdGVUeXBlO1xuICAgICAgb3B0aW9uczogRmlsdGVyT3B0aW9ucztcbiAgICB9PixcbiAgKTogUHJvbWlzZTxBcnJheTxzdHJpbmc+PjtcblxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudCB0aW1lIGRpbWVuc2lvbiBhcHBsaWVkIHRvIHRoZSBQdWxzZSBtZXRyaWMuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IHRpbWUgZGltZW5zaW9uLlxuICAgKi9cbiAgZ2V0VGltZURpbWVuc2lvbkFzeW5jKCk6IFByb21pc2U8UHVsc2VUaW1lRGltZW5zaW9uPjtcblxuICAvKipcbiAgICogQXBwbGllcyB0aGUgdGltZSBkaW1lbnNpb24gdG8gdGhlIFB1bHNlIG1ldHJpYy5cbiAgICpcbiAgICogQHBhcmFtIHtQdWxzZVRpbWVEaW1lbnNpb259IHRpbWVEaW1lbnNpb24gVGhlIHRpbWUgZGltZW5zaW9uIHRvIGFwcGx5XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXBwbHlUaW1lRGltZW5zaW9uQXN5bmModGltZURpbWVuc2lvbjogUHVsc2VUaW1lRGltZW5zaW9uKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogR2V0cyBhIGxpc3Qgb2YgZmlsdGVycyBmb3IgdGhlIFB1bHNlIG1ldHJpYy5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8QXJyYXk8UHVsc2VGaWx0ZXI+Pn0gVGhlIGxpc3Qgb2YgZmlsdGVycy5cbiAgICovXG4gIGdldEZpbHRlcnNBc3luYygpOiBQcm9taXNlPEFycmF5PFB1bHNlRmlsdGVyPj47XG5cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgZXhpc3RpbmcgZmlsdGVyIGZvciB0aGUgZ2l2ZW4gZmllbGQgb24gdGhlIFB1bHNlIG1ldHJpYy5cbiAgICpcbiAgICogQHBhcmFtIGZpZWxkTmFtZSAgVGhlIG5hbWUgb2YgdGhlIGZpZWxkIHRvIGNsZWFyIGZpbHRlciBvbi5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGZpZWxkIHRvIGNsZWFyIGZpbHRlciBvbi5cbiAgICovXG4gIGNsZWFyRmlsdGVyQXN5bmMoZmllbGROYW1lczogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlIGV4aXN0aW5nIGZpbHRlciBmb3IgdGhlIGdpdmVuIGZpZWxkcyBvbiB0aGUgUHVsc2UgbWV0cmljLlxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGZpZWxkTmFtZXMgVGhlIG5hbWUgb2YgdGhlIGZpZWxkcyB0byBjbGVhciBmaWx0ZXIgb24uXG4gICAqIEByZXR1cm5zIFRoZSBmaWVsZHMgdG8gY2xlYXIgZmlsdGVyIG9uLlxuICAgKi9cbiAgY2xlYXJGaWx0ZXJzQXN5bmMoZmllbGROYW1lczogQXJyYXk8c3RyaW5nPik6IFByb21pc2U8QXJyYXk8c3RyaW5nPj47XG5cbiAgLyoqXG4gICAqIFJlc2V0cyBhbGwgdGhlIGV4aXN0aW5nIGZpbHRlcnMgb24gdGhlIFB1bHNlIG1ldHJpYy5cbiAgICovXG4gIGNsZWFyQWxsRmlsdGVyc0FzeW5jKCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIFVzZSB0aGlzIG1ldGhvZCB0byBmaWx0ZXIgdGhlIFB1bHNlIG1ldHJpYyBiZWZvcmUgaW5pdGlhbGl6YXRpb24uIElmIHVzZWQgYWZ0ZXIgaW5pdGlhbGl6YXRpb24sIGl0IHdpbGwgcmUtcmVuZGVyIHRoZSBtZXRyaWMuXG4gICAqIEZvciBmaWx0ZXJpbmcgYWZ0ZXIgaW5pdGlhbGl6YXRpb24sIHVzZSB0aGUgb3RoZXIgZmlsdGVyaW5nIG1ldGhvZHMsIHN1Y2ggYXMgYGFwcGx5RmlsdGVyQXN5bmNgLlxuICAgKlxuICAgKiBJZiB5b3UgYWRkIHRoZSBzYW1lIGZpbHRlciBmaWVsZHMgdXNpbmcgdGhlIGBhZGRGaWx0ZXIoKWAgbWV0aG9kIGFuZCBieSB1c2luZyB0aGUgYDxwdWxzZS1maWx0ZXI+YCBlbGVtZW50IGluIHRoZSBgPHRhYmxlYXUtcHVsc2U+YCB3ZWIgY29tcG9uZW50LFxuICAgKiB5b3UgbWlnaHQgZXhwZXJpZW5jZSB1bmV4cGVjdGVkIGJlaGF2aW9yLlxuICAgKlxuICAgKiBAcGFyYW0gZmllbGROYW1lIFRoZSBuYW1lIG9mIHRoZSBmaWVsZCB0byBmaWx0ZXIgb24uXG4gICAqIEBwYXJhbSB2YWx1ZSBTaW5nbGUgdmFsdWUgb3IgYSBsaXN0IG9mIGNvbW1hIHNlcGFyYXRlZCB2YWx1ZXMgdG8gZmlsdGVyIG9uLlxuICAgKlxuICAgKiBgYGBcbiAgICogcHVsc2UuYWRkRmlsdGVyKCdSZWdpb24nLCAnQ2VudHJhbCxXZXN0Jyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYWRkRmlsdGVyKGZpZWxkTmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZDtcblxuICAvKipcbiAgICogVXNlIHRoaXMgbWV0aG9kIHRvIHJlYWRqdXN0IHRoZSBkaW1lbnNpb25zIG9mIHRoZSBlbWJlZGRlZCBQdWxzZSBtZXRyaWMgaW4gcmVzcG9uc2UgdG8gdGhpbmdzIGxpa2UgYSB3aW5kb3cgcmVzaXplLCBkZXZpY2Ugb3JpZW50YXRpb24gY2hhbmdlLCBvclxuICAgKiBwYXJlbnQgY29udGFpbmVyIHJlc2l6ZS5cbiAgICpcbiAgICogYGBgXG4gICAqIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCAoKSA9PiBwdWxzZS5yZXNpemUoKSk7XG4gICAqXG4gICAqIG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiBwdWxzZS5yZXNpemUoKSkub2JzZXJ2ZShwdWxzZS5wYXJlbnRFbGVtZW50KTtcbiAgICogYGBgXG4gICAqL1xuICByZXNpemUoKTogdm9pZDtcbn1cblxuLyoqXG4gKiBUaGUgaW50ZXJmYWNlIGZvciB0aGUgdG9wLWxldmVsIFB1bHNlIG9iamVjdC5cbiAqKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHVsc2UgZXh0ZW5kcyBQdWxzZVNldHRpbmdzLCBQdWxzZUFjdGlvbnMge31cblxuLyoqXG4gKiBBIFB1bHNlRmllbGRWYWx1ZUFycmF5IGlzIGFuIGFycmF5IHRoYXQgY2FuIGNvbnRhaW4gc3RyaW5ncywgYm9vbGVhbnMsIG9yIG51bGxzLCBidXQgd2lsbCBuZXZlciBjb250YWluIGJvdGggc3RyaW5ncyBhbmQgYm9vbGVhbnMgYXQgdGhlIHNhbWUgdGltZS5cbiAqL1xuZXhwb3J0IHR5cGUgUHVsc2VGaWVsZFZhbHVlQXJyYXkgPSBBcnJheTxib29sZWFuIHwgbnVsbD4gfCBBcnJheTxzdHJpbmcgfCBudWxsPjtcblxuLyoqXG4gKlxuICogQW4gYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYWxsIG9mIHRoZSBQdWxzZSBmaWx0ZXIgdHlwZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHVsc2VGaWx0ZXIge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGZpZWxkIGJlaW5nIGZpbHRlcmVkLiAgTm90ZSB0aGF0IHRoaXMgaXMgdGhlIGNhcHRpb25cbiAgICogYXMgc2hvd24gaW4gdGhlIFVJLCBhbmQgbm90IHRoZSBhY3R1YWwgZGF0YWJhc2UgZmllbGQgbmFtZS5cbiAgICovXG4gIGZpZWxkTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0aGUgZmlsdGVyLlxuICAgKi9cbiAgZmlsdGVyVHlwZTogRmlsdGVyVHlwZTtcblxuICAvKipcbiAgICogVGhlIFB1bHNlIG1ldHJpYyBJRC5cbiAgICovXG4gIG1ldHJpY0lkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBQdWxzZSBDYXRlZ29yaWNhbCBGaWx0ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXRlZ29yaWNhbFB1bHNlRmlsdGVyIGV4dGVuZHMgUHVsc2VGaWx0ZXIge1xuICAvKipcbiAgICogQSBsaXN0IG9mIHZhbHVlcyBhcHBsaWVkIHRvIHRoaXMgY2F0ZWdvcmljYWwgZmlsdGVyLiBOb3RpY2UgdGhhdCBpZiB0aGUgUHVsc2UgbWV0cmljXG4gICAqIGhhcyBhIGRlZmluaXRpb24gZmlsdGVyLCB0aGUgY3VycmVudCByZWxldmFudCB2YWx1ZXMgY2FuIGJlIGZldGNoZWQgYnkgY2FsbGluZ1xuICAgKiBgZ2V0RG9tYWluQXN5bmMoRmlsdGVyRG9tYWluVHlwZS5SZWxldmFudClgLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwbGllZFZhbHVlczogUHVsc2VGaWVsZFZhbHVlQXJyYXk7XG5cbiAgLyoqXG4gICAqIFRydWUgaWYgdGhpcyBmaWx0ZXIgaXMgYW4gZXhjbHVkZSBmaWx0ZXIsIGZhbHNlIGlmIGFuIGluY2x1ZGUgZmlsdGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNFeGNsdWRlTW9kZTogYm9vbGVhbjtcblxuICAvKipcbiAgICogVHJ1ZSBpZiBhbGwgdGhlIHZhbHVlcyBhcmUgc2VsZWN0ZWQgZm9yIHRoaXMgZmlsdGVyLiBXaGVuICdBbGwnIGlzIHNlbGVjdGVkLFxuICAgKiBhcHBsaWVkVmFsdWVzIHJldHVybnMgYW4gZW1wdHkgbGlzdC5cbiAgICovXG4gIHJlYWRvbmx5IGlzQWxsU2VsZWN0ZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBkb21haW4gb2YgYSBjYXRlZ29yaWNhbCBmaWx0ZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7KHN0cmluZyB8IHVuZGVmaW5lZCl9IHNlYXJjaFRlcm0gVGhlIHRlcm0gdG8gc2VhcmNoIGZvciBpbiB0aGUgZG9tYWluLlxuICAgKiBAcGFyYW0geyhudW1iZXIgfCB1bmRlZmluZWQpfSBwYWdlU2l6ZSBUaGUgbWF4aW11bSBudW1iZXIgb2YgdmFsdWVzIHRvIHJldHVybi4gSWdub3JlZCB3aGVuIG5leHRQYWdlVG9rZW4gaXMgbm90IHByb3ZpZGVkLlxuICAgKiBAcGFyYW0geyhzdHJpbmcgfCB1bmRlZmluZWQpfSBuZXh0UGFnZVRva2VuIFRoZSBuZXh0IHBhZ2UgdG9rZW4gcmV0dXJuZWQgYnkgUHVsc2Ugd2hlbiBhZGRpdGlvbmFsIHZhbHVlcyBhcmUgYXZhaWxhYmxlLlxuICAgKiBAcGFyYW0geyhGaWx0ZXJEb21haW5UeXBlIHwgdW5kZWZpbmVkKX0gZG9tYWluVHlwZSBUaGUgZG9tYWluIHR5cGUgb2YgdGhlIGZpbHRlci5cbiAgICogQHJldHVybnMge1Byb21pc2U8UHVsc2VDYXRlZ29yaWNhbERvbWFpbj59IEEgcHJvbWlzZSBjb250YWluaW5nIHRoZSBjYXRlZ29yaWNhbCBkb21haW4gZm9yIHRoZSBmaWx0ZXIuXG4gICAqL1xuICBnZXREb21haW5Bc3luYzogKFxuICAgIHNlYXJjaFRlcm0/OiBzdHJpbmcsXG4gICAgcGFnZVNpemU/OiBudW1iZXIsXG4gICAgbmV4dFBhZ2VUb2tlbj86IHN0cmluZyxcbiAgICBkb21haW5UeXBlPzogRmlsdGVyRG9tYWluVHlwZSxcbiAgKSA9PiBQcm9taXNlPFB1bHNlQ2F0ZWdvcmljYWxEb21haW4+O1xufVxuXG4vKipcbiAqIFRoZSBkb21haW4gb2YgYSBQdWxzZSBjYXRlZ29yaWNhbCBmaWx0ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQdWxzZUNhdGVnb3JpY2FsRG9tYWluIHtcbiAgLyoqXG4gICAqIFRoZSBkb21haW4gdHlwZSAocmVsZXZhbnQsIGRhdGFiYXNlKVxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZTogRmlsdGVyRG9tYWluVHlwZTtcbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIHZhbHVlcyBpbiB0aGUgZG9tYWluIG9mIHRoZSBmaWx0ZXJcbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlczogUHVsc2VGaWVsZFZhbHVlQXJyYXk7XG4gIC8qKlxuICAgKiBUaGUgdG90YWwgYXZhaWxhYmxlIG51bWJlciBvZiB2YWx1ZXMgaW4gdGhlIGRvbWFpbiBvZiB0aGUgZmlsdGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgdG90YWxBdmFpbGFibGU6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBuZXh0IHBhZ2UgdG9rZW4gcmV0dXJuZWQgYnkgUHVsc2Ugd2hlbiBhZGRpdGlvbmFsIHZhbHVlcyBhcmUgYXZhaWxhYmxlLlxuICAgKiBQcm92aWRlIHRoaXMgdG9rZW4gdG8gZ2V0RG9tYWluQXN5bmMgdG8gZ2V0IHRoZSBuZXh0IHBhZ2Ugb2YgdmFsdWVzLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV4dFBhZ2VUb2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuIiwiaW1wb3J0IHtcbiAgQ3Jvc3N0YWJGaWxlRm9ybWF0LFxuICBEZXZpY2VUeXBlLFxuICBQcmludE9yaWVudGF0aW9uLFxuICBQcmludFBhZ2VTaXplLFxuICBQcmludFNjYWxpbmcsXG4gIFRhYmxlYXVEaWFsb2dUeXBlLFxuICBUYWJsZWF1RXZlbnRUeXBlLFxuICBUb29sYmFyLFxufSBmcm9tICcuL0VudW1zJztcbmltcG9ydCB7IFNoZWV0U2l6ZSB9IGZyb20gJy4vU2hlZXRJbnRlcmZhY2VzJztcbmltcG9ydCB7IFdlYkNvbXBvbmVudExvY2FsU2V0dGluZ3MsIFdlYkNvbXBvbmVudFNldHRpbmdzU2hhcmVkIH0gZnJvbSAnLi9XZWJDb21wb25lbnRJbnRlcmZhY2VzJztcbmltcG9ydCB7IFdvcmtib29rIH0gZnJvbSAnLi9Xb3JrYm9va0ludGVyZmFjZSc7XG5cbi8qKlxuICogVGhlIHNoYXJlZCBzdHJpbmcgY29uc3RhbnRzIHlvdSBjYW4gdXNlIGFzIEhUTUwgYXR0cmlidXRlcyBmb3IgdGhlIDx0YWJsZWF1LXZpej4gYW5kIDx0YWJsZWF1LWF1dGhvcmluZy12aXo+IHdlYiBjb21wb25lbnQuXG4gKiBAaWdub3JlXG4gKi9cbmV4cG9ydCBlbnVtIFZpelNoYXJlZEF0dHJpYnV0ZXMge1xuICBUb3VjaE9wdGltaXplID0gJ3RvdWNoLW9wdGltaXplJyxcbiAgSGlkZUVkaXRJbkRlc2t0b3BCdXR0b24gPSAnaGlkZS1lZGl0LWluLWRlc2t0b3AtYnV0dG9uJyxcbiAgU3VwcHJlc3NEZWZhdWx0RWRpdEJlaGF2aW9yID0gJ3N1cHByZXNzLWRlZmF1bHQtZWRpdC1iZWhhdmlvcicsXG4gIERpc2FibGVWZXJzaW9uQ2hlY2sgPSAnZGlzYWJsZS12ZXJzaW9uLWNoZWNrJyxcbiAgT25FZGl0SW5EZXNrdG9wQnV0dG9uQ2xpY2tlZCA9ICdvbkVkaXRJbkRlc2t0b3BCdXR0b25DbGlja2VkJyxcbiAgT25GaXJzdFZpelNpemVLbm93biA9ICdvbkZpcnN0Vml6U2l6ZUtub3duJyxcbiAgT25GaXJzdEludGVyYWN0aXZlID0gJ29uRmlyc3RJbnRlcmFjdGl2ZScsXG59XG5cbi8qKlxuICogVGhlIG5hbWVzIG9mIHRoZSBzdHJpbmcgY29uc3RhbnRzIHlvdSBjYW4gdXNlIGFzIEhUTUwgYXR0cmlidXRlcyBmb3IgdGhlIDx0YWJsZWF1LXZpej4gd2ViIGNvbXBvbmVudC5cbiAqIEBpZ25vcmVcbiAqL1xuZXhwb3J0IGVudW0gVml6QXR0cmlidXRlcyB7XG4gIERpc2FibGVVcmxBY3Rpb25zUG9wdXBzID0gJ2Rpc2FibGUtdXJsLWFjdGlvbnMnLFxuICBIaWRlVGFicyA9ICdoaWRlLXRhYnMnLFxuICBUb29sYmFyID0gJ3Rvb2xiYXInLFxuICBJbnN0YW5jZUlkVG9DbG9uZSA9ICdpbnN0YW5jZS1pZC10by1jbG9uZScsXG4gIERldmljZSA9ICdkZXZpY2UnLFxuICBIaWRlRWRpdEJ1dHRvbiA9ICdoaWRlLWVkaXQtYnV0dG9uJyxcbiAgT25FZGl0QnV0dG9uQ2xpY2tlZCA9ICdvbkVkaXRCdXR0b25DbGlja2VkJyxcbiAgT25GaWx0ZXJDaGFuZ2VkID0gJ29uRmlsdGVyQ2hhbmdlZCcsXG4gIE9uQ3VzdG9tTWFya0NvbnRleHRNZW51RXZlbnQgPSAnb25DdXN0b21NYXJrQ29udGV4dE1lbnVFdmVudCcsXG4gIE9uTWFya1NlbGVjdGlvbkNoYW5nZWQgPSAnb25NYXJrU2VsZWN0aW9uQ2hhbmdlZCcsXG4gIE9uUGFyYW1ldGVyQ2hhbmdlZCA9ICdvblBhcmFtZXRlckNoYW5nZWQnLFxuICBPblRvb2xiYXJTdGF0ZUNoYW5nZWQgPSAnb25Ub29sYmFyU3RhdGVDaGFuZ2VkJyxcbiAgT25VcmxBY3Rpb24gPSAnb25VcmxBY3Rpb24nLFxuICBPblRhYlN3aXRjaGVkID0gJ29uVGFiU3dpdGNoZWQnLFxuICBPbkN1c3RvbVZpZXdMb2FkZWQgPSAnb25DdXN0b21WaWV3TG9hZGVkJyxcbiAgT25DdXN0b21WaWV3UmVtb3ZlZCA9ICdvbkN1c3RvbVZpZXdSZW1vdmVkJyxcbiAgT25DdXN0b21WaWV3U2F2ZWQgPSAnb25DdXN0b21WaWV3U2F2ZWQnLFxuICBPbkN1c3RvbVZpZXdTZXREZWZhdWx0ID0gJ29uQ3VzdG9tVmlld1NldERlZmF1bHQnLFxuICBPblN0b3J5UG9pbnRTd2l0Y2hlZCA9ICdvblN0b3J5UG9pbnRTd2l0Y2hlZCcsXG4gIE9uU3VtbWFyeURhdGFDaGFuZ2VkID0gJ29uU3VtbWFyeURhdGFDaGFuZ2VkJyxcbiAgT25SZWFkeVRvUmVjZWl2ZUF1dGhUb2tlbiA9ICdvblJlYWR5VG9SZWNlaXZlQXV0aFRva2VuJyxcbn1cblxuLyoqXG4gKiBUaGUgbmFtZXMgb2YgdGhlIHN0cmluZyBjb25zdGFudHMgeW91IGNhbiB1c2UgYXMgSFRNTCBhdHRyaWJ1dGVzIGZvciB0aGUgPHRhYmxlYXUtYXV0aG9yaW5nLXZpej4gd2ViIGNvbXBvbmVudC5cbiAqIEBpZ25vcmVcbiAqL1xuZXhwb3J0IGVudW0gVml6QXV0aG9yaW5nQXR0cmlidXRlcyB7XG4gIE9uV29ya2Jvb2tQdWJsaXNoZWQgPSAnb25Xb3JrYm9va1B1Ymxpc2hlZCcsXG4gIE9uV29ya2Jvb2tQdWJsaXNoZWRBcyA9ICdvbldvcmtib29rUHVibGlzaGVkQXMnLFxuICBPbldvcmtib29rUmVhZHlUb0Nsb3NlID0gJ29uV29ya2Jvb2tSZWFkeVRvQ2xvc2UnLFxuICBIaWRlQ2xvc2VCdXR0b24gPSAnaGlkZS1jbG9zZS1idXR0b24nLFxufVxuXG4vKipcbiAqIFRoZSBuYW1lcyBvZiB0aGUgc3RyaW5nIGNvbnN0YW50cyB5b3UgY2FuIHVzZSBhcyBjaGlsZCB0YWdzIGZvciBUYWJsZWF1Vml6IGFuZCBUYWJsZWF1QXV0aG9yaW5nVml6IGN1c3RvbSBlbGVtZW50cy5cbiAqL1xuZXhwb3J0IGVudW0gVml6Q2hpbGRFbGVtZW50cyB7XG4gIC8qKlxuICAgKiBDb250YWlucyBhIGxpc3Qgb2YgZmlsdGVyIHBhcmFtZXRlcnMuIEF2YWlsYWJsZSBvbmx5IGluIHZpZXdpbmcgbW9kZS5cbiAgICovXG4gIFZpekZpbHRlciA9ICd2aXotZmlsdGVyJyxcblxuICAvKipcbiAgICogQ29udGFpbnMgYSBuYW1lIGFuZCB2YWx1ZSBmb3IgYSBwYXJhbWV0ZXIuIEF2YWlsYWJsZSBvbmx5IGluIHZpZXdpbmcgbW9kZS5cbiAgICovXG4gIFZpelBhcmFtZXRlciA9ICd2aXotcGFyYW1ldGVyJyxcblxuICAvKipcbiAgICogQ29udGFpbnMgYSBsaXN0IG9mIGN1c3RvbSBwYXJhbWV0ZXJzLiAgQXZhaWxhYmxlIGluIGJvdGggdmlld2luZyBhbmQgYXV0aG9yaW5nIG1vZGVzLlxuICAgKi9cbiAgQ3VzdG9tUGFyYW1ldGVyID0gJ2N1c3RvbS1wYXJhbWV0ZXInLFxuXG4gIC8qKlxuICAgKiBDdXN0b20gc3R5bGVzIGFwcGxpY2FibGUgdG8gdGhlIGVtYmVkZGVkIGlmcmFtZSBlbGVtZW50IGl0c2VsZiAobm90IGluc2lkZSBpdCkuIEF2YWlsYWJsZSBpbiBib3RoIHZpZXdpbmcgYW5kIGF1dGhvcmluZyBtb2Rlcy5cbiAgICovXG4gIElmcmFtZVN0eWxlID0gJ2lmcmFtZS1zdHlsZScsXG59XG5cbmV4cG9ydCBlbnVtIFZpekNoaWxkRWxlbWVudEF0dHJpYnV0ZXMge1xuICBGaWVsZCA9ICdmaWVsZCcsXG4gIFZhbHVlID0gJ3ZhbHVlJyxcbiAgTmFtZSA9ICduYW1lJyxcbn1cblxuLyoqXG4gKiBUaGUgaW50ZXJmYWNlIGZvciB0aGUgdG9wIGxldmVsIFZpeiBvYmplY3QuXG4gKiovXG5leHBvcnQgaW50ZXJmYWNlIFZpeiBleHRlbmRzIFZpelNldHRpbmdzLCBXZWJDb21wb25lbnRMb2NhbFNldHRpbmdzLCBWaXpBY3Rpb25zIHtcbiAgLyoqXG4gICAqIE9uZSBXb3JrYm9vayBpcyBzdXBwb3J0ZWQgcGVyIHZpc3VhbGl6YXRpb24uXG4gICAqL1xuICByZWFkb25seSB3b3JrYm9vaz86IFdvcmtib29rO1xuXG4gIC8qKlxuICAgKiBQcm92aWRlIGFuIGF1dGggdG9rZW4gZm9yIHNhbGVzZm9yY2UgbmF0aXZlIG1vZGVcbiAgICogQHBhcmFtIHRva2VuXG4gICAqL1xuICBzZXRBdXRoVG9rZW4odG9rZW46IHN0cmluZyk6IHZvaWQ7XG59XG5cbi8qKlxuICogVGhlIGludGVyZmFjZSBmb3IgdGhlIHRvcCBsZXZlbCBBdXRob3JpbmcgVml6IG9iamVjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRob3JpbmdWaXogZXh0ZW5kcyBWaXpBdXRob3JpbmdTZXR0aW5ncywgV2ViQ29tcG9uZW50TG9jYWxTZXR0aW5ncyB7XG4gIC8qKlxuICAgKiBHZXRzIHRoZSB2aXN1YWxpemF0aW9uJ3MgY3VycmVudCBVUkwuXG4gICAqL1xuICBnZXRDdXJyZW50U3JjQXN5bmMoKTogUHJvbWlzZTxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBQcm92aWRlIGFuIGF1dGggdG9rZW4gZm9yIHNhbGVzZm9yY2UgbmF0aXZlIG1vZGVcbiAgICogQHBhcmFtIHRva2VuXG4gICAqL1xuICBzZXRBdXRoVG9rZW4odG9rZW46IHN0cmluZyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFVzZSB0aGlzIG1ldGhvZCB0byByZWFkanVzdCB0aGUgZGltZW5zaW9ucyBvZiB0aGUgZW1iZWRkZWQgdml6IGluIHJlc3BvbnNlIHRvIHRoaW5ncyBsaWtlIGEgd2luZG93IHJlc2l6ZSwgZGV2aWNlIG9yaWVudGF0aW9uIGNoYW5nZSwgb3JcbiAgICogcGFyZW50IGNvbnRhaW5lciByZXNpemUuXG4gICAqXG4gICAqIGBgYFxuICAgKiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgKCkgPT4gdml6LnJlc2l6ZSgpKTtcbiAgICpcbiAgICogbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHZpei5yZXNpemUoKSkub2JzZXJ2ZSh2aXoucGFyZW50RWxlbWVudCk7XG4gICAqIGBgYFxuICAgKi9cbiAgcmVzaXplKCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFVzZSB0aGlzIG1ldGhvZCB0byBsYXVuY2ggdGhlIEFuYWx5dGljcyBBc3Npc3RhbnQgc2lkZSBwYW5lLlxuICAgKiBZb3UgY2FuIHVzZSB0aGUgYGlzQW5hbHl0aWNzQXNzaXN0YW50QXZhaWxhYmxlQXN5bmMoKWAgbWV0aG9kIHRvIGNoZWNrIGlmIHRoZSBBbmFseXRpY3MgQXNzaXN0YW50IGlzIGF2YWlsYWJsZSBmb3IgdXNlLlxuICAgKlxuICAgKiBgYGBcbiAgICogY29uc3QgaXNBbmFseXRpY3NBc3Npc3RhbnRBdmFpbGFibGUgPSBhd2FpdCB2aXouaXNBbmFseXRpY3NBc3Npc3RhbnRBdmFpbGFibGVBc3luYygpO1xuICAgKiBpZiAoaXNBbmFseXRpY3NBc3Npc3RhbnRBdmFpbGFibGUpIHtcbiAgICogICBhd2FpdCB2aXoubGF1bmNoQW5hbHl0aWNzQXNzaXN0YW50QXN5bmMoKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGxhdW5jaEFuYWx5dGljc0Fzc2lzdGFudEFzeW5jKCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBBbmFseXRpY3MgQXNzaXN0YW50IHNpZGUgcGFuZSBpcyBhdmFpbGFibGUuXG4gICAqL1xuICBpc0FuYWx5dGljc0Fzc2lzdGFudEF2YWlsYWJsZUFzeW5jKCk6IFByb21pc2U8Ym9vbGVhbj47XG59XG5cbi8qKlxuICogUGFydGlhbGx5IGltcGxlbWVudGVkIC0gQWN0aW9ucyByZWxhdGVkIHRvIGV2ZW50cyBhbmQgc3RhdGUgb2YgdGhlIHZpelxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpekFjdGlvbnMge1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgYXV0b21hdGljIHVwZGF0ZXMgYXJlIGN1cnJlbnRseSBwYXVzZWQuXG4gICAqL1xuICByZWFkb25seSBhdXRvbWF0aWNVcGRhdGVzQXJlUGF1c2VkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBQYXVzZSBsYXlvdXQgdXBkYXRlcy4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IGFyZSByZXNpemluZyB0aGUgdmlzdWFsaXphdGlvbiBvciBwZXJmb3JtaW5nIG11bHRpcGxlIGNhbGxzIHRoYXQgY291bGQgYWZmZWN0IHRoZSBsYXlvdXQuXG4gICAqL1xuICBwYXVzZUF1dG9tYXRpY1VwZGF0ZXNBc3luYygpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBSZXN1bWUgbGF5b3V0IHVwZGF0ZXMuXG4gICAqL1xuICByZXN1bWVBdXRvbWF0aWNVcGRhdGVzQXN5bmMoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogVG9nZ2xlIGxheW91dCB1cGRhdGVzLlxuICAgKi9cbiAgdG9nZ2xlQXV0b21hdGljVXBkYXRlc0FzeW5jKCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEVxdWl2YWxlbnQgdG8gY2xpY2tpbmcgb24gdGhlIFJldmVydCBBbGwgdG9vbGJhciBidXR0b24sIHdoaWNoIHJlc3RvcmVzIHRoZSB3b3JrYm9vayB0byBpdHMgc3RhcnRpbmcgc3RhdGUuXG4gICAqL1xuICByZXZlcnRBbGxBc3luYygpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBFcXVpdmFsZW50IHRvIGNsaWNraW5nIG9uIHRoZSBSZWZyZXNoIERhdGEgdG9vbGJhciBidXR0b24uXG4gICAqL1xuICByZWZyZXNoRGF0YUFzeW5jKCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEVxdWl2YWxlbnQgdG8gY2xpY2tpbmcgb24gRG93bmxvYWQgPiBJbWFnZSBmcm9tIHRoZSB0b29sYmFyLCB3aGljaCBjcmVhdGVzIGEgUE5HIGZpbGUgb2YgdGhlIGN1cnJlbnQgdmlzdWFsaXphdGlvbi5cbiAgICovXG4gIGV4cG9ydEltYWdlQXN5bmMoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogRXhwb3J0cyB0aGUgY3Jvc3N0YWIgb2YgYW55IGdpdmVuIHdvcmtzaGVldCB3aXRoaW4gdGhlIGN1cnJlbnQgdmlldyB0byBhXG4gICAqIHNwZWNpZmllZCBmb3JtYXQgKENyb3NzdGFiRmlsZUZvcm1hdC5FeGNlbCwgQ3Jvc3N0YWJGaWxlRm9ybWF0LkNTVikuXG4gICAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgc2hlZXQgbmFtZSBkb2VzIG5vdCBtYXRjaCBhbnkgd29ya3NoZWV0cyB3aXRoaW4gdGhlIGFjdGl2ZSBzaGVldC5cbiAgICogVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBjcm9zc3RhYiBmaWxlIGZhaWxlZCB0byBiZSBjcmVhdGVkLlxuICAgKiBOb3RlOiBleHBvcnRDcm9zc3RhYkFzeW5jIHJlc29sdmVzIHdoZW4gYSBkb3dubG9hZCBpcyBpbml0aWF0ZWQuIEl0IGRvZXMgbm90IGluZGljYXRlIHRoYXQgYSBkb3dubG9hZCB3YXMgc3VjY2Vzc2Z1bCBvciBpZiB0aGUgZG93bmxvYWQgd2FzIGNvbXBsZXRlLlxuICAgKlxuICAgKiBgYGBcbiAgICogbGV0IHZpeiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWJsZWF1Vml6Jyk7XG4gICAqIHZpei5leHBvcnRDcm9zc3RhYkFzeW5jKCdTYWxlcyBieSBTZWdtZW50JywgQ3Jvc3N0YWJGaWxlRm9ybWF0LkNTVik7XG4gICAqIGBgYFxuICAgKi9cbiAgZXhwb3J0Q3Jvc3N0YWJBc3luYyhzaGVldE5hbWU6IHN0cmluZywgZm9ybWF0OiBDcm9zc3RhYkZpbGVGb3JtYXQpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBFeHBvcnRzIHRoZSBzdW1tYXJ5IGRhdGEgc2hvd24gaW4gdGhlIFZpZXcgRGF0YSB3aW5kb3dcbiAgICogKHNob3duIHdoZW4geW91IGNsaWNrIERvd25sb2FkID4gRGF0YSBmcm9tIHRoZSB0b29sYmFyIGZvciBhbnkgZ2l2ZW4gd29ya3NoZWV0IHdpdGhpbiB0aGUgY3VycmVudCB2aWV3KS5cbiAgICogVGhlIGN1cnJlbnQgZmlsZSBmb3JtYXQgaXMgQ1NWLiBUaGVyZSBpcyBubyBsaW1pdGF0aW9uIG9uIHRoZSBhbW91bnQgb2Ygc3VtbWFyeSBkYXRhIHlvdSBjYW4gZXhwb3J0LlxuICAgKiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIHNoZWV0IG5hbWUgZG9lcyBub3QgbWF0Y2ggYW55IHdvcmtzaGVldHMgd2l0aGluIHRoZSBhY3RpdmUgc2hlZXQuXG4gICAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgQ1NWIGZpbGUgZmFpbGVkIHRvIGJlIGNyZWF0ZWQuXG4gICAqIE5vdGU6IGV4cG9ydERhdGFBc3luYyByZXNvbHZlcyB3aGVuIGEgZG93bmxvYWQgaXMgaW5pdGlhdGVkLiBJdCBkb2VzIG5vdCBpbmRpY2F0ZSB0aGF0IGEgZG93bmxvYWQgd2FzIHN1Y2Nlc3NmdWwgb3IgaWYgdGhlIGRvd25sb2FkIHdhcyBjb21wbGV0ZS5cbiAgICpcbiAgICogYGBgXG4gICAqIGxldCB2aXogPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFibGVhdVZpeicpO1xuICAgKiBjb25zdCBhY3RpdmVTaGVldCA9IHZpei53b3JrYm9vay5hY3RpdmVTaGVldDtcbiAgICogaWYgKGFjdGl2ZVNoZWV0LnNoZWV0VHlwZSA9PT0gU2hlZXRUeXBlLldvcmtzaGVldCkge1xuICAgKiAgIGNvbnN0IGNvbHVtbnMgPSBhd2FpdCBhY3RpdmVTaGVldC5nZXRTdW1tYXJ5Q29sdW1uc0luZm9Bc3luYygpO1xuICAgKiAgIC8vIEdldHRpbmcgZmllbGRJZCdzIGZvciBMYXRpdHVkZSBhbmQgTG9uZ2l0dWRlIGNvbHVtbnNcbiAgICogICBjb25zdCBjb2x1bW5zVG9JbmNsdWRlQnlJZCA9IGNvbHVtbnMubWFwKChjb2x1bW4pID0+IHtcbiAgICogICAgIGlmIChjb2x1bW4uZmllbGROYW1lID09PSAnTGF0aXR1ZGUnIHx8IGNvbHVtbi5maWVsZE5hbWUgPT09ICdMb25naXR1ZGUnKSB7XG4gICAqICAgICAgIHJldHVybiBjb2x1bW4uZmllbGRJZDtcbiAgICogICAgIH1cbiAgICogICB9KTtcbiAgICogICBhd2FpdCB2aXouZXhwb3J0RGF0YUFzeW5jKGFjdGl2ZVNoZWV0Lm5hbWUsIHsgY29sdW1uc1RvSW5jbHVkZUJ5SWQgfSk7XG4gICAqIH1cbiAgICogZWxzZSBpZiAoYWN0aXZlU2hlZXQuc2hlZXRUeXBlID09PSBTaGVldFR5cGUuRGFzaGJvYXJkKSB7XG4gICAqICAgLy8gRXhwb3J0aW5nIHRoZSBzdW1tYXJ5IGRhdGEgZm9yIGVhY2ggd29ya3NoZWV0IGluIHRoZSBkYXNoYm9hcmQgd2hpbGUgYWxzbyBpZ25vcmluZyBhbGlhc2VzXG4gICAqICAgZm9yIChjb25zdCB3b3Jrc2hlZXQgb2YgYWN0aXZlU2hlZXQud29ya3NoZWV0cykge1xuICAgKiAgICAgYXdhaXQgdml6LmV4cG9ydERhdGFBc3luYyh3b3Jrc2hlZXQubmFtZSwgeyBpZ25vcmVBbGlhc2VzOiB0cnVlIH0pO1xuICAgKiAgIH1cbiAgICogfVxuICAgKiBlbHNlXG4gICAqIHtcbiAgICogICAvLyBhY3RpdmVTaGVldCBpcyBhIFN0b3J5IGFuZCB3ZSB3YW50IHRvIGV4cG9ydCB3b3Jrc2hlZXRzIHdpdGhpbiB0aGUgY3VycmVudCB2aWV3XG4gICAqICAgY29uc3QgY29udGFpbmVkU2hlZXQgPSBhY3RpdmVTaGVldC5hY3RpdmVTdG9yeVBvaW50LmNvbnRhaW5lZFNoZWV0O1xuICAgKiAgIGlmIChjb250YWluZWRTaGVldCAhPT0gdW5kZWZpbmVkICYmIGNvbnRhaW5lZFNoZWV0LnNoZWV0VHlwZSA9PT0gU2hlZXRUeXBlLldvcmtzaGVldCkge1xuICAgKiAgICAgLy8gRXhwb3J0aW5nIHN1bW1hcnkgZGF0YSBvZiBhIHdvcmtzaGVldCB3aXRoaW4gdGhlIGFjdGl2ZSBzdG9yeSBwb2ludFxuICAgKiAgICAgYXdhaXQgdml6LmV4cG9ydERhdGFBc3luYyhjb250YWluZWRTaGVldC5uYW1lKTtcbiAgICogICB9IGVsc2UgaWYgKGNvbnRhaW5lZFNoZWV0ICE9PSB1bmRlZmluZWQgJiYgY29udGFpbmVkU2hlZXQuc2hlZXRUeXBlID09PSBTaGVldFR5cGUuRGFzaGJvYXJkKSB7XG4gICAqICAgICAvLyBFeHBvcnRpbmcgdGhlIHN1bW1hcnkgZGF0YSBmb3IgZWFjaCB3b3Jrc2hlZXQgd2l0aGluIHRoZSBhY3RpdmUgc3RvcnkgcG9pbnRcbiAgICogICAgIGZvciAoY29uc3Qgd29ya3NoZWV0IG9mIGNvbnRhaW5lZFNoZWV0LndvcmtzaGVldHMpIHtcbiAgICogICAgICAgYXdhaXQgdml6LmV4cG9ydERhdGFBc3luYyh3b3Jrc2hlZXQubmFtZSk7XG4gICAqICAgICB9XG4gICAqICAgfVxuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgZXhwb3J0RGF0YUFzeW5jKHNoZWV0TmFtZTogc3RyaW5nLCBvcHRpb25zPzogRXhwb3J0RGF0YU9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBFeHBvcnRzIHRoZSBsaXN0IG9mIHNoZWV0cyB0byBhIFBvd2VyUG9pbnQgZmlsZS4gSWYgbm8gc2hlZXRzIGFyZSBzcGVjaWZpZWQsIHRoZSBjdXJyZW50IHNoZWV0IGlzIGV4cG9ydGVkLlxuICAgKiBUaGUgb3JkZXIgdGhlIHNoZWV0cyBhcHBlYXIgaW4gdGhlIGxpc3QgaXMgdGhlIG9yZGVyIHRoZSBzaGVldHMgYXBwZWFyIGluIHRoZSBQb3dlclBvaW50IGZpbGUuXG4gICAqIFRoZSBsaXN0IG9mIHNoZWV0cyBjYW4gZWl0aGVyIGV4Y2x1c2l2ZWx5IGluY2x1ZGUgdGhlIHdvcmtzaGVldHMgd2l0aGluIGEgZGFzaGJvYXJkIG9yIGV4Y2x1c2l2ZWx5IGluY2x1ZGUgdGhlIHB1Ymxpc2hlZCBzaGVldHMgZnJvbSB0aGUgd29ya2Jvb2suXG4gICAqXG4gICAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgbGlzdCBvZiBzaGVldHMgY29udGFpbnMgYm90aCB3b3Jrc2hlZXRzIHdpdGhpbiBhIGRhc2hib2FyZCBhbmQgcHVibGlzaGVkIHNoZWV0cyBmcm9tIHRoZSB3b3JrYm9vay5cbiAgICogVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBQb3dlclBvaW50IGZpbGUgZmFpbHMgdG8gYmUgY3JlYXRlZC5cbiAgICpcbiAgICogTm90ZTogZXhwb3J0UG93ZXJQb2ludEFzeW5jIHJlc29sdmVzIHdoZW4gYSBkb3dubG9hZCBpcyBpbml0aWF0ZWQuIEl0IGRvZXMgbm90IGluZGljYXRlIHRoYXQgYSBkb3dubG9hZCB3YXMgc3VjY2Vzc2Z1bCBvciBpZiB0aGUgZG93bmxvYWQgd2FzIGNvbXBsZXRlLlxuICAgKlxuICAgKiBgYGBcbiAgICogbGV0IHZpeiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWJsZWF1Vml6Jyk7XG4gICAqIGNvbnN0IHdvcmtib29rID0gdml6Lndvcmtib29rO1xuICAgKiBjb25zdCBhY3RpdmVTaGVldCA9IHdvcmtib29rLmFjdGl2ZVNoZWV0O1xuICAgKiBpZiAoYWN0aXZlU2hlZXQuc2hlZXRUeXBlID09PSBTaGVldFR5cGUuV29ya3NoZWV0IHx8IGFjdGl2ZVNoZWV0LnNoZWV0VHlwZSA9PT0gU2hlZXRUeXBlLlN0b3J5KSB7XG4gICAqICAgYXdhaXQgdml6LmV4cG9ydFBvd2VyUG9pbnRBc3luYygpO1xuICAgKiB9IGVsc2UgaWYgKGFjdGl2ZVNoZWV0LnNoZWV0VHlwZSA9PT0gIFNoZWV0VHlwZS5EYXNoYm9hcmQpIHtcbiAgICogICBjb25zdCB3b3Jrc2hlZXROYW1lcyA9IGFjdGl2ZVNoZWV0LndvcmtzaGVldHMubWFwKCh3b3Jrc2hlZXQpID0+IHdvcmtzaGVldC5uYW1lKTtcbiAgICogICBhd2FpdCB2aXouZXhwb3J0UG93ZXJQb2ludEFzeW5jKHdvcmtzaGVldE5hbWVzKTtcbiAgICogfVxuICAgKiAvLyBleHBvcnRpbmcgYWxsIHNoZWV0cyB3aXRoaW4gdGhlIHdvcmtib29rIHRvIFBvd2VyUG9pbnRcbiAgICogY29uc3QgcHVibGlzaGVkU2hlZXROYW1lcyA9IHdvcmtib29rLnB1Ymxpc2hlZFNoZWV0c0luZm8ubWFwKChwdWJsaXNoZWRTaGVldEluZm8pID0+IHB1Ymxpc2hlZFNoZWV0SW5mby5uYW1lKTtcbiAgICogYXdhaXQgdml6LmV4cG9ydFBvd2VyUG9pbnRBc3luYyhwdWJsaXNoZWRTaGVldE5hbWVzKTtcbiAgICogYGBgXG4gICAqL1xuICBleHBvcnRQb3dlclBvaW50QXN5bmMoc2hlZXROYW1lcz86IEFycmF5PHN0cmluZz4pOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBFeHBvcnRzIHRoZSBsaXN0IG9mIHNoZWV0cyB3aXRoIHRoZSBnaXZlbiB7QGxpbmsgRXhwb3J0UERGT3B0aW9uc30gb3B0aW9ucy4gSWYgbm8gc2hlZXRzIGFyZSBzcGVjaWZpZWQsIHRoZSBjdXJyZW50IHNoZWV0IGlzIGV4cG9ydGVkLlxuICAgKiBUaGUgbGlzdCBvZiBzaGVldHMgY2FuIGVpdGhlciBleGNsdXNpdmVseSBpbmNsdWRlIHRoZSB3b3Jrc2hlZXRzIHdpdGhpbiBhIGRhc2hib2FyZCBvciBleGNsdXNpdmVseSBpbmNsdWRlIHRoZSBwdWJsaXNoZWQgc2hlZXRzIGZyb20gdGhlIHdvcmtib29rLlxuICAgKiBJZiBubyBFeHBvcnRQREZPcHRpb25zIGFyZSBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IHNldHRpbmdzIGFyZTogU2NhbGluZyA9IEF1dG9tYXRpYywgUGFnZVNpemUgPSBMZXR0ZXIsIGFuZCBPcmllbnRhdGlvbiA9IFBvcnRyYWl0LlxuICAgKlxuICAgKiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIGxpc3Qgb2Ygc2hlZXRzIGNvbnRhaW5zIGJvdGggd29ya3NoZWV0cyB3aXRoaW4gYSBkYXNoYm9hcmQgYW5kIHB1Ymxpc2hlZCBzaGVldHMgZnJvbSB0aGUgd29ya2Jvb2suXG4gICAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgUERGIGZpbGUgZmFpbHMgdG8gYmUgY3JlYXRlZC5cbiAgICpcbiAgICogTm90ZTogZXhwb3J0UERGQXN5bmMgcmVzb2x2ZXMgd2hlbiBhIGRvd25sb2FkIGlzIGluaXRpYXRlZC4gSXQgZG9lcyBub3QgaW5kaWNhdGUgdGhhdCBhIGRvd25sb2FkIHdhcyBzdWNjZXNzZnVsIG9yIGlmIHRoZSBkb3dubG9hZCB3YXMgY29tcGxldGUuXG4gICAqXG4gICAqIGBgYFxuICAgKiBsZXQgdml6ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhYmxlYXVWaXonKTtcbiAgICogY29uc3Qgd29ya2Jvb2sgPSB2aXoud29ya2Jvb2s7XG4gICAqIGNvbnN0IGFjdGl2ZVNoZWV0ID0gd29ya2Jvb2suYWN0aXZlU2hlZXQ7XG4gICAqIGlmIChhY3RpdmVTaGVldC5zaGVldFR5cGUgPT09IFNoZWV0VHlwZS5Xb3Jrc2hlZXQgfHwgYWN0aXZlU2hlZXQuc2hlZXRUeXBlID09PSBTaGVldFR5cGUuU3RvcnkpIHtcbiAgICogICBhd2FpdCB2aXouZXhwb3J0UERGQXN5bmMoKTtcbiAgICogfSBlbHNlIGlmIChhY3RpdmVTaGVldC5zaGVldFR5cGUgPT09ICBTaGVldFR5cGUuRGFzaGJvYXJkKSB7XG4gICAqICAgY29uc3Qgd29ya3NoZWV0TmFtZXMgPSBhY3RpdmVTaGVldC53b3Jrc2hlZXRzLm1hcCgod29ya3NoZWV0KSA9PiB3b3Jrc2hlZXQubmFtZSk7XG4gICAqICAgYXdhaXQgdml6LmV4cG9ydFBERkFzeW5jKHdvcmtzaGVldE5hbWVzKTtcbiAgICogfVxuICAgKiAvLyBleHBvcnRpbmcgYWxsIHNoZWV0cyB3aXRoaW4gdGhlIHdvcmtib29rIHRvIFBERlxuICAgKiBjb25zdCBwdWJsaXNoZWRTaGVldE5hbWVzID0gd29ya2Jvb2sucHVibGlzaGVkU2hlZXRzSW5mby5tYXAoKHB1Ymxpc2hlZFNoZWV0SW5mbykgPT4gcHVibGlzaGVkU2hlZXRJbmZvLm5hbWUpO1xuICAgKiBhd2FpdCB2aXouZXhwb3J0UERGQXN5bmMocHVibGlzaGVkU2hlZXROYW1lcyk7XG4gICAqIGBgYFxuICAgKi9cbiAgZXhwb3J0UERGQXN5bmMoc2hlZXROYW1lcz86IEFycmF5PHN0cmluZz4sIG9wdGlvbnM/OiBFeHBvcnRQREZPcHRpb25zKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogRGlzcGxheSBvbmUgb2YgdGhlIGV4cG9ydCBkaWFsb2dzIGJhc2VkIG9uIHRoZSBkaWFsb2dUeXBlIHBhcmFtZXRlclxuICAgKlxuICAgKiBUaHJvd3MgYW4gZXJyb3IgaWYgZGlhbG9nVHlwZSBpcyBpbnZhbGlkXG4gICAqL1xuICBkaXNwbGF5RGlhbG9nQXN5bmMoZGlhbG9nVHlwZTogVGFibGVhdURpYWxvZ1R5cGUpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB2aXN1YWxpemF0aW9uJ3MgY3VycmVudCBVUkwuXG4gICAqL1xuICBnZXRDdXJyZW50U3JjQXN5bmMoKTogUHJvbWlzZTxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBSZWRvZXMgdGhlIGxhc3QgYWN0aW9uIHBlcmZvcm1lZCBvbiBhIHNoZWV0LlxuICAgKi9cbiAgcmVkb0FzeW5jKCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIFVuZG9lcyB0aGUgbGFzdCBhY3Rpb24gcGVyZm9ybWVkIG9uIGEgc2hlZXQuXG4gICAqL1xuICB1bmRvQXN5bmMoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogQWRkcyBhbiBldmVudCBsaXN0ZW5lciB0byB0aGUgc3BlY2lmaWVkIGV2ZW50LlxuICAgKlxuICAgKiBgYGBcbiAgICogYXN5bmMgZnVuY3Rpb24gZ2V0U2VsZWN0ZWRNYXJrcyhldmVudCkge1xuICAgKiAgICAgY29uc3QgbWFya3NTZWxlY3RlZCA9IGF3YWl0IGV2ZW50LmRldGFpbC5nZXRNYXJrc0FzeW5jKCk7XG4gICAqICAgICBjb25zdCBudW1NYXJrcyA9IG1hcmtzU2VsZWN0ZWQuZGF0YVswXS5kYXRhLmxlbmd0aDtcbiAgICogICAgIGNvbnNvbGUubG9nKGAke251bU1hcmtzfSBtYXJrcyBTZWxlY3RlZGApO1xuICAgKiB9XG4gICAqXG4gICAqIGxldCB2aXogPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFibGVhdVZpeicpO1xuICAgKiB2aXouYWRkRXZlbnRMaXN0ZW5lcihcIm1hcmtzZWxlY3Rpb25jaGFuZ2VkXCIsIGdldFNlbGVjdGVkTWFya3MpO1xuICAgKiBgYGBcbiAgICovXG4gIGFkZEV2ZW50TGlzdGVuZXIodHlwZTogVGFibGVhdUV2ZW50VHlwZSwgbGlzdGVuZXI6IEV2ZW50TGlzdGVuZXJPckV2ZW50TGlzdGVuZXJPYmplY3QsIG9wdGlvbnM/OiBib29sZWFuIHwgQWRkRXZlbnRMaXN0ZW5lck9wdGlvbnMpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuIGV2ZW50IGxpc3RlbmVyIGZyb20gdGhlIHNwZWNpZmllZCBldmVudC5cbiAgICpcbiAgICogYGBgXG4gICAqIGxldCB2aXogPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFibGVhdVZpeicpO1xuICAgKiB2aXoucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1hcmtzZWxlY3Rpb25jaGFuZ2VkXCIsIGdldFNlbGVjdGVkTWFya3MpO1xuICAgKiBgYGBcbiAgICovXG4gIHJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZTogVGFibGVhdUV2ZW50VHlwZSwgbGlzdGVuZXI6IEV2ZW50TGlzdGVuZXJPckV2ZW50TGlzdGVuZXJPYmplY3QsIG9wdGlvbnM/OiBib29sZWFuIHwgRXZlbnRMaXN0ZW5lck9wdGlvbnMpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBVc2UgdGhpcyBtZXRob2QgdG8gZmlsdGVyIHRoZSB2aXogYmVmb3JlIGluaXRpYWxpemF0aW9uLiBJZiB1c2VkIGFmdGVyIGluaXRpYWxpemF0aW9uLCBpdCB3aWxsIHJlLXJlbmRlciB0aGUgdml6LlxuICAgKiBGb3IgZmlsdGVyaW5nIGFmdGVyIGluaXRpYWxpemF0aW9uLCB1c2UgdGhlIG90aGVyIGZpbHRlcmluZyBtZXRob2RzLCBzdWNoIGFzIGBhcHBseUZpbHRlckFzeW5jYC5cbiAgICpcbiAgICogSWYgeW91IGFkZCB0aGUgc2FtZSBmaWx0ZXIgZmllbGRzIHVzaW5nIHRoZSBgYWRkRmlsdGVyKClgIG1ldGhvZCBhbmQgYnkgdXNpbmcgdGhlIGA8dml6LWZpbHRlcj5gIGVsZW1lbnQgaW4gdGhlIGA8dGFibGVhdS12aXo+YCB3ZWIgY29tcG9uZW50LFxuICAgKiB5b3UgbWlnaHQgZXhwZXJpZW5jZSB1bmV4cGVjdGVkIGJlaGF2aW9yLlxuICAgKlxuICAgKiBAcGFyYW0gZmllbGROYW1lIFRoZSBuYW1lIG9mIHRoZSBmaWVsZCB0byBmaWx0ZXIgb24uXG4gICAqIEBwYXJhbSB2YWx1ZSBTaW5nbGUgdmFsdWUgb3IgYSBsaXN0IG9mIGNvbW1hIHNlcGFyYXRlZCB2YWx1ZXMgdG8gZmlsdGVyIG9uLlxuICAgKlxuICAgKiBgYGBcbiAgICogdml6LmFkZEZpbHRlcignUmVnaW9uJywgJ0NlbnRyYWwsV2VzdCcpO1xuICAgKiBgYGBcbiAgICovXG4gIGFkZEZpbHRlcihmaWVsZE5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFVzZSB0aGlzIG1ldGhvZCB0byByZWFkanVzdCB0aGUgZGltZW5zaW9ucyBvZiB0aGUgZW1iZWRkZWQgdml6IGluIHJlc3BvbnNlIHRvIHRoaW5ncyBsaWtlIGEgd2luZG93IHJlc2l6ZSwgZGV2aWNlIG9yaWVudGF0aW9uIGNoYW5nZSwgb3JcbiAgICogcGFyZW50IGNvbnRhaW5lciByZXNpemUuXG4gICAqXG4gICAqIGBgYFxuICAgKiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgKCkgPT4gdml6LnJlc2l6ZSgpKTtcbiAgICpcbiAgICogbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHZpei5yZXNpemUoKSkub2JzZXJ2ZSh2aXoucGFyZW50RWxlbWVudCk7XG4gICAqIGBgYFxuICAgKi9cbiAgcmVzaXplKCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFVzZSB0aGlzIG1ldGhvZCB0byBsYXVuY2ggdGhlIEFuYWx5dGljcyBBc3Npc3RhbnQgc2lkZSBwYW5lLlxuICAgKiBZb3UgY2FuIHVzZSB0aGUgYGlzQW5hbHl0aWNzQXNzaXN0YW50QXZhaWxhYmxlQXN5bmMoKWAgbWV0aG9kIHRvIGNoZWNrIGlmIHRoZSBBbmFseXRpY3MgQXNzaXN0YW50IGlzIGF2YWlsYWJsZSBmb3IgdXNlLlxuICAgKlxuICAgKiBgYGBcbiAgICogY29uc3QgaXNBbmFseXRpY3NBc3Npc3RhbnRBdmFpbGFibGUgPSBhd2FpdCB2aXouaXNBbmFseXRpY3NBc3Npc3RhbnRBdmFpbGFibGVBc3luYygpO1xuICAgKiBpZiAoaXNBbmFseXRpY3NBc3Npc3RhbnRBdmFpbGFibGUpIHtcbiAgICogICBhd2FpdCB2aXoubGF1bmNoQW5hbHl0aWNzQXNzaXN0YW50QXN5bmMoKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGxhdW5jaEFuYWx5dGljc0Fzc2lzdGFudEFzeW5jKCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBBbmFseXRpY3MgQXNzaXN0YW50IHNpZGUgcGFuZSBpcyBhdmFpbGFibGUuXG4gICAqL1xuICBpc0FuYWx5dGljc0Fzc2lzdGFudEF2YWlsYWJsZUFzeW5jKCk6IFByb21pc2U8Ym9vbGVhbj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVml6U2l6ZSB7XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzaGVldFNpemUgcmVjb3JkIGZvciB0aGUgY3VycmVudCBzaGVldFxuICAgKi9cbiAgcmVhZG9ubHkgc2hlZXRTaXplOiBTaGVldFNpemU7XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGhlaWdodCBvZiB0aGUgVGFibGVhdSBVSSBlbGVtZW50cyAodGhlIGNocm9tZSkgc3Vycm91bmRpbmcgdGhlIHZpZXcuXG4gICAqL1xuICByZWFkb25seSBjaHJvbWVIZWlnaHQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUaGlzIGludGVyZmFjZSByZXByZXNlbnRzIGFsbCBvZiB0aGUgb3B0aW9ucyBmb3IgY29uZmlndXJpbmcgYSB2aXogdGhhdCBhcmUgY29tbW9uIGJldHdlZW5cbiAqIHZpZXdpbmcgYW5kIGF1dGhvcmluZyBtb2RlLlxuICovXG5pbnRlcmZhY2UgVml6U2V0dGluZ3NTaGFyZWQgZXh0ZW5kcyBXZWJDb21wb25lbnRTZXR0aW5nc1NoYXJlZCB7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0byB0b3VjaCBvcHRpbWl6ZSB2aXogY29udHJvbHMuXG4gICAqXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgdG91Y2gtb3B0aW1pemUgLz5cbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiB0b3VjaC1vcHRpbWl6ZSAvPlxuICAgKiBgYGBcbiAgICovXG4gIHRvdWNoT3B0aW1pemU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgRWRpdCBpbiBEZXNrdG9wIGJ1dHRvbiBpcyBoaWRkZW4gb3IgdmlzaWJsZS5cbiAgICogSWYgbm90IHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gZmFsc2UsIG1lYW5pbmcgdGhhdCB0aGUgRWRpdCBpbiBEZXNrdG9wIGJ1dHRvbiBpcyB2aXNpYmxlLlxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIGhpZGUtZWRpdC1pbi1kZXNrdG9wLWJ1dHRvbj5cbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiBoaWRlLWVkaXQtaW4tZGVza3RvcC1idXR0b24+XG4gICAqIGBgYFxuICAgKi9cbiAgaGlkZUVkaXRJbkRlc2t0b3BCdXR0b24/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZGVmYXVsdCBlZGl0IGJlaGF2aW9yIGlzIHN1cHByZXNzZWQuXG4gICAqIElmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvIGZhbHNlLCBtZWFuaW5nIHRoYXQgdGhlIGRlZmF1bHQgZWRpdCBiZWhhdmlvciBpcyBub3Qgc3VwcHJlc3NlZC5cbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBzdXBwcmVzcy1kZWZhdWx0LWVkaXQtYmVoYXZpb3I+XG4gICAqIDx0YWJsZWF1LWF1dGhvcmluZy12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgc3VwcHJlc3MtZGVmYXVsdC1lZGl0LWJlaGF2aW9yPlxuICAgKiBgYGBcbiAgICovXG4gIHN1cHByZXNzRGVmYXVsdEVkaXRCZWhhdmlvcj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIHRoZSB1c2VyIGNsaWNrcyBvbiB0aGUgRWRpdCBJbiBEZXNrdG9wIEJ1dHRvbi4gWW91IGNhbiB1c2UgdGhpcyBldmVudCB0eXBlIHdpdGggVGFibGVhdVZpeiBvYmplY3RzLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uRWRpdEluRGVza3RvcEJ1dHRvbkNsaWNrZWQ9XCJvbkVkaXRJbkRlc2t0b3BCdXR0b25DbGlja2VkSGFuZGxlclwiIC8+XG4gICAqIDx0YWJsZWF1LWF1dGhvcmluZy12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25FZGl0SW5EZXNrdG9wQnV0dG9uQ2xpY2tlZD1cIm9uRWRpdEluRGVza3RvcEJ1dHRvbkNsaWNrZWRIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvbkVkaXRJbkRlc2t0b3BCdXR0b25DbGlja2VkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgd2hlbiB0aGUgc2l6ZSBvZiB0aGUgdml6IGlzIGtub3duLiBZb3UgY2FuIHVzZSB0aGlzIGV2ZW50IHRvIHBlcmZvcm0gdGFza3Mgc3VjaCBhcyByZXNpemluZ1xuICAgKiB0aGUgZWxlbWVudHMgc3Vycm91bmRpbmcgdGhlIFZpeiBvYmplY3Qgb25jZSB0aGUgb2JqZWN0J3Mgc2l6ZSBoYXMgYmVlbiBlc3RhYmxpc2hlZC5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBcIm9uRmlyc3RWaXpTaXplS25vd25cIj1cIm9uRmlyc3RWaXpTaXplS25vd25IYW5kbGVyXCIgLz5cbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvbkZpcnN0Vml6U2l6ZUtub3duPVwib25GaXJzdFZpelNpemVLbm93bkhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uRmlyc3RWaXpTaXplS25vd24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIHRoZSBWaXogb2JqZWN0IGZpcnN0IGJlY29tZXMgaW50ZXJhY3RpdmUuIFRoaXMgaXMgb25seSByYWlzZWQgb25jZS5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBcIm9uRmlyc3RJbnRlcmFjdGl2ZVwiPVwib25GaXJzdEludGVyYWN0aXZlSGFuZGxlclwiIC8+XG4gICAqIDx0YWJsZWF1LWF1dGhvcmluZy12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25GaXJzdEludGVyYWN0aXZlPVwib25GaXJzdEludGVyYWN0aXZlSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25GaXJzdEludGVyYWN0aXZlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBvcHRpb25zIGZvciBjb25maWd1cmluZyBhIHZpeiBpbiB2aWV3IG1vZGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVml6U2V0dGluZ3MgZXh0ZW5kcyBWaXpTZXR0aW5nc1NoYXJlZCB7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0byBzdXBwcmVzcyB0aGUgZXhlY3V0aW9uIG9mIFVSTCBhY3Rpb25zLiBUaGlzIG9wdGlvbiBkb2VzIG5vdCBwcmV2ZW50IHRoZSBVUkwgYWN0aW9uXG4gICAqIGV2ZW50IGZyb20gYmVpbmcgcmFpc2VkLiBZb3UgY2FuIHVzZSB0aGlzIG9wdGlvbiB0byBjaGFuZ2Ugd2hhdCBoYXBwZW5zIHdoZW4gYSBVUkwgYWN0aW9uIG9jY3Vycy4gSWYgc2V0XG4gICAqIHRvIHRydWUgYW5kIHlvdSBjcmVhdGUgYW4gZXZlbnQgbGlzdGVuZXIgZm9yIHRoZSBVUkxfQUNUSU9OIGV2ZW50LCB5b3UgY2FuIHVzZSBhbiBldmVudCBsaXN0ZW5lclxuICAgKiBoYW5kbGVyIHRvIGN1c3RvbWl6ZSB0aGUgYWN0aW9ucy5cbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBkaXNhYmxlLXVybC1hY3Rpb25zIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgZGlzYWJsZVVybEFjdGlvbnNQb3B1cHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0YWJzIGFyZSBoaWRkZW4gb3Igc2hvd24uXG4gICAqXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgIGhpZGUtdGFicyAvPlxuICAgKiBgYGBcbiAgICovXG4gIGhpZGVUYWJzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBwb3NpdGlvbiBvZiB0aGUgdG9vbGJhciwgaWYgaXQgaXMgc2hvd24uIFRoZSB2YWx1ZXMgY2FuIGJlIFRvb2xiYXIuVG9wLFxuICAgKiBUb29sYmFyLkJvdHRvbSBvciBUb29sYmFyLkhpZGRlbi5cbiAgICogSWYgbm90IHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gVG9vbGJhci5Cb3R0b20uXG4gICAqXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgIHRvb2xiYXI9XCJoaWRkZW5cIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIHRvb2xiYXI/OiBUb29sYmFyO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgYSBkZXZpY2UgbGF5b3V0IGZvciBhIGRhc2hib2FyZCwgaWYgaXQgZXhpc3RzLlxuICAgKiBWYWx1ZXMgY2FuIGJlIGRlZmF1bHQsIGRlc2t0b3AsIHRhYmxldCwgb3IgcGhvbmUuXG4gICAqIElmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvIGxvYWRpbmcgYSBsYXlvdXQgYmFzZWQgb24gdGhlXG4gICAqIHNtYWxsZXN0IGRpbWVuc2lvbiBvZiB0aGUgaG9zdGluZyBpZnJhbWUgZWxlbWVudC5cbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiAgZGV2aWNlPVwiZGVza3RvcFwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgZGV2aWNlPzogRGV2aWNlVHlwZTtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBJRCBvZiBhbiBleGlzdGluZyBpbnN0YW5jZSB0byBtYWtlIGEgY29weSAoY2xvbmUpIG9mLlxuICAgKiBUaGlzIGlzIHVzZWZ1bCBpZiB0aGUgdXNlciB3YW50cyB0byBjb250aW51ZSBhbmFseXNpcyBvZiBhbiBleGlzdGluZyB2aXN1YWxpemF0aW9uXG4gICAqIHdpdGhvdXQgbG9zaW5nIHRoZSBzdGF0ZSBvZiB0aGUgb3JpZ2luYWwuIElmIHRoZSBJRCBkb2VzIG5vdCByZWZlciB0byBhbiBleGlzdGluZyB2aXN1YWxpemF0aW9uLFxuICAgKiB0aGUgY2xvbmVkIHZlcnNpb24gaXMgZGVyaXZlZCBmcm9tIHRoZSBvcmlnaW5hbCB2aXN1YWxpemF0aW9uLlxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiICBpbnN0YW5jZS1pZC10by1jbG9uZT1cImlkMVwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgaW5zdGFuY2VJZFRvQ2xvbmU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBFZGl0IGJ1dHRvbiBpcyBoaWRkZW4gb3IgdmlzaWJsZS5cbiAgICogSWYgbm90IHNldCwgZGVmYXVsdHMgdG8gZmFsc2UsIG1lYW5pbmcgdGhhdCB0aGUgRWRpdCBidXR0b24gaXMgdmlzaWJsZS5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBoaWRlLWVkaXQtYnV0dG9uPlxuICAgKiBgYGBcbiAgICovXG4gIGhpZGVFZGl0QnV0dG9uPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIG9uIHRoZSBFZGl0IEJ1dHRvbi5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvbkVkaXRCdXR0b25DbGlja2VkPVwib25FZGl0QnV0dG9uQ2xpY2tlZEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uRWRpdEJ1dHRvbkNsaWNrZWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIGFueSBmaWx0ZXIgaGFzIGNoYW5nZWQgc3RhdGUuIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFRhYmxlYXVWaXogb2JqZWN0cy5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvbkZpbHRlckNoYW5nZWQ9XCJvbkZpbHRlckNoYW5nZWRIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvbkZpbHRlckNoYW5nZWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIGEgY3VzdG9tIG1hcmsgY29udGV4dCBtZW51IGlzIGNsaWNrZWQuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25DdXN0b21NYXJrQ29udGV4dE1lbnVFdmVudD1cIm9uQ3VzdG9tTWFya0NvbnRleHRNZW51RXZlbnRIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvbkN1c3RvbU1hcmtDb250ZXh0TWVudUV2ZW50Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgd2hlbiB0aGUgc2VsZWN0ZWQgbWFya3Mgb24gYSB2aXN1YWxpemF0aW9uIGhhdmUgY2hhbmdlZC4gWW91IGNhbiB1c2UgdGhpcyBldmVudCB0eXBlIHdpdGggVGFibGVhdVZpeiBvYmplY3RzLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uTWFya1NlbGVjdGlvbkNoYW5nZWQ9XCJvbk1hcmtTZWxlY3Rpb25DaGFuZ2VkSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25NYXJrU2VsZWN0aW9uQ2hhbmdlZD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gYSBwYXJhbWV0ZXIgaGFzIGhhZCBpdHMgdmFsdWUgbW9kaWZpZWQuIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFtbUGFyYW1ldGVyXV0gb2JqZWN0cy5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvblBhcmFtZXRlckNoYW5nZWQ9XCJvblBhcmFtZXRlckNoYW5nZWRIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvblBhcmFtZXRlckNoYW5nZWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIGEgdG9vbGJhciBidXR0b24gb3IgY29udHJvbCBiZWNvbWVzIGF2YWlsYWJsZSBvciBiZWNvbWVzIHVuYXZhaWxhYmxlLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uVG9vbGJhclN0YXRlQ2hhbmdlZD1cIm9uVG9vbGJhclN0YXRlQ2hhbmdlZEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uVG9vbGJhclN0YXRlQ2hhbmdlZD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gYSBVUkwgYWN0aW9uIG9jY3Vycy4gU2VlIHRoZSB7QGxpbmsgVXJsQWN0aW9uRXZlbnR9IGNsYXNzLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uVXJsQWN0aW9uPVwib25VcmxBY3Rpb25IYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvblVybEFjdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIGFmdGVyIGEgdGFiIHN3aXRjaCBvY2N1cnMgKHRoZSBhY3RpdmUgc2hlZXQgaGFzIGNoYW5nZWQpLiBHdWFyYW50ZWVzIHRoZSB2aXogb2JqZWN0IHdpbGwgYmUgaW50ZXJhY3RpdmUgYWZ0ZXIgdGhpcy5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvblRhYlN3aXRjaGVkPVwib25UYWJTd2l0Y2hlZEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uVGFiU3dpdGNoZWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIGEgY3VzdG9tIHZpZXcgaGFzIGZpbmlzaGVkIGxvYWRpbmcuIFRoaXMgZXZlbnQgaXMgcmFpc2VkIGFmdGVyIHRoZSBjYWxsYmFja1xuICAgKiBmdW5jdGlvbiBmb3Ige0BsaW5rIEZpcnN0SW50ZXJhY3RpdmV9IChpZiBhbnkpIGhhcyBiZWVuIGNhbGxlZC5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvbkN1c3RvbVZpZXdMb2FkZWQ9XCJvbkN1c3RvbVZpZXdMb2FkZWRIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvbkN1c3RvbVZpZXdMb2FkZWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIGEgY3VzdG9tIHZpZXcgaGFzIGJlZW4gcmVtb3ZlZC5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvbkN1c3RvbVZpZXdSZW1vdmVkPVwib25DdXN0b21WaWV3UmVtb3ZlZEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uQ3VzdG9tVmlld1JlbW92ZWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIGEgY3VzdG9tIHZpZXcgaGFzIGJlZW4gc2F2ZWQgKG5ld2x5IGNyZWF0ZWQgb3IgdXBkYXRlZCkuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25DdXN0b21WaWV3U2F2ZWQ9XCJvbkN1c3RvbVZpZXdTYXZlZEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uQ3VzdG9tVmlld1NhdmVkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgd2hlbiBhIGN1c3RvbSB2aWV3IGhhcyBiZWVuIHNldCBhcyB0aGUgZGVmYXVsdCB2aWV3IGZvciBhIHdvcmtib29rLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uQ3VzdG9tVmlld1NldERlZmF1bHQ9XCJvbkN1c3RvbVZpZXdTZXREZWZhdWx0SGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25DdXN0b21WaWV3U2V0RGVmYXVsdD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIGFmdGVyIGEgbmV3IHN0b3J5IHBvaW50IGJlY29tZXMgYWN0aXZlLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uU3RvcnlQb2ludFN3aXRjaGVkPVwib25TdG9yeVBvaW50U3dpdGNoZWRIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvblN0b3J5UG9pbnRTd2l0Y2hlZD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gdGhlIHN1bW1hcnkgZGF0YSBvbiBhIHZpc3VhbGl6YXRpb24gaGF2ZSBjaGFuZ2VkLiBZb3UgY2FuIHVzZSB0aGlzIGV2ZW50IHR5cGUgd2l0aCBUYWJsZWF1Vml6IG9iamVjdHMuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25TdW1tYXJ5RGF0YUNoYW5nZWQ9XCJvblN1bW1hcnlEYXRhQ2hhbmdlZEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uU3VtbWFyeURhdGFDaGFuZ2VkPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIChCZXRhKSBSZXByZXNlbnRzIHRoZSBvcHRpb25zIGZvciBjb25maWd1cmluZyBhIHZpeiBpbiBhdXRob3JpbmcgbW9kZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaXpBdXRob3JpbmdTZXR0aW5ncyBleHRlbmRzIFZpelNldHRpbmdzU2hhcmVkIHtcbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBDbG9zZSBidXR0b24gaXMgaGlkZGVuIG9yIHZpc2libGUuXG4gICAqIElmIG5vdCBzZXQsIGRlZmF1bHRzIHRvIGZhbHNlLCBtZWFuaW5nIHRoYXQgdGhlIENsb3NlIGJ1dHRvbiBpcyB2aXNpYmxlLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiBoaWRlLWNsb3NlLWJ1dHRvbiAvPlxuICAgKiBgYGBcbiAgICovXG4gIGhpZGVDbG9zZUJ1dHRvbj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIHRoZSB3b3JrYm9vayBoYXMgYmVlbiBwdWJsaXNoZWQuIFRoaXMgbm90aWZpY2F0aW9uIGlzIHNlbnQgd2hlbiB1c2luZyBlbWJlZGRlZCB3ZWIgYXV0aG9yaW5nIGZ1bmN0aW9uYWxpdHkuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIG9uV29ya2Jvb2tQdWJsaXNoZWQ9XCJvbldvcmtib29rUHVibGlzaGVkSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25Xb3JrYm9va1B1Ymxpc2hlZD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gXCJwdWJsaXNoIGFzXCIgaXMgc3VjY2Vzc2Z1bC4gVGhpcyBub3RpZmljYXRpb24gaXMgc2VudCB3aGVuIHVzaW5nIGVtYmVkZGVkIHdlYiBhdXRob3JpbmcgZnVuY3Rpb25hbGl0eS5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LWF1dGhvcmluZy12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25Xb3JrYm9va1B1Ymxpc2hlZEFzPVwib25Xb3JrYm9va1B1Ymxpc2hlZEFzSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25Xb3JrYm9va1B1Ymxpc2hlZEFzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgd2hlbiB0aGUgd29ya2Jvb2sgaXMgcmVhZHkgdG8gY2xvc2UuIFRoaXMgbm90aWZpY2F0aW9uIGlzIHNlbnQgd2hlbiB1c2luZyBlbWJlZGRlZCB3ZWIgYXV0aG9yaW5nIGZ1bmN0aW9uYWxpdHkuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIG9uV29ya2Jvb2tSZWFkeVRvQ2xvc2U9XCJvbldvcmtib29rUmVhZHlUb0Nsb3NlSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25Xb3JrYm9va1JlYWR5VG9DbG9zZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWx0ZXJQYXJhbWV0ZXJzIHtcbiAgZmllbGQ6IHN0cmluZztcbiAgdmFsdWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBWaXpQYXJhbWV0ZXJzIGFyZSB1c2VkIHRvIHNldCBQYXJhbWV0ZXIgdmFsdWVzIG9uIHRoZSB2aXouXG4gKlxuICogKiBgYGBcbiAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIj5cbiAqICA8dml6LXBhcmFtZXRlciBuYW1lPVwicGFyYW1ldGVyLW5hbWVcIiB2YWx1ZT1cInBhcmFtZXRlci12YWx1ZVwiPjwvdml6LXBhcmFtZXRlcj5cbiAqIDwvdGFibGVhdS12aXo+XG4gKiBgYGBcbiAqXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVml6UGFyYW1ldGVyIHtcbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHBhcmFtZXRlciB0byBiZSBzZXQuXG4gICAqL1xuICBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFZhbGlkIHZhbHVlIGZvciB0aGUgcGFyYW1ldGVyIGJlaW5nIHNldC5cbiAgICovXG4gIHZhbHVlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ3VzdG9tUGFyYW1ldGVycyBhcmUgdXNlZCB0byBwYXNzIGFsb25nIHNldHRpbmdzLCBpbmZvcm1hdGlvbiwgZXRjLiwgdGhhdCBhcmVuJ3QgZXhwb3NlZCBvbiB0aGVcbiAqIHRhYmxlYXUtdml6IGVsZW1lbnQuIEN1c3RvbVBhcmFtZXRlcnMgd2lsbCBvdmVycmlkZSBhdHRyaWJ1dGVzLCBvciBmaWx0ZXJzLCBzZXQgb24gdGhlIHRhYmxlYXUtdml6IGVsZW1lbnQuXG4gKlxuICogKiBgYGBcbiAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIj5cbiAqICA8Y3VzdG9tLXBhcmFtZXRlciBuYW1lPVwicGFyYW1ldGVyLW5hbWVcIiB2YWx1ZT1cInBhcmFtZXRlci12YWx1ZVwiPjwvY3VzdG9tLXBhcmFtZXRlcj5cbiAqIDwvdGFibGVhdS12aXo+XG4gKiBgYGBcbiAqXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3VzdG9tUGFyYW1ldGVyIHtcbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHBhcmFtZXRlciB0byBiZSBzZXQuXG4gICAqL1xuICBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFZhbGlkIHZhbHVlIGZvciB0aGUgcGFyYW1ldGVyIGJlaW5nIHNldC5cbiAgICovXG4gIHZhbHVlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBvYmplY3QgZm9yIGV4cG9ydGluZyBkYXRhLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4cG9ydERhdGFPcHRpb25zIHtcbiAgLyoqXG4gICAqIERvIG5vdCB1c2UgYWxpYXNlcyBzcGVjaWZpZWQgaW4gdGhlIGRhdGEgc291cmNlIGluIFRhYmxlYXUuIERlZmF1bHQgaXMgZmFsc2UuXG4gICAqL1xuICBpZ25vcmVBbGlhc2VzPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRoZSBjb2x1bW5zIHRvIGluY2x1ZGUgc3BlY2lmaWVkIGJ5IGZpZWxkIGlkLCBpbmNsdWRlcyBhbGwgYnkgZGVmYXVsdC5cbiAgICogVGhlIG9yZGVyIG9mIHRoZSBjb2x1bW4gaWRzIGluIHRoZSBhcnJheSBkZXRlcm1pbmVzIHRoZSBjb2x1bW4gb3JkZXIgc2hvd24gaW4gdGhlIHN1bW1hcnkgZGF0YSB0YWJsZS5cbiAgICovXG4gIGNvbHVtbnNUb0luY2x1ZGVCeUlkPzogQXJyYXk8c3RyaW5nPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeHBvcnRQREZPcHRpb25zIHtcbiAgc2NhbGluZzogUHJpbnRTY2FsaW5nO1xuICBwYWdlU2l6ZTogUHJpbnRQYWdlU2l6ZTtcbiAgb3JpZW50YXRpb246IFByaW50T3JpZW50YXRpb247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhwb3J0U2NlbmFyaW9zRm9yUERGQW5kUG93ZXJQb2ludCB7XG4gIGN1cnJlbnRTaGVldE5hbWU6IHN0cmluZztcbiAgZXhwb3J0YWJsZVNoZWV0TmFtZXNGcm9tRGFzaGJvYXJkOiBBcnJheTxzdHJpbmc+O1xuICBleHBvcnRhYmxlU2hlZXROYW1lc0Zyb21Xb3JrYm9vazogQXJyYXk8c3RyaW5nPjtcbn1cbiIsIi8qKlxuICogVXNlciBzdXBwbGllZCBvcHRpb25zIHRoYXQgZG8gbm90IGdldCBwYXNzZWQgYXMgcmVxdWVzdCBwYXJhbWV0ZXJzIHRvIGxvYWQgYSBUYWJsZWF1IHZpeiwgVGFibGVhdSBhc2tkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2ViQ29tcG9uZW50TG9jYWxTZXR0aW5ncyB7XG4gIC8qKlxuICAgKiBUaGUgdml6IHNyY1xuICAgKi9cbiAgc3JjPzogc3RyaW5nIHwgbnVsbDtcblxuICAvKipcbiAgICogUmVwcmVzZW50cyB3aWR0aCBpbiBwaXhlbHNcbiAgICogQ2FuIGJlIGFueSB2YWxpZCBDU1Mgc2l6ZSBzcGVjaWZpZXIuIElmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvIHRoZSBwdWJsaXNoZWQgd2lkdGggb2YgdGhlIHZpZXcuXG4gICAqL1xuICB3aWR0aD86IHN0cmluZyB8IG51bWJlcjtcblxuICAvKipcbiAgICogUmVwcmVzZW50cyBoZWlnaHQgaW4gcGl4ZWxzXG4gICAqIENhbiBiZSBhbnkgdmFsaWQgQ1NTIHNpemUgc3BlY2lmaWVyLiBJZiBub3Qgc3BlY2lmaWVkLCBkZWZhdWx0cyB0byB0aGUgcHVibGlzaGVkIGhlaWdodCBvZiB0aGUgdmlldy5cbiAgICovXG4gIGhlaWdodD86IHN0cmluZyB8IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUaGlzIGludGVyZmFjZSByZXByZXNlbnRzIGFsbCBvZiB0aGUgb3B0aW9ucyBmb3IgY29uZmlndXJpbmcgYSB3ZWJjb21wb25lbnQgdGhhdCBhcmUgY29tbW9uIGJldHdlZW5cbiAqIHZpeiBhbmQgYXNrZGF0YS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJDb21wb25lbnRTZXR0aW5nc1NoYXJlZCB7XG4gIC8qKlxuICAgKiBUaGUgdG9rZW4gdXNlZCBmb3IgYXV0aG9yaXphdGlvblxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIHRva2VuPVwic29tZS10b2tlbi1jb250YWluaW5nLWNsaWVudElkXCIgLz5cbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiB0b2tlbj1cInNvbWUtdG9rZW4tY29udGFpbmluZy1jbGllbnRJZFwiIC8+XG4gICAqIDx0YWJsZWF1LWFzay1kYXRhIGlkPVwidGFibGVhdUFza0RhdGFcIiB0b2tlbj1cInNvbWUtdG9rZW4tY29udGFpbmluZy1jbGllbnRJZFwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgdG9rZW4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBub24tbWluaWZpZWQgdmVyc2lvbiBvZiBKYXZhU2NyaXB0IGlzIGxvYWRlZC4gSWYgc3BlY2lmaWVkIChvciBzZXQgdG8gdHJ1ZSksIHRoZVxuICAgKiBub24tbWluaWZpZWQgdmVyc2lvbiBpcyB1c2VkIGZvciBib3RoIHRoZSBsb2NhbCBjb21wb25lbnQgYW5kIHRoZSBUYWJsZWF1IFNlcnZlciB2aXN1YWxpemF0aW9uIChpZiBlbmFibGVkKS5cbiAgICogSWYgbm90IHNwZWNpZmllZCAob3Igc2V0IHRvIGZhbHNlKSwgdGhlIG1pbmlmaWVkIHZlcnNpb24gb2YgdGhlIEphdmFTY3JpcHQgZmlsZXMgYXJlIGxvYWRlZC5cbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBkZWJ1ZyAvPlxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIGRlYnVnIC8+XG4gICAqIDx0YWJsZWF1LWFzay1kYXRhIGlkPVwidGFibGVhdUFza0RhdGFcIiBkZWJ1ZyAvPlxuICAgKiBgYGBcbiAgICovXG4gIGRlYnVnPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdG8gdXNlIHRoZSBvbGQgYXV0aCBtZWNoYW5pc20gZm9yIGF1dGhlbnRpY2F0aW9uIHdoaWNoIGhhcHBlbnMgaW5zaWRlIHRoZSBpZnJhbWUuIElmIHNwZWNpZmllZCwgVml6TG9hZEVycm9yRXZlbnRzXG4gICAqIHRyaWdnZXJlZCBkdWUgdG8gYXV0aCBmYWlsdXJlcyB3aWxsIG5vdCBiZSB0aHJvd24uXG4gICAqXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgaWZyYW1lLWF1dGggLz5cbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiBpZnJhbWUtYXV0aCAvPlxuICAgKiA8dGFibGVhdS1hc2stZGF0YSBpZD1cInRhYmxlYXVBc2tEYXRhXCIgaWZyYW1lLWF1dGggLz5cbiAgICogYGBgXG4gICAqL1xuICBpZnJhbWVBdXRoPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHZhbHVlIG9mIHRoZSAnbG9hZGluZycgYXR0cmlidXRlIG9mIHRoZSBlbWJlZGRlZCBpZnJhbWUuXG4gICAqIFNlZTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRNTC9FbGVtZW50L2lmcmFtZSNsb2FkaW5nXG4gICAqXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgaWZyYW1lLWF0dHItbG9hZGluZz1cImxhenlcIiAvPlxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIGlmcmFtZS1hdHRyLWxvYWRpbmc9XCJsYXp5XCIgLz5cbiAgICogPHRhYmxlYXUtcHVsc2UgaWQ9XCJ0YWJsZWF1UHVsc2VcIiBpZnJhbWUtYXR0ci1sb2FkaW5nPVwibGF6eVwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgaWZyYW1lQXR0cmlidXRlTG9hZGluZz86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZhbHVlIG9mIHRoZSAnc3R5bGUnIGF0dHJpYnV0ZSBvZiB0aGUgZW1iZWRkZWQgaWZyYW1lLlxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIGlmcmFtZS1hdHRyLXN0eWxlPVwiYm9yZGVyOiAxcHggc29saWQgcmVkXCIgLz5cbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiBpZnJhbWUtYXR0ci1zdHlsZT1cImJvcmRlcjogMXB4IHNvbGlkIHJlZFwiIC8+XG4gICAqIDx0YWJsZWF1LXB1bHNlIGlkPVwidGFibGVhdVB1bHNlXCIgaWZyYW1lLWF0dHItc3R5bGU9XCJib3JkZXI6IDFweCBzb2xpZCByZWRcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIGlmcmFtZUF0dHJpYnV0ZVN0eWxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgb2YgdGhlICdjbGFzcycgYXR0cmlidXRlIG9mIHRoZSBlbWJlZGRlZCBpZnJhbWUgcHJvdmlkaW5nIGFjY2VzcyB0byBhbnlcbiAgICogY3VzdG9tIHNlbGVjdG9ycyBkZWZpbmVkIGluIHRoZSBgPGlmcmFtZS1zdHlsZT5gIGNoaWxkIHRhZy5cbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBpZnJhbWUtYXR0ci1jbGFzcz1cInJlZC1ib3JkZXJcIj5cbiAgICogICA8aWZyYW1lLXN0eWxlPlxuICAgKiAgICAgLnJlZC1ib3JkZXIge1xuICAgKiAgICAgICBib3JkZXI6IDFweCBzb2xpZCByZWQ7XG4gICAqICAgICB9XG4gICAqICAgPC9pZnJhbWUtc3R5bGU+XG4gICAqIDwvdGFibGVhdS12aXo+XG4gICAqIGBgYFxuICAgKi9cbiAgaWZyYW1lQXR0cmlidXRlQ2xhc3M/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIG5hbWVzIG9mIHRoZSBjb21tb24gc3RyaW5nIGNvbnN0YW50cyB5b3UgY2FuIHVzZSBhcyBIVE1MIGF0dHJpYnV0ZXMgZm9yIHRoZSB0YWJsZWF1IHdlYiBjb21wb25lbnQuXG4gKiBAaWdub3JlXG4gKi9cbmV4cG9ydCBlbnVtIFdlYkNvbXBvbmVudEF0dHJpYnV0ZXMge1xuICBTcmMgPSAnc3JjJyxcbiAgV2lkdGggPSAnd2lkdGgnLFxuICBIZWlnaHQgPSAnaGVpZ2h0JyxcbiAgVG9rZW4gPSAndG9rZW4nLFxuICBEZWJ1ZyA9ICdkZWJ1ZycsXG4gIElmcmFtZUF1dGggPSAnaWZyYW1lLWF1dGgnLFxuICBPblZpekxvYWRFcnJvciA9ICdvbnZpemxvYWRlcnJvcicsXG4gIEZvcmNlVG9rZW5TeW5jID0gJ2ZvcmNlLXRva2VuLXN5bmMnLFxufVxuXG4vKipcbiAqIFRoZSBuYW1lcyBvZiB0aGUgZW1iZWRkZWQgaWZyYW1lIGF0dHJpYnV0ZXMgd2hvc2UgdmFsdWVzIGNhbiBiZSBjb250cm9sbGVkLlxuICogQGlnbm9yZVxuICovXG5leHBvcnQgZW51bSBFbWJlZGRlZElmcmFtZUF0dHJpYnV0ZXMge1xuICBMb2FkaW5nID0gJ2lmcmFtZS1hdHRyLWxvYWRpbmcnLFxuICBTdHlsZSA9ICdpZnJhbWUtYXR0ci1zdHlsZScsXG4gIENsYXNzID0gJ2lmcmFtZS1hdHRyLWNsYXNzJyxcbn1cblxuLyoqXG4gKiBUaGUgbmFtZXMgb2YgdGhlIHN0cmluZyBjb25zdGFudHMgeW91IGNhbiB1c2UgYXMgY2hpbGQgdGFncyBmb3IgVGFibGVhdVZpeiwgVGFibGVhdUF1dGhvcmluZ1ZpeiBhbmQgVGFibGVhdUFza0RhdGEgY3VzdG9tIGVsZW1lbnRzLlxuICogQGlnbm9yZVxuICovXG5leHBvcnQgZW51bSBXZWJDb21wb25lbnRDaGlsZEVsZW1lbnRzIHtcbiAgLyoqXG4gICAqIENvbnRhaW5zIGEgbGlzdCBvZiBjdXN0b20gcGFyYW1ldGVycy4gIEF2YWlsYWJsZSBpbiB2aXogdmlld2luZywgdml6IGF1dGhvcmluZyBhbmQgYXNrZGF0YS5cbiAgICovXG4gIEN1c3RvbVBhcmFtZXRlciA9ICdjdXN0b20tcGFyYW1ldGVyJyxcblxuICAvKipcbiAgICogQ3VzdG9tIHN0eWxlcyBhcHBsaWNhYmxlIHRvIHRoZSBlbWJlZGRlZCBpZnJhbWUgZWxlbWVudCBpdHNlbGYgKG5vdCBpbnNpZGUgaXQpLlxuICAgKi9cbiAgSWZyYW1lU3R5bGUgPSAnaWZyYW1lLXN0eWxlJyxcbn1cblxuZXhwb3J0IGVudW0gV2ViQ29tcG9uZW50Q2hpbGRFbGVtZW50QXR0cmlidXRlcyB7XG4gIEZpZWxkID0gJ2ZpZWxkJyxcbiAgVmFsdWUgPSAndmFsdWUnLFxuICBOYW1lID0gJ25hbWUnLFxufVxuIiwiLy8gQWxsIGVudW0gdmFsdWVzIG1hZGUgYXZhaWxhYmxlIHRvIEV4dGVuc2lvbnMgZGV2ZWxvcGVycy5cbi8vIEVudW1zIHNob3VsZCBiZSBrZXB0IGluIGFscGhhYmV0aWNhbCBvcmRlci5cblxuaW1wb3J0IHsgRXh0ZW5zaW9ucyB9IGZyb20gJy4vRXh0ZW5zaW9ucyc7XG5cbm5hbWVzcGFjZSBUYWJsZWF1IHtcbiAgZXhwb3J0IGxldCBleHRlbnNpb25zOiBFeHRlbnNpb25zO1xuICAvKipcbiAgICogQWxsIGVycm9yIGNvZGVzIHVzZWQgYnkgdGhlIEV4dGVuc2lvbnMgQVBJLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gRXJyb3JDb2RlcyB7XG4gICAgLyoqXG4gICAgICogVGhyb3duIHdoZW4gY2FsbGVyIGF0dGVtcHRzIHRvIGV4ZWN1dGUgY29tbWFuZCBiZWZvcmUgaW5pdGlhbGl6YXRpb24gaGFzIGNvbXBsZXRlZC5cbiAgICAgKi9cbiAgICBBUElOb3RJbml0aWFsaXplZCA9ICdhcGktbm90LWluaXRpYWxpemVkJyxcbiAgICAvKipcbiAgICAgKiBUaHJvd24gd2hlbiBjYWxsZXIgYXR0ZW1wdHMgdG8gZXhlY3V0ZSBjb21tYW5kIHdoaWxlIGV4dGVuc2lvbiBpcyBub3QgdmlzaWJsZS5cbiAgICAgKi9cbiAgICBWaXNpYmlsaXR5RXJyb3IgPSAndmlzaWJpbGl0eS1lcnJvcicsXG4gICAgLyoqXG4gICAgICogT25seSBvbmUgZGlhbG9nIGNhbiBiZSBvcGVuZWQgYXQgdGltZSB3aXRoIHRoZSBVSSBuYW1lc3BhY2UgZnVuY3Rpb25hbGl0eS5cbiAgICAgKi9cbiAgICBEaWFsb2dBbHJlYWR5T3BlbiA9ICdkaWFsb2ctYWxyZWFkeS1vcGVuJyxcbiAgICAvKipcbiAgICAgKiBUaGUgb3BlbiBkaWFsb2cgd2FzIGNsb3NlZCBieSB0aGUgdXNlci5cbiAgICAgKi9cbiAgICBEaWFsb2dDbG9zZWRCeVVzZXIgPSAnZGlhbG9nLWNsb3NlZC1ieS11c2VyJyxcbiAgICAvKipcbiAgICAgKiBBbiBlcnJvciBvY2N1cnJlZCB3aXRoaW4gdGhlIFRhYmxlYXUgRXh0ZW5zaW9ucyBBUEkuIENvbnRhY3QgVGFibGVhdSBTdXBwb3J0LlxuICAgICAqL1xuICAgIEludGVybmFsRXJyb3IgPSAnaW50ZXJuYWwtZXJyb3InLFxuICAgIC8qKlxuICAgICAqIEEgZGlhbG9nIG11c3Qgc3RhcnQgb24gdGhlIHNhbWUgZG9tYWluIGFzIHRoZSBwYXJlbnQgZXh0ZW5pb24uXG4gICAgICovXG4gICAgSW52YWxpZERvbWFpbkRpYWxvZyA9ICdpbnZhbGlkLWRpYWxvZy1kb21haW4nLFxuICAgIC8qKlxuICAgICAqIEEgcGFyYW1ldGVyIGlzIG5vdCB0aGUgY29ycmVjdCBkYXRhIHR5cGUgb3IgZm9ybWF0LiBUaGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCBpbiB0aGUgRXJyb3IubWVzc2FnZSBmaWVsZC5cbiAgICAgKi9cbiAgICBJbnZhbGlkUGFyYW1ldGVyID0gJ2ludmFsaWQtcGFyYW1ldGVyJyxcbiAgICAvKipcbiAgICAgKiBDYW4gb2NjdXIgaWYgdGhlIGV4dGVuc2lvbiBpbnRlcmFjdHMgd2l0aCBhIGZpbHRlciB0aGF0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgd29ya3NoZWV0LlxuICAgICAqL1xuICAgIE1pc3NpbmdGaWx0ZXIgPSAnbWlzc2luZy1maWx0ZXInLFxuICAgIC8qKlxuICAgICAqIENhbiBvY2N1ciBpZiB0aGUgZXh0ZW5zaW9uIGludGVyYWN0cyB3aXRoIGEgcGFyYW1ldGVyIHRoYXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSB3b3Jrc2hlZXQuXG4gICAgICovXG4gICAgTWlzc2luZ1BhcmFtZXRlciA9ICdtaXNzaW5nLXBhcmFtZXRlcicsXG4gICAgLyoqXG4gICAgICogSW50ZXJuYWwgU2VydmVyIEVycm9yXG4gICAgICovXG4gICAgU2VydmVyRXJyb3IgPSAnc2VydmVyLWVycm9yJyxcbiAgICAvKipcbiAgICAgKiBEZXZlbG9wZXIgY2Fubm90IHNhdmUgc2V0dGluZ3Mgd2hpbGUgYW5vdGhlciBzYXZlIGlzIHN0aWxsIGluIHByb2dyZXNzLlxuICAgICAqL1xuICAgIFNldHRpbmdTYXZlSW5Qcm9ncmVzcyA9ICdzZXR0aW5nLXNhdmUtaW4tcHJvZ3Jlc3MnLFxuICAgIC8qKlxuICAgICAqIEFuIHVua25vd24gZXZlbnQgbmFtZSB3YXMgc3BlY2lmaWVkIGluIHRoZSBjYWxsIHRvIGBhZGRFdmVudExpc3RlbmVyYCBvciBgcmVtb3ZlRXZlbnRMaXN0ZW5lcmAuXG4gICAgICovXG4gICAgVW5zdXBwb3J0ZWRFdmVudE5hbWUgPSAndW5zdXBwb3J0ZWQtZXZlbnQtbmFtZScsXG4gICAgLyoqXG4gICAgICogQSBtZXRob2Qgd2FzIHVzZWQgZm9yIGEgdHlwZSBvZiBkYXRhIHNvdXJjZSB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCB0aGF0IG1ldGhvZCAoc2VlIGdldEFjdGl2ZVRhYmxlc0FzeW5jIGZvciBhbiBleGFtcGxlKVxuICAgICAqL1xuICAgIFVuc3VwcG9ydGVkTWV0aG9kRm9yRGF0YVNvdXJjZVR5cGUgPSAndW5zdXBwb3J0ZWQtbWV0aG9kLWZvci1kYXRhLXNvdXJjZS10eXBlJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgRXh0ZW5zaW9ucyBpcyBjdXJyZW50bHkgcnVubmluZy5cbiAgICovXG4gIGV4cG9ydCBlbnVtIEV4dGVuc2lvbkNvbnRleHQge1xuICAgIERlc2t0b3AgPSAnZGVza3RvcCcsXG4gICAgU2VydmVyID0gJ3NlcnZlcicsXG4gICAgQ2xvdWQgPSAnY2xvdWQnLFxuICAgIFB1YmxpY1dlYiA9ICdwdWJsaWMtd2ViJyxcbiAgICBQdWJsaWNEZXNrdG9wID0gJ3B1YmxpYy1kZXNrdG9wJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbW9kZSBpbiB3aGljaCB0aGUgRXh0ZW5zaW9ucyBpcyBjdXJyZW50bHkgcnVubmluZy5cbiAgICovXG4gIGV4cG9ydCBlbnVtIEV4dGVuc2lvbk1vZGUge1xuICAgIEF1dGhvcmluZyA9ICdhdXRob3JpbmcnLFxuICAgIFZpZXdpbmcgPSAndmlld2luZycsXG4gIH1cblxuICAvKipcbiAgICogUmVwcmVzZW50cyB0aGUgdHlwZSBvZiBldmVudCB0aGF0IGNhbiBiZSBsaXN0ZW5lZCBmb3IuXG4gICAqL1xuICBleHBvcnQgZW51bSBUYWJsZWF1RXZlbnRUeXBlIHtcbiAgICAvKipcbiAgICAgKiBAZXhwZXJpbWVudGFsXG4gICAgICogUmFpc2VkIHdoZW4gYSBtZXNzYWdlIGlzIHJlY2VpdmVkIHRoYXQgd2FzIHNlbnQgYnkgYSBkaWFsb2cgb3IgZXh0ZW5zaW9uIHZpYSBgc2VuZERpYWxvZ01lc3NhZ2VBc3luY2AuKi9cbiAgICBEaWFsb2dNZXNzYWdlUmVjZWl2ZWQgPSAnZGlhbG9nLW1lc3NhZ2UtcmVjZWl2ZWQnLFxuXG4gICAgLyoqIFJhaXNlZCB3aGVuIGFueSBmaWx0ZXIgaGFzIGNoYW5nZWQgc3RhdGUuIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFtXb3Jrc2hlZXRdKC4uL2ludGVyZmFjZXMvd29ya3NoZWV0Lmh0bWwpIG9iamVjdHMuKi9cbiAgICBGaWx0ZXJDaGFuZ2VkID0gJ2ZpbHRlci1jaGFuZ2VkJyxcblxuICAgIC8qKiBUaGUgc2VsZWN0ZWQgbWFya3Mgb24gYSB2aXN1YWxpemF0aW9uIGhhcyBjaGFuZ2VkLlxuICAgICAqIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFtXb3Jrc2hlZXRdKC4uL2ludGVyZmFjZXMvd29ya3NoZWV0Lmh0bWwpIG9iamVjdHMuICovXG4gICAgTWFya1NlbGVjdGlvbkNoYW5nZWQgPSAnbWFyay1zZWxlY3Rpb24tY2hhbmdlZCcsXG5cbiAgICAvKiogVGhlIHN1bW1hcnkgZGF0YSBiYWNraW5nIGEgd29ya3NoZWV0IGhhcyBjaGFuZ2VkXG4gICAgICogWW91IGNhbiB1c2UgdGhpcyBldmVudCB0eXBlIHdpdGggW1dvcmtzaGVldF0oLi4vaW50ZXJmYWNlcy93b3Jrc2hlZXQuaHRtbCkgb2JqZWN0cy4qL1xuICAgIFN1bW1hcnlEYXRhQ2hhbmdlZCA9ICdzdW1tYXJ5LWRhdGEtY2hhbmdlZCcsXG5cbiAgICAvKiogQSBwYXJhbWV0ZXIgaGFzIGhhZCBpdHMgdmFsdWUgbW9kaWZpZWQuIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFtbUGFyYW1ldGVyXV0gb2JqZWN0cy4gKi9cbiAgICBQYXJhbWV0ZXJDaGFuZ2VkID0gJ3BhcmFtZXRlci1jaGFuZ2VkJyxcblxuICAgIC8qKiBTZXR0aW5ncyBoYXZlIGJlZW4gY2hhbmdlZCBmb3IgdGhpcyBleHRlbnNpb24uIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFtbU2V0dGluZ3NdXSBvYmplY3RzLiAqL1xuICAgIFNldHRpbmdzQ2hhbmdlZCA9ICdzZXR0aW5ncy1jaGFuZ2VkJyxcblxuICAgIC8qKiBUaGUgZGFzaGJvYXJkIGxheW91dCBoYXMgY2hhbmdlZFxuICAgICAqIEBjYXRlZ29yeSBEYXNoYm9hcmQgRXh0ZW5zaW9uc1xuICAgICAqL1xuICAgIERhc2hib2FyZExheW91dENoYW5nZWQgPSAnZGFzaGJvYXJkLWxheW91dC1jaGFuZ2VkJyxcblxuICAgIC8qKiBUaGUgd29ya2Jvb2sgZm9ybWF0dGluZyBoYXMgY2hhbmdlZFxuICAgICAqIEBjYXRlZ29yeSBEYXNoYm9hcmQgRXh0ZW5zaW9uc1xuICAgICAqL1xuICAgIFdvcmtib29rRm9ybWF0dGluZ0NoYW5nZWQgPSAnd29ya2Jvb2stZm9ybWF0dGluZy1jaGFuZ2VkJyxcblxuICAgIC8qKiBUaGUgd29ya3NoZWV0IGZvcm1hdHRpbmcgaGFzIGNoYW5nZWRcbiAgICAgKiBAY2F0ZWdvcnkgVml6IEV4dGVuc2lvbnNcbiAgICAgKi9cbiAgICBXb3Jrc2hlZXRGb3JtYXR0aW5nQ2hhbmdlZCA9ICd3b3Jrc2hlZXQtZm9ybWF0dGluZy1jaGFuZ2VkJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnVtIHRoYXQgcmVwcmVzZW50cyB0aGUgZGF0YSB0eXBlIG9mIGVuY29kaW5ncyBmb3IgY3JlYXRlVml6SW1hZ2VBc3luYy5cbiAgICogQHNpbmNlIDEuNi4wXG4gICAqL1xuICBleHBvcnQgZW51bSBWaXpJbWFnZUVuY29kaW5nVHlwZSB7XG4gICAgRGlzY3JldGUgPSAnZGlzY3JldGUnLFxuICAgIENvbnRpbnVvdXMgPSAnY29udGludW91cycsXG4gIH1cblxuICAvKipcbiAgICogRW51bSB0aGF0IHJlcHJlc2VudHMgdGhlIHNvcnQgZGlyZWN0aW9uIGZvciBjcmVhdGVWaXpJbWFnZUFzeW5jLlxuICAgKiBAc2luY2UgMS44LjAgYW5kIFRhYmxlYXUgMjAyMS40XG4gICAqL1xuICBleHBvcnQgZW51bSBWaXpJbWFnZVNvcnREaXJlY3Rpb25UeXBlIHtcbiAgICBBc2NlbmRpbmcgPSAnYXNjZW5kaW5nJyxcbiAgICBEZXNjZW5kaW5nID0gJ2Rlc2NlbmRpbmcnLFxuICB9XG5cbiAgLyoqXG4gICAqIEVudW0gdGhhdCByZXByZXNlbnRzIHRoZSBwYWxldHRlIHR5cGUgZm9yIGNyZWF0ZVZpekltYWdlQXN5bmMuXG4gICAqIEBzaW5jZSAxLjguMCBhbmQgVGFibGVhdSAyMDIxLjRcbiAgICovXG4gIGV4cG9ydCBlbnVtIFZpekltYWdlUGFsZXR0ZVR5cGUge1xuICAgIEN1c3RvbURpdmVyZ2luZyA9ICdjdXN0b20tZGl2ZXJnaW5nJyxcbiAgICBDdXN0b21TZXF1ZW50aWFsID0gJ2N1c3RvbS1zZXF1ZW50aWFsJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnVtIHRoYXQgcmVwcmVzZW50cyB0aGUgU2l6ZSBTZXR0aW5nIHR5cGUgZm9yIGNyZWF0ZVZpekltYWdlQXN5bmMuXG4gICAqIEBzaW5jZSAxLjguMCBhbmQgVGFibGVhdSAyMDIxLjRcbiAgICovXG4gIGV4cG9ydCBlbnVtIFZpekltYWdlU2l6ZVNldHRpbmdUeXBlIHtcbiAgICBGaXhlZCA9ICdmaXhlZCcsXG4gICAgTWFudWFsID0gJ21hbnVhbCcsXG4gIH1cblxuICAvKipcbiAgICogRW51bSB0aGF0IHJlcHJlc2VudHMgdGhlIFNpemUgU2V0dGluZyBhbGlnbm1lbnQgdHlwZSBmb3IgY3JlYXRlVml6SW1hZ2VBc3luYy5cbiAgICogQHNpbmNlIDEuOC4wIGFuZCBUYWJsZWF1IDIwMjEuNFxuICAgKi9cbiAgZXhwb3J0IGVudW0gVml6SW1hZ2VTaXplU2V0dGluZ0FsaWdubWVudFR5cGUge1xuICAgIFJpZ2h0ID0gJ3JpZ2h0JyxcbiAgICBMZWZ0ID0gJ2xlZnQnLFxuICAgIENlbnRlciA9ICdjZW50ZXInLFxuICB9XG59XG5leHBvcnQgPSBUYWJsZWF1O1xuIiwiZXhwb3J0IGVudW0gU2hhcmVkRXJyb3JDb2RlcyB7XG4gIC8qKlxuICAgKiBBIENTViBvciBFeGNlbCBmaWxlIGZhaWxlZCB0byBiZSBjcmVhdGVkIGluIFZpei5leHBvcnRDcm9zc3RhYkFzeW5jKCkuXG4gICAqL1xuICBDcm9zc3RhYkNyZWF0aW9uRXJyb3IgPSAnY3Jvc3N0YWItY3JlYXRpb24tZXJyb3InLFxuICAvKipcbiAgICogQSBDU1YgZmlsZSBmYWlsZWQgdG8gYmUgY3JlYXRlZCBpbiBWaXouZXhwb3J0RGF0YUFzeW5jKCkuXG4gICAqL1xuICBEYXRhQ3JlYXRpb25FcnJvciA9ICdkYXRhLWNyZWF0aW9uLWVycm9yJyxcbiAgLyoqXG4gICAqIEFuIGludmFsaWQgYWdncmVnYXRpb24gd2FzIHNwZWNpZmllZCBmb3IgdGhlIGZpbHRlciwgc3VjaCBhcyBzZXR0aW5nIGEgcmFuZ2UgZmlsdGVyIHRvIFwiU1VNKFNhbGVzKVwiIGluc3RlYWQgb2ZcbiAgICogXCJTYWxlc1wiLlxuICAgKi9cbiAgSW52YWxpZEFnZ3JlZ2F0aW9uRmllbGROYW1lID0gJ2ludmFsaWQtYWdncmVnYXRpb24tZmllbGQtbmFtZScsXG4gIC8qKlxuICAgKiBBIGZpbHRlciBvcGVyYXRpb24gd2FzIGF0dGVtcHRlZCBvbiBhIGZpZWxkIHRoYXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGRhdGEgc291cmNlLlxuICAgKi9cbiAgSW52YWxpZEZpbHRlckZpZWxkTmFtZSA9ICdpbnZhbGlkLWZpbHRlci1uYW1lJyxcbiAgLyoqXG4gICAqIEEgZmlsdGVyIG9wZXJhdGlvbiB3YXMgYXR0ZW1wdGVkIHVzaW5nIGEgdmFsdWUgdGhhdCBpcyB0aGUgd3JvbmcgZGF0YSB0eXBlIG9yIGZvcm1hdC5cbiAgICovXG4gIEludmFsaWRGaWx0ZXJGaWVsZFZhbHVlID0gJ2ludmFsaWQtZmlsdGVyLWZpZWxkVmFsdWUnLFxuICAvKipcbiAgICogQW4gaW52YWxpZCBkYXRlIHZhbHVlIHdhcyBzcGVjaWZpZWQgaW4gYSBTaGVldC5zZWxlY3RNYXJrc0FzeW5jKCkgY2FsbCBmb3IgYSBkYXRlIGZpZWxkLlxuICAgKi9cbiAgSW52YWxpZFNlbGVjdGlvbkRhdGUgPSAnaW52YWxpZC1zZWxlY3Rpb24tZGF0ZScsXG4gIC8qKlxuICAgKiBBIGZpZWxkIHdhcyBzcGVjaWZpZWQgaW4gYSBTaGVldC5zZWxlY3RNYXJrc0FzeW5jKCkgY2FsbCB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBkYXRhIHNvdXJjZS5cbiAgICovXG4gIEludmFsaWRTZWxlY3Rpb25GaWVsZE5hbWUgPSAnaW52YWxpZC1zZWxlY3Rpb24tZmllbGROYW1lJyxcbiAgLyoqXG4gICAqIEFuIGludmFsaWQgdmFsdWUgd2FzIHNwZWNpZmllZCBpbiBhIFNoZWV0LnNlbGVjdE1hcmtzQXN5bmMoKSBjYWxsLlxuICAgKi9cbiAgSW52YWxpZFNlbGVjdGlvblZhbHVlID0gJ2ludmFsaWQtc2VsZWN0aW9uLXZhbHVlJyxcbiAgLyoqXG4gICAqIEEgcGFyYW1ldGVyIGRpZCBub3QgaW5jbHVkZSBhIHZhbGlkIHNoZWV0IHNlbGVjdGlvbiBmb3IgZXhwb3J0aW5nLlxuICAgKi9cbiAgSW52YWxpZFNlbGVjdGlvblNoZWV0ID0gJ2ludmFsaWQtc2VsZWN0aW9uLXNoZWV0JyxcbiAgLyoqXG4gICAqIEFuIGVycm9yIG9jY3VycmVkIHdpdGhpbiB0aGUgVGFibGVhdSBBUEkuIENvbnRhY3QgVGFibGVhdSBTdXBwb3J0LlxuICAgKi9cbiAgSW50ZXJuYWxFcnJvciA9ICdpbnRlcm5hbC1lcnJvcicsXG4gIC8qKlxuICAgKiBBIHBhcmFtZXRlciBpcyBub3QgdGhlIGNvcnJlY3QgZGF0YSB0eXBlIG9yIGZvcm1hdC4gVGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciBpcyBzcGVjaWZpZWQgaW4gdGhlIEVycm9yLm1lc3NhZ2UgZmllbGQuXG4gICAqL1xuICBJbnZhbGlkUGFyYW1ldGVyID0gJ2ludmFsaWQtcGFyYW1ldGVyJyxcbiAgLyoqXG4gICAqIEEgUERGIGZpbGUgZmFpbGVkIHRvIGJlIGNyZWF0ZWQgaW4gVml6LmV4cG9ydFBERkFzeW5jKCkuXG4gICAqL1xuICBQREZDcmVhdGlvbkVycm9yID0gJ3BkZi1jcmVhdGlvbi1lcnJvcicsXG4gIC8qKlxuICAgKiBBIFBvd2VyUG9pbnQgZmlsZSBmYWlsZWQgdG8gYmUgY3JlYXRlZCBpbiBWaXouZXhwb3J0UG93ZXJQb2ludEFzeW5jKCkuXG4gICAqL1xuICBQb3dlclBvaW50Q3JlYXRpb25FcnJvciA9ICdwb3dlcnBvaW50LWNyZWF0aW9uLWVycm9yJyxcbiAgLyoqXG4gICAqIEFuIG9wZXJhdGlvbiB3YXMgYXR0ZW1wdGVkIG9uIGEgc2hlZXQgdGhhdCBpcyBub3QgYWN0aXZlIG9yIGVtYmVkZGVkIHdpdGhpbiB0aGUgYWN0aXZlIGRhc2hib2FyZC5cbiAgICovXG4gIE5vdEFjdGl2ZVNoZWV0ID0gJ25vdC1hY3RpdmUtc2hlZXQnLFxuICAvKipcbiAgICogUHJvcGVydHkgb3IgRnVuY3Rpb24gaXMgbm90IHN1cHBvcnRlZCB3aXRoaW4gdGhlIFRhYmxlYXUgQVBJLlxuICAgKi9cbiAgSW1wbGVtZW50YXRpb25FcnJvciA9ICd3cm9uZy1pbXBsZW1lbnRhdGlvbicsXG4gIC8qKlxuICAgKiBDYW4gb2NjdXIgd2hlbiB0d28gaW5jb21wYXRpYmxlIGNhbGxzIGFyZSB0cmlnZ2VyZWQgdG9nZXRoZXIuXG4gICAqL1xuICBBcGlFeGVjdXRpb25FcnJvciA9ICdhcGktZXhlY3V0aW9uLWVycm9yJyxcbiAgLyoqXG4gICAqIEEgZ2VuZXJhbC1wdXJwb3NlIHNlcnZlciBlcnJvciBvY2N1cnJlZC4gRGV0YWlscyBhcmUgY29udGFpbmVkIGluIHRoZSBFcnJvciBvYmplY3QuXG4gICAqL1xuICBTZXJ2ZXJFcnJvciA9ICdzZXJ2ZXItZXJyb3InLFxuICAvKipcbiAgICogQ2FuIG9jY3VyIHdoZW4gYW4gYXBpIGNhbGwgdGltZXMgb3V0LlxuICAgKi9cbiAgVGltZW91dCA9ICd0aW1lb3V0Jyxcbn1cbiIsIi8qKlxuICogVGhlIHRhYmxlYXUgbmFtZXNwYWNlIGV4aXN0cyBmb3Igb3JnYW5pemF0aW9uIGFuZCB0byBhdm9pZCBwb2xsdXRpbmdcbiAqIHRoZSBnbG9iYWwgbmFtZXNwYWNlLiBJdCBjb250YWlucyBubyBjb25zdHJ1Y3RzIG90aGVyIHRoYW4gc3ViLW5hbWVzcGFjZXMgYW5kIHRoZSBUYWJsZWF1IGVudW1lcmF0aW9ucy5cbiAqL1xubmFtZXNwYWNlIFRhYmxlYXUge1xuICBleHBvcnQgZW51bSBBbmFseXRpY3NPYmplY3RUeXBlIHtcbiAgICBDbHVzdGVyID0gJ2NsdXN0ZXInLFxuICAgIEZvcmVjYXN0ID0gJ2ZvcmVjYXN0JyxcbiAgICBUcmVuZExpbmUgPSAndHJlbmQtbGluZScsXG4gIH1cblxuICBleHBvcnQgZW51bSBBbm5vdGF0aW9uVHlwZSB7XG4gICAgTWFyayA9ICdtYXJrJyxcbiAgICBQb2ludCA9ICdwb2ludCcsXG4gICAgQXJlYSA9ICdhcmVhJyxcbiAgfVxuXG4gIGV4cG9ydCBlbnVtIENvbHVtblR5cGUge1xuICAgIERpc2NyZXRlID0gJ2Rpc2NyZXRlJyxcbiAgICBDb250aW51b3VzID0gJ2NvbnRpbnVvdXMnLFxuICAgIFVua25vd24gPSAndW5rbm93bicsXG4gIH1cblxuICBleHBvcnQgZW51bSBDbGFzc05hbWVLZXkge1xuICAgIFdvcmtzaGVldFRpdGxlID0gJ3RhYmxlYXUtd29ya3NoZWV0LXRpdGxlJyxcbiAgICBXb3Jrc2hlZXQgPSAndGFibGVhdS13b3Jrc2hlZXQnLFxuICAgIFRvb2x0aXAgPSAndGFibGVhdS10b29sdGlwJyxcbiAgICBTdG9yeVRpdGxlID0gJ3RhYmxlYXUtc3RvcnktdGl0bGUnLFxuICAgIERhc2hib2FyZFRpdGxlID0gJ3RhYmxlYXUtZGFzaGJvYXJkLXRpdGxlJyxcbiAgICBQYW5lID0gJ3RhYmxlYXUtcGFuZScsXG4gICAgUm93RGl2aWRlcnMgPSAndGFibGVhdS1yb3ctZGl2aWRlcnMnLFxuICAgIENvbHVtbkRpdmlkZXJzID0gJ3RhYmxlYXUtY29sdW1uLWRpdmlkZXJzJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGF0IHRoZSBvYmplY3QgcmVwcmVzZW50cyBpbiBhIGRhc2hib2FyZC5cbiAgICovXG4gIGV4cG9ydCBlbnVtIERhc2hib2FyZE9iamVjdFR5cGUge1xuICAgIEJsYW5rID0gJ2JsYW5rJyxcbiAgICBXb3Jrc2hlZXQgPSAnd29ya3NoZWV0JyxcbiAgICBRdWlja0ZpbHRlciA9ICdxdWljay1maWx0ZXInLFxuICAgIFBhcmFtZXRlckNvbnRyb2wgPSAncGFyYW1ldGVyLWNvbnRyb2wnLFxuICAgIFBhZ2VGaWx0ZXIgPSAncGFnZS1maWx0ZXInLFxuICAgIExlZ2VuZCA9ICdsZWdlbmQnLFxuICAgIFRpdGxlID0gJ3RpdGxlJyxcbiAgICBUZXh0ID0gJ3RleHQnLFxuICAgIEltYWdlID0gJ2ltYWdlJyxcbiAgICBXZWJQYWdlID0gJ3dlYi1wYWdlJyxcbiAgICBFeHRlbnNpb24gPSAnZXh0ZW5zaW9uJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnVtIHRoYXQgcmVwcmVzZW50cyB0aGUgdmlzaWJpbGl0eSBzdGF0ZSBvZiBhIGRhc2hib2FyZCBvYmplY3QuXG4gICAqIEBzaW5jZSAxLjcuMFxuICAgKi9cbiAgZXhwb3J0IGVudW0gRGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eVR5cGUge1xuICAgIC8qKiBVc2VkIGZvciB0dXJuaW5nIG9uIHRoZSB2aXNpYmlsaXR5IG9mIGEgZGFzaGJvYXJkIG9iamVjdC4qL1xuICAgIFNob3cgPSAnc2hvdycsXG5cbiAgICAvKiogVXNlZCBmb3IgdHVybmluZyBvZmYgdGhlIHZpc2liaWxpdHkgb2YgYSBkYXNoYm9hcmQgb2JqZWN0LiovXG4gICAgSGlkZSA9ICdoaWRlJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZGlmZmVyZW50IHR5cGVzIG9mIGRhdGEgYSB2YWx1ZSBjYW4gaGF2ZVxuICAgKi9cbiAgZXhwb3J0IGVudW0gRGF0YVR5cGUge1xuICAgIFN0cmluZyA9ICdzdHJpbmcnLFxuICAgIEludCA9ICdpbnQnLFxuICAgIEZsb2F0ID0gJ2Zsb2F0JyxcbiAgICBCb29sID0gJ2Jvb2wnLFxuICAgIERhdGUgPSAnZGF0ZScsXG4gICAgRGF0ZVRpbWUgPSAnZGF0ZS10aW1lJyxcbiAgICBTcGF0aWFsID0gJ3NwYXRpYWwnLFxuICAgIFVua25vd24gPSAndW5rbm93bicsXG4gIH1cblxuICAvKipcbiAgICogRW51bSB0aGF0IHJlcHJlc2VudHMgdGhlIGNoYW5nZXMgdGhhdCBvY2N1ciB0byBhIGRhc2hib2FyZCBvYmplY3QuXG4gICAqL1xuICBleHBvcnQgZW51bSBEYXNoYm9hcmRMYXlvdXRDaGFuZ2Uge1xuICAgIC8qKiBBIGRhc2hib2FyZCBvYmplY3Qgd2FzIGFkZGVkICovXG4gICAgQWRkZWQgPSAnYWRkZWQnLFxuXG4gICAgLyoqIEEgZGFzaGJvYXJkIG9iamVjdCB3YXMgcmVtb3ZlZCAqL1xuICAgIFJlbW92ZWQgPSAncmVtb3ZlZCcsXG5cbiAgICAvKiogQSBkYXNoYm9hcmQgb2JqZWN0J3MgZmxvYXRpbmcgc3RhdGUgY2hhbmdlZCAqL1xuICAgIElzRmxvYXRpbmdDaGFuZ2VkID0gJ2lzLWZsb2F0aW5nLWNoYW5nZWQnLFxuXG4gICAgLyoqIEEgZGFzaGJvYXJkIG9iamVjdCdzIHZpc2liaWxpdHkgY2hhbmdlZCAqL1xuICAgIElzVmlzaWJsZUNoYW5nZWQgPSAnaXMtdmlzaWJsZS1jaGFuZ2VkJyxcblxuICAgIC8qKiBBIGRhc2hib2FyZCBvYmplY3QncyBwb3NpdGlvbiBjaGFuZ2VkICovXG4gICAgUG9zaXRpb25DaGFuZ2VkID0gJ3Bvc2l0aW9uLWNoYW5nZWQnLFxuXG4gICAgLyoqIEEgZGFzaGJvYXJkIG9iamVjdCdzIHNpemUgY2hhbmdlZCAqL1xuICAgIFNpemVDaGFuZ2VkID0gJ3NpemUtY2hhbmdlZCcsXG5cbiAgICAvKiogQSBkYXNoYm9hcmQgb2JqZWN0IHdhcyByZW5hbWVkICovXG4gICAgTmFtZUNoYW5nZWQgPSAnbmFtZS1jaGFuZ2VkJyxcblxuICAgIC8qKiBBIGRhc2hib2FyZCBvYmplY3QgaXMgc2VsZWN0ZWQgKi9cbiAgICBTZWxlY3RlZCA9ICdzZWxlY3RlZCcsXG5cbiAgICAvKiogQSBkYXNoYm9hcmQgb2JqZWN0IGlzIGRlc2VsZWN0ZWQgKi9cbiAgICBEZXNlbGVjdGVkID0gJ2Rlc2VsZWN0ZWQnLFxuXG4gICAgLyoqIE5hdmlnYXRlIHRvIGFub3RoZXIgZGFzaGJvYXJkICovXG4gICAgRGFzaGJvYXJkQ2hhbmdlZCA9ICdkYXNoYm9hcmQtY2hhbmdlZCcsXG4gIH1cblxuICAvKipcbiAgICogVmFsaWQgZGF0ZSByYW5nZXMgZm9yIGEgcmVsYXRpdmUgZGF0ZSBmaWx0ZXIuXG4gICAqL1xuICBleHBvcnQgZW51bSBEYXRlUmFuZ2VUeXBlIHtcbiAgICBMYXN0ID0gJ2xhc3QnLFxuICAgIExhc3ROID0gJ2xhc3QtbicsXG4gICAgTmV4dCA9ICduZXh0JyxcbiAgICBOZXh0TiA9ICduZXh0LW4nLFxuICAgIEN1cnJlbnQgPSAnY3VycmVudCcsXG4gICAgVG9EYXRlID0gJ3RvLWRhdGUnLFxuICB9XG5cbiAgLyoqXG4gICAqIEVudW0gdGhhdCByZXByZXNlbnRzIHRoZSB0eXBlcyBvZiBkaWFsb2cgcG9wdXAgc3R5bGVzLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gRGlhbG9nU3R5bGUge1xuICAgIFdpbmRvdyA9ICd3aW5kb3cnLFxuICAgIE1vZGFsID0gJ21vZGFsJyxcbiAgICBNb2RlbGVzcyA9ICdtb2RlbGVzcycsXG4gIH1cblxuICBleHBvcnQgZW51bSBFbmNvZGluZ1R5cGUge1xuICAgIENvbHVtbiA9ICdjb2x1bW4nLFxuICAgIFJvdyA9ICdyb3cnLFxuICAgIFBhZ2UgPSAncGFnZScsXG4gICAgRmlsdGVyID0gJ2ZpbHRlcicsXG4gICAgTWFya3NUeXBlID0gJ21hcmtzLXR5cGUnLFxuICAgIE1lYXN1cmVWYWx1ZXMgPSAnbWVhc3VyZS12YWx1ZXMnLFxuICAgIENvbG9yID0gJ2NvbG9yJyxcbiAgICBTaXplID0gJ3NpemUnLFxuICAgIExhYmVsID0gJ2xhYmVsJyxcbiAgICBEZXRhaWwgPSAnZGV0YWlsJyxcbiAgICBUb29sdGlwID0gJ3Rvb2x0aXAnLFxuICAgIFNoYXBlID0gJ3NoYXBlJyxcbiAgICBQYXRoID0gJ3BhdGgnLFxuICAgIEFuZ2xlID0gJ2FuZ2xlJyxcbiAgICBHZW9tZXRyeSA9ICdnZW9tZXRyeScsXG4gICAgQ3VzdG9tID0gJ2N1c3RvbScsXG4gIH1cblxuICAvKipcbiAgICogIFR5cGUgb2YgYWdncmVnYXRpb24gb24gYSBmaWVsZC5cbiAgICovXG4gIGV4cG9ydCBlbnVtIEZpZWxkQWdncmVnYXRpb25UeXBlIHtcbiAgICBTdW0gPSAnc3VtJyxcbiAgICBBdmcgPSAnYXZnJyxcbiAgICBNaW4gPSAnbWluJyxcbiAgICBNYXggPSAnbWF4JyxcbiAgICBTdGRldiA9ICdzdGRldicsXG4gICAgU3RkZXZwID0gJ3N0ZGV2cCcsXG4gICAgVmFyID0gJ3ZhcicsXG4gICAgVmFycCA9ICd2YXJwJyxcbiAgICBDb2xsZWN0ID0gJ2NvbGxlY3QnLFxuICAgIENvdW50ID0gJ2NvdW50JyxcbiAgICBDb3VudGQgPSAnY291bnRkJyxcbiAgICBNZWRpYW4gPSAnbWVkaWFuJyxcbiAgICBBdHRyID0gJ2F0dHInLFxuICAgIE5vbmUgPSAnbm9uZScsXG4gICAgWWVhciA9ICd5ZWFyJyxcbiAgICBRdHIgPSAncXRyJyxcbiAgICBNb250aCA9ICdtb250aCcsXG4gICAgRGF5ID0gJ2RheScsXG4gICAgSG91ciA9ICdob3VyJyxcbiAgICBNaW51dGUgPSAnbWludXRlJyxcbiAgICBTZWNvbmQgPSAnc2Vjb25kJyxcbiAgICBXZWVrID0gJ3dlZWsnLFxuICAgIFdlZWtkYXkgPSAnd2Vla2RheScsXG4gICAgTW9udGhZZWFyID0gJ21vbnRoLXllYXInLFxuICAgIE1keSA9ICdtZHknLFxuICAgIEVuZCA9ICdlbmQnLFxuICAgIFRydW5jWWVhciA9ICd0cnVuYy15ZWFyJyxcbiAgICBUcnVuY1F0ciA9ICd0cnVuYy1xdHInLFxuICAgIFRydW5jTW9udGggPSAndHJ1bmMtbW9udGgnLFxuICAgIFRydW5jV2VlayA9ICd0cnVuYy13ZWVrJyxcbiAgICBUcnVuY0RheSA9ICd0cnVuYy1kYXknLFxuICAgIFRydW5jSG91ciA9ICd0cnVuYy1ob3VyJyxcbiAgICBUcnVuY01pbnV0ZSA9ICd0cnVuYy1taW51dGUnLFxuICAgIFRydW5jU2Vjb25kID0gJ3RydW5jLXNlY29uZCcsXG4gICAgUXVhcnQxID0gJ3F1YXJ0MScsXG4gICAgUXVhcnQzID0gJ3F1YXJ0MycsXG4gICAgU2tld25lc3MgPSAnc2tld25lc3MnLFxuICAgIEt1cnRvc2lzID0gJ2t1cnRvc2lzJyxcbiAgICBJbk91dCA9ICdpbi1vdXQnLFxuICAgIFVzZXIgPSAndXNlcicsXG4gIH1cblxuICAvKipcbiAgICogUm9sZSBvZiBhIGZpZWxkLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gRmllbGRSb2xlVHlwZSB7XG4gICAgRGltZW5zaW9uID0gJ2RpbWVuc2lvbicsXG4gICAgTWVhc3VyZSA9ICdtZWFzdXJlJyxcbiAgICBVbmtub3duID0gJ3Vua25vd24nLFxuICB9XG5cbiAgLyoqXG4gICAqIEFuIGVudW1lcmF0aW9uIG9mIHRoZSB2YWxpZCB0eXBlcyBvZiBmaWx0ZXJzIHRoYXQgY2FuIGJlIGFwcGxpZWQuXG4gICAqL1xuICBleHBvcnQgZW51bSBGaWx0ZXJUeXBlIHtcbiAgICBDYXRlZ29yaWNhbCA9ICdjYXRlZ29yaWNhbCcsXG4gICAgUmFuZ2UgPSAncmFuZ2UnLFxuICAgIEhpZXJhcmNoaWNhbCA9ICdoaWVyYXJjaGljYWwnLFxuICAgIFJlbGF0aXZlRGF0ZSA9ICdyZWxhdGl2ZS1kYXRlJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZGlmZmVyZW50IHVwZGF0ZSB0eXBlcyBmb3IgYXBwbHlpbmcgZmlsdGVyXG4gICAqL1xuICBleHBvcnQgZW51bSBGaWx0ZXJVcGRhdGVUeXBlIHtcbiAgICBBZGQgPSAnYWRkJyxcbiAgICBBbGwgPSAnYWxsJyxcbiAgICBSZXBsYWNlID0gJ3JlcGxhY2UnLFxuICAgIFJlbW92ZSA9ICdyZW1vdmUnLFxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBkb21haW4gdHlwZSBmb3IgYSBmaWx0ZXJcbiAgICovXG4gIGV4cG9ydCBlbnVtIEZpbHRlckRvbWFpblR5cGUge1xuICAgIC8qKlxuICAgICAqIFRoZSBkb21haW4gdmFsdWVzIHRoYXQgYXJlIHJlbGV2YW50IHRvIHRoZSBzcGVjaWZpZWQgZmlsdGVyXG4gICAgICogaS5lLiB0aGUgZG9tYWluIGlzIHJlc3RyaWN0ZWQgYnkgYSBwcmV2aW91cyBmaWx0ZXJcbiAgICAgKi9cbiAgICBSZWxldmFudCA9ICdyZWxldmFudCcsXG4gICAgLyoqXG4gICAgICogbGlzdCBvZiBhbGwgcG9zc2libGUgZG9tYWluIHZhbHVlcyBmcm9tIGRhdGFiYXNlXG4gICAgICovXG4gICAgRGF0YWJhc2UgPSAnZGF0YWJhc2UnLFxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBvcHRpb24gZm9yIHNwZWNpZnlpbmcgd2hpY2ggdmFsdWVzIHRvIGluY2x1ZGUgZm9yIGZpbHRlcmluZ1xuICAgKiBJbmRpY2F0ZXMgd2hhdCB0byBkbyB3aXRoIG51bGwgdmFsdWVzIGZvciBhIGdpdmVuIGZpbHRlciBvciBtYXJrIHNlbGVjdGlvbiBjYWxsLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gRmlsdGVyTnVsbE9wdGlvbiB7XG4gICAgTnVsbFZhbHVlcyA9ICdudWxsLXZhbHVlcycsXG4gICAgTm9uTnVsbFZhbHVlcyA9ICdub24tbnVsbC12YWx1ZXMnLFxuICAgIEFsbFZhbHVlcyA9ICdhbGwtdmFsdWVzJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnVtIHRoYXQgc2VydmVzIGFzIGEgZmlsdGVyIG9uIHRoZSBEYXRhVmFsdWVzIHJldHVybmVkIGZyb20gYGdldFN1bW1hcnlEYXRhUmVhZGVyQXN5bmNgLFxuICAgKiBgZ2V0VW5kZXJseWluZ1RhYmxlRGF0YVJlYWRlckFzeW5jYCBhbmQgYGdldExvZ2ljYWxUYWJsZURhdGFSZWFkZXJBc3luY2AuXG4gICAqIFRoaXMgaXMgYW4gb3B0aW1pemF0aW9uIG9mIHJldHVybmVkIGRhdGEgdmFsdWVzIG9ubHkuIFRhYmxlYXUgdmVyc2lvbnMgcHJpb3IgdG8gMjAyMS4yXG4gICAqIHdpbGwgcGFzcyB0aGUgZGF0YSBhY3Jvc3MgYW5kIHBvcHVsYXRlIHRoZSBEYXRhVmFsdWUgcHJvcGVydGllcy5cbiAgICogUGxlYXNlIG5vdGUgdGhhdCBhbGwgcHJvcGVydGllcyBub3QgcmVxdWVzdGVkIHdpbGwgYmUgYHVuZGVmaW5lZGAgaW4gdGhlIERhdGFWYWx1ZSByZXN1bHRzLlxuICAgKiBAc2luY2UgMS41LjBcbiAgICovXG4gIGV4cG9ydCBlbnVtIEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uIHtcbiAgICAvKiogRGF0YVZhbHVlcyB3aWxsIGluY2x1ZGUgYWxsIHByb3BlcnRpZXMuKi9cbiAgICBBbGxWYWx1ZXMgPSAnYWxsLXZhbHVlcycsXG5cbiAgICAvKiogRGF0YVZhbHVlcyB3aWxsIG9ubHkgaW5jbHVkZSB2YWx1ZSBhbmQgbmF0aXZlVmFsdWUgcHJvcGVydGllcy4qL1xuICAgIE9ubHlOYXRpdmVWYWx1ZXMgPSAnb25seS1uYXRpdmUtdmFsdWVzJyxcblxuICAgIC8qKiBEYXRhVmFsdWVzIHdpbGwgb25seSBpbmNsdWRlIGZvcm1hdHRlZFZhbHVlIHByb3BlcnRpZXMuICovXG4gICAgT25seUZvcm1hdHRlZFZhbHVlcyA9ICdvbmx5LWZvcm1hdHRlZC12YWx1ZXMnLFxuICB9XG5cbiAgLyoqXG4gICAqIFR5cGUgb2YgbWFyayBmb3IgYSBnaXZlbiBtYXJrcyBjYXJkIGluIGEgdml6LlxuICAgKi9cbiAgZXhwb3J0IGVudW0gTWFya1R5cGUge1xuICAgIEJhciA9ICdiYXInLFxuICAgIExpbmUgPSAnbGluZScsXG4gICAgQXJlYSA9ICdhcmVhJyxcbiAgICBTcXVhcmUgPSAnc3F1YXJlJyxcbiAgICBDaXJjbGUgPSAnY2lyY2xlJyxcbiAgICBTaGFwZSA9ICdzaGFwZScsXG4gICAgVGV4dCA9ICd0ZXh0JyxcbiAgICBNYXAgPSAnbWFwJyxcbiAgICBQaWUgPSAncGllJyxcbiAgICBHYW50dEJhciA9ICdnYW50dC1iYXInLFxuICAgIFBvbHlnb24gPSAncG9seWdvbicsXG4gICAgSGVhdG1hcCA9ICdoZWF0bWFwJyxcbiAgICBWaXpFeHRlbnNpb24gPSAndml6LWV4dGVuc2lvbicsXG4gIH1cblxuICAvKipcbiAgICogQW4gZW51bWVyYXRpb24gZGVzY3JpYmluZyB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIGFsbG93YWJsZSB2YWx1ZXMuXG4gICAqIFRoaXMgaXMgdXNlZCBmb3IgcmVzdHJpY3RpbmcgdGhlIGRvbWFpbiBvZiBhIHBhcmFtZXRlclxuICAgKi9cbiAgZXhwb3J0IGVudW0gUGFyYW1ldGVyVmFsdWVUeXBlIHtcbiAgICBBbGwgPSAnYWxsJyxcbiAgICBMaXN0ID0gJ2xpc3QnLFxuICAgIFJhbmdlID0gJ3JhbmdlJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBEYXRlIHBlcmlvZCB1c2VkIGluIGZpbHRlcnMgYW5kIGluIHBhcmFtZXRlcnMuXG4gICAqL1xuICBleHBvcnQgZW51bSBQZXJpb2RUeXBlIHtcbiAgICBZZWFycyA9ICd5ZWFycycsXG4gICAgUXVhcnRlcnMgPSAncXVhcnRlcnMnLFxuICAgIE1vbnRocyA9ICdtb250aHMnLFxuICAgIFdlZWtzID0gJ3dlZWtzJyxcbiAgICBEYXlzID0gJ2RheXMnLFxuICAgIEhvdXJzID0gJ2hvdXJzJyxcbiAgICBNaW51dGVzID0gJ21pbnV0ZXMnLFxuICAgIFNlY29uZHMgPSAnc2Vjb25kcycsXG4gIH1cblxuICBleHBvcnQgZW51bSBRdWlja1RhYmxlQ2FsY1R5cGUge1xuICAgIFJ1bm5pbmdUb3RhbCA9ICdydW5uaW5nLXRvdGFsJyxcbiAgICBEaWZmZXJlbmNlID0gJ2RpZmZlcmVuY2UnLFxuICAgIFBlcmNlbnREaWZmZXJlbmNlID0gJ3BlcmNlbnQtZGlmZmVyZW5jZScsXG4gICAgUGVyY2VudE9mVG90YWwgPSAncGVyY2VudC1vZi10b3RhbCcsXG4gICAgUmFuayA9ICdyYW5rJyxcbiAgICBQZXJjZW50aWxlID0gJ3BlcmNlbnRpbGUnLFxuICAgIE1vdmluZ0F2ZXJhZ2UgPSAnbW92aW5nLWF2ZXJhZ2UnLFxuICAgIFlURFRvdGFsID0gJ3l0ZC10b3RhbCcsXG4gICAgQ29tcG91bmRHcm93dGhSYXRlID0gJ2NvbXBvdW5kLWdyb3d0aC1yYXRlJyxcbiAgICBZZWFyT3ZlclllYXJHcm93dGggPSAneWVhci1vdmVyLXllYXItZ3Jvd3RoJyxcbiAgICBZVERHcm93dGggPSAneXRkLWdyb3d0aCcsXG4gICAgVW5kZWZpbmVkID0gJ3VuZGVmaW5lZCcsXG4gIH1cblxuICAvKipcbiAgICogRW51bSBmb3Igc3BlY2lmeWluZyB0aGUgc2VsZWN0aW9uIHR5cGUgZm9yIHNlbGVjdCBtYXJrcyBhcGkuXG4gICAqL1xuICBleHBvcnQgZW51bSBTZWxlY3Rpb25VcGRhdGVUeXBlIHtcbiAgICBSZXBsYWNlID0gJ3NlbGVjdC1yZXBsYWNlJyxcbiAgICBBZGQgPSAnc2VsZWN0LWFkZCcsXG4gICAgUmVtb3ZlID0gJ3NlbGVjdC1yZW1vdmUnLFxuICB9XG5cbiAgLyoqXG4gICAqIEVudW0gZm9yIHNwZWNpZnlpbmcgdGhlIHNlbGVjdCBvcHRpb24gZm9yIHRoZSBgZXh0ZW5zaW9ucy5Xb3Jrc2hlZXQuc2VsZWN0VHVwbGVzQXN5bmNgIG1ldGhvZC5cbiAgICovXG4gIGV4cG9ydCBlbnVtIFNlbGVjdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIENsZWFycyBleGlzdGluZyBzZWxlY3Rpb24gYmVmb3JlIHNlbGVjdGluZyB0aGUgdHVwbGVzIHNwZWNpZmllZFxuICAgICAqL1xuICAgIFNpbXBsZSA9ICdzZWxlY3Qtb3B0aW9ucy1zaW1wbGUnLFxuICAgIC8qKlxuICAgICAqIEFkZHMgc3BlY2lmaWVkIHR1cGxlcyB0byB0aGUgZXhpc3Rpbmcgc2VsZWN0aW9uXG4gICAgICovXG4gICAgVG9nZ2xlID0gJ3NlbGVjdC1vcHRpb25zLXRvZ2dsZScsXG4gIH1cblxuICAvKipcbiAgICogVGhlIHR5cGUgb2Ygc2hlZXQgYSBbW1NoZWV0XV0gb2JqZWN0IHJlcHJlc2VudHNcbiAgICovXG4gIGV4cG9ydCBlbnVtIFNoZWV0VHlwZSB7XG4gICAgRGFzaGJvYXJkID0gJ2Rhc2hib2FyZCcsXG4gICAgU3RvcnkgPSAnc3RvcnknLFxuICAgIFdvcmtzaGVldCA9ICd3b3Jrc2hlZXQnLFxuICB9XG5cbiAgZXhwb3J0IGVudW0gU29ydERpcmVjdGlvbiB7XG4gICAgSW5jcmVhc2luZyA9ICdpbmNyZWFzaW5nJyxcbiAgICBEZWNyZWFzaW5nID0gJ2RlY3JlYXNpbmcnLFxuICB9XG5cbiAgZXhwb3J0IGVudW0gVHJlbmRMaW5lTW9kZWxUeXBlIHtcbiAgICBMaW5lYXIgPSAnbGluZWFyJyxcbiAgICBMb2dhcml0aG1pYyA9ICdsb2dhcml0aG1pYycsXG4gICAgRXhwb25lbnRpYWwgPSAnZXhwb25lbnRpYWwnLFxuICAgIFBvbHlub21pYWwgPSAncG9seW5vbWlhbCcsXG4gIH1cblxuICAvKipcbiAgICogRW51bSB0aGF0IHJlcHJlc2VudHMgdGhlIHJlcGxheSBzcGVlZCBvZiBhbiBhbmltYXRpb24uXG4gICAqIEBzaW5jZSAxLjcuMFxuICAgKi9cbiAgZXhwb3J0IGVudW0gUmVwbGF5U3BlZWRUeXBlIHtcbiAgICAvKiogVXNlZCBmb3Igc2V0dGluZyB0aGUgcmVwbGF5IHNwZWVkIG9mIGFuIGFuaW1hdGlvbiB0byAwLjV4LiovXG4gICAgU2xvdyA9ICdzbG93JyxcblxuICAgIC8qKiBVc2VkIGZvciBzZXR0aW5nIHRoZSByZXBsYXkgc3BlZWQgb2YgYW4gYW5pbWF0aW9uIHRvIDEuMHguKi9cbiAgICBOb3JtYWwgPSAnbm9ybWFsJyxcblxuICAgIC8qKiBVc2VkIGZvciBzZXR0aW5nIHRoZSByZXBsYXkgc3BlZWQgb2YgYW4gYW5pbWF0aW9uIHRvIDIuMHguKi9cbiAgICBGYXN0ID0gJ2Zhc3QnLFxuICB9XG5cbiAgLyoqXG4gICAqIEVudW0gdGhhdCByZXByZXNlbnRzIHRoZSBzZWxlY3Rpb24gc3RhdGUgb2YgYSBsZXZlbCBpbiBhIGhpZXJhcmNoaWNhbCBmaWx0ZXJcbiAgICogQHNpbmNlIEV4dGVuc2lvbnMgMS4xMC4wXG4gICAqL1xuICBleHBvcnQgZW51bSBIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlIHtcbiAgICBBbGxTZWxlY3RlZCA9ICdhbGwtc2VsZWN0ZWQnLFxuICAgIE5vbmVTZWxlY3RlZCA9ICdub25lLXNlbGVjdGVkJyxcbiAgICBTb21lU2VsZWN0ZWQgPSAnc29tZS1zZWxlY3RlZCcsXG4gICAgVW5rbm93blNlbGVjdGVkID0gJ3Vua25vd24tc2VsZWN0ZWQnLFxuICB9XG5cbiAgLyoqXG4gICAqIFpvbmVWaXNpYmlsaXR5VHlwZVxuICAgKiBAZGVwcmVjYXRlZCB1c2UgRGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eVR5cGVcbiAgICovXG4gIGV4cG9ydCBkZWNsYXJlIHR5cGUgWm9uZVZpc2liaWxpdHlUeXBlID0gRGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eVR5cGU7XG4gIGV4cG9ydCBjb25zdCBab25lVmlzaWJpbGl0eVR5cGUgPSB7IC4uLkRhc2hib2FyZE9iamVjdFZpc2liaWxpdHlUeXBlIH07XG59XG5leHBvcnQgPSBUYWJsZWF1O1xuIiwiLy8gVGhpcyBmaWxlIHJlLWV4cG9ydHMgZXZlcnl0aGluZyB3aGljaCBpcyBwYXJ0IG9mIHRoZSBzaGFyZWQgYXBpIHB1YmxpYyBpbnRlcmZhY2VcblxuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9Bbm5vdGF0aW9uSW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvU2hhcmVkL0RhdGFTb3VyY2VJbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvRGF0YVRhYmxlSW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvU2hhcmVkL0VudW1zJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvRW52aXJvbm1lbnRJbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvRmlsdGVySW50ZXJmYWNlcyc7XG5leHBvcnQge1xuICBBbmFseXRpY3NPYmplY3RUeXBlLFxuICBBbm5vdGF0aW9uVHlwZSxcbiAgQ2xhc3NOYW1lS2V5LFxuICBDb2x1bW5UeXBlLFxuICBEYXNoYm9hcmRMYXlvdXRDaGFuZ2UsXG4gIERhc2hib2FyZE9iamVjdFR5cGUsXG4gIERhc2hib2FyZE9iamVjdFZpc2liaWxpdHlUeXBlLFxuICBEYXRhVHlwZSxcbiAgRGF0ZVJhbmdlVHlwZSxcbiAgRGlhbG9nU3R5bGUsXG4gIEVuY29kaW5nVHlwZSxcbiAgRmllbGRBZ2dyZWdhdGlvblR5cGUsXG4gIEZpZWxkUm9sZVR5cGUsXG4gIEZpbHRlckRvbWFpblR5cGUsXG4gIEZpbHRlck51bGxPcHRpb24sXG4gIEZpbHRlclR5cGUsXG4gIEZpbHRlclVwZGF0ZVR5cGUsXG4gIEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUsXG4gIEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICBNYXJrVHlwZSxcbiAgUGFyYW1ldGVyVmFsdWVUeXBlLFxuICBQZXJpb2RUeXBlLFxuICBRdWlja1RhYmxlQ2FsY1R5cGUsXG4gIFJlcGxheVNwZWVkVHlwZSxcbiAgU2VsZWN0T3B0aW9ucyxcbiAgU2VsZWN0aW9uVXBkYXRlVHlwZSxcbiAgU2hlZXRUeXBlLFxuICBTb3J0RGlyZWN0aW9uLFxuICBUcmVuZExpbmVNb2RlbFR5cGUsXG4gIFpvbmVWaXNpYmlsaXR5VHlwZSxcbn0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9OYW1lc3BhY2VzL1RhYmxlYXUnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9TZWxlY3Rpb25JbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvU2hlZXRJbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvVmlzdWFsTW9kZWxJbnRlcmZhY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9Xb3JrYm9va0Zvcm1hdHRpbmdJbnRlcmZhY2VzJztcbiIsIi8qKlxuICogVGhpcyBpcyB5b3VyIG1haW4uIFRoaXMgaXMgd2hlcmUgeW91IHJlLWV4cG9ydCBldmVyeXRoaW5nIHlvdSB3YW50IHRvIGJlIHB1YmxpY2x5IGF2YWlsYWJsZS5cbiAqXG4gKiBUaGUgYnVpbGQgZW5mb3JjZXMgdGhhdCB0aGUgZmlsZSBoYXMgdGhlIHNhbWUgbmFtZSBhcyB0aGUgZ2xvYmFsIHZhcmlhYmxlIHRoYXQgaXMgZXhwb3J0ZWQuXG4gKi9cblxuLy8gRXhwb3J0IHRoZSB2ZXJzaW9uIG9mIHRoZSBpbnRlcm5hbCBjb250cmFjdCB0byBiZSBhdmFpbGFibGUgYXQgcnVudGltZVxuLy8gIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgeWFybiBwdWJsaXNoOmJ1bXAgdmlhIHNjcmlwdHMvcHVibGlzaC1jaGVjay50c1xuLy8gIHVwZGF0ZUludGVybmFsQ29udHJhY3RSdW50aW1lVmVyc2lvbiBpbiB0aGUgbW9ub3JlcG8gcm9vdC5cbmltcG9ydCAqIGFzIGludGVybmFsQ29udHJhY3RWZXJzaW9uIGZyb20gJy4uL2ludGVybmFsLWNvbnRyYWN0LXZlcnNpb24uanNvbic7XG5leHBvcnQgY29uc3QgSU5URVJOQUxfQ09OVFJBQ1RfVkVSU0lPTiA9IGludGVybmFsQ29udHJhY3RWZXJzaW9uO1xuXG5leHBvcnQgKiBmcm9tICcuL2NvbnRyYWN0L0RhdGFUeXBlQ29udmVydGVyJztcbmV4cG9ydCAqIGZyb20gJy4vY29udHJhY3QvRW51bXMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb250cmFjdC9Nb2RlbHMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb250cmFjdC9Ob3RpZmljYXRpb25zJztcbmV4cG9ydCAqIGZyb20gJy4vY29udHJhY3QvUGFyYW1ldGVycyc7XG5leHBvcnQgKiBmcm9tICcuL2NvbnRyYWN0L1ZlcmJzJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJmYWNlL0Fza0RhdGFJbnRlcmZhY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcmZhY2UvSW5pdGlhbGl6YXRpb25PcHRpb25zJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJmYWNlL0ludGVybmFsQXBpRGlzcGF0Y2hlcic7XG5leHBvcnQgKiBmcm9tICcuL2ludGVyZmFjZS9QdWxzZUludGVyZmFjZSc7XG5leHBvcnQgKiBmcm9tICcuL2ludGVyZmFjZS9WZXJzaW9uTnVtYmVyJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJmYWNlL1ZxbEludGVyZmFjZSc7XG5leHBvcnQgKiBmcm9tICcuL21lc3NhZ2luZy9Dcm9zc0ZyYW1lTWVzc2VuZ2VyJztcbmV4cG9ydCAqIGZyb20gJy4vbWVzc2FnaW5nL2ludGVyZmFjZS9NZXNzYWdlRGlzcGF0Y2hlcic7XG5leHBvcnQgKiBmcm9tICcuL21lc3NhZ2luZy9pbnRlcmZhY2UvTWVzc2FnZUxpc3RlbmVyJztcbmV4cG9ydCAqIGZyb20gJy4vbWVzc2FnaW5nL2ludGVyZmFjZS9NZXNzYWdlVHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9tZXNzYWdpbmcvaW50ZXJmYWNlL01lc3Nlbmdlcic7XG5leHBvcnQgKiBmcm9tICcuL21lc3NhZ2luZy9pbnRlcmZhY2UvUHJlcGFyZWRNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vdmVyc2lvbmluZy9leHRlcm5hbC9FeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcic7XG5leHBvcnQgKiBmcm9tICcuL3ZlcnNpb25pbmcvZXh0ZXJuYWwvRXh0ZXJuYWxJZGVudGl0eVZlcnNpb25Db252ZXJ0ZXInO1xuZXhwb3J0ICogZnJvbSAnLi92ZXJzaW9uaW5nL2V4dGVybmFsL0V4dGVybmFsVmVyc2lvbkNvbnZlcnRlckZhY3RvcnknO1xuZXhwb3J0ICogZnJvbSAnLi92ZXJzaW9uaW5nL0ludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyJztcbmV4cG9ydCAqIGZyb20gJy4vdmVyc2lvbmluZy9WZXJzaW9uQ29udmVydGVyRmFjdG9yeSc7XG5cbi8vIEV4cG9ydCB0aGUgdmVyc2lvbiBudW1iZXIgb2YgbWVzc2FnaW5nIGZvciBjb25zdW1lcnMgdG8gdXNlLlxuLy8gQmUgdmVyeSBjYXJlZnVsIG1ha2luZyBhbnkgdXBkYXRlcyB0byB0aGlzIGNvbnRyYWN0IHdoaWNoIGJyZWFrIHZlcnNpb24gY29tcGF0aWJpbGl0eS5cbmV4cG9ydCBjb25zdCBNRVNTQUdJTkdfVkVSU0lPTiA9IHtcbiAgbWFqb3I6IDEsXG4gIG1pbm9yOiAwLFxuICBmaXg6IDAsXG59O1xuIiwiaW1wb3J0IHsgRGF0YVR5cGUgfSBmcm9tICcuL0VudW1zJztcblxuZXhwb3J0IGNsYXNzIERhdGFUeXBlQ29udmVydGVyIHtcbiAgcHJpdmF0ZSBzdGF0aWMgaXNTcGVjaWFsKHZhbHVlQXNTdHJpbmc6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIC8vIFByaW9yIHRvIFNob3dEYXRhVGFibGVQcmVzTW9kZWwsIHNwZWNpYWwgdmFsdWVzIGNvbWUgdG8gdXMgYXNcbiAgICAvLyAnJW51bGwlJywgJyVhbGwlJywgJyV3aWxkY2FyZCUnLCAnJW1pc3NpbmclJy4uLlxuICAgIC8vIFdoaWxlIHRoaXMgZnVuY3Rpb24gd2lsbCBuZXZlciByZXR1cm4gdHJ1ZSBmb3IgU2hvd0RhdGFUYWJsZVByZXNNb2RlbCBjb252ZXJzaW9uLFxuICAgIC8vIGl0IGlzIGFzIGNoZWFwIGFzIHBhc3NpbmcgYXJvdW5kIGEgdmVyc2lvbiBhbmQgY2hlY2tpbmcgdGhhdC5cbiAgICAvLyAoU2VlIERhdGFWYWx1ZUZvcm1hdHRlci5jcHApXG5cbiAgICBpZiAodmFsdWVBc1N0cmluZy5sZW5ndGggPiAyICYmIHZhbHVlQXNTdHJpbmdbMF0gPT09ICclJyAmJiB2YWx1ZUFzU3RyaW5nW3ZhbHVlQXNTdHJpbmcubGVuZ3RoIC0gMV0gPT09ICclJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHNwZWNpYWxWYWx1ZUluZGljYXRvciA9ICclbnVsbCUnO1xuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgcHJpdmF0ZSBzdGF0aWMgcGFyc2VCb29sZWFuKGJvb2xlYW5TdHJpbmc6IHN0cmluZyk6IGJvb2xlYW4gfCBzdHJpbmcge1xuICAgIC8vIGJvb2xlYW4gdmFsdWVzIGNvbWUgdG8gdXMgYXMgJ3RydWUnfCdmYWxzZSdcbiAgICBjb25zdCBub3JtYWxpemVkQm9vbGVhbjogc3RyaW5nID0gYm9vbGVhblN0cmluZy50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiBub3JtYWxpemVkQm9vbGVhbiAhPT0gJ3RydWUnICYmIG5vcm1hbGl6ZWRCb29sZWFuICE9PSAnZmFsc2UnID8gdGhpcy5zcGVjaWFsVmFsdWVJbmRpY2F0b3IgOiBub3JtYWxpemVkQm9vbGVhbiA9PT0gJ3RydWUnO1xuICB9XG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICBwcml2YXRlIHN0YXRpYyBwYXJzZU51bWJlcih2YWx1ZUFzU3RyaW5nOiBzdHJpbmcpOiBudW1iZXIgfCBzdHJpbmcge1xuICAgIGNvbnN0IHZhbHVlID0gTnVtYmVyKHZhbHVlQXNTdHJpbmcpO1xuICAgIHJldHVybiBpc05hTih2YWx1ZSkgPyB0aGlzLnNwZWNpYWxWYWx1ZUluZGljYXRvciA6IHZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcGFyc2VEYXRlKGRhdGVBc1N0cmluZzogc3RyaW5nKTogRGF0ZSB8IG51bGwge1xuICAgIC8vIE5vdGUgdGhhdCB3aXRob3V0IGEgdGltZSwgdGhlIGRhdGUgaXMgYXNzdW1lZCB0byBiZSBVVENcbiAgICAvLyBJbnB1dCBvZiAyMDIwLTAzLTI1IGlzIHByaW50ZWQgYXM6IE1hciAyNCAyMDIwIDE3OjAwOjAwIEdNVC0wNzAwXG4gICAgLy8gVGhpcyBtYXRjaGVzIHN0eWxlIHVzZWQgaW4gZXhpc3RpbmcgY29udmVydEZpbHRlclZhbHVlUHJlc01vZGVsXG4gICAgY29uc3QgdmFsdWUgPSBuZXcgRGF0ZShkYXRlQXNTdHJpbmcpO1xuICAgIHJldHVybiBOdW1iZXIuaXNOYU4odmFsdWUuZ2V0VGltZSgpKSA/IG51bGwgOiB2YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHBhcnNlRGF0ZVRpbWUoZGF0ZUFzU3RyaW5nOiBzdHJpbmcpOiBEYXRlIHwgbnVsbCB7XG4gICAgLy8gV2l0aCBhIHRpbWUsIHRoZSBkYXRlIGlzIGFzc3VtZWQgdG8gYmUgVVRDLlxuICAgIC8vIE91ciBkYXRlIGZvcm1hdCBpcyBhbHdheXM6IHl5eXktbW0tZGQgaGg6bW06c3NcbiAgICAvLyBVbmZvcnR1bmF0ZWx5LCBJRTExIGNhbid0IHBhcnNlIHRoYXQgZm9ybWF0IHNvIHdlIGFkZCBhIFQgYmV0d2VlbiB0aGUgZGF5IGFuZCB0aW1lLlxuICAgIC8vIFdlIGFsc28gYWRkIGEgWiBzbyB0aGF0IGl0IGlzIFVUQy4gKFdpdGhvdXQgdGhlIFosIHNvbWUgYnJvd3NlcnMgYXNzdW1lIGxvY2FsLCBhbmQgb3RoZXJzIFVUQylcbiAgICAvLyBFdmVuIHRob3VnaCB3ZSd2ZSBkcm9wcGVkIHN1cHBvcnQgZm9yIElFMTEsIGl0J3Mgcmlza2llci9jb3N0bGllciB0byBtYWtlIHVwZGF0ZXMgaGVyZS5cbiAgICBjb25zdCBmb3JtYXR0ZWREYXRlU3RyaW5nOiBzdHJpbmcgPSBkYXRlQXNTdHJpbmcucmVwbGFjZSgnICcsICdUJykuY29uY2F0KCdaJyk7XG4gICAgY29uc3QgdmFsdWUgPSBuZXcgRGF0ZShmb3JtYXR0ZWREYXRlU3RyaW5nKTtcbiAgICByZXR1cm4gTnVtYmVyLmlzTmFOKHZhbHVlLmdldFRpbWUoKSkgPyBudWxsIDogdmFsdWU7XG4gIH1cblxuICAvLyBJdCB3b3VsZCBiZSBuaWNlIHRvIG1lcmdlIHRoaXMgYW5kIHRoZSBtZXRob2QgRmlsdGVyQ29udmVydGVyOjpjb252ZXJ0RmlsdGVyVmFsdWVQcmVzTW9kZWwgaW4gYXBpLXBsYXRmb3JtLWpzXG4gIHB1YmxpYyBzdGF0aWMgY29udmVydFZhbHVlQXNTdHJpbmdUb1ZhbHVlKHZhbHVlQXNTdHJpbmc6IHN0cmluZywgdHlwZTogRGF0YVR5cGUpOiBib29sZWFuIHwgbnVtYmVyIHwgc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAvLyBUaGlzIGlzIGJvdGggRGF0YURpY3Rpb25hcnkgYW5kIFNob3dEYXRhVGFibGVQcmVzTW9kZWwgY29tcGF0aWJsZS5cbiAgICAvLyBJbiB0aGUgRGF0YURpY3Rpb25hcnksIHZhbHVlQXNTdHJpbmcgY2FuIGJlICclbnVsbCUnIG9yICclbWlzc2luZyUnLCB3aGlsZSBpblxuICAgIC8vIFNob3dEYXRhVGFibGVQcmVzTW9kZWwsIHdlIGNhbiBnZXQgJ251bGwnIG9yICdtaXNzaW5nJywgb3IgJyVudWxsJScgZm9yIHN0cmluZyBzcGVjaWFsIHZhbHVlcy5cbiAgICAvLyBGb3IgZWl0aGVyIG9mIHRoZXNlIGNhc2VzLCB3ZSByZXR1cm4gc3BlY2lhbFZhbHVlSW5kaWNhdG9yIChvciB0aGUgb3JpZ2luYWwgc3BlY2lhbCBzdHJpbmcpLlxuICAgIC8vIFRvIG1haW50YWluIGJhY2t3YXJkcyBjb21wYXRpYmlsdHksIHRoaXMgY29udmVydGVyOlxuICAgIC8vIDEuIHJldHVybnMgYSBzdHJpbmcgZm9yIGFueSBzcGVjaWFsIHZhbHVlc1xuICAgIC8vIDIuIHJldHVybnMgYSBzdHJpbmcgZm9yIGFueSBkYXRlXG5cbiAgICAvLyBQYXJhbWV0ZXIgbWluL21heCB2YWx1ZXMgY2FuIGJlIHVuZGVmaW5lZCwgc28gcmVzdWx0IGlzIGFsc28gdW5kZWZpbmVkXG4gICAgaWYgKHZhbHVlQXNTdHJpbmcgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZUFzU3RyaW5nID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzU3BlY2lhbCh2YWx1ZUFzU3RyaW5nKSkge1xuICAgICAgcmV0dXJuIHZhbHVlQXNTdHJpbmc7XG4gICAgfVxuXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIERhdGFUeXBlLkJvb2w6XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlQm9vbGVhbih2YWx1ZUFzU3RyaW5nKTtcblxuICAgICAgY2FzZSBEYXRhVHlwZS5JbnQ6XG4gICAgICBjYXNlIERhdGFUeXBlLkZsb2F0OlxuICAgICAgICAvLyBSZXR1cm4gc3BlY2lhbCB2YWx1ZSAnJW51bGwlJyBmb3IgYW55IGZhaWx1cmUgaW4gcGFyc2luZy5cbiAgICAgICAgLy8gV2UgbmVlZCB0byBkbyB0aGF0IGJlY2F1c2UgU2hvd0RhdGFUYWJsZVByZXNNb2RlbCB3aWxsIGdpdmUgdXMgc3RyaW5ncyBsaWtlICdudWxsJ1xuICAgICAgICAvLyBmb3Igc3BlY2lhbCB2YWx1ZXMuXG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlTnVtYmVyKHZhbHVlQXNTdHJpbmcpO1xuXG4gICAgICBjYXNlIERhdGFUeXBlLkRhdGU6XG4gICAgICAgIC8vIEZvciBTaG93RGF0YVRhYmxlUHJlc01vZGVsLCBzcGVjaWFsIHZhbHVlcyB3aWxsIGJlIFwibnVsbFwiIHdoaWNoIHdpbGwgZmFpbCB0byBwYXJzZS5cbiAgICAgICAgLy8gSW4gdGhhdCBjYXNlLCB3ZSByZXR1cm4gJyVudWxsJScuXG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlRGF0ZSh2YWx1ZUFzU3RyaW5nKSA9PT0gbnVsbCA/IHRoaXMuc3BlY2lhbFZhbHVlSW5kaWNhdG9yIDogdmFsdWVBc1N0cmluZztcblxuICAgICAgY2FzZSBEYXRhVHlwZS5EYXRlVGltZTpcbiAgICAgICAgLy8gRm9yIFNob3dEYXRhVGFibGVQcmVzTW9kZWwsIHNwZWNpYWwgdmFsdWVzIHdpbGwgYmUgXCJudWxsXCIgd2hpY2ggd2lsbCBmYWlsIHRvIHBhcnNlLlxuICAgICAgICAvLyBJbiB0aGF0IGNhc2UsIHdlIHJldHVybiAnJW51bGwlJ1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZURhdGVUaW1lKHZhbHVlQXNTdHJpbmcpID09PSBudWxsID8gdGhpcy5zcGVjaWFsVmFsdWVJbmRpY2F0b3IgOiB2YWx1ZUFzU3RyaW5nO1xuXG4gICAgICBjYXNlIERhdGFUeXBlLlNwYXRpYWw6XG4gICAgICBjYXNlIERhdGFUeXBlLlN0cmluZzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB2YWx1ZUFzU3RyaW5nO1xuICAgIH1cbiAgfVxuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgcHVibGljIHN0YXRpYyBjb252ZXJ0VmFsdWVUb05hdGl2ZVZhbHVlKHZhbHVlOiBhbnksIHR5cGU6IERhdGFUeXBlKTogYm9vbGVhbiB8IG51bWJlciB8IERhdGUgfCBzdHJpbmcgfCBudWxsIHtcbiAgICAvLyBUaGlzIGNvbnZlcnRzIGZyb20gb3VyIDEuMiBBUEkgdGhhdCByZXR1cm5zIHN0cmluZ3MgZm9yIHNwZWNpYWxzLCBhbmQgZGF0ZXMgYXMgc3RyaW5ncy5cbiAgICAvLyBJdCB0YWtlcyB0aGUgc3BlY2lhbCBjYXNlIG9mICclbnVsbCUnIGFuZCByZXR1cm5zIGEgbnVsbC5cbiAgICAvLyBGb3IgZGF0ZXMsIGl0IHJldHVybnMgYSBEYXRlIG9iamVjdCByYXRoZXIgdGhhbiBhIHN0cmluZy5cbiAgICAvLyBjb252ZXJ0VmFsdWVUb05hdGl2ZVZhbHVlIHNob3VsZCBiZSB1c2VkIHRvIGJ1aWxkIGEgRGF0YVZhbHVlLm5hdGl2ZVZhbHVlIGZpZWxkLlxuXG4gICAgLy8gUGFyYW1ldGVyIG1pbi9tYXggY2FuIGJlIHVuZGVmaW5lZC4gSWYgdGhhdCBpcyB0aGUgY2FzZSwgbmF0aXZlVmFsdWUgaXMgdHJlYXRlZCBsaWtlIGEgc3BlY2lhbFxuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgRGF0YVR5cGUuQm9vbDpcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyBudWxsIDogdmFsdWU7XG5cbiAgICAgIGNhc2UgRGF0YVR5cGUuSW50OlxuICAgICAgY2FzZSBEYXRhVHlwZS5GbG9hdDpcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyBudWxsIDogdmFsdWU7XG5cbiAgICAgIGNhc2UgRGF0YVR5cGUuRGF0ZTpcbiAgICAgICAgLy8gQ29udmVydCB0aGUgc3RyaW5nIHRvIERhdGUgb2JqZWN0IChvciBudWxsIGlmIHBhcnNpbmcgZmFpbHMgLi4uIHdlIGFzc3VtZSBzcGVjaWFsKVxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZURhdGUodmFsdWUpO1xuXG4gICAgICBjYXNlIERhdGFUeXBlLkRhdGVUaW1lOlxuICAgICAgICAvLyBDb252ZXJ0IHRoZSBzdHJpbmcgdG8gRGF0ZSBvYmplY3QgKG9yIG51bGwgaWYgcGFyc2luZyBmYWlscyAuLi4gd2UgYXNzdW1lIHNwZWNpYWwpXG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlRGF0ZVRpbWUodmFsdWUpO1xuXG4gICAgICBjYXNlIERhdGFUeXBlLlN0cmluZzpcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNTcGVjaWFsKHZhbHVlKSA/IG51bGwgOiB2YWx1ZTtcblxuICAgICAgY2FzZSBEYXRhVHlwZS5TcGF0aWFsOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgcHVibGljIHN0YXRpYyBjb252ZXJ0U3RyaW5nVmFsdWVUb05hdGl2ZVZhbHVlKHZhbHVlOiBzdHJpbmcsIHR5cGU6IERhdGFUeXBlKTogYm9vbGVhbiB8IG51bWJlciB8IERhdGUgfCBzdHJpbmcgfCBudWxsIHtcbiAgICAvLyBUaGlzIGhhbmRsZXMgdGhlIGNvbnZlcnNpb24gZnJvbSBzdHJpbmcgZGlyZWN0bHkgdG8gbmF0aXZlIHZhbHVlIGZvciBhbGwgdHlwZXNcbiAgICByZXR1cm4gdGhpcy5jb252ZXJ0VmFsdWVUb05hdGl2ZVZhbHVlKHRoaXMuY29udmVydFZhbHVlQXNTdHJpbmdUb1ZhbHVlKHZhbHVlLCB0eXBlKSwgdHlwZSk7XG4gIH1cbn1cbiIsImV4cG9ydCBlbnVtIEV4dGVuc2lvbkNvbnRleHQge1xuICBEZXNrdG9wID0gJ2Rlc2t0b3AnLFxuICBTZXJ2ZXIgPSAnc2VydmVyJyxcbiAgVW5rbm93biA9ICd1bmtub3duJyxcbiAgQ2xvdWQgPSAnY2xvdWQnLFxuICBQdWJsaWNXZWIgPSAncHVibGljLXdlYicsXG4gIFB1YmxpY0Rlc2t0b3AgPSAncHVibGljLWRlc2t0b3AnLFxufVxuXG5leHBvcnQgZW51bSBFeHRlbnNpb25Nb2RlIHtcbiAgQXV0aG9yaW5nID0gJ2F1dGhvcmluZycsXG4gIFZpZXdpbmcgPSAndmlld2luZycsXG4gIFVua25vd24gPSAndW5rbm93bicsXG59XG5cbmV4cG9ydCBlbnVtIEFubm90YXRlRW51bSB7XG4gIE1hcmsgPSAnbWFyaycsXG4gIFBvaW50ID0gJ3BvaW50JyxcbiAgQXJlYSA9ICdhcmVhJyxcbn1cblxuZXhwb3J0IGVudW0gQ29sdW1uVHlwZSB7XG4gIERpc2NyZXRlID0gJ2Rpc2NyZXRlJyxcbiAgQ29udGludW91cyA9ICdjb250aW51b3VzJyxcbiAgVW5rbm93biA9ICd1bmtub3duJyxcbn1cblxuZXhwb3J0IGVudW0gRGFzaGJvYXJkT2JqZWN0VHlwZSB7XG4gIEJsYW5rID0gJ2JsYW5rJyxcbiAgV29ya3NoZWV0ID0gJ3dvcmtzaGVldCcsXG4gIFF1aWNrRmlsdGVyID0gJ3F1aWNrLWZpbHRlcicsXG4gIFBhcmFtZXRlckNvbnRyb2wgPSAncGFyYW1ldGVyLWNvbnRyb2wnLFxuICBQYWdlRmlsdGVyID0gJ3BhZ2UtZmlsdGVyJyxcbiAgTGVnZW5kID0gJ2xlZ2VuZCcsXG4gIFRpdGxlID0gJ3RpdGxlJyxcbiAgVGV4dCA9ICd0ZXh0JyxcbiAgSW1hZ2UgPSAnaW1hZ2UnLFxuICBXZWJQYWdlID0gJ3dlYi1wYWdlJyxcbiAgRXh0ZW5zaW9uID0gJ2V4dGVuc2lvbicsXG59XG5cbmV4cG9ydCBlbnVtIERhdGFUeXBlIHtcbiAgU3RyaW5nID0gJ3N0cmluZycsXG4gIEludCA9ICdpbnQnLFxuICBGbG9hdCA9ICdmbG9hdCcsXG4gIEJvb2wgPSAnYm9vbCcsXG4gIERhdGUgPSAnZGF0ZScsXG4gIERhdGVUaW1lID0gJ2RhdGUtdGltZScsXG4gIFNwYXRpYWwgPSAnc3BhdGlhbCcsXG4gIFVua25vd24gPSAndW5rbm93bicsXG59XG5cbmV4cG9ydCBlbnVtIERpYWxvZ1N0eWxlIHtcbiAgV2luZG93ID0gJ3dpbmRvdycsXG4gIE1vZGFsID0gJ21vZGFsJyxcbiAgTW9kZWxlc3MgPSAnbW9kZWxlc3MnLFxufVxuXG5leHBvcnQgZW51bSBFbmNvZGVkRGF0YVR5cGUge1xuICBOdW1iZXIgPSAnbnVtYmVyJyxcbiAgU3RyaW5nID0gJ3N0cmluZycsXG4gIERhdGUgPSAnZGF0ZScsXG4gIEJvb2xlYW4gPSAnYm9vbGVhbicsXG59XG5cbmV4cG9ydCBlbnVtIEVycm9yQ29kZXMge1xuICBJTklUSUFMSVpBVElPTl9FUlJPUiA9ICdpbml0aWFsaXphdGlvbi1lcnJvcicsXG4gIElOVEVSTkFMX0VSUk9SID0gJ2ludGVybmFsLWVycm9yJyxcbiAgTUlTU0lOR19FTlVNX01BUFBJTkcgPSAnbWlzc2luZy1lbnVtLW1hcHBpbmcnLFxuICBNSVNTSU5HX1BBUkFNRVRFUiA9ICdtaXNzaW5nLXBhcmFtZXRlcicsXG4gIFBFUk1JU1NJT05fREVOSUVEID0gJ3Blcm1pc3Npb24tZGVuaWVkJyxcbiAgUFJFU19NT0RFTF9QQVJTSU5HX0VSUk9SID0gJ3ByZXMtbW9kZWwtcGFyc2luZy1lcnJvcicsXG4gIFZFUlNJT05fTk9UX0NPTkZJR1VSRUQgPSAndmVyc2lvbi1ub3QtY29uZmlndXJlZCcsXG4gIFZJU0lCSUxJVFlfRVJST1IgPSAndmlzaWJpbGl0eS1lcnJvcicsXG4gIFVOS05PV05fVkVSQl9JRCA9ICd1bmtub3duLXZlcmItaWQnLFxufVxuXG5leHBvcnQgZW51bSBGaWVsZEFnZ3JlZ2F0aW9uVHlwZSB7XG4gIFN1bSA9ICdzdW0nLFxuICBBdmcgPSAnYXZnJyxcbiAgTWluID0gJ21pbicsXG4gIE1heCA9ICdtYXgnLFxuICBTdGRldiA9ICdzdGRldicsXG4gIFN0ZGV2cCA9ICdzdGRldnAnLFxuICBWYXIgPSAndmFyJyxcbiAgVmFycCA9ICd2YXJwJyxcbiAgQ29sbGVjdCA9ICdjb2xsZWN0JyxcbiAgQ291bnQgPSAnY291bnQnLFxuICBDb3VudGQgPSAnY291bnRkJyxcbiAgTWVkaWFuID0gJ21lZGlhbicsXG4gIEF0dHIgPSAnYXR0cicsXG4gIE5vbmUgPSAnbm9uZScsXG4gIFllYXIgPSAneWVhcicsXG4gIFF0ciA9ICdxdHInLFxuICBNb250aCA9ICdtb250aCcsXG4gIERheSA9ICdkYXknLFxuICBIb3VyID0gJ2hvdXInLFxuICBNaW51dGUgPSAnbWludXRlJyxcbiAgU2Vjb25kID0gJ3NlY29uZCcsXG4gIFdlZWsgPSAnd2VlaycsXG4gIFdlZWtkYXkgPSAnd2Vla2RheScsXG4gIE1vbnRoWWVhciA9ICdtb250aC15ZWFyJyxcbiAgTWR5ID0gJ21keScsXG4gIEVuZCA9ICdlbmQnLFxuICBUcnVuY1llYXIgPSAndHJ1bmMteWVhcicsXG4gIFRydW5jUXRyID0gJ3RydW5jLXF0cicsXG4gIFRydW5jTW9udGggPSAndHJ1bmMtbW9udGgnLFxuICBUcnVuY1dlZWsgPSAndHJ1bmMtd2VlaycsXG4gIFRydW5jRGF5ID0gJ3RydW5jLWRheScsXG4gIFRydW5jSG91ciA9ICd0cnVuYy1ob3VyJyxcbiAgVHJ1bmNNaW51dGUgPSAndHJ1bmMtbWludXRlJyxcbiAgVHJ1bmNTZWNvbmQgPSAndHJ1bmMtc2Vjb25kJyxcbiAgUXVhcnQxID0gJ3F1YXJ0MScsXG4gIFF1YXJ0MyA9ICdxdWFydDMnLFxuICBTa2V3bmVzcyA9ICdza2V3bmVzcycsXG4gIEt1cnRvc2lzID0gJ2t1cnRvc2lzJyxcbiAgSW5PdXQgPSAnaW4tb3V0JyxcbiAgVXNlciA9ICd1c2VyJyxcbn1cblxuZXhwb3J0IGVudW0gRmllbGRSb2xlVHlwZSB7XG4gIERpbWVuc2lvbiA9ICdkaW1lbnNpb24nLFxuICBNZWFzdXJlID0gJ21lYXN1cmUnLFxuICBVbmtub3duID0gJ3Vua25vd24nLFxufVxuXG4vKipcbiAqICBUaGUgZGlmZmVyZW50IHVwZGF0ZSB0eXBlcyBmb3IgYXBwbHlpbmcgZmlsdGVyLlxuICovXG5leHBvcnQgZW51bSBGaWx0ZXJVcGRhdGVUeXBlIHtcbiAgQWRkID0gJ2FkZCcsXG4gIEFsbCA9ICdhbGwnLFxuICBSZXBsYWNlID0gJ3JlcGxhY2UnLFxuICBSZW1vdmUgPSAncmVtb3ZlJyxcbn1cblxuZXhwb3J0IGVudW0gU2hlZXRUeXBlIHtcbiAgRGFzaGJvYXJkID0gJ2Rhc2hib2FyZCcsXG4gIFN0b3J5ID0gJ3N0b3J5JyxcbiAgV29ya3NoZWV0ID0gJ3dvcmtzaGVldCcsXG59XG5cbmV4cG9ydCBlbnVtIERvbWFpblJlc3RyaWN0aW9uVHlwZSB7XG4gIEFsbCA9ICdhbGwnLFxuICBMaXN0ID0gJ2xpc3QnLFxuICBSYW5nZSA9ICdyYW5nZScsXG59XG5cbmV4cG9ydCBlbnVtIERhdGVTdGVwUGVyaW9kIHtcbiAgWWVhcnMgPSAneWVhcnMnLFxuICBRdWFydGVycyA9ICdxdWFydGVycycsXG4gIE1vbnRocyA9ICdtb250aHMnLFxuICBXZWVrcyA9ICd3ZWVrcycsXG4gIERheXMgPSAnZGF5cycsXG4gIEhvdXJzID0gJ2hvdXJzJyxcbiAgTWludXRlcyA9ICdtaW51dGVzJyxcbiAgU2Vjb25kcyA9ICdzZWNvbmRzJyxcbn1cblxuLyoqXG4gKiBUaGUgb3B0aW9uIGZvciBzcGVjaWZ5aW5nIHdoaWNoIHZhbHVlcyB0byBpbmNsdWRlIGZvciBmaWx0ZXJpbmcuXG4gKi9cbmV4cG9ydCBlbnVtIEZpbHRlck51bGxPcHRpb24ge1xuICBOdWxsVmFsdWVzID0gJ251bGx2YWx1ZXMnLFxuICBOb25OdWxsVmFsdWVzID0gJ25vbm51bGx2YWx1ZXMnLFxuICBBbGxWYWx1ZXMgPSAnYWxsdmFsdWVzJyxcbn1cblxuLyoqXG4gKiBUaGUgdHlwZSBvZiBmaWx0ZXIgZG9tYWluXG4gKi9cbmV4cG9ydCBlbnVtIEZpbHRlckRvbWFpblR5cGUge1xuICBSZWxldmFudCA9ICdyZWxldmFudCcsXG4gIERhdGFiYXNlID0gJ2RhdGFiYXNlJyxcbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBlbnVtIGZvciBzcGVjaWZ5aW5nIHRoZSBzZWxlY3Rpb24gdHlwZSBmb3Igc2VsZWN0IG1hcmtzIGFwaS5cbiAqL1xuZXhwb3J0IGVudW0gU2VsZWN0aW9uVXBkYXRlVHlwZSB7XG4gIFJlcGxhY2UgPSAnc2VsZWN0LXJlcGxhY2UnLFxuICBBZGQgPSAnc2VsZWN0LWFkZCcsXG4gIFJlbW92ZSA9ICdzZWxlY3QtcmVtb3ZlJyxcbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBlbnVtIGZvciBzcGVjaWZ5aW5nIHRoZSBzZWxlY3Qgb3B0aW9uIGZvciB0aGUgc2VsZWN0IHR1cGxlcyBhcGkuXG4gKi9cbmV4cG9ydCBlbnVtIFNlbGVjdE9wdGlvbnMge1xuICBTaW1wbGUgPSAnc2VsZWN0LW9wdGlvbnMtc2ltcGxlJyxcbiAgVG9nZ2xlID0gJ3NlbGVjdC1vcHRpb25zLXRvZ2dsZScsXG4gIE1lbnUgPSAnc2VsZWN0LW9wdGlvbnMtbWVudScsIC8vIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGUgZXh0ZXJuYWwgY29udHJhY3RcbiAgUmFuZ2UgPSAnc2VsZWN0LW9wdGlvbnMtcmFuZ2UnLCAvLyBub3QgaW1wbGVtZW50ZWQgaW4gdGhlIGV4dGVybmFsIGNvbnRyYWN0XG4gIFNlYXJjaCA9ICdzZWxlY3Qtb3B0aW9ucy1zZWFyY2gnLCAvLyBub3QgaW1wbGVtZW50ZWQgaW4gdGhlIGV4dGVybmFsIGNvbnRyYWN0XG59XG5cbi8qKlxuICogSW50ZXJuYWwgZW51bSBmb3Igc3BlY2lmeWluZyB0aGUgaW5jbHVkZWQgdmFsdWVzIHR5cGUgZm9yIHJhbmdlIHNlbGVjdGlvbi5cbiAqL1xuZXhwb3J0IGVudW0gUXVhbnRpdGF0aXZlSW5jbHVkZWRWYWx1ZXMge1xuICBJbmNsdWRlTnVsbCA9ICdpbmNsdWRlLW51bGwnLFxuICBJbmNsdWRlTm9uTnVsbCA9ICdpbmNsdWRlLW5vbi1udWxsJyxcbiAgSW5jbHVkZUFsbCA9ICdpbmNsdWRlLWFsbCcsXG59XG5cbi8qKlxuICogSW50ZXJuYWwgZW51bSBmb3Igc3BlY2lmeWluZyBhIGhpZXJhcmNoaWNhbCBsZXZlbCBzZWxlY3Rpb24gc3RhdGUuXG4gKi9cbmV4cG9ydCBlbnVtIEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUge1xuICBBbGxTZWxlY3RlZCA9ICdhbGwtc2VsZWN0ZWQnLFxuICBOb25lU2VsZWN0ZWQgPSAnbm9uZS1zZWxlY3RlZCcsXG4gIFNvbWVTZWxlY3RlZCA9ICdzb21lLXNlbGVjdGVkJyxcbiAgVW5rbm93blNlbGVjdGVkID0gJ3Vua25vd24tc2VsZWN0ZWQnLFxufVxuXG4vKipcbiAqIFR5cGUgb2YgbWFyayBmb3IgYSBnaXZlbiBtYXJrcyBjYXJkIGluIGEgdml6LlxuICovXG5leHBvcnQgZW51bSBNYXJrVHlwZSB7XG4gIEJhciA9ICdiYXInLFxuICBMaW5lID0gJ2xpbmUnLFxuICBBcmVhID0gJ2FyZWEnLFxuICBTcXVhcmUgPSAnc3F1YXJlJyxcbiAgQ2lyY2xlID0gJ2NpcmNsZScsXG4gIFNoYXBlID0gJ3NoYXBlJyxcbiAgVGV4dCA9ICd0ZXh0JyxcbiAgTWFwID0gJ21hcCcsXG4gIFBpZSA9ICdwaWUnLFxuICBHYW50dEJhciA9ICdnYW50dC1iYXInLFxuICBQb2x5Z29uID0gJ3BvbHlnb24nLFxuICBIZWF0bWFwID0gJ2hlYXRtYXAnLFxuICBWaXpFeHRlbnNpb24gPSAndml6LWV4dGVuc2lvbicsXG59XG5cbi8qKlxuICogSW50ZXJuYWwgZW51bSBmb3Igc3BlY2lmeWluZyB0aGUgdHlwZSBvZiBmaWx0ZXJcbiAqL1xuZXhwb3J0IGVudW0gRmlsdGVyVHlwZSB7XG4gIENhdGVnb3JpY2FsID0gJ2NhdGVnb3JpY2FsJyxcbiAgUmFuZ2UgPSAncmFuZ2UnLFxuICBSZWxhdGl2ZURhdGUgPSAncmVsYXRpdmVEYXRlJyxcbiAgSGllcmFyY2hpY2FsID0gJ2hpZXJhcmNoaWNhbCcsXG59XG5cbi8qKlxuICogSW50ZXJuYWwgZW51bSBmb3Igc3BlY2lmeWluZyB0aGUgRGF0ZVJhbmdlVHlwZSBvZiBhIHJlbGF0aXZlIGRhdGUgZmlsdGVyXG4gKi9cbmV4cG9ydCBlbnVtIERhdGVSYW5nZVR5cGUge1xuICAvKipcbiAgICogUmVmZXJzIHRvIHRoZSBsYXN0IGRheSwgd2VlaywgbW9udGgsIGV0Yy4gb2YgdGhlIGRhdGUgcGVyaW9kLlxuICAgKi9cbiAgTGFzdCA9ICdsYXN0JyxcbiAgLyoqXG4gICAqIFJlZmVycyB0byB0aGUgbGFzdCBOIGRheXMsIHdlZWtzLCBtb250aHMsIGV0Yy4gb2YgdGhlIGRhdGUgcGVyaW9kLlxuICAgKi9cbiAgTGFzdE4gPSAnbGFzdE4nLFxuICAvKipcbiAgICogUmVmZXJzIHRvIHRoZSBuZXh0IGRheSwgd2VlaywgbW9udGgsIGV0Yy4gb2YgdGhlIGRhdGUgcGVyaW9kLlxuICAgKi9cbiAgTmV4dCA9ICduZXh0JyxcbiAgLyoqXG4gICAqIFJlZmVycyB0byB0aGUgbmV4dCBOIGRheXMsIHdlZWtzLCBtb250aHMsIGV0Yy4gb2YgdGhlIGRhdGUgcGVyaW9kLlxuICAgKi9cbiAgTmV4dE4gPSAnbmV4dE4nLFxuICAvKipcbiAgICogUmVmZXJzIHRvIHRoZSBjdXJyZW50IGRheSwgd2VlaywgbW9udGgsIGV0Yy4gb2YgdGhlIGRhdGUgcGVyaW9kLlxuICAgKi9cbiAgQ3VycmVudCA9ICdjdXJyZW50JyxcbiAgLyoqXG4gICAqIFJlZmVycyB0byBldmVyeXRoaW5nIHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhlIGN1cnJlbnQgZGF5LCB3ZWVrLCBtb250aCwgZXRjLiBvZiB0aGUgZGF0ZSBwZXJpb2QuXG4gICAqL1xuICBUb0RhdGUgPSAndG9EYXRlJyxcbn1cblxuLyoqXG4gKiBVc2VkIHRvIGRldGVybWluZSBpZiB0aGUgbGF1bmNoaW5nIG9mIGFuIGV4dGVuc2lvbiBkaWFsb2cgc3VjY2VlZGVkIG9yIGZhaWxlZC5cbiAqL1xuZXhwb3J0IGVudW0gRXh0ZW5zaW9uRGlhbG9nUmVzdWx0IHtcbiAgRGlhbG9nQWxyZWFkeU9wZW4gPSAnZGlhbG9nLWFscmVhZHktb3BlbicsXG4gIEludmFsaWREb21haW4gPSAnaW52YWxpZC1kb21haW4nLFxuICBTdWNjZXNzID0gJ3N1Y2Nlc3MnLFxufVxuXG4vKipcbiAqIFVzZWQgdG8gb3B0aW1pemUgdGhlIGdldFN1bW1hcnlEYXRhL2dldFVuZGVybHlpbmdUYWJsZURhdGEgcmVzdWx0c1xuICogTWFwcGVkIGZyb20gZXh0ZXJuYWwgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb25cbiAqL1xuZXhwb3J0IGVudW0gQXBpU2hvd0RhdGFUYWJsZUZvcm1hdCB7XG4gIE5hdGl2ZVZhbHVlc09ubHkgPSAnbmF0aXZlLXZhbHVlcy1vbmx5JyxcbiAgRm9ybWF0dGVkVmFsdWVzT25seSA9ICdmb3JtYXR0ZWQtdmFsdWVzLW9ubHknLFxuICBOYXRpdmVBbmRGb3JtYXR0ZWRWYWx1ZXMgPSAnbmF0aXZlLWFuZC1mb3JtYXR0ZWQtdmFsdWVzJyxcbn1cblxuLyoqXG4gKiBVc2VkIHRvIGRlbm90ZSB0aGUgc2VjdGlvbnMgb2YgZm9ybWF0dGluZyB3aXRoaW4gdGFibGVhdVxuICovXG5leHBvcnQgY29uc3QgZW51bSBDbGFzc05hbWVLZXkge1xuICBXb3Jrc2hlZXRUaXRsZSA9ICd0YWJsZWF1LXdvcmtzaGVldC10aXRsZScsXG4gIFdvcmtzaGVldCA9ICd0YWJsZWF1LXdvcmtzaGVldCcsXG4gIFRvb2x0aXAgPSAndGFibGVhdS10b29sdGlwJyxcbiAgU3RvcnlUaXRsZSA9ICd0YWJsZWF1LXN0b3J5LXRpdGxlJyxcbiAgRGFzaGJvYXJkVGl0bGUgPSAndGFibGVhdS1kYXNoYm9hcmQtdGl0bGUnLFxuICBQYW5lID0gJ3RhYmxlYXUtcGFuZScsXG4gIFJvd0RpdmlkZXJzID0gJ3RhYmxlYXUtcm93LWRpdmlkZXJzJyxcbiAgQ29sdW1uRGl2aWRlcnMgPSAndGFibGVhdS1jb2x1bW4tZGl2aWRlcnMnLFxufVxuXG4vKipcbiAqIFVzZWQgdG8gc2V0IHBhZ2Ugc2l6ZSBmb3IgZXhwb3J0IGxheW91dCBvcHRpb25zLlxuICovXG5leHBvcnQgZW51bSBQYWdlU2l6ZU9wdGlvbiB7XG4gIExldHRlciA9ICdsZXR0ZXInLFxuICBMZWdhbCA9ICdsZWdhbCcsXG4gIE5vdGUgPSAnbm90ZScsXG4gIEZvbGlvID0gJ2ZvbGlvJyxcbiAgVGFibG9pZCA9ICd0YWJsb2lkJyxcbiAgTGVkZ2VyID0gJ2xlZGdlcicsXG4gIFN0YXRlbWVudCA9ICdzdGF0ZW1lbnQnLFxuICBFeGVjdXRpdmUgPSAnZXhlY3V0aXZlJyxcbiAgQTMgPSAnYTMnLFxuICBBNCA9ICdhNCcsXG4gIEE1ID0gJ2E1JyxcbiAgQjQgPSAnYjQnLFxuICBCNSA9ICdiNScsXG4gIFF1YXJ0byA9ICdxdWFydG8nLFxuICBVbnNwZWNpZmllZCA9ICd1bnNwZWNpZmllZCcsXG59XG5cbi8qKlxuICogVXNlZCB0byBzZXQgdGhlIHBhZ2Ugb3JpZW50YXRpb24gbW9kZSBmb3IgZXhwb3J0IGxheW91dCBvcHRpb25zLlxuICovXG5leHBvcnQgZW51bSBQYWdlT3JpZW50YXRpb24ge1xuICBQcmludGVyID0gJ3ByaW50ZXInLFxuICBQb3J0cmFpdCA9ICdwb3J0cmFpdCcsXG4gIExhbmRzY2FwZSA9ICdsYW5kc2NhcGUnLFxufVxuXG4vKipcbiAqIFVzZWQgdG8gc2V0IHNjYWxlIG1vZGUgZm9yIGV4cG9ydCBsYXlvdXQgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGVudW0gU2NhbGVNb2RlIHtcbiAgU2NhbGVBdXRvID0gJ2F1dG8nLFxuICBTY2FsZVBlcmNlbnRhZ2UgPSAncGVyY2VudCcsXG4gIFNjYWxlRml0UGFnZXMgPSAnZml0LXBhZ2VzJyxcbn1cblxuLyoqXG4gKiBVc2VkIGJ5IHNldEZpdEFuZFNjYWxlVmFsdWVzIHRvIHNjYWxlIHBlcmNlbnQgdmFsdWVzXG4gKi9cbmV4cG9ydCBlbnVtIFBhZ2VTY2FsaW5nT3B0aW9uIHtcbiAgU2NhbGVQY3RBdXRvID0gJ2F1dG8nLFxuICBTY2FsZVBjdDQwMCA9ICdwY3Q0MDAnLFxuICBTY2FsZVBjdDIwMCA9ICdwY3QyMDAnLFxuICBTY2FsZVBjdDEwMCA9ICdwY3QxMDAnLFxuICBTY2FsZVBjdDkwID0gJ3BjdDkwJyxcbiAgU2NhbGVQY3Q4MCA9ICdwY3Q4MCcsXG4gIFNjYWxlUGN0NzUgPSAncGN0NzUnLFxuICBTY2FsZVBjdDYwID0gJ3BjdDYwJyxcbiAgU2NhbGVQY3Q1MCA9ICdwY3Q1MCcsXG4gIFNjYWxlUGN0MjUgPSAncGN0MjUnLFxufVxuXG4vKipcbiAqIFVzZWQgYnkgc2V0Rml0QW5kU2NhbGVWYWx1ZXMgdG8gc2NhbGUgZml0IHBhZ2UgdmFsdWVzXG4gKi9cbmV4cG9ydCBlbnVtIEZpdFBhZ2VzIHtcbiAgRml0T25lSGlnaCA9ICdmaXQweDEnLFxuICBGaXRUd29IaWdoID0gJ2ZpdDB4MicsXG4gIEZpdE9uZVdpZGUgPSAnZml0MXgwJyxcbiAgRml0VHdvV2lkZSA9ICdmaXQyeDAnLFxufVxuXG4vKipcbiAqIFVzZWQgYnkgZ2V0VmlzdWFsU3BlY2lmaWNhdGlvbkFzeW5jXG4gKi9cbmV4cG9ydCBlbnVtIEVuY29kaW5nVHlwZSB7XG4gIENvbG9yID0gJ2NvbG9yJyxcbiAgU2l6ZSA9ICdzaXplJyxcbiAgTGFiZWwgPSAnbGFiZWwnLFxuICBEZXRhaWwgPSAnZGV0YWlsJyxcbiAgVG9vbHRpcCA9ICd0b29sdGlwJyxcbiAgU2hhcGUgPSAnc2hhcGUnLFxuICBQYXRoID0gJ3BhdGgnLFxuICBBbmdsZSA9ICdhbmdsZScsXG4gIEdlb21ldHJ5ID0gJ2dlb21ldHJ5JyxcbiAgQ3VzdG9tID0gJ2N1c3RvbScsXG59XG5cbmV4cG9ydCBlbnVtIFB1bHNlVGltZURpbWVuc2lvbiB7XG4gIFRvZGF5ID0gJ1RvZGF5JyxcbiAgWWVzdGVyZGF5ID0gJ1llc3RlcmRheScsXG4gIFdlZWtUb0RhdGUgPSAnV2Vla1RvRGF0ZScsXG4gIExhc3RXZWVrID0gJ0xhc3RXZWVrJyxcbiAgTW9udGhUb0RhdGUgPSAnTW9udGhUb0RhdGUnLFxuICBMYXN0TW9udGggPSAnTGFzdE1vbnRoJyxcbiAgUXVhcnRlclRvRGF0ZSA9ICdRdWFydGVyVG9EYXRlJyxcbiAgTGFzdFF1YXJ0ZXIgPSAnTGFzdFF1YXJ0ZXInLFxuICBZZWFyVG9EYXRlID0gJ1llYXJUb0RhdGUnLFxuICBMYXN0WWVhciA9ICdMYXN0WWVhcicsXG59XG5cbmV4cG9ydCBlbnVtIFB1bHNlRXJyb3JNZXNzYWdlVmlzaWJpbGl0eSB7XG4gIFZpc2libGUgPSAndmlzaWJsZScsXG4gIEhpZGRlbiA9ICdoaWRkZW4nLFxuICBTdXBwcmVzc2VkID0gJ3N1cHByZXNzZWQnLFxufVxuIiwiZXhwb3J0IGVudW0gTm90aWZpY2F0aW9uSWQge1xuICBDdXN0b21NYXJrQ29udGV4dE1lbnVDbGlja2VkID0gJ2N1c3RvbS1tYXJrLWNvbnRleHQtbWVudS1jbGlja2VkJyxcbiAgQ29udGV4dE1lbnVDbGljayA9ICdjb250ZXh0LW1lbnUtY2xpY2snLFxuICBDdXN0b21WaWV3UmVtb3ZlZCA9ICdjdXN0b20tdmlldy1yZW1vdmVkJyxcbiAgQ3VzdG9tVmlld1NhdmVkID0gJ2N1c3RvbS12aWV3LXNhdmVkJyxcbiAgQ3VzdG9tVmlld1NldERlZmF1bHQgPSAnY3VzdG9tLXZpZXctc2V0LWRlZmF1bHQnLFxuICBDdXN0b21WaWV3c0xvYWRlZCA9ICdjdXN0b20tdmlld3MtbG9hZGVkJyxcbiAgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZCA9ICdkYXNoYm9hcmQtbGF5b3V0LWNoYW5nZWQnLFxuICBFZGl0QnV0dG9uQ2xpY2tlZCA9ICdlZGl0LWJ1dHRvbi1jbGlja2VkJyxcbiAgRWRpdEluRGVza3RvcEJ1dHRvbkNsaWNrZWQgPSAnZWRpdC1pbi1kZXNrdG9wLWJ1dHRvbi1jbGlja2VkJyxcbiAgRXh0ZW5zaW9uRGlhbG9nVXBkYXRlID0gJ2V4dGVuc2lvbi1kaWFsb2ctdXBkYXRlJyxcbiAgRXh0ZW5zaW9uRGlhbG9nTWVzc2FnZSA9ICdleHRlbnNpb24tZGlhbG9nLW1lc3NhZ2UnLFxuICBGaWx0ZXJDaGFuZ2VkID0gJ2ZpbHRlci1jaGFuZ2VkJyxcbiAgRmlyc3RWaXpTaXplS25vd24gPSAnZmlyc3Qtdml6LXNpemUta25vd24nLFxuICBGaXJzdFB1bHNlTWV0cmljU2l6ZUtub3duID0gJ2ZpcnN0LXB1bHNlLW1ldHJpYy1zaXplLWtub3duJyxcbiAgUGFyYW1ldGVyQ2hhbmdlZCA9ICdwYXJhbWV0ZXItY2hhbmdlZCcsXG4gIFB1bHNlRXJyb3IgPSAncHVsc2UtZXJyb3InLFxuICBQdWxzZUZpbHRlcnNDaGFuZ2VkID0gJ3B1bHNlLWZpbHRlcnMtY2hhbmdlZCcsXG4gIFB1bHNlTWV0cmljU2l6ZUNoYW5nZWQgPSAncHVsc2UtbWV0cmljLXNpemUtY2hhbmdlZCcsXG4gIFB1bHNlSW5zaWdodERpc2NvdmVyZWQgPSAncHVsc2UtaW5zaWdodC1kaXNjb3ZlcmVkJyxcbiAgUHVsc2VJbnRlcmFjdGl2ZSA9ICdwdWxzZS1pbnRlcmFjdGl2ZScsXG4gIFB1bHNlVGltZURpbWVuc2lvbkNoYW5nZWQgPSAncHVsc2UtdGltZS1kaW1lbnNpb24tY2hhbmdlZCcsXG4gIFB1bHNlVXJsQ2hhbmdlZCA9ICdwdWxzZS11cmwtY2hhbmdlZCcsXG4gIFNlbGVjdGVkTWFya3NDaGFuZ2VkID0gJ3NlbGVjdGVkLW1hcmtzLWNoYW5nZWQnLFxuICBTZXR0aW5nc0NoYW5nZWQgPSAnc2V0dGluZ3MtY2hhbmdlZCcsXG4gIFN1bW1hcnlEYXRhQ2hhbmdlZCA9ICdzdW1tYXJ5LWRhdGEtY2hhbmdlZCcsXG4gIFRlc3RDb252ZXJzaW9uTm90aWZpY2F0aW9uID0gJ3Rlc3QtY29udmVyc2lvbi1ub3RpZmljYXRpb24nLFxuICBUb29sYmFyU3RhdGVDaGFuZ2VkID0gJ3Rvb2xiYXItc3RhdGUtY2hhbmdlZCcsXG4gIFZpekludGVyYWN0aXZlID0gJ3Zpei1pbnRlcmFjdGl2ZScsXG4gIEFza0RhdGFJbnRlcmFjdGl2ZSA9ICdhc2stZGF0YS1pbnRlcmFjdGl2ZScsXG4gIFdvcmtib29rUmVhZHlUb0Nsb3NlID0gJ3dvcmtib29rLXJlYWR5LXRvLWNsb3NlJyxcbiAgV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZCA9ICd3b3JrYm9vay1mb3JtYXR0aW5nLWNoYW5nZWQnLFxuICBXb3JrYm9va1B1Ymxpc2hlZCA9ICd3b3JrYm9vay1wdWJsaXNoZWQnLFxuICBXb3JrYm9va1B1Ymxpc2hlZEFzID0gJ3dvcmtib29rLXB1Ymxpc2hlZC1hcycsXG4gIFdvcmtzaGVldEZvcm1hdHRpbmdDaGFuZ2VkID0gJ3dvcmtzaGVldC1mb3JtYXR0aW5nLWNoYW5nZWQnLFxuICBVcmxBY3Rpb24gPSAndXJsLWFjdGlvbicsXG4gIFRhYlN3aXRjaGVkID0gJ3RhYi1zd2l0Y2hlZCcsXG4gIFN0b3J5UG9pbnRTd2l0Y2hlZCA9ICdzdG9yeS1wb2ludC1zd2l0Y2hlZCcsXG4gIFJlYWR5VG9SZWNlaXZlQXV0aFRva2VuID0gJ3JlYWR5LXRvLXJlY2VpdmUtYXV0aC10b2tlbicsXG59XG4iLCIvLyBQTEVBU0UgS0VFUCBJTiBBTFBIQUJFVElDQUwgT1JERVIuIFRoaXMgaGVscHMgd2l0aCB2aXN1YWxseSBmaW5kaW5nIGVudHJpZXMsIGtub3dpbmcgd2hlcmUgdG8gcHV0XG4vLyBuZXcgb25lcywgYW5kIG1lcmdlIGNvbmZsaWN0cy5cbmV4cG9ydCBlbnVtIFBhcmFtZXRlcklkIHtcbiAgQWN0aXZlVGFibGVzSW5mbyA9ICdhY3RpdmUtdGFibGVzLWluZm8nLFxuICBBbmNob3JEYXRlID0gJ2FuY2hvci1kYXRlJyxcbiAgQW5ub3RhdGVFbnVtID0gJ2Fubm90YXRlLWVudW0nLFxuICBBbm5vdGF0aW9uTGlzdCA9ICdhbm5vdGF0aW9uLWxpc3QnLFxuICBBcHBseVdvcmtzaGVldEZvcm1hdHRpbmcgPSAnYXBwbHktd29ya3NoZWV0LWZvcm1hdHRpbmcnLFxuXG4gIENhdGVnb3JpY2FsRG9tYWluID0gJ2NhdGVnb3JpY2FsLWRvbWFpbicsXG4gIENsaWNrVGhyb3VnaEVuYWJsZWQgPSAnY2xpY2stdGhyb3VnaC1lbmFibGVkJyxcbiAgQ29sdW1ucyA9ICdjb2x1bW5zJyxcbiAgQ29sdW1uc1RvSW5jbHVkZSA9ICdjb2x1bW5zLXRvLWluY2x1ZGUnLFxuICBDb2x1bW5zVG9JbmNsdWRlQnlJZCA9ICdjb2x1bW5zLXRvLWluY2x1ZGUtYnktaWQnLFxuICBDb25uZWN0aW9uRGVzY3JpcHRpb25TdW1tYXJpZXMgPSAnY29ubmVjdGlvbi1kZXNjcmlwdGlvbi1zdW1tYXJpZXMnLFxuICBDdXJyZW50U2hlZXRUeXBlID0gJ2N1cnJlbnQtc2hlZXQtdHlwZScsXG4gIEN1c3RvbVZpZXcgPSAnY3VzdG9tLXZpZXcnLFxuICBDdXN0b21WaWV3SXNEZWZhdWx0ID0gJ2N1c3RvbS12aWV3LWlzLWRlZmF1bHQnLFxuICBDdXN0b21WaWV3SXNQdWJsaWMgPSAnY3VzdG9tLXZpZXctaXMtcHVibGljJyxcbiAgQ3VzdG9tVmlld0x1aWQgPSAnY3VzdG9tLXZpZXctbHVpZCcsXG4gIEN1c3RvbVZpZXdOYW1lID0gJ2N1c3RvbS12aWV3LW5hbWUnLFxuICBDdXN0b21WaWV3cyA9ICdjdXN0b20tdmlld3MnLFxuXG4gIERhc2hib2FyZCA9ICdkYXNoYm9hcmQnLFxuICBEYXNoYm9hcmRGaWx0ZXJzID0gJ2Rhc2hib2FyZC1maWx0ZXJzJyxcbiAgRGFzaGJvYXJkTmFtZSA9ICdkYXNoYm9hcmQnLFxuICBEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUgPSAnZGFzaGJvYXJkLW9iamVjdC1wb3NpdGlvbi1hbmQtc2l6ZS11cGRhdGUnLFxuICBEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGVMaXN0ID0gJ2Rhc2hib2FyZC1vYmplY3QtcG9zaXRpb24tYW5kLXNpemUtdXBkYXRlLWxpc3QnLFxuICBEYXRhUm93SW5kZXggPSAnZGF0YS1yb3ctaW5kZXgnLFxuICBEYXRhU2NoZW1hID0gJ2RhdGEtc2NoZW1hJyxcbiAgRGF0YVNvdXJjZSA9ICdkYXRhLXNvdXJjZScsXG4gIERhdGFTb3VyY2VEYXRhVGFibGUgPSAnZGF0YS1zb3VyY2UtZGF0YS10YWJsZScsXG4gIERhdGFTb3VyY2VJZCA9ICdkYXRhLXNvdXJjZS1pZCcsXG4gIERhdGFTb3VyY2VOYW1lID0gJ2RhdGEtc291cmNlLW5hbWUnLFxuICBEYXRhVGFibGUgPSAnZGF0YS10YWJsZScsXG4gIERhdGFUYWJsZVJlYWRlciA9ICdkYXRhLXRhYmxlLXJlYWRlcicsXG4gIERhdGVSYW5nZVR5cGUgPSAnZGF0ZS1yYW5nZS10eXBlJyxcbiAgRGVsZXRlQ291bnQgPSAnZGVsZXRlLWNvdW50JyxcbiAgRGVsdGFUaW1lTXMgPSAnZGVsdGEtdGltZS1tcycsXG4gIERpbVZhbFNlbGVjdGlvbk1vZGVscyA9ICdkaW1lbnNpb25WYWx1ZVNlbGVjdGlvbk1vZGVscycsXG4gIERvbWFpblR5cGUgPSAnZG9tYWluLXR5cGUnLFxuXG4gIEVtYmVkZGluZ0Fic3RyYWN0UXVlcnkgPSAnZW1iZWRkaW5nLWFic3RyYWN0LXF1ZXJ5JyxcbiAgRW1iZWRkaW5nQm9vdHN0cmFwSW5mbyA9ICdlbWJlZGRpbmctYm9vdHN0cmFwLWluZm8nLFxuICBFbmNvZGluZ1R5cGUgPSAnZW5jb2RpbmctdHlwZScsXG4gIEV4cG9ydENyb3NzdGFiU2hlZXRNYXAgPSAnZXhwb3J0LWNyb3NzdGFiLXNoZWV0LW1hcCcsXG4gIEV4cG9ydEZpbGUgPSAnZXhwb3J0LWZpbGUnLFxuICBFeHBvcnRPcmlnaW5VcmwgPSAnZXhwb3J0LW9yaWdpbi11cmwnLFxuICBFeHBvcnRQZGZPcHRpb25zID0gJ2V4cG9ydC1wZGYtb3B0aW9ucycsXG4gIEV4dGVuc2lvbkJvb3RzdHJhcEluZm8gPSAnZXh0ZW5zaW9uLWJvb3RzdHJhcC1pbmZvJyxcbiAgRXh0ZW5zaW9uQ29udGV4dE1lbnVJZHMgPSAnZXh0ZW5zaW9uLWNvbnRleHQtbWVudS1pZHMnLFxuICBFeHRlbnNpb25EaWFsb2dIID0gJ2V4dGVuc2lvbi1kaWFsb2ctaGVpZ2h0JyxcbiAgRXh0ZW5zaW9uRGlhbG9nTWVzc2FnZSA9ICdleHRlbnNpb24tZGlhbG9nLW1lc3NhZ2UnLFxuICBFeHRlbnNpb25EaWFsb2dQYXlsb2FkID0gJ2V4dGVuc2lvbi1kaWFsb2ctcGF5bG9hZCcsXG4gIEV4dGVuc2lvbkRpYWxvZ1Jlc3VsdCA9ICdleHRlbnNpb24tZGlhbG9nLXJlc3VsdCcsXG4gIEV4dGVuc2lvbkRpYWxvZ1N0eWxlID0gJ2V4dGVuc2lvbi1kaWFsb2ctc3R5bGUnLFxuICBFeHRlbnNpb25EaWFsb2dVcmwgPSAnZXh0ZW5zaW9uLWRpYWxvZy11cmwnLFxuICBFeHRlbnNpb25EaWFsb2dXID0gJ2V4dGVuc2lvbi1kaWFsb2ctd2lkdGgnLFxuICBFeHRlbnNpb25Mb2NhdG9yID0gJ2V4dGVuc2lvbi1sb2NhdG9yJyxcbiAgRXh0ZW5zaW9uU2V0dGluZ3NJbmZvID0gJ2V4dGVuc2lvbi1zZXR0aW5ncy1pbmZvJyxcbiAgRXh0ZW5zaW9uWm9uZUlkID0gJ2V4dGVuc2lvbi16b25lLWlkJyxcbiAgRXh0ZXJuYWxNZW51RGVzY3JpcHRpb24gPSAnZXh0ZXJuYWwtbWVudS1kZXNjcmlwdGlvbicsXG4gIEV4dGVybmFsTWVudUhlYWRlciA9ICdleHRlcm5hbC1tZW51LWhlYWRlcicsXG4gIEV4dGVybmFsTWVudUl0ZW1EaXNwbGF5TmFtZSA9ICdleHRlcm5hbC1tZW51LWl0ZW0tZGlzcGxheS1uYW1lJyxcbiAgRXh0ZXJuYWxNZW51SXRlbUlkID0gJ2V4dGVybmFsLW1lbnUtaXRlbS1pZCcsXG5cbiAgRmllbGQgPSAnZmllbGQnLFxuICBGaWVsZENvdW50ID0gJ2ZpZWxkLWNvdW50JyxcbiAgRmllbGRJZCA9ICdmaWVsZC1pZCcsXG4gIEZpZWxkTmFtZSA9ICdmaWVsZC1uYW1lJyxcbiAgRmlsdGVyTGV2ZWxzID0gJ2ZpbHRlci1sZXZlbHMnLFxuICBGaWx0ZXJSYW5nZU1heCA9ICdmaWx0ZXItcmFuZ2UtbWF4JyxcbiAgRmlsdGVyUmFuZ2VNaW4gPSAnZmlsdGVyLXJhbmdlLW1pbicsXG4gIEZpbHRlclJhbmdlTnVsbE9wdGlvbiA9ICdmaWx0ZXItcmFuZ2UtbnVsbC1vcHRpb24nLFxuICBGaWx0ZXJVcGRhdGVUeXBlID0gJ2ZpbHRlci11cGRhdGUtdHlwZScsXG4gIEZpbHRlclZhbHVlcyA9ICdmaWx0ZXItdmFsdWVzJyxcbiAgRm9udE5hbWVMaXN0SXRlbXMgPSAnZm9udC1uYW1lLWxpc3QtaXRlbXMnLFxuICBGb3JtYXR0ZWRUZXh0ID0gJ2Zvcm1hdHRlZC10ZXh0JyxcbiAgRnVuY3Rpb25OYW1lID0gJ2Z1bmN0aW9uLW5hbWUnLFxuICBGcm9tSW5kZXggPSAnZnJvbS1pbmRleCcsXG5cbiAgSGllclZhbFNlbGVjdGlvbk1vZGVscyA9ICdoaWVyYXJjaGljYWxWYWx1ZVNlbGVjdGlvbk1vZGVscycsXG4gIEhpZ2hsaWdodGVkRGF0YSA9ICdoaWdobGlnaHRlZC1kYXRhJyxcbiAgSG92ZXJUdXBsZUludGVyYWN0aW9uID0gJ2hvdmVyLXR1cGxlLWludGVyYWN0aW9uJyxcblxuICBJZ25vcmVBbGlhc2VzID0gJ2lnbm9yZS1hbGlhc2VzJyxcbiAgSWdub3JlU2VsZWN0aW9uID0gJ2lnbm9yZS1zZWxlY3Rpb24nLFxuICBJbmNsdWRlQWxsQ29sdW1ucyA9ICdpbmNsdWRlLWFsbC1jb2x1bW5zJyxcbiAgSW52YWxpZEFnZ0ZpZWxkTmFtZSA9ICdpbnZhbGlkLWFnZy1maWVsZC1uYW1lJyxcbiAgSW52YWxpZERhdGVzID0gJ2ludmFsaWQtZGF0ZXMnLFxuICBJbnZhbGlkRmllbGRDYXB0aW9uID0gJ2ludmFsaWQtZmllbGQtY2FwdGlvbicsXG4gIEludmFsaWRGaWVsZHMgPSAnaW52YWxpZC1maWVsZHMnLFxuICBJbnZhbGlkVmFsdWVzID0gJ2ludmFsaWQtdmFsdWVzJyxcbiAgSXNBbmFseXRpY3NBc3Npc3RhbnRBdmFpbGFibGUgPSAnaXMtYW5hbHl0aWNzLWFzc2lzdGFudC1hdmFpbGFibGUnLFxuICBJc0V4Y2x1ZGVNb2RlID0gJ2lzLWV4Y2x1ZGUnLFxuICBJc0V4dGVuc2lvbkRpYWxvZyA9ICdpcy1leHRlbnNpb24tZGlhbG9nJyxcbiAgSXNGcm9tQ2FsY0RpYWxvZyA9ICdpcy1mcm9tLWNhbGMtZGlhbG9nJyxcblxuICBKb2luRGVzY3JpcHRpb24gPSAnam9pbi1kZXNjcmlwdGlvbicsXG5cbiAgTG9naWNhbFRhYmxlSWQgPSAnbG9naWNhbC10YWJsZS1pZCcsXG4gIExvZ2ljYWxUYWJsZUluZm9MaXN0ID0gJ2xvZ2ljYWwtdGFibGUtaW5mby1saXN0JyxcblxuICBNYXJrc0NhcmRJbmRleCA9ICdtYXJrcy1jYXJkLWluZGV4JyxcbiAgTWF4SGVpZ2h0ID0gJ21heC1oZWlnaHQnLFxuICBNYXhSb3dzID0gJ21heC1yb3dzJyxcbiAgTWF4V2lkdGggPSAnbWF4LXdpZHRoJyxcbiAgTWluSGVpZ2h0ID0gJ21pbi1oZWlnaHQnLFxuICBNaW5XaWR0aCA9ICdtaW4td2lkdGgnLFxuXG4gIFBhZ2VSb3dDb3VudCA9ICdwYWdlLXJvdy1jb3VudCcsXG4gIFBhcmFtZXRlckNhcHRpb24gPSAncGFyZW1ldGVyLWNhcHRpb24nLFxuICBQYXJhbWV0ZXJFcnJvciA9ICdwYXJhbWV0ZXItZXJyb3InLFxuICBQYXJhbWV0ZXJGaWVsZE5hbWUgPSAncGFyYW1ldGVyLWZpZWxkLW5hbWUnLFxuICBQYXJhbWV0ZXJJbmZvID0gJ3BhcmFtZXRlci1pbmZvJyxcbiAgUGFyYW1ldGVySW5mb3MgPSAncGFyYW1ldGVyLWluZm9zJyxcbiAgUGFyYW1ldGVyVmFsdWUgPSAncGFyYW1ldGVyLXZhbHVlJyxcbiAgUGVyaW9kVHlwZSA9ICdwZXJpb2QtdHlwZScsXG4gIFB1bHNlRmllbGROYW1lID0gJ2ZpZWxkTmFtZScsXG4gIFB1bHNlRmllbGROYW1lcyA9ICdmaWVsZE5hbWVzJyxcbiAgUHVsc2VGaWx0ZXJEb21haW5UeXBlID0gJ2RvbWFpblR5cGUnLFxuICBQdWxzZUZpbHRlckRvbWFpblNlYXJjaFRlcm0gPSAnc2VhcmNoVGVybScsXG4gIFB1bHNlUGFnZVNpemUgPSAncGFnZVNpemUnLFxuICBQdWxzZU5leHRQYWdlVG9rZW4gPSAnbmV4dFBhZ2VUb2tlbicsXG4gIFB1bHNlRmlsdGVycyA9ICdmaWx0ZXJzJyxcbiAgUHVsc2VUaW1lRGltZW5zaW9uID0gJ3RpbWVEaW1lbnNpb24nLFxuXG4gIFF1YW50aXRhdGl2ZURvbWFpbiA9ICdxdWFudGl0YXRpdmUtZG1haW4nLFxuICBRdWFudFJhbmdlU2VsZWN0aW9uTW9kZWxzID0gJ3F1YW50YXRpdmVSYW5nZVNlbGVjdGlvbk1vZGVscycsXG5cbiAgUmFuZ2VOID0gJ3JhbmdlLW4nLFxuICBSZXBsYXlTcGVlZCA9ICdyZXBsYXktc3BlZWQnLFxuXG4gIFNlbGVjdGVkRGF0YSA9ICdzZWxlY3RlZC1kYXRhJyxcbiAgU2VsZWN0ZWRTaGVldE5hbWVzID0gJ3NlbGVjdGVkLXNoZWV0LW5hbWVzJyxcbiAgU2VsZWN0aW9uID0gJ3NlbGVjdGlvbicsXG4gIFNlbGVjdGlvbkxpc3QgPSAnc2VsZWN0aW9uLWxpc3QnLFxuICBTZWxlY3Rpb25VcGRhdGVUeXBlID0gJ3NlbGVjdGlvblVwZGF0ZVR5cGUnLFxuICBTZWxlY3RUdXBsZXNJbnRlcmFjdGlvbiA9ICdzZWxlY3QtdHVwbGVzLWludGVyYWN0aW9uJyxcbiAgU2VuZE5vdGlmaWNhdGlvbnMgPSAnc2VuZC1ub3RpZmljYXRpb25zJyxcbiAgU2V0dGluZ3NWYWx1ZXMgPSAnc2V0dGluZ3MtdmFsdWVzJyxcbiAgU2hhcmVkRmlsdGVyU2hlZXRzID0gJ3NoYXJlZC1maWx0ZXItc2hlZXRzJyxcbiAgU2hhcmVkRmlsdGVyc0luZm8gPSAnc2hhcmVkLWZpbHRlcnMtaW5mbycsXG4gIFNoZWV0SWRlbnRpZmllciA9ICdzaGVldC1pZGVudGlmaWVyJyxcbiAgU2hlZXROYW1lID0gJ3NoZWV0LW5hbWUnLFxuICBTaGVldFBhdGggPSAnc2hlZXQtcGF0aCcsXG4gIFNob3VsZFJlZnJlc2hEUyA9ICdzaG91bGQtcmVmcmVzaC1kcycsXG4gIFNob3dEYXRhVGFibGVGb3JtYXQgPSAnc2hvdy1kYXRhLXRhYmxlLWZvcm1hdCcsXG4gIFN0YXJ0SW5kZXggPSAnc3RhcnQtaW5kZXgnLFxuICBTdGF0ZSA9ICdzdGF0ZScsXG4gIFN0b3J5UG9pbnRJbmRleCA9ICdzdG9yeS1wb2ludC1pbmRleCcsXG4gIFN0b3J5UG9pbnRJbmZvID0gJ3N0b3J5LXBvaW50LWluZm8nLFxuICBTd2l0Y2hUb1NoZWV0TmFtZSA9ICdzd2l0Y2gtdG8tc2hlZXQtbmFtZScsXG5cbiAgVGFyZ2V0UG9pbnQgPSAndGFyZ2V0LXBvaW50JyxcbiAgVGVzdENvbnZlcnNpb25QYXJhbWV0ZXIgPSAndGVzdC1jb252ZXJzaW9uLXBhcmFtZXRlcicsXG4gIFRleHQgPSAnZm9ybWF0dGVkLXRleHQnLFxuICBUb0luZGV4ID0gJ3RvLWluZGV4JyxcbiAgVG9vbHRpcENvbnRleHQgPSAndG9vbHRpcC1jb250ZXh0JyxcbiAgVG9vbHRpcFRleHRSZXF1ZXN0ID0gJ3Rvb2x0aXAtdGV4dC1yZXF1ZXN0JyxcbiAgVG9vbHRpcFRleHQgPSAndG9vbHRpcC10ZXh0JyxcblxuICBVbmRlcmx5aW5nRGF0YVRhYmxlID0gJ3VuZGVybHlpbmctZGF0YS10YWJsZScsXG4gIFVuZGVybHlpbmdTdW1tYXJ5RGF0YVRhYmxlID0gJ3VuZGVybHlpbmctc3VtbWFyeS1kYXRhLXRhYmxlJyxcbiAgVXJsID0gJ3VybCcsXG4gIFVzZVRhYkRlbGltaXRlcnMgPSAndXNlLXRhYi1kZWxpbWl0ZXJzJyxcblxuICBWaWV3RGF0YVRhYmxlQ2FjaGVJZCA9ICd2aWV3LWRhdGEtdGFibGUtY2FjaGUtaWQnLFxuICBWaWV3RGF0YVRhYmxlSWQgPSAndmlldy1kYXRhLXRhYmxlLWlkJyxcbiAgVmlzdWFsSWQgPSAndmlzdWFsLWlkJyxcbiAgVmlzdWFsU3BlY2lmaWNhdGlvbiA9ICd2aXN1YWwtc3BlY2lmaWNhdGlvbicsXG4gIFZpekFQSUlucHV0SnNvbiA9ICd2aXphcGktaW5wdXQtanNvbicsXG4gIFZpekFQSVN0YXRlV2l0aERhdGFNb2RlbCA9ICd2aXphcGktc3RhdGUtd2l0aC1kYXRhLW1vZGVsJyxcbiAgVml6QVBJU3RhdGVXYXJuaW5nTXNnID0gJ3ZpemFwaS1zdGF0ZS13YXJuaW5nLW1zZycsXG4gIFZpekFQSVNWRyA9ICd2aXphcGktc3ZnJyxcblxuICBXb3Jrc2hlZXROYW1lID0gJ3dvcmtzaGVldC1uYW1lJyxcbiAgV29ya3NoZWV0RmlsdGVycyA9ICd3b3Jrc2hlZXQtZmlsdGVycycsXG5cbiAgWm9uZUlkc1Zpc2liaWxpdHlNYXAgPSAnem9uZS1pZHMtdmlzaWJpbGl0eS1tYXAnLFxufVxuIiwiLy8gRGVjbGFyZSB0aGlzIGtleSB0eXBlIGFuZCBleHBvcnQgdGhlIE5vdGlmaWNhdGlvbklkIHRvIG1ha2UgdGhpcyBiZWhhdmUgbGlrZSBhIHN0cmluZyBlbnVtLlxuLy9cbi8vIFBMRUFTRSBLRUVQIElOIEFMUEhBQkVUSUNBTCBPUkRFUi4gVGhpcyBoZWxwcyB3aXRoIHZpc3VhbGx5IGZpbmRpbmcgZW50cmllcywga25vd2luZyB3aGVyZSB0byBwdXRcbi8vIG5ldyBvbmVzLCBhbmQgbWVyZ2UgY29uZmxpY3RzLlxuZXhwb3J0IGVudW0gVmVyYklkIHtcbiAgQWN0aXZhdGVOZXh0U3RvcnlQb2ludCA9ICdhY3RpdmF0ZS1uZXh0LXN0b3J5LXBvaW50JyxcbiAgQWN0aXZhdGVQcmV2aW91c1N0b3J5UG9pbnQgPSAnYWN0aXZhdGUtcHJldmlvdXMtc3RvcnktcG9pbnQnLFxuICBBY3RpdmF0ZVNoZWV0ID0gJ2FjdGl2YXRlU2hlZXQnLFxuICBBY3RpdmF0ZVN0b3J5UG9pbnQgPSAnYWN0aXZhdGUtc3RvcnktcG9pbnQnLFxuICBBZGRNYXJrc0NhcmRGaWVsZHMgPSAnYWRkLW1hcmtzLWNhcmQtZmllbGRzJyxcbiAgQXBwZW5kRXh0ZXJuYWxNZW51SXRlbSA9ICdhcHBlbmQtZXh0ZXJuYWwtbWVudS1pdGVtJyxcbiAgQXBwbHlDYXRlZ29yaWNhbEZpbHRlciA9ICdjYXRlZ29yaWNhbC1maWx0ZXInLFxuICBBcHBseVB1bHNlRmlsdGVycyA9ICdhcHBseS1wdWxzZS1maWx0ZXJzJyxcbiAgQXBwbHlQdWxzZVRpbWVEaW1lbnNpb24gPSAnYXBwbHktcHVsc2UtdGltZS1kaW1lbnNpb24nLFxuICBBcHBseVJhbmdlRmlsdGVyID0gJ3JhbmdlLWZpbHRlcicsXG4gIEFwcGx5UmVsYXRpdmVEYXRlRmlsdGVyID0gJ2FwcGx5LXJlbGF0aXZlLWRhdGUtRmlsdGVyJyxcbiAgQXV0aGVudGljYXRlID0gJ2F1dGhlbnRpY2F0ZScsXG5cbiAgQmxvY2tFeHRlbnNpb24gPSAnYmxvY2stZXh0ZW5zaW9uJyxcblxuICBDaGFuZ2VQYXJhbWV0ZXJWYWx1ZSA9ICdjaGFuZ2UtcGFyYW1ldGVyLXZhbHVlJyxcbiAgQ2hhbmdlU2hhcmVkRmlsdGVyID0gJ2NoYW5nZS1zaGFyZWQtZmlsdGVyJyxcbiAgQ2xlYXJBbGxQdWxzZUZpbHRlcnMgPSAnY2xlYXItYWxsLXB1bHNlLWZpbHRlcnMnLFxuICBDbGVhckZpbHRlciA9ICdjbGVhci1maWx0ZXInLFxuICBDbGVhclB1bHNlRmlsdGVycyA9ICdjbGVhci1wdWxzZS1maWx0ZXJzJyxcbiAgQ2xlYXJTZWxlY3RlZE1hcmtzID0gJ2NsZWFyLXNlbGVjdGVkLW1hcmtzJyxcbiAgQ2xvc2VEaWFsb2cgPSAnY2xvc2UtZGlhbG9nJyxcbiAgQ3JlYXRlQW5ub3RhdGlvbiA9ICdjcmVhdGUtYW5ub3RhdGlvbicsXG5cbiAgRGFzaGJvYXJkQ2F0ZWdvcmljYWxGaWx0ZXIgPSAnZGFzaGJvYXJkLWNhdGVnb3JpY2FsLWZpbHRlcicsXG4gIERpc3BsYXlEaWFsb2cgPSAnZGlzcGxheS1kaWFsb2cnLFxuICBEb3dubG9hZFdvcmtib29rID0gJ2Rvd25sb2FkLXdvcmtib29rJyxcblxuICBFZGl0QWxpYXNlc0RpYWxvZyA9ICdlZGl0LWFsaWFzZXMtZGlhbG9nJyxcbiAgRXhlY3V0ZUV4dGVybmFsTWVudUl0ZW0gPSAnZXhlY3V0ZS1leHRlcm5hbC1tZW51LWl0ZW0nLFxuICBFeHBvcnRDcm9zc3RhYiA9ICdleHBvcnQtY3Jvc3N0YWInLFxuICBFeHBvcnRDcm9zc3RhYkNzdkRvd25sb2FkID0gJ2V4cG9ydC1jcm9zc3RhYi1jc3YtZG93bmxvYWQnLFxuICBFeHBvcnRDcm9zc3RhYkV4Y2VsRG93bmxvYWQgPSAnZXhwb3J0LWNyb3NzdGFiLWV4Y2VsLWRvd25sb2FkJyxcbiAgRXhwb3J0RGF0YSA9ICdleHBvcnQtZGF0YScsXG4gIEV4cG9ydERhdGFEb3dubG9hZCA9ICdleHBvcnQtZGF0YS1kb3dubG9hZCcsXG4gIEV4cG9ydEltYWdlID0gJ2V4cG9ydC1pbWFnZScsXG4gIEV4cG9ydFBkZiA9ICdleHBvcnQtcGRmJyxcbiAgRXhwb3J0UGRmRG93bmxvYWQgPSAnZXhwb3J0LXBkZi1kb3dubG9hZCcsXG4gIEV4cG9ydFBvd2VycG9pbnQgPSAnZXhwb3J0LXBvd2VycG9pbnQnLFxuICBFeHBvcnRQb3dlcnBvaW50RG93bmxvYWQgPSAnZXhwb3J0LXBvd2VycG9pbnQtZG93bmxvYWQnLFxuXG4gIEZpbmRQYXJhbWV0ZXIgPSAnZmluZC1wYXJhbWV0ZXInLFxuXG4gIEdldEFjdGl2ZVRhYmxlcyA9ICdnZXQtYWN0aXZlLXRhYmxlcycsXG4gIEdldEFsbERhdGFTb3VyY2VzID0gJ2dldC1hbGwtZGF0YS1zb3VyY2VzJyxcbiAgR2V0QW5ub3RhdGlvbnMgPSAnZ2V0LWFubm90YXRpb25zJyxcbiAgR2V0Q2F0ZWdvcmljYWxEb21haW4gPSAnZ2V0LWNhdGVnb3JpY2FsLWRvbWFpbicsXG4gIEdldENvbm5lY3Rpb25EZXNjcmlwdGlvblN1bW1hcmllcyA9ICdnZXQtY29ubmVjdGlvbi1kZXNjcmlwdGlvbi1zdW1tYXJpZXMnLFxuICBHZXRDdXJyZW50U3JjID0gJ2dldC1jdXJyZW50LXNyYycsXG4gIEdldEN1c3RvbVZpZXdzID0gJ2dldC1jdXN0b20tdmlld3MnLFxuICBHZXREYXNoYm9hcmRGaWx0ZXJzID0gJ2dldC1kYXNoYm9hcmQtZmlsdGVycycsXG4gIEdldERhdGFTb3VyY2UgPSAnZ2V0LWRhdGFzb3VyY2UnLFxuICBHZXREYXRhU291cmNlRGF0YSA9ICdnZXQtZGF0YXNvdXJjZS1kYXRhJyxcbiAgR2V0RGF0YVNvdXJjZXMgPSAnZ2V0LWRhdGEtc291cmNlcycsXG4gIEdldERhdGFTdW1tYXJ5RGF0YSA9ICdnZXQtc3VtbWFyeS1kYXRhJyxcbiAgR2V0RGF0YVN1bW1hcnlEYXRhUmVhZGVyID0gJ2dldC1zdW1tYXJ5LWRhdGEtcmVhZGVyJyxcbiAgR2V0RGF0YVRhYmxlUmVhZGVyUGFnZSA9ICdnZXQtZGF0YS10YWJsZS1yZWFkZXItcGFnZScsXG4gIEdldEVtYmVkZGluZ0Fic3RyYWN0UXVlcnlXaXRoRGF0YU1vZGVsID0gJ2dldC1lbWJlZGRpbmctYWJzdHJhY3QtcXVlcnktd2l0aC1kYXRhLW1vZGVsJyxcbiAgR2V0RW1iZWRkaW5nQ2xpZW50SW5mbyA9ICdnZXQtZW1iZWRkaW5nLWNsaWVudC1pbmZvJyxcbiAgR2V0Vml6U3RhdGVXaXRoRGF0YU1vZGVsID0gJ2dldC12aXotc3RhdGUtd2l0aC1kYXRhLW1vZGVsJyxcbiAgR2V0RXhwb3J0Q3Jvc3N0YWJTaGVldE1hcCA9ICdnZXQtZXhwb3J0LWNyb3NzdGFiLXNoZWV0LW1hcCcsXG4gIEdldEV4cG9ydFBkZk9wdGlvbnMgPSAnZ2V0LWV4cG9ydC1wZGYtb3B0aW9ucycsXG4gIEdldEZpZWxkID0gJ2dldC1maWVsZCcsXG4gIEdldEZpZWxkQW5kRGF0YVNvdXJjZSA9ICdnZXQtZmllbGQtYW5kLWRhdGFzb3VyY2UnLFxuICBHZXRWaXN1YWxTcGVjaWZpY2F0aW9uID0gJ2dldC12aXN1YWwtc3BlY2lmaWNhdGlvbicsXG4gIEdldEZpbHRlcnMgPSAnZ2V0LWZpbHRlcnMnLFxuICBHZXRGb250cyA9ICdnZXQtZm9udHMnLFxuICBHZXRIaWdobGlnaHRlZE1hcmtzID0gJ2dldC1oaWdobGlnaHRlZC1tYXJrcycsXG4gIEdldEpvaW5EZXNjcmlwdGlvbiA9ICdnZXQtam9pbi1kZXNjcmlwdGlvbicsXG4gIEdldExvZ2ljYWxUYWJsZURhdGEgPSAnZ2V0LWxvZ2ljYWwtdGFibGUtZGF0YScsXG4gIEdldExvZ2ljYWxUYWJsZURhdGFSZWFkZXIgPSAnZ2V0LWxvZ2ljYWwtdGFibGUtZGF0YS1yZWFkZXInLFxuICBHZXRMb2dpY2FsVGFibGVzID0gJ2dldC1sb2dpY2FsLXRhYmxlcycsXG4gIEdldFBhcmFtZXRlcnNGb3JTaGVldCA9ICdnZXQtcGFyYW1ldGVycy1mb3Itc2hlZXQnLFxuICBHZXRQdWxzZUNhdGVnb3JpY2FsRG9tYWluID0gJ2dldC1wdWxzZS1jYXRlZ29yaWNhbC1kb21haW4nLFxuICBHZXRQdWxzZUZpbHRlcnMgPSAnZ2V0LXB1bHNlLWZpbHRlcnMnLFxuICBHZXRQdWxzZVRpbWVEaW1lbnNpb24gPSAnZ2V0LXB1bHNlLXRpbWUtZGltZW5zaW9uJyxcbiAgR2V0UmFuZ2VEb21haW4gPSAnZ2V0LXJhbmdlLWRvbWFpbicsXG4gIEdldFNlbGVjdGVkTWFya3MgPSAnZ2V0LXNlbGVjdGVkLW1hcmtzJyxcbiAgR2V0U2hhcmVkRmlsdGVyID0gJ2dldC1zaGFyZWQtZmlsdGVyJyxcbiAgR2V0VG9vbHRpcFRleHQgPSAnZ2V0LXRvb2x0aXAtdGV4dCcsXG4gIEdldFVuZGVybHlpbmdEYXRhID0gJ2dldC11bmRlcmx5aW5nLWRhdGEnLFxuICBHZXRVbmRlcmx5aW5nVGFibGVEYXRhID0gJ2dldC11bmRlcmx5aW5nLXRhYmxlLWRhdGEnLFxuICBHZXRVbmRlcmx5aW5nVGFibGVEYXRhUmVhZGVyID0gJ2dldC11bmRlcmx5aW5nLXRhYmxlLWRhdGEtcmVhZGVyJyxcbiAgR2V0VW5kZXJseWluZ1RhYmxlcyA9ICdnZXQtdW5kZXJseWluZy10YWJsZXMnLFxuXG4gIEhpZXJhcmNoaWNhbEZpbHRlciA9ICdoaWVyYWNoaWNhbC1maWx0ZXInLFxuXG4gIEluaXRpYWxpemVFeHRlbnNpb24gPSAnaW5pdGlhbGl6ZS1leHRlbnNpb24nLFxuICBJc0FuYWx5dGljc0Fzc2lzdGFudEF2YWlsYWJsZSA9ICdpcy1hbmFseXRpY3MtYXNzaXN0YW50LWF2YWlsYWJsZScsXG5cbiAgTGF1bmNoQW5hbHl0aWNzQXNzaXN0YW50ID0gJ2xhdW5jaC1hbmFseXRpY3MtYXNzaXN0YW50JyxcblxuICBNb3ZlQW5kUmVzaXplWm9uZXMgPSAnbW92ZS1hbmQtcmVzaXplLXpvbmVzJyxcbiAgTW92ZU1hcmtzQ2FyZEZpZWxkID0gJ21vdmUtbWFya3MtY2FyZC1maWVsZCcsXG5cbiAgUmFpc2VMZWF2ZU1hcmtOYXZOb3RpZmljYXRpb24gPSAncmFpc2UtbGVhdmUtbWFyay1uYXYtbm90aWZpY2F0aW9uJyxcbiAgUmFpc2VIb3ZlclR1cGxlTm90aWZpY2F0aW9uID0gJ3JhaXNlLWhvdmVyLXR1cGxlLW5vdGlmaWNhdGlvbicsXG4gIFJhaXNlU2VsZWN0VHVwbGVzTm90aWZpY2F0aW9uID0gJ3JhaXNlLXNlbGVjdC10dXBsZXMtbm90aWZpY2F0aW9uJyxcbiAgUmVkbyA9ICdyZWRvJyxcbiAgUmVmcmVzaERhdGFTb3VyY2UgPSAncmVmcmVzaC1kYXRhLXNvdXJjZScsXG4gIFJlbGVhc2VEYXRhVGFibGVSZWFkZXIgPSAncmVsZWFzZS1kYXRhLXRhYmxlLXJlYWRlcicsXG4gIFJlbW92ZUFubm90YXRpb24gPSAncmVtb3ZlLWFubm90YXRpb24nLFxuICBSZW1vdmVDdXN0b21WaWV3ID0gJ3JlbW92ZS1jdXN0b20tdmlldycsXG4gIFJlbW92ZUV4dGVybmFsTWVudUl0ZW0gPSAncmVtb3ZlLWV4dGVybmFsLW1lbnUtaXRlbScsXG4gIFJlbmFtZUV4dGVybmFsTWVudSA9ICdyZW5hbWUtZXh0ZXJuYWwtbWVudScsXG4gIFJlcGxheUFuaW1hdGlvbiA9ICdyZXBsYXktYW5pbWF0aW9uJyxcbiAgUmV2ZXJ0U3RvcnlQb2ludCA9ICdyZXZlcnQtc3RvcnktcG9pbnQnLFxuICBSZXZlcnRXb3JrYm9vayA9ICdyZXZlcnQtd29ya2Jvb2snLFxuXG4gIFNhdmVFeHRlbnNpb25TZXR0aW5ncyA9ICdzYXZlLWV4dGVuc2lvbi1zZXR0aW5ncycsXG4gIFNhdmVXb3JrYm9va0FzQ3VzdG9tVmlldyA9ICdzYXZlLXdvcmtib29rLWFzLWN1c3RvbS12aWV3JyxcbiAgU2VsZWN0QnlWYWx1ZSA9ICdzZWxlY3QtYnktdmFsdWUnLFxuICBTZXRBY3RpdmVDdXN0b21WaWV3QXNEZWZhdWx0ID0gJ3NldC1hY3RpdmUtY3VzdG9tLXZpZXctYXMtZGVmYXVsdCcsXG4gIFNldEF1dG9VcGRhdGUgPSAnc2V0LWF1dG8tdXBkYXRlJyxcbiAgU2V0Q2xpY2tUaHJvdWdoID0gJ3NldC1jbGljay10aHJvdWdoJyxcbiAgU2VuZERpYWxvZ01lc3NhZ2UgPSAnc2VuZC1kaWFsb2ctbWVzc2FnZScsXG4gIFNldFZpelN0YXRlV2l0aERhdGFNb2RlbCA9ICdzZXQtdml6LXN0YXRlLXdpdGgtZGF0YS1tb2RlbCcsXG4gIFNldFNoZWV0U2l6ZSA9ICdzZXQtc2hlZXQtc2l6ZScsXG4gIFNldFpvbmVWaXNpYmlsaXR5ID0gJ3NldC16b25lLXZpc2liaWxpdHknLFxuICBTaGFyZSA9ICdzaGFyZScsXG4gIFNob3dDdXN0b21WaWV3ID0gJ3Nob3ctY3VzdG9tLXZpZXcnLFxuICBTcGxpY2VNYXJrc0NhcmRGaWVsZHMgPSAnc3BsaWNlLW1hcmtzLWNhcmQtZmllbGRzJyxcblxuICBUZXN0Q29udmVyc2lvblZlcmIgPSAndGVzdC1jb252ZXJzaW9uLXZlcmInLFxuXG4gIFVuZG8gPSAndW5kbycsXG4gIFVwZGF0ZUN1c3RvbVZpZXcgPSAndXBkYXRlLWN1c3RvbS12aWV3JyxcblxuICBWaXpBUEkgPSAndml6LWFwaScsXG59XG4iLCJleHBvcnQgZW51bSBBc2tEYXRhT3B0aW9uTmFtZXMge1xuICB0b2tlbiA9ICd0b2tlbicsXG4gIG9yaWdpbiA9ICdvcmlnaW4nLFxuICBzaG93RW1iZWQgPSAnc2hvd0VtYmVkJyxcbiAgc2hvd1BpbiA9ICdzaG93UGluJyxcbiAgc2hvd1NhdmUgPSAnc2hvd1NhdmUnLFxuICBzaG93U2hhcmUgPSAnc2hvd1NoYXJlJyxcbiAgZGVidWcgPSAnOmpzZGVidWcnLFxuICBBcGlJRCA9ICc6YXBpSUQnLFxuICBBcGlFeHRlcm5hbFZlcnNpb24gPSAnOmFwaUV4dGVybmFsVmVyc2lvbicsXG4gIEFwaUludGVybmFsVmVyc2lvbiA9ICc6YXBpSW50ZXJuYWxWZXJzaW9uJyxcbiAgQXNrRGF0YVdlYkNvbXBvbmVudCA9ICc6YXNrRGF0YVdlYkNvbXBvbmVudCcsXG59XG4iLCJleHBvcnQgZW51bSBQdWxzZU9wdGlvbk5hbWVzIHtcbiAgZW1iZWQgPSAnZW1iZWQnLFxuICB0b2tlbiA9ICd0b2tlbicsXG4gIGRpc2FibGVFeHBsb3JlRmlsdGVyID0gJ2Rpc2FibGVFeHBsb3JlRmlsdGVyJyxcbiAgbGF5b3V0ID0gJ2VtYmVkX2xheW91dCcsXG4gIHRoZW1lID0gJ2VtYmVkX3RoZW1lJyxcbiAgQXBpRXh0ZXJuYWxWZXJzaW9uID0gJzphcGlFeHRlcm5hbFZlcnNpb24nLFxuICBBcGlJbnRlcm5hbFZlcnNpb24gPSAnOmFwaUludGVybmFsVmVyc2lvbicsXG4gIFB1bHNlV2ViQ29tcG9uZW50ID0gJzpwdWxzZVdlYkNvbXBvbmVudCcsXG59XG4iLCIvKipcbiAqIFRoZXNlIHN0cmluZ3Mgd2VyZSAqbWFudWFsbHkgY29waWVkKiBmcm9tIHRoZSBzZXJ2ZXIsXG4gKiB3b3JrZ3JvdXAvc3JjL3NpbG9zL3RhYmxlYXUtc2VydmVyL2xpYnJhcmllcy90YWItY29udHJvbGxlci12aXpxbC9zcmMvY29tL3RhYmxlYXVzb2Z0d2FyZS9cbiAqIGNvbnRyb2xsZXIvdml6cWwvY29uc3RhbnRzL1BhcmFtZXRlcktleXMuamF2YSNMOVxuICogc2hvdWxkIGJlIGV4cG9ydGVkIGluc3RlYWRcbiAqIHBhcmFtZXRlcnMgdGhhdCB2aXpxbCB3aWxsIGFjY2VwdCBpbiBhbiBlbWJlZGRpbmcgVVJMXG4gKiovXG5lbnVtIFZxbFBhcmFtZXRlck5hbWVzIHtcbiAgT05FID0gJzEnLFxuICBBTEVSVFMgPSAnOmFsZXJ0cycsXG4gIEFMSUFTID0gJ2FsaWFzJyxcbiAgQUxMT1dfREVGRVJSRURfQk9PVFNUUkFQID0gJzphbGxvd0RlZmVycmVkQm9vdHN0cmFwJyxcbiAgQUxMT1dfQVVUT0dFTl9XT1JLU0hFRVRfUEhPTkVfTEFZT1VUUyA9ICdhbGxvd0F1dG9nZW5Xb3Jrc2hlZXRQaG9uZUxheW91dHMnLFxuICBBUElfSUQgPSAnOmFwaUlEJyxcbiAgQVBQID0gJzphcHAnLFxuICBBVFRBQ0hNRU5UID0gJ2F0dGFjaG1lbnQnLFxuICBJU19JUEFEX0FQUCA9ICdhcHAnLFxuICBBTklNQVRFX1RSQU5TSVRJT04gPSAnOmFuaW1hdGVfdHJhbnNpdGlvbicsXG4gIEFTQ0VORElORyA9ICdhc2NlbmRpbmcnLFxuICBBVVRIRU5USUNBVElPTiA9ICdhdXRoZW50aWNhdGlvbicsXG4gIEFUVFJJQlVURVMgPSAnYXR0cmlidXRlcycsXG4gIEFVVEhPUklOR19TSEVFVCA9ICc6YXV0aFNoZWV0JyxcbiAgQVhJUyA9ICdheGlzJyxcbiAgQk9PVFNUUkFQX1dIRU5fTk9USUZJRUQgPSAnOmJvb3RzdHJhcFdoZW5Ob3RpZmllZCcsXG4gIEJST1dTRVJfQkFDS19CVVRUT05fVU5ETyA9ICc6YnJvd3NlckJhY2tCdXR0b25VbmRvJyxcbiAgQlJPV1NFUl9SRU5ERVJJTkdfT04gPSAnaXNCcm93c2VyUmVuZGVyaW5nJyxcbiAgQlJPV1NFUl9SRU5ERVJJTkdfVEhSRVNIT0xEID0gJ2Jyb3dzZXJSZW5kZXJpbmdUaHJlc2hvbGQnLFxuICBDSEFSU0VUID0gJ2NoYXJzZXQnLFxuICBDTElFTlRfRElNRU5TSU9OID0gJ2NsaWVudERpbWVuc2lvbicsXG4gIENMSUVOVF9JUCA9ICdjbGllbnRfaXAnLFxuICBDTElFTlRfTlVNID0gJ2NsaWVudE51bScsXG4gIENPTE9OX0VNQkVEREVEID0gJzplbWJlZGRlZCcsXG4gIENPTE9OX01PQklMRSA9ICc6bW9iaWxlJyxcbiAgQ09MT05fREVFUF9MSU5LSU5HX0RJU0FCTEVEID0gJzpkZWVwTGlua2luZ0Rpc2FibGVkJyxcbiAgQ09MT05fV0FURVJNQVJLID0gJzp3YXRlcm1hcmsnLFxuICBDT01NRU5UUyA9ICc6Y29tbWVudHMnLFxuICBDT01NRU5USU5HX0VOQUJMRUQgPSAnOmNvbW1lbnRpbmdFbmFibGVkJyxcbiAgQ09NTUVOVElOR19NRU5USU9OU19FTkFCTEVEID0gJzpjb21tZW50aW5nTWVudGlvbnMnLFxuICBDT05ORUNUSU9OID0gJ2Nvbm5lY3Rpb24nLFxuICBDUkVBVEVEX0JZX0ZFQVRVUkUgPSAnY3JlYXRlZEJ5RmVhdHVyZScsXG4gIENSWVBURURfUEFTU1dPUkQgPSAnY3J5cHRlZCcsXG4gIENTU0RFQlVHID0gJzpjc3NkZWJ1ZycsXG4gIENTViA9ICdjc3YnLFxuICBDVVNUT01fVklFV1MgPSAnOmN1c3RvbVZpZXdzJyxcbiAgQ1YgPSAnOmN2JyxcbiAgQ1ZfSUQgPSAnY3ZJZCcsXG4gIERBU0hCT0FSRF9QT1JUX1NJWkUgPSAnZGFzaGJvYXJkUG9ydFNpemUnLFxuICBEQVRBX0RFVEFJTFMgPSAnOmRhdGFEZXRhaWxzJyxcbiAgREFUQVNPVVJDRSA9ICdkYXRhc291cmNlJyxcbiAgREVCVUcgPSAnOmRlYnVnJyxcbiAgREVMQVkgPSAnOmRlbGF5JyxcbiAgREVQVEggPSAnZGVwdGgnLFxuICBERVZJQ0VfVFlQRSA9ICc6ZGV2aWNlJyxcbiAgREVWSUNFX1BJWEVMX1JBVElPID0gJ2RldmljZVBpeGVsUmF0aW8nLFxuICBERVZJQ0VfUFJFVklFV19NT0RFID0gJzpkZXZpY2VwcmV2aWV3bW9kZScsXG4gIERJTUVOU0lPTlMgPSAnOmRpbWVuc2lvbnMnLFxuICBESVNBQkxFX1NIQVJFRF9TRVNTSU9OUyA9ICc6ZGlzYWJsZV9zaGFyZWRfc2Vzc2lvbnMnLFxuICBESVNBQkxFX1VSTF9BQ1RJT05TX1BPUFVQUyA9ICc6ZGlzYWJsZVVybEFjdGlvbnNQb3B1cHMnLFxuICBESVJFQ1RJT04gPSAnZGlyZWN0aW9uJyxcbiAgRElTUExBWV9PVkVSTEFZID0gJzpkaXNwbGF5X292ZXJsYXknLFxuICBESVNQTEFZX1NIQVJFID0gJzpkaXNwbGF5X3NoYXJlJyxcbiAgRElTUExBWV9TUElOTkVSID0gJzpkaXNwbGF5X3NwaW5uZXInLFxuICBESVNQTEFZX1NUQVRJQ19JTUFHRSA9ICc6ZGlzcGxheV9zdGF0aWNfaW1hZ2UnLFxuICBESVNQTEFZX1RBQlMgPSAnZGlzcGxheV90YWJzJyxcbiAgRElTUExBWV9WSUVXX0NPVU5UID0gJzpkaXNwbGF5X2NvdW50JyxcbiAgSUdOT1JFX1NUSUNLWV9TRVNTSU9OID0gJzppZ25vcmVfc3RpY2t5X3Nlc3Npb24nLFxuICBJTkNSRU1FTlRfVklFV19DT1VOVCA9ICc6aW5jcmVtZW50X3ZpZXdfY291bnQnLFxuICBET0NNT0RFID0gJ2RvY21vZGUnLFxuICBET01BSU4gPSAnZG9tYWluJyxcbiAgRE9fV09SSyA9ICdkb193b3JrJyxcbiAgRFggPSAnZHgnLFxuICBEWSA9ICdkeScsXG4gIEVESVRfREFUQV9BTEVSVCA9ICc6ZWRpdERhdGFBbGVydCcsXG4gIEVNQkVEID0gJzplbWJlZCcsXG4gIEVNQkVEREVEID0gJ2VtYmVkZGVkJyxcbiAgRU5DUllQVEVEID0gJ2VuY3J5cHRlZCcsXG4gIEFQSV9FWFRFUk5BTF9WRVJTSU9OID0gJzphcGlFeHRlcm5hbFZlcnNpb24nLFxuICBBUElfSU5URVJOQUxfVkVSU0lPTiA9ICc6YXBpSW50ZXJuYWxWZXJzaW9uJyxcbiAgRVhDTFVERSA9ICdleGNsdWRlJyxcbiAgRVhQT1JUX0ZPUk1BVCA9ICc6ZXhwb3J0X2Zvcm1hdCcsXG4gIEZJRUxETkFNRSA9ICdmaWVsZG5hbWUnLFxuICBGSUVMRF9OQU1FID0gJ2ZpZWxkX25hbWUnLFxuICBGSUVMRF9TRVAgPSAnZmllbGRfc2VwJyxcbiAgRklMRSA9ICdmaWxlJyxcbiAgRklMVEVSX1RJTEVfU0laRSA9ICdmaWx0ZXJUaWxlU2l6ZScsXG4gIEZOID0gJ2ZuJyxcbiAgRk9DVVMgPSAnZm9jdXMnLFxuICBGT1JDRV9DQUNIRSA9ICdmb3JjZV9jYWNoZScsXG4gIEZPUk1BVCA9ICdmb3JtYXQnLFxuICBGT1JNQVRfREFUQV9WQUxVRV9MT0NBTExZID0gJ2Zvcm1hdERhdGFWYWx1ZUxvY2FsbHknLFxuICBGUk9NX1dHID0gJzpmcm9tX3dnJyxcbiAgR1JBUEhRTF9EQVRBQkFTRV9JRCA9ICc6Z3JhcGhRTERhdGFiYXNlSWQnLFxuICBHUkFQSFFMX1RBQkxFX0lEID0gJzpncmFwaFFMVGFibGVJZCcsXG4gIEdVSUQgPSAnOmd1aWQnLFxuICBIID0gJ2gnLFxuICBISURERU4gPSAnaGlkZGVuJyxcbiAgSElERV9DTE9TRV9CVVRUT04gPSAnOmhpZGVDbG9zZUJ1dHRvbicsXG4gIEhJREVfRURJVF9CVVRUT04gPSAnOmhpZGVFZGl0QnV0dG9uJyxcbiAgSElERV9FRElUX0lOX0RFU0tUT1BfQlVUVE9OID0gJzpoaWRlRWRpdEluRGVza3RvcEJ1dHRvbicsXG4gIEhJR0hfRFBJID0gJzpoaWdoZHBpJyxcbiAgSU1BR0VfU0laRV9MSU1JVCA9ICdpbWFnZVNpemVMaW1pdCcsXG4gIFRSQU5TUEFSRU5UX0xJTkVfTUFSS1NfTElNSVQgPSAndHJhbnNwYXJlbnRMaW5lTWFya0xpbWl0JyxcbiAgQ0xJRU5UX1JFTkRFUl9QSVhFTF9MSU1JVCA9ICdjbGllbnRSZW5kZXJQaXhlbExpbWl0JyxcbiAgSU4gPSAnaW4nLFxuICBJTlNUQU5DRV9JRCA9ICc6aWlkJyxcbiAgSVNfR1VFU1RfUkVESVJFQ1RfRlJPTV9WSVpQT1JUQUwgPSAnOmlzR3Vlc3RSZWRpcmVjdEZyb21WaXpwb3J0YWwnLFxuICBJU19NQVJLX0FOSU1BVElPTl9FTkFCTEVEID0gJ2lzTWFya0FuaW1hdGlvbkVuYWJsZWQnLFxuICBJU19WSVpQT1JUQUwgPSAnOmlzVml6UG9ydGFsJyxcbiAgSU5QVVRfID0gJ2lucHV0X3N0cmluZycsXG4gIEpTREVCVUcgPSAnOmpzZGVidWcnLFxuICBKU09OID0gJ2pzb24nLFxuICBKU09OX09OTFkgPSAnOmpzb25Pbmx5JyxcbiAgS0VFUEZJTEUgPSAna2VlcGZpbGUnLFxuICBLRVkgPSAna2V5JyxcbiAgTEFOR1VBR0UgPSAnbGFuZ3VhZ2UnLFxuICBMQU5HVUFHRV9SRVFVRVNURUQgPSAnOmxhbmd1YWdlJyxcbiAgTElOS1RBUkdFVCA9ICc6bGlua3RhcmdldCcsXG4gIExPQURfT1JERVJfSUQgPSAnOmxvYWRPcmRlcklEJywgLy8gdXNlZCBmb3IgUHVibGljXG4gIExPQURfTkVXRVNUX1JFVklTSU9OID0gJzpsb2FkTmV3ZXN0UmV2aXNpb24nLFxuICBMT0NBTF9QQVRIUyA9ICc6bG9jYWxQYXRocycsXG4gIExPQ0FMRSA9ICdsb2NhbGUnLFxuICBMT0NBVElPTl9JRCA9ICdsb2NhdGlvbmlkJyxcbiAgTE9DQVRJT05fVFlQRSA9ICdsb2NhdGlvbnR5cGUnLFxuICBXT1JLQk9PS19MT0NBTEUgPSAnd29ya2Jvb2tMb2NhbGUnLFxuICBNQVhST1dTID0gJ21heHJvd3MnLFxuICBNQVhfQUdFID0gJ21heEFnZScsXG4gIE1BWF9ST1dTID0gJ21heFJvd3MnLFxuICBNRVRIT0QgPSAnbWV0aG9kJyxcbiAgTU9CSUxFID0gJ21vYmlsZScsXG4gIE1PRElGSUVSID0gJ21vZGlmaWVyJyxcbiAgTkFNRSA9ICduYW1lJyxcbiAgTkFWX1RZUEUgPSAnbmF2VHlwZScsXG4gIE5BVl9TUkMgPSAnbmF2U3JjJyxcbiAgTk9BVFRBQ0hNRU5UID0gJ25vLWF0dGFjaG1lbnQnLFxuICBOT19PVkVSV1JJVEUgPSAnbm9fb3ZlcndyaXRlJyxcbiAgT1BFTl9BVVRIT1JJTkdfSU5fVE9QX1dJTkRPVyA9ICc6b3BlbkF1dGhvcmluZ0luVG9wV2luZG93JyxcbiAgT1BFTklEX0hEID0gJzpvcGVuaWRfaGQnLFxuICBPUEVOSURfTE9HSU5fSElOVCA9ICc6b3BlbmlkX2xvZ2luX2hpbnQnLFxuICBPQVVUSFJFUVVFU1QgPSAnb2F1dGhyZXF1ZXN0JyxcbiAgT0FVVEhfQ1JFREVOVElBTF9JRFMgPSAnb2F1dGhfY3JlZGVudGlhbF9pZHMnLFxuICBPRkZMSU5FX01PREUgPSAnOm9mZmxpbmVtb2RlJyxcbiAgT1JJR0lOID0gJzpvcmlnaW4nLFxuICBPVkVSTEFZID0gJzpvdmVybGF5JyxcbiAgUCA9ICdwJyxcbiAgUEFUSCA9ICdwYXRoJyxcbiAgUEFORV9SRVNPTFZFUl9YID0gJ3BhbmVSZXNvbHZlclgnLFxuICBQQU5FX1JFU09MVkVSX1kgPSAncGFuZVJlc29sdmVyWScsXG4gIFBBUkFNID0gJ3BhcmFtJyxcbiAgUEFSRU5UX0lEID0gJ3BhcmVudF9pZCcsXG4gIFBBU1NXT1JEID0gJ3Bhc3N3b3JkJyxcbiAgUEFUVEVSTiA9ICdwYXR0ZXJuJyxcbiAgUElYRUxfUkFUSU8gPSAnOnBpeGVscmF0aW8nLFxuICBQUkVGSVggPSAnOnByZWZpeCcsXG4gIFBSRVZJRVcgPSAnOnByZXZpZXcnLFxuICBQUklNQVJZX0NPTlRFTlRfVVJMID0gJ3ByaW1hcnlfY29udGVudF91cmwnLFxuICBQUk9KRUNUID0gJ3Byb2plY3QnLFxuICBQUk9UT0NPTCA9ICdwcm90b2NvbCcsXG4gIFBTRVVETyA9ICc6cHNldWRvJyxcbiAgUVVFUlkgPSAncXVlcnknLFxuICBSID0gJ3InLFxuICBSQU5HRV9UWVBFID0gJ3JhbmdlX3R5cGUnLFxuICBSRUNPUkRfU0VQID0gJ3JlY29yZF9zZXAnLFxuICBSRUNPUkRfQ0xJRU5UX1BFUkZPUk1BTkNFID0gJzpyZWNvcmRfY2xpZW50X3BlcmZvcm1hbmNlJyxcbiAgUkVDT1JEX1BFUkZPUk1BTkNFID0gJzpyZWNvcmRfcGVyZm9ybWFuY2UnLFxuICBSRUNPVkVSX09MRF9TRVNTSU9OX0lEID0gJzpyZWNvdmVyX29sZF9zZXNzaW9uX2lkJyxcbiAgUkVDT1ZFUl9TRVNTSU9OX1NUQVRFX1RJQ0tFVFMgPSAnOnJlY292ZXJfc2Vzc2lvbl9zdGF0ZV90aWNrZXRzJyxcbiAgUkVGUkVTSCA9ICc6cmVmcmVzaCcsXG4gIFJFRlJFU0hVTk1PRElGSUVEID0gJzpyZWZyZXNodW5tb2RpZmllZCcsXG4gIFJFR0lPTiA9ICdyZWdpb24nLFxuICBSRUxPQURfT05fQ1VTVE9NX1ZJRVdfU0FWRSA9ICc6cmVsb2FkT25DdXN0b21WaWV3U2F2ZScsXG4gIFJFTkRFUiA9ICc6cmVuZGVyJyxcbiAgUkVOREVSX01BUFNfQ0xJRU5UX1NJREUgPSAncmVuZGVyTWFwc0NsaWVudFNpZGUnLFxuICBSRVRSWSA9ICc6cmV0cnknLFxuICBSRVVTRSA9ICdyZXVzZScsXG4gIFJFVVNFX0ZPUkVWRVIgPSAncmV1c2VfZm9yZXZlcicsXG4gIFJFVkVSVCA9ICc6cmV2ZXJ0JyxcbiAgU0FWRV9EQl9QQVNTV09SRFMgPSAnc2F2ZV9kYl9wYXNzd29yZHMnLFxuICBTRUxFQ1RfWCA9ICdzZWxlY3RfeCcsXG4gIFNFTEVDVF9ZID0gJ3NlbGVjdF95JyxcbiAgU0VTU0lPTl9GRUFUVVJFX1BSRUZJWCA9ICc6ZmZfJyxcbiAgU0VTU0lPTl9GTEFHUyA9ICc6c2Vzc2lvbl9mZWF0dXJlX2ZsYWdzJyxcbiAgU0hBUkVfQlVUVE9OID0gJ3NoYXJlX2J1dHRvbicsXG4gIFNIRUVUX0lEID0gJ3NoZWV0X2lkJyxcbiAgU0hBUkVEID0gJ3NoYXJlZCcsXG4gIFNIT1dBTEwgPSAnc2hvd2FsbCcsXG4gIFNIT1dfQVBQX0JBTk5FUiA9ICc6c2hvd0FwcEJhbm5lcicsXG4gIFNIT1dfQVNLX0RBVEEgPSAnOnNob3dBc2tEYXRhJyxcbiAgU0hPV19QQVJBTVMgPSAnc2hvd1BhcmFtcycsXG4gIFNIT1dfU0hBUkVfT1BUSU9OUyA9ICc6c2hvd1NoYXJlT3B0aW9ucycsXG4gIFNJWkUgPSAnOnNpemUnLFxuICBTT1VSQ0UgPSAnc291cmNlJyxcbiAgU1RBVEUgPSAnc3RhdGUnLFxuICBTVElDS1lfU0VTU0lPTl9LRVkgPSAnc3RpY2t5U2Vzc2lvbktleScsXG4gIFNVQlNDUklQVElPTlMgPSAnOnN1YnNjcmlwdGlvbnMnLFxuICBTVU1NQVJZID0gJ3N1bW1hcnknLFxuICBTVVBQUkVTU19ERUZBVUxUX0VESVRfQkVIQVZJT1IgPSAnOnN1cHByZXNzRGVmYXVsdEVkaXRCZWhhdmlvcicsXG4gIFNZTkNfU0VTU0lPTiA9ICc6c3luY19zZXNzaW9uJyxcbiAgU1lOQ19TRVNTSU9OX1NUQVRFID0gJ3N5bmNfc2Vzc2lvbl9zdGF0ZScsXG4gIFRBQlMgPSAnOnRhYnMnLFxuICBUQVJHRVQgPSAndGFyZ2V0JyxcbiAgVEFSR0VUX1NJVEUgPSAndGFyZ2V0X3NpdGUnLFxuICBUT09MQkFSID0gJzp0b29sYmFyJyxcbiAgVE9PTFRJUCA9ICc6dG9vbHRpcCcsXG4gIFRTID0gJ3RzJyxcbiAgVU5ERVJMWUlOR19UQUJMRV9JRCA9ICd1bmRlcmx5aW5nX3RhYmxlX2lkJyxcbiAgVU5ERVJMWUlOR19UQUJMRV9DQVBUSU9OID0gJ3VuZGVybHlpbmdfdGFibGVfY2FwdGlvbicsXG4gIFVQREFURV9UWVBFID0gJ3VwZGF0ZV90eXBlJyxcbiAgVVNFX0dVRVNUID0gJzp1c2VHdWVzdCcsXG4gIFVTRV9JTkxJTkVfSU1BR0VTID0gJ3VzZV9pbmxpbmVfaW1hZ2VzJyxcbiAgVVNFUkFHRU5UID0gJ3VzZXJhZ2VudCcsXG4gIFVTRVJOQU1FID0gJ3VzZXJuYW1lJyxcbiAgVkFMVUUgPSAndmFsdWUnLFxuICBWRVJCT1NFX01PREUgPSAndmVyYm9zZU1vZGUnLFxuICBWSUVXX0lEID0gJ3ZpZXdzX2lkJyxcbiAgVklaX1NOQVBTSE9UX0lEID0gJ3Zpel9zbmFwc2hvdF9pZCcsXG4gIFZXID0gJzp2dycsXG4gIFcgPSAndycsXG4gIFdPUktTSEVFVF9QT1JUX1NJWkUgPSAnd29ya3NoZWV0UG9ydFNpemUnLFxuICBXQVRFUk1BUksgPSAnd2F0ZXJtYXJrJyxcbiAgV0FURVJNQVJLX01BUkdJTiA9ICc6d2F0ZXJtYXJrX21hcmdpbicsXG4gIFdCID0gJzp3YicsXG4gIFdISUNIID0gJ3doaWNoJyxcbiAgWCA9ICd4JyxcbiAgWSA9ICd5JyxcbiAgWklEID0gJ3ppZCcsXG4gIFpPTkVfSUQgPSAnem9uZV9pZCcsXG4gIEtFWUNIQUlOX1ZFUlNJT04gPSAna2V5Y2hhaW5fdmVyc2lvbicsXG4gIERBVEFTT1VSQ0VfSUQgPSAnZGF0YXNvdXJjZV9pZCcsXG4gIERBVEFTT1VSQ0VfTkFNRSA9ICdkYXRhc291cmNlX25hbWUnLFxuICBMRU5TX0lEID0gJ2xlbnNfaWQnLFxuICBXSURUSCA9ICd3aWR0aCcsXG4gIEhFSUdIVCA9ICdoZWlnaHQnLFxuXG4gIC8vIERlZmF1bHQgTGF5b3V0IHBhcmFtc1xuICBMQVlPVVRfVklFV1MgPSAndmlld3MnLFxuICBMQVlPVVRfTUVOVVMgPSAnbWVudXMnLFxuICBMQVlPVVRfR0VPTUVUUlkgPSAnZ2VvbWV0cnknLFxuICBMQVlPVVRfUEFHRVMgPSAncGFnZXMnLFxuICBMQVlPVVRfQ0FDSEVVUkwgPSAnY2FjaGV1cmwnLFxuICBMQVlPVVRfU0hFRVQgPSAnc2hlZXQnLFxuICBMQVlPVVRfREVQVEggPSAnZGVwdGgnLFxufVxuXG4vKipcbiAqIHBhcmFtZXRlcnMgdGhhdCBhcmUgb25seSByZWxldmFudCB3aGVuIHdvcmtpbmcgd2l0aCBUYWJsZWF1IFB1YmxpY1xuICogbWF5YmUgbm90IHJlYWxseSBuZWNlc3NyeSB0byBzcGxpdCB0aGVtIG91dFxuICovXG5lbnVtIFB1YmxpY1BhcmFtZXRlck5hbWVzIHtcbiAgU0hPV19WSVpfSE9NRSA9ICc6c2hvd1ZpekhvbWUnLFxuICAvLyBkaXNwbGF5IHZpZXcgY291bnRcbn1cblxuLyoqXG4gKiBNYXAgdGhlIHBhcmFtZXRlciBuYW1lcyBhcyB1c2VkIGluIHRoZSB1cmwgdG8gd2hhdCB3ZSBjYWxsIHRoZW0gcHVibGljbHkgaW4gdGhlIGVtYmVkZGluZyBsaWJyYXJ5LlxuICogVGhlIG9ubHkgcGFyYW1ldGVycyBsaXN0ZWQgaGVyZSBzaG91bGQgYmUgdGhlIG9uZXMgdGhhdCBnZXQgc2VudCB0byB2aXpxbFxuICogIC0gdGhpcyBzaG91bGQgbWF0Y2ggdGhlIGludGVyZmFjZSBhdCBleHRlcm5hbC1jb250cmFjdDpWaXpJbnRlcmZhY2VzOlZpelNldHRpbmdzXG4gKi9cbmV4cG9ydCBlbnVtIFZpek9wdGlvbk5hbWVzIHtcbiAgLy8gcHVibGljTmFtZSA9IGludGVybmFsU3RyaW5nVmFsdWVcbiAgU2l6ZSA9IFZxbFBhcmFtZXRlck5hbWVzLlNJWkUsXG4gIEVtYmVkID0gVnFsUGFyYW1ldGVyTmFtZXMuRU1CRUQsXG4gIEFwaUludGVybmFsVmVyc2lvbiA9IFZxbFBhcmFtZXRlck5hbWVzLkFQSV9JTlRFUk5BTF9WRVJTSU9OLFxuICBBcGlFeHRlcm5hbFZlcnNpb24gPSBWcWxQYXJhbWV0ZXJOYW1lcy5BUElfRVhURVJOQUxfVkVSU0lPTixcbiAgU2hvd1ZpekhvbWUgPSBQdWJsaWNQYXJhbWV0ZXJOYW1lcy5TSE9XX1ZJWl9IT01FLFxuICBKc2RlYnVnID0gVnFsUGFyYW1ldGVyTmFtZXMuSlNERUJVRyxcbiAgQm9vdHN0cmFwV2hlbk5vdGlmaWVkID0gVnFsUGFyYW1ldGVyTmFtZXMuQk9PVFNUUkFQX1dIRU5fTk9USUZJRUQsXG4gIE5hdlR5cGUgPSBWcWxQYXJhbWV0ZXJOYW1lcy5OQVZfVFlQRSxcbiAgTmF2U3JjID0gVnFsUGFyYW1ldGVyTmFtZXMuTkFWX1NSQyxcbiAgZGVidWcgPSBWcWxQYXJhbWV0ZXJOYW1lcy5KU0RFQlVHLFxuICBBcGlJRCA9IFZxbFBhcmFtZXRlck5hbWVzLkFQSV9JRCxcblxuICBkaXNhYmxlVXJsQWN0aW9uc1BvcHVwcyA9IFZxbFBhcmFtZXRlck5hbWVzLkRJU0FCTEVfVVJMX0FDVElPTlNfUE9QVVBTLFxuICBoaWRlVGFicyA9IFZxbFBhcmFtZXRlck5hbWVzLlRBQlMsXG4gIHRvb2xiYXIgPSBWcWxQYXJhbWV0ZXJOYW1lcy5UT09MQkFSLFxuICBkZXZpY2UgPSBWcWxQYXJhbWV0ZXJOYW1lcy5ERVZJQ0VfVFlQRSxcbiAgaW5zdGFuY2VJZFRvQ2xvbmUgPSBWcWxQYXJhbWV0ZXJOYW1lcy5JTlNUQU5DRV9JRCxcbiAgdG91Y2hPcHRpbWl6ZSA9IFZxbFBhcmFtZXRlck5hbWVzLk1PQklMRSxcbiAgaGlkZUVkaXRCdXR0b24gPSBWcWxQYXJhbWV0ZXJOYW1lcy5ISURFX0VESVRfQlVUVE9OLFxuICBoaWRlRWRpdEluRGVza3RvcEJ1dHRvbiA9IFZxbFBhcmFtZXRlck5hbWVzLkhJREVfRURJVF9JTl9ERVNLVE9QX0JVVFRPTixcbiAgc3VwcHJlc3NEZWZhdWx0RWRpdEJlaGF2aW9yID0gVnFsUGFyYW1ldGVyTmFtZXMuU1VQUFJFU1NfREVGQVVMVF9FRElUX0JFSEFWSU9SLFxuICBoaWRlQ2xvc2VCdXR0b24gPSBWcWxQYXJhbWV0ZXJOYW1lcy5ISURFX0NMT1NFX0JVVFRPTixcbn1cbiIsImltcG9ydCAqIGFzIGd1aWQgZnJvbSAnZ3VpZCc7XG5pbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgSU5URVJOQUxfQ09OVFJBQ1RfVkVSU0lPTiwgTW9kZWwsIE5vdGlmaWNhdGlvbklkLCBWZXJiSWQsIFZlcnNpb25OdW1iZXIgfSBmcm9tICcuLi9Kc0FwaUludGVybmFsQ29udHJhY3QnO1xuaW1wb3J0IHsgSW5pdGlhbGl6YXRpb25PcHRpb25zIH0gZnJvbSAnLi4vaW50ZXJmYWNlL0luaXRpYWxpemF0aW9uT3B0aW9ucyc7XG5pbXBvcnQgeyBDcm9zc0ZyYW1lUHJlcGFyZWRNZXNzYWdlIH0gZnJvbSAnLi9Dcm9zc0ZyYW1lUHJlcGFyZWRNZXNzYWdlJztcbmltcG9ydCB7XG4gIGlzQ29tbWFuZE1lc3NhZ2UsXG4gIGlzQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSxcbiAgaXNIYW5kc2hha2VNZXNzYWdlLFxuICBpc0luaXRNZXNzYWdlLFxuICBpc01lc3NhZ2UsXG4gIGlzTm90aWZpY2F0aW9uTWVzc2FnZSxcbn0gZnJvbSAnLi9NZXNzYWdlVHlwZUNoZWNrcyc7XG5pbXBvcnQge1xuICBDb21tYW5kTWVzc2FnZUhhbmRsZXIsXG4gIENvbW1hbmRSZXNwb25zZU1lc3NhZ2VIYW5kbGVyLFxuICBIYW5kc2hha2VNZXNzYWdlSGFuZGxlcixcbiAgSW5pdGlhbGl6ZU1lc3NhZ2VIYW5kbGVyLFxuICBOb3RpZmljYXRpb25NZXNzYWdlSGFuZGxlcixcbn0gZnJvbSAnLi9pbnRlcmZhY2UvTWVzc2FnZUxpc3RlbmVyJztcbmltcG9ydCB7XG4gIENvbW1hbmRNZXNzYWdlLFxuICBDb21tYW5kUmVzcG9uc2VNZXNzYWdlLFxuICBIYW5kc2hha2VNZXNzYWdlLFxuICBJbml0aWFsaXplTWVzc2FnZSxcbiAgTWVzc2FnZSxcbiAgTWVzc2FnZVR5cGUsXG4gIE5vdGlmaWNhdGlvbk1lc3NhZ2UsXG59IGZyb20gJy4vaW50ZXJmYWNlL01lc3NhZ2VUeXBlcyc7XG5pbXBvcnQgeyBNZXNzZW5nZXIgfSBmcm9tICcuL2ludGVyZmFjZS9NZXNzZW5nZXInO1xuaW1wb3J0IHsgUHJlcGFyZWRNZXNzYWdlIH0gZnJvbSAnLi9pbnRlcmZhY2UvUHJlcGFyZWRNZXNzYWdlJztcblxuLyoqXG4gKiBUaGUgQ3Jvc3NGcmFtZU1lc3NlbmdlciBpcyB0aGUgcHJpbWFyeSBleHBvcnQgZnJvbSB0aGUgYXBpLW1lc3NhZ2luZyBtb2R1bGUuIEFuIGluc3RhbmNlIG9mXG4gKiB0aGlzIGNsYXNzIGNhbiBiZSBpbnN0YW50aWF0ZWQgb24gYm90aCBzaWRlcyBvZiBhIGZyYW1lIGJvdW5kYXJ5IHRvIGZhY2lsaXRhdGUgY29tbXVuaWNhdGlvblxuICogaW4gYm90aCBkaXJlY3Rpb25zIGJldHdlZW4gdGhlIGZyYW1lcy4gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGJvdGggdGhlIGRpc3BhdGNoZXIgYW5kIHRoZSBsaXN0ZW5lclxuICogcG9ydGlvbnMsIGJ1dCBkb2Vzbid0IHJlcXVpcmUgY2FsbGVycyB0byBjYXJlIGFib3V0IGJvdGguXG4gKi9cbmV4cG9ydCBjbGFzcyBDcm9zc0ZyYW1lTWVzc2VuZ2VyIGltcGxlbWVudHMgTWVzc2VuZ2VyIHtcbiAgcHJpdmF0ZSB1bnJlZ2lzdGVyRnVuY3Rpb24/OiAoKSA9PiB2b2lkO1xuICBwcml2YXRlIGluaXRpYWxpemVNZXNzYWdlSGFuZGxlcj86IEluaXRpYWxpemVNZXNzYWdlSGFuZGxlcjtcbiAgcHJpdmF0ZSBjb21tYW5kUmVzcG9uc2VNZXNzYWdlSGFuZGxlcj86IENvbW1hbmRSZXNwb25zZU1lc3NhZ2VIYW5kbGVyO1xuICBwcml2YXRlIGNvbW1hbmRNZXNzYWdlSGFuZGxlcj86IENvbW1hbmRNZXNzYWdlSGFuZGxlcjtcbiAgcHJpdmF0ZSBub3RpZmljYXRpb25NZXNzYWdlSGFuZGxlcj86IE5vdGlmaWNhdGlvbk1lc3NhZ2VIYW5kbGVyO1xuICBwcml2YXRlIGhhbmRzaGFrZU1lc3NhZ2VIYW5kbGVyPzogSGFuZHNoYWtlTWVzc2FnZUhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgQ3Jvc3NGcmFtZU1lc3Nlbmdlci4gSWYgeW91IHdvdWxkIGxpa2UgdG8gdXNlIHRoZSBDcm9zc0ZyYW1lTWVzc2VuZ2VyIGFzIGEgTWVzc2FnZUxpc3RlbmVyLFxuICAgKiBiZSBzdXJlIHRvIGNhbGwgU3RhcnRMaXN0ZW5pbmcgYW5kIHJlZ2lzdGVyIG1lc3NhZ2UgaGFuZGxlcnMuXG4gICAqIEBwYXJhbSB0aGlzV2luZG93IFRoZSB3aW5kb3cgb2JqZWN0IHdoaWNoIHRoZSBDcm9zc0ZyYW1lTWVzc2VuZ2VyIGxpdmVzLiBBbiBvbk1lc3NhZ2UgbGlzdGVuZXIgd2lsbCBiZSBhZGRlZCBoZXJlLlxuICAgKiBAcGFyYW0gW290aGVyV2luZG93XSBPcHRpb25hbCBvdGhlcldpbmRvdyB3aGljaCBtZXNzYWdlcyB3aWxsIGJlIHBvc3RlZCB0by5cbiAgICogICAgICAgICAgICAgICAgICAgICAgSWYgZGVmaW5lZCwgaW5jb21pbmcgbWVzc2FnZXMgbXVzdCBvcmlnaW5hdGUgZnJvbSBvdGhlcldpbmRvdyB0byBiZSBwYXNzZWQgb25cbiAgICogQHBhcmFtIFtvdGhlcldpbmRvd09yaWdpbl0gVGhlIHRhcmdldCBvcmlnaW4gd2hpY2ggb3RoZXJXaW5kb3cgbXVzdCBoYXZlIGluIG9yZGVyIHRvIHJlY2VpdmUgZGlzcGF0Y2hlZCBtZXNzYWdlcy5cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyB2YWx1ZSB3aWxsIGJlIHNlbnQgYXMgdGhlIHRhcmdldE9yaWdpbiBvZiBhIHBvc3RNZXNzYWdlXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIChodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2luZG93L3Bvc3RNZXNzYWdlKVxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgdGhpc1dpbmRvdzogV2luZG93LCBwcml2YXRlIG90aGVyV2luZG93PzogV2luZG93LCBwcml2YXRlIG90aGVyV2luZG93T3JpZ2luPzogc3RyaW5nKSB7XG4gICAgLy8gTWFrZSBzdXJlIHRvIGNhbGwgU3RhcnRMaXN0ZW5pbmdcbiAgfVxuXG4gIC8vLy8vIE1lc3NhZ2VMaXN0ZW5lciBJbXBsZW1lbnRhdGlvblxuXG4gIHB1YmxpYyBzdGFydExpc3RlbmluZygpOiB2b2lkIHtcbiAgICAvLyBDaGVjayBpZiB3ZSBhbHJlYWR5IGFyZSBsaXN0ZW5pbmcsIGlmIG5vdCwgaG9vayB1cCBhIG1lc3NhZ2UgbGlzdGVuZXJcbiAgICBpZiAoIXRoaXMudW5yZWdpc3RlckZ1bmN0aW9uKSB7XG4gICAgICBjb25zdCBib3VuZEhhbmRsZXIgPSB0aGlzLm9uTWVzc2FnZVJlY2VpdmVkLmJpbmQodGhpcyk7XG4gICAgICB0aGlzLnRoaXNXaW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGJvdW5kSGFuZGxlciwgdHJ1ZSk7XG4gICAgICB0aGlzLnVucmVnaXN0ZXJGdW5jdGlvbiA9ICgpID0+IHRoaXMudGhpc1dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgYm91bmRIYW5kbGVyLCB0cnVlKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc3RvcExpc3RlbmluZygpOiB2b2lkIHtcbiAgICAvLyBTdG9wIGxpc3RlbmluZyBpZiB3ZSBoYXZlIHN0YXJ0ZWQgbGlzdGVuaW5nXG4gICAgaWYgKHRoaXMudW5yZWdpc3RlckZ1bmN0aW9uKSB7XG4gICAgICB0aGlzLnVucmVnaXN0ZXJGdW5jdGlvbigpO1xuICAgICAgdGhpcy51bnJlZ2lzdGVyRnVuY3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNldEluaXRpYWxpemVNZXNzYWdlSGFuZGxlcihoYW5kbGVyPzogSW5pdGlhbGl6ZU1lc3NhZ2VIYW5kbGVyKTogdm9pZCB7XG4gICAgdGhpcy5pbml0aWFsaXplTWVzc2FnZUhhbmRsZXIgPSBoYW5kbGVyO1xuICB9XG5cbiAgcHVibGljIHNldENvbW1hbmRSZXNwb25zZU1lc3NhZ2VIYW5kbGVyKGhhbmRsZXI/OiBDb21tYW5kUmVzcG9uc2VNZXNzYWdlSGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMuY29tbWFuZFJlc3BvbnNlTWVzc2FnZUhhbmRsZXIgPSBoYW5kbGVyO1xuICB9XG5cbiAgcHVibGljIHNldENvbW1hbmRNZXNzYWdlSGFuZGxlcihoYW5kbGVyPzogQ29tbWFuZE1lc3NhZ2VIYW5kbGVyKTogdm9pZCB7XG4gICAgdGhpcy5jb21tYW5kTWVzc2FnZUhhbmRsZXIgPSBoYW5kbGVyO1xuICB9XG5cbiAgcHVibGljIHNldE5vdGlmaWNhdGlvbk1lc3NhZ2VIYW5kbGVyKGhhbmRsZXI/OiBOb3RpZmljYXRpb25NZXNzYWdlSGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMubm90aWZpY2F0aW9uTWVzc2FnZUhhbmRsZXIgPSBoYW5kbGVyO1xuICB9XG5cbiAgcHVibGljIHNldEhhbmRzaGFrZU1lc3NhZ2VIYW5kbGVyKGhhbmRsZXI/OiBIYW5kc2hha2VNZXNzYWdlSGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMuaGFuZHNoYWtlTWVzc2FnZUhhbmRsZXIgPSBoYW5kbGVyO1xuICB9XG5cbiAgLy8vLy8gTWVzc2FnZURpc3BhdGNoZXIgSW1wbGVtZW50YXRpb25cblxuICAvKipcbiAgICogQHBhcmFtIGFwaVZlcnNpb24gYXBpLWludGVybmFsLWNvbnRyYWN0LWpzIHZlcnNpb24gKGV4cG9ydGVkIGluIEpzQXBpSW50ZXJuYWxDb25udHJhY3QpXG4gICAqIEBwYXJhbSBjcm9zc0ZyYW1lVmVyc2lvbiBjcm9zc2ZyYW1lIG1lc3NhZ2luZyB2ZXJzaW9uIChleHBvcnRlZCBpbiBKc0FwaUludGVybmFsQ29ubnRyYWN0KVxuICAgKiBAcGFyYW0gb3B0aW9ucyBhZGRpdGlvbmFsIG9wdGlvbnMgdGhhdCBjYW4gYmUgcGFzc2VkIGF0IGluaXRpYWxpemF0aW9uIChpbmZvcm1hdGlvbiBhYm91dCB0aGUgdmVyc2lvbiBvZlxuICAgKiAgICAgICAgICAgICAgICBleHRlcm5hbCBiZWluZyB1c2VkIGZvciBleGFtcGxlKVxuICAgKi9cbiAgcHVibGljIHByZXBhcmVJbml0aWFsaXphdGlvbk1lc3NhZ2UoXG4gICAgYXBpVmVyc2lvbjogVmVyc2lvbk51bWJlcixcbiAgICBjcm9zc0ZyYW1lVmVyc2lvbjogVmVyc2lvbk51bWJlcixcbiAgICBvcHRpb25zPzogSW5pdGlhbGl6YXRpb25PcHRpb25zLFxuICApOiBQcmVwYXJlZE1lc3NhZ2Uge1xuICAgIGNvbnN0IG1lc3NhZ2U6IEluaXRpYWxpemVNZXNzYWdlID0ge1xuICAgICAgbXNnR3VpZDogZ3VpZC5yYXcoKSxcbiAgICAgIG1zZ1R5cGU6IE1lc3NhZ2VUeXBlLkluaXRpYWxpemUsXG4gICAgICBjcm9zc0ZyYW1lVmVyc2lvbjogY3Jvc3NGcmFtZVZlcnNpb24sXG4gICAgICBhcGlWZXJzaW9uOiBhcGlWZXJzaW9uLFxuICAgICAgb3B0aW9uczogb3B0aW9ucyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMucHJlcGFyZU1lc3NhZ2UobWVzc2FnZSk7XG4gIH1cblxuICBwdWJsaWMgcHJlcGFyZUNvbW1hbmRNZXNzYWdlKHZlcmJJZDogVmVyYklkLCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyk6IFByZXBhcmVkTWVzc2FnZSB7XG4gICAgY29uc3QgbWVzc2FnZTogQ29tbWFuZE1lc3NhZ2UgPSB7XG4gICAgICBtc2dHdWlkOiBndWlkLnJhdygpLFxuICAgICAgbXNnVHlwZTogTWVzc2FnZVR5cGUuQ29tbWFuZCxcbiAgICAgIHZlcmJJZDogdmVyYklkLFxuICAgICAgcGFyYW1ldGVyczogcGFyYW1ldGVycyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMucHJlcGFyZU1lc3NhZ2UobWVzc2FnZSk7XG4gIH1cblxuICBwdWJsaWMgcHJlcGFyZUNvbW1hbmRSZXNwb25zZU1lc3NhZ2UoY29tbWFuZEd1aWQ6IHN0cmluZywgZGF0YTogTW9kZWwgfCB1bmRlZmluZWQsIGVycm9yOiBNb2RlbCB8IHVuZGVmaW5lZCk6IFByZXBhcmVkTWVzc2FnZSB7XG4gICAgY29uc3QgbWVzc2FnZTogQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSA9IHtcbiAgICAgIG1zZ0d1aWQ6IGd1aWQucmF3KCksXG4gICAgICBtc2dUeXBlOiBNZXNzYWdlVHlwZS5Db21tYW5kUmVzcG9uc2UsXG4gICAgICBjb21tYW5kR3VpZDogY29tbWFuZEd1aWQsXG4gICAgICBkYXRhOiBkYXRhLFxuICAgICAgZXJyb3I6IGVycm9yLFxuICAgIH07XG5cbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIC8vIHN0cmluZ2lmeSBlcnJvciBvYmplY3QgdG8gcmVtb3ZlIHVuc2VyaWFsaXphYmxlIGZpZWxkcyBsaWtlIGZ1bmN0aW9ucyBhbmQgcHJldmVudCBzZXJpYWxpemF0aW9uIGVycm9yc1xuICAgICAgbWVzc2FnZS5lcnJvciA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZXJyb3IpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5wcmVwYXJlTWVzc2FnZShtZXNzYWdlKTtcbiAgfVxuXG4gIHB1YmxpYyBwcmVwYXJlTm90aWZpY2F0aW9uTWVzc2FnZShub3RpZmljYXRpb25JZDogTm90aWZpY2F0aW9uSWQsIGRhdGE6IE1vZGVsKTogUHJlcGFyZWRNZXNzYWdlIHtcbiAgICBjb25zdCBtZXNzYWdlOiBOb3RpZmljYXRpb25NZXNzYWdlID0ge1xuICAgICAgbXNnR3VpZDogZ3VpZC5yYXcoKSxcbiAgICAgIG1zZ1R5cGU6IE1lc3NhZ2VUeXBlLk5vdGlmaWNhdGlvbixcbiAgICAgIG5vdGlmaWNhdGlvbklkOiBub3RpZmljYXRpb25JZCxcbiAgICAgIGRhdGE6IGRhdGEsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLnByZXBhcmVNZXNzYWdlKG1lc3NhZ2UpO1xuICB9XG5cbiAgcHVibGljIHByZXBhcmVBY2tNZXNzYWdlKCk6IFByZXBhcmVkTWVzc2FnZSB7XG4gICAgY29uc3QgbWVzc2FnZTogSGFuZHNoYWtlTWVzc2FnZSA9IHtcbiAgICAgIG1zZ0d1aWQ6IGd1aWQucmF3KCksXG4gICAgICBtc2dUeXBlOiBNZXNzYWdlVHlwZS5BY2ssXG4gICAgICBwbGF0Zm9ybVZlcnNpb246IElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT04sXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLnByZXBhcmVNZXNzYWdlKG1lc3NhZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXBhcmVzIGEgcGVuZGluZyBtZXNzYWdlIGZvciBzZW5kaW5nIGFuZCByZXR1cm5zIHRoZSBwcmVwYXJlZCBtZXNzYWdlXG4gICAqXG4gICAqIEBwYXJhbSBtc2cgVGhlIG1lc3NhZ2UgdG8gYmUgc2VudCB0byB0aGlzLm90aGVyV2luZG93XG4gICAqIEByZXR1cm5zIFRoZSBwcmVwYXJlZCBtZXNzYWdlXG4gICAqL1xuICBwcml2YXRlIHByZXBhcmVNZXNzYWdlKG1zZzogTWVzc2FnZSk6IFByZXBhcmVkTWVzc2FnZSB7XG4gICAgaWYgKCF0aGlzLm90aGVyV2luZG93IHx8ICF0aGlzLm90aGVyV2luZG93T3JpZ2luKSB7XG4gICAgICB0aHJvdyAnT3RoZXIgd2luZG93IG5vdCBpbml0aWFsaXplZCwgY2Fubm90IGRpc3BhdGNoIG1lc3NhZ2VzJztcbiAgICB9XG5cbiAgICBjb25zdCBwcmVwYXJlZE1lc3NhZ2UgPSBuZXcgQ3Jvc3NGcmFtZVByZXBhcmVkTWVzc2FnZShtc2csIHRoaXMub3RoZXJXaW5kb3csIHRoaXMub3RoZXJXaW5kb3dPcmlnaW4pO1xuICAgIHJldHVybiBwcmVwYXJlZE1lc3NhZ2U7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gYSBtZXNzYWdlIGlzIHJlY2VpdmVkLiBEb2VzIHNvbWUgdmFsaWRhdGlvbiBvZiB0aGUgbWVzc2FnZSwgYW5kIHRoZW5cbiAgICogY2FsbHMgYW4gYXBwcm9wcmlhdGUgbWVzc2FnZSBoYW5kbGVyIGlmIG9uZSBpcyBkZWZpbmVkXG4gICAqXG4gICAqIEBwYXJhbSBldmVudCBUaGUgaW5jb21pbmcgTWVzc2FnZUV2ZW50XG4gICAqL1xuICBwcml2YXRlIG9uTWVzc2FnZVJlY2VpdmVkKGV2ZW50OiBNZXNzYWdlRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBJZiB3ZSBoYXZlIGFuIG90aGVyV2luZG93IGRlZmluZWQsIG1ha2Ugc3VyZSB0aGUgbWVzc2FnZSBpcyBjb21pbmcgZnJvbSB0aGVyZVxuICAgIGlmICh0aGlzLm90aGVyV2luZG93ICYmIGV2ZW50LnNvdXJjZSAhPT0gdGhpcy5vdGhlcldpbmRvdykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIERvIHNvbWUgdmFsaWRhdGlvbiBvbiBldmVudC5kYXRhIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgcmVjZWl2ZWQgYSByZWFsIG1lc3NhZ2VcbiAgICBpZiAoIWV2ZW50LmRhdGEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBtZXNzYWdlID0gZXZlbnQuZGF0YTtcbiAgICBpZiAoIWlzTWVzc2FnZShtZXNzYWdlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENoZWNrIHRoZSBkZWNsYXJlZCBtZXNzYWdlIHR5cGUsIHZhbGlkYXRlIHRoZSBtZXNzYWdlLCBhbmQgY2FsbCBhbiBhcHByb3ByaWF0ZSBoYW5kZXIgaWYgb25lIGV4aXN0c1xuICAgIHN3aXRjaCAobWVzc2FnZS5tc2dUeXBlKSB7XG4gICAgICBjYXNlIE1lc3NhZ2VUeXBlLkluaXRpYWxpemU6IHtcbiAgICAgICAgaWYgKCFpc0luaXRNZXNzYWdlKG1lc3NhZ2UpIHx8ICF0aGlzLmluaXRpYWxpemVNZXNzYWdlSGFuZGxlcikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZU1lc3NhZ2VIYW5kbGVyKG1lc3NhZ2UsIGV2ZW50LnNvdXJjZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBNZXNzYWdlVHlwZS5Db21tYW5kUmVzcG9uc2U6IHtcbiAgICAgICAgaWYgKCFpc0NvbW1hbmRSZXNwb25zZU1lc3NhZ2UobWVzc2FnZSkgfHwgIXRoaXMuY29tbWFuZFJlc3BvbnNlTWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbW1hbmRSZXNwb25zZU1lc3NhZ2VIYW5kbGVyKG1lc3NhZ2UsIGV2ZW50LnNvdXJjZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBNZXNzYWdlVHlwZS5Db21tYW5kOiB7XG4gICAgICAgIGlmICghaXNDb21tYW5kTWVzc2FnZShtZXNzYWdlKSB8fCAhdGhpcy5jb21tYW5kTWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbW1hbmRNZXNzYWdlSGFuZGxlcihtZXNzYWdlLCBldmVudC5zb3VyY2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgTWVzc2FnZVR5cGUuTm90aWZpY2F0aW9uOiB7XG4gICAgICAgIGlmICghaXNOb3RpZmljYXRpb25NZXNzYWdlKG1lc3NhZ2UpIHx8ICF0aGlzLm5vdGlmaWNhdGlvbk1lc3NhZ2VIYW5kbGVyKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb25NZXNzYWdlSGFuZGxlcihtZXNzYWdlLCBldmVudC5zb3VyY2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgTWVzc2FnZVR5cGUuSGFuZHNoYWtlOiB7XG4gICAgICAgIGlmICghaXNIYW5kc2hha2VNZXNzYWdlKG1lc3NhZ2UpIHx8ICF0aGlzLmhhbmRzaGFrZU1lc3NhZ2VIYW5kbGVyKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5oYW5kc2hha2VNZXNzYWdlSGFuZGxlcihtZXNzYWdlLCBldmVudC5zb3VyY2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAvLyBKdXN0IGlnbm9yZSB0aGlzIHNpbmNlIHdlIGRvbid0IGtub3cgaG93IHRvIGhhbmRsZSB0aGUgbWVzc2FnZSB0eXBlXG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNldE90aGVyV2luZG93KG90aGVyV2luZG93OiBXaW5kb3cpOiB2b2lkIHtcbiAgICB0aGlzLm90aGVyV2luZG93ID0gb3RoZXJXaW5kb3c7XG4gIH1cblxuICBwdWJsaWMgc2V0T3RoZXJXaW5kb3dPcmlnaW4ob3JpZ2luOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm90aGVyV2luZG93T3JpZ2luID0gb3JpZ2luO1xuICB9XG59XG4iLCJpbXBvcnQgeyBNZXNzYWdlIH0gZnJvbSAnLi9pbnRlcmZhY2UvTWVzc2FnZVR5cGVzJztcbmltcG9ydCB7IFByZXBhcmVkTWVzc2FnZSB9IGZyb20gJy4vaW50ZXJmYWNlL1ByZXBhcmVkTWVzc2FnZSc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFByZXBhcmVkTWVzc2FnZSBpbnRlcmZhY2UgdXNlZCB0byBwb3N0IG1lc3NhZ2VzIGJldHdlZW5cbiAqIHR3byBmcmFtZXMgdXNpbmcgd2luZG93LnBvc3RNZXNzYWdlXG4gKi9cbmV4cG9ydCBjbGFzcyBDcm9zc0ZyYW1lUHJlcGFyZWRNZXNzYWdlIGltcGxlbWVudHMgUHJlcGFyZWRNZXNzYWdlIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgQ3Jvc3NGcmFtZVByZXBhcmVkTWVzc2FnZS5cbiAgICogQHBhcmFtIF9tZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGJlIHNlbnRcbiAgICogQHBhcmFtIF90YXJnZXQgVGhlIHRhcmdldCB3aW5kb3cgd2hlcmUgdGhlIG1lc3NhZ2Ugd2lsbCBiZSBzZW50XG4gICAqIEBwYXJhbSBfb3JpZ2luIFRoZSB0YXJnZXRPcmlnaW4gd2hlcmUgdGhpcyBtZXNzYWdlIGNhbiBiZSByZWNlaXZlZFxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX21lc3NhZ2U6IE1lc3NhZ2UsIHByaXZhdGUgX3RhcmdldDogV2luZG93LCBwcml2YXRlIF9vcmlnaW46IHN0cmluZykge31cblxuICBwdWJsaWMgZ2V0IG1lc3NhZ2VHdWlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX21lc3NhZ2UubXNnR3VpZDtcbiAgfVxuXG4gIHB1YmxpYyBzZW5kKCk6IFByZXBhcmVkTWVzc2FnZSB7XG4gICAgdGhpcy5fdGFyZ2V0LnBvc3RNZXNzYWdlKHRoaXMuX21lc3NhZ2UsIHRoaXMuX29yaWdpbik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIGd1aWQgZnJvbSAnZ3VpZCc7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25JZCB9IGZyb20gJy4uL2NvbnRyYWN0L05vdGlmaWNhdGlvbnMnO1xuaW1wb3J0IHsgVmVyc2lvbk51bWJlciB9IGZyb20gJy4uL2ludGVyZmFjZS9WZXJzaW9uTnVtYmVyJztcbmltcG9ydCB7XG4gIENvbW1hbmRNZXNzYWdlLFxuICBDb21tYW5kUmVzcG9uc2VNZXNzYWdlLFxuICBIYW5kc2hha2VNZXNzYWdlLFxuICBJbml0aWFsaXplTWVzc2FnZSxcbiAgTWVzc2FnZSxcbiAgTWVzc2FnZVR5cGUsXG4gIE5vdGlmaWNhdGlvbk1lc3NhZ2UsXG59IGZyb20gJy4vaW50ZXJmYWNlL01lc3NhZ2VUeXBlcyc7XG5cbmNvbnN0IGV4cGVjdGVkRW1wdHlOb3RpZmljYXRpb25zID0gbmV3IFNldChbXG4gIE5vdGlmaWNhdGlvbklkLkVkaXRCdXR0b25DbGlja2VkLFxuICBOb3RpZmljYXRpb25JZC5FZGl0SW5EZXNrdG9wQnV0dG9uQ2xpY2tlZCxcbiAgTm90aWZpY2F0aW9uSWQuV29ya2Jvb2tQdWJsaXNoZWQsXG4gIE5vdGlmaWNhdGlvbklkLldvcmtib29rUmVhZHlUb0Nsb3NlLFxuICBOb3RpZmljYXRpb25JZC5SZWFkeVRvUmVjZWl2ZUF1dGhUb2tlbixcbl0pO1xuXG4vKiB0c2xpbnQ6ZGlzYWJsZSBuby1hbnkgKi9cbmV4cG9ydCBmdW5jdGlvbiBpc01lc3NhZ2UoZGF0YTogTWVzc2FnZSB8IGFueSk6IGRhdGEgaXMgTWVzc2FnZSB7XG4gIGlmICghZGF0YSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IG1lc3NhZ2UgPSBkYXRhIGFzIE1lc3NhZ2U7XG4gIGlmICghbWVzc2FnZSB8fCAhbWVzc2FnZS5tc2dHdWlkIHx8ICFtZXNzYWdlLm1zZ1R5cGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWd1aWQuaXNHdWlkKG1lc3NhZ2UubXNnR3VpZCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAodHlwZW9mIG1lc3NhZ2UubXNnVHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBtZXNzYWdlVHlwZXM6IEFycmF5PHN0cmluZz4gPSBbXG4gICAgTWVzc2FnZVR5cGUuQ29tbWFuZCxcbiAgICBNZXNzYWdlVHlwZS5Db21tYW5kUmVzcG9uc2UsXG4gICAgTWVzc2FnZVR5cGUuSW5pdGlhbGl6ZSxcbiAgICBNZXNzYWdlVHlwZS5Ob3RpZmljYXRpb24sXG4gICAgTWVzc2FnZVR5cGUuSGFuZHNoYWtlLFxuICBdO1xuXG4gIGlmIChtZXNzYWdlVHlwZXMuaW5kZXhPZihtZXNzYWdlLm1zZ1R5cGUpIDwgMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNWZXJzaW9uKHZlcnNpb25OdW1iZXI6IFZlcnNpb25OdW1iZXIgfCBhbnkpOiB2ZXJzaW9uTnVtYmVyIGlzIFZlcnNpb25OdW1iZXIge1xuICBpZiAoIXZlcnNpb25OdW1iZXIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCB2ID0gdmVyc2lvbk51bWJlciBhcyBWZXJzaW9uTnVtYmVyO1xuXG4gIGlmICh0eXBlb2YgdiAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAodHlwZW9mIHYuZml4ICE9PSAnbnVtYmVyJyB8fCB0eXBlb2Ygdi5taW5vciAhPT0gJ251bWJlcicgfHwgdHlwZW9mIHYubWFqb3IgIT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0luaXRNZXNzYWdlKG1lc3NhZ2U6IEluaXRpYWxpemVNZXNzYWdlIHwgYW55KTogbWVzc2FnZSBpcyBJbml0aWFsaXplTWVzc2FnZSB7XG4gIGlmICghaXNNZXNzYWdlKG1lc3NhZ2UpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgaW5pdE1lc3NhZ2UgPSBtZXNzYWdlIGFzIEluaXRpYWxpemVNZXNzYWdlO1xuICBpZiAoaW5pdE1lc3NhZ2UubXNnVHlwZSAhPT0gTWVzc2FnZVR5cGUuSW5pdGlhbGl6ZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghaW5pdE1lc3NhZ2UuYXBpVmVyc2lvbiB8fCAhaXNWZXJzaW9uKGluaXRNZXNzYWdlLmFwaVZlcnNpb24pKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFpbml0TWVzc2FnZS5jcm9zc0ZyYW1lVmVyc2lvbiB8fCAhaXNWZXJzaW9uKGluaXRNZXNzYWdlLmNyb3NzRnJhbWVWZXJzaW9uKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNDb21tYW5kUmVzcG9uc2VNZXNzYWdlKG1lc3NhZ2U6IENvbW1hbmRSZXNwb25zZU1lc3NhZ2UgfCBhbnkpOiBtZXNzYWdlIGlzIENvbW1hbmRSZXNwb25zZU1lc3NhZ2Uge1xuICBpZiAoIWlzTWVzc2FnZShtZXNzYWdlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGNyTWVzc2FnZSA9IG1lc3NhZ2UgYXMgQ29tbWFuZFJlc3BvbnNlTWVzc2FnZTtcbiAgaWYgKGNyTWVzc2FnZS5tc2dUeXBlICE9PSBNZXNzYWdlVHlwZS5Db21tYW5kUmVzcG9uc2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWd1aWQuaXNHdWlkKGNyTWVzc2FnZS5jb21tYW5kR3VpZCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWNyTWVzc2FnZS5kYXRhICYmICFjck1lc3NhZ2UuZXJyb3IpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQ29tbWFuZE1lc3NhZ2UobWVzc2FnZTogQ29tbWFuZE1lc3NhZ2UgfCBhbnkpOiBtZXNzYWdlIGlzIENvbW1hbmRNZXNzYWdlIHtcbiAgaWYgKCFpc01lc3NhZ2UobWVzc2FnZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBjb21tYW5kTWVzc2FnZSA9IG1lc3NhZ2UgYXMgQ29tbWFuZE1lc3NhZ2U7XG4gIGlmIChjb21tYW5kTWVzc2FnZS5tc2dUeXBlICE9PSBNZXNzYWdlVHlwZS5Db21tYW5kKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFjb21tYW5kTWVzc2FnZS5wYXJhbWV0ZXJzIHx8IHR5cGVvZiBjb21tYW5kTWVzc2FnZS5wYXJhbWV0ZXJzICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghY29tbWFuZE1lc3NhZ2UudmVyYklkIHx8IHR5cGVvZiBjb21tYW5kTWVzc2FnZS52ZXJiSWQgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc05vdGlmaWNhdGlvbk1lc3NhZ2UobWVzc2FnZTogTm90aWZpY2F0aW9uTWVzc2FnZSB8IGFueSk6IG1lc3NhZ2UgaXMgTm90aWZpY2F0aW9uTWVzc2FnZSB7XG4gIGlmICghaXNNZXNzYWdlKG1lc3NhZ2UpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3Qgbm90aWZpY2F0aW9uTWVzc2FnZSA9IG1lc3NhZ2UgYXMgTm90aWZpY2F0aW9uTWVzc2FnZTtcbiAgaWYgKG5vdGlmaWNhdGlvbk1lc3NhZ2UubXNnVHlwZSAhPT0gTWVzc2FnZVR5cGUuTm90aWZpY2F0aW9uKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFub3RpZmljYXRpb25NZXNzYWdlLmRhdGEgJiYgIWV4cGVjdGVkRW1wdHlOb3RpZmljYXRpb25zLmhhcyhub3RpZmljYXRpb25NZXNzYWdlLm5vdGlmaWNhdGlvbklkKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghbm90aWZpY2F0aW9uTWVzc2FnZS5ub3RpZmljYXRpb25JZCB8fCB0eXBlb2Ygbm90aWZpY2F0aW9uTWVzc2FnZS5ub3RpZmljYXRpb25JZCAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzSGFuZHNoYWtlTWVzc2FnZShtZXNzYWdlOiBIYW5kc2hha2VNZXNzYWdlIHwgYW55KTogbWVzc2FnZSBpcyBIYW5kc2hha2VNZXNzYWdlIHtcbiAgaWYgKCFpc01lc3NhZ2UobWVzc2FnZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBoYW5kc2hha2VNZXNzYWdlID0gbWVzc2FnZSBhcyBIYW5kc2hha2VNZXNzYWdlO1xuICBpZiAoaGFuZHNoYWtlTWVzc2FnZS5tc2dUeXBlICE9PSBNZXNzYWdlVHlwZS5IYW5kc2hha2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cbiIsImltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBNb2RlbCwgTm90aWZpY2F0aW9uSWQsIFZlcmJJZCwgVmVyc2lvbk51bWJlciB9IGZyb20gJy4uLy4uL0pzQXBpSW50ZXJuYWxDb250cmFjdCc7XG5pbXBvcnQgeyBJbml0aWFsaXphdGlvbk9wdGlvbnMgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2UvSW5pdGlhbGl6YXRpb25PcHRpb25zJztcblxuLyoqXG4gKiBFbnVtIGRlZmluaW5nIHRoZSA0IGRpZmZlcmVudCB0eXBlcyBvZiBtZXNzYWdlcyB3ZSBoYXZlIGRlZmluZWRcbiAqL1xuZXhwb3J0IGVudW0gTWVzc2FnZVR5cGUge1xuICBJbml0aWFsaXplID0gJ2luaXRpYWxpemUnLFxuICBOb3RpZmljYXRpb24gPSAnbm90aWZpY2F0aW9uJyxcbiAgQ29tbWFuZCA9ICdjb21tYW5kJyxcbiAgQ29tbWFuZFJlc3BvbnNlID0gJ2NvbW1hbmQtcmVzcG9uc2UnLFxuICBIYW5kc2hha2UgPSAndi1oYW5kc2hha2UnLFxuICBBY2sgPSAndi1hY2snLFxufVxuXG4vKipcbiAqIFRoZSBNZXNzYWdlIGludGVyZmFjZSBpcyB0aGUgYmFzZSBpbnRlcmZhY2UgZm9yIGFsbCB0aGUgb3RoZXJcbiAqIG1lc3NhZ2UgdHlwZSBpbnRlcmZhY2VzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1lc3NhZ2Uge1xuICAvKipcbiAgICogQSB1bmlxdWUgaWQgZm9yIHRoaXMgbWVzc2FnZVxuICAgKi9cbiAgbXNnR3VpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0aGlzIG1lc3NhZ2VcbiAgICovXG4gIG1zZ1R5cGU6IE1lc3NhZ2VUeXBlO1xufVxuXG4vKipcbiAqIFRoZSBpbml0aWFsaXplIG1lc3NhZ2UgaXMgdGhlIGZpcnN0IG1lc3NhZ2Ugd2hpY2ggd2lsbCBiZSBzZW50XG4gKiBmcm9tIHRoZSBqYXZhc2NyaXB0IHRvIHNldCB1cCBjb21tdW5pY2F0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEluaXRpYWxpemVNZXNzYWdlIGV4dGVuZHMgTWVzc2FnZSB7XG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgYXBpIHdoaWNoIHRoZSBzZW5kZXIgd2FudHMgdG8gdXNlXG4gICAqL1xuICBhcGlWZXJzaW9uOiBWZXJzaW9uTnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBvZiB0aGlzIG1lc3NhZ2luZyBjb250cmFjdCB0byBiZSB1c2VkLiBGb3Igbm93LCB0aGVyZVxuICAgKiBzaG91bGQgb25seSBiZSBhIHNpbmdsZSB2ZXJzaW9uIGJ1dCBzZW5kaW5nIHRoaXMgYWxvbmcgc2hvdWxkIGhlbHBcbiAgICogaWYgd2UgbmVlZCB0byBhZGQgYSBuZXcgdmVyc2lvbiBpbiBhIGZ1dHVyZSByZWxlYXNlXG4gICAqL1xuICBjcm9zc0ZyYW1lVmVyc2lvbjogVmVyc2lvbk51bWJlcjtcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBvcHRpb25zIHRoYXQgY2FuIGJlIHBhc3NlZCBhdCB0aGUgdGltZSBvZiBpbml0aWFsaXphdGlvblxuICAgKi9cbiAgb3B0aW9ucz86IEluaXRpYWxpemF0aW9uT3B0aW9ucztcbn1cblxuLyoqXG4gKiBUaGlzIG1lc3NhZ2UgaXMgc2VudCB3aGVuIGEgbm90aWZpY2F0aW9uIG9jY3VycyBmcm9tIHRoZSBwcmVzbGF5ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOb3RpZmljYXRpb25NZXNzYWdlIGV4dGVuZHMgTWVzc2FnZSB7XG4gIC8qKlxuICAgKiBUaGUgaWQgZm9yIHRoaXMgdHlwZSBvZiBub3RpZmljYXRpb25cbiAgICovXG4gIG5vdGlmaWNhdGlvbklkOiBOb3RpZmljYXRpb25JZDtcblxuICAvKipcbiAgICogVGhlIGRhdGEgd2hpY2ggY2FtZSBhbG9uZyB3aXRoIHRoZSBub3RpZmljYXRpb25cbiAgICovXG4gIGRhdGE6IE1vZGVsO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgY2FsbGluZyBhbiBpbnRlcm5hbCBjb250cmFjdCBjb21tYW5kXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tbWFuZE1lc3NhZ2UgZXh0ZW5kcyBNZXNzYWdlIHtcbiAgLyoqXG4gICAqIFRoZSBpZCBvZiB0aGUgY29tbWFuZCB3aGljaCBzaG91bGQgYmUgZXhlY3V0ZWRcbiAgICovXG4gIHZlcmJJZDogVmVyYklkO1xuXG4gIC8qKlxuICAgKiBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGNvbW1hbmRcbiAgICovXG4gIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzO1xufVxuXG4vKipcbiAqIFRoaXMgbWVzc2FnZSBpcyBzZW50IGluIHJlc3BvbnNlIHRvIGEgQ29tbWFuZE1lc3NhZ2Ugd2l0aCB0aGVcbiAqIHJlc3VsdCBvZiB0aGF0IGNvbW1hbmRzIGludm9jYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21tYW5kUmVzcG9uc2VNZXNzYWdlIGV4dGVuZHMgTWVzc2FnZSB7XG4gIC8qKlxuICAgKiBHdWlkIG9mIHRoZSBDb21tYW5kTWVzc2FnZSB3aGljaCB0aGlzIGlzIGluIHJlc3BvbnNlIHRvXG4gICAqL1xuICBjb21tYW5kR3VpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJZiB0aGVyZSB3YXMgYW4gZXJyb3IgcmV0dXJuZWQgZnJvbSB0aGUgY29tbWFuZCwgdGhpcyB3aWxsIGJlIGRlZmluZWRcbiAgICogYW5kIGNvbnRhaW4gdGhlIGVycm9yXG4gICAqL1xuICBlcnJvcj86IE1vZGVsO1xuXG4gIC8qKlxuICAgKiBJZiB0aGUgY29tbWFuZCBleGVjdXRlZCBzdWNjZXNzZnVsbHksIHRoaXMgd2lsbCBjb250YWluIHRoZSBjb21tYW5kIHJlc3VsdFxuICAgKi9cbiAgZGF0YT86IE1vZGVsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEhhbmRzaGFrZU1lc3NhZ2UgZXh0ZW5kcyBNZXNzYWdlIHtcbiAgLyoqXG4gICAqIEludGVybmFsIEFQSSBjb250cmFjdCB2ZXJzaW9uXG4gICAqL1xuICBwbGF0Zm9ybVZlcnNpb246IFZlcnNpb25OdW1iZXI7XG59XG4iLCJpbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgRXhlY3V0ZVJlc3BvbnNlLCBOb3RpZmljYXRpb24sIFZlcmJJZCB9IGZyb20gJy4uL0pzQXBpSW50ZXJuYWxDb250cmFjdCc7XG5pbXBvcnQgeyBJbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB9IGZyb20gJy4vSW50ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXInO1xuXG4vLyB0c2xpbnQ6ZGlzYWJsZTpuby1hbnlcblxuLyoqXG4gKiBUaGlzIHZlcnNpb24gY29udmVydGVyIGRvZXNuJ3QgYWN0dWFsbHkgZG8gYW55dGhpbmcgYnV0IGlzIHVzZWZ1bCBmb3IgdGVzdGluZyBvciB3aGVuIHdlIGhhdmVcbiAqIGEgbWF0Y2hpbmcgcGxhdGZvcm0gYW5kIGludGVybmFsIHZlcnNpb24gbnVtYmVyXG4gKi9cbmV4cG9ydCBjbGFzcyBJZGVudGl0eVZlcnNpb25Db252ZXJ0ZXIgaW1wbGVtZW50cyBJbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB7XG4gIHB1YmxpYyB1cGdyYWRlRXhlY3V0ZUNhbGwodmVyYjogYW55LCBwYXJhbWV0ZXJzOiBhbnkpOiB7IHZlcmI6IFZlcmJJZDsgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgfSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZlcmI6IHZlcmIgYXMgVmVyYklkLFxuICAgICAgcGFyYW1ldGVyczogcGFyYW1ldGVycyBhcyBFeGVjdXRlUGFyYW1ldGVycyxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGRvd25ncmFkZUV4ZWN1dGVSZXR1cm4oZXhlY3V0ZVJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UpOiBFeGVjdXRlUmVzcG9uc2Uge1xuICAgIHJldHVybiBleGVjdXRlUmVzcG9uc2U7XG4gIH1cblxuICBwdWJsaWMgZG93bmdyYWRlTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uKTogTm90aWZpY2F0aW9uIHtcbiAgICByZXR1cm4gbm90aWZpY2F0aW9uO1xuICB9XG59XG4iLCJpbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgRXhlY3V0ZVJlc3BvbnNlLCBOb3RpZmljYXRpb24sIFZlcmJJZCwgVmVyc2lvbk51bWJlciB9IGZyb20gJy4uL0pzQXBpSW50ZXJuYWxDb250cmFjdCc7XG5pbXBvcnQgeyBJbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB9IGZyb20gJy4vSW50ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXInO1xuaW1wb3J0ICogYXMgVHJhbnNsYXRpb25zIGZyb20gJy4vVmVyc2lvblRyYW5zbGF0aW9ucyc7XG5cbi8vIHRzbGludDpkaXNhYmxlOm5vLWFueVxuXG4vKipcbiAqIFRoZSB2ZXJzaW9uIGNvbnZlcnRlciBpcyBkZXNpZ25lZCB0byBhbGxvdyB0aGUgcGxhdGZvcm0gYW5kIGV4dGVybmFsIG1vZHVsZXNcbiAqIHRvIHNlZW1sZXNzbHkgY29tbXVuaWNhdGUgb3ZlciB0d28gZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoZSBpbnRlcm5hbCBBUEkuIFRoZSBvbmx5XG4gKiBtb2RlIGl0IHN1cHBvcnRzIGlzIGV4dGVybmFsJ3MgdmVyc2lvbiA8PSBwbGF0Zm9ybSdzIHZlcnNpb24uIFdoZW4gZXhlY3V0aW5nXG4gKiBjb21tYW5kcywgaXQgaXMgdXNlZCB0byB1cGdyYWRlIHRoZSBleHRlcm5hbCByZXByZXNlbnRhdGlvbiB0byB3aGF0IHBsYXRmb3JtIGtub3dzIG9uIHRoZSB3YXkgaW5cbiAqIGFuZCBkb3duZ3JhZGUgdGhlIHJlcHJlc2VudGF0aW9ucyBvbiB0aGUgd2F5IG91dC4gU2ltaWxhcmx5IGZvciBub3RpZmljYXRpb25zLCBpdCBjYW5cbiAqIGRvd25ncmFkZSB0aG9zZSBvbiB0aGUgd2F5IGZyb20gcGxhdGZvcm0gdG8gZXh0ZXJuYWwuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIgaW1wbGVtZW50cyBJbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXJcbiAgICpcbiAgICogQHBhcmFtIF9leHRlcm5hbFZlcnNpb24gVGhlIHZlcnNpb24gb2YgdGhlIGludGVybmFsIGNvbnRyYWN0IGFwaS1leHRlcm5hbC1qcyBpcyB1c2luZ1xuICAgKiBAcGFyYW0gX3BsYXRmb3JtVmVyc2lvbiBUaGUgdmVyc2lvbiBvZiB0aGUgaW50ZXJuYWwgY29udHJhY3QgdGhlIGFwaS1wbGF0Zm9ybS1qcyBpcyB1c2luZ1xuICAgKiBAcGFyYW0gX3VwZ3JhZGVFeGVjdXRlVHJhbnNsYXRpb25zIE9yZGVyZWQgbGlzdCBvZiB0aGUgdHJhbnNsYXRpb25zIHRvIHBlcmZvcm0gd2hlbiB1cGdyYWRpbmcgY21kIHBhcmFtZXRlcnNcbiAgICogQHBhcmFtIF9kb3duZ3JhZGVFeGVjdXRlVHJhbnNsYXRpb25zIE9yZGVyZWQgbGlzdCBvZiBkb3duZ3JhZGUgdHJhbnNsYXRpb25zIHRvIHBlcmZvcm0gYWZ0ZXIgYSBjbWRcbiAgICogQHBhcmFtIF9kb3duZ3JhZGVOb3RpZmljYXRpb25UcmFuc2xhdGlvbnMgT3JkZXJlZCBsaXN0IG9mIGRvd25ncmFkZSB0cmFuc2xhdGlvbnMgdG8gcGVyZm9ybSBvbiBhIG5vdGlmaWNhdGlvblxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tRGF0YShcbiAgICBleHRlcm5hbFZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4gICAgcGxhdGZvcm1WZXJzaW9uOiBWZXJzaW9uTnVtYmVyLFxuICAgIHVwZ3JhZGVFeGVjdXRlVHJhbnNsYXRpb25zOiBBcnJheTxUcmFuc2xhdGlvbnMuVXBncmFkZUV4ZWN1dGVDYWxsPixcbiAgICBkb3duZ3JhZGVFeGVjdXRlVHJhbnNsYXRpb25zOiBBcnJheTxUcmFuc2xhdGlvbnMuRG93bmdyYWRlRXhlY3V0ZVJldHVybj4sXG4gICAgZG93bmdyYWRlTm90aWZpY2F0aW9uVHJhbnNsYXRpb25zOiBBcnJheTxUcmFuc2xhdGlvbnMuRG93bmdyYWRlTm90aWZpY2F0aW9uPixcbiAgKTogU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyIHtcbiAgICByZXR1cm4gbmV3IHRoaXMoXG4gICAgICBleHRlcm5hbFZlcnNpb24ubWFqb3IsXG4gICAgICBwbGF0Zm9ybVZlcnNpb24ubWFqb3IsXG4gICAgICB1cGdyYWRlRXhlY3V0ZVRyYW5zbGF0aW9ucyxcbiAgICAgIGRvd25ncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnMsXG4gICAgICBkb3duZ3JhZGVOb3RpZmljYXRpb25UcmFuc2xhdGlvbnMsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXJcbiAgICpcbiAgICogQHBhcmFtIF9leHRlcm5hbE1ham9yVmVyc2lvbiBUaGUgbWFqb3IgdmVyc2lvbiBvZiB0aGUgaW50ZXJuYWwgY29udHJhY3QgYXBpLWV4dGVybmFsLWpzIGlzIHVzaW5nXG4gICAqIEBwYXJhbSBfcGxhdGZvcm1NYWpvclZlcnNpb24gVGhlIG1ham9yIHZlcnNpb24gb2YgdGhlIGludGVybmFsIGNvbnRyYWN0IHRoZSBhcGktcGxhdGZvcm0tanMgaXMgdXNpbmdcbiAgICogQHBhcmFtIF91cGdyYWRlRXhlY3V0ZVRyYW5zbGF0aW9ucyBPcmRlcmVkIGxpc3Qgb2YgdGhlIHRyYW5zbGF0aW9ucyB0byBwZXJmb3JtIHdoZW4gdXBncmFkaW5nIGNtZCBwYXJhbWV0ZXJzXG4gICAqIEBwYXJhbSBfZG93bmdyYWRlRXhlY3V0ZVRyYW5zbGF0aW9ucyBPcmRlcmVkIGxpc3Qgb2YgZG93bmdyYWRlIHRyYW5zbGF0aW9ucyB0byBwZXJmb3JtIGFmdGVyIGEgY21kXG4gICAqIEBwYXJhbSBfZG93bmdyYWRlTm90aWZpY2F0aW9uVHJhbnNsYXRpb25zIE9yZGVyZWQgbGlzdCBvZiBkb3duZ3JhZGUgdHJhbnNsYXRpb25zIHRvIHBlcmZvcm0gb24gYSBub3RpZmljYXRpb25cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9leHRlcm5hbE1ham9yVmVyc2lvbjogbnVtYmVyLFxuICAgIHByaXZhdGUgX3BsYXRmb3JtTWFqb3JWZXJzaW9uOiBudW1iZXIsXG4gICAgcHJpdmF0ZSBfdXBncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnM6IEFycmF5PFRyYW5zbGF0aW9ucy5VcGdyYWRlRXhlY3V0ZUNhbGw+LFxuICAgIHByaXZhdGUgX2Rvd25ncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnM6IEFycmF5PFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVFeGVjdXRlUmV0dXJuPixcbiAgICBwcml2YXRlIF9kb3duZ3JhZGVOb3RpZmljYXRpb25UcmFuc2xhdGlvbnM6IEFycmF5PFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVOb3RpZmljYXRpb24+LFxuICApIHtcbiAgICBpZiAodGhpcy5fZXh0ZXJuYWxNYWpvclZlcnNpb24gPiB0aGlzLl9wbGF0Zm9ybU1ham9yVmVyc2lvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY29udmVydCBiZXR3ZWVuIGV4dGVybmFsIHZlcnNpb24gJHt0aGlzLl9leHRlcm5hbE1ham9yVmVyc2lvbn0gYW5kICR7dGhpcy5fcGxhdGZvcm1NYWpvclZlcnNpb259YCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHVwZ3JhZGVFeGVjdXRlQ2FsbCh2ZXJiOiBhbnksIHBhcmFtZXRlcnM6IGFueSk6IHsgdmVyYjogVmVyYklkOyBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyB9IHtcbiAgICAvLyBQZXJmb3JtIHRoZSB1cGdyYWRlIG9mIHRoZSB2ZXJiIGFuZCBwYXJhbWV0ZXJzIHRvIHRoZSBsZXZlbCB0aGF0IHBsYXRmb3JtIGlzIHVzaW5nXG4gICAgbGV0IHVwZ3JhZGVkID0geyB2ZXJiOiB2ZXJiLCBwYXJhbWV0ZXJzOiBwYXJhbWV0ZXJzIH07XG4gICAgZm9yIChjb25zdCB1cGdyYWRlVHJhbnNsYXRpb24gb2YgdGhpcy5fdXBncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnMpIHtcbiAgICAgIHVwZ3JhZGVkID0gdXBncmFkZVRyYW5zbGF0aW9uKHVwZ3JhZGVkLnZlcmIsIHVwZ3JhZGVkLnBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIHJldHVybiB1cGdyYWRlZDtcbiAgfVxuXG4gIHB1YmxpYyBkb3duZ3JhZGVFeGVjdXRlUmV0dXJuKGV4ZWN1dGVSZXNwb25zZTogRXhlY3V0ZVJlc3BvbnNlKTogRXhlY3V0ZVJlc3BvbnNlIHtcbiAgICAvLyBEb3duZ3JhZGUgdGhlIHJlc3BvbnNlIHRvIHdoYXQgdGhlIGV4dGVybmFsIG1vZHVsZSBpcyBleHBlY3RpbmdcbiAgICBsZXQgZG93bmdyYWRlZCA9IGV4ZWN1dGVSZXNwb25zZTtcbiAgICBmb3IgKGNvbnN0IGRvd25ncmFkZVRyYW5zbGF0aW9uIG9mIHRoaXMuX2Rvd25ncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnMpIHtcbiAgICAgIGRvd25ncmFkZWQgPSBkb3duZ3JhZGVUcmFuc2xhdGlvbihkb3duZ3JhZGVkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZG93bmdyYWRlZDtcbiAgfVxuXG4gIHB1YmxpYyBkb3duZ3JhZGVOb3RpZmljYXRpb24obm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24pOiBOb3RpZmljYXRpb24ge1xuICAgIC8vIERvd25ncmFkZSB0aGUgbm90aWZpY2F0aW9uIHRvIHdoYXQgdGhlIGV4dGVybmFsIG1vZHVsZSBpcyBleHBlY3RpbmdcbiAgICBsZXQgZG93bmdyYWRlZCA9IG5vdGlmaWNhdGlvbjtcbiAgICBmb3IgKGNvbnN0IGRvd25ncmFkZVRyYW5zbGF0aW9uIG9mIHRoaXMuX2Rvd25ncmFkZU5vdGlmaWNhdGlvblRyYW5zbGF0aW9ucykge1xuICAgICAgZG93bmdyYWRlZCA9IGRvd25ncmFkZVRyYW5zbGF0aW9uKGRvd25ncmFkZWQpO1xuICAgIH1cblxuICAgIHJldHVybiBkb3duZ3JhZGVkO1xuICB9XG59XG4iLCJpbXBvcnQgeyBWZXJzaW9uTnVtYmVyIH0gZnJvbSAnLi4vSnNBcGlJbnRlcm5hbENvbnRyYWN0JztcbmltcG9ydCB7IElkZW50aXR5VmVyc2lvbkNvbnZlcnRlciB9IGZyb20gJy4vSWRlbnRpdHlWZXJzaW9uQ29udmVydGVyJztcbmltcG9ydCB7IEludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIH0gZnJvbSAnLi9JbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcic7XG5pbXBvcnQgeyBTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIgfSBmcm9tICcuL1N0YWNraW5nVmVyc2lvbkNvbnZlcnRlcic7XG5pbXBvcnQgKiBhcyBUcmFuc2xhdGlvbnMgZnJvbSAnLi9WZXJzaW9uVHJhbnNsYXRpb25zJztcbmltcG9ydCB7XG4gIERvd25ncmFkZUV4dGVuc2lvbkVudmlyb25tZW50Q29udGV4dCxcbiAgRG93bmdyYWRlRmxpcGJvYXJkWm9uZUlELFxuICBEb3duZ3JhZGVXb3Jrc2hlZXRGb21hdHRpbmcxNzUsXG4gIERvd25ncmFkZVdvcmtzaGVldEZvbWF0dGluZ05vdGlmaWNhdGlvbjE3NSxcbiAgRG93bmdyYWRlV29ya3NoZWV0TmFtZXMsXG59IGZyb20gJy4vVmVyc2lvblRyYW5zbGF0aW9ucyc7XG5cbi8qKlxuICogQHJldHVybnMgdHJ1ZSBpZiBsaHMgPCByaHMgKGlnbm9yaW5nIGZpeCBudW1iZXIpXG4gKiBAcGFyYW0gbGhzXG4gKiBAcGFyYW0gcmhzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBWZXJzaW9uTGVzc1RoYW4obGhzOiBWZXJzaW9uTnVtYmVyLCByaHM6IFZlcnNpb25OdW1iZXIpOiBib29sZWFuIHtcbiAgaWYgKGxocy5tYWpvciA+IHJocy5tYWpvcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAobGhzLm1ham9yIDwgcmhzLm1ham9yKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGxocy5taW5vciA8IHJocy5taW5vcjtcbn1cblxuLyoqXG4gKiBAcmV0dXJucyB0cnVlIGlmIGxocyA9PSByaHMgKGlnbm9yaW5nIGZpeCBudW1iZXIpXG4gKiBAcGFyYW0gbGhzXG4gKiBAcGFyYW0gcmhzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBWZXJzaW9uRXF1YWxUbyhsaHM6IFZlcnNpb25OdW1iZXIsIHJoczogVmVyc2lvbk51bWJlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gbGhzLm1ham9yID09PSByaHMubWFqb3IgJiYgbGhzLm1pbm9yID09PSByaHMubWlub3I7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWFqb3JNaW5vclRyYW5zbGF0b3JzPFQ+IHtcbiAgW21ham9yOiBudW1iZXJdOiB7IFttaW5vcjogbnVtYmVyXTogQXJyYXk8VD4gfTtcbn1cblxuLy8gQSBtYXBwaW5nIGZyb20gYW4gb2xkZXIgY2xpZW50IHZlcnNpb24gb2YgaW50ZXJuYWwtY29udHJhY3QgdG8gdGhlIGN1cnJlbnQgcGxhdGZvcm0gdmVyc2lvbiBvZiB0aGlzIGNvbnRyYWN0LlxuLy8gRWFjaCB2ZXJzaW9uIGJ1bXAgY2FuIGhhdmUgYW4gYXJyYXkgb2YgdHJhbnNsYXRpb25zIHRvIHBlcmZvcm0gaW4gb3JkZXIuIE5vdGljZSB0aGF0IHRoaXMgaXNcbi8vIGRpZmZlcmVudCB0aGFuIHRoZSBtYWpvciB1cGdyYWRlcy9kb3duZ3JhZGVzIGFib3ZlIGJlY2F1c2UgaXQgaGFuZGxlcyBib3RoIG1ham9yIGFuZCBtaW5vciB2ZXJzaW9uIGNoYW5nZXMuXG4vLyBBbHNvIHBsZWFzZSBub3RlOiBkb3duZ3JhZGVFeGVjdXRlQ2FsbCBpcyBoYW5kbGVkIG9uIHRoZSBjbGllbnQvZXh0ZXJuYWwgc2lkZSByYXRoZXIgdGhhbiBwbGF0Zm9ybSBzaWRlLlxuLy8gV2hlbiB1cGRhdGluZyB0aGUgbWFqb3Igb3IgbWlub3IgdmVyc2lvbiBvZiBvdXIgaW50ZXJuYWwtY29udHJhY3QsIHlvdSB3aWxsIG5lZWQgdG8gdXBkYXRlIHRoZXNlIGRhdGEgc3RydWN0dXJlcy5cbi8vICogSWYgdGhlcmUgYXJlIHRyYW5zbGF0aW9ucyB0byBhZGQsIGFkZCB0aGVtIHRvIHRoZSB2ZXJzaW9uIHRvIFwidXBncmFkZSBmcm9tXCIgb3IgXCJkb3duZ3JhZGUgdG9cIi5cbmV4cG9ydCBjb25zdCBFeGVjdXRlTWlub3JVcGdyYWRlczogTWFqb3JNaW5vclRyYW5zbGF0b3JzPFRyYW5zbGF0aW9ucy5VcGdyYWRlRXhlY3V0ZUNhbGw+ID0ge1xuICAxOiB7XG4gICAgOTogW10sIC8vIE5vdGUgdGhhdCB3ZSBwdXQgdXBncmFkZXMgZnJvbSAxLjkgdG8gMS4xMCBpbiB0aGUgWzFdWzldIGJ1Y2tldFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IEV4ZWN1dGVNaW5vckRvd25ncmFkZXM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnMuRG93bmdyYWRlRXhlY3V0ZVJldHVybj4gPSB7XG4gIDE6IHtcbiAgICA1OiBbRG93bmdyYWRlV29ya3NoZWV0TmFtZXNdLFxuICAgIDk6IFtdLFxuICAgIDE3NTogW0Rvd25ncmFkZVdvcmtzaGVldEZvbWF0dGluZzE3NV0sXG4gICAgMTgyOiBbRG93bmdyYWRlRXh0ZW5zaW9uRW52aXJvbm1lbnRDb250ZXh0XSxcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBOb3RpZmljYXRpb25NaW5vckRvd25ncmFkZXM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnMuRG93bmdyYWRlTm90aWZpY2F0aW9uPiA9IHtcbiAgMToge1xuICAgIDk6IFtdLFxuICAgIDEwOiBbRG93bmdyYWRlRmxpcGJvYXJkWm9uZUlEXSxcbiAgICAxNzU6IFtEb3duZ3JhZGVXb3Jrc2hlZXRGb21hdHRpbmdOb3RpZmljYXRpb24xNzVdLFxuICB9LFxufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IEludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIHdoaWNoIGhhcyB0aGUgYWJpbGl0eSB0byB1cGdyYWRlIGFuZCBkb3duZ3JhZGUgdGhlIGNvbnRyYWN0XG4gKiBiZXR3ZWVuIHRoZSB0d28gdmVyc2lvbnMsIHdoaWNoIGFyZSBzcGVjaWZpZWQuIElmIGV4dGVybmFsTWFqb3JWZXJzaW9uIGlzIGdyZWF0ZXIgdGhhbiBwbGF0Zm9ybU1ham9yVmVyc2lvbixcbiAqIGFuIGVycm9yIHdpbGwgYmUgdGhyb3duIGJlY2F1c2Ugd2Ugd29uJ3Qga25vdyBob3cgdG8gZG8gdGhvc2UgY29udmVyc2lvbnMuXG4gKiBUaGlzIGNvbnZlcnRlciBjYW4gaGFuZGxlIGJvdGggbWFqb3IgYW5kIG1pbm9yIHVwZGF0ZXMgd2hlbiB0aGUgcGxhdGZvcm0gdmVyc2lvbiBpcyBncmVhdGVyIHRoYW4gZXh0ZXJuYWwgdmVyc2lvbi5cbiAqXG4gKiBAcGFyYW0gZXh0ZXJuYWxWZXJzaW9uIFZlcnNpb25OdW1iZXIgb2YgdGhlIGludGVybmFsIGFwaSB3aGljaCB0aGUgZXh0ZXJuYWwgbW9kdWxlIGlzIHVzaW5nXG4gKiBAcGFyYW0gcGxhdGZvcm1WZXJzaW9uIFZlcnNpb25OdW1iZXIgb2YgdGhlIGludGVybmFsIGFwaSB3aGljaCB0aGUgcGxhdGZvcm0gaXMgdXNpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENyZWF0ZVZlcnNpb25Db252ZXJ0ZXIoZXh0ZXJuYWxWZXJzaW9uOiBWZXJzaW9uTnVtYmVyLCBwbGF0Zm9ybVZlcnNpb246IFZlcnNpb25OdW1iZXIpOiBJbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB7XG4gIHJldHVybiBDcmVhdGVWZXJzaW9uQ29udmVydGVyV2l0aFRyYW5zbGF0b3JzKFxuICAgIGV4dGVybmFsVmVyc2lvbixcbiAgICBwbGF0Zm9ybVZlcnNpb24sXG4gICAgRXhlY3V0ZU1pbm9yVXBncmFkZXMsXG4gICAgRXhlY3V0ZU1pbm9yRG93bmdyYWRlcyxcbiAgICBOb3RpZmljYXRpb25NaW5vckRvd25ncmFkZXMsXG4gICk7XG59XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgQ3JlYXRlVmVyc2lvbkNvbnZlcnRlci4gVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgdXBncmFkZSwgZG93bmdyYWRlLCBhbmRcbiAqIG5vdGlmaWNhdGlvbiBhcnJheXMgc28gdGhhdCBhbGwgdGhlIGxvZ2ljIGNhbiBiZSB0ZXN0ZWQuXG4gKlxuICogQHBhcmFtIGV4dGVybmFsVmVyc2lvbiBWZXJzaW9uTnVtYmVyIG9mIHRoZSBpbnRlcm5hbCBhcGkgd2hpY2ggdGhlIGV4dGVybmFsIG1vZHVsZSBpcyB1c2luZ1xuICogQHBhcmFtIHBsYXRmb3JtVmVyc2lvbiBWZXJzaW9uTnVtYmVyIG9mIHRoZSBpbnRlcm5hbCBhcGkgd2hpY2ggdGhlIHBsYXRmb3JtIGlzIHVzaW5nXG4gKiBAcGFyYW0gdXBncmFkZXMgTWFqb3JNaW5vclRyYW5zbGF0b3JzIGZvciB1cGdyYWRlc1xuICogQHBhcmFtIGRvd25ncmFkZXMgTWFqb3JNaW5vclRyYW5zbGF0b3JzIGZvciBkb3duZ3JhZGVzXG4gKiBAcGFyYW0gbm90aWZpY2F0aW9uRG93bmdyYWRlcyBNYWpvck1pbm9yVHJhbnNsYXRvcnMgZm9yIG5vdGlmaWNhdGlvbiBkb3duZ3JhZGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDcmVhdGVWZXJzaW9uQ29udmVydGVyV2l0aFRyYW5zbGF0b3JzKFxuICBleHRlcm5hbFZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4gIHBsYXRmb3JtVmVyc2lvbjogVmVyc2lvbk51bWJlcixcbiAgdXBncmFkZXM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnMuVXBncmFkZUV4ZWN1dGVDYWxsPixcbiAgZG93bmdyYWRlczogTWFqb3JNaW5vclRyYW5zbGF0b3JzPFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVFeGVjdXRlUmV0dXJuPixcbiAgbm90aWZpY2F0aW9uRG93bmdyYWRlczogTWFqb3JNaW5vclRyYW5zbGF0b3JzPFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVOb3RpZmljYXRpb24+LFxuKTogSW50ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXIge1xuICBjb25zdCBleHRlcm5hbE1ham9yVmVyc2lvbjogbnVtYmVyID0gZXh0ZXJuYWxWZXJzaW9uLm1ham9yO1xuICBjb25zdCBleHRlcm5hbE1pbm9yVmVyc2lvbjogbnVtYmVyID0gZXh0ZXJuYWxWZXJzaW9uLm1pbm9yO1xuICBjb25zdCBwbGF0Zm9ybU1ham9yVmVyc2lvbjogbnVtYmVyID0gcGxhdGZvcm1WZXJzaW9uLm1ham9yO1xuXG4gIGlmIChleHRlcm5hbE1ham9yVmVyc2lvbiA+IHBsYXRmb3JtTWFqb3JWZXJzaW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFeHRlcm5hbCB2ZXJzaW9uIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHBsYXRmb3JtIHZlcnNpb24uXG4gICAgZXh0ZXJuYWxNYWpvclZlcnNpb249JHtleHRlcm5hbE1ham9yVmVyc2lvbn0gcGxhdGZvcm1NYWpvclZlcnNpb249JHtwbGF0Zm9ybU1ham9yVmVyc2lvbn1gKTtcbiAgfVxuXG4gIC8vIElmIHdlIGFyZSB1c2luZyB0aGUgZXhhY3Qgc2FtZSB2ZXJzaW9ucyAobWFqb3IubWlub3IpLCBqdXN0IHVzZSB0aGUgaWRlbnRpdHkgY29udmVydGVyXG4gIGlmIChWZXJzaW9uRXF1YWxUbyhleHRlcm5hbFZlcnNpb24sIHBsYXRmb3JtVmVyc2lvbikpIHtcbiAgICByZXR1cm4gbmV3IElkZW50aXR5VmVyc2lvbkNvbnZlcnRlcigpO1xuICB9XG5cbiAgLy8gV2FsayB0aGUgc3BhbiBiZXR3ZWVuIHRoZSB2ZXJzaW9ucyB3ZSBoYXZlIGhlcmUgYW5kIGNvbGxlY3QgdGhlIHVwZ3JhZGUgYW5kIGRvd25ncmFkZXMgbmVjZXNzYXJ5XG4gIGNvbnN0IG5lZWRlZEV4ZWN1dGVVcGdyYWRlczogQXJyYXk8VHJhbnNsYXRpb25zLlVwZ3JhZGVFeGVjdXRlQ2FsbD4gPSBHZXROZWVkZWRUcmFuc2xhdGlvbnMoXG4gICAgZXh0ZXJuYWxNYWpvclZlcnNpb24sXG4gICAgcGxhdGZvcm1NYWpvclZlcnNpb24sXG4gICAgZXh0ZXJuYWxNaW5vclZlcnNpb24sXG4gICAgdXBncmFkZXMsXG4gICk7XG5cbiAgY29uc3QgbmVlZGVkRXhlY3V0ZURvd25ncmFkZXM6IEFycmF5PFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVFeGVjdXRlUmV0dXJuPiA9IEdldE5lZWRlZFRyYW5zbGF0aW9ucyhcbiAgICBleHRlcm5hbE1ham9yVmVyc2lvbixcbiAgICBwbGF0Zm9ybU1ham9yVmVyc2lvbixcbiAgICBleHRlcm5hbE1pbm9yVmVyc2lvbixcbiAgICBkb3duZ3JhZGVzLFxuICApO1xuXG4gIGNvbnN0IG5lZWRlZE5vdGlmaWNhdGlvbkRvd25ncmFkZXM6IEFycmF5PFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVOb3RpZmljYXRpb24+ID0gR2V0TmVlZGVkVHJhbnNsYXRpb25zKFxuICAgIGV4dGVybmFsTWFqb3JWZXJzaW9uLFxuICAgIHBsYXRmb3JtTWFqb3JWZXJzaW9uLFxuICAgIGV4dGVybmFsTWlub3JWZXJzaW9uLFxuICAgIG5vdGlmaWNhdGlvbkRvd25ncmFkZXMsXG4gICk7XG5cbiAgLy8gV2Ugd2FudCB0byBhcHBseSB0aGUgZG93bmdyYWRlcyBpbiByZXZlcnNlIG9yZGVyIGluIGNhc2Ugb2YgZGVwZW5kZW5jaWVzIGJldHdlZW4gdGhlbVxuICBuZWVkZWRFeGVjdXRlRG93bmdyYWRlcy5yZXZlcnNlKCk7XG4gIG5lZWRlZE5vdGlmaWNhdGlvbkRvd25ncmFkZXMucmV2ZXJzZSgpO1xuXG4gIHJldHVybiBTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIuZnJvbURhdGEoXG4gICAgZXh0ZXJuYWxWZXJzaW9uLFxuICAgIHBsYXRmb3JtVmVyc2lvbixcbiAgICBuZWVkZWRFeGVjdXRlVXBncmFkZXMsXG4gICAgbmVlZGVkRXhlY3V0ZURvd25ncmFkZXMsXG4gICAgbmVlZGVkTm90aWZpY2F0aW9uRG93bmdyYWRlcyxcbiAgKTtcbn1cblxuZnVuY3Rpb24gR2V0TmVlZGVkVHJhbnNsYXRpb25zPFQ+KFxuICBleHRlcm5hbE1ham9yVmVyc2lvbjogbnVtYmVyLFxuICBwbGF0Zm9ybU1ham9yVmVyc2lvbjogbnVtYmVyLFxuICBleHRlcm5hbE1pbm9yVmVyc2lvbjogbnVtYmVyLFxuICBtYWpvck1pbm9yVHJhbnNsYXRvcnM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUPixcbik6IEFycmF5PFQ+IHtcbiAgY29uc3QgbmVlZGVkVHJhbnNsYXRpb25zOiBBcnJheTxUPiA9IFtdO1xuXG4gIGZvciAobGV0IG1ham9yID0gZXh0ZXJuYWxNYWpvclZlcnNpb247IG1ham9yIDw9IHBsYXRmb3JtTWFqb3JWZXJzaW9uOyBtYWpvcisrKSB7XG4gICAgaWYgKG1ham9yIGluIG1ham9yTWlub3JUcmFuc2xhdG9ycykge1xuICAgICAgY29uc3Qgc3RhcnQgPSBtYWpvciA9PT0gZXh0ZXJuYWxNYWpvclZlcnNpb24gPyBleHRlcm5hbE1pbm9yVmVyc2lvbiA6IDA7XG4gICAgICBjb25zdCBtYXhpbXVtTWlub3JWZXJzaW9uID0gR2V0TWF4aW11bU1pbm9ySW5kZXgoT2JqZWN0LmtleXMobWFqb3JNaW5vclRyYW5zbGF0b3JzW21ham9yXSkpO1xuICAgICAgZm9yIChsZXQgbWlub3IgPSBzdGFydDsgbWlub3IgPD0gbWF4aW11bU1pbm9yVmVyc2lvbjsgbWlub3IrKykge1xuICAgICAgICBpZiAobWlub3IgaW4gbWFqb3JNaW5vclRyYW5zbGF0b3JzW21ham9yXSkge1xuICAgICAgICAgIG5lZWRlZFRyYW5zbGF0aW9ucy5wdXNoKC4uLm1ham9yTWlub3JUcmFuc2xhdG9yc1ttYWpvcl1bbWlub3JdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZWVkZWRUcmFuc2xhdGlvbnM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBHZXRNYXhpbXVtTWlub3JJbmRleChtaW5vclZlcnNpb25zOiBBcnJheTxzdHJpbmc+KTogbnVtYmVyIHtcbiAgcmV0dXJuIG1pbm9yVmVyc2lvbnMubWFwKChhKSA9PiBOdW1iZXIoYSkpLnJlZHVjZSgoYSwgYikgPT4gKGEgPiBiID8gYSA6IGIpKTtcbn1cbiIsImltcG9ydCB7XG4gIENsYXNzTmFtZUtleSxcbiAgRXhlY3V0ZVBhcmFtZXRlcnMsXG4gIEV4ZWN1dGVSZXNwb25zZSxcbiAgRXh0ZW5zaW9uQm9vdHN0cmFwSW5mbyxcbiAgRXh0ZW5zaW9uQ29udGV4dCxcbiAgTm90aWZpY2F0aW9uLFxuICBWZXJiSWQsXG59IGZyb20gJy4uL0pzQXBpSW50ZXJuYWxDb250cmFjdCc7XG5pbXBvcnQgeyBWaXN1YWxJZCwgV29ya2Jvb2tGb3JtYXR0aW5nIH0gZnJvbSAnLi4vY29udHJhY3QvTW9kZWxzJztcbmltcG9ydCB7IE5vdGlmaWNhdGlvbklkIH0gZnJvbSAnLi4vY29udHJhY3QvTm90aWZpY2F0aW9ucyc7XG5cbi8vIHRzbGludDpkaXNhYmxlOm5vLWFueVxuXG4vKiogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB3ZSByZWNlaXZlIG9sZCB2ZXJzIGFuZCBwYXJhbWV0ZXJzIGZyb20gdGhlIGV4dGVybmFsIGJlZm9yZSB3ZSBzZW5kIGl0IHRvIHBsYXRmb3JtICovXG5leHBvcnQgdHlwZSBVcGdyYWRlRXhlY3V0ZUNhbGwgPSAodmVyYjogVmVyYklkLCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycykgPT4geyB2ZXJiOiBWZXJiSWQ7IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzIH07XG5cbi8qKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHdlIHJlY2VpdmVkIGEgcmVzcG9uc2UgYmFjayBmcm9tIHBsYXRmb3JtIGFuZCB3ZSBuZWVkIHRvIGRvd25ncmFkZSBpdCB0byBleHRlcm5hbCdzIHZlcnNpb24gKi9cbmV4cG9ydCB0eXBlIERvd25ncmFkZUV4ZWN1dGVSZXR1cm4gPSAoZXhlY3V0ZVJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UpID0+IEV4ZWN1dGVSZXNwb25zZTtcblxuLyoqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gd2UgcmVjZWl2ZSBhIG5vdGlmaWNhdGlvbiBmcm9tIHBsYXRmb3JtIGFuZCB3ZSBuZWVkIHRvIGRvd25ncmFkZSBpdCB0byBleHRlcm5hbCdzIHZlcnNpb24gKi9cbmV4cG9ydCB0eXBlIERvd25ncmFkZU5vdGlmaWNhdGlvbiA9IChub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbikgPT4gTm90aWZpY2F0aW9uO1xuXG4vLyBUaGlzIGlzIHdoZXJlIHdlIHdpbGwgc3RhcnQgdG8gZGVmaW5lIHNvbWUgb2YgdGhlc2UgdHJhbnNsYXRpb25zLlxuLy8gV2hlbiBtb2RpZnlpbmcgZXhpc3RpbmcgbW9kZWxzLCBhZGQgdGhlIHJlcXVpc2l0ZSBjb252ZXJzaW9uIGZ1bmN0aW9ucyBoZXJlLCB0aGVuIHVzZSB0aGVtXG4vLyBpbiB0aGUgVmVyc2lvbkNvbnZlcnRlckZhY3RvcnkgaW1wbGVtZW50YXRpb24uIEltcG9ydCBvbGQgdmVyc2lvbnMgYXMgeW91IHdvdWxkIGFueSBvdGhlciBtb2R1bGVcblxuLy8gMCA8LT4gVHJhbnNsYXRpb25zXG4vLyBVbmNvbW1lbnQgdGhpcyBsaW5lIHRvIGltcG9ydCBmcm9tIHRoZSBWMCBkZWZpbml0aW9uIG9mIHRoZSBBUElcbi8vIGltcG9ydCAqIGFzIFYwIGZyb20gJ0B0YWJsZWF1LWFwaS1pbnRlcm5hbC1jb250cmFjdC1qc192MCc7XG5cbi8vIDEgPC0+IDIgVHJhbnNsYXRpb25zXG4vLyBVbmNvbW1lbnQgdGhpcyBsaW5lIHRvIGltcG9ydCBmcm9tIHRoZSBWMSBkZWZpbml0aW9uIG9mIHRoZSBBUElcbi8vIGltcG9ydCAqIGFzIFYxIGZyb20gJ0B0YWJsZWF1LWFwaS1pbnRlcm5hbC1jb250cmFjdC1qc192MSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBEb3duZ3JhZGVXb3Jrc2hlZXROYW1lcyhleGVjdXRlUmVzcG9uc2U6IEV4ZWN1dGVSZXNwb25zZSk6IEV4ZWN1dGVSZXNwb25zZSB7XG4gIC8vIEZpeCB0aGUgZGFzaGJvYXJkIGZyaWVuZGx5IG5hbWUgaXNzdWUuIFRoZSBzdHJ1Y3R1cmVzIGFyZSBjb21wYXRpYmxlLFxuICAvLyBzbyB3ZSBzdGlsbCByZXR1cm4gdGhlIG9yaWdpbmFsIHJlcGx5LCBidXQgd2UgY29weSB0aGUgU2hlZXRJbmZvLm5hbWVcbiAgLy8gaW50byB0aGUgRGFzaGJvYXJkWm9uZS5uYW1lLCB3aGVyZSB2MSB3YW50cyB0byBmaW5kIGl0LlxuXG4gIGNvbnN0IGJvb3RzdHJhcEluZm8gPSBleGVjdXRlUmVzcG9uc2UucmVzdWx0IGFzIEV4dGVuc2lvbkJvb3RzdHJhcEluZm87XG4gIGlmIChib290c3RyYXBJbmZvLmV4dGVuc2lvbkRhc2hib2FyZEluZm8gIT09IHVuZGVmaW5lZCkge1xuICAgIGJvb3RzdHJhcEluZm8uZXh0ZW5zaW9uRGFzaGJvYXJkSW5mby56b25lcy5mb3JFYWNoKCh6b25lKSA9PiB7XG4gICAgICBpZiAoem9uZS5zaGVldEluZm8pIHtcbiAgICAgICAgem9uZS5uYW1lID0gem9uZS5zaGVldEluZm8ubmFtZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBleGVjdXRlUmVzcG9uc2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBEb3duZ3JhZGVGbGlwYm9hcmRab25lSUQobm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24pOiBOb3RpZmljYXRpb24ge1xuICAvLyBGaXggdGhlIEZsaXBib2FyZFpvbmVJZCBpc3N1ZS4gT2xkZXIgZXh0ZXJuYWwgdmVyc2lvbnMgc3RpbGwgY2hlY2sgZm9yIGZsaXBib2FyZFpvbmVJRHMuXG4gIC8vIFdoZW4gcnVubmluZyBhZ2FpbnN0IGEgbmV3ZXIgc2VydmVyLCBpZiBmbGlwYm9hcmRab25lSWQgaXMgYWJzZW50LCBzZXQgaXQgdG8gZGVmYXVsdCgwKS5cblxuICBpZiAobm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbklkID09PSBOb3RpZmljYXRpb25JZC5TZWxlY3RlZE1hcmtzQ2hhbmdlZCkge1xuICAgIGNvbnN0IHZpc3VhbE1vZGVsID0gbm90aWZpY2F0aW9uLmRhdGEgYXMgVmlzdWFsSWQ7XG4gICAgaWYgKHZpc3VhbE1vZGVsLmZsaXBib2FyZFpvbmVJRCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB2aXN1YWxNb2RlbC5mbGlwYm9hcmRab25lSUQgPSAwO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBub3RpZmljYXRpb247XG59XG5cbi8vIEZpbHRlciBvdXQgZm9ybWF0dGluZyBzaGVldHMgdGhhdCBhcmUgc3BlY2lmaWVkIGluIHRoZSBjbGFzc05hbWVzIGxpc3RcbmZ1bmN0aW9uIERvd25ncmFkZVdvcmtzaGVldEZvcm1hdHRpbmcoZXhlY3V0ZVJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UsIGNsYXNzTmFtZXM6IENsYXNzTmFtZUtleVtdKTogRXhlY3V0ZVJlc3BvbnNlIHtcbiAgY29uc3QgYm9vdHN0cmFwSW5mbyA9IGV4ZWN1dGVSZXNwb25zZS5yZXN1bHQgYXMgRXh0ZW5zaW9uQm9vdHN0cmFwSW5mbztcblxuICBpZiAoYm9vdHN0cmFwSW5mbz8uZXh0ZW5zaW9uV29ya3NoZWV0SW5mbz8uZm9ybWF0dGluZylcbiAgICBib290c3RyYXBJbmZvLmV4dGVuc2lvbldvcmtzaGVldEluZm8uZm9ybWF0dGluZy5mb3JtYXR0aW5nU2hlZXRzID1cbiAgICAgIGJvb3RzdHJhcEluZm8uZXh0ZW5zaW9uV29ya3NoZWV0SW5mby5mb3JtYXR0aW5nLmZvcm1hdHRpbmdTaGVldHMuZmlsdGVyKCh4KSA9PiAhY2xhc3NOYW1lcy5pbmNsdWRlcyh4LmNsYXNzTmFtZUtleSkpO1xuICByZXR1cm4gZXhlY3V0ZVJlc3BvbnNlO1xufVxuXG4vLyBGaWx0ZXIgb3V0IGZvcm1hdHRpbmcgc2hlZXRzIHRoYXQgYXJlIHNwZWNpZmllZCBpbiB0aGUgY2xhc3NOYW1lcyBsaXN0XG4vLyBGaWx0ZXIgb3V0IGZvcm1hdHRpbmcgc2hlZXRzIHRoYXQgYXJlIHNwZWNpZmllZCBpbiB0aGUgY2xhc3NOYW1lcyBsaXN0XG5mdW5jdGlvbiBEb3duZ3JhZGVXb3Jrc2hlZXRGb3JtYXR0aW5nTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uLCBjbGFzc05hbWVzOiBDbGFzc05hbWVLZXlbXSk6IE5vdGlmaWNhdGlvbiB7XG4gIGlmIChub3RpZmljYXRpb24ubm90aWZpY2F0aW9uSWQgPT09IE5vdGlmaWNhdGlvbklkLldvcmtzaGVldEZvcm1hdHRpbmdDaGFuZ2VkKSB7XG4gICAgY29uc3QgZm9ybWF0dGluZyA9IG5vdGlmaWNhdGlvbi5kYXRhIGFzIFdvcmtib29rRm9ybWF0dGluZztcbiAgICBub3RpZmljYXRpb24uZGF0YSA9IGZvcm1hdHRpbmcuZm9ybWF0dGluZ1NoZWV0cy5maWx0ZXIoKHgpID0+ICFjbGFzc05hbWVzLmluY2x1ZGVzKHguY2xhc3NOYW1lS2V5KSk7XG4gIH1cblxuICByZXR1cm4gbm90aWZpY2F0aW9uO1xufVxuXG4vLyBXZSBhZGRlZCBuZXcgZW51bSB2YWx1ZXMgZm9yIENsYXNzTmFtZUtleXMgZW51bSBpbiAxNzYuIE5lZWQgdG8gZmlsdGVyIHRoZW0gb3V0IGlmIHRoZSBjbGllbnQgdmVyc2lvbiBpcyA8MTc2XG5jb25zdCBDbGFzc05hbWVLZXlzVG9GaWx0ZXIxNzUgPSBbQ2xhc3NOYW1lS2V5LlJvd0RpdmlkZXJzLCBDbGFzc05hbWVLZXkuQ29sdW1uRGl2aWRlcnMsIENsYXNzTmFtZUtleS5QYW5lXTtcblxuZXhwb3J0IGNvbnN0IERvd25ncmFkZVdvcmtzaGVldEZvbWF0dGluZzE3NSA9IChyZXNwb25zZTogRXhlY3V0ZVJlc3BvbnNlKSA9PlxuICBEb3duZ3JhZGVXb3Jrc2hlZXRGb3JtYXR0aW5nKHJlc3BvbnNlLCBDbGFzc05hbWVLZXlzVG9GaWx0ZXIxNzUpO1xuZXhwb3J0IGNvbnN0IERvd25ncmFkZVdvcmtzaGVldEZvbWF0dGluZ05vdGlmaWNhdGlvbjE3NSA9IChub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbikgPT5cbiAgRG93bmdyYWRlV29ya3NoZWV0Rm9ybWF0dGluZ05vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIENsYXNzTmFtZUtleXNUb0ZpbHRlcjE3NSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBEb3duZ3JhZGVFeHRlbnNpb25FbnZpcm9ubWVudENvbnRleHQoZXhlY3V0ZVJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UpOiBFeGVjdXRlUmVzcG9uc2Uge1xuICAvLyBGaXggdGhlIGV4dGVuc2lvbiBlbnZpcm9ubWVudCBjb250ZXh0IGlzc3VlLiBSZXBsYWNlcyBuZXcgZW51bSB2YWx1ZXMgdGhhdCBnbyB1bnJlY29nbml6ZWRcbiAgLy8gYnkgb2xkZXIgZXh0ZW5zaW9ucyB3aXRoIHRoZWlyIHJlc3BlY3RpdmUgb2xkZXIgZW51bSB2YWx1ZXMuXG4gIGNvbnN0IGJvb3RzdHJhcEluZm8gPSBleGVjdXRlUmVzcG9uc2UucmVzdWx0IGFzIEV4dGVuc2lvbkJvb3RzdHJhcEluZm87XG5cbiAgaWYgKGJvb3RzdHJhcEluZm8uZXh0ZW5zaW9uRW52aXJvbm1lbnQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGNvbnRleHQgPSBib290c3RyYXBJbmZvLmV4dGVuc2lvbkVudmlyb25tZW50LmV4dGVuc2lvbkNvbnRleHQ7XG4gICAgaWYgKGNvbnRleHQgPT09IEV4dGVuc2lvbkNvbnRleHQuUHVibGljV2ViIHx8IGNvbnRleHQgPT09IEV4dGVuc2lvbkNvbnRleHQuQ2xvdWQpIHtcbiAgICAgIGJvb3RzdHJhcEluZm8uZXh0ZW5zaW9uRW52aXJvbm1lbnQuZXh0ZW5zaW9uQ29udGV4dCA9IEV4dGVuc2lvbkNvbnRleHQuU2VydmVyO1xuICAgIH0gZWxzZSBpZiAoY29udGV4dCA9PT0gRXh0ZW5zaW9uQ29udGV4dC5QdWJsaWNEZXNrdG9wKSB7XG4gICAgICBib290c3RyYXBJbmZvLmV4dGVuc2lvbkVudmlyb25tZW50LmV4dGVuc2lvbkNvbnRleHQgPSBFeHRlbnNpb25Db250ZXh0LkRlc2t0b3A7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGV4ZWN1dGVSZXNwb25zZTtcbn1cbiIsImltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBFeGVjdXRlUmVzcG9uc2UsIE5vdGlmaWNhdGlvbiwgVmVyYklkIH0gZnJvbSAnLi4vLi4vSnNBcGlJbnRlcm5hbENvbnRyYWN0JztcbmltcG9ydCB7IEV4dGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIH0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcic7XG5cbi8vIHRzbGludDpkaXNhYmxlOm5vLWFueVxuXG4vKipcbiAqIFRoaXMgdmVyc2lvbiBjb252ZXJ0ZXIgZG9lc24ndCBhY3R1YWxseSBkbyBhbnl0aGluZyBidXQgaXMgdXNlZnVsIGZvciB0ZXN0aW5nIG9yIHdoZW4gd2UgaGF2ZVxuICogYSBtYXRjaGluZyBwbGF0Zm9ybSBhbmQgZXh0ZXJuYWwgdmVyc2lvbiBudW1iZXJcbiAqL1xuZXhwb3J0IGNsYXNzIEV4dGVybmFsSWRlbnRpdHlWZXJzaW9uQ29udmVydGVyIGltcGxlbWVudHMgRXh0ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXIge1xuICBwdWJsaWMgZG93bmdyYWRlRXhlY3V0ZUNhbGwodmVyYjogYW55LCBwYXJhbWV0ZXJzOiBhbnkpOiB7IHZlcmI6IFZlcmJJZDsgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgfSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZlcmI6IHZlcmIgYXMgVmVyYklkLFxuICAgICAgcGFyYW1ldGVyczogcGFyYW1ldGVycyBhcyBFeGVjdXRlUGFyYW1ldGVycyxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIHVwZ3JhZGVFeGVjdXRlUmV0dXJuKGV4ZWN1dGVSZXNwb25zZTogRXhlY3V0ZVJlc3BvbnNlLCB2ZXJiOiBWZXJiSWQsIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzKTogRXhlY3V0ZVJlc3BvbnNlIHtcbiAgICByZXR1cm4gZXhlY3V0ZVJlc3BvbnNlO1xuICB9XG5cbiAgcHVibGljIHVwZ3JhZGVOb3RpZmljYXRpb24obm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24pOiBOb3RpZmljYXRpb24ge1xuICAgIHJldHVybiBub3RpZmljYXRpb247XG4gIH1cbn1cbiIsImltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBFeGVjdXRlUmVzcG9uc2UsIE5vdGlmaWNhdGlvbiwgVmVyYklkLCBWZXJzaW9uTnVtYmVyIH0gZnJvbSAnLi4vLi4vSnNBcGlJbnRlcm5hbENvbnRyYWN0JztcbmltcG9ydCB7IEV4dGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIH0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcic7XG5pbXBvcnQgKiBhcyBUcmFuc2xhdGlvbnMgZnJvbSAnLi9FeHRlcm5hbFZlcnNpb25UcmFuc2xhdGlvbnMnO1xuXG4vLyB0c2xpbnQ6ZGlzYWJsZTpuby1hbnlcbi8qKlxuICogVGhlIHZlcnNpb24gY29udmVydGVyIGlzIGRlc2lnbmVkIHRvIGFsbG93IHRoZSBwbGF0Zm9ybSBhbmQgZXh0ZXJuYWwgbW9kdWxlc1xuICogdG8gc2VlbWxlc3NseSBjb21tdW5pY2F0ZSBvdmVyIHR3byBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhlIGludGVybmFsIEFQSS4gVGhpcyBjb252ZXJ0ZXJcbiAqIHN1cHBvcnRzIGV4dGVybmFsJ3MgdmVyc2lvbihtaW5vcikgPj0gcGxhdGZvcm0ncyB2ZXJzaW9uKG1pbm9yKS4gV2hlbiBleGVjdXRpbmdcbiAqIGNvbW1hbmRzLCBpdCBpcyB1c2VkIHRvIGRvd25ncmFkZSB0aGUgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb24gdG8gd2hhdCBwbGF0Zm9ybSBrbm93cyBvbiB0aGUgd2F5IGluXG4gKiBhbmQgdXBncmFkZSB0aGUgcmVwcmVzZW50YXRpb25zIG9uIHRoZSB3YXkgb3V0LlxuICovXG5leHBvcnQgY2xhc3MgRXh0ZXJuYWxTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIgaW1wbGVtZW50cyBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXJcbiAgICpcbiAgICogQHBhcmFtIF9leHRlcm5hbFZlcnNpb24gVGhlIHZlcnNpb24gb2YgdGhlIGludGVybmFsIGNvbnRyYWN0IGFwaS1leHRlcm5hbC1qcyBpcyB1c2luZ1xuICAgKiBAcGFyYW0gX3BsYXRmb3JtVmVyc2lvbiBUaGUgdmVyc2lvbiBvZiB0aGUgaW50ZXJuYWwgY29udHJhY3QgdGhlIGFwaS1wbGF0Zm9ybS1qcyBpcyB1c2luZ1xuICAgKiBAcGFyYW0gX2Rvd25ncmFkZUV4ZWN1dGVDYWxsVHJhbnNsYXRpb25zIE9yZGVyZWQgbGlzdCBvZiB0aGUgdHJhbnNsYXRpb25zIHRvIHBlcmZvcm0gd2hlbiBkb3duZ3JhZGluZyBjbWQgcGFyYW1ldGVyc1xuICAgKiBAcGFyYW0gX3VwZ3JhZGVFeGVjdXRlUmV0dXJuVHJhbnNsYXRpb25zIE9yZGVyZWQgbGlzdCBvZiB1cGdyYWRlIHRyYW5zbGF0aW9ucyB0byBwZXJmb3JtIGFmdGVyIGEgY21kIGlzIGV4ZWN1dGVkXG4gICAqIEBwYXJhbSBfdXBncmFkZU5vdGlmaWNhdGlvblRyYW5zbGF0aW9ucyBPcmRlcmVkIGxpc3Qgb2YgdXBncmFkZSBub3RmaWNhdGlvbnMgdG8gcGVyZm9ybSBvbiBldmVudHNcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9leHRlcm5hbFZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4gICAgcHJpdmF0ZSBfcGxhdGZvcm1WZXJzaW9uOiBWZXJzaW9uTnVtYmVyLFxuICAgIHByaXZhdGUgX2Rvd25ncmFkZUV4ZWN1dGVDYWxsVHJhbnNsYXRpb25zOiBBcnJheTxUcmFuc2xhdGlvbnMuRG93bmdyYWRlRXhlY3V0ZUNhbGw+LFxuICAgIHByaXZhdGUgX3VwZ3JhZGVFeGVjdXRlUmV0dXJuVHJhbnNsYXRpb25zOiBBcnJheTxUcmFuc2xhdGlvbnMuVXBncmFkZUV4ZWN1dGVSZXR1cm4+LFxuICAgIHByaXZhdGUgX3VwZ3JhZGVOb3RpZmljYXRpb25UcmFuc2xhdGlvbnM6IEFycmF5PFRyYW5zbGF0aW9ucy5VcGdyYWRlTm90aWZpY2F0aW9uPixcbiAgKSB7XG4gICAgaWYgKHRoaXMuX2V4dGVybmFsVmVyc2lvbi5tYWpvciA+IHRoaXMuX3BsYXRmb3JtVmVyc2lvbi5tYWpvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY29udmVydCBiZXR3ZWVuIGV4dGVybmFsIHZlcnNpb24gJHt0aGlzLl9leHRlcm5hbFZlcnNpb24ubWFqb3J9XG4gICAgICBhbmQgJHt0aGlzLl9wbGF0Zm9ybVZlcnNpb24ubWFqb3J9YCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGRvd25ncmFkZUV4ZWN1dGVDYWxsKHZlcmI6IGFueSwgcGFyYW1ldGVyczogYW55KTogeyB2ZXJiOiBWZXJiSWQ7IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzIH0ge1xuICAgIC8vIFBlcmZvcm0gdGhlIGRvd25ncmFkZSBvZiB0aGUgdmVyYiBhbmQgcGFyYW1ldGVycyB0byB0aGUgbGV2ZWwgdGhhdCBwbGF0Zm9ybSBpcyB1c2luZ1xuICAgIGxldCBkb3duZ3JhZGVkID0geyB2ZXJiOiB2ZXJiLCBwYXJhbWV0ZXJzOiBwYXJhbWV0ZXJzIH07XG4gICAgZm9yIChjb25zdCBkb3duZ3JhZGVUcmFuc2xhdGlvbiBvZiB0aGlzLl9kb3duZ3JhZGVFeGVjdXRlQ2FsbFRyYW5zbGF0aW9ucykge1xuICAgICAgZG93bmdyYWRlZCA9IGRvd25ncmFkZVRyYW5zbGF0aW9uKGRvd25ncmFkZWQudmVyYiwgZG93bmdyYWRlZC5wYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZG93bmdyYWRlZDtcbiAgfVxuXG4gIHB1YmxpYyB1cGdyYWRlRXhlY3V0ZVJldHVybihleGVjdXRlUmVzcG9uc2U6IEV4ZWN1dGVSZXNwb25zZSwgdmVyYjogVmVyYklkLCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyk6IEV4ZWN1dGVSZXNwb25zZSB7XG4gICAgLy8gUGVyZm9ybSB0aGUgdXBncmFkZSBvZiB0aGUgcmVzcG9uc2UgdG8gd2hhdCB0aGUgZXh0ZXJuYWwgbW9kdWxlIGlzIGV4cGVjdGluZ1xuICAgIGxldCB1cGdyYWRlZCA9IGV4ZWN1dGVSZXNwb25zZTtcbiAgICBmb3IgKGNvbnN0IHVwZ3JhZGVUcmFuc2xhdGlvbiBvZiB0aGlzLl91cGdyYWRlRXhlY3V0ZVJldHVyblRyYW5zbGF0aW9ucykge1xuICAgICAgdXBncmFkZWQgPSB1cGdyYWRlVHJhbnNsYXRpb24odXBncmFkZWQsIHZlcmIsIHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIHJldHVybiB1cGdyYWRlZDtcbiAgfVxuXG4gIHB1YmxpYyB1cGdyYWRlTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uKTogTm90aWZpY2F0aW9uIHtcbiAgICAvLyBQZXJmb3JtIHRoZSB1cGdyYWRlIG9mIG5vdGlmaWNhdGlvbiB0byB3aGF0IHRoZSBleHRlcm5hbCBtb2R1bGUgaXMgZXhwZWN0aW5nXG4gICAgbGV0IHVwZ3JhZGVkID0gbm90aWZpY2F0aW9uO1xuICAgIGZvciAoY29uc3QgdXBncmFkZU5vdGlmaWNhdGlvbiBvZiB0aGlzLl91cGdyYWRlTm90aWZpY2F0aW9uVHJhbnNsYXRpb25zKSB7XG4gICAgICB1cGdyYWRlZCA9IHVwZ3JhZGVOb3RpZmljYXRpb24odXBncmFkZWQpO1xuICAgIH1cblxuICAgIHJldHVybiB1cGdyYWRlZDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVmVyc2lvbk51bWJlciB9IGZyb20gJy4uLy4uL0pzQXBpSW50ZXJuYWxDb250cmFjdCc7XG5pbXBvcnQgeyBHZXRNYXhpbXVtTWlub3JJbmRleCwgTWFqb3JNaW5vclRyYW5zbGF0b3JzLCBWZXJzaW9uRXF1YWxUbyB9IGZyb20gJy4uL1ZlcnNpb25Db252ZXJ0ZXJGYWN0b3J5JztcbmltcG9ydCB7IEV4dGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIH0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcic7XG5pbXBvcnQgeyBFeHRlcm5hbElkZW50aXR5VmVyc2lvbkNvbnZlcnRlciB9IGZyb20gJy4vRXh0ZXJuYWxJZGVudGl0eVZlcnNpb25Db252ZXJ0ZXInO1xuaW1wb3J0IHsgRXh0ZXJuYWxTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIgfSBmcm9tICcuL0V4dGVybmFsU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyJztcbmltcG9ydCAqIGFzIFRyYW5zbGF0aW9uc0V4dGVybmFsIGZyb20gJy4vRXh0ZXJuYWxWZXJzaW9uVHJhbnNsYXRpb25zJztcblxuLy8gQSBtYXBwaW5nIGZyb20gdGhlIGN1cnJlbnQgY2xpZW50IHZlcnNpb24gb2YgaW50ZXJuYWwtY29udHJhY3QgdG8gYW4gb2xkZXIgcGxhdGZvcm0gdmVyc2lvbiBvZiB0aGUgY29udHJhY3QuXG4vLyBFYWNoIHZlcnNpb24gYnVtcCBjYW4gaGF2ZSBhbiBhcnJheSBvZiB0cmFuc2xhdGlvbnMgdG8gcGVyZm9ybSBpbiBvcmRlci5cbi8vIFRoZXNlIHRyYW5zbGF0aW9ucyBoYW5kbGUgZG93bmdyYWRlRXhlY3V0ZUNhbGwgYW5kIHVwZ3JhZGVFeGVjdXRlUmV0dXJuIGFuZCBhcmUgbWVhbnQgdG8gYmUgY2FsbGVkIG9uIHRoZVxuLy8gY2xpZW50L2V4dGVybmFsIHNpZGUuXG4vLyBXaGVuIHVwZGF0aW5nIHRoZSBtYWpvciBvciBtaW5vciB2ZXJzaW9uIG9mIG91ciBpbnRlcm5hbC1jb250cmFjdCwgeW91IHdpbGwgbmVlZCB0byB1cGRhdGUgdGhlc2UgZGF0YSBzdHJ1Y3R1cmVzLlxuLy8gKiBJZiB0aGVyZSBhcmUgdHJhbnNsYXRpb25zIHRvIGFkZCwgYWRkIHRoZW0gdG8gdGhlIHZlcnNpb24gdG8gJ3VwZ3JhZGUgZnJvbScgb3IgJ2Rvd25ncmFkZSB0bycuXG5leHBvcnQgY29uc3QgRXhlY3V0ZU1pbm9yRG93bmdyYWRlQ2FsbEV4dGVybmFsOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VHJhbnNsYXRpb25zRXh0ZXJuYWwuRG93bmdyYWRlRXhlY3V0ZUNhbGw+ID0ge1xuICAxOiB7XG4gICAgOTogW10sIC8vIE5vdGUgdGhhdCB3ZSBwdXQgZG93bmdyYWRlcyBmcm9tIDEuMTAgdG8gMS45IGluIHRoZSBbMV1bOV0gYnVja2V0XG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgRXhlY3V0ZU1pbm9yVXBncmFkZVJldHVybkV4dGVybmFsOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VHJhbnNsYXRpb25zRXh0ZXJuYWwuVXBncmFkZUV4ZWN1dGVSZXR1cm4+ID0ge1xuICAxOiB7XG4gICAgOTogW10sIC8vIE5vdGUgdGhhdCB3ZSBwdXQgdXBncmFkZXMgZnJvbSAxLjkgdG8gMS4xMCBpbiB0aGUgWzFdWzldIGJ1Y2tldFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IEV4ZWN1dGVNaW5vclVwZ3JhZGVOb3RpZmljYXRpb246IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnNFeHRlcm5hbC5VcGdyYWRlTm90aWZpY2F0aW9uPiA9IHtcbiAgMToge1xuICAgIDk6IFtdLCAvLyBOb3RlIHRoYXQgd2UgcHV0IHVwZ3JhZGVzIGZyb20gMS45IHRvIDEuMTAgaW4gdGhlIFsxXVs5XSBidWNrZXRcbiAgfSxcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB3aGljaCBoYXMgdGhlIGFiaWxpdHkgdG8gdXBncmFkZSBhbmQgZG93bmdyYWRlXG4gKiB0aGUgY29udHJhY3QgYmV0d2VlbiB0aGUgdHdvIHZlcnNpb25zIHdoaWNoIGFyZSBzcGVjaWZpZWQuIElmIGV4dGVybmFsTWFqb3JWZXJzaW9uIGlzIGxlc3MgdGhhblxuICogcGxhdGZvcm1NYWpvclZlcnNpb24sIGFuIEV4dGVybmFsSWRlbnRpdHlWZXJzaW9uQ29udmVydGVyIHdpbGwgYmUgcmV0dXJuZWQuXG4gKiBIYW5kbGVzIHVwZ3JhZGUvZG93bmdyYWRlIGZvciBib3RoIG1ham9yIGFuZCBtaW5vciB1cGRhdGVzLlxuICpcbiAqIEBwYXJhbSBleHRlcm5hbFZlcnNpb24gVmVyc2lvbk51bWJlciBvZiB0aGUgaW50ZXJuYWwgYXBpIHdoaWNoIHRoZSBleHRlcm5hbCBtb2R1bGUgaXMgdXNpbmdcbiAqIEBwYXJhbSBwbGF0Zm9ybVZlcnNpb24gVmVyc2lvbk51bWJlciBvZiB0aGUgaW50ZXJuYWwgYXBpIHdoaWNoIHRoZSBwbGF0Zm9ybSBpcyB1c2luZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gQ3JlYXRlRXh0ZXJuYWxDb21wYXRpYmxlVmVyc2lvbkNvbnZlcnRlcihcbiAgZXh0ZXJuYWxWZXJzaW9uOiBWZXJzaW9uTnVtYmVyLFxuICBwbGF0Zm9ybVZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4pOiBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB7XG4gIHJldHVybiBDcmVhdGVFeHRlcm5hbENvbXBhdGlibGVWZXJzaW9uQ29udmVydGVyV2l0aFRyYW5zbGF0b3JzKFxuICAgIGV4dGVybmFsVmVyc2lvbixcbiAgICBwbGF0Zm9ybVZlcnNpb24sXG4gICAgRXhlY3V0ZU1pbm9yRG93bmdyYWRlQ2FsbEV4dGVybmFsLFxuICAgIEV4ZWN1dGVNaW5vclVwZ3JhZGVSZXR1cm5FeHRlcm5hbCxcbiAgICBFeGVjdXRlTWlub3JVcGdyYWRlTm90aWZpY2F0aW9uLFxuICApO1xufVxuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIENyZWF0ZUV4dGVybmFsQ29tcGF0aWJsZVZlcnNpb25Db252ZXJ0ZXJXaXRoVHJhbnNsYXRvcnMuXG4gKiBUaGlzIGZ1bmN0aW9uIHRha2VzIHRoZSB1cGdyYWRlLCBkb3duZ3JhZGUgYXJyYXlzIHNvIHRoYXQgYWxsIHRoZSBsb2dpYyBjYW4gYmUgdGVzdGVkLlxuICpcbiAqIEBwYXJhbSBleHRlcm5hbFZlcnNpb24gVmVyc2lvbk51bWJlciBvZiB0aGUgaW50ZXJuYWwgY29udHJhY3Qgd2hpY2ggdGhlIGV4dGVybmFsIG1vZHVsZSBpcyB1c2luZ1xuICogQHBhcmFtIHBsYXRmb3JtVmVyc2lvbiBWZXJzaW9uTnVtYmVyIG9mIHRoZSBpbnRlcm5hbCBjb250cmFjdCB3aGljaCB0aGUgcGxhdGZvcm0gaXMgdXNpbmdcbiAqIEBwYXJhbSB1cGdyYWRlcyBNYWpvck1pbm9yVHJhbnNsYXRvcnMgZm9yIHJlc3BvbnNlIHVwZ3JhZGVzXG4gKiBAcGFyYW0gZG93bmdyYWRlcyBNYWpvck1pbm9yVHJhbnNsYXRvcnMgZm9yIGV4ZWN1dGUgY2FsbCBkb3duZ3JhZGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDcmVhdGVFeHRlcm5hbENvbXBhdGlibGVWZXJzaW9uQ29udmVydGVyV2l0aFRyYW5zbGF0b3JzKFxuICBleHRlcm5hbFZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4gIHBsYXRmb3JtVmVyc2lvbjogVmVyc2lvbk51bWJlcixcbiAgZG93bmdyYWRlczogTWFqb3JNaW5vclRyYW5zbGF0b3JzPFRyYW5zbGF0aW9uc0V4dGVybmFsLkRvd25ncmFkZUV4ZWN1dGVDYWxsPixcbiAgdXBncmFkZXM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnNFeHRlcm5hbC5VcGdyYWRlRXhlY3V0ZVJldHVybj4sXG4gIHVwZ3JhZGVOb3RpZmljYXRpb25zOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VHJhbnNsYXRpb25zRXh0ZXJuYWwuVXBncmFkZU5vdGlmaWNhdGlvbj4sXG4pOiBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB7XG4gIGNvbnN0IGV4dGVybmFsTWFqb3JWZXJzaW9uOiBudW1iZXIgPSBleHRlcm5hbFZlcnNpb24ubWFqb3I7XG4gIGNvbnN0IHBsYXRmb3JtTWFqb3JWZXJzaW9uOiBudW1iZXIgPSBwbGF0Zm9ybVZlcnNpb24ubWFqb3I7XG4gIGNvbnN0IHBsYXRmb3JtTWlub3JWZXJzaW9uOiBudW1iZXIgPSBwbGF0Zm9ybVZlcnNpb24ubWlub3I7XG5cbiAgLy8gVGhpcyBjaGVjayBpcyBwcmVzZW50IGluIFZlcnNpb25Db252ZXJ0ZXJGYWN0b3J5LiBXZSB0aHJvdyB0aGUgc2FtZSBlcnJvciBoZXJlIGFzIHdlbGwuXG4gIC8vIEhlbmNlIHdlIG9ubHkgbmVlZCB0byBjaGVjayB0aGUgbWlub3IgdmVyc2lvbnMgZm9yIHRyYW5zbGF0aW9ucy5cbiAgaWYgKGV4dGVybmFsTWFqb3JWZXJzaW9uID4gcGxhdGZvcm1NYWpvclZlcnNpb24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEV4dGVybmFsIHZlcnNpb24gbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gcGxhdGZvcm0gdmVyc2lvbi5cbiAgICBleHRlcm5hbE1ham9yVmVyc2lvbj0ke2V4dGVybmFsTWFqb3JWZXJzaW9ufSBwbGF0Zm9ybU1ham9yVmVyc2lvbj0ke3BsYXRmb3JtTWFqb3JWZXJzaW9ufWApO1xuICB9XG5cbiAgaWYgKGV4dGVybmFsTWFqb3JWZXJzaW9uIDwgcGxhdGZvcm1NYWpvclZlcnNpb24gfHwgVmVyc2lvbkVxdWFsVG8oZXh0ZXJuYWxWZXJzaW9uLCBwbGF0Zm9ybVZlcnNpb24pKSB7XG4gICAgcmV0dXJuIG5ldyBFeHRlcm5hbElkZW50aXR5VmVyc2lvbkNvbnZlcnRlcigpO1xuICB9XG5cbiAgLy8gV2FsayB0aGUgc3BhbiBiZXR3ZWVuIHRoZSB2ZXJzaW9ucyB3ZSBoYXZlIGhlcmUgYW5kIGNvbGxlY3QgdGhlIHVwZ3JhZGUgYW5kIGRvd25ncmFkZXMgbmVjZXNzYXJ5XG4gIGNvbnN0IG5lZWRlZEV4ZWN1dGVDYWxsRG93bmdyYWRlOiBBcnJheTxUcmFuc2xhdGlvbnNFeHRlcm5hbC5Eb3duZ3JhZGVFeGVjdXRlQ2FsbD4gPSBHZXROZWVkZWRFeHRlcm5hbFRyYW5zbGF0aW9ucyhcbiAgICBwbGF0Zm9ybU1ham9yVmVyc2lvbixcbiAgICBwbGF0Zm9ybU1pbm9yVmVyc2lvbixcbiAgICBkb3duZ3JhZGVzLFxuICApO1xuXG4gIGNvbnN0IG5lZWRlZEV4ZWN1dGVSZXR1cm5VcGdyYWRlczogQXJyYXk8VHJhbnNsYXRpb25zRXh0ZXJuYWwuVXBncmFkZUV4ZWN1dGVSZXR1cm4+ID0gR2V0TmVlZGVkRXh0ZXJuYWxUcmFuc2xhdGlvbnMoXG4gICAgcGxhdGZvcm1NYWpvclZlcnNpb24sXG4gICAgcGxhdGZvcm1NaW5vclZlcnNpb24sXG4gICAgdXBncmFkZXMsXG4gICk7XG5cbiAgY29uc3QgbmVlZGVkTm90aWZpY2F0aW9uVXBncmFkZXM6IEFycmF5PFRyYW5zbGF0aW9uc0V4dGVybmFsLlVwZ3JhZGVOb3RpZmljYXRpb24+ID0gR2V0TmVlZGVkRXh0ZXJuYWxUcmFuc2xhdGlvbnMoXG4gICAgcGxhdGZvcm1NYWpvclZlcnNpb24sXG4gICAgcGxhdGZvcm1NaW5vclZlcnNpb24sXG4gICAgdXBncmFkZU5vdGlmaWNhdGlvbnMsXG4gICk7XG5cbiAgLy8gUmV2ZXJzZSB0aGUgZG93bmdyYWRlIGNhbGxzLCBzbyB0aGF0IHdlIHN0YXJ0IHRoZSBkb3duZ3JhZGUgZnJvbSB0aGUgZXh0ZXJuYWwgdmVyc2lvbiB0byB0aGUgcGxhdGZvcm0gdmVyc2lvblxuICBuZWVkZWRFeGVjdXRlQ2FsbERvd25ncmFkZS5yZXZlcnNlKCk7XG4gIHJldHVybiBuZXcgRXh0ZXJuYWxTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIoXG4gICAgZXh0ZXJuYWxWZXJzaW9uLFxuICAgIHBsYXRmb3JtVmVyc2lvbixcbiAgICBuZWVkZWRFeGVjdXRlQ2FsbERvd25ncmFkZSxcbiAgICBuZWVkZWRFeGVjdXRlUmV0dXJuVXBncmFkZXMsXG4gICAgbmVlZGVkTm90aWZpY2F0aW9uVXBncmFkZXMsXG4gICk7XG59XG5cbmZ1bmN0aW9uIEdldE5lZWRlZEV4dGVybmFsVHJhbnNsYXRpb25zPFQ+KFxuICBwbGF0Zm9ybU1ham9yVmVyc2lvbjogbnVtYmVyLFxuICBwbGF0Zm9ybU1pbm9yVmVyc2lvbjogbnVtYmVyLFxuICBtYWpvck1pbm9yVHJhbnNsYXRvcnM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUPixcbik6IEFycmF5PFQ+IHtcbiAgY29uc3QgbmVlZGVkVHJhbnNsYXRpb25zOiBBcnJheTxUPiA9IFtdO1xuXG4gIGlmIChwbGF0Zm9ybU1ham9yVmVyc2lvbiBpbiBtYWpvck1pbm9yVHJhbnNsYXRvcnMpIHtcbiAgICBjb25zdCBzdGFydCA9IHBsYXRmb3JtTWlub3JWZXJzaW9uO1xuICAgIGNvbnN0IG1heGltdW1NaW5vclZlcnNpb24gPSBHZXRNYXhpbXVtTWlub3JJbmRleChPYmplY3Qua2V5cyhtYWpvck1pbm9yVHJhbnNsYXRvcnNbcGxhdGZvcm1NYWpvclZlcnNpb25dKSk7XG4gICAgZm9yIChsZXQgbWlub3IgPSBzdGFydDsgbWlub3IgPD0gbWF4aW11bU1pbm9yVmVyc2lvbjsgbWlub3IrKykge1xuICAgICAgaWYgKG1pbm9yIGluIG1ham9yTWlub3JUcmFuc2xhdG9yc1twbGF0Zm9ybU1ham9yVmVyc2lvbl0pIHtcbiAgICAgICAgbmVlZGVkVHJhbnNsYXRpb25zLnB1c2goLi4ubWFqb3JNaW5vclRyYW5zbGF0b3JzW3BsYXRmb3JtTWFqb3JWZXJzaW9uXVttaW5vcl0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZWVkZWRUcmFuc2xhdGlvbnM7XG59XG4iLCIvLyBFeHBvcnQgZXZlcnl0aGluZyB3aGljaCBoYWQgYmVlbiBwcmV2aW91c2x5IGluIHRoZSBhcGktc2hhcmVkIG1vZHVsZVxuXG5leHBvcnQgeyBBcGlWZXJzaW9uIH0gZnJvbSAnLi9BcGlTaGFyZWQvQXBpVmVyc2lvbic7XG5leHBvcnQgKiBmcm9tICcuL0FwaVNoYXJlZC9Dcm9zc0ZyYW1lL0Nyb3NzRnJhbWVCb290c3RyYXAnO1xuZXhwb3J0IHsgQ3Jvc3NGcmFtZURpc3BhdGNoZXIgfSBmcm9tICcuL0FwaVNoYXJlZC9Dcm9zc0ZyYW1lL0Nyb3NzRnJhbWVEaXNwYXRjaGVyJztcbmV4cG9ydCB7IERhdGFTb3VyY2UgfSBmcm9tICcuL0FwaVNoYXJlZC9EYXRhU291cmNlJztcbmV4cG9ydCB7IEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyB9IGZyb20gJy4vQXBpU2hhcmVkL0VudW1NYXBwaW5ncy9FeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MnO1xuZXhwb3J0IHsgSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzIH0gZnJvbSAnLi9BcGlTaGFyZWQvRW51bU1hcHBpbmdzL0ludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyc7XG5leHBvcnQgeyBFdmVudExpc3RlbmVyTWFuYWdlciB9IGZyb20gJy4vQXBpU2hhcmVkL0V2ZW50TGlzdGVuZXJNYW5hZ2VyJztcbmV4cG9ydCB7IEZpZWxkIH0gZnJvbSAnLi9BcGlTaGFyZWQvRmllbGQnO1xuZXhwb3J0IHsgQ3VzdG9tVmlld0ltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL0N1c3RvbVZpZXdJbXBsJztcbmV4cG9ydCB7IERhc2hib2FyZEltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL0Rhc2hib2FyZEltcGwnO1xuZXhwb3J0IHsgRGFzaGJvYXJkT2JqZWN0SW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvRGFzaGJvYXJkT2JqZWN0SW1wbCc7XG5leHBvcnQgeyBEYXRhU291cmNlSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvRGF0YVNvdXJjZUltcGwnO1xuZXhwb3J0IHsgUGFyYW1ldGVySW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvUGFyYW1ldGVySW1wbCc7XG5leHBvcnQgeyBTaGVldEltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL1NoZWV0SW1wbCc7XG5leHBvcnQgeyBTaGVldEluZm9JbXBsIH0gZnJvbSAnLi9BcGlTaGFyZWQvSW1wbC9TaGVldEluZm9JbXBsJztcbmV4cG9ydCB7IFNpbmdsZUV2ZW50TWFuYWdlckltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL1NpbmdsZUV2ZW50TWFuYWdlckltcGwnO1xuZXhwb3J0IHsgU3RvcnlJbXBsIH0gZnJvbSAnLi9BcGlTaGFyZWQvSW1wbC9TdG9yeUltcGwnO1xuZXhwb3J0IHsgU3RvcnlQb2ludEltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL1N0b3J5UG9pbnRJbXBsJztcbmV4cG9ydCB7IFN0b3J5UG9pbnRJbmZvSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvU3RvcnlQb2ludEluZm9JbXBsJztcbmV4cG9ydCB7IFdvcmtib29rSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvV29ya2Jvb2tJbXBsJztcbmV4cG9ydCB7IFdvcmtzaGVldEltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL1dvcmtzaGVldEltcGwnO1xuZXhwb3J0IHsgUG9pbnQgfSBmcm9tICcuL0FwaVNoYXJlZC9Qb2ludCc7XG5leHBvcnQgeyBBbm5vdGF0aW9uU2VydmljZSB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL0Fubm90YXRpb25TZXJ2aWNlJztcbmV4cG9ydCB7IERhdGFTb3VyY2VTZXJ2aWNlIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvRGF0YVNvdXJjZVNlcnZpY2UnO1xuZXhwb3J0IHsgRXhwb3J0U2VydmljZSB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL0V4cG9ydFNlcnZpY2UnO1xuZXhwb3J0IHsgRmlsdGVyU2VydmljZSB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL0ZpbHRlclNlcnZpY2UnO1xuZXhwb3J0IHsgR2V0RGF0YVNlcnZpY2UgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9HZXREYXRhU2VydmljZSc7XG5leHBvcnQgeyBOb3RpZmljYXRpb25TZXJ2aWNlLCBVbnJlZ2lzdGVyRm4gfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9Ob3RpZmljYXRpb25TZXJ2aWNlJztcbmV4cG9ydCB7IFBhcmFtZXRlcnNTZXJ2aWNlIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvUGFyYW1ldGVyc1NlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvUmVnaXN0ZXJBbGxTaGFyZWRTZXJ2aWNlcyc7XG5leHBvcnQgeyBTZWxlY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvU2VsZWN0aW9uU2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnknO1xuZXhwb3J0IHsgU2l6ZVNlcnZpY2UgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9TaXplU2VydmljZSc7XG5leHBvcnQgeyBTdG9yeUFjdGl2YXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvU3RvcnlBY3RpdmF0aW9uU2VydmljZSc7XG5leHBvcnQgeyBWaXpTZXJ2aWNlIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvVml6U2VydmljZSc7XG5leHBvcnQgeyBDbGllbnRJbmZvU2VydmljZUltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL0NsaWVudEluZm9TZXJ2aWNlSW1wbCc7XG5leHBvcnQgeyBOb3RpZmljYXRpb25TZXJ2aWNlSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvTm90aWZpY2F0aW9uU2VydmljZUltcGwnO1xuZXhwb3J0IHsgTm90aWZpY2F0aW9uU2VydmljZUltcGxCYXNlLCBSZWdpc3RyYXRpb24gfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL05vdGlmaWNhdGlvblNlcnZpY2VJbXBsQmFzZSc7XG5leHBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1NlcnZpY2VJbXBsQmFzZSc7XG5leHBvcnQgeyBTaXplU2VydmljZUltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1NpemVTZXJ2aWNlSW1wbCc7XG5leHBvcnQgeyBTdG9yeUFjdGl2YXRpb25TZXJ2aWNlSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvU3RvcnlBY3RpdmF0aW9uU2VydmljZUltcGwnO1xuZXhwb3J0IHsgU2luZ2xlRXZlbnRNYW5hZ2VyIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2luZ2xlRXZlbnRNYW5hZ2VyJztcbmV4cG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4vQXBpU2hhcmVkL1RhYmxlYXVFcnJvcic7XG5leHBvcnQgeyBEZWZlcnJlZCB9IGZyb20gJy4vQXBpU2hhcmVkL1V0aWxzL0RlZmVycmVkJztcbmV4cG9ydCB7IEVycm9ySGVscGVycyB9IGZyb20gJy4vQXBpU2hhcmVkL1V0aWxzL0Vycm9ySGVscGVycyc7XG5leHBvcnQgeyBFeHBvcnRIZWxwZXJzIH0gZnJvbSAnLi9BcGlTaGFyZWQvVXRpbHMvRXhwb3J0SGVscGVycyc7XG5leHBvcnQgeyBTaGVldFV0aWxzIH0gZnJvbSAnLi9BcGlTaGFyZWQvVXRpbHMvU2hlZXRVdGlscyc7XG5leHBvcnQgeyBWZXJzaW9uTnVtYmVyIH0gZnJvbSAnLi9BcGlTaGFyZWQvVmVyc2lvbk51bWJlcic7XG5leHBvcnQgeyBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIgfSBmcm9tICcuL1ZlcnNpb25lZEV4dGVybmFsQXBpRGlzcGF0Y2hlcic7XG4iLCJpbXBvcnQgeyBWZXJzaW9uTnVtYmVyIH0gZnJvbSAnLi9WZXJzaW9uTnVtYmVyJztcbmltcG9ydCB7IFZlcnNpb25OdW1iZXJDb250cmFjdCB9IGZyb20gJy4vVmVyc2lvbk51bWJlckNvbnRyYWN0JztcblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBzaW5nbGV0b24gd3JhcHBlciBvZiBWZXJzaW9uTnVtYmVyXG4gKi9cbmV4cG9ydCBjbGFzcyBBcGlWZXJzaW9uIHtcbiAgLy8gVXNpbmcgc29tZSB3ZWJwYWNrIHRyaWNrcywgd2UgY2FuIGluamVjdCB0aGlzIHZlcnNpb24gaW50byBvdXIgY29kZSAoa2luZGEgbGlrZSBjKysgcHJlcHJvY2Vzc29yIHN0dWZmKVxuICBwcml2YXRlIHN0YXRpYyBfaW5zdGFuY2U6IFZlcnNpb25OdW1iZXJDb250cmFjdDtcblxuICAvKipcbiAgICogR2V0cyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSB2ZXJzaW9uIG51bWJlci5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0IEluc3RhbmNlKCk6IFZlcnNpb25OdW1iZXJDb250cmFjdCB7XG4gICAgcmV0dXJuIEFwaVZlcnNpb24uX2luc3RhbmNlO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBTZXRWZXJzaW9uTnVtYmVyKG51bVN0cmluZzogc3RyaW5nLCBpc0FscGhhOiBib29sZWFuKTogdm9pZCB7XG4gICAgQXBpVmVyc2lvbi5faW5zdGFuY2UgPSBuZXcgVmVyc2lvbk51bWJlcihudW1TdHJpbmcsIGlzQWxwaGEpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQ29ubmVjdGlvbkRlc2NyaXB0aW9uU3VtbWFyeSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgYSBjb25uZWN0aW9uIHN1bW1hcnkuXG4gKiBUaGlzIGRvZXMgbm90IGZvbGxvdyB0aGUgSW1wbCBwYXR0ZXJuIGFzIGl0IGlzIGp1c3QgYSBwcm9wZXJ0eSBiYWcuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb25uZWN0aW9uU3VtbWFyeSBpbXBsZW1lbnRzIENvbnRyYWN0LkNvbm5lY3Rpb25TdW1tYXJ5IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2Nvbm5lY3Rpb25JbmZvOiBDb25uZWN0aW9uRGVzY3JpcHRpb25TdW1tYXJ5KSB7fVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jb25uZWN0aW9uSW5mby5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jb25uZWN0aW9uSW5mby5pZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2VydmVyVVJJKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2Nvbm5lY3Rpb25JbmZvLnNlcnZlclVSSTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jb25uZWN0aW9uSW5mby50eXBlO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSxcbiAgQ3Jvc3NGcmFtZU1lc3NlbmdlcixcbiAgSW5pdGlhbGl6YXRpb25PcHRpb25zLFxuICBNRVNTQUdJTkdfVkVSU0lPTiBhcyBBcGlNZXNzYWdpbmdWZXJzaW9uLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQ3Jvc3NGcmFtZURpc3BhdGNoZXIgfSBmcm9tICcuL0Nyb3NzRnJhbWVEaXNwYXRjaGVyJztcblxuLy8gQ2hlY2tzIHRvIHNlZSBpZiB3ZSBhcmUgcnVubmluZyBpbiBhbiBpZnJhbWUgY3VycmVudGx5OiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzI2MDc2Lzg4MjExNTNcbmZ1bmN0aW9uIGluSWZyYW1lKHRoaXNXaW5kb3c6IFdpbmRvdyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHJldHVybiB0aGlzV2luZG93LnNlbGYgIT09IHRoaXNXaW5kb3cucGFyZW50O1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBBdHRlbXB0cyB0byBib290c3RyYXAgdGhlIGV4dGVuc2lvbiB3aXRoIGEgY3Jvc3MtZnJhbWUgcGFyZW50IHdoZXJlIFRhYmxlYXUgaXMgcnVubmluZ1xuICpcbiAqIEBwYXJhbSB0aGlzV2luZG93IFRoZSB3aW5kb3cgd2hpY2ggd2UgYXJlIHJ1bm5pbmcgaW4gKGluamVjdGVkIGZvciB1bml0IHRlc3RpbmcgcHVycG9zZXMpXG4gKiBAcGFyYW0gaW50ZXJuYWxDb250cmFjdFZlcnNpb24gVGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBpbnRlcm5hbCBjb250cmFjdCB3ZSBhcmUgdXNpbmdcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB3aGljaCBpcyBkb2luZyB0aGUgYWN0dWFsIGJvb3RzdHJhcHBpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRvQ3Jvc3NGcmFtZUJvb3RzdHJhcChcbiAgdGhpc1dpbmRvdzogV2luZG93LFxuICBpbnRlcm5hbENvbnRyYWN0VmVyc2lvbjogQ29udHJhY3QuVmVyc2lvbk51bWJlcixcbiAgb3B0aW9uczogSW5pdGlhbGl6YXRpb25PcHRpb25zLFxuKTogUHJvbWlzZTxDb250cmFjdC5JbnRlcm5hbEFwaURpc3BhdGNoZXJGYWN0b3J5PiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZTxDb250cmFjdC5JbnRlcm5hbEFwaURpc3BhdGNoZXJGYWN0b3J5PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgbGV0IHBhcmVudDogV2luZG93O1xuXG4gICAgLy8gTm9ybWFsbHksIHdlIGFyZSBydW5uaW5nIGluc2lkZSBhbiBpZnJhbWUuICBUaGUgZXhjZXB0aW9uIHRvIHRoaXMgaXNcbiAgICAvLyB3aGVuIHdlIGFyZSBydW5uaW5nIGFzIGFuIGV4dGVuc2lvbiBpbnNpZGUgYSBkaWFsb2cgYXMgcGFydCBvZiB0aGUgVUlOYW1lc3BhY2VcbiAgICAvLyBmdW5jdGlvbmFsaXR5LiAgSW4gdGhhdCBjYXNlLCB3ZSB3YW50IHRoZSBvcGVuZXIgb2YgdGhpcyB3aW5kb3cgcmF0aGVyIHRoYW4gdGhlIHBhcmVudC5cbiAgICBpZiAoIWluSWZyYW1lKHRoaXNXaW5kb3cpKSB7XG4gICAgICBwYXJlbnQgPSB0aGlzV2luZG93Lm9wZW5lcjtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyZW50ID0gdGhpc1dpbmRvdy5wYXJlbnQ7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgIHJlamVjdCgnVGhpcyBleHRlbnNpb24gaXMgbm90IHJ1bm5pbmcgaW5zaWRlIGFuIGlmcmFtZSwgZGVza3RvcCwgb3IgcG9wdXAgd2luZG93LiBJbml0aWFsaXphdGlvbiBmYWlsZWQuJyk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHRoZSBtZXNzZW5nZXIgd2hpY2ggd2lsbCBkbyBoZSBjb21tdW5pY2F0aW9uIGJldHdlZW4gdGhpcyB3aW5kb3cgYW5kIG91ciBwYXJlbnRcbiAgICAvLyBTaW5jZSB3ZSBkb24ndCBrbm93IHdoZXJlIHdlIGFyZSBydW5uaW5nIHlldCwgd2UgaGF2ZSB0byBtYWtlIHRoaXMgaW5pdGlhbCBvcmlnaW4gJyonLiBPbmNlXG4gICAgLy8gd2UgaGF2ZSBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQgb3VyIGV4dGVuc2lvbiwgd2Ugd2lsbCBsaW1pdCB3aGVyZSB3ZSBzZW5kIG1lc3NhZ2VzXG4gICAgY29uc3QgbWVzc2VuZ2VyID0gbmV3IENyb3NzRnJhbWVNZXNzZW5nZXIodGhpc1dpbmRvdywgcGFyZW50LCAnKicpO1xuXG4gICAgLy8gUHJlcGFyZSB0byBzZW5kIGFuIGluaXRpYWxpemF0aW9uIG1lc3NhZ2UgdG8gdGhlIHBhcmVudCBmcmFtZVxuICAgIGNvbnN0IGluaXRpYWxpemF0aW9uTWVzc2FnZSA9IG1lc3Nlbmdlci5wcmVwYXJlSW5pdGlhbGl6YXRpb25NZXNzYWdlKGludGVybmFsQ29udHJhY3RWZXJzaW9uLCBBcGlNZXNzYWdpbmdWZXJzaW9uLCBvcHRpb25zKTtcblxuICAgIC8vIFdoZW4gd2UgcmVjZWl2ZSBhIHJlc3BvbnNlIGJhY2sgZnJvbSB0aGUgcGFyZW50LCB3ZSBjaGVjayB0byBtYWtlIHN1cmUgdGhlIGd1aWRzIG1hdGNoIGFuZCB0aGVuIHdlIGtub3dcbiAgICAvLyB0aGF0IHRoZSBwYXJlbnQgaXMgYXdhcmUgb2YgdXMgYW5kIHdlIGNhbiBzdGFydCBjb21tdW5pY2F0aW5nXG4gICAgbWVzc2VuZ2VyLnNldENvbW1hbmRSZXNwb25zZU1lc3NhZ2VIYW5kbGVyKGZ1bmN0aW9uIChtc2c6IENvbW1hbmRSZXNwb25zZU1lc3NhZ2UpOiB2b2lkIHtcbiAgICAgIC8vIFZlcmlmeSB3ZSBhcmUgZ2V0dGluZyBhIHJlc3BvbnNlIGZyb20gb3VyIGluaXRpYWxpemUgbWVzc2FnZVxuICAgICAgaWYgKG1zZy5jb21tYW5kR3VpZCA9PT0gaW5pdGlhbGl6YXRpb25NZXNzYWdlLm1lc3NhZ2VHdWlkKSB7XG4gICAgICAgIC8vIFRoZSB2ZXJzaW9uaW5nIG9mIHRoZSBkaXNwYXRjaGVyIGhhcHBlbnMgb24gdGhlIG90aGVyIHNpZGUgb2Ygb3VyIGZyYW1lLCBhbmRcbiAgICAgICAgLy8gaW4gYSB3cmFwcGVyIG9uIHRoaXMgc2lkZS4gVGhpcyBvbmUgZG9lc24ndCBoYXZlIGFueSB2ZXJzaW9uIGtub3dsZWRnZS5cbiAgICAgICAgY29uc3QgZGlzcGF0Y2hlckZhY3RvcnkgPSAoKSA9PiBuZXcgQ3Jvc3NGcmFtZURpc3BhdGNoZXIobWVzc2VuZ2VyKTtcbiAgICAgICAgcmVzb2x2ZShkaXNwYXRjaGVyRmFjdG9yeSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBOb3cgdGhhdCBvdXIgaGFuZGxlcnMgYXJlIHJlYWR5LCBzdGFydCBsaXN0ZW5pbmcgYW5kIHNlbmQgb3VyIGluaXRpYWxpemF0aW9uIG1lc3NhZ2VcbiAgICBtZXNzZW5nZXIuc3RhcnRMaXN0ZW5pbmcoKTtcbiAgICBpbml0aWFsaXphdGlvbk1lc3NhZ2Uuc2VuZCgpO1xuICB9KTtcbn1cbiIsImltcG9ydCB7IEVtYmVkZGluZ0Vycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSxcbiAgRXhlY3V0ZVBhcmFtZXRlcnMsXG4gIEV4ZWN1dGVSZXNwb25zZSxcbiAgSW50ZXJuYWxBcGlEaXNwYXRjaGVyLFxuICBNZXNzZW5nZXIsXG4gIE1vZGVsLFxuICBOb3RpZmljYXRpb25IYW5kbGVyLFxuICBOb3RpZmljYXRpb25NZXNzYWdlLFxuICBWZXJiSWQsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuXG4vKipcbiAqIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIEludGVybmFsQXBpRGlzcGF0Y2hlciBpbnRlcmZhY2Ugd2hpY2ggZnVuY3Rpb25zIGJ5IHBhc3NpbmcgbWVzc2FnZXNcbiAqIGFjcm9zcyBhIGZyYW1lIGJvdW5kYXJ5LiBUaGlzIGlzIHVzdWFsbHkgYmV0d2VlbiB0aGUgY29kZSB3aGVyZSBvdXIgamF2c2NyaXB0IGxpYnJhcnkgaGFzIGJlZW4gaW5jbHVkZWRcbiAqIGJ5IGEgM3JkIHBhcnR5IGRldiBhbmQgYW5vdGhlciBmcmFtZSB3aGVyZSBUYWJsZWF1IHNlcnZlciBoYXMgY29udGVudC5cbiAqL1xuZXhwb3J0IGNsYXNzIENyb3NzRnJhbWVEaXNwYXRjaGVyIGltcGxlbWVudHMgSW50ZXJuYWxBcGlEaXNwYXRjaGVyIHtcbiAgLy8gQ29sbGVjdGlvbiBvZiBwZW5kaW5nIHByb21pc2VzIHdoaWNoIGFyZSB3YWl0aW5nIHRvIGJlIHJlc29sdmVkLiBXaGVuIHdlIHJlY2VpdmUgYSByZXNwb25zZSBiYWNrIGZyb20gdGhlIG90aGVyIGZyYW1lLFxuICAvLyB0aGVzZSBwcm9taXNlcyBjYW4gYmUgZWl0aGVyIHJlc29sdmVkIG9yIHJlamVjdGVkXG4gIHByaXZhdGUgX3BlbmRpbmdQcm9taXNlczogeyBbbWVzc2FnZUd1aWQ6IHN0cmluZ106IHsgcmVzb2x2ZTogKHJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UpID0+IHZvaWQ7IHJlamVjdDogKGVycm9yOiBNb2RlbCkgPT4gdm9pZCB9IH0gPVxuICAgIHt9O1xuXG4gIC8vIFRoZSBjb2xsZWN0aW9uIG9mIG5vdGlmaWNhdGlvbiBoYW5kbGVycyB3aGljaCBoYXZlIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoaXMgZGlzcGF0Y2hlclxuICBwcml2YXRlIF9ub3RpZmljYXRpb25IYW5kbGVyczogQXJyYXk8Tm90aWZpY2F0aW9uSGFuZGxlcj4gPSBbXTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBDcm9zc0ZyYW1lRGlzcGF0Y2hlciB3aGljaCB3aWxsIHVzZSB0aGUgZ2l2ZW4gbWVzc2VuZ2VyIHRvIGNvbW11bmljYXRlXG4gICAqIEBwYXJhbSBfbWVzc2VuZ2VyIGFuIGluc3RhbnRpYXRlZCBhbmQgbGlzdGVuaW5nIG1lc3NlbmdlciBvYmplY3RcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9tZXNzZW5nZXI6IE1lc3Nlbmdlcikge1xuICAgIGlmICghdGhpcy5fbWVzc2VuZ2VyKSB7XG4gICAgICB0aHJvdyAnTWlzc2luZyBtZXNzZW5nZXIgb2JqZWN0JztcbiAgICB9XG5cbiAgICAvLyBTZXQgdXAgb3VyIG1lc3NhZ2UgaGFuZGxlcnMuIFdlIG9ubHkgY2FyZSBhYm91dCBpbmNvbWluZyBub3RpZmljYXRpb25zIGFuZCBjb21tYW5kIHJlc3BvbnNlc1xuICAgIHRoaXMuX21lc3Nlbmdlci5zZXRDb21tYW5kUmVzcG9uc2VNZXNzYWdlSGFuZGxlcih0aGlzLm9uQ29tbWFuZFJlc3BvbnNlLmJpbmQodGhpcykpO1xuICAgIHRoaXMuX21lc3Nlbmdlci5zZXROb3RpZmljYXRpb25NZXNzYWdlSGFuZGxlcih0aGlzLm9uTm90aWZpY2F0aW9uLmJpbmQodGhpcykpO1xuICB9XG5cbiAgLy8vLy8vIFN0YXJ0IEludGVybmFsQXBpRGlzcGF0Y2hlciBpbXBsZW1lbnRhdGlvblxuXG4gIHB1YmxpYyBleGVjdXRlKHZlcmI6IFZlcmJJZCwgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMpOiBQcm9taXNlPEV4ZWN1dGVSZXNwb25zZT4ge1xuICAgIC8vIFRvIGV4ZWN1dGUgYSB2ZXJiLCB3ZSBmaXJzdCBwcmVwYXJlIGEgY29tbWFuZCBtZXNzYWdlIGFuZCB0aGVuIGRlZmluZSBhIHByb21pc2UuXG4gICAgY29uc3QgcHJlcGFyZWRNZXNzYWdlID0gdGhpcy5fbWVzc2VuZ2VyLnByZXBhcmVDb21tYW5kTWVzc2FnZSh2ZXJiLCBwYXJhbWV0ZXJzKTtcbiAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2U8RXhlY3V0ZVJlc3BvbnNlPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAvLyBTYXZlIG9mZiB0aGUgcGVuZGluZyBwcm9taXNlIGJ5IHRoZSBtZXNzYWdlR3VpZCB3ZSBhcmUgYWJvdXQgdG8gc2VuZC4gV2hlbiBhIHJlc3BvbnNlIGlzXG4gICAgICAvLyByZWNlaXZlZCwgd2UnbGwgYmUgYWJsZSB0byByZXNvbHZlIHRoaXMgcHJvbWlzZSB3aXRoIHRoZSByZXN1bHRcbiAgICAgIHRoaXMuX3BlbmRpbmdQcm9taXNlc1twcmVwYXJlZE1lc3NhZ2UubWVzc2FnZUd1aWRdID0geyByZXNvbHZlOiByZXNvbHZlLCByZWplY3Q6IHJlamVjdCB9O1xuICAgIH0pO1xuXG4gICAgLy8gQWN0dWFsbHkgc2VuZCB0aGUgbWVzc2FnZSBhbmQgcmV0dXJuIHRoZSBwcm9taXNlXG4gICAgcHJlcGFyZWRNZXNzYWdlLnNlbmQoKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3Rlck5vdGlmaWNhdGlvbkhhbmRsZXIoaGFuZGxlcjogTm90aWZpY2F0aW9uSGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMuX25vdGlmaWNhdGlvbkhhbmRsZXJzLnB1c2goaGFuZGxlcik7XG4gIH1cblxuICBwdWJsaWMgdW5yZWdpc3Rlck5vdGlmaWNhdGlvbkhhbmRsZXIoaGFuZGxlcjogTm90aWZpY2F0aW9uSGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMuX25vdGlmaWNhdGlvbkhhbmRsZXJzID0gdGhpcy5fbm90aWZpY2F0aW9uSGFuZGxlcnMuZmlsdGVyKChoKSA9PiBoICE9PSBoYW5kbGVyKTtcbiAgfVxuXG4gIC8vLy8vLyBFbmQgSW50ZXJuYWxBcGlEaXNwYXRjaGVyIGltcGxlbWVudGF0aW9uXG5cbiAgcHJpdmF0ZSBvbkNvbW1hbmRSZXNwb25zZShyZXNwb25zZTogQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSk6IHZvaWQge1xuICAgIC8vIFdlIGdvdCBhIGNvbW1hbmQgcmVzcG9uc2UsIGxvb2sgdGhyb3VnaCB0aGUgcGVuZGluZyBwcm9taXNlcyBhbmQgcmVzb2x2ZVxuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl9wZW5kaW5nUHJvbWlzZXMpLmluZGV4T2YocmVzcG9uc2UuY29tbWFuZEd1aWQpIDwgMCkge1xuICAgICAgcmV0dXJuOyAvLyBXZSBkb24ndCBoYXZlIGFueSByZWZlcmVuY2UgdG8gdGhpcyBjb21tYW5kLCBqdXN0IHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHBlbmRpbmdQcm9taXNlID0gdGhpcy5fcGVuZGluZ1Byb21pc2VzW3Jlc3BvbnNlLmNvbW1hbmRHdWlkXTtcblxuICAgIC8vIElmIHdlIGhhdmUgYW4gZXJyb3IgZGVmaW5lZCwgcmVqZWN0IHRoZSBwcm9taXNlXG4gICAgaWYgKHJlc3BvbnNlLmVycm9yKSB7XG4gICAgICBwZW5kaW5nUHJvbWlzZS5yZWplY3QocmVzcG9uc2UuZXJyb3IpO1xuICAgIH1cblxuICAgIC8vIElmIHdlIGhhdmUgZGF0YSBkZWZpbmVkLCByZXNvbHZlIHRoZSBwcm9taXNlXG4gICAgaWYgKHJlc3BvbnNlLmRhdGEpIHtcbiAgICAgIHBlbmRpbmdQcm9taXNlLnJlc29sdmUoeyByZXN1bHQ6IHJlc3BvbnNlLmRhdGEgfSk7XG4gICAgfVxuXG4gICAgLy8gQ2xlYW4gdXAgb3VyIHBlbmRpbmcgcHJvbWlzZXMgb2JqZWN0XG4gICAgZGVsZXRlIHRoaXMuX3BlbmRpbmdQcm9taXNlc1tyZXNwb25zZS5jb21tYW5kR3VpZF07XG4gIH1cblxuICBwcml2YXRlIG9uTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbk1lc3NhZ2U6IE5vdGlmaWNhdGlvbk1lc3NhZ2UpOiB2b2lkIHtcbiAgICAvLyBHbyB0aHJvdWdoIGVhY2ggbm90aWZpY2F0aW9uIGhhbmRsZXIgd2UgaGF2ZSByZWdpc3RlcmVkIGFuZCBsZXQgdGhlbSBrbm93IGEgbm90aWZpY2F0aW9uIGNhbWUgaW5cbiAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgdGhpcy5fbm90aWZpY2F0aW9uSGFuZGxlcnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGhhbmRsZXIoeyBub3RpZmljYXRpb25JZDogbm90aWZpY2F0aW9uTWVzc2FnZS5ub3RpZmljYXRpb25JZCwgZGF0YTogbm90aWZpY2F0aW9uTWVzc2FnZS5kYXRhIH0pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBJbmNhc2Ugb2YgYSBJbmNvbXBhdGlibGVWZXJzaW9uRXJyb3IsIHJlLXRocm93IHRoZSBlcnJvci5cbiAgICAgICAgaWYgKChlIGFzIFRhYmxlYXVFcnJvcikuZXJyb3JDb2RlID09PSBFbWJlZGRpbmdFcnJvckNvZGVzLkluY29tcGF0aWJsZVZlcnNpb25FcnJvcikge1xuICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRWxzZSBJZ25vcmUgIHNvIGlmIG9uZSBoYW5kbGVyIGVycm9ycywgdGhlIG90aGVyIHN0aWxsIGdldCB0aGUgbWVzc2FnZS5cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXRhU291cmNlSW1wbCB9IGZyb20gJy4vSW1wbC9EYXRhU291cmNlSW1wbCc7XG5cbmV4cG9ydCBjbGFzcyBEYXRhU291cmNlIGltcGxlbWVudHMgQ29udHJhY3QuRGF0YVNvdXJjZSB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9kYXRhU291cmNlSW1wbDogRGF0YVNvdXJjZUltcGwpIHt9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbXBsLm5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbXBsLmlkO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWVsZHMoKTogQXJyYXk8Q29udHJhY3QuRmllbGQ+IHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwuZmllbGRzO1xuICB9XG5cbiAgcHVibGljIGdldCBleHRyYWN0VXBkYXRlVGltZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5leHRyYWN0VXBkYXRlVGltZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNFeHRyYWN0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5pc0V4dHJhY3Q7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzUHVibGlzaGVkKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5pc1B1Ymxpc2hlZDtcbiAgfVxuXG4gIHB1YmxpYyBwdWJsaXNoZWRVcmwoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwucHVibGlzaGVkVXJsKCk7XG4gIH1cblxuICBwdWJsaWMgcmVmcmVzaEFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5yZWZyZXNoQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBY3RpdmVUYWJsZXNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LlRhYmxlU3VtbWFyeT4+IHtcbiAgICBjb25zb2xlLndhcm4oJ0RhdGFTb3VyY2UuZ2V0QWN0aXZlVGFibGVzQXN5bmMgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBEYXRhU291cmNlLmdldExvZ2ljYWxUYWJsZXNBc3luYy4nKTtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwuZ2V0QWN0aXZlVGFibGVzQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDb25uZWN0aW9uU3VtbWFyaWVzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5Db25uZWN0aW9uU3VtbWFyeT4+IHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwuZ2V0Q29ubmVjdGlvblN1bW1hcmllc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ0RhdGFBc3luYyhvcHRpb25zPzogQ29udHJhY3QuRGF0YVNvdXJjZVVuZGVybHlpbmdEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ0RhdGFTb3VyY2UuZ2V0VW5kZXJseWluZ0RhdGFBc3luYyBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlICcgK1xuICAgICAgICAnRGF0YVNvdXJjZS5nZXRMb2dpY2FsVGFibGVzQXN5bmMgYW5kIERhdGFTb3VyY2UuZ2V0TG9naWNhbFRhYmxlRGF0YUFzeW5jLicsXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwuZ2V0VW5kZXJseWluZ0RhdGFBc3luYyhvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMb2dpY2FsVGFibGVzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5Mb2dpY2FsVGFibGU+PiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbXBsLmdldExvZ2ljYWxUYWJsZXNBc3luYygpO1xuICB9XG5cbiAgcHVibGljIGdldExvZ2ljYWxUYWJsZURhdGFBc3luYyhsb2dpY2FsVGFibGVJZDogc3RyaW5nLCBvcHRpb25zPzogQ29udHJhY3QuRGF0YVNvdXJjZVVuZGVybHlpbmdEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbXBsLmdldExvZ2ljYWxUYWJsZURhdGFBc3luYyhsb2dpY2FsVGFibGVJZCwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TG9naWNhbFRhYmxlRGF0YVJlYWRlckFzeW5jKFxuICAgIGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsXG4gICAgcGFnZVJvd0NvdW50PzogbnVtYmVyLFxuICAgIG9wdGlvbnM/OiBDb250cmFjdC5EYXRhU291cmNlVW5kZXJseWluZ0RhdGFPcHRpb25zLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZVJlYWRlcj4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5nZXRMb2dpY2FsVGFibGVEYXRhUmVhZGVyQXN5bmMobG9naWNhbFRhYmxlSWQsIHBhZ2VSb3dDb3VudCwgb3B0aW9ucyk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIERhdGVSYW5nZVR5cGUgYXMgRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLFxuICBEaWFsb2dTdHlsZSBhcyBFeHRlcm5hbERpYWxvZ1N0eWxlLFxuICBGaWx0ZXJEb21haW5UeXBlIGFzIEV4dGVybmFsRG9tYWluVHlwZSxcbiAgRmlsdGVyTnVsbE9wdGlvbiBhcyBFeHRlcm5hbE51bGxPcHRpb24sXG4gIEZpbHRlclVwZGF0ZVR5cGUgYXMgRXh0ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLFxuICBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgUGVyaW9kVHlwZSxcbiAgUmVwbGF5U3BlZWRUeXBlLFxuICBTaGVldFR5cGUgYXMgRXh0ZXJuYWxTaGVldFR5cGUsXG4gIFpvbmVWaXNpYmlsaXR5VHlwZSxcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIEFwaVNob3dEYXRhVGFibGVGb3JtYXQsXG4gIERhdGVSYW5nZVR5cGUgYXMgSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLFxuICBEYXRlU3RlcFBlcmlvZCxcbiAgRGlhbG9nU3R5bGUgYXMgSW50ZXJuYWxEaWFsb2dTdHlsZSxcbiAgRmlsdGVyRG9tYWluVHlwZSBhcyBJbnRlcm5hbERvbWFpblR5cGUsXG4gIEZpbHRlck51bGxPcHRpb24gYXMgSW50ZXJuYWxOdWxsT3B0aW9uLFxuICBGaWx0ZXJVcGRhdGVUeXBlIGFzIEludGVybmFsRmlsdGVyVXBkYXRlVHlwZSxcbiAgU2hlZXRUeXBlIGFzIEludGVybmFsU2hlZXRUeXBlLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRW51bUNvbnZlcnRlciB9IGZyb20gJy4uL1V0aWxzL0VudW1Db252ZXJ0ZXInO1xuXG4vKiB0c2xpbnQ6ZGlzYWJsZTp0eXBlZGVmIC0gRGlzYWJsZSB0aGlzIHRvIG1ha2UgZGVjbGFyaW5nIHRoZXNlIGNsYXNzZXMgYSBiaXQgZWFzaWVyICovXG4vKipcbiAqIE1hcHMgZW51bXMgdXNlZCBieSB0aGUgZXh0ZXJuYWwtYXBpLWNvbnRyYWN0IHRvIHRoZSBlbnVtcyB1c2VkXG4gKiBpbiB0aGUgaW50ZXJuYWwtYXBpLWNvbnRyYWN0LCB3aGljaCBkZXZlbG9wZXJzIGNvZGUgYWdhaW5zdC5cbiAqL1xuZXhwb3J0IGNsYXNzIEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyB7XG4gIHB1YmxpYyBzdGF0aWMgZmlsdGVyRG9tYWluVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEV4dGVybmFsRG9tYWluVHlwZSwgSW50ZXJuYWxEb21haW5UeXBlPih7XG4gICAgW0V4dGVybmFsRG9tYWluVHlwZS5SZWxldmFudF06IEludGVybmFsRG9tYWluVHlwZS5SZWxldmFudCxcbiAgICBbRXh0ZXJuYWxEb21haW5UeXBlLkRhdGFiYXNlXTogSW50ZXJuYWxEb21haW5UeXBlLkRhdGFiYXNlLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIG51bGxPcHRpb25zID0gbmV3IEVudW1Db252ZXJ0ZXI8RXh0ZXJuYWxOdWxsT3B0aW9uLCBJbnRlcm5hbE51bGxPcHRpb24+KHtcbiAgICBbRXh0ZXJuYWxOdWxsT3B0aW9uLkFsbFZhbHVlc106IEludGVybmFsTnVsbE9wdGlvbi5BbGxWYWx1ZXMsXG4gICAgW0V4dGVybmFsTnVsbE9wdGlvbi5Ob25OdWxsVmFsdWVzXTogSW50ZXJuYWxOdWxsT3B0aW9uLk5vbk51bGxWYWx1ZXMsXG4gICAgW0V4dGVybmFsTnVsbE9wdGlvbi5OdWxsVmFsdWVzXTogSW50ZXJuYWxOdWxsT3B0aW9uLk51bGxWYWx1ZXMsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZmlsdGVyVXBkYXRlVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEV4dGVybmFsRmlsdGVyVXBkYXRlVHlwZSwgSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlPih7XG4gICAgW0V4dGVybmFsRmlsdGVyVXBkYXRlVHlwZS5BZGRdOiBJbnRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuQWRkLFxuICAgIFtFeHRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuQWxsXTogSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLkFsbCxcbiAgICBbRXh0ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLlJlbW92ZV06IEludGVybmFsRmlsdGVyVXBkYXRlVHlwZS5SZW1vdmUsXG4gICAgW0V4dGVybmFsRmlsdGVyVXBkYXRlVHlwZS5SZXBsYWNlXTogSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLlJlcGxhY2UsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgc2V0VmlzaWJpbGl0eVR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxab25lVmlzaWJpbGl0eVR5cGUsIGJvb2xlYW4+KHtcbiAgICBbWm9uZVZpc2liaWxpdHlUeXBlLlNob3ddOiB0cnVlLFxuICAgIFtab25lVmlzaWJpbGl0eVR5cGUuSGlkZV06IGZhbHNlLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIHNldFJlcGxheVNwZWVkVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPFJlcGxheVNwZWVkVHlwZSwgbnVtYmVyPih7XG4gICAgLy8gdGhlc2UgbnVtYmVycyBhcmUgZHVyYXRpb24gbXVsdGlwbGllcnNcbiAgICAvLyAyLjAsIGZvciBleGFtcGxlLCBkb3VibGVzIHRoZSBkdXJhdGlvbiBvZiB0aGUgcmVwbGF5LCBzbG93aW5nIGl0IGRvd24gdG8gMC41eCBzcGVlZFxuICAgIFtSZXBsYXlTcGVlZFR5cGUuU2xvd106IDIuMCxcbiAgICBbUmVwbGF5U3BlZWRUeXBlLk5vcm1hbF06IDEuMCxcbiAgICBbUmVwbGF5U3BlZWRUeXBlLkZhc3RdOiAwLjUsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgc2hlZXRUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8RXh0ZXJuYWxTaGVldFR5cGUsIEludGVybmFsU2hlZXRUeXBlPih7XG4gICAgW0V4dGVybmFsU2hlZXRUeXBlLkRhc2hib2FyZF06IEludGVybmFsU2hlZXRUeXBlLkRhc2hib2FyZCxcbiAgICBbRXh0ZXJuYWxTaGVldFR5cGUuV29ya3NoZWV0XTogSW50ZXJuYWxTaGVldFR5cGUuV29ya3NoZWV0LFxuICAgIFtFeHRlcm5hbFNoZWV0VHlwZS5TdG9yeV06IEludGVybmFsU2hlZXRUeXBlLlN0b3J5LFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIHNob3dEYXRhVGFibGVGb3JtYXRUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sIEFwaVNob3dEYXRhVGFibGVGb3JtYXQ+KHtcbiAgICBbSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uQWxsVmFsdWVzXTogQXBpU2hvd0RhdGFUYWJsZUZvcm1hdC5OYXRpdmVBbmRGb3JtYXR0ZWRWYWx1ZXMsXG4gICAgW0luY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLk9ubHlOYXRpdmVWYWx1ZXNdOiBBcGlTaG93RGF0YVRhYmxlRm9ybWF0Lk5hdGl2ZVZhbHVlc09ubHksXG4gICAgW0luY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLk9ubHlGb3JtYXR0ZWRWYWx1ZXNdOiBBcGlTaG93RGF0YVRhYmxlRm9ybWF0LkZvcm1hdHRlZFZhbHVlc09ubHksXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgcGVyaW9kVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPFBlcmlvZFR5cGUsIERhdGVTdGVwUGVyaW9kPih7XG4gICAgW1BlcmlvZFR5cGUuWWVhcnNdOiBEYXRlU3RlcFBlcmlvZC5ZZWFycyxcbiAgICBbUGVyaW9kVHlwZS5RdWFydGVyc106IERhdGVTdGVwUGVyaW9kLlF1YXJ0ZXJzLFxuICAgIFtQZXJpb2RUeXBlLk1vbnRoc106IERhdGVTdGVwUGVyaW9kLk1vbnRocyxcbiAgICBbUGVyaW9kVHlwZS5XZWVrc106IERhdGVTdGVwUGVyaW9kLldlZWtzLFxuICAgIFtQZXJpb2RUeXBlLkRheXNdOiBEYXRlU3RlcFBlcmlvZC5EYXlzLFxuICAgIFtQZXJpb2RUeXBlLkhvdXJzXTogRGF0ZVN0ZXBQZXJpb2QuSG91cnMsXG4gICAgW1BlcmlvZFR5cGUuTWludXRlc106IERhdGVTdGVwUGVyaW9kLk1pbnV0ZXMsXG4gICAgW1BlcmlvZFR5cGUuU2Vjb25kc106IERhdGVTdGVwUGVyaW9kLlNlY29uZHMsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZGF0ZVJhbmdlVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEV4dGVybmFsRGF0ZVJhbmdlVHlwZSwgSW50ZXJuYWxEYXRlUmFuZ2VUeXBlPih7XG4gICAgW0V4dGVybmFsRGF0ZVJhbmdlVHlwZS5MYXN0XTogSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLkxhc3QsXG4gICAgW0V4dGVybmFsRGF0ZVJhbmdlVHlwZS5MYXN0Tl06IEludGVybmFsRGF0ZVJhbmdlVHlwZS5MYXN0TixcbiAgICBbRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLk5leHRdOiBJbnRlcm5hbERhdGVSYW5nZVR5cGUuTmV4dCxcbiAgICBbRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLk5leHROXTogSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLk5leHROLFxuICAgIFtFeHRlcm5hbERhdGVSYW5nZVR5cGUuQ3VycmVudF06IEludGVybmFsRGF0ZVJhbmdlVHlwZS5DdXJyZW50LFxuICAgIFtFeHRlcm5hbERhdGVSYW5nZVR5cGUuVG9EYXRlXTogSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLlRvRGF0ZSxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBkaWFsb2dTdHlsZXMgPSBuZXcgRW51bUNvbnZlcnRlcjxFeHRlcm5hbERpYWxvZ1N0eWxlLCBJbnRlcm5hbERpYWxvZ1N0eWxlPih7XG4gICAgW0V4dGVybmFsRGlhbG9nU3R5bGUuV2luZG93XTogSW50ZXJuYWxEaWFsb2dTdHlsZS5XaW5kb3csXG4gICAgW0V4dGVybmFsRGlhbG9nU3R5bGUuTW9kYWxdOiBJbnRlcm5hbERpYWxvZ1N0eWxlLk1vZGFsLFxuICAgIFtFeHRlcm5hbERpYWxvZ1N0eWxlLk1vZGVsZXNzXTogSW50ZXJuYWxEaWFsb2dTdHlsZS5Nb2RlbGVzcyxcbiAgfSk7XG59XG4vKiB0c2xpbnQ6ZW5hYmxlOnR5cGVkZWYgKi9cbiIsImltcG9ydCB7XG4gIEFubm90YXRpb25UeXBlIGFzIEV4dGVybmFsQW5ub3RhdGlvblR5cGUsXG4gIENsYXNzTmFtZUtleSBhcyBFeHRlcm5hbENsYXNzTmFtZUtleSxcbiAgQ29sdW1uVHlwZSBhcyBFeHRlcm5hbENvbHVtblR5cGUsXG4gIERhc2hib2FyZE9iamVjdFR5cGUgYXMgRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLFxuICBEYXRhVHlwZSBhcyBFeHRlcm5hbERhdGFUeXBlLFxuICBQZXJpb2RUeXBlIGFzIEV4dGVybmFsRGF0ZVBlcmlvZCxcbiAgRGF0ZVJhbmdlVHlwZSBhcyBFeHRlcm5hbERhdGVSYW5nZVR5cGUsXG4gIEVycm9yQ29kZXMgYXMgRXh0ZXJuYWxFcnJvckNvZGVzLFxuICBFeHRlbnNpb25Db250ZXh0IGFzIEV4dGVybmFsRXh0ZW5zaW9uc0NvbnRleHQsXG4gIEV4dGVuc2lvbk1vZGUgYXMgRXh0ZXJuYWxFeHRlbnNpb25zTW9kZSxcbiAgRmllbGRBZ2dyZWdhdGlvblR5cGUgYXMgRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZSxcbiAgRmllbGRSb2xlVHlwZSBhcyBFeHRlcm5hbEZpZWxkUm9sZVR5cGUsXG4gIEZpbHRlclR5cGUgYXMgRXh0ZXJuYWxGaWx0ZXJUeXBlLFxuICBGaWx0ZXJVcGRhdGVUeXBlIGFzIEV4dGVybmFsRmlsdGVyVXBkYXRlVHlwZSxcbiAgSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZSBhcyBFeHRlcm5hbEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUsXG4gIE1hcmtUeXBlIGFzIEV4dGVybmFsTWFya1R5cGUsXG4gIFBhcmFtZXRlclZhbHVlVHlwZSBhcyBFeHRlcm5hbFBhcmFtZXRlclZhbHVlVHlwZSxcbiAgU2hlZXRUeXBlIGFzIEV4dGVybmFsU2hlZXRUeXBlLFxufSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQW5ub3RhdGVFbnVtIGFzIEludGVybmFsQW5ub3RhdGlvblR5cGUsXG4gIENsYXNzTmFtZUtleSBhcyBJbnRlcm5hbENsYXNzTmFtZUtleSxcbiAgQ29sdW1uVHlwZSBhcyBJbnRlcm5hbENvbHVtblR5cGUsXG4gIERhc2hib2FyZE9iamVjdFR5cGUgYXMgSW50ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLFxuICBEYXRhVHlwZSBhcyBJbnRlcm5hbERhdGFUeXBlLFxuICBEYXRlUmFuZ2VUeXBlIGFzIEludGVybmFsRGF0ZVJhbmdlVHlwZSxcbiAgRGF0ZVN0ZXBQZXJpb2QgYXMgSW50ZXJuYWxEYXRlU3RlcFBlcmlvZCxcbiAgRG9tYWluUmVzdHJpY3Rpb25UeXBlIGFzIEludGVybmFsRG9tYWluUmVzdHJpY3Rpb25UeXBlLFxuICBFcnJvckNvZGVzIGFzIEludGVybmFsRXJyb3JDb2RlcyxcbiAgRXh0ZW5zaW9uQ29udGV4dCBhcyBJbnRlcm5hbEV4dGVuc2lvbnNDb250ZXh0LFxuICBFeHRlbnNpb25Nb2RlIGFzIEludGVybmFsRXh0ZW5zaW9uc01vZGUsXG4gIEZpZWxkQWdncmVnYXRpb25UeXBlIGFzIEludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUsXG4gIEZpZWxkUm9sZVR5cGUgYXMgSW50ZXJuYWxGaWVsZFJvbGVUeXBlLFxuICBGaWx0ZXJUeXBlIGFzIEludGVybmFsRmlsdGVyVHlwZSxcbiAgRmlsdGVyVXBkYXRlVHlwZSBhcyBJbnRlcm5hbEZpbHRlclVwZGF0ZVR5cGUsXG4gIEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUgYXMgSW50ZXJuYWxIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlLFxuICBNYXJrVHlwZSBhcyBJbnRlcm5hbE1hcmtUeXBlLFxuICBTaGVldFR5cGUgYXMgSW50ZXJuYWxTaGVldFR5cGUsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFbnVtQ29udmVydGVyIH0gZnJvbSAnLi4vVXRpbHMvRW51bUNvbnZlcnRlcic7XG5cbi8qIHRzbGludDpkaXNhYmxlOnR5cGVkZWYgLSBEaXNhYmxlIHRoaXMgdG8gbWFrZSBkZWNsYXJpbmcgdGhlc2UgY2xhc3NlcyBhIGJpdCBlYXNpZXIgKi9cbi8qKlxuICogTWFwcyBlbnVtcyB1c2VkIGJ5IHRoZSBpbnRlcm5hbC1hcGktY29udHJhY3QgdG8gdGhlIGVudW1zIHVzZWRcbiAqIGluIHRoZSBleHRlcm5hbC1hcGktY29udHJhY3QsIHdoaWNoIGRldmVsb3BlcnMgY29kZSBhZ2FpbnN0LlxuICovXG5leHBvcnQgY2xhc3MgSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzIHtcbiAgcHVibGljIHN0YXRpYyBleHRlbnNpb25Db250ZXh0ID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxFeHRlbnNpb25zQ29udGV4dCwgRXh0ZXJuYWxFeHRlbnNpb25zQ29udGV4dD4oe1xuICAgIFtJbnRlcm5hbEV4dGVuc2lvbnNDb250ZXh0LkRlc2t0b3BdOiBFeHRlcm5hbEV4dGVuc2lvbnNDb250ZXh0LkRlc2t0b3AsXG4gICAgW0ludGVybmFsRXh0ZW5zaW9uc0NvbnRleHQuU2VydmVyXTogRXh0ZXJuYWxFeHRlbnNpb25zQ29udGV4dC5TZXJ2ZXIsXG4gICAgW0ludGVybmFsRXh0ZW5zaW9uc0NvbnRleHQuUHVibGljV2ViXTogRXh0ZXJuYWxFeHRlbnNpb25zQ29udGV4dC5QdWJsaWNXZWIsXG4gICAgW0ludGVybmFsRXh0ZW5zaW9uc0NvbnRleHQuUHVibGljRGVza3RvcF06IEV4dGVybmFsRXh0ZW5zaW9uc0NvbnRleHQuUHVibGljRGVza3RvcCxcbiAgICBbSW50ZXJuYWxFeHRlbnNpb25zQ29udGV4dC5DbG91ZF06IEV4dGVybmFsRXh0ZW5zaW9uc0NvbnRleHQuQ2xvdWQsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZXh0ZW5zaW9uTW9kZSA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsRXh0ZW5zaW9uc01vZGUsIEV4dGVybmFsRXh0ZW5zaW9uc01vZGU+KHtcbiAgICBbSW50ZXJuYWxFeHRlbnNpb25zTW9kZS5BdXRob3JpbmddOiBFeHRlcm5hbEV4dGVuc2lvbnNNb2RlLkF1dGhvcmluZyxcbiAgICBbSW50ZXJuYWxFeHRlbnNpb25zTW9kZS5WaWV3aW5nXTogRXh0ZXJuYWxFeHRlbnNpb25zTW9kZS5WaWV3aW5nLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIGNvbHVtblR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbENvbHVtblR5cGUsIEV4dGVybmFsQ29sdW1uVHlwZT4oe1xuICAgIFtJbnRlcm5hbENvbHVtblR5cGUuQ29udGludW91c106IEV4dGVybmFsQ29sdW1uVHlwZS5Db250aW51b3VzLFxuICAgIFtJbnRlcm5hbENvbHVtblR5cGUuRGlzY3JldGVdOiBFeHRlcm5hbENvbHVtblR5cGUuRGlzY3JldGUsXG4gICAgW0ludGVybmFsQ29sdW1uVHlwZS5Vbmtub3duXTogRXh0ZXJuYWxDb2x1bW5UeXBlLlVua25vd24sXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZmllbGRBZ2dyZWdhdGlvblR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLCBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlPih7XG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuQXR0cl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuQXR0cixcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5BdmddOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkF2ZyxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Db2xsZWN0XTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Db2xsZWN0LFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkNvdW50XTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Db3VudCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Db3VudGRdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkNvdW50ZCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5EYXldOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkRheSxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5FbmRdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkVuZCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Ib3VyXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Ib3VyLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkluT3V0XTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Jbk91dCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5LdXJ0b3Npc106IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuS3VydG9zaXMsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTWF4XTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5NYXgsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTWR5XTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5NZHksXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTWVkaWFuXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5NZWRpYW4sXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTWluXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5NaW4sXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTWludXRlXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5NaW51dGUsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTW9udGhZZWFyXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Nb250aFllYXIsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTm9uZV06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTm9uZSxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5RdHJdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlF0cixcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5RdWFydDFdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlF1YXJ0MSxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5RdWFydDNdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlF1YXJ0MyxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5TZWNvbmRdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlNlY29uZCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Ta2V3bmVzc106IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuU2tld25lc3MsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuU3RkZXZdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlN0ZGV2LFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlN0ZGV2cF06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuU3RkZXZwLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlN1bV06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuU3VtLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jRGF5XTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY0RheSxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY0hvdXJdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jSG91cixcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY01pbnV0ZV06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNNaW51dGUsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNNb250aF06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNNb250aCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY1F0cl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNRdHIsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNTZWNvbmRdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jU2Vjb25kLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jV2Vla106IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNXZWVrLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jWWVhcl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNZZWFyLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlVzZXJdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlVzZXIsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVmFyXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5WYXIsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVmFycF06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVmFycCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5XZWVrXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5XZWVrLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLldlZWtkYXldOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLldlZWtkYXksXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuWWVhcl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuWWVhcixcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBmaWVsZFJvbGVUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxGaWVsZFJvbGVUeXBlLCBFeHRlcm5hbEZpZWxkUm9sZVR5cGU+KHtcbiAgICBbSW50ZXJuYWxGaWVsZFJvbGVUeXBlLkRpbWVuc2lvbl06IEV4dGVybmFsRmllbGRSb2xlVHlwZS5EaW1lbnNpb24sXG4gICAgW0ludGVybmFsRmllbGRSb2xlVHlwZS5NZWFzdXJlXTogRXh0ZXJuYWxGaWVsZFJvbGVUeXBlLk1lYXN1cmUsXG4gICAgW0ludGVybmFsRmllbGRSb2xlVHlwZS5Vbmtub3duXTogRXh0ZXJuYWxGaWVsZFJvbGVUeXBlLlVua25vd24sXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgc2hlZXRUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxTaGVldFR5cGUsIEV4dGVybmFsU2hlZXRUeXBlPih7XG4gICAgW0ludGVybmFsU2hlZXRUeXBlLkRhc2hib2FyZF06IEV4dGVybmFsU2hlZXRUeXBlLkRhc2hib2FyZCxcbiAgICBbSW50ZXJuYWxTaGVldFR5cGUuU3RvcnldOiBFeHRlcm5hbFNoZWV0VHlwZS5TdG9yeSxcbiAgICBbSW50ZXJuYWxTaGVldFR5cGUuV29ya3NoZWV0XTogRXh0ZXJuYWxTaGVldFR5cGUuV29ya3NoZWV0LFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIGRhc2hib2FyZE9iamVjdFR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUsIEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZT4oe1xuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuRXh0ZW5zaW9uXTogRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLkV4dGVuc2lvbixcbiAgICBbSW50ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLkJsYW5rXTogRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLkJsYW5rLFxuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuSW1hZ2VdOiBFeHRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuSW1hZ2UsXG4gICAgW0ludGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5MZWdlbmRdOiBFeHRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuTGVnZW5kLFxuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuUGFnZUZpbHRlcl06IEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5QYWdlRmlsdGVyLFxuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuUGFyYW1ldGVyQ29udHJvbF06IEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5QYXJhbWV0ZXJDb250cm9sLFxuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuUXVpY2tGaWx0ZXJdOiBFeHRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuUXVpY2tGaWx0ZXIsXG4gICAgW0ludGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5UZXh0XTogRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLlRleHQsXG4gICAgW0ludGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5UaXRsZV06IEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5UaXRsZSxcbiAgICBbSW50ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLldlYlBhZ2VdOiBFeHRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuV2ViUGFnZSxcbiAgICBbSW50ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLldvcmtzaGVldF06IEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5Xb3Jrc2hlZXQsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZGF0YVR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbERhdGFUeXBlLCBFeHRlcm5hbERhdGFUeXBlPih7XG4gICAgW0ludGVybmFsRGF0YVR5cGUuQm9vbF06IEV4dGVybmFsRGF0YVR5cGUuQm9vbCxcbiAgICBbSW50ZXJuYWxEYXRhVHlwZS5EYXRlXTogRXh0ZXJuYWxEYXRhVHlwZS5EYXRlLFxuICAgIFtJbnRlcm5hbERhdGFUeXBlLkRhdGVUaW1lXTogRXh0ZXJuYWxEYXRhVHlwZS5EYXRlVGltZSxcbiAgICBbSW50ZXJuYWxEYXRhVHlwZS5GbG9hdF06IEV4dGVybmFsRGF0YVR5cGUuRmxvYXQsXG4gICAgW0ludGVybmFsRGF0YVR5cGUuSW50XTogRXh0ZXJuYWxEYXRhVHlwZS5JbnQsXG4gICAgW0ludGVybmFsRGF0YVR5cGUuU3BhdGlhbF06IEV4dGVybmFsRGF0YVR5cGUuU3BhdGlhbCxcbiAgICBbSW50ZXJuYWxEYXRhVHlwZS5TdHJpbmddOiBFeHRlcm5hbERhdGFUeXBlLlN0cmluZyxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBmaWx0ZXJVcGRhdGVUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLCBFeHRlcm5hbEZpbHRlclVwZGF0ZVR5cGU+KHtcbiAgICBbSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLkFkZF06IEV4dGVybmFsRmlsdGVyVXBkYXRlVHlwZS5BZGQsXG4gICAgW0ludGVybmFsRmlsdGVyVXBkYXRlVHlwZS5BbGxdOiBFeHRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuQWxsLFxuICAgIFtJbnRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuUmVtb3ZlXTogRXh0ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLlJlbW92ZSxcbiAgICBbSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLlJlcGxhY2VdOiBFeHRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuUmVwbGFjZSxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBhbGxvd2FibGVWYWx1ZXMgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbERvbWFpblJlc3RyaWN0aW9uVHlwZSwgRXh0ZXJuYWxQYXJhbWV0ZXJWYWx1ZVR5cGU+KHtcbiAgICBbSW50ZXJuYWxEb21haW5SZXN0cmljdGlvblR5cGUuQWxsXTogRXh0ZXJuYWxQYXJhbWV0ZXJWYWx1ZVR5cGUuQWxsLFxuICAgIFtJbnRlcm5hbERvbWFpblJlc3RyaWN0aW9uVHlwZS5MaXN0XTogRXh0ZXJuYWxQYXJhbWV0ZXJWYWx1ZVR5cGUuTGlzdCxcbiAgICBbSW50ZXJuYWxEb21haW5SZXN0cmljdGlvblR5cGUuUmFuZ2VdOiBFeHRlcm5hbFBhcmFtZXRlclZhbHVlVHlwZS5SYW5nZSxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBkYXRlU3RlcFBlcmlvZCA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsRGF0ZVN0ZXBQZXJpb2QsIEV4dGVybmFsRGF0ZVBlcmlvZD4oe1xuICAgIFtJbnRlcm5hbERhdGVTdGVwUGVyaW9kLlllYXJzXTogRXh0ZXJuYWxEYXRlUGVyaW9kLlllYXJzLFxuICAgIFtJbnRlcm5hbERhdGVTdGVwUGVyaW9kLlF1YXJ0ZXJzXTogRXh0ZXJuYWxEYXRlUGVyaW9kLlF1YXJ0ZXJzLFxuICAgIFtJbnRlcm5hbERhdGVTdGVwUGVyaW9kLk1vbnRoc106IEV4dGVybmFsRGF0ZVBlcmlvZC5Nb250aHMsXG4gICAgW0ludGVybmFsRGF0ZVN0ZXBQZXJpb2QuV2Vla3NdOiBFeHRlcm5hbERhdGVQZXJpb2QuV2Vla3MsXG4gICAgW0ludGVybmFsRGF0ZVN0ZXBQZXJpb2QuRGF5c106IEV4dGVybmFsRGF0ZVBlcmlvZC5EYXlzLFxuICAgIFtJbnRlcm5hbERhdGVTdGVwUGVyaW9kLkhvdXJzXTogRXh0ZXJuYWxEYXRlUGVyaW9kLkhvdXJzLFxuICAgIFtJbnRlcm5hbERhdGVTdGVwUGVyaW9kLk1pbnV0ZXNdOiBFeHRlcm5hbERhdGVQZXJpb2QuTWludXRlcyxcbiAgICBbSW50ZXJuYWxEYXRlU3RlcFBlcmlvZC5TZWNvbmRzXTogRXh0ZXJuYWxEYXRlUGVyaW9kLlNlY29uZHMsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZGF0ZVJhbmdlVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsRGF0ZVJhbmdlVHlwZSwgRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlPih7XG4gICAgW0ludGVybmFsRGF0ZVJhbmdlVHlwZS5DdXJyZW50XTogRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLkN1cnJlbnQsXG4gICAgW0ludGVybmFsRGF0ZVJhbmdlVHlwZS5MYXN0XTogRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLkxhc3QsXG4gICAgW0ludGVybmFsRGF0ZVJhbmdlVHlwZS5MYXN0Tl06IEV4dGVybmFsRGF0ZVJhbmdlVHlwZS5MYXN0TixcbiAgICBbSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLk5leHRdOiBFeHRlcm5hbERhdGVSYW5nZVR5cGUuTmV4dCxcbiAgICBbSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLk5leHROXTogRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLk5leHROLFxuICAgIFtJbnRlcm5hbERhdGVSYW5nZVR5cGUuVG9EYXRlXTogRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLlRvRGF0ZSxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBlcnJvckNvZGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbEVycm9yQ29kZXMsIEV4dGVybmFsRXJyb3JDb2Rlcz4oXG4gICAge1xuICAgICAgW0ludGVybmFsRXJyb3JDb2Rlcy5JTklUSUFMSVpBVElPTl9FUlJPUl06IEV4dGVybmFsRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLFxuICAgICAgW0ludGVybmFsRXJyb3JDb2Rlcy5JTlRFUk5BTF9FUlJPUl06IEV4dGVybmFsRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLFxuICAgICAgW0ludGVybmFsRXJyb3JDb2Rlcy5NSVNTSU5HX0VOVU1fTUFQUElOR106IEV4dGVybmFsRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLFxuICAgICAgW0ludGVybmFsRXJyb3JDb2Rlcy5NSVNTSU5HX1BBUkFNRVRFUl06IEV4dGVybmFsRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLFxuICAgICAgW0ludGVybmFsRXJyb3JDb2Rlcy5QRVJNSVNTSU9OX0RFTklFRF06IEV4dGVybmFsRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLFxuICAgICAgW0ludGVybmFsRXJyb3JDb2Rlcy5QUkVTX01PREVMX1BBUlNJTkdfRVJST1JdOiBFeHRlcm5hbEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvcixcbiAgICAgIFtJbnRlcm5hbEVycm9yQ29kZXMuVU5LTk9XTl9WRVJCX0lEXTogRXh0ZXJuYWxFcnJvckNvZGVzLkludGVybmFsRXJyb3IsXG4gICAgICBbSW50ZXJuYWxFcnJvckNvZGVzLlZFUlNJT05fTk9UX0NPTkZJR1VSRURdOiBFeHRlcm5hbEVycm9yQ29kZXMuQVBJTm90SW5pdGlhbGl6ZWQsXG4gICAgICBbSW50ZXJuYWxFcnJvckNvZGVzLlZJU0lCSUxJVFlfRVJST1JdOiBFeHRlcm5hbEVycm9yQ29kZXMuVmlzaWJpbGl0eUVycm9yLFxuICAgIH0sXG4gICAgRXh0ZXJuYWxFcnJvckNvZGVzLkludGVybmFsRXJyb3IsXG4gICk7XG5cbiAgcHVibGljIHN0YXRpYyBmaWx0ZXJUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxGaWx0ZXJUeXBlLCBFeHRlcm5hbEZpbHRlclR5cGU+KHtcbiAgICBbSW50ZXJuYWxGaWx0ZXJUeXBlLkNhdGVnb3JpY2FsXTogRXh0ZXJuYWxGaWx0ZXJUeXBlLkNhdGVnb3JpY2FsLFxuICAgIFtJbnRlcm5hbEZpbHRlclR5cGUuUmFuZ2VdOiBFeHRlcm5hbEZpbHRlclR5cGUuUmFuZ2UsXG4gICAgW0ludGVybmFsRmlsdGVyVHlwZS5SZWxhdGl2ZURhdGVdOiBFeHRlcm5hbEZpbHRlclR5cGUuUmVsYXRpdmVEYXRlLFxuICAgIFtJbnRlcm5hbEZpbHRlclR5cGUuSGllcmFyY2hpY2FsXTogRXh0ZXJuYWxGaWx0ZXJUeXBlLkhpZXJhcmNoaWNhbCxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBjbGFzc05hbWVLZXkgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbENsYXNzTmFtZUtleSwgRXh0ZXJuYWxDbGFzc05hbWVLZXk+KHtcbiAgICBbSW50ZXJuYWxDbGFzc05hbWVLZXkuRGFzaGJvYXJkVGl0bGVdOiBFeHRlcm5hbENsYXNzTmFtZUtleS5EYXNoYm9hcmRUaXRsZSxcbiAgICBbSW50ZXJuYWxDbGFzc05hbWVLZXkuU3RvcnlUaXRsZV06IEV4dGVybmFsQ2xhc3NOYW1lS2V5LlN0b3J5VGl0bGUsXG4gICAgW0ludGVybmFsQ2xhc3NOYW1lS2V5LlRvb2x0aXBdOiBFeHRlcm5hbENsYXNzTmFtZUtleS5Ub29sdGlwLFxuICAgIFtJbnRlcm5hbENsYXNzTmFtZUtleS5Xb3Jrc2hlZXRdOiBFeHRlcm5hbENsYXNzTmFtZUtleS5Xb3Jrc2hlZXQsXG4gICAgW0ludGVybmFsQ2xhc3NOYW1lS2V5LldvcmtzaGVldFRpdGxlXTogRXh0ZXJuYWxDbGFzc05hbWVLZXkuV29ya3NoZWV0VGl0bGUsXG4gICAgW0ludGVybmFsQ2xhc3NOYW1lS2V5LlBhbmVdOiBFeHRlcm5hbENsYXNzTmFtZUtleS5QYW5lLFxuICAgIFtJbnRlcm5hbENsYXNzTmFtZUtleS5Sb3dEaXZpZGVyc106IEV4dGVybmFsQ2xhc3NOYW1lS2V5LlJvd0RpdmlkZXJzLFxuICAgIFtJbnRlcm5hbENsYXNzTmFtZUtleS5Db2x1bW5EaXZpZGVyc106IEV4dGVybmFsQ2xhc3NOYW1lS2V5LkNvbHVtbkRpdmlkZXJzLFxuICAgIC8vIFRlbXBvcmFyeSB1bnRpbCB3ZSBmaXggMTMxNzI2NiAtIFBsYXRmb3JtIGhhc24ndCBiZWVuIHVwZGF0ZWQgY3VycmVudGx5IGJlY2F1c2UgbmVhciBicmFuY2ggaXMgY2xvc2VkXG4gICAgWydkYXNoYm9hcmQtdGl0bGUnXTogRXh0ZXJuYWxDbGFzc05hbWVLZXkuRGFzaGJvYXJkVGl0bGUsXG4gICAgWydzdG9yeS10aXRsZSddOiBFeHRlcm5hbENsYXNzTmFtZUtleS5TdG9yeVRpdGxlLFxuICAgIFsndG9vbHRpcCddOiBFeHRlcm5hbENsYXNzTmFtZUtleS5Ub29sdGlwLFxuICAgIFsnd29ya3NoZWV0J106IEV4dGVybmFsQ2xhc3NOYW1lS2V5LldvcmtzaGVldCxcbiAgICBbJ3dvcmtzaGVldC10aXRsZSddOiBFeHRlcm5hbENsYXNzTmFtZUtleS5Xb3Jrc2hlZXRUaXRsZSxcbiAgICBbJ3BhbmUnXTogRXh0ZXJuYWxDbGFzc05hbWVLZXkuUGFuZSxcbiAgICBbJ3Jvdy1kaXZpZGVycyddOiBFeHRlcm5hbENsYXNzTmFtZUtleS5Sb3dEaXZpZGVycyxcbiAgICBbJ2NvbHVtbi1kaXZpZGVycyddOiBFeHRlcm5hbENsYXNzTmFtZUtleS5Db2x1bW5EaXZpZGVycyxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBoaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlID0gbmV3IEVudW1Db252ZXJ0ZXI8XG4gICAgSW50ZXJuYWxIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlLFxuICAgIEV4dGVybmFsSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZVxuICA+KHtcbiAgICBbSW50ZXJuYWxIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlLkFsbFNlbGVjdGVkXTogRXh0ZXJuYWxIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlLkFsbFNlbGVjdGVkLFxuICAgIFtJbnRlcm5hbEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUuTm9uZVNlbGVjdGVkXTogRXh0ZXJuYWxIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlLk5vbmVTZWxlY3RlZCxcbiAgICBbSW50ZXJuYWxIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlLlNvbWVTZWxlY3RlZF06IEV4dGVybmFsSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZS5Tb21lU2VsZWN0ZWQsXG4gICAgW0ludGVybmFsSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZS5Vbmtub3duU2VsZWN0ZWRdOiBFeHRlcm5hbEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUuVW5rbm93blNlbGVjdGVkLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIGFubm90YXRpb25UeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxBbm5vdGF0aW9uVHlwZSwgRXh0ZXJuYWxBbm5vdGF0aW9uVHlwZT4oe1xuICAgIFtJbnRlcm5hbEFubm90YXRpb25UeXBlLkFyZWFdOiBFeHRlcm5hbEFubm90YXRpb25UeXBlLkFyZWEsXG4gICAgW0ludGVybmFsQW5ub3RhdGlvblR5cGUuTWFya106IEV4dGVybmFsQW5ub3RhdGlvblR5cGUuTWFyayxcbiAgICBbSW50ZXJuYWxBbm5vdGF0aW9uVHlwZS5Qb2ludF06IEV4dGVybmFsQW5ub3RhdGlvblR5cGUuUG9pbnQsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgbWFya1R5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbE1hcmtUeXBlLCBFeHRlcm5hbE1hcmtUeXBlPih7XG4gICAgW0ludGVybmFsTWFya1R5cGUuQXJlYV06IEV4dGVybmFsTWFya1R5cGUuQXJlYSxcbiAgICBbSW50ZXJuYWxNYXJrVHlwZS5CYXJdOiBFeHRlcm5hbE1hcmtUeXBlLkJhcixcbiAgICBbSW50ZXJuYWxNYXJrVHlwZS5DaXJjbGVdOiBFeHRlcm5hbE1hcmtUeXBlLkNpcmNsZSxcbiAgICBbSW50ZXJuYWxNYXJrVHlwZS5HYW50dEJhcl06IEV4dGVybmFsTWFya1R5cGUuR2FudHRCYXIsXG4gICAgW0ludGVybmFsTWFya1R5cGUuSGVhdG1hcF06IEV4dGVybmFsTWFya1R5cGUuSGVhdG1hcCxcbiAgICBbSW50ZXJuYWxNYXJrVHlwZS5MaW5lXTogRXh0ZXJuYWxNYXJrVHlwZS5MaW5lLFxuICAgIFtJbnRlcm5hbE1hcmtUeXBlLk1hcF06IEV4dGVybmFsTWFya1R5cGUuTWFwLFxuICAgIFtJbnRlcm5hbE1hcmtUeXBlLlBpZV06IEV4dGVybmFsTWFya1R5cGUuUGllLFxuICAgIFtJbnRlcm5hbE1hcmtUeXBlLlBvbHlnb25dOiBFeHRlcm5hbE1hcmtUeXBlLlBvbHlnb24sXG4gICAgW0ludGVybmFsTWFya1R5cGUuU2hhcGVdOiBFeHRlcm5hbE1hcmtUeXBlLlNoYXBlLFxuICAgIFtJbnRlcm5hbE1hcmtUeXBlLlNxdWFyZV06IEV4dGVybmFsTWFya1R5cGUuU3F1YXJlLFxuICAgIFtJbnRlcm5hbE1hcmtUeXBlLlRleHRdOiBFeHRlcm5hbE1hcmtUeXBlLlRleHQsXG4gICAgW0ludGVybmFsTWFya1R5cGUuVml6RXh0ZW5zaW9uXTogRXh0ZXJuYWxNYXJrVHlwZS5WaXpFeHRlbnNpb24sXG4gIH0pO1xufVxuLyogdHNsaW50OmVuYWJsZTp0eXBlZGVmICovXG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXJyb3JDb2RlcywgVGFibGVhdUV2ZW50VHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBTaW5nbGVFdmVudE1hbmFnZXIgfSBmcm9tICcuL1NpbmdsZUV2ZW50TWFuYWdlcic7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuL1RhYmxlYXVFcnJvcic7XG5cbi8qKlxuICogQ2xhc3MgZGVzaWduZWQgdG8gcmVnaXN0ZXIgYW5kIHVucmVnaXN0ZXIgaGFuZGxlcnMgZnJvbSBhIHVzZXIuIE9ubHkgdGhvc2UgZXZlbnRzXG4gKiB3aGljaCBhcmUgYWRkZWQgdmlhIEFkZE5ld0V2ZW50VHlwZSB3aWxsIGJlIHN1cHBvcnRlZCBieSB0aGlzIGluc3RhbmNlXG4gKi9cbmV4cG9ydCBjbGFzcyBFdmVudExpc3RlbmVyTWFuYWdlciBpbXBsZW1lbnRzIENvbnRyYWN0LkV2ZW50TGlzdGVuZXJNYW5hZ2VyIHtcbiAgcHJpdmF0ZSBfZXZlbnRMaXN0ZW5lck1hbmFnZXJzOiB7IFt0YWJsZWF1RXZlbnRUeXBlOiBzdHJpbmddOiBTaW5nbGVFdmVudE1hbmFnZXIgfTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5fZXZlbnRMaXN0ZW5lck1hbmFnZXJzID0ge307XG4gIH1cblxuICBwdWJsaWMgYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGU6IFRhYmxlYXVFdmVudFR5cGUsIGhhbmRsZXI6IENvbnRyYWN0LlRhYmxlYXVFdmVudEhhbmRsZXJGbik6IENvbnRyYWN0LlRhYmxlYXVFdmVudFVucmVnaXN0ZXJGbiB7XG4gICAgaWYgKCF0aGlzLl9ldmVudExpc3RlbmVyTWFuYWdlcnMuaGFzT3duUHJvcGVydHkoZXZlbnRUeXBlKSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLlVuc3VwcG9ydGVkRXZlbnROYW1lLCBgQ2Fubm90IGFkZCBldmVudCwgdW5zdXBwb3J0ZWQgZXZlbnQgdHlwZTogJHtldmVudFR5cGV9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2V2ZW50TGlzdGVuZXJNYW5hZ2Vyc1tldmVudFR5cGVdLmFkZEV2ZW50TGlzdGVuZXIoaGFuZGxlcik7XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudFR5cGU6IFRhYmxlYXVFdmVudFR5cGUsIGhhbmRsZXI6IENvbnRyYWN0LlRhYmxlYXVFdmVudEhhbmRsZXJGbik6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5fZXZlbnRMaXN0ZW5lck1hbmFnZXJzLmhhc093blByb3BlcnR5KGV2ZW50VHlwZSkpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5VbnN1cHBvcnRlZEV2ZW50TmFtZSwgYENhbm5vdCByZW1vdmUgZXZlbnQsIHVuc3VwcG9ydGVkIGV2ZW50IHR5cGU6ICR7ZXZlbnRUeXBlfWApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9ldmVudExpc3RlbmVyTWFuYWdlcnNbZXZlbnRUeXBlXS5yZW1vdmVFdmVudExpc3RlbmVyKGhhbmRsZXIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFkZE5ld0V2ZW50VHlwZShldmVudE1hbmFnZXI6IFNpbmdsZUV2ZW50TWFuYWdlcik6IHZvaWQge1xuICAgIHRoaXMuX2V2ZW50TGlzdGVuZXJNYW5hZ2Vyc1tldmVudE1hbmFnZXIuZXZlbnRUeXBlXSA9IGV2ZW50TWFuYWdlcjtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IENvbHVtblR5cGUsIERhdGFUeXBlLCBGaWVsZEFnZ3JlZ2F0aW9uVHlwZSwgRmllbGRSb2xlVHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBGaWVsZEltcGwgfSBmcm9tICcuL0ltcGwvRmllbGRJbXBsJztcblxuZXhwb3J0IGNsYXNzIEZpZWxkIGltcGxlbWVudHMgQ29udHJhY3QuRmllbGQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfZmllbGRJbXBsOiBGaWVsZEltcGwpIHt9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW1wbC5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwuaWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRlc2NyaXB0aW9uKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW1wbC5kZXNjcmlwdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGF0YVR5cGUoKTogRGF0YVR5cGUge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwuZGF0YVR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFnZ3JlZ2F0aW9uKCk6IEZpZWxkQWdncmVnYXRpb25UeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbXBsLmFnZ3JlZ2F0aW9uO1xuICB9XG5cbiAgcHVibGljIGdldCBkYXRhU291cmNlKCk6IENvbnRyYWN0LkRhdGFTb3VyY2Uge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwuZGF0YVNvdXJjZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcm9sZSgpOiBGaWVsZFJvbGVUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbXBsLnJvbGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvbHVtblR5cGUoKTogQ29sdW1uVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW1wbC5jb2x1bW5UeXBlO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0NhbGN1bGF0ZWRGaWVsZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbXBsLmlzQ2FsY3VsYXRlZEZpZWxkO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0NvbWJpbmVkRmllbGQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW1wbC5pc0NvbWJpbmVkRmllbGQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzR2VuZXJhdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwuaXNHZW5lcmF0ZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzR2Vvc3BhdGlhbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbXBsLmlzR2Vvc3BhdGlhbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNIaWRkZW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW1wbC5pc0hpZGRlbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNQcmVzZW50T25QdWJsaXNoZWREYXRhc291cmNlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwuaXNQcmVzZW50T25QdWJsaXNoZWREYXRhc291cmNlO1xuICB9XG59XG4iLCJpbXBvcnQgeyBDdXN0b21WaWV3TW9kZWwgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5LCBTZXJ2aWNlTmFtZXMsIFZpelNlcnZpY2UgfSBmcm9tICcuLi8uLi9BcGlTaGFyZWQnO1xuZXhwb3J0IGNsYXNzIEN1c3RvbVZpZXdJbXBsIHtcbiAgcHJpdmF0ZSBfbHVpZDogc3RyaW5nO1xuICBwcml2YXRlIF9uYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgX3NoYXJlZDogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfaXNEZWZhdWx0OiBib29sZWFuO1xuICBwcml2YXRlIF9vd25lck5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSBfdXJsOiBzdHJpbmc7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihjdXN0b21WaWV3TW9kZWw6IEN1c3RvbVZpZXdNb2RlbCwgcHJpdmF0ZSBfcmVnaXN0cnlJZDogbnVtYmVyKSB7XG4gICAgdGhpcy5fbHVpZCA9IGN1c3RvbVZpZXdNb2RlbC5sdWlkO1xuICAgIHRoaXMuX25hbWUgPSBjdXN0b21WaWV3TW9kZWwubmFtZTtcbiAgICB0aGlzLl9zaGFyZWQgPSBjdXN0b21WaWV3TW9kZWwuc2hhcmVkO1xuICAgIHRoaXMuX2lzRGVmYXVsdCA9IGN1c3RvbVZpZXdNb2RlbC5pc0RlZmF1bHQ7XG4gICAgdGhpcy5fb3duZXJOYW1lID0gY3VzdG9tVmlld01vZGVsLm93bmVyLnVzZXJGcmllbmRseU5hbWU7XG4gICAgdGhpcy5fdXJsID0gY3VzdG9tVmlld01vZGVsLnVybDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbHVpZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbHVpZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fbmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgbmFtZShuYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9uYW1lID0gbmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2hhcmVkKCkge1xuICAgIHJldHVybiB0aGlzLl9zaGFyZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IHNoYXJlZChzaGFyZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9zaGFyZWQgPSBzaGFyZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzRGVmYXVsdCgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNEZWZhdWx0O1xuICB9XG5cbiAgcHVibGljIHNldCBpc0RlZmF1bHQoaXNEZWZhdWx0OiBib29sZWFuKSB7XG4gICAgdGhpcy5faXNEZWZhdWx0ID0gaXNEZWZhdWx0O1xuICB9XG5cbiAgcHVibGljIGdldCBvd25lck5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX293bmVyTmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdXJsKCkge1xuICAgIHJldHVybiB0aGlzLl91cmw7XG4gIH1cblxuICBwdWJsaWMgc2F2ZUFzeW5jKCk6IFByb21pc2U8Q3VzdG9tVmlld0ltcGw+IHtcbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFZpelNlcnZpY2U+KFNlcnZpY2VOYW1lcy5WaXopO1xuICAgIHJldHVybiBzZXJ2aWNlLnNhdmVBc3luYyh0aGlzKTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIERhc2hib2FyZExheW91dENoYW5nZSxcbiAgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlRGV0YWlscyxcbiAgRXJyb3JDb2RlcyxcbiAgU2hhcmVkRXJyb3JDb2RlcyxcbiAgU2hlZXRUeXBlLFxufSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkT2JqZWN0VHlwZSwgRGFzaGJvYXJkWm9uZSwgU2hlZXRQYXRoLCBWaXN1YWxJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MgfSBmcm9tICcuLi9FbnVtTWFwcGluZ3MvSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzJztcbmltcG9ydCB7IFBvaW50IH0gZnJvbSAnLi4vUG9pbnQnO1xuaW1wb3J0IHsgQW5pbWF0aW9uU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0FuaW1hdGlvblNlcnZpY2UnO1xuaW1wb3J0IHsgRmlsdGVyU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0ZpbHRlclNlcnZpY2UnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5LCBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgWm9uZVNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9ab25lU2VydmljZSc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgRXJyb3JIZWxwZXJzIH0gZnJvbSAnLi4vVXRpbHMvRXJyb3JIZWxwZXJzJztcbmltcG9ydCB7IERhc2hib2FyZE9iamVjdEltcGwgfSBmcm9tICcuL0Rhc2hib2FyZE9iamVjdEltcGwnO1xuaW1wb3J0IHsgU2hlZXRJbXBsIH0gZnJvbSAnLi9TaGVldEltcGwnO1xuaW1wb3J0IHsgU2hlZXRJbmZvSW1wbCB9IGZyb20gJy4vU2hlZXRJbmZvSW1wbCc7XG5pbXBvcnQgeyBTdG9yeVBvaW50SW1wbCB9IGZyb20gJy4vU3RvcnlQb2ludEltcGwnO1xuaW1wb3J0IHsgV29ya3NoZWV0SW1wbCB9IGZyb20gJy4vV29ya3NoZWV0SW1wbCc7XG5cbmV4cG9ydCBjbGFzcyBEYXNoYm9hcmRJbXBsIGV4dGVuZHMgU2hlZXRJbXBsIHtcbiAgcHJpdmF0ZSBfd29ya3NoZWV0c0ltcGw6IEFycmF5PFdvcmtzaGVldEltcGw+O1xuICBwcml2YXRlIF9vYmplY3RzOiBBcnJheTxEYXNoYm9hcmRPYmplY3RJbXBsPjtcbiAgcHJpdmF0ZSB6b25lTWFwOiBNYXA8bnVtYmVyLCBEYXNoYm9hcmRPYmplY3RJbXBsPjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgX3NoZWV0SW5mbzogU2hlZXRJbmZvSW1wbCxcbiAgICBwcml2YXRlIF96b25lczogQXJyYXk8RGFzaGJvYXJkWm9uZT4sXG4gICAgcHJpdmF0ZSBfc2hlZXRQYXRoOiBTaGVldFBhdGgsXG4gICAgX3JlZ2lzdHJ5SWQ6IG51bWJlcixcbiAgICBwcml2YXRlIF9wYXJlbnRTdG9yeVBvaW50SW1wbDogU3RvcnlQb2ludEltcGwgfCBudWxsLFxuICAgIHByaXZhdGUgX2FjdGl2ZURhc2hib2FyZE9iamVjdElkOiBudW1iZXIgPSAwLFxuICApIHtcbiAgICBzdXBlcihfc2hlZXRJbmZvLCBfcmVnaXN0cnlJZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHdvcmtzaGVldHNJbXBsKCk6IEFycmF5PFdvcmtzaGVldEltcGw+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0c0ltcGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG9iamVjdHMoKTogQXJyYXk8RGFzaGJvYXJkT2JqZWN0SW1wbD4ge1xuICAgIHJldHVybiB0aGlzLl9vYmplY3RzO1xuICB9XG5cbiAgcHVibGljIGdldCBwYXJlbnRTdG9yeVBvaW50KCk6IFN0b3J5UG9pbnRJbXBsIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudFN0b3J5UG9pbnRJbXBsO1xuICB9XG5cbiAgcHVibGljIGdldCBhY3RpdmVEYXNoYm9hcmRPYmplY3RJZCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9hY3RpdmVEYXNoYm9hcmRPYmplY3RJZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWN0aXZlRGFzaGJvYXJkTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zaGVldFBhdGguc2hlZXROYW1lO1xuICB9XG5cbiAgcHVibGljIGluaXRpYWxpemVXaXRoUHVibGljSW50ZXJmYWNlcygpOiB2b2lkIHtcbiAgICB0aGlzLl93b3Jrc2hlZXRzSW1wbCA9IG5ldyBBcnJheTxXb3Jrc2hlZXRJbXBsPigpO1xuICAgIHRoaXMuX29iamVjdHMgPSBuZXcgQXJyYXk8RGFzaGJvYXJkT2JqZWN0SW1wbD4oKTtcbiAgICB0aGlzLnpvbmVNYXAgPSBuZXcgTWFwPG51bWJlciwgRGFzaGJvYXJkT2JqZWN0SW1wbD4oKTtcblxuICAgIC8vIFByb2Nlc3MgYWxsIHRoZSB6b25lcyB3aGljaCBhcmUgY29udGFpbmVkIGluIHRoaXMgZGFzaGJvYXJkXG4gICAgZm9yIChjb25zdCB6b25lIG9mIHRoaXMuX3pvbmVzKSB7XG4gICAgICBsZXQgd29ya3NoZWV0SW1wbDogV29ya3NoZWV0SW1wbCB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAgICAgY29uc3Qgem9uZVNpemU6IENvbnRyYWN0LlNpemUgPSB7IHdpZHRoOiB6b25lLndpZHRoLCBoZWlnaHQ6IHpvbmUuaGVpZ2h0IH07XG4gICAgICAvLyBBcyB0aGUgZGFzaGJvYXJkIGlzIGFjdGl2ZSwgYWxsIG90aGVyIHpvbmVzIGluIHRoZSBkYXNoYm9hcmQgYXJlIGluYWN0aXZlLlxuICAgICAgY29uc3QgaXNBY3RpdmUgPSBmYWxzZTtcblxuICAgICAgaWYgKHpvbmUuem9uZVR5cGUgPT09IERhc2hib2FyZE9iamVjdFR5cGUuV29ya3NoZWV0IHx8IHpvbmUuem9uZVR5cGUgPT09IERhc2hib2FyZE9iamVjdFR5cGUuUXVpY2tGaWx0ZXIpIHtcbiAgICAgICAgbGV0IHdvcmtzaGVldE5hbWUgPSAnJztcbiAgICAgICAgbGV0IHdvcmtzaGVldFVybCA9ICcnO1xuICAgICAgICBsZXQgaXNIaWRkZW4gPSBmYWxzZTtcbiAgICAgICAgaWYgKHpvbmUuc2hlZXRJbmZvKSB7XG4gICAgICAgICAgLy8gem9uZS5zaGVldEluZm8gd2FzIG5vdCBpbml0aWFsaXplZCBwcmlvciB0byBpbnRlcm5hbC1jb250cmFjdCAxLjYuMFxuICAgICAgICAgIHdvcmtzaGVldE5hbWUgPSB6b25lLnNoZWV0SW5mby5uYW1lO1xuXG4gICAgICAgICAgLy8gd29ya3NoZWV0VXJsICYgaXNIaWRkZW4gaXMgZm9yIEVtYmVkZGluZyBvbmx5XG4gICAgICAgICAgd29ya3NoZWV0VXJsID0gem9uZS5zaGVldEluZm8udXJsIHx8ICcnO1xuICAgICAgICAgIC8vIElmIHRoZXJlJ3MgYSB1cmwsIHRoZW4gaXQncyBub3QgaGlkZGVuXG4gICAgICAgICAgaXNIaWRkZW4gPSB3b3Jrc2hlZXRVcmwgPT09ICcnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHdvcmtzaGVldE5hbWUgPSB6b25lLm5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSW5kZXhlcywgaXNBY3RpdmUgYW5kIHNvbWUgbW9yZSBwcm9wZXJ0aWVzIGluIHNoZWV0SW5mb0ltcGwgYXJlIGVtYmVkZGluZyBzcGVjaWZpYy5cbiAgICAgICAgLy8gQnV0IHdlIGluaXQgdGhlbSBmb3IgYm90aCBleHRlbnNpb25zIGFuZCBlbWJlZGRpbmcgYXMgdGhlIE1vZGVscyB3aWxsIG9ubHkgdXNlIHdoYXQgaXMgcmVsZXZhbnQuXG4gICAgICAgIGNvbnN0IHNoZWV0SW5mb0ltcGwgPSBuZXcgU2hlZXRJbmZvSW1wbChcbiAgICAgICAgICB3b3Jrc2hlZXROYW1lLFxuICAgICAgICAgIFNoZWV0VHlwZS5Xb3Jrc2hlZXQsXG4gICAgICAgICAgem9uZVNpemUsXG4gICAgICAgICAgdGhpcy5fd29ya3NoZWV0c0ltcGwubGVuZ3RoLFxuICAgICAgICAgIGlzQWN0aXZlLFxuICAgICAgICAgIGlzSGlkZGVuLFxuICAgICAgICAgIHdvcmtzaGVldFVybCxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCB2aXpJZDogVmlzdWFsSWQgPSB7XG4gICAgICAgICAgd29ya3NoZWV0OiB3b3Jrc2hlZXROYW1lLFxuICAgICAgICAgIGRhc2hib2FyZDogdGhpcy5fc2hlZXRJbmZvSW1wbC5uYW1lLFxuICAgICAgICAgIHN0b3J5Ym9hcmQ6IHRoaXMuX3NoZWV0UGF0aC5zdG9yeWJvYXJkLFxuICAgICAgICAgIGZsaXBib2FyZFpvbmVJRDogdGhpcy5fc2hlZXRQYXRoLmZsaXBib2FyZFpvbmVJRCxcbiAgICAgICAgICBzdG9yeVBvaW50SUQ6IHRoaXMuX3NoZWV0UGF0aC5zdG9yeVBvaW50SUQsXG4gICAgICAgIH07XG5cbiAgICAgICAgd29ya3NoZWV0SW1wbCA9IG5ldyBXb3Jrc2hlZXRJbXBsKHNoZWV0SW5mb0ltcGwsIHRoaXMuX3JlZ2lzdHJ5SWQsIHZpeklkLCB0aGlzLCB0aGlzLl9wYXJlbnRTdG9yeVBvaW50SW1wbCk7XG4gICAgICAgIGlmICh6b25lLnpvbmVUeXBlID09PSBEYXNoYm9hcmRPYmplY3RUeXBlLldvcmtzaGVldCkge1xuICAgICAgICAgIHRoaXMuX3dvcmtzaGVldHNJbXBsLnB1c2god29ya3NoZWV0SW1wbCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3Qgem9uZVBvaW50ID0gbmV3IFBvaW50KHpvbmUueCwgem9uZS55KTtcblxuICAgICAgY29uc3QgZGFzaGJvYXJkT2JqZWN0SW1wbCA9IG5ldyBEYXNoYm9hcmRPYmplY3RJbXBsKFxuICAgICAgICB0aGlzLFxuICAgICAgICBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MuZGFzaGJvYXJkT2JqZWN0VHlwZS5jb252ZXJ0KHpvbmUuem9uZVR5cGUpLFxuICAgICAgICB6b25lUG9pbnQsXG4gICAgICAgIHpvbmVTaXplLFxuICAgICAgICB3b3Jrc2hlZXRJbXBsLFxuICAgICAgICB6b25lLm5hbWUsXG4gICAgICAgIHpvbmUuaXNGbG9hdGluZyAhPT0gdW5kZWZpbmVkID8gem9uZS5pc0Zsb2F0aW5nIDogZmFsc2UsIC8vIGJlZm9yZSAxLjYuMCB3ZSBkaWRuJ3QgaGF2ZSBpc0Zsb2F0aW5nLCBzbyB3ZSBhc3N1bWUgZmFsc2VcbiAgICAgICAgem9uZS5pc1Zpc2libGUgIT09IHVuZGVmaW5lZCA/IHpvbmUuaXNWaXNpYmxlIDogdHJ1ZSwgLy8gYmVmb3JlIDEuNi4wIHdlIGRpZG4ndCBoYXZlIGlzVmlzaWJsZSwgc28gd2UgYXNzdW1lIHRydWVcbiAgICAgICAgem9uZS56b25lSWQsXG4gICAgICAgIHpvbmUuZmllbGRJZCxcbiAgICAgICk7XG5cbiAgICAgIHRoaXMuX29iamVjdHMucHVzaChkYXNoYm9hcmRPYmplY3RJbXBsKTtcbiAgICAgIHRoaXMuem9uZU1hcC5zZXQoem9uZS56b25lSWQsIGRhc2hib2FyZE9iamVjdEltcGwpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXREYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5QXN5bmMoZGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eU1hcDogQ29udHJhY3QuRGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eU1hcCB8IG9iamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHpvbmVTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFpvbmVTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuWm9uZSk7XG5cbiAgICByZXR1cm4gem9uZVNlcnZpY2Uuc2V0VmlzaWJpbGl0eUFzeW5jKC8qRGFzaGJvYXJkIE5hbWUqLyB0aGlzLm5hbWUsIHRoaXMuem9uZU1hcCwgZGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eU1hcCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RGFzaGJvYXJkT2JqZWN0QnlJZChkYXNoYm9hcmRPYmplY3RJZDogbnVtYmVyKTogRGFzaGJvYXJkT2JqZWN0SW1wbCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuem9uZU1hcC5nZXQoZGFzaGJvYXJkT2JqZWN0SWQpO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZVpvbmVzKG5ld1pvbmVzOiBBcnJheTxEYXNoYm9hcmRab25lPiwgbmV3QWN0aXZlWm9uZUlkID0gMCwgbmV3QWN0aXZlRGFzaGJvYXJkTmFtZSA9ICcnKTogRGFzaGJvYXJkTGF5b3V0Q2hhbmdlRGV0YWlscyB7XG4gICAgLy8gZ2V0dGluZyBwcmV2aW91cyBkYXNoYm9hcmQgb2JqZWN0cywgYWN0aXZlIHpvbmUgSUQgYW5kIGFjdGl2ZSBkYXNoYm9hcmQgbmFtZVxuICAgIGNvbnN0IG9sZERhc2hib2FyZE9iamVjdHMgPSB0aGlzLl9vYmplY3RzO1xuICAgIGNvbnN0IG9sZFpvbmVNYXAgPSB0aGlzLnpvbmVNYXA7XG4gICAgY29uc3Qgb2xkQWN0aXZlWm9uZUlkID0gdGhpcy5fYWN0aXZlRGFzaGJvYXJkT2JqZWN0SWQ7XG4gICAgY29uc3Qgb2xkQWN0aXZlRGFzaGJvYXJkTmFtZSA9IHRoaXMuX3NoZWV0UGF0aC5zaGVldE5hbWU7XG4gICAgLy8gdXBkYXRpbmcgem9uZXMgYW5kIHJlaW5pdGlhbGl6aW5nIGluc3RhbmNlIHZhcmlhYmxlc1xuICAgIHRoaXMuX3pvbmVzID0gbmV3Wm9uZXM7XG4gICAgdGhpcy5fYWN0aXZlRGFzaGJvYXJkT2JqZWN0SWQgPSBuZXdBY3RpdmVab25lSWQ7XG4gICAgaWYgKG5ld0FjdGl2ZURhc2hib2FyZE5hbWUpIHtcbiAgICAgIHRoaXMuX3NoZWV0UGF0aC5zaGVldE5hbWUgPSBuZXdBY3RpdmVEYXNoYm9hcmROYW1lO1xuICAgICAgdGhpcy5fc2hlZXRJbmZvSW1wbC5uYW1lID0gbmV3QWN0aXZlRGFzaGJvYXJkTmFtZTtcbiAgICB9XG4gICAgdGhpcy5pbml0aWFsaXplV2l0aFB1YmxpY0ludGVyZmFjZXMoKTtcbiAgICAvLyBnZXR0aW5nIG5ldyBkYXNoYm9hcmQgb2JqZWN0c1xuICAgIGNvbnN0IG5ld0Rhc2hib2FyZE9iamVjdHMgPSB0aGlzLl9vYmplY3RzO1xuICAgIGNvbnN0IG5ld1pvbmVNYXAgPSB0aGlzLnpvbmVNYXA7XG4gICAgLy8gaW5pdGlhbGl6aW5nIG1hcCBmb3IgY2hhbmdlc1xuICAgIGNvbnN0IHpvbmVDaGFuZ2VzOiBEYXNoYm9hcmRMYXlvdXRDaGFuZ2VEZXRhaWxzID0gbmV3IE1hcCgpO1xuXG4gICAgLy8gY29tcGFyaW5nIG9sZCBkYXNoYm9hcmQgb2JqZWN0cyB3aXRoIG5ldyBvbmVzXG4gICAgb2xkRGFzaGJvYXJkT2JqZWN0cy5mb3JFYWNoKChvbGRPYmplY3QpID0+IHtcbiAgICAgIGNvbnN0IG9sZElkOiBudW1iZXIgPSBvbGRPYmplY3QuaWQ7XG5cbiAgICAgIC8vIGNoZWNraW5nIGlmIHpvbmUgd2FzIHJlbW92ZWRcbiAgICAgIGlmICghbmV3Wm9uZU1hcC5oYXMob2xkSWQpKSB7XG4gICAgICAgIHRoaXMuYWRkQ2hhbmdlKG9sZElkLCB6b25lQ2hhbmdlcywgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlLlJlbW92ZWQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5ld09iamVjdCA9IG5ld1pvbmVNYXAuZ2V0KG9sZElkKTtcbiAgICAgIGlmIChvbGRPYmplY3QuaXNGbG9hdGluZyAhPT0gbmV3T2JqZWN0IS5pc0Zsb2F0aW5nKSB7XG4gICAgICAgIHRoaXMuYWRkQ2hhbmdlKG9sZElkLCB6b25lQ2hhbmdlcywgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlLklzRmxvYXRpbmdDaGFuZ2VkKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9sZE9iamVjdC5pc1Zpc2libGUgIT09IG5ld09iamVjdCEuaXNWaXNpYmxlKSB7XG4gICAgICAgIHRoaXMuYWRkQ2hhbmdlKG9sZElkLCB6b25lQ2hhbmdlcywgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlLklzVmlzaWJsZUNoYW5nZWQpO1xuICAgICAgfVxuXG4gICAgICBpZiAob2xkT2JqZWN0Lm5hbWUgIT09IG5ld09iamVjdCEubmFtZSkge1xuICAgICAgICB0aGlzLmFkZENoYW5nZShvbGRJZCwgem9uZUNoYW5nZXMsIERhc2hib2FyZExheW91dENoYW5nZS5OYW1lQ2hhbmdlZCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvbGRPYmplY3QucG9zaXRpb24ueCAhPT0gbmV3T2JqZWN0IS5wb3NpdGlvbi54IHx8IG9sZE9iamVjdC5wb3NpdGlvbi55ICE9PSBuZXdPYmplY3QhLnBvc2l0aW9uLnkpIHtcbiAgICAgICAgdGhpcy5hZGRDaGFuZ2Uob2xkSWQsIHpvbmVDaGFuZ2VzLCBEYXNoYm9hcmRMYXlvdXRDaGFuZ2UuUG9zaXRpb25DaGFuZ2VkKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9sZE9iamVjdC5zaXplLndpZHRoICE9PSBuZXdPYmplY3QhLnNpemUud2lkdGggfHwgb2xkT2JqZWN0LnNpemUuaGVpZ2h0ICE9PSBuZXdPYmplY3QhLnNpemUuaGVpZ2h0KSB7XG4gICAgICAgIHRoaXMuYWRkQ2hhbmdlKG9sZElkLCB6b25lQ2hhbmdlcywgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlLlNpemVDaGFuZ2VkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIENoZWNraW5nIGZvciBhbnkgYWRkZWQgem9uZXNcbiAgICBuZXdEYXNoYm9hcmRPYmplY3RzLmZvckVhY2goKG5ld09iamVjdCkgPT4ge1xuICAgICAgaWYgKCFvbGRab25lTWFwLmhhcyhuZXdPYmplY3QuaWQpKSB7XG4gICAgICAgIHRoaXMuYWRkQ2hhbmdlKG5ld09iamVjdC5pZCwgem9uZUNoYW5nZXMsIERhc2hib2FyZExheW91dENoYW5nZS5BZGRlZCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBDaGVja2luZyBpZiB6b25lIHNlbGVjdGlvbiBoYXMgY2hhbmdlZFxuICAgIGlmIChvbGRBY3RpdmVab25lSWQgIT09IG5ld0FjdGl2ZVpvbmVJZCkge1xuICAgICAgaWYgKG5ld0FjdGl2ZVpvbmVJZCAhPT0gMCkge1xuICAgICAgICB0aGlzLmFkZENoYW5nZShuZXdBY3RpdmVab25lSWQsIHpvbmVDaGFuZ2VzLCBEYXNoYm9hcmRMYXlvdXRDaGFuZ2UuU2VsZWN0ZWQpO1xuICAgICAgfVxuICAgICAgaWYgKG9sZEFjdGl2ZVpvbmVJZCAhPT0gMCkge1xuICAgICAgICB0aGlzLmFkZENoYW5nZShvbGRBY3RpdmVab25lSWQsIHpvbmVDaGFuZ2VzLCBEYXNoYm9hcmRMYXlvdXRDaGFuZ2UuRGVzZWxlY3RlZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hlY2tpbmcgaWYgc3dpdGNoZWQgdG8gYW5vdGhlciBkYXNoYm9hcmRcbiAgICBpZiAobmV3QWN0aXZlRGFzaGJvYXJkTmFtZSAmJiBvbGRBY3RpdmVEYXNoYm9hcmROYW1lICE9PSBuZXdBY3RpdmVEYXNoYm9hcmROYW1lKSB7XG4gICAgICB0aGlzLmFkZENoYW5nZSgwLCB6b25lQ2hhbmdlcywgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlLkRhc2hib2FyZENoYW5nZWQpO1xuICAgIH1cblxuICAgIHJldHVybiB6b25lQ2hhbmdlcztcbiAgfVxuXG4gIHByaXZhdGUgYWRkQ2hhbmdlKHpvbmVJZDogbnVtYmVyLCB6b25lQ2hhbmdlczogRGFzaGJvYXJkTGF5b3V0Q2hhbmdlRGV0YWlscywgY2hhbmdlOiBEYXNoYm9hcmRMYXlvdXRDaGFuZ2UpOiB2b2lkIHtcbiAgICBpZiAoIXpvbmVDaGFuZ2VzLmhhcyh6b25lSWQpKSB7XG4gICAgICB6b25lQ2hhbmdlcy5zZXQoem9uZUlkLCBbXSk7XG4gICAgfVxuXG4gICAgem9uZUNoYW5nZXMuZ2V0KHpvbmVJZCkhLnB1c2goY2hhbmdlKTtcbiAgfVxuXG4gIHB1YmxpYyBtb3ZlQW5kUmVzaXplRGFzaGJvYXJkT2JqZWN0c0FzeW5jKFxuICAgIGRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUFycmF5OiBDb250cmFjdC5EYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGVBcnJheSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgem9uZVNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8Wm9uZVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5ab25lKTtcblxuICAgIHJldHVybiB6b25lU2VydmljZS5tb3ZlQW5kUmVzaXplQXN5bmMoLypEYXNoYm9hcmQgTmFtZSovIHRoaXMubmFtZSwgdGhpcy56b25lTWFwLCBkYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGVBcnJheSk7XG4gIH1cblxuICBwdWJsaWMgcmVwbGF5QW5pbWF0aW9uQXN5bmMocmVwbGF5U3BlZWQ6IENvbnRyYWN0LlJlcGxheVNwZWVkVHlwZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGFuaW1hdGlvblNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8QW5pbWF0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLkFuaW1hdGlvbik7XG5cbiAgICByZXR1cm4gYW5pbWF0aW9uU2VydmljZS5yZXBsYXlBc3luYyhyZXBsYXlTcGVlZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RmlsdGVyc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuRmlsdGVyPj4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXRPckVtYmVkZGVkSW5BY3RpdmVTdG9yeVBvaW50KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEZpbHRlclNlcnZpY2U+KFNlcnZpY2VOYW1lcy5GaWx0ZXIpO1xuICAgIHJldHVybiBzZXJ2aWNlLmdldERhc2hib2FyZEZpbHRlcnNBc3luYygpO1xuICB9XG5cbiAgcHVibGljIGFwcGx5RmlsdGVyQXN5bmMoXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgdmFsdWVzOiBBcnJheTxzdHJpbmc+LFxuICAgIHVwZGF0ZVR5cGU6IENvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGUsXG4gICAgb3B0aW9uczogQ29udHJhY3QuRmlsdGVyT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPENvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGU+KHVwZGF0ZVR5cGUsIENvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGUsICdGaWx0ZXJVcGRhdGVUeXBlJyk7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVN0cmluZ1BhcmFtZXRlcihmaWVsZE5hbWUsICdmaWVsZE5hbWUnKTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWVzKSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsICd2YWx1ZXMgcGFyYW1ldGVyIGZvciBhcHBseURhc2hib2FyZEZpbHRlckFzeW5jIG11c3QgYmUgYW4gYXJyYXknKTtcbiAgICB9XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldE9yRW1iZWRkZWRJbkFjdGl2ZVN0b3J5UG9pbnQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RmlsdGVyU2VydmljZT4oU2VydmljZU5hbWVzLkZpbHRlcik7XG4gICAgcmV0dXJuIHNlcnZpY2UuYXBwbHlEYXNoYm9hcmRGaWx0ZXJBc3luYyhmaWVsZE5hbWUsIHZhbHVlcywgdXBkYXRlVHlwZSwgb3B0aW9ucyk7XG4gIH1cblxuICAvLyBAVy0xMjk4NjQzOTogcmVtb3ZlIG9uY2UgaW5pdGlhbGl6ZVdpdGhQdWJsaWNJbnRlcmZhY2VzIGlzIG1vdmVkIHRvIHRoZSBjb25zdHJ1Y3RvciBmb3IgdGhpcyBjbGFzc1xuICAvLyBUaGlzIG1ldGhvZCBvbmx5IGV4aXN0cyBzaW5jZSB3b3Jrc2hlZXRzSW1wbCBjYW4gYmUgdW5kZWZpbmVkLCBidXQgd2UgbmVlZCB0aGUgd29ya3NoZWV0IG5hbWVzIGluIHRoZSBFeHBvcnQgQVBJc1xuICBwdWJsaWMgZ2V0V29ya3NoZWV0TmFtZXNGcm9tWm9uZXMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgY29uc3Qgd29ya3NoZWV0TmFtZXM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCB6b25lIG9mIHRoaXMuX3pvbmVzKSB7XG4gICAgICBpZiAoem9uZS56b25lVHlwZSAhPT0gRGFzaGJvYXJkT2JqZWN0VHlwZS5Xb3Jrc2hlZXQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAvLyB6b25lLnNoZWV0SW5mbyB3YXMgbm90IGluaXRpYWxpemVkIHByaW9yIHRvIGludGVybmFsLWNvbnRyYWN0IDEuNi4wXG4gICAgICBjb25zdCB3b3Jrc2hlZXROYW1lID0gem9uZS5zaGVldEluZm8gPyB6b25lLnNoZWV0SW5mby5uYW1lIDogem9uZS5uYW1lO1xuICAgICAgd29ya3NoZWV0TmFtZXMucHVzaCh3b3Jrc2hlZXROYW1lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gd29ya3NoZWV0TmFtZXM7XG4gIH1cblxuICBwcml2YXRlIHZlcmlmeUFjdGl2ZVNoZWV0T3JFbWJlZGRlZEluQWN0aXZlU3RvcnlQb2ludCgpIHtcbiAgICBjb25zdCBpc1Jvb3RBbmRBY3RpdmVEYXNoYm9hcmQgPSB0aGlzLmFjdGl2ZTtcbiAgICBjb25zdCBpc1dpdGhpbkFjdGl2ZVN0b3J5UG9pbnQgPSB0aGlzLnBhcmVudFN0b3J5UG9pbnQgIT0gbnVsbCAmJiB0aGlzLnBhcmVudFN0b3J5UG9pbnQuYWN0aXZlO1xuICAgIGlmICghaXNSb290QW5kQWN0aXZlRGFzaGJvYXJkICYmICFpc1dpdGhpbkFjdGl2ZVN0b3J5UG9pbnQpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5Ob3RBY3RpdmVTaGVldCwgJ09wZXJhdGlvbiBub3QgYWxsb3dlZCBvbiBub24tYWN0aXZlIHNoZWV0Jyk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkT2JqZWN0VHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRJbXBsIH0gZnJvbSAnLi9EYXNoYm9hcmRJbXBsJztcbmltcG9ydCB7IFdvcmtzaGVldEltcGwgfSBmcm9tICcuL1dvcmtzaGVldEltcGwnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBkYXNoYm9hcmQgb2JqZWN0cyAtIHRoZSB6b25lcyBpbiBhIGRhc2hib2FyZC5cbiAqIFRoaXMgZG9lcyBub3QgZm9sbG93IHRoZSBJbXBsIHBhdHRlcm4gYXMgaXQgaXMganVzdCBhIHByb3BlcnR5IGJhZy5cbiAqL1xuZXhwb3J0IGNsYXNzIERhc2hib2FyZE9iamVjdEltcGwge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfZGFzaGJvYXJkSW1wbDogRGFzaGJvYXJkSW1wbCxcbiAgICBwcml2YXRlIF90eXBlOiBEYXNoYm9hcmRPYmplY3RUeXBlLFxuICAgIHByaXZhdGUgX3Bvc2l0aW9uOiBDb250cmFjdC5Qb2ludCxcbiAgICBwcml2YXRlIF9zaXplOiBDb250cmFjdC5TaXplLFxuICAgIHByaXZhdGUgX3dvcmtzaGVldEltcGw6IFdvcmtzaGVldEltcGwgfCB1bmRlZmluZWQsXG4gICAgcHJpdmF0ZSBfbmFtZTogc3RyaW5nLFxuICAgIHByaXZhdGUgX2lzRmxvYXRpbmc6IGJvb2xlYW4sXG4gICAgcHJpdmF0ZSBfaXNWaXNpYmxlOiBib29sZWFuLFxuICAgIHByaXZhdGUgX2lkOiBudW1iZXIsXG4gICAgcHJpdmF0ZSBfZmllbGRJZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICApIHt9XG5cbiAgcHVibGljIGdldCBkYXNoYm9hcmRJbXBsKCk6IERhc2hib2FyZEltcGwge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRJbXBsO1xuICB9XG5cbiAgcHVibGljIGdldCB0eXBlKCk6IERhc2hib2FyZE9iamVjdFR5cGUge1xuICAgIHJldHVybiB0aGlzLl90eXBlO1xuICB9XG5cbiAgcHVibGljIGdldCBwb3NpdGlvbigpOiBDb250cmFjdC5Qb2ludCB7XG4gICAgcmV0dXJuIHRoaXMuX3Bvc2l0aW9uO1xuICB9XG5cbiAgcHVibGljIGdldCBzaXplKCk6IENvbnRyYWN0LlNpemUge1xuICAgIHJldHVybiB0aGlzLl9zaXplO1xuICB9XG5cbiAgcHVibGljIGdldCB3b3Jrc2hlZXRJbXBsKCk6IFdvcmtzaGVldEltcGwgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsO1xuICB9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX25hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzRmxvYXRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzRmxvYXRpbmc7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzVmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNWaXNpYmxlO1xuICB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9pZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmllbGRJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9maWVsZElkO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0ICogYXMgSW50ZXJuYWxDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQ29ubmVjdGlvblN1bW1hcnkgfSBmcm9tICcuLi9Db25uZWN0aW9uU3VtbWFyeSc7XG5pbXBvcnQgeyBGaWVsZCB9IGZyb20gJy4uL0ZpZWxkJztcbmltcG9ydCB7IExvZ2ljYWxUYWJsZSB9IGZyb20gJy4uL0xvZ2ljYWxUYWJsZSc7XG5pbXBvcnQgeyBEYXRhU291cmNlU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0RhdGFTb3VyY2VTZXJ2aWNlJztcbmltcG9ydCB7IEdldERhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvR2V0RGF0YVNlcnZpY2UnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5LCBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgVGFibGVTdW1tYXJ5IH0gZnJvbSAnLi4vVGFibGVTdW1tYXJ5JztcbmltcG9ydCB7IEVycm9ySGVscGVycyB9IGZyb20gJy4uL1V0aWxzL0Vycm9ySGVscGVycyc7XG5pbXBvcnQgeyBGaWVsZEltcGwgfSBmcm9tICcuL0ZpZWxkSW1wbCc7XG5cbmV4cG9ydCBjbGFzcyBEYXRhU291cmNlSW1wbCB7XG4gIHByaXZhdGUgX2ZpZWxkczogQXJyYXk8RmllbGQ+O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9kYXRhU291cmNlSW5mbzogSW50ZXJuYWxDb250cmFjdC5EYXRhU291cmNlLCBwcml2YXRlIF9yZWdpc3RyeUlkOiBudW1iZXIpIHtcbiAgICB0aGlzLl9maWVsZHMgPSBfZGF0YVNvdXJjZUluZm8uZmllbGRzLm1hcCgoZmllbGRNb2RlbCkgPT4ge1xuICAgICAgY29uc3QgZmllbGRJbXBsID0gbmV3IEZpZWxkSW1wbChmaWVsZE1vZGVsLCB0aGlzKTtcbiAgICAgIHJldHVybiBuZXcgRmllbGQoZmllbGRJbXBsKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW5mby5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW5mby5pZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZXh0cmFjdFVwZGF0ZVRpbWUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUluZm8uZXh0cmFjdFVwZGF0ZVRpbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZpZWxkcygpOiBBcnJheTxDb250cmFjdC5GaWVsZD4ge1xuICAgIHJldHVybiB0aGlzLl9maWVsZHM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzRXh0cmFjdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUluZm8uaXNFeHRyYWN0O1xuICB9XG5cbiAgcHVibGljIGdldCBpc1B1Ymxpc2hlZCgpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUluZm8uaXNQdWJsaXNoZWQ7XG4gIH1cblxuICBwdWJsaWMgcHVibGlzaGVkVXJsKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbmZvLnB1Ymxpc2hlZFVybDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRNYXhQYWdlUm93TGltaXQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gMTAwMDA7XG4gIH1cblxuICBwdWJsaWMgcmVmcmVzaEFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGRhdGFTb3VyY2VTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPERhdGFTb3VyY2VTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRGF0YVNvdXJjZVNlcnZpY2UpO1xuXG4gICAgcmV0dXJuIGRhdGFTb3VyY2VTZXJ2aWNlLnJlZnJlc2hBc3luYyh0aGlzLl9kYXRhU291cmNlSW5mby5pZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29ubmVjdGlvblN1bW1hcmllc0FzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuQ29ubmVjdGlvblN1bW1hcnlbXT4ge1xuICAgIGNvbnN0IGRhdGFTb3VyY2VTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPERhdGFTb3VyY2VTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRGF0YVNvdXJjZVNlcnZpY2UpO1xuXG4gICAgcmV0dXJuIGRhdGFTb3VyY2VTZXJ2aWNlLmdldENvbm5lY3Rpb25TdW1tYXJpZXNBc3luYyh0aGlzLl9kYXRhU291cmNlSW5mby5pZCkudGhlbjxDb250cmFjdC5Db25uZWN0aW9uU3VtbWFyeVtdPigoc3VtbWFyaWVzKSA9PiB7XG4gICAgICByZXR1cm4gc3VtbWFyaWVzLm1hcCgoc3VtbWFyeSkgPT4gbmV3IENvbm5lY3Rpb25TdW1tYXJ5KHN1bW1hcnkpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBY3RpdmVUYWJsZXNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LlRhYmxlU3VtbWFyeT4+IHtcbiAgICBjb25zdCBkYXRhU291cmNlU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxEYXRhU291cmNlU2VydmljZT4oU2VydmljZU5hbWVzLkRhdGFTb3VyY2VTZXJ2aWNlKTtcblxuICAgIHJldHVybiBkYXRhU291cmNlU2VydmljZS5nZXRBY3RpdmVUYWJsZXNBc3luYyh0aGlzLl9kYXRhU291cmNlSW5mby5pZCkudGhlbjxBcnJheTxDb250cmFjdC5UYWJsZVN1bW1hcnk+PigodGFibGVJbmZvcykgPT4ge1xuICAgICAgcmV0dXJuIHRhYmxlSW5mb3MubWFwKCh0YWJsZUluZm8pID0+IG5ldyBUYWJsZVN1bW1hcnkodGFibGVJbmZvKSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ0RhdGFBc3luYyhvcHRpb25zPzogQ29udHJhY3QuRGF0YVNvdXJjZVVuZGVybHlpbmdEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgY29uc3QgZ2V0RGF0YVNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8R2V0RGF0YVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5HZXREYXRhKTtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIHJldHVybiBnZXREYXRhU2VydmljZS5nZXREYXRhU291cmNlRGF0YUFzeW5jKFxuICAgICAgdGhpcy5pZCxcbiAgICAgICEhb3B0aW9ucy5pZ25vcmVBbGlhc2VzLFxuICAgICAgb3B0aW9ucy5tYXhSb3dzIHx8IDAsIC8vIDAgYW5kIFtdIGFyZSBkZWZhdWx0c1xuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlIHx8IFtdLFxuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlQnlJZCB8fCBbXSxcbiAgICAgIG9wdGlvbnMuaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gfHwgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uQWxsVmFsdWVzLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TG9naWNhbFRhYmxlRGF0YUFzeW5jKGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsIG9wdGlvbnM/OiBDb250cmFjdC5EYXRhU291cmNlVW5kZXJseWluZ0RhdGFPcHRpb25zKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+IHtcbiAgICBjb25zdCBnZXREYXRhU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgcmV0dXJuIGdldERhdGFTZXJ2aWNlLmdldExvZ2ljYWxUYWJsZURhdGFBc3luYyhcbiAgICAgIHRoaXMuaWQsXG4gICAgICBsb2dpY2FsVGFibGVJZCxcbiAgICAgICEhb3B0aW9ucy5pZ25vcmVBbGlhc2VzLFxuICAgICAgb3B0aW9ucy5tYXhSb3dzIHx8IDAsIC8vIDAgYW5kIFtdIGFyZSBkZWZhdWx0c1xuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlIHx8IFtdLFxuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlQnlJZCB8fCBbXSxcbiAgICAgIG9wdGlvbnMuaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gfHwgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uQWxsVmFsdWVzLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TG9naWNhbFRhYmxlRGF0YVJlYWRlckFzeW5jKFxuICAgIGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsXG4gICAgcGFnZVJvd0NvdW50PzogbnVtYmVyLFxuICAgIG9wdGlvbnM/OiBDb250cmFjdC5EYXRhU291cmNlVW5kZXJseWluZ0RhdGFPcHRpb25zLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZVJlYWRlcj4ge1xuICAgIGNvbnN0IGdldERhdGFTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEdldERhdGFTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuR2V0RGF0YSk7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICByZXR1cm4gZ2V0RGF0YVNlcnZpY2UuZ2V0TG9naWNhbFRhYmxlRGF0YVJlYWRlckFzeW5jKFxuICAgICAgdGhpcy5pZCxcbiAgICAgIGxvZ2ljYWxUYWJsZUlkLFxuICAgICAgcGFnZVJvd0NvdW50IHx8IHRoaXMuZ2V0TWF4UGFnZVJvd0xpbWl0KCksXG4gICAgICAhIW9wdGlvbnMuaWdub3JlQWxpYXNlcyxcbiAgICAgIG9wdGlvbnMuY29sdW1uc1RvSW5jbHVkZUJ5SWQgfHwgW10sXG4gICAgICBvcHRpb25zLmluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uIHx8IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLkFsbFZhbHVlcyxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGluaXRpYWxpemVXaXRoUHVibGljSW50ZXJmYWNlcyhkYXRhU291cmNlOiBDb250cmFjdC5EYXRhU291cmNlKTogdm9pZCB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUludGVybmFsVmFsdWUoZGF0YVNvdXJjZSwgJ2RhdGFTb3VyY2UnKTtcblxuICAgIHRoaXMuX2ZpZWxkcyA9IHRoaXMuX2RhdGFTb3VyY2VJbmZvLmZpZWxkcy5tYXAoKGZpZWxkTW9kZWwpID0+IHtcbiAgICAgIGNvbnN0IGZpZWxkSW1wbCA9IG5ldyBGaWVsZEltcGwoZmllbGRNb2RlbCwgZGF0YVNvdXJjZSk7XG4gICAgICByZXR1cm4gbmV3IEZpZWxkKGZpZWxkSW1wbCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TG9naWNhbFRhYmxlc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuTG9naWNhbFRhYmxlPj4ge1xuICAgIGNvbnN0IGRhdGFTb3VyY2VTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPERhdGFTb3VyY2VTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRGF0YVNvdXJjZVNlcnZpY2UpO1xuXG4gICAgcmV0dXJuIGRhdGFTb3VyY2VTZXJ2aWNlLmdldExvZ2ljYWxUYWJsZXNBc3luYyh0aGlzLmlkKS50aGVuPEFycmF5PENvbnRyYWN0LkxvZ2ljYWxUYWJsZT4+KChsb2dpY2FsVGFibGVJbmZvcykgPT4ge1xuICAgICAgcmV0dXJuIGxvZ2ljYWxUYWJsZUluZm9zLm1hcCgobG9naWNhbFRhYmxlSW5mbykgPT4gbmV3IExvZ2ljYWxUYWJsZShsb2dpY2FsVGFibGVJbmZvKSk7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgKiBhcyBJbnRlcm5hbENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MgfSBmcm9tICcuLi9FbnVtTWFwcGluZ3MvSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzJztcblxuZXhwb3J0IGNsYXNzIEZpZWxkSW1wbCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9maWVsZEluZm86IEludGVybmFsQ29udHJhY3QuRmllbGQsIHByaXZhdGUgX3BhcmVudERhdGFTb3VyY2U/OiBDb250cmFjdC5EYXRhU291cmNlKSB7fVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEluZm8ubmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbmZvLmlkO1xuICB9XG5cbiAgcHVibGljIGdldCBkZXNjcmlwdGlvbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEluZm8uZGVzY3JpcHRpb247XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRhdGFUeXBlKCk6IENvbnRyYWN0LkRhdGFUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbmZvLmRhdGFUeXBlID8/IENvbnRyYWN0LkRhdGFUeXBlLlVua25vd247XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFnZ3JlZ2F0aW9uKCk6IENvbnRyYWN0LkZpZWxkQWdncmVnYXRpb25UeXBlIHtcbiAgICByZXR1cm4gSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzLmZpZWxkQWdncmVnYXRpb25UeXBlLmNvbnZlcnQodGhpcy5fZmllbGRJbmZvLmFnZ3JlZ2F0aW9uKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGF0YVNvdXJjZSgpOiBDb250cmFjdC5EYXRhU291cmNlIHtcbiAgICBpZiAoIXRoaXMuX3BhcmVudERhdGFTb3VyY2UpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBEYXRhIHNvdXJjZSBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlIGZvciB0aGlzIGZpZWxkLiBQbGVhc2UgdXNlIGdldEZpZWxkQXN5bmMgbWV0aG9kIHRvIGdldCBmaWVsZCdzIGRhdGEgc291cmNlIGluZm9ybWF0aW9uYCxcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudERhdGFTb3VyY2U7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHJvbGUoKTogQ29udHJhY3QuRmllbGRSb2xlVHlwZSB7XG4gICAgcmV0dXJuIEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncy5maWVsZFJvbGVUeXBlLmNvbnZlcnQodGhpcy5fZmllbGRJbmZvLnJvbGUpO1xuICB9XG5cbiAgcHVibGljIGdldCBjb2x1bW5UeXBlKCk6IENvbnRyYWN0LkNvbHVtblR5cGUge1xuICAgIGxldCBkZWZpbmVkVmFsdWU6IEludGVybmFsQ29udHJhY3QuQ29sdW1uVHlwZSA9IHRoaXMuX2ZpZWxkSW5mby5jb2x1bW5UeXBlIHx8IEludGVybmFsQ29udHJhY3QuQ29sdW1uVHlwZS5Vbmtub3duO1xuICAgIHJldHVybiBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MuY29sdW1uVHlwZS5jb252ZXJ0KGRlZmluZWRWYWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzQ2FsY3VsYXRlZEZpZWxkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEluZm8uaXNDYWxjdWxhdGVkRmllbGQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzQ29tYmluZWRGaWVsZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbmZvLmlzQ29tYmluZWRGaWVsZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNHZW5lcmF0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW5mby5pc0dlbmVyYXRlZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNHZW9zcGF0aWFsKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEluZm8uaXNHZW9zcGF0aWFsO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0hpZGRlbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbmZvLmlzSGlkZGVuO1xuICB9XG5cbiAgcHVibGljIGdldCBpc1ByZXNlbnRPblB1Ymxpc2hlZERhdGFzb3VyY2UoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW5mby5pc1ByZXNlbnRPblB1Ymxpc2hlZERhdGFzb3VyY2U7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXRhVHlwZSwgUGFyYW1ldGVyVmFsdWVUeXBlLCBQZXJpb2RUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFBhcmFtZXRlckluZm8gfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzIH0gZnJvbSAnLi4vRW51bU1hcHBpbmdzL0ludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyc7XG5pbXBvcnQgeyBEYXRhVmFsdWUgfSBmcm9tICcuLi9Nb2RlbHMvR2V0RGF0YU1vZGVscyc7XG5pbXBvcnQgeyBQYXJhbWV0ZXJzU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL1BhcmFtZXRlcnNTZXJ2aWNlJztcbmltcG9ydCB7IEFwaVNlcnZpY2VSZWdpc3RyeSwgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IERhdGFWYWx1ZUZhY3RvcnkgfSBmcm9tICcuLi9VdGlscy9EYXRhVmFsdWVGYWN0b3J5JztcbmltcG9ydCB7IEVycm9ySGVscGVycyB9IGZyb20gJy4uL1V0aWxzL0Vycm9ySGVscGVycyc7XG5pbXBvcnQgeyBQYXJhbSB9IGZyb20gJy4uL1V0aWxzL1BhcmFtJztcblxuZXhwb3J0IGNsYXNzIFBhcmFtZXRlckltcGwge1xuICBwcml2YXRlIF9hbGxvd2FibGVWYWx1ZXM6IENvbnRyYWN0LlBhcmFtZXRlckRvbWFpblJlc3RyaWN0aW9uO1xuICBwcml2YXRlIF9nbG9iYWxGaWVsZE5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSBfcGFyYW1ldGVySW5mbzogUGFyYW1ldGVySW5mbztcblxuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1ldGVySW5mbzogUGFyYW1ldGVySW5mbywgcHJpdmF0ZSBfcmVnaXN0cnlJZDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRQYXJhbWV0ZXJJbmZvKHBhcmFtZXRlckluZm8pO1xuICB9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmFtZXRlckluZm8ubmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY3VycmVudFZhbHVlKCk6IERhdGFWYWx1ZSB7XG4gICAgcmV0dXJuIERhdGFWYWx1ZUZhY3RvcnkuTWFrZVBhcmFtZXRlckRhdGFWYWx1ZSh0aGlzLl9wYXJhbWV0ZXJJbmZvLmN1cnJlbnRWYWx1ZSwgdGhpcy5fcGFyYW1ldGVySW5mby5kYXRhVHlwZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRhdGFUeXBlKCk6IERhdGFUeXBlIHtcbiAgICByZXR1cm4gSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzLmRhdGFUeXBlLmNvbnZlcnQodGhpcy5fcGFyYW1ldGVySW5mby5kYXRhVHlwZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2dsb2JhbEZpZWxkTmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWxsb3dhYmxlVmFsdWVzKCk6IENvbnRyYWN0LlBhcmFtZXRlckRvbWFpblJlc3RyaWN0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5fYWxsb3dhYmxlVmFsdWVzO1xuICB9XG5cbiAgcHVibGljIGNoYW5nZVZhbHVlQXN5bmMobmV3VmFsdWU6IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBEYXRlKTogUHJvbWlzZTxEYXRhVmFsdWU+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKG5ld1ZhbHVlLCAnbmV3VmFsdWUnKTtcblxuICAgIGNvbnN0IGNvZXJjZWRWYWx1ZSA9IFBhcmFtLnNlcmlhbGl6ZVBhcmFtZXRlclZhbHVlKG5ld1ZhbHVlKTtcbiAgICBjb25zdCBwYXJhbWV0ZXJzU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxQYXJhbWV0ZXJzU2VydmljZT4oU2VydmljZU5hbWVzLlBhcmFtZXRlcnMpO1xuICAgIHJldHVybiBwYXJhbWV0ZXJzU2VydmljZS5jaGFuZ2VQYXJhbWV0ZXJWYWx1ZUFzeW5jKHRoaXMuX2dsb2JhbEZpZWxkTmFtZSwgY29lcmNlZFZhbHVlKS50aGVuKChwYXJhbWV0ZXJJbmZvKSA9PiB7XG4gICAgICB0aGlzLnNldFBhcmFtZXRlckluZm8ocGFyYW1ldGVySW5mbyk7XG4gICAgICByZXR1cm4gdGhpcy5jdXJyZW50VmFsdWU7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNldFBhcmFtZXRlckluZm8ocGFyYW1ldGVySW5mbzogUGFyYW1ldGVySW5mbyk6IHZvaWQge1xuICAgIHRoaXMuX3BhcmFtZXRlckluZm8gPSBwYXJhbWV0ZXJJbmZvO1xuICAgIHRoaXMuX2dsb2JhbEZpZWxkTmFtZSA9IHBhcmFtZXRlckluZm8uZmllbGROYW1lO1xuXG4gICAgY29uc3QgdHlwZSA9IEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncy5hbGxvd2FibGVWYWx1ZXMuY29udmVydChwYXJhbWV0ZXJJbmZvLmFsbG93YWJsZVZhbHVlc1R5cGUpO1xuICAgIGxldCBsaXN0VmFsdWVzOiBBcnJheTxEYXRhVmFsdWU+IHwgdW5kZWZpbmVkO1xuICAgIGxldCBtaW5WYWx1ZTogRGF0YVZhbHVlIHwgdW5kZWZpbmVkO1xuICAgIGxldCBtYXhWYWx1ZTogRGF0YVZhbHVlIHwgdW5kZWZpbmVkO1xuICAgIGxldCBzdGVwU2l6ZTogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIGxldCBkYXRlU3RlcFBlcmlvZDogUGVyaW9kVHlwZSB8IHVuZGVmaW5lZDtcblxuICAgIGlmICh0eXBlID09PSBQYXJhbWV0ZXJWYWx1ZVR5cGUuTGlzdCkge1xuICAgICAgY29uc3QgdmFsdWVzID0gcGFyYW1ldGVySW5mby5hbGxvd2FibGVWYWx1ZXMgfHwgW107XG4gICAgICBsaXN0VmFsdWVzID0gdmFsdWVzLm1hcCgodmFsKSA9PiBEYXRhVmFsdWVGYWN0b3J5Lk1ha2VQYXJhbWV0ZXJEYXRhVmFsdWUodmFsLCBwYXJhbWV0ZXJJbmZvLmRhdGFUeXBlKSk7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBQYXJhbWV0ZXJWYWx1ZVR5cGUuUmFuZ2UpIHtcbiAgICAgIG1pblZhbHVlID0gcGFyYW1ldGVySW5mby5taW5WYWx1ZSAmJiBEYXRhVmFsdWVGYWN0b3J5Lk1ha2VQYXJhbWV0ZXJEYXRhVmFsdWUocGFyYW1ldGVySW5mby5taW5WYWx1ZSwgcGFyYW1ldGVySW5mby5kYXRhVHlwZSk7XG4gICAgICBtYXhWYWx1ZSA9IHBhcmFtZXRlckluZm8ubWF4VmFsdWUgJiYgRGF0YVZhbHVlRmFjdG9yeS5NYWtlUGFyYW1ldGVyRGF0YVZhbHVlKHBhcmFtZXRlckluZm8ubWF4VmFsdWUsIHBhcmFtZXRlckluZm8uZGF0YVR5cGUpO1xuICAgICAgc3RlcFNpemUgPSBwYXJhbWV0ZXJJbmZvLnN0ZXBTaXplO1xuICAgICAgZGF0ZVN0ZXBQZXJpb2QgPSBwYXJhbWV0ZXJJbmZvLmRhdGVTdGVwUGVyaW9kICYmIEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncy5kYXRlU3RlcFBlcmlvZC5jb252ZXJ0KHBhcmFtZXRlckluZm8uZGF0ZVN0ZXBQZXJpb2QpO1xuICAgIH1cblxuICAgIHRoaXMuX2FsbG93YWJsZVZhbHVlcyA9IHtcbiAgICAgIHR5cGU6IHR5cGUsXG4gICAgICBhbGxvd2FibGVWYWx1ZXM6IGxpc3RWYWx1ZXMsXG4gICAgICBtaW5WYWx1ZTogbWluVmFsdWUsXG4gICAgICBtYXhWYWx1ZTogbWF4VmFsdWUsXG4gICAgICBzdGVwU2l6ZTogc3RlcFNpemUsXG4gICAgICBkYXRlU3RlcFBlcmlvZDogZGF0ZVN0ZXBQZXJpb2QsXG4gICAgfTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFNoZWV0UGF0aCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBDbGllbnRJbmZvU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0NsaWVudEluZm9TZXJ2aWNlJztcbmltcG9ydCB7IFBhcmFtZXRlcnNTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvUGFyYW1ldGVyc1NlcnZpY2UnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5LCBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgU2l6ZVNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9TaXplU2VydmljZSc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgRXJyb3JIZWxwZXJzIH0gZnJvbSAnLi4vVXRpbHMvRXJyb3JIZWxwZXJzJztcbmltcG9ydCB7IFBhcmFtIH0gZnJvbSAnLi4vVXRpbHMvUGFyYW0nO1xuaW1wb3J0IHsgU2hlZXRVdGlscyB9IGZyb20gJy4uL1V0aWxzL1NoZWV0VXRpbHMnO1xuaW1wb3J0IHsgUGFyYW1ldGVySW1wbCB9IGZyb20gJy4vUGFyYW1ldGVySW1wbCc7XG5pbXBvcnQgeyBTaGVldEluZm9JbXBsIH0gZnJvbSAnLi9TaGVldEluZm9JbXBsJztcblxuaW50ZXJmYWNlIFBhcnRpYWxTaGVldFNpemUge1xuICAvKipcbiAgICogQ29udGFpbnMgYW4gZW51bWVyYXRpb24gdmFsdWUgb2Ygb25lIG9mIHRoZSBmb2xsb3dpbmc6IEFVVE9NQVRJQywgRVhBQ1RMWSwgUkFOR0UsIEFUTEVBU1QsIGFuZCBBVE1PU1QuXG4gICAqL1xuICByZWFkb25seSBiZWhhdmlvcjogQ29udHJhY3QuU2hlZXRTaXplQmVoYXZpb3I7XG5cbiAgLyoqXG4gICAqICBUaGlzIGlzIG9ubHkgZGVmaW5lZCB3aGVuIGJlaGF2aW9yIGlzIEVYQUNUTFksIFJBTkdFLCBvciBBVExFQVNULlxuICAgKi9cbiAgcmVhZG9ubHkgbWluU2l6ZT86IFBhcnRpYWw8Q29udHJhY3QuU2l6ZT47XG5cbiAgLyoqXG4gICAqICBUaGlzIGlzIG9ubHkgZGVmaW5lZCB3aGVuIGJlaGF2aW9yIGlzIEVYQUNUTFksIFJBTkdFIG9yIEFUTU9TVC5cbiAgICovXG4gIHJlYWRvbmx5IG1heFNpemU/OiBQYXJ0aWFsPENvbnRyYWN0LlNpemU+O1xufVxuXG5leHBvcnQgY2xhc3MgU2hlZXRJbXBsIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBfc2hlZXRJbmZvSW1wbDogU2hlZXRJbmZvSW1wbCwgcHJvdGVjdGVkIF9yZWdpc3RyeUlkOiBudW1iZXIpIHt9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWV0SW5mb0ltcGwubmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2hlZXRUeXBlKCk6IENvbnRyYWN0LlNoZWV0VHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWV0SW5mb0ltcGwuc2hlZXRUeXBlO1xuICB9XG5cbiAgcHVibGljIGdldCBzaGVldFBhdGgoKTogU2hlZXRQYXRoIHtcbiAgICByZXR1cm4gdGhpcy5fc2hlZXRJbmZvSW1wbC5zaGVldFBhdGg7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNpemUoKTogQ29udHJhY3QuU2l6ZSB8IENvbnRyYWN0LlNoZWV0U2l6ZSB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWV0SW5mb0ltcGwuc2hlZXRTaXplO1xuICB9XG5cbiAgcHVibGljIGdldCBoaWRkZW4oKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuX3NoZWV0SW5mb0ltcGwuaXNIaWRkZW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3NoZWV0SW5mb0ltcGwuaXNIaWRkZW47XG4gICAgfVxuICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5JbXBsZW1lbnRhdGlvbkVycm9yLCBgaXNIaWRkZW4gbm90IGltcGxlbWVudGVkYCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFjdGl2ZSgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5fc2hlZXRJbmZvSW1wbC5pc0FjdGl2ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc2hlZXRJbmZvSW1wbC5pc0FjdGl2ZTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLkltcGxlbWVudGF0aW9uRXJyb3IsIGBhY3RpdmUgbm90IGltcGxlbWVudGVkYCk7XG4gIH1cblxuICBwdWJsaWMgc2V0IGFjdGl2ZShhY3RpdmU6IGJvb2xlYW4pIHtcbiAgICBpZiAodGhpcy5fc2hlZXRJbmZvSW1wbC5pc0FjdGl2ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9zaGVldEluZm9JbXBsLmFjdGl2ZSA9IGFjdGl2ZTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IGluZGV4KCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuX3NoZWV0SW5mb0ltcGwuaW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3NoZWV0SW5mb0ltcGwuaW5kZXg7XG4gICAgfVxuICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5JbXBsZW1lbnRhdGlvbkVycm9yLCBgaW5kZXggbm90IGltcGxlbWVudGVkYCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHVybCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLl9zaGVldEluZm9JbXBsLnVybCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc2hlZXRJbmZvSW1wbC51cmw7XG4gICAgfVxuICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5JbXBsZW1lbnRhdGlvbkVycm9yLCBgdXJsIG5vdCBpbXBsZW1lbnRlZGApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTaGVldFNpemUoKTogQ29udHJhY3QuU2hlZXRTaXplIHtcbiAgICBpZiAoIVNoZWV0VXRpbHMuaXNWYWxpZFNoZWV0U2l6ZSh0aGlzLnNpemUpKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVtYmVkZGluZ0Vycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ3NpemUgaXMgbm90IG9mIHR5cGUgU2hlZXRTaXplJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc2l6ZTtcbiAgfVxuXG4gIHB1YmxpYyBmaW5kUGFyYW1ldGVyQXN5bmMocGFyYW1ldGVyTmFtZTogc3RyaW5nKTogUHJvbWlzZTxQYXJhbWV0ZXJJbXBsIHwgdW5kZWZpbmVkPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihwYXJhbWV0ZXJOYW1lLCAncGFyYW1ldGVyTmFtZScpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxQYXJhbWV0ZXJzU2VydmljZT4oU2VydmljZU5hbWVzLlBhcmFtZXRlcnMpO1xuICAgIHJldHVybiBzZXJ2aWNlLmZpbmRQYXJhbWV0ZXJCeU5hbWVBc3luYyhwYXJhbWV0ZXJOYW1lKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRQYXJhbWV0ZXJzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxQYXJhbWV0ZXJJbXBsPj4ge1xuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8UGFyYW1ldGVyc1NlcnZpY2U+KFNlcnZpY2VOYW1lcy5QYXJhbWV0ZXJzKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRQYXJhbWV0ZXJzRm9yU2hlZXRBc3luYyh0aGlzLnNoZWV0UGF0aCk7XG4gIH1cblxuICBwdWJsaWMgY2hhbmdlU2l6ZUFzeW5jKG5ld1NpemU6IENvbnRyYWN0LlNoZWV0U2l6ZSk6IFByb21pc2U8Q29udHJhY3QuU2hlZXRTaXplPiB7XG4gICAgY29uc3QgaW52YWxpZFNpemVFcnJvciA9IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5JbnZhbGlkU2l6ZSwgJ0ludmFsaWQgc2hlZXQgc2l6ZSBwYXJhbWV0ZXInKTtcbiAgICBpZiAoIW5ld1NpemUgfHwgIW5ld1NpemUuYmVoYXZpb3IpIHtcbiAgICAgIHRocm93IGludmFsaWRTaXplRXJyb3I7XG4gICAgfVxuXG4gICAgY29uc3QgcGFydGlhbFNoZWV0U2l6ZSA9IHRoaXMubm9ybWFsaXplU2hlZXRTaXplKG5ld1NpemUpO1xuXG4gICAgY29uc3QgaXNBdXRvbWF0aWMgPSBwYXJ0aWFsU2hlZXRTaXplLmJlaGF2aW9yID09PSBDb250cmFjdC5TaGVldFNpemVCZWhhdmlvci5BdXRvbWF0aWM7XG4gICAgaWYgKCFpc0F1dG9tYXRpYyAmJiAhcGFydGlhbFNoZWV0U2l6ZS5taW5TaXplICYmICFwYXJ0aWFsU2hlZXRTaXplLm1heFNpemUpIHtcbiAgICAgIHRocm93IGludmFsaWRTaXplRXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKCFpc0F1dG9tYXRpYyAmJiB0aGlzLnNoZWV0VHlwZSA9PT0gQ29udHJhY3QuU2hlZXRUeXBlLldvcmtzaGVldCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihcbiAgICAgICAgQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5JbnZhbGlkU2l6ZUJlaGF2aW9yT25Xb3Jrc2hlZXQsXG4gICAgICAgICdPbmx5IFNoZWV0U2l6ZUJlaGF2aW9yLkF1dG9tYXRpYyBpcyBhbGxvd2VkIG9uIFdvcmtzaGVldHMnLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoaXNBdXRvbWF0aWMgJiYgdGhpcy5nZXRTaGVldFNpemUoKS5iZWhhdmlvciA9PT0gcGFydGlhbFNoZWV0U2l6ZS5iZWhhdmlvcikge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXdTaXplKTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9jZXNzZWROZXdTaXplID0gdGhpcy5wcm9jZXNzTmV3U2l6ZShwYXJ0aWFsU2hlZXRTaXplKTtcblxuICAgIGNvbnN0IHNpemVTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFNpemVTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuU2l6ZSk7XG4gICAgcmV0dXJuIHNpemVTZXJ2aWNlLmNoYW5nZVNpemVBc3luYyh0aGlzLm5hbWUsIHByb2Nlc3NlZE5ld1NpemUpLnRoZW4oKCkgPT4ge1xuICAgICAgY29uc3QgY2xpZW50SW5mb1NlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8Q2xpZW50SW5mb1NlcnZpY2U+KFNlcnZpY2VOYW1lcy5DbGllbnRJbmZvKTtcblxuICAgICAgcmV0dXJuIGNsaWVudEluZm9TZXJ2aWNlLmdldENsaWVudEluZm9Bc3luYygpLnRoZW4oKGJvb3RzdHJhcEluZm8pID0+IHtcbiAgICAgICAgY29uc3Qgc2hlZXQgPSBib290c3RyYXBJbmZvLnB1Ymxpc2hlZFNoZWV0cy5maW5kKChzKSA9PiBzLm5hbWUgPT09IHRoaXMubmFtZSk7XG4gICAgICAgIGlmICghc2hlZXQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LlNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYENhbid0IGZpbmQgc2hlZXQgd2l0aCBuYW1lICR7dGhpcy5uYW1lfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2hlZXRTaXplID0gU2hlZXRVdGlscy5nZXRTaGVldFNpemVGcm9tU2l6ZUNvbnN0cmFpbnRzKHNoZWV0LnNpemVDb25zdHJhaW50KTtcbiAgICAgICAgdGhpcy5fc2hlZXRJbmZvSW1wbC5zaGVldFNpemUgPSBzaGVldFNpemU7XG5cbiAgICAgICAgcmV0dXJuIHNoZWV0U2l6ZTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVTaGVldFNpemUobmV3U2l6ZTogQ29udHJhY3QuU2hlZXRTaXplKTogUGFydGlhbFNoZWV0U2l6ZSB7XG4gICAgY29uc3QgeyBiZWhhdmlvciB9ID0gbmV3U2l6ZTtcblxuICAgIEVycm9ySGVscGVycy52ZXJpZnlFbnVtVmFsdWU8Q29udHJhY3QuU2hlZXRTaXplQmVoYXZpb3I+KGJlaGF2aW9yLCBDb250cmFjdC5TaGVldFNpemVCZWhhdmlvciwgJ1NoZWV0U2l6ZUJlaGF2aW9yJyk7XG5cbiAgICBjb25zdCBtaW5TaXplID0gU2hlZXRJbXBsLnBhcnNlRGltZW5zaW9ucyhuZXdTaXplLm1pblNpemUpO1xuICAgIGNvbnN0IG1heFNpemUgPSBTaGVldEltcGwucGFyc2VEaW1lbnNpb25zKG5ld1NpemUubWF4U2l6ZSk7XG5cbiAgICByZXR1cm4geyBiZWhhdmlvciwgbWluU2l6ZSwgbWF4U2l6ZSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBwcm9jZXNzTmV3U2l6ZShuZXdTaXplOiBQYXJ0aWFsU2hlZXRTaXplKTogQ29udHJhY3QuU2hlZXRTaXplIHtcbiAgICBjb25zdCB7IGJlaGF2aW9yLCBtaW5TaXplOiBtaW5TaXplTWF5YmUsIG1heFNpemU6IG1heFNpemVNYXliZSB9ID0gbmV3U2l6ZTtcblxuICAgIGNvbnN0IGhhc01pbldpZHRoID0gIVBhcmFtLmlzTnVsbE9yVW5kZWZpbmVkKG1pblNpemVNYXliZT8ud2lkdGgpO1xuICAgIGNvbnN0IGhhc01pbkhlaWdodCA9ICFQYXJhbS5pc051bGxPclVuZGVmaW5lZChtaW5TaXplTWF5YmU/LmhlaWdodCk7XG4gICAgY29uc3QgaGFzTWF4V2lkdGggPSAhUGFyYW0uaXNOdWxsT3JVbmRlZmluZWQobWF4U2l6ZU1heWJlPy53aWR0aCk7XG4gICAgY29uc3QgaGFzTWF4SGVpZ2h0ID0gIVBhcmFtLmlzTnVsbE9yVW5kZWZpbmVkKG1heFNpemVNYXliZT8uaGVpZ2h0KTtcbiAgICBjb25zdCBoYXNWYWxpZE1pblNpemUgPSBoYXNNaW5XaWR0aCAmJiBoYXNNaW5IZWlnaHQ7XG4gICAgY29uc3QgaGFzVmFsaWRNYXhTaXplID0gaGFzTWF4V2lkdGggJiYgaGFzTWF4SGVpZ2h0O1xuXG4gICAgc3dpdGNoIChiZWhhdmlvcikge1xuICAgICAgY2FzZSBDb250cmFjdC5TaGVldFNpemVCZWhhdmlvci5BdXRvbWF0aWM6IHtcbiAgICAgICAgcmV0dXJuIHsgYmVoYXZpb3IgfTtcbiAgICAgIH1cblxuICAgICAgY2FzZSBDb250cmFjdC5TaGVldFNpemVCZWhhdmlvci5BdE1vc3Q6IHtcbiAgICAgICAgaWYgKCFtYXhTaXplTWF5YmUgfHwgIWhhc1ZhbGlkTWF4U2l6ZSkge1xuICAgICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5NaXNzaW5nTWF4U2l6ZSwgJ01pc3NpbmcgbWF4U2l6ZSBmb3IgU2hlZXRTaXplQmVoYXZpb3IuQXRNb3N0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtYXhTaXplID0geyB3aWR0aDogbWF4U2l6ZU1heWJlLndpZHRoISwgaGVpZ2h0OiBtYXhTaXplTWF5YmUuaGVpZ2h0ISB9O1xuICAgICAgICBpZiAobWF4U2l6ZS53aWR0aCA8IDAgfHwgbWF4U2l6ZS5oZWlnaHQgPCAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLkludmFsaWRTaXplLCAnU2l6ZSB2YWx1ZSBjYW5ub3QgYmUgbGVzcyB0aGFuIHplcm8nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IGJlaGF2aW9yLCBtYXhTaXplIH07XG4gICAgICB9XG5cbiAgICAgIGNhc2UgQ29udHJhY3QuU2hlZXRTaXplQmVoYXZpb3IuQXRMZWFzdDoge1xuICAgICAgICBpZiAoIW1pblNpemVNYXliZSB8fCAhaGFzVmFsaWRNaW5TaXplKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLk1pc3NpbmdNaW5TaXplLCAnTWlzc2luZyBtaW5TaXplIGZvciBTaGVldFNpemVCZWhhdmlvci5BdExlYXN0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtaW5TaXplID0geyB3aWR0aDogbWluU2l6ZU1heWJlLndpZHRoISwgaGVpZ2h0OiBtaW5TaXplTWF5YmUuaGVpZ2h0ISB9O1xuICAgICAgICBpZiAobWluU2l6ZS53aWR0aCA8IDAgfHwgbWluU2l6ZS5oZWlnaHQgPCAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLkludmFsaWRTaXplLCAnU2l6ZSB2YWx1ZSBjYW5ub3QgYmUgbGVzcyB0aGFuIHplcm8nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IGJlaGF2aW9yLCBtaW5TaXplIH07XG4gICAgICB9XG5cbiAgICAgIGNhc2UgQ29udHJhY3QuU2hlZXRTaXplQmVoYXZpb3IuUmFuZ2U6IHtcbiAgICAgICAgaWYgKCFtaW5TaXplTWF5YmUgfHwgIW1heFNpemVNYXliZSB8fCAhaGFzVmFsaWRNaW5TaXplIHx8ICFoYXNWYWxpZE1heFNpemUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVtYmVkZGluZ0Vycm9yQ29kZXMuTWlzc2luZ01pbk1heFNpemUsICdNaXNzaW5nIG1pblNpemUgb3IgbWF4U2l6ZSBmb3IgU2hlZXRTaXplQmVoYXZpb3IuUmFuZ2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1pblNpemUgPSB7IHdpZHRoOiBtaW5TaXplTWF5YmUud2lkdGghLCBoZWlnaHQ6IG1pblNpemVNYXliZS5oZWlnaHQhIH07XG4gICAgICAgIGNvbnN0IG1heFNpemUgPSB7IHdpZHRoOiBtYXhTaXplTWF5YmUud2lkdGghLCBoZWlnaHQ6IG1heFNpemVNYXliZS5oZWlnaHQhIH07XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIG1pblNpemUud2lkdGggPCAwIHx8XG4gICAgICAgICAgbWluU2l6ZS5oZWlnaHQgPCAwIHx8XG4gICAgICAgICAgbWF4U2l6ZS53aWR0aCA8IDAgfHxcbiAgICAgICAgICBtYXhTaXplLmhlaWdodCA8IDAgfHxcbiAgICAgICAgICBtaW5TaXplLndpZHRoID4gbWF4U2l6ZS53aWR0aCB8fFxuICAgICAgICAgIG1pblNpemUuaGVpZ2h0ID4gbWF4U2l6ZS5oZWlnaHRcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLkludmFsaWRTaXplLCAnTWlzc2luZyBtaW5TaXplIG9yIG1heFNpemUgZm9yIFNoZWV0U2l6ZUJlaGF2aW9yLlJhbmdlJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyBiZWhhdmlvciwgbWluU2l6ZSwgbWF4U2l6ZSB9O1xuICAgICAgfVxuXG4gICAgICBjYXNlIENvbnRyYWN0LlNoZWV0U2l6ZUJlaGF2aW9yLkV4YWN0bHk6IHtcbiAgICAgICAgaWYgKG1pblNpemVNYXliZSAmJiBtYXhTaXplTWF5YmUpIHtcbiAgICAgICAgICBpZiAoaGFzVmFsaWRNaW5TaXplICYmIGhhc1ZhbGlkTWF4U2l6ZSkge1xuICAgICAgICAgICAgY29uc3QgbWluU2l6ZSA9IHsgd2lkdGg6IG1pblNpemVNYXliZS53aWR0aCEsIGhlaWdodDogbWluU2l6ZU1heWJlLmhlaWdodCEgfTtcbiAgICAgICAgICAgIGNvbnN0IG1heFNpemUgPSB7IHdpZHRoOiBtYXhTaXplTWF5YmUud2lkdGghLCBoZWlnaHQ6IG1heFNpemVNYXliZS5oZWlnaHQhIH07XG5cbiAgICAgICAgICAgIGlmIChtaW5TaXplLndpZHRoICE9PSBtYXhTaXplLndpZHRoIHx8IG1pblNpemUuaGVpZ2h0ICE9PSBtYXhTaXplLmhlaWdodCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVtYmVkZGluZ0Vycm9yQ29kZXMuSW52YWxpZFNpemUsICdDb25mbGljdGluZyBzaXplIHZhbHVlcyBmb3IgU2hlZXRTaXplQmVoYXZpb3IuRXhhY3RseScpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4geyBiZWhhdmlvciwgbWluU2l6ZSwgbWF4U2l6ZSB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChoYXNWYWxpZE1pblNpemUpIHtcbiAgICAgICAgICAgIGNvbnN0IG1pblNpemUgPSB7IHdpZHRoOiBtaW5TaXplTWF5YmUud2lkdGghLCBoZWlnaHQ6IG1pblNpemVNYXliZS5oZWlnaHQhIH07XG4gICAgICAgICAgICByZXR1cm4geyBiZWhhdmlvciwgbWluU2l6ZSwgbWF4U2l6ZTogbWluU2l6ZSB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChoYXNWYWxpZE1heFNpemUpIHtcbiAgICAgICAgICAgIGNvbnN0IG1heFNpemUgPSB7IHdpZHRoOiBtYXhTaXplTWF5YmUud2lkdGghLCBoZWlnaHQ6IG1heFNpemVNYXliZS5oZWlnaHQhIH07XG4gICAgICAgICAgICByZXR1cm4geyBiZWhhdmlvciwgbWluU2l6ZTogbWF4U2l6ZSwgbWF4U2l6ZSB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5JbnZhbGlkU2l6ZSwgJ0ludmFsaWQgc2hlZXQgc2l6ZSBwYXJhbWV0ZXInKTtcbiAgICAgIH1cblxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LlNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFVuc3VwcG9ydGVkIHNoZWV0IHNpemUgYmVoYXZpb3I6ICR7YmVoYXZpb3J9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcGFyc2VEaW1lbnNpb25zID0gKHNpemU6IENvbnRyYWN0LlNpemUgfCB1bmRlZmluZWQpOiBQYXJ0aWFsPENvbnRyYWN0LlNpemU+ID0+IHtcbiAgICBjb25zdCBlbXB0eSA9IHsgd2lkdGg6IHVuZGVmaW5lZCwgaGVpZ2h0OiB1bmRlZmluZWQgfTtcblxuICAgIGlmICghc2l6ZSkge1xuICAgICAgcmV0dXJuIGVtcHR5O1xuICAgIH1cblxuICAgIGNvbnN0IHsgc3VjY2Vzczogd2lkdGhQYXJzZWQsIHBhcnNlZDogcGFyc2VkV2lkdGggfSA9IFBhcmFtLnRyeVBhcnNlTnVtYmVyKHNpemUud2lkdGgpO1xuICAgIGNvbnN0IHsgc3VjY2VzczogaGVpZ2h0UGFyc2VkLCBwYXJzZWQ6IHBhcnNlZEhlaWdodCB9ID0gUGFyYW0udHJ5UGFyc2VOdW1iZXIoc2l6ZS5oZWlnaHQpO1xuXG4gICAgaWYgKHdpZHRoUGFyc2VkICYmIGhlaWdodFBhcnNlZCkge1xuICAgICAgcmV0dXJuIHsgd2lkdGg6IHBhcnNlZFdpZHRoISwgaGVpZ2h0OiBwYXJzZWRIZWlnaHQhIH07XG4gICAgfVxuXG4gICAgaWYgKHdpZHRoUGFyc2VkKSB7XG4gICAgICByZXR1cm4geyB3aWR0aDogcGFyc2VkV2lkdGghIH07XG4gICAgfVxuXG4gICAgaWYgKGhlaWdodFBhcnNlZCkge1xuICAgICAgcmV0dXJuIHsgaGVpZ2h0OiBwYXJzZWRIZWlnaHQhIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIGVtcHR5O1xuICB9O1xufVxuIiwiaW1wb3J0IHsgU2hlZXRTaXplIGFzIEVtYmVkZGluZ1NoZWV0U2l6ZSwgU2l6ZSBhcyBFeHRlbnNpb25TaGVldFNpemUsIFNoZWV0VHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBTaGVldFBhdGggfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG5leHBvcnQgY2xhc3MgU2hlZXRJbmZvSW1wbCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9uYW1lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBfc2hlZXRUeXBlOiBTaGVldFR5cGUsXG4gICAgcHJpdmF0ZSBfc2hlZXRTaXplOiBFeHRlbnNpb25TaGVldFNpemUgfCBFbWJlZGRpbmdTaGVldFNpemUsXG4gICAgcHJpdmF0ZSBfaW5kZXg/OiBudW1iZXIsXG4gICAgcHJpdmF0ZSBfaXNBY3RpdmU/OiBib29sZWFuLFxuICAgIHByaXZhdGUgX2lzSGlkZGVuPzogYm9vbGVhbixcbiAgICBwcml2YXRlIF91cmw/OiBzdHJpbmcsXG4gICkge31cblxuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgbmFtZShzaGVldE5hbWU6IHN0cmluZykge1xuICAgIHRoaXMuX25hbWUgPSBzaGVldE5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNoZWV0U2l6ZSgpOiBFeHRlbnNpb25TaGVldFNpemUgfCBFbWJlZGRpbmdTaGVldFNpemUge1xuICAgIHJldHVybiB0aGlzLl9zaGVldFNpemU7XG4gIH1cblxuICBwdWJsaWMgc2V0IHNoZWV0U2l6ZSh2YWx1ZTogRXh0ZW5zaW9uU2hlZXRTaXplIHwgRW1iZWRkaW5nU2hlZXRTaXplKSB7XG4gICAgdGhpcy5fc2hlZXRTaXplID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNoZWV0VHlwZSgpOiBTaGVldFR5cGUge1xuICAgIHJldHVybiB0aGlzLl9zaGVldFR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNoZWV0UGF0aCgpOiBTaGVldFBhdGgge1xuICAgIHJldHVybiB7XG4gICAgICBzaGVldE5hbWU6IHRoaXMubmFtZSxcbiAgICAgIGlzRGFzaGJvYXJkOiB0aGlzLnNoZWV0VHlwZSA9PT0gU2hlZXRUeXBlLkRhc2hib2FyZCxcbiAgICAgIC8vIFRPRE8gLSBTdG9yaWVzXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW5kZXgoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5faW5kZXg7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzQWN0aXZlKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9pc0FjdGl2ZTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgYWN0aXZlKGFjdGl2ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2lzQWN0aXZlID0gYWN0aXZlO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0hpZGRlbigpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5faXNIaWRkZW47XG4gIH1cblxuICBwdWJsaWMgZ2V0IHVybCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl91cmw7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXZlbnRUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFNpbmdsZUV2ZW50TWFuYWdlciB9IGZyb20gJy4uL1NpbmdsZUV2ZW50TWFuYWdlcic7XG5cbi8qKlxuICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBTaW5nbGVFdmVudE1hbmFnZXIgaW50ZXJmYWNlIGZvciBhIHNpbmdsZSB0eXBlIG9mIFRhYmxlYXUgZXZlbnRcbiAqXG4gKiBAdGVtcGxhdGUgVEV2ZW50VHlwZSBUaGUgVGFibGVhdSBldmVudCB0eXBlIHRoaXMgY2xhc3Mgc3BlY2lhbGl6ZXNcbiAqL1xuZXhwb3J0IGNsYXNzIFNpbmdsZUV2ZW50TWFuYWdlckltcGw8VEV2ZW50VHlwZSBleHRlbmRzIENvbnRyYWN0LlRhYmxlYXVFdmVudD4gaW1wbGVtZW50cyBTaW5nbGVFdmVudE1hbmFnZXIge1xuICBwcml2YXRlIF9ldmVudFR5cGU6IFRhYmxlYXVFdmVudFR5cGU7XG4gIHByaXZhdGUgX2hhbmRsZXJzOiBBcnJheTwoZXZlbnRPYmo6IFRFdmVudFR5cGUpID0+IHZvaWQ+O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihldmVudFR5cGU6IFRhYmxlYXVFdmVudFR5cGUpIHtcbiAgICB0aGlzLl9ldmVudFR5cGUgPSBldmVudFR5cGU7XG4gICAgdGhpcy5faGFuZGxlcnMgPSBbXTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZXZlbnRUeXBlKCk6IFRhYmxlYXVFdmVudFR5cGUge1xuICAgIHJldHVybiB0aGlzLl9ldmVudFR5cGU7XG4gIH1cblxuICBwdWJsaWMgYWRkRXZlbnRMaXN0ZW5lcihoYW5kbGVyOiAoZXZlbnRPYmo6IFRFdmVudFR5cGUpID0+IHZvaWQpOiBDb250cmFjdC5UYWJsZWF1RXZlbnRVbnJlZ2lzdGVyRm4ge1xuICAgIHRoaXMuX2hhbmRsZXJzLnB1c2goaGFuZGxlcik7XG4gICAgcmV0dXJuICgpID0+IHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihoYW5kbGVyKTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVFdmVudExpc3RlbmVyKGhhbmRsZXI6IChldmVudE9iajogVEV2ZW50VHlwZSkgPT4gdm9pZCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGJlZm9yZUNvdW50ID0gdGhpcy5faGFuZGxlcnMubGVuZ3RoO1xuICAgIHRoaXMuX2hhbmRsZXJzID0gdGhpcy5faGFuZGxlcnMuZmlsdGVyKChoKSA9PiBoICE9PSBoYW5kbGVyKTtcbiAgICByZXR1cm4gYmVmb3JlQ291bnQgPiB0aGlzLl9oYW5kbGVycy5sZW5ndGg7XG4gIH1cblxuICBwdWJsaWMgdHJpZ2dlckV2ZW50KGV2ZW50R2VuZXJhdG9yOiAoKSA9PiBURXZlbnRUeXBlKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIHRoaXMuX2hhbmRsZXJzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBldmVudE1vZGVsID0gZXZlbnRHZW5lcmF0b3IoKTtcbiAgICAgICAgaGFuZGxlcihldmVudE1vZGVsKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gU2luY2UgdGhpcyBoYW5kbGVyIGNvdWxkIGJlIG91dHNpZGUgb3VyIGNvbnRyb2wsIGp1c3QgY2F0Y2ggYW55dGhpbmcgaXQgdGhyb3dzIGFuZCBjb250aW51ZSBvblxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBTaGVldEluZm8sIFN0b3J5TW9kZWwsIFN0b3J5UG9pbnRNb2RlbCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBBcGlTZXJ2aWNlUmVnaXN0cnksIFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBTdG9yeUFjdGl2YXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvU3RvcnlBY3RpdmF0aW9uU2VydmljZSc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgRXJyb3JIZWxwZXJzIH0gZnJvbSAnLi4vVXRpbHMvRXJyb3JIZWxwZXJzJztcbmltcG9ydCB7IFNob3J0TGl2ZWREZWZlcnJlZCB9IGZyb20gJy4uL1V0aWxzL1Nob3J0TGl2ZWREZWZlcnJlZCc7XG5pbXBvcnQgeyBTaGVldEltcGwgfSBmcm9tICcuL1NoZWV0SW1wbCc7XG5pbXBvcnQgeyBTaGVldEluZm9JbXBsIH0gZnJvbSAnLi9TaGVldEluZm9JbXBsJztcbmltcG9ydCB7IFN0b3J5UG9pbnRJbXBsIH0gZnJvbSAnLi9TdG9yeVBvaW50SW1wbCc7XG5pbXBvcnQgeyBTdG9yeVBvaW50SW5mb0ltcGwgfSBmcm9tICcuL1N0b3J5UG9pbnRJbmZvSW1wbCc7XG5cbmV4cG9ydCBjbGFzcyBTdG9yeUltcGwgZXh0ZW5kcyBTaGVldEltcGwge1xuICBwcml2YXRlIF9hY3RpdmVTdG9yeVBvaW50SW1wbDogU3RvcnlQb2ludEltcGw7XG4gIHByaXZhdGUgX3N0b3J5UG9pbnRJbmZvSW1wbHM6IEFycmF5PFN0b3J5UG9pbnRJbmZvSW1wbD4gPSBbXTtcbiAgcHJpdmF0ZSBfZGVmZXJyZWQ6IFNob3J0TGl2ZWREZWZlcnJlZDxTdG9yeVBvaW50SW1wbD47XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBfc2hlZXRJbmZvSW1wbDogU2hlZXRJbmZvSW1wbCxcbiAgICBzdG9yeU1vZGVsOiBTdG9yeU1vZGVsLFxuICAgIHByaXZhdGUgX3B1Ymxpc2hlZFNoZWV0SW5mb3M6IEFycmF5PFNoZWV0SW5mbz4sXG4gICAgcHJvdGVjdGVkIF9yZWdpc3RyeUlkOiBudW1iZXIsXG4gICkge1xuICAgIHN1cGVyKF9zaGVldEluZm9JbXBsLCBfcmVnaXN0cnlJZCk7XG4gICAgdGhpcy5fZGVmZXJyZWQgPSBuZXcgU2hvcnRMaXZlZERlZmVycmVkPFN0b3J5UG9pbnRJbXBsPigpO1xuICAgIHRoaXMuaW5pdGlhbGl6ZVN0b3J5KHN0b3J5TW9kZWwpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplU3Rvcnkoc3RvcnlNb2RlbDogU3RvcnlNb2RlbCkge1xuICAgIHN0b3J5TW9kZWwuc3RvcnlQb2ludHMuZm9yRWFjaCgoc3RvcnlQb2ludE1vZGVsKSA9PiB7XG4gICAgICBjb25zdCBpc0FjdGl2ZSA9IHN0b3J5UG9pbnRNb2RlbC5pbmRleCA9PT0gc3RvcnlNb2RlbC5hY3RpdmVTdG9yeVBvaW50SW5kZXg7XG4gICAgICBjb25zdCBzdG9yeVBvaW50SW5mb0ltcGwgPSBuZXcgU3RvcnlQb2ludEluZm9JbXBsKFxuICAgICAgICBzdG9yeVBvaW50TW9kZWwuY2FwdGlvbixcbiAgICAgICAgc3RvcnlQb2ludE1vZGVsLmluZGV4LFxuICAgICAgICBzdG9yeVBvaW50TW9kZWwuc3RvcnlQb2ludElkLFxuICAgICAgICBpc0FjdGl2ZSxcbiAgICAgICAgc3RvcnlQb2ludE1vZGVsLnVwZGF0ZWQsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgICAgdGhpcy5fc3RvcnlQb2ludEluZm9JbXBscy5wdXNoKHN0b3J5UG9pbnRJbmZvSW1wbCk7XG5cbiAgICAgIGlmIChpc0FjdGl2ZSkge1xuICAgICAgICB0aGlzLl9hY3RpdmVTdG9yeVBvaW50SW1wbCA9IG5ldyBTdG9yeVBvaW50SW1wbChcbiAgICAgICAgICBzdG9yeVBvaW50SW5mb0ltcGwsXG4gICAgICAgICAgdGhpcy5fcHVibGlzaGVkU2hlZXRJbmZvcyxcbiAgICAgICAgICB0aGlzLl9yZWdpc3RyeUlkLFxuICAgICAgICAgIHN0b3J5UG9pbnRNb2RlbC5jb250YWluZWRTaGVldEluZm8sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVN0b3J5SW5mbyhpbmRleDogbnVtYmVyLCBzdG9yeVBvaW50TW9kZWw6IFN0b3J5UG9pbnRNb2RlbCkge1xuICAgIGlmICghdGhpcy5fc3RvcnlQb2ludEluZm9JbXBscykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBzdG9yeUluZm9JbXBsID0gdGhpcy5fc3RvcnlQb2ludEluZm9JbXBsc1tpbmRleF07XG4gICAgaWYgKHN0b3J5SW5mb0ltcGwuc3RvcnlQb2ludElkICE9PSBzdG9yeVBvaW50TW9kZWwuc3RvcnlQb2ludElkKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgICBDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLlN0b3J5UG9pbnRJZE1pc21hdGNoLFxuICAgICAgICBgV2Ugc2hvdWxkIG5vdCBiZSB1cGRhdGluZyBhIHN0b3J5IHBvaW50IHdoZW4gdGhlIElEcyBkb24ndCBtYXRjaC4gRXhpc3Rpbmcgc3RvcnlQb2ludElEPSR7c3RvcnlJbmZvSW1wbC5zdG9yeVBvaW50SWR9LCBuZXdTdG9yeVBvaW50SUQ9JHtzdG9yeVBvaW50TW9kZWwuc3RvcnlQb2ludElkfWAsXG4gICAgICApO1xuICAgIH1cbiAgICBzdG9yeUluZm9JbXBsLmNhcHRpb24gPSBzdG9yeVBvaW50TW9kZWwuY2FwdGlvbjtcbiAgICBzdG9yeUluZm9JbXBsLnVwZGF0ZWQgPSBzdG9yeVBvaW50TW9kZWwudXBkYXRlZDtcblxuICAgIGlmICh0aGlzLl9hY3RpdmVTdG9yeVBvaW50SW1wbC5zdG9yeVBvaW50SWQgPT09IHN0b3J5UG9pbnRNb2RlbC5zdG9yeVBvaW50SWQpIHtcbiAgICAgIHRoaXMuX2FjdGl2ZVN0b3J5UG9pbnRJbXBsLnVwZGF0ZWQgPSBzdG9yeUluZm9JbXBsLnVwZGF0ZWQ7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHVwZGF0ZVN0b3J5KHN0b3J5UG9pbnRNb2RlbDogU3RvcnlQb2ludE1vZGVsKSB7XG4gICAgaWYgKCF0aGlzLl9zdG9yeVBvaW50SW5mb0ltcGxzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fc3RvcnlQb2ludEluZm9JbXBscy5mb3JFYWNoKChzdG9yeVBvaW50SW5mb0ltcGwpID0+IHtcbiAgICAgIGNvbnN0IGlzQWN0aXZlID0gc3RvcnlQb2ludEluZm9JbXBsLnN0b3J5UG9pbnRJZCA9PT0gc3RvcnlQb2ludE1vZGVsLnN0b3J5UG9pbnRJZDtcbiAgICAgIGlmIChpc0FjdGl2ZSkge1xuICAgICAgICAvLyB1cGRhdGUgdGhlIHN0YXRlXG4gICAgICAgIHN0b3J5UG9pbnRJbmZvSW1wbC5jYXB0aW9uID0gc3RvcnlQb2ludE1vZGVsLmNhcHRpb247XG4gICAgICAgIHN0b3J5UG9pbnRJbmZvSW1wbC5pbmRleCA9IHN0b3J5UG9pbnRNb2RlbC5pbmRleDtcbiAgICAgICAgc3RvcnlQb2ludEluZm9JbXBsLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgIHN0b3J5UG9pbnRJbmZvSW1wbC51cGRhdGVkID0gc3RvcnlQb2ludE1vZGVsLnVwZGF0ZWQ7XG5cbiAgICAgICAgLy8gcmUtaW5pdGlhbGl6ZSBhY3RpdmVTdG9yeVBvaW50SW1wbFxuICAgICAgICB0aGlzLl9hY3RpdmVTdG9yeVBvaW50SW1wbCA9IG5ldyBTdG9yeVBvaW50SW1wbChcbiAgICAgICAgICBzdG9yeVBvaW50SW5mb0ltcGwsXG4gICAgICAgICAgdGhpcy5fcHVibGlzaGVkU2hlZXRJbmZvcyxcbiAgICAgICAgICB0aGlzLl9yZWdpc3RyeUlkLFxuICAgICAgICAgIHN0b3J5UG9pbnRNb2RlbC5jb250YWluZWRTaGVldEluZm8sXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBzZXQgb2xkIG9uZXMgdG8gZmFsc2VcbiAgICAgICAgc3RvcnlQb2ludEluZm9JbXBsLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuYWN0aXZlU3RvcnlQb2ludCkge1xuICAgICAgdGhpcy5fZGVmZXJyZWQucmVzb2x2ZSh0aGlzLmFjdGl2ZVN0b3J5UG9pbnQpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWN0aXZlU3RvcnlQb2ludCgpOiBTdG9yeVBvaW50SW1wbCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZVN0b3J5UG9pbnRJbXBsO1xuICB9XG5cbiAgcHVibGljIGdldCBzdG9yeVBvaW50c0luZm8oKTogQXJyYXk8U3RvcnlQb2ludEluZm9JbXBsPiB7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3J5UG9pbnRJbmZvSW1wbHM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzQWN0aXZlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zaGVldEluZm9JbXBsLmFjdGl2ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNIaWRkZW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5fc2hlZXRJbmZvSW1wbC5pc0hpZGRlbjtcbiAgfVxuXG4gIHB1YmxpYyBhY3RpdmF0ZU5leHRTdG9yeVBvaW50QXN5bmMoKTogUHJvbWlzZTxTdG9yeVBvaW50SW1wbD4ge1xuICAgIGlmICh0aGlzLl9hY3RpdmVTdG9yeVBvaW50SW1wbC5pbmRleCA9PT0gdGhpcy5fc3RvcnlQb2ludEluZm9JbXBscy5sZW5ndGggLSAxKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2FjdGl2ZVN0b3J5UG9pbnRJbXBsKTtcbiAgICB9XG5cbiAgICBsZXQgcHJvbWlzZSA9IHRoaXMuX2RlZmVycmVkLmdldE5ld1Byb21pc2VPclRocm93SWZCdXN5KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFN0b3J5QWN0aXZhdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5TdG9yeUFjdGl2YXRpb24pO1xuICAgIHNlcnZpY2UuYWN0aXZhdGVOZXh0U3RvcnlQb2ludEFzeW5jKCk7XG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH1cblxuICBwdWJsaWMgYWN0aXZhdGVQcmV2aW91c1N0b3J5UG9pbnRBc3luYygpOiBQcm9taXNlPFN0b3J5UG9pbnRJbXBsPiB7XG4gICAgaWYgKHRoaXMuX2FjdGl2ZVN0b3J5UG9pbnRJbXBsLmluZGV4ID09PSAwKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2FjdGl2ZVN0b3J5UG9pbnRJbXBsKTtcbiAgICB9XG5cbiAgICBsZXQgcHJvbWlzZSA9IHRoaXMuX2RlZmVycmVkLmdldE5ld1Byb21pc2VPclRocm93SWZCdXN5KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFN0b3J5QWN0aXZhdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5TdG9yeUFjdGl2YXRpb24pO1xuICAgIHNlcnZpY2UuYWN0aXZhdGVQcmV2aW91c1N0b3J5UG9pbnRBc3luYygpO1xuICAgIHJldHVybiBwcm9taXNlO1xuICB9XG5cbiAgcHVibGljIGFjdGl2YXRlU3RvcnlQb2ludEFzeW5jKGluZGV4OiBudW1iZXIpOiBQcm9taXNlPFN0b3J5UG9pbnRJbXBsPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihpbmRleCwgJ2luZGV4Jyk7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlclR5cGUoaW5kZXgsICdudW1iZXInLCAnaW5kZXgnKTtcblxuICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5fc3RvcnlQb2ludEluZm9JbXBscy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5JbmRleE91dE9mUmFuZ2UsICdUaGUgaW5kZXggcGFzc2VkIHRvIHRoaXMgY29tbWFuZCBpcyBvdXQgb2YgcmFuZ2UuJyk7XG4gICAgfVxuXG4gICAgaWYgKGluZGV4ID09PSB0aGlzLl9hY3RpdmVTdG9yeVBvaW50SW1wbC5pbmRleCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9hY3RpdmVTdG9yeVBvaW50SW1wbCk7XG4gICAgfVxuXG4gICAgbGV0IHByb21pc2UgPSB0aGlzLl9kZWZlcnJlZC5nZXROZXdQcm9taXNlT3JUaHJvd0lmQnVzeSgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxTdG9yeUFjdGl2YXRpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuU3RvcnlBY3RpdmF0aW9uKTtcbiAgICBzZXJ2aWNlLmFjdGl2YXRlU3RvcnlQb2ludEFzeW5jKGluZGV4KTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxuXG4gIHB1YmxpYyByZXZlcnRTdG9yeVBvaW50QXN5bmMoaW5kZXg6IG51bWJlcik6IFByb21pc2U8U3RvcnlQb2ludEluZm9JbXBsPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihpbmRleCwgJ2luZGV4Jyk7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlclR5cGUoaW5kZXgsICdudW1iZXInLCAnaW5kZXgnKTtcblxuICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5fc3RvcnlQb2ludEluZm9JbXBscy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5JbmRleE91dE9mUmFuZ2UsICdUaGUgaW5kZXggcGFzc2VkIHRvIHRoaXMgY29tbWFuZCBpcyBvdXQgb2YgcmFuZ2UuJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxTdG9yeUFjdGl2YXRpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuU3RvcnlBY3RpdmF0aW9uKTtcblxuICAgIHJldHVybiBzZXJ2aWNlLnJldmVydFN0b3J5UG9pbnRBc3luYyhpbmRleCkudGhlbjxTdG9yeVBvaW50SW5mb0ltcGw+KChyZXNwb25zZSkgPT4ge1xuICAgICAgdGhpcy51cGRhdGVTdG9yeUluZm8ocmVzcG9uc2UuaW5kZXgsIHJlc3BvbnNlKTtcbiAgICAgIGNvbnN0IHN0b3J5UG9pbnRJbmZvSW1wbCA9IG5ldyBTdG9yeVBvaW50SW5mb0ltcGwoXG4gICAgICAgIHJlc3BvbnNlLmNhcHRpb24sXG4gICAgICAgIHJlc3BvbnNlLmluZGV4LFxuICAgICAgICByZXNwb25zZS5zdG9yeVBvaW50SWQsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICByZXNwb25zZS51cGRhdGVkLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICAgIHJldHVybiBzdG9yeVBvaW50SW5mb0ltcGw7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJQZW5kaW5nUHJvbWlzZXMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2RlZmVycmVkKSB7XG4gICAgICB0aGlzLl9kZWZlcnJlZC5yZWplY3QoJ0FsbCBwZW5kaW5nIHByb21pc2VzIGNsZWFyZWQnKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBDb250YWluZWRTaGVldEluZm9Nb2RlbCwgU2hlZXRJbmZvLCBTaGVldFBhdGgsIFZpc3VhbElkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uL1RhYmxlYXVFcnJvcic7XG5pbXBvcnQgeyBTaGVldFV0aWxzIH0gZnJvbSAnLi4vVXRpbHMvU2hlZXRVdGlscyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRJbXBsIH0gZnJvbSAnLi9EYXNoYm9hcmRJbXBsJztcbmltcG9ydCB7IFNoZWV0SW1wbCB9IGZyb20gJy4vU2hlZXRJbXBsJztcbmltcG9ydCB7IFNoZWV0SW5mb0ltcGwgfSBmcm9tICcuL1NoZWV0SW5mb0ltcGwnO1xuaW1wb3J0IHsgU3RvcnlJbXBsIH0gZnJvbSAnLi9TdG9yeUltcGwnO1xuaW1wb3J0IHsgU3RvcnlQb2ludEluZm9JbXBsIH0gZnJvbSAnLi9TdG9yeVBvaW50SW5mb0ltcGwnO1xuaW1wb3J0IHsgV29ya3NoZWV0SW1wbCB9IGZyb20gJy4vV29ya3NoZWV0SW1wbCc7XG5cbmV4cG9ydCBjbGFzcyBTdG9yeVBvaW50SW1wbCB7XG4gIHByaXZhdGUgX2NvbnRhaW5lZFNoZWV0SW1wbDogU2hlZXRJbXBsO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9zdG9yeVBvaW50SW5mb0ltcGw6IFN0b3J5UG9pbnRJbmZvSW1wbCxcbiAgICBzaGVldEluZm9zOiBBcnJheTxTaGVldEluZm8+LFxuICAgIHJlZ2lzdHJ5SWQ6IG51bWJlcixcbiAgICBjb250YWluZWRTaGVldEluZm8/OiBDb250YWluZWRTaGVldEluZm9Nb2RlbCxcbiAgKSB7XG4gICAgaWYgKGNvbnRhaW5lZFNoZWV0SW5mbykge1xuICAgICAgdGhpcy5fY29udGFpbmVkU2hlZXRJbXBsID0gdGhpcy5jcmVhdGVDb250YWluZWRTaGVldChjb250YWluZWRTaGVldEluZm8sIHNoZWV0SW5mb3MsIHJlZ2lzdHJ5SWQpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW5kZXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fc3RvcnlQb2ludEluZm9JbXBsLmluZGV4O1xuICB9XG5cbiAgcHVibGljIGdldCBjYXB0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3J5UG9pbnRJbmZvSW1wbC5jYXB0aW9uO1xuICB9XG5cbiAgcHVibGljIGdldCBhY3RpdmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3J5UG9pbnRJbmZvSW1wbC5hY3RpdmU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHVwZGF0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3J5UG9pbnRJbmZvSW1wbC51cGRhdGVkO1xuICB9XG5cbiAgcHVibGljIHNldCB1cGRhdGVkKHVwZGF0ZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9zdG9yeVBvaW50SW5mb0ltcGwudXBkYXRlZCA9IHVwZGF0ZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBhcmVudFN0b3J5KCk6IFN0b3J5SW1wbCB7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3J5UG9pbnRJbmZvSW1wbC5wYXJlbnRTdG9yeTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY29udGFpbmVkU2hlZXQoKTogU2hlZXRJbXBsIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fY29udGFpbmVkU2hlZXRJbXBsO1xuICB9XG5cbiAgcHVibGljIGdldCBzdG9yeVBvaW50SWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fc3RvcnlQb2ludEluZm9JbXBsLnN0b3J5UG9pbnRJZDtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQ29udGFpbmVkU2hlZXQoY29udGFpbmVkU2hlZXRJbmZvOiBDb250YWluZWRTaGVldEluZm9Nb2RlbCwgc2hlZXRJbmZvczogQXJyYXk8U2hlZXRJbmZvPiwgcmVnaXN0cnlJZDogbnVtYmVyKTogU2hlZXRJbXBsIHtcbiAgICBjb25zdCBjb250YWluZWRTaGVldElkeCA9IC0xO1xuXG4gICAgY29uc3QgcHVibGlzaGVkU2hlZXRJbmZvID0gU2hlZXRVdGlscy5nZXRQdWJsaXNoZWRTaGVldEluZm9CeU5hbWUoY29udGFpbmVkU2hlZXRJbmZvLm5hbWUsIHNoZWV0SW5mb3MpO1xuICAgIGNvbnN0IGNvbnRhaW5lZFNoZWV0U2l6ZSA9IFNoZWV0VXRpbHMuY3JlYXRlQXV0b21hdGljU2l6ZSgpO1xuICAgIGNvbnN0IGlzQ29udGFpbmVkU2hlZXRIaWRkZW4gPSBwdWJsaXNoZWRTaGVldEluZm8gPT09IHVuZGVmaW5lZDtcbiAgICBjb25zdCBjb250YWluZWRTaGVldFVybCA9IHB1Ymxpc2hlZFNoZWV0SW5mbyA/IHB1Ymxpc2hlZFNoZWV0SW5mby51cmwgOiAnJztcbiAgICAvLyBDb250YWluZWQgc2hlZXRzIGFyZW4ndCBhY3RpdmUgLSB0aGUgY29udGFpbmluZyBzaGVldCBpcyBhY3RpdmUuXG4gICAgY29uc3QgY29udGFpbmVkU2hlZXRBY3RpdmUgPSBmYWxzZTtcblxuICAgIGNvbnN0IGNvbnRhaW5lZFNoZWV0SW5mb0ltcGwgPSBuZXcgU2hlZXRJbmZvSW1wbChcbiAgICAgIGNvbnRhaW5lZFNoZWV0SW5mby5uYW1lLFxuICAgICAgU2hlZXRVdGlscy5nZXRTaGVldFR5cGVFbnVtKGNvbnRhaW5lZFNoZWV0SW5mby5zaGVldFR5cGUpLFxuICAgICAgY29udGFpbmVkU2hlZXRTaXplLFxuICAgICAgY29udGFpbmVkU2hlZXRJZHgsXG4gICAgICBjb250YWluZWRTaGVldEFjdGl2ZSxcbiAgICAgIGlzQ29udGFpbmVkU2hlZXRIaWRkZW4sXG4gICAgICBjb250YWluZWRTaGVldFVybCxcbiAgICApO1xuXG4gICAgbGV0IHNoZWV0SW1wbDogU2hlZXRJbXBsO1xuICAgIHN3aXRjaCAoY29udGFpbmVkU2hlZXRJbmZvSW1wbC5zaGVldFR5cGUpIHtcbiAgICAgIGNhc2UgQ29udHJhY3QuU2hlZXRUeXBlLldvcmtzaGVldDoge1xuICAgICAgICBjb25zdCB2aXpJZDogVmlzdWFsSWQgPSB7XG4gICAgICAgICAgd29ya3NoZWV0OiBjb250YWluZWRTaGVldEluZm9JbXBsLm5hbWUsXG4gICAgICAgIH07XG5cbiAgICAgICAgc2hlZXRJbXBsID0gbmV3IFdvcmtzaGVldEltcGwoY29udGFpbmVkU2hlZXRJbmZvSW1wbCwgcmVnaXN0cnlJZCwgdml6SWQsIG51bGwsIHRoaXMpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgQ29udHJhY3QuU2hlZXRUeXBlLkRhc2hib2FyZDoge1xuICAgICAgICBjb25zdCBzaGVldFBhdGg6IFNoZWV0UGF0aCA9IHtcbiAgICAgICAgICBzaGVldE5hbWU6IGNvbnRhaW5lZFNoZWV0SW5mb0ltcGwubmFtZSxcbiAgICAgICAgICBpc0Rhc2hib2FyZDogdHJ1ZSxcbiAgICAgICAgfTtcblxuICAgICAgICBzaGVldEltcGwgPSBuZXcgRGFzaGJvYXJkSW1wbChjb250YWluZWRTaGVldEluZm9JbXBsLCBjb250YWluZWRTaGVldEluZm8uZGFzaGJvYXJkWm9uZXMsIHNoZWV0UGF0aCwgcmVnaXN0cnlJZCwgdGhpcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LlNoYXJlZEVycm9yQ29kZXMuU2VydmVyRXJyb3IsICdJbnZhbGlkIFNoZWV0VHlwZScpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzaGVldEltcGw7XG4gIH1cbn1cbiIsImltcG9ydCB7IFN0b3J5SW1wbCB9IGZyb20gJy4vU3RvcnlJbXBsJztcblxuZXhwb3J0IGNsYXNzIFN0b3J5UG9pbnRJbmZvSW1wbCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9jYXB0aW9uOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBfaW5kZXg6IG51bWJlcixcbiAgICBwcml2YXRlIF9zdG9yeVBvaW50SWQ6IG51bWJlcixcbiAgICBwcml2YXRlIF9hY3RpdmU6IGJvb2xlYW4sXG4gICAgcHJpdmF0ZSBfdXBkYXRlZDogYm9vbGVhbixcbiAgICBwcml2YXRlIF9wYXJlbnRTdG9yeUltcGw6IFN0b3J5SW1wbCxcbiAgKSB7fVxuXG4gIHB1YmxpYyBnZXQgY2FwdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fY2FwdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgY2FwdGlvbihjYXB0aW9uOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9jYXB0aW9uID0gY2FwdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW5kZXgoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2luZGV4O1xuICB9XG5cbiAgcHVibGljIHNldCBpbmRleChpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5faW5kZXggPSBpbmRleDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc3RvcnlQb2ludElkKCkge1xuICAgIHJldHVybiB0aGlzLl9zdG9yeVBvaW50SWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFjdGl2ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlO1xuICB9XG5cbiAgcHVibGljIHNldCBhY3RpdmUoaXNBY3RpdmU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9hY3RpdmUgPSBpc0FjdGl2ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdXBkYXRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdXBkYXRlZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgdXBkYXRlZChpc1VwZGF0ZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl91cGRhdGVkID0gaXNVcGRhdGVkO1xuICB9XG5cbiAgcHVibGljIGdldCBwYXJlbnRTdG9yeSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50U3RvcnlJbXBsO1xuICB9XG59XG4iLCJleHBvcnQgY2xhc3MgV29ya2Jvb2tJbXBsIHt9XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQXBpTWVudVR5cGUsXG4gIENvbnRleHRNZW51T3B0aW9ucyxcbiAgRGF0ZVJhbmdlVHlwZSxcbiAgRXJyb3JDb2RlcyxcbiAgRmlsdGVyTnVsbE9wdGlvbixcbiAgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gIFBlcmlvZFR5cGUsXG4gIFNlbGVjdGlvblVwZGF0ZVR5cGUsXG4gIFNoYXJlZEVycm9yQ29kZXMsXG4gIFRvb2x0aXBDb250ZXh0LFxufSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGF0YVNjaGVtYSwgRGF0YVNvdXJjZSBhcyBEYXRhU291cmNlSW5mbywgVmlzdWFsSWQsIFdvcmtzaGVldERhdGFTb3VyY2VJbmZvIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IERhdGFTb3VyY2UgfSBmcm9tICcuLi9EYXRhU291cmNlJztcbmltcG9ydCB7IExvZ2ljYWxUYWJsZSB9IGZyb20gJy4uL0xvZ2ljYWxUYWJsZSc7XG5pbXBvcnQgeyBBY2Nlc3NpYmlsaXR5U2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0FjY2Vzc2liaWxpdHlTZXJ2aWNlJztcbmltcG9ydCB7IEFubm90YXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvQW5ub3RhdGlvblNlcnZpY2UnO1xuaW1wb3J0IHsgRGF0YVNvdXJjZVNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9EYXRhU291cmNlU2VydmljZSc7XG5pbXBvcnQgeyBFeHRlcm5hbENvbnRleHRNZW51U2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0V4dGVybmFsQ29udGV4dE1lbnVTZXJ2aWNlJztcbmltcG9ydCB7IEZpbHRlclNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9GaWx0ZXJTZXJ2aWNlJztcbmltcG9ydCB7IEdldERhdGFTZXJ2aWNlLCBHZXREYXRhVHlwZSB9IGZyb20gJy4uL1NlcnZpY2VzL0dldERhdGFTZXJ2aWNlJztcbmltcG9ydCB7IFNlbGVjdGlvblNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZWxlY3Rpb25TZXJ2aWNlJztcbmltcG9ydCB7IEFwaVNlcnZpY2VSZWdpc3RyeSwgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFZpc3VhbE1vZGVsU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL1Zpc3VhbE1vZGVsU2VydmljZSc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgRXJyb3JIZWxwZXJzIH0gZnJvbSAnLi4vVXRpbHMvRXJyb3JIZWxwZXJzJztcbmltcG9ydCB7IERhc2hib2FyZEltcGwgfSBmcm9tICcuL0Rhc2hib2FyZEltcGwnO1xuaW1wb3J0IHsgRGF0YVNvdXJjZUltcGwgfSBmcm9tICcuL0RhdGFTb3VyY2VJbXBsJztcbmltcG9ydCB7IFNoZWV0SW1wbCB9IGZyb20gJy4vU2hlZXRJbXBsJztcbmltcG9ydCB7IFNoZWV0SW5mb0ltcGwgfSBmcm9tICcuL1NoZWV0SW5mb0ltcGwnO1xuaW1wb3J0IHsgU3RvcnlQb2ludEltcGwgfSBmcm9tICcuL1N0b3J5UG9pbnRJbXBsJztcblxuZXhwb3J0IGNsYXNzIFdvcmtzaGVldEltcGwgZXh0ZW5kcyBTaGVldEltcGwge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgc2hlZXRJbmZvSW1wbDogU2hlZXRJbmZvSW1wbCxcbiAgICBfcmVnaXN0cnlJZDogbnVtYmVyLFxuICAgIHByaXZhdGUgX3Zpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBwcml2YXRlIF9wYXJlbnREYXNoYm9hcmRJbXBsOiBEYXNoYm9hcmRJbXBsIHwgbnVsbCxcbiAgICBwcml2YXRlIF9wYXJlbnRTdG9yeVBvaW50SW1wbDogU3RvcnlQb2ludEltcGwgfCBudWxsLFxuICAgIHByaXZhdGUgX2JhY2tncm91bmRDb2xvcjogc3RyaW5nIHwgbnVsbCA9IG51bGwsXG4gICAgcHJpdmF0ZSBfZm9ybWF0dGluZzogQ29udHJhY3QuV29ya2Jvb2tGb3JtYXR0aW5nIHwgbnVsbCA9IG51bGwsXG4gICkge1xuICAgIHN1cGVyKHNoZWV0SW5mb0ltcGwsIF9yZWdpc3RyeUlkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcGFyZW50RGFzaGJvYXJkKCk6IERhc2hib2FyZEltcGwgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50RGFzaGJvYXJkSW1wbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcGFyZW50U3RvcnlQb2ludCgpOiBTdG9yeVBvaW50SW1wbCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9wYXJlbnRTdG9yeVBvaW50SW1wbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdmlzdWFsSWQoKTogVmlzdWFsSWQge1xuICAgIHJldHVybiB0aGlzLl92aXN1YWxJZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRNYXhQYWdlUm93TGltaXQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gMTAwMDA7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGJhY2tncm91bmRDb2xvcigpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fYmFja2dyb3VuZENvbG9yO1xuICB9XG5cbiAgcHVibGljIGdldCBmb3JtYXR0aW5nKCk6IENvbnRyYWN0LldvcmtzaGVldEZvcm1hdHRpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybWF0dGluZztcbiAgfVxuXG4gIHB1YmxpYyBhcHBseUZpbHRlckFzeW5jKFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHZhbHVlczogQXJyYXk8c3RyaW5nPixcbiAgICB1cGRhdGVUeXBlOiBDb250cmFjdC5GaWx0ZXJVcGRhdGVUeXBlLFxuICAgIG9wdGlvbnM6IENvbnRyYWN0LkZpbHRlck9wdGlvbnMsXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUVudW1WYWx1ZTxDb250cmFjdC5GaWx0ZXJVcGRhdGVUeXBlPih1cGRhdGVUeXBlLCBDb250cmFjdC5GaWx0ZXJVcGRhdGVUeXBlLCAnQ29udHJhY3QuRmlsdGVyVXBkYXRlVHlwZScpO1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RmlsdGVyU2VydmljZT4oU2VydmljZU5hbWVzLkZpbHRlcik7XG4gICAgcmV0dXJuIHNlcnZpY2UuYXBwbHlGaWx0ZXJBc3luYyh0aGlzLnZpc3VhbElkLCBmaWVsZE5hbWUsIHZhbHVlcywgdXBkYXRlVHlwZSwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlSYW5nZUZpbHRlckFzeW5jKGZpZWxkTmFtZTogc3RyaW5nLCBmaWx0ZXJPcHRpb25zOiBDb250cmFjdC5SYW5nZUZpbHRlck9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIoZmllbGROYW1lLCAnZmllbGROYW1lJyk7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihmaWx0ZXJPcHRpb25zLCAnZmlsdGVyT3B0aW9ucycpO1xuICAgIGlmIChmaWx0ZXJPcHRpb25zLm51bGxPcHRpb24pIHtcbiAgICAgIEVycm9ySGVscGVycy52ZXJpZnlFbnVtVmFsdWU8RmlsdGVyTnVsbE9wdGlvbj4oZmlsdGVyT3B0aW9ucy5udWxsT3B0aW9uLCBGaWx0ZXJOdWxsT3B0aW9uLCAnRmlsdGVyTnVsbE9wdGlvbicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBFcnJvckhlbHBlcnMudmVyaWZ5UmFuZ2VQYXJhbVR5cGUoZmlsdGVyT3B0aW9ucy5taW4sIGZpbHRlck9wdGlvbnMubWF4KTtcbiAgICB9XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxGaWx0ZXJTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRmlsdGVyKTtcbiAgICByZXR1cm4gc2VydmljZS5hcHBseVJhbmdlRmlsdGVyQXN5bmModGhpcy52aXN1YWxJZCwgZmllbGROYW1lLCBmaWx0ZXJPcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseUhpZXJhcmNoaWNhbEZpbHRlckFzeW5jKFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHZhbHVlczogQXJyYXk8c3RyaW5nPiB8IENvbnRyYWN0LkhpZXJhcmNoaWNhbExldmVscyxcbiAgICB1cGRhdGVUeXBlOiBDb250cmFjdC5GaWx0ZXJVcGRhdGVUeXBlLFxuICAgIG9wdGlvbnM6IENvbnRyYWN0LkZpbHRlck9wdGlvbnMsXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihmaWVsZE5hbWUsICdmaWVsZE5hbWUnKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKHZhbHVlcywgJ3ZhbHVlcycpO1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlFbnVtVmFsdWU8Q29udHJhY3QuRmlsdGVyVXBkYXRlVHlwZT4odXBkYXRlVHlwZSwgQ29udHJhY3QuRmlsdGVyVXBkYXRlVHlwZSwgJ0NvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGUnKTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWVzKSAmJiAhdmFsdWVzLmxldmVscykge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihcbiAgICAgICAgRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLFxuICAgICAgICAndmFsdWVzIHBhcmFtZXRlciBmb3IgYXBwbHlIaWVyYXJjaGljYWxGaWx0ZXJBc3luYyBtdXN0IGJlIGFuIGFycmF5IG9yIGNvbnRhaW4gYSBsZXZlbHMga2V5JyxcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RmlsdGVyU2VydmljZT4oU2VydmljZU5hbWVzLkZpbHRlcik7XG4gICAgcmV0dXJuIHNlcnZpY2UuYXBwbHlIaWVyYXJjaGljYWxGaWx0ZXJBc3luYyh0aGlzLnZpc3VhbElkLCBmaWVsZE5hbWUsIHZhbHVlcywgdXBkYXRlVHlwZSwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJGaWx0ZXJBc3luYyhmaWVsZE5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihmaWVsZE5hbWUsICdmaWVsZE5hbWUnKTtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEZpbHRlclNlcnZpY2U+KFNlcnZpY2VOYW1lcy5GaWx0ZXIpO1xuICAgIHJldHVybiBzZXJ2aWNlLmNsZWFyRmlsdGVyQXN5bmModGhpcy52aXN1YWxJZCwgZmllbGROYW1lKTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseVJlbGF0aXZlRGF0ZUZpbHRlckFzeW5jKGZpZWxkTmFtZTogc3RyaW5nLCBvcHRpb25zOiBDb250cmFjdC5SZWxhdGl2ZURhdGVGaWx0ZXJPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5U3RyaW5nUGFyYW1ldGVyKGZpZWxkTmFtZSwgJ2ZpZWxkTmFtZScpO1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIob3B0aW9ucywgJ29wdGlvbnMnKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPFBlcmlvZFR5cGU+KG9wdGlvbnMucGVyaW9kVHlwZSwgUGVyaW9kVHlwZSwgJ1BlcmlvZFR5cGUnKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPERhdGVSYW5nZVR5cGU+KG9wdGlvbnMucmFuZ2VUeXBlLCBEYXRlUmFuZ2VUeXBlLCAnRGF0ZVJhbmdlVHlwZScpO1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RmlsdGVyU2VydmljZT4oU2VydmljZU5hbWVzLkZpbHRlcik7XG4gICAgcmV0dXJuIHNlcnZpY2UuYXBwbHlSZWxhdGl2ZURhdGVGaWx0ZXJBc3luYyh0aGlzLnZpc3VhbElkLCBmaWVsZE5hbWUsIG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGdldERhdGFTb3VyY2VzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5EYXRhU291cmNlPj4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RGF0YVNvdXJjZVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5EYXRhU291cmNlU2VydmljZSk7XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0RGF0YVNvdXJjZXNBc3luYyh0aGlzLnZpc3VhbElkKS50aGVuPEFycmF5PENvbnRyYWN0LkRhdGFTb3VyY2U+PigocmVzdWx0KSA9PiB7XG4gICAgICBjb25zdCBkYXRhU2NoZW1hOiBEYXRhU2NoZW1hID0gcmVzdWx0O1xuICAgICAgY29uc3Qgd29ya3NoZWV0RGF0YVNvdXJjZUluZm86IFdvcmtzaGVldERhdGFTb3VyY2VJbmZvID0gZGF0YVNjaGVtYS53b3Jrc2hlZXREYXRhU2NoZW1hTWFwW3RoaXMubmFtZV07XG5cbiAgICAgIGNvbnN0IGRhdGFTb3VyY2VzOiBBcnJheTxDb250cmFjdC5EYXRhU291cmNlPiA9IFtdO1xuXG4gICAgICAvLyBGaXJzdCwgYWRkIHRoZSBwcmltYXJ5IGRhdGFzb3VyY2UuICBCeSBjb252ZW50aW9uLCBpdCBjb21lcyBmaXJzdCBpbiB0aGUgcmV0dXJuZWQgYXJyYXkuXG4gICAgICBjb25zdCBwcmltYXJ5SWQ6IHN0cmluZyA9IHdvcmtzaGVldERhdGFTb3VyY2VJbmZvLnByaW1hcnlEYXRhU291cmNlO1xuICAgICAgZGF0YVNvdXJjZXMucHVzaCh0aGlzLmNyZWF0ZURhdGFTb3VyY2VGcm9tSW5mbyhkYXRhU2NoZW1hLmRhdGFTb3VyY2VzW3ByaW1hcnlJZF0pKTtcblxuICAgICAgLy8gVGhlbiwgbG9vcCB0aHJvdWdoIGFueSBzZWNvbmRhcnkgZGF0YSBzb3VyY2VzIGFuZCBhZGQgdGhlbS5cbiAgICAgIGZvciAoY29uc3Qgc2Vjb25kYXJ5SWQgb2Ygd29ya3NoZWV0RGF0YVNvdXJjZUluZm8ucmVmZXJlbmNlZERhdGFTb3VyY2VMaXN0KSB7XG4gICAgICAgIGlmIChzZWNvbmRhcnlJZCAhPT0gcHJpbWFyeUlkKSB7XG4gICAgICAgICAgZGF0YVNvdXJjZXMucHVzaCh0aGlzLmNyZWF0ZURhdGFTb3VyY2VGcm9tSW5mbyhkYXRhU2NoZW1hLmRhdGFTb3VyY2VzW3NlY29uZGFyeUlkXSkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkYXRhU291cmNlcztcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRGaWx0ZXJzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5GaWx0ZXI+PiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxGaWx0ZXJTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRmlsdGVyKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRGaWx0ZXJzQXN5bmModGhpcy52aXN1YWxJZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2VsZWN0ZWRNYXJrc0FzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuTWFya3NDb2xsZWN0aW9uPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIHJldHVybiBzZXJ2aWNlLmdldFNlbGVjdGVkTWFya3NBc3luYyh0aGlzLnZpc3VhbElkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRIaWdobGlnaHRlZE1hcmtzQXN5bmMoKTogUHJvbWlzZTxDb250cmFjdC5NYXJrc0NvbGxlY3Rpb24+IHtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEdldERhdGFTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuR2V0RGF0YSk7XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0SGlnaGxpZ2h0ZWRNYXJrc0FzeW5jKHRoaXMudmlzdWFsSWQpO1xuICB9XG5cbiAgcHVibGljIGdldFN1bW1hcnlEYXRhQXN5bmMob3B0aW9uczogQ29udHJhY3QuR2V0U3VtbWFyeURhdGFPcHRpb25zKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+IHtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEdldERhdGFTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuR2V0RGF0YSk7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICByZXR1cm4gc2VydmljZS5nZXRVbmRlcmx5aW5nRGF0YUFzeW5jKFxuICAgICAgdGhpcy52aXN1YWxJZCxcbiAgICAgIEdldERhdGFUeXBlLlN1bW1hcnksXG4gICAgICAhIW9wdGlvbnMuaWdub3JlQWxpYXNlcyxcbiAgICAgICEhb3B0aW9ucy5pZ25vcmVTZWxlY3Rpb24sXG4gICAgICB0cnVlLFxuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlQnlJZCB8fCBbXSxcbiAgICAgIG9wdGlvbnMubWF4Um93cyB8fCAwLFxuICAgICAgb3B0aW9ucy5pbmNsdWRlRGF0YVZhbHVlc09wdGlvbiB8fCBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbi5BbGxWYWx1ZXMsXG4gICAgICBvcHRpb25zLmFwcGx5V29ya3NoZWV0Rm9ybWF0dGluZyA/PyBmYWxzZSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdldFN1bW1hcnlEYXRhUmVhZGVyQXN5bmMocGFnZVJvd0NvdW50OiBudW1iZXIsIG9wdGlvbnM6IENvbnRyYWN0LkdldFN1bW1hcnlEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlUmVhZGVyPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0U3VtbWFyeURhdGFSZWFkZXJBc3luYyhcbiAgICAgIHRoaXMudmlzdWFsSWQsXG4gICAgICBwYWdlUm93Q291bnQgfHwgdGhpcy5nZXRNYXhQYWdlUm93TGltaXQoKSxcbiAgICAgICEhb3B0aW9ucy5pZ25vcmVBbGlhc2VzLFxuICAgICAgISFvcHRpb25zLmlnbm9yZVNlbGVjdGlvbixcbiAgICAgIHRydWUsIC8vIGluY2x1ZGVBbGxDb2x1bW5zIChjYW4gYmUgb3ZlcnJpZGRlbiBieSBjb2x1bW5zVG9JbmNsdWRlQnlJZClcbiAgICAgIG9wdGlvbnMuY29sdW1uc1RvSW5jbHVkZUJ5SWQgfHwgW10sXG4gICAgICBvcHRpb25zLmluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uIHx8IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLkFsbFZhbHVlcyxcbiAgICAgIG9wdGlvbnMuYXBwbHlXb3Jrc2hlZXRGb3JtYXR0aW5nID8/IGZhbHNlLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VmlzdWFsU3BlY2lmaWNhdGlvbkFzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuVmlzdWFsU3BlY2lmaWNhdGlvbj4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8VmlzdWFsTW9kZWxTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuVmlzdWFsTW9kZWwpO1xuXG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0VmlzdWFsU3BlY2lmaWNhdGlvbkFzeW5jKHRoaXMudmlzdWFsSWQpO1xuICB9XG5cbiAgcHVibGljIGFkZE1hcmtzQ2FyZEZpZWxkc0FzeW5jKFxuICAgIG1hcmtzQ2FyZEluZGV4OiBudW1iZXIsXG4gICAgZW5jb2RpbmdUeXBlOiBDb250cmFjdC5FbmNvZGluZ1R5cGUsXG4gICAgY29sdW1uczogQXJyYXk8Q29udHJhY3QuQ29sdW1uPixcbiAgICBzdGFydEluZGV4OiBudW1iZXIsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8VmlzdWFsTW9kZWxTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuVmlzdWFsTW9kZWwpO1xuXG4gICAgcmV0dXJuIHNlcnZpY2UuYWRkTWFya3NDYXJkRmllbGRzQXN5bmModGhpcy52aXN1YWxJZCwgbWFya3NDYXJkSW5kZXgsIGVuY29kaW5nVHlwZSwgY29sdW1ucywgc3RhcnRJbmRleCk7XG4gIH1cblxuICBwdWJsaWMgbW92ZU1hcmtzQ2FyZEZpZWxkQXN5bmMobWFya3NDYXJkSW5kZXg6IG51bWJlciwgZnJvbUluZGV4OiBudW1iZXIsIHRvSW5kZXg6IG51bWJlciwgZmllbGRDb3VudDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxWaXN1YWxNb2RlbFNlcnZpY2U+KFNlcnZpY2VOYW1lcy5WaXN1YWxNb2RlbCk7XG5cbiAgICByZXR1cm4gc2VydmljZS5tb3ZlTWFya3NDYXJkRmllbGRBc3luYyh0aGlzLnZpc3VhbElkLCBtYXJrc0NhcmRJbmRleCwgZnJvbUluZGV4LCB0b0luZGV4LCBmaWVsZENvdW50KTtcbiAgfVxuXG4gIHB1YmxpYyBzcGxpY2VNYXJrc0NhcmRGaWVsZHNBc3luYyhcbiAgICBtYXJrc0NhcmRJbmRleDogbnVtYmVyLFxuICAgIGVuY29kaW5nVHlwZTogQ29udHJhY3QuRW5jb2RpbmdUeXBlLFxuICAgIHN0YXJ0SW5kZXg6IG51bWJlcixcbiAgICBkZWxldGVDb3VudDogbnVtYmVyLFxuICAgIGNvbHVtbnM6IEFycmF5PENvbnRyYWN0LkNvbHVtbj4sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8VmlzdWFsTW9kZWxTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuVmlzdWFsTW9kZWwpO1xuXG4gICAgcmV0dXJuIHNlcnZpY2Uuc3BsaWNlTWFya3NDYXJkRmllbGRzQXN5bmModGhpcy52aXN1YWxJZCwgbWFya3NDYXJkSW5kZXgsIGVuY29kaW5nVHlwZSwgc3RhcnRJbmRleCwgZGVsZXRlQ291bnQsIGNvbHVtbnMpO1xuICB9XG5cbiAgcHVibGljIGdldFN1bW1hcnlDb2x1bW5zSW5mb0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuQ29sdW1uPj4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8R2V0RGF0YVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5HZXREYXRhKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRTdW1tYXJ5Q29sdW1uc0luZm9Bc3luYyh0aGlzLnZpc3VhbElkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmRlcmx5aW5nRGF0YUFzeW5jKG9wdGlvbnM6IENvbnRyYWN0LkdldFVuZGVybHlpbmdEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIHJldHVybiBzZXJ2aWNlLmdldFVuZGVybHlpbmdEYXRhQXN5bmMoXG4gICAgICB0aGlzLnZpc3VhbElkLFxuICAgICAgR2V0RGF0YVR5cGUuVW5kZXJseWluZyxcbiAgICAgICEhb3B0aW9ucy5pZ25vcmVBbGlhc2VzLFxuICAgICAgISFvcHRpb25zLmlnbm9yZVNlbGVjdGlvbixcbiAgICAgICEhb3B0aW9ucy5pbmNsdWRlQWxsQ29sdW1ucyxcbiAgICAgIG9wdGlvbnMuY29sdW1uc1RvSW5jbHVkZUJ5SWQgfHwgW10sXG4gICAgICBvcHRpb25zLm1heFJvd3MgfHwgMCxcbiAgICAgIG9wdGlvbnMuaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gfHwgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uQWxsVmFsdWVzLFxuICAgICAgb3B0aW9ucy5hcHBseVdvcmtzaGVldEZvcm1hdHRpbmcgPz8gZmFsc2UsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmRlcmx5aW5nVGFibGVzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5Mb2dpY2FsVGFibGU+PiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxEYXRhU291cmNlU2VydmljZT4oU2VydmljZU5hbWVzLkRhdGFTb3VyY2VTZXJ2aWNlKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRVbmRlcmx5aW5nVGFibGVzQXN5bmModGhpcy52aXN1YWxJZCkudGhlbjxBcnJheTxDb250cmFjdC5Mb2dpY2FsVGFibGU+PigobG9naWNhbFRhYmxlSW5mb3MpID0+IHtcbiAgICAgIHJldHVybiBsb2dpY2FsVGFibGVJbmZvcy5tYXAoKGxvZ2ljYWxUYWJsZUluZm8pID0+IG5ldyBMb2dpY2FsVGFibGUobG9naWNhbFRhYmxlSW5mbykpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldFVuZGVybHlpbmdUYWJsZURhdGFBc3luYyhsb2dpY2FsVGFibGVJZDogc3RyaW5nLCBvcHRpb25zPzogQ29udHJhY3QuR2V0VW5kZXJseWluZ0RhdGFPcHRpb25zKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+IHtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEdldERhdGFTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuR2V0RGF0YSk7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0VW5kZXJseWluZ1RhYmxlRGF0YUFzeW5jKFxuICAgICAgdGhpcy52aXN1YWxJZCxcbiAgICAgIGxvZ2ljYWxUYWJsZUlkLFxuICAgICAgISFvcHRpb25zLmlnbm9yZUFsaWFzZXMsXG4gICAgICAhIW9wdGlvbnMuaWdub3JlU2VsZWN0aW9uLFxuICAgICAgISFvcHRpb25zLmluY2x1ZGVBbGxDb2x1bW5zLFxuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlQnlJZCB8fCBbXSxcbiAgICAgIG9wdGlvbnMubWF4Um93cyB8fCAwLFxuICAgICAgb3B0aW9ucy5pbmNsdWRlRGF0YVZhbHVlc09wdGlvbiB8fCBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbi5BbGxWYWx1ZXMsXG4gICAgICBvcHRpb25zLmFwcGx5V29ya3NoZWV0Rm9ybWF0dGluZyA/PyBmYWxzZSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdldFVuZGVybHlpbmdUYWJsZURhdGFSZWFkZXJBc3luYyhcbiAgICBsb2dpY2FsVGFibGVJZDogc3RyaW5nLFxuICAgIHBhZ2VSb3dDb3VudD86IG51bWJlcixcbiAgICBvcHRpb25zPzogQ29udHJhY3QuR2V0VW5kZXJseWluZ0RhdGFPcHRpb25zLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZVJlYWRlcj4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8R2V0RGF0YVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5HZXREYXRhKTtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRVbmRlcmx5aW5nVGFibGVEYXRhUmVhZGVyQXN5bmMoXG4gICAgICB0aGlzLnZpc3VhbElkLFxuICAgICAgbG9naWNhbFRhYmxlSWQsXG4gICAgICBwYWdlUm93Q291bnQgfHwgdGhpcy5nZXRNYXhQYWdlUm93TGltaXQoKSxcbiAgICAgICEhb3B0aW9ucy5pZ25vcmVBbGlhc2VzLFxuICAgICAgISFvcHRpb25zLmlnbm9yZVNlbGVjdGlvbixcbiAgICAgICEhb3B0aW9ucy5pbmNsdWRlQWxsQ29sdW1ucyxcbiAgICAgIG9wdGlvbnMuY29sdW1uc1RvSW5jbHVkZUJ5SWQgfHwgW10sXG4gICAgICBvcHRpb25zLmluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uIHx8IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLkFsbFZhbHVlcyxcbiAgICAgIG9wdGlvbnMuYXBwbHlXb3Jrc2hlZXRGb3JtYXR0aW5nID8/IGZhbHNlLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJTZWxlY3RlZE1hcmtzQXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxTZWxlY3Rpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuU2VsZWN0aW9uKTtcbiAgICByZXR1cm4gc2VydmljZS5jbGVhclNlbGVjdGVkTWFya3NBc3luYyh0aGlzLnZpc3VhbElkKTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RNYXJrc0J5VmFsdWVBc3luYyhzZWxlY3Rpb25zOiBBcnJheTxDb250cmFjdC5TZWxlY3Rpb25Dcml0ZXJpYT4sIHNlbGVjdGlvblVwZGF0ZVR5cGU6IFNlbGVjdGlvblVwZGF0ZVR5cGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKHNlbGVjdGlvbnMsICdmaWVsZE5hbWUnKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPFNlbGVjdGlvblVwZGF0ZVR5cGU+KHNlbGVjdGlvblVwZGF0ZVR5cGUsIFNlbGVjdGlvblVwZGF0ZVR5cGUsICdTZWxlY3Rpb25VcGRhdGVUeXBlJyk7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxTZWxlY3Rpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuU2VsZWN0aW9uKTtcbiAgICByZXR1cm4gc2VydmljZS5zZWxlY3RNYXJrc0J5VmFsdWVBc3luYyh0aGlzLnZpc3VhbElkLCBzZWxlY3Rpb25zLCBzZWxlY3Rpb25VcGRhdGVUeXBlKTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RNYXJrc0J5SWRBc3luYyhzZWxlY3Rpb25zOiBBcnJheTxDb250cmFjdC5NYXJrSW5mbz4sIHNlbGVjdGlvblVwZGF0ZVR5cGU6IFNlbGVjdGlvblVwZGF0ZVR5cGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKHNlbGVjdGlvbnMsICdmaWVsZE5hbWUnKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPFNlbGVjdGlvblVwZGF0ZVR5cGU+KHNlbGVjdGlvblVwZGF0ZVR5cGUsIFNlbGVjdGlvblVwZGF0ZVR5cGUsICdTZWxlY3Rpb25VcGRhdGVUeXBlJyk7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxTZWxlY3Rpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuU2VsZWN0aW9uKTtcbiAgICByZXR1cm4gc2VydmljZS5zZWxlY3RNYXJrc0J5SWRBc3luYyh0aGlzLnZpc3VhbElkLCBzZWxlY3Rpb25zLCBzZWxlY3Rpb25VcGRhdGVUeXBlKTtcbiAgfVxuXG4gIHB1YmxpYyBhbm5vdGF0ZU1hcmtBc3luYyhtYXJrOiBDb250cmFjdC5NYXJrSW5mbywgYW5ub3RhdGlvblRleHQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIobWFyaywgJ21hcmsnKTtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEFubm90YXRpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuQW5ub3RhdGlvbik7XG4gICAgcmV0dXJuIHNlcnZpY2UuYW5ub3RhdGVNYXJrQXN5bmModGhpcy52aXN1YWxJZCwgbWFyaywgYW5ub3RhdGlvblRleHQpO1xuICB9XG5cbiAgcHVibGljIGdldEFubm90YXRpb25zQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5Bbm5vdGF0aW9uPj4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8QW5ub3RhdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5Bbm5vdGF0aW9uKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRBbm5vdGF0aW9uc0FzeW5jKHRoaXMudmlzdWFsSWQpO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUFubm90YXRpb25Bc3luYyhhbm5vdGF0aW9uOiBDb250cmFjdC5Bbm5vdGF0aW9uKSB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihhbm5vdGF0aW9uLCAnYW5ub3RhdGlvbicpO1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8QW5ub3RhdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5Bbm5vdGF0aW9uKTtcbiAgICByZXR1cm4gc2VydmljZS5yZW1vdmVBbm5vdGF0aW9uQXN5bmModGhpcy52aXN1YWxJZCwgYW5ub3RhdGlvbik7XG4gIH1cblxuICBwdWJsaWMgYXBwZW5kQ29udGV4dE1lbnVBc3luYyh0YXJnZXRNZW51OiBBcGlNZW51VHlwZSwgY29uZmlnOiBDb250ZXh0TWVudU9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RXh0ZXJuYWxDb250ZXh0TWVudVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5FeHRlcm5hbENvbnRleHRNZW51KTtcbiAgICByZXR1cm4gc2VydmljZS5hcHBlbmRDb250ZXh0TWVudUFzeW5jKHRoaXMudmlzdWFsSWQud29ya3NoZWV0LCB0YXJnZXRNZW51LCBjb25maWcpO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUNvbnRleHRNZW51QXN5bmModGFyZ2V0TWVudTogQXBpTWVudVR5cGUsIG1lbnVJdGVtSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RXh0ZXJuYWxDb250ZXh0TWVudVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5FeHRlcm5hbENvbnRleHRNZW51KTtcbiAgICByZXR1cm4gc2VydmljZS5yZW1vdmVDb250ZXh0TWVudUFzeW5jKHRoaXMudmlzdWFsSWQud29ya3NoZWV0LCB0YXJnZXRNZW51LCBtZW51SXRlbUlkKTtcbiAgfVxuXG4gIHB1YmxpYyBleGVjdXRlQ29udGV4dE1lbnVBc3luYyh0YXJnZXRNZW51OiBBcGlNZW51VHlwZSwgbWVudUl0ZW1JZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxFeHRlcm5hbENvbnRleHRNZW51U2VydmljZT4oU2VydmljZU5hbWVzLkV4dGVybmFsQ29udGV4dE1lbnUpO1xuICAgIHJldHVybiBzZXJ2aWNlLmV4ZWN1dGVDb250ZXh0TWVudUFzeW5jKHRoaXMudmlzdWFsSWQud29ya3NoZWV0LCB0YXJnZXRNZW51LCBtZW51SXRlbUlkKTtcbiAgfVxuXG4gIHB1YmxpYyByZW5hbWVDb250ZXh0TWVudUFzeW5jKHRhcmdldE1lbnU6IEFwaU1lbnVUeXBlLCBtZW51SGVhZGVyOiBzdHJpbmcsIG1lbnVEZXNjcmlwdGlvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxFeHRlcm5hbENvbnRleHRNZW51U2VydmljZT4oU2VydmljZU5hbWVzLkV4dGVybmFsQ29udGV4dE1lbnUpO1xuICAgIHJldHVybiBzZXJ2aWNlLnJlbmFtZUNvbnRleHRNZW51QXN5bmModGhpcy52aXN1YWxJZC53b3Jrc2hlZXQsIHRhcmdldE1lbnUsIG1lbnVIZWFkZXIsIG1lbnVEZXNjcmlwdGlvbik7XG4gIH1cblxuICBwdWJsaWMgaG92ZXJUdXBsZUFzeW5jKGhvdmVyZWRUdXBsZT86IG51bWJlciwgdG9vbHRpcD86IFRvb2x0aXBDb250ZXh0IHwgbnVsbCwgYWxsb3dIb3ZlckFjdGlvbnM/OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaXNJbnNpZGVEYXNoYm9hcmRFeHRlbnNpb24oKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KFxuICAgICAgICBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LlNoYXJlZEVycm9yQ29kZXMuSW1wbGVtZW50YXRpb25FcnJvciwgYGhvdmVyVHVwbGVBc3luYyBpcyBub3Qgc3VwcG9ydGVkIGluIGRhc2hib2FyZCBleHRlbnNpb25zYCksXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8U2VsZWN0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLlNlbGVjdGlvbik7XG4gICAgcmV0dXJuIHNlcnZpY2UuaG92ZXJUdXBsZUFzeW5jKHRoaXMudmlzdWFsSWQsIGhvdmVyZWRUdXBsZSwgdG9vbHRpcCwgYWxsb3dIb3ZlckFjdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIHNlbGVjdFR1cGxlc0FzeW5jKHNlbGVjdGVkVHVwbGVzOiBBcnJheTxudW1iZXI+LCBzZWxlY3RPcHRpb246IENvbnRyYWN0LlNlbGVjdE9wdGlvbnMsIHRvb2x0aXA/OiBUb29sdGlwQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmlzSW5zaWRlRGFzaGJvYXJkRXh0ZW5zaW9uKCkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcbiAgICAgICAgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5TaGFyZWRFcnJvckNvZGVzLkltcGxlbWVudGF0aW9uRXJyb3IsIGBzZWxlY3RUdXBsZXNBc3luYyBpcyBub3Qgc3VwcG9ydGVkIGluIGRhc2hib2FyZCBleHRlbnNpb25zYCksXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8U2VsZWN0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLlNlbGVjdGlvbik7XG4gICAgcmV0dXJuIHNlcnZpY2Uuc2VsZWN0VHVwbGVzQXN5bmModGhpcy52aXN1YWxJZCwgc2VsZWN0ZWRUdXBsZXMsIHNlbGVjdE9wdGlvbiwgdG9vbHRpcCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VG9vbHRpcFRleHRBc3luYyh0dXBsZUlkOiBudW1iZXIpOiBQcm9taXNlPFN0cmluZz4ge1xuICAgIGlmICh0aGlzLmlzSW5zaWRlRGFzaGJvYXJkRXh0ZW5zaW9uKCkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcbiAgICAgICAgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5TaGFyZWRFcnJvckNvZGVzLkltcGxlbWVudGF0aW9uRXJyb3IsIGBnZXRUb29sdGlwVGV4dEFzeW5jIGlzIG5vdCBzdXBwb3J0ZWQgaW4gZGFzaGJvYXJkIGV4dGVuc2lvbnNgKSxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8QWNjZXNzaWJpbGl0eVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5BY2Nlc3NpYmlsaXR5KTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRUb29sdGlwVGV4dEFzeW5jKHRoaXMudmlzdWFsSWQsIHR1cGxlSWQpO1xuICB9XG5cbiAgcHVibGljIGxlYXZlTWFya05hdmlnYXRpb25Bc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pc0luc2lkZURhc2hib2FyZEV4dGVuc2lvbigpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXG4gICAgICAgIG5ldyBUYWJsZWF1RXJyb3IoXG4gICAgICAgICAgQ29udHJhY3QuU2hhcmVkRXJyb3JDb2Rlcy5JbXBsZW1lbnRhdGlvbkVycm9yLFxuICAgICAgICAgIGBsZWF2ZU1hcmtOYXZpZ2F0aW9uQXN5bmMgaXMgbm90IHN1cHBvcnRlZCBpbiBkYXNoYm9hcmQgZXh0ZW5zaW9uc2AsXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEFjY2Vzc2liaWxpdHlTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuQWNjZXNzaWJpbGl0eSk7XG4gICAgcmV0dXJuIHNlcnZpY2UubGVhdmVNYXJrTmF2aWdhdGlvbkFzeW5jKHRoaXMudmlzdWFsSWQpO1xuICB9XG5cbiAgcHVibGljIGVkaXRBbGlhc2VzRGlhbG9nQXN5bmMoZmllbGROYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFZpc3VhbE1vZGVsU2VydmljZT4oU2VydmljZU5hbWVzLlZpc3VhbE1vZGVsKTtcbiAgICByZXR1cm4gc2VydmljZS5lZGl0QWxpYXNlc0RpYWxvZ0FzeW5jKGZpZWxkTmFtZSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZURhdGFTb3VyY2VGcm9tSW5mbyhkYXRhU291cmNlSW5mbzogRGF0YVNvdXJjZUluZm8pOiBDb250cmFjdC5EYXRhU291cmNlIHtcbiAgICBjb25zdCBkYXRhU291cmNlSW1wbCA9IG5ldyBEYXRhU291cmNlSW1wbChkYXRhU291cmNlSW5mbywgdGhpcy5fcmVnaXN0cnlJZCk7XG4gICAgY29uc3QgZGF0YVNvdXJjZSA9IG5ldyBEYXRhU291cmNlKGRhdGFTb3VyY2VJbXBsKTtcbiAgICBkYXRhU291cmNlSW1wbC5pbml0aWFsaXplV2l0aFB1YmxpY0ludGVyZmFjZXMoZGF0YVNvdXJjZSk7XG4gICAgcmV0dXJuIGRhdGFTb3VyY2U7XG4gIH1cblxuICBwcml2YXRlIHZlcmlmeUFjdGl2ZVNoZWV0KCkge1xuICAgIGNvbnN0IGlzUm9vdEFuZEFjdGl2ZVdvcmtzaGVldCA9IHRoaXMuYWN0aXZlO1xuICAgIGNvbnN0IGlzSW5zaWRlQWN0aXZlRGFzaGJvYXJkID0gdGhpcy5pc0luc2lkZUFjdGl2ZURhc2hib2FyZCgpO1xuICAgIGNvbnN0IGlzSW5zaWRlQWN0aXZlU3RvcnlQb2ludCA9IHRoaXMuaXNJbnNpZGVBY3RpdmVTdG9yeVBvaW50KCk7XG5cbiAgICBpZiAoIWlzUm9vdEFuZEFjdGl2ZVdvcmtzaGVldCAmJiAhaXNJbnNpZGVBY3RpdmVEYXNoYm9hcmQgJiYgIWlzSW5zaWRlQWN0aXZlU3RvcnlQb2ludCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLk5vdEFjdGl2ZVNoZWV0LCAnT3BlcmF0aW9uIG5vdCBhbGxvd2VkIG9uIG5vbi1hY3RpdmUgc2hlZXQnKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGlzSW5zaWRlQWN0aXZlU3RvcnlQb2ludCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50U3RvcnlQb2ludEltcGwgJiYgdGhpcy5fcGFyZW50U3RvcnlQb2ludEltcGwuYWN0aXZlO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0luc2lkZUFjdGl2ZURhc2hib2FyZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50RGFzaGJvYXJkSW1wbCAmJiB0aGlzLl9wYXJlbnREYXNoYm9hcmRJbXBsLmFjdGl2ZTtcbiAgfVxuXG4gIHByaXZhdGUgaXNJbnNpZGVEYXNoYm9hcmRFeHRlbnNpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudERhc2hib2FyZEltcGwgIT09IG51bGw7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBMb2dpY2FsVGFibGVJbmZvIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiBhIGxvZ2ljYWwgdGFibGUuXG4gKiBUaGlzIGRvZXMgbm90IGZvbGxvdyB0aGUgSW1wbCBwYXR0ZXJuIGFzIGl0IGlzIGp1c3QgYSBwcm9wZXJ0eSBiYWcuXG4gKi9cbmV4cG9ydCBjbGFzcyBMb2dpY2FsVGFibGUgaW1wbGVtZW50cyBDb250cmFjdC5Mb2dpY2FsVGFibGUge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfbG9naWNhbFRhYmxlOiBMb2dpY2FsVGFibGVJbmZvKSB7fVxuXG4gIHB1YmxpYyBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbG9naWNhbFRhYmxlLmlkO1xuICB9XG5cbiAgcHVibGljIGdldCBjYXB0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2xvZ2ljYWxUYWJsZS5jYXB0aW9uO1xuICB9XG59XG4iLCJpbXBvcnQgeyBUb29sdGlwVGV4dFJlcXVlc3QsIFZpc3VhbElkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuZXhwb3J0IGNsYXNzIFRvb2x0aXBUZXh0UmVxdWVzdE1vZGVsIGltcGxlbWVudHMgVG9vbHRpcFRleHRSZXF1ZXN0IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyB2aXN1YWxJZFByZXNNb2RlbDogVmlzdWFsSWQsIHB1YmxpYyB0dXBsZUlkOiBudW1iZXIpIHt9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGF0ZVJhbmdlVHlwZSwgRmlsdGVyRG9tYWluVHlwZSwgRmlsdGVyVHlwZSwgUGVyaW9kVHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL2xpYi9zcmMvRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvTmFtZXNwYWNlcy9UYWJsZWF1JztcbmltcG9ydCB7IERhdGFTb3VyY2VTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvRGF0YVNvdXJjZVNlcnZpY2UnO1xuaW1wb3J0IHsgRmlsdGVyU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0ZpbHRlclNlcnZpY2UnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5LCBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgRXJyb3JIZWxwZXJzIH0gZnJvbSAnLi4vVXRpbHMvRXJyb3JIZWxwZXJzJztcblxuZXhwb3J0IGNsYXNzIEZpbHRlciBpbXBsZW1lbnRzIENvbnRyYWN0LkZpbHRlciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgX3dvcmtzaGVldE5hbWU6IHN0cmluZyxcbiAgICBwcm90ZWN0ZWQgX2ZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHByb3RlY3RlZCBfZmlsdGVyVHlwZTogRmlsdGVyVHlwZSxcbiAgICBwcm90ZWN0ZWQgX2ZpZWxkSWQ6IHN0cmluZyxcbiAgICBwcm90ZWN0ZWQgX3JlZ2lzdHJ5SWQ6IG51bWJlcixcbiAgKSB7fVxuXG4gIHB1YmxpYyBnZXQgd29ya3NoZWV0TmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXROYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWVsZE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGROYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWVsZElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZpbHRlclR5cGUoKTogRmlsdGVyVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbHRlclR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0RmllbGRBc3luYygpOiBQcm9taXNlPENvbnRyYWN0LkZpZWxkPiB7XG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxEYXRhU291cmNlU2VydmljZT4oU2VydmljZU5hbWVzLkRhdGFTb3VyY2VTZXJ2aWNlKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRGaWVsZEFzeW5jKHRoaXMuX2ZpZWxkSWQpO1xuICB9XG5cbiAgcHVibGljIGdldEFwcGxpZWRXb3Jrc2hlZXRzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxzdHJpbmc+PiB7XG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxGaWx0ZXJTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRmlsdGVyKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRBcHBsaWVkV29ya3NoZWV0c0FzeW5jKHRoaXMuX3dvcmtzaGVldE5hbWUsIHRoaXMuX2ZpZWxkSWQpO1xuICB9XG5cbiAgcHVibGljIHNldEFwcGxpZWRXb3Jrc2hlZXRzQXN5bmMoYXBwbHlUb1dvcmtzaGVldHM6IEFycmF5PHN0cmluZz4pOiBQcm9taXNlPEFycmF5PHN0cmluZz4+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKGFwcGx5VG9Xb3Jrc2hlZXRzLCAnYXBwbHlUb1dvcmtzaGVldHMnKTtcbiAgICBjb25zdCB1bmlxdWVXb3Jrc2hlZXRzID0gbmV3IFNldChhcHBseVRvV29ya3NoZWV0cyk7XG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxGaWx0ZXJTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRmlsdGVyKTtcbiAgICByZXR1cm4gc2VydmljZS5zZXRBcHBsaWVkV29ya3NoZWV0c0FzeW5jKHRoaXMuX3dvcmtzaGVldE5hbWUsIHRoaXMuX2ZpZWxkTmFtZSwgdGhpcy5fZmllbGRJZCwgQXJyYXkuZnJvbSh1bmlxdWVXb3Jrc2hlZXRzKSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENhdGVnb3JpY2FsRmlsdGVyIGV4dGVuZHMgRmlsdGVyIGltcGxlbWVudHMgQ29udHJhY3QuQ2F0ZWdvcmljYWxGaWx0ZXIge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgd29ya3NoZWV0TmFtZTogc3RyaW5nLFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIGZpZWxkSWQ6IHN0cmluZyxcbiAgICBmaWx0ZXJUeXBlOiBGaWx0ZXJUeXBlLFxuICAgIHJlZ2lzdHJ5SWQ6IG51bWJlcixcbiAgICBwcml2YXRlIF9hcHBsaWVkVmFsdWVzOiBBcnJheTxDb250cmFjdC5EYXRhVmFsdWU+LFxuICAgIHByaXZhdGUgX2lzRXhjbHVkZU1vZGU6IGJvb2xlYW4sXG4gICAgcHJpdmF0ZSBfaXNBbGxTZWxlY3RlZD86IGJvb2xlYW4sXG4gICkge1xuICAgIHN1cGVyKHdvcmtzaGVldE5hbWUsIGZpZWxkTmFtZSwgZmlsdGVyVHlwZSwgZmllbGRJZCwgcmVnaXN0cnlJZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzQWxsU2VsZWN0ZWQoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2lzQWxsU2VsZWN0ZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFwcGxpZWRWYWx1ZXMoKTogQXJyYXk8Q29udHJhY3QuRGF0YVZhbHVlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwcGxpZWRWYWx1ZXM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzRXhjbHVkZU1vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzRXhjbHVkZU1vZGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0RG9tYWluQXN5bmMoZG9tYWluVHlwZT86IEZpbHRlckRvbWFpblR5cGUpOiBQcm9taXNlPENvbnRyYWN0LkNhdGVnb3JpY2FsRG9tYWluPiB7XG4gICAgaWYgKCFkb21haW5UeXBlKSB7XG4gICAgICBkb21haW5UeXBlID0gRmlsdGVyRG9tYWluVHlwZS5SZWxldmFudDtcbiAgICB9XG5cbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPEZpbHRlckRvbWFpblR5cGU+KGRvbWFpblR5cGUsIEZpbHRlckRvbWFpblR5cGUsICdGaWx0ZXJEb21haW5UeXBlJyk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEZpbHRlclNlcnZpY2U+KFNlcnZpY2VOYW1lcy5GaWx0ZXIpO1xuICAgIHJldHVybiBzZXJ2aWNlLmdldENhdGVnb3JpY2FsRG9tYWluQXN5bmModGhpcy5fd29ya3NoZWV0TmFtZSwgdGhpcy5fZmllbGRJZCwgZG9tYWluVHlwZSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEhpZXJhcmNoaWNhbERhdGFWYWx1ZSBpbXBsZW1lbnRzIENvbnRyYWN0LkhpZXJhcmNoaWNhbEZpbHRlckRhdGFWYWx1ZSB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF92YWx1ZTogQ29udHJhY3QuRGF0YVZhbHVlLCBwcml2YXRlIF9oaWVyYXJjaGljYWxQYXRoOiBzdHJpbmcsIHByaXZhdGUgX2xldmVsOiBudW1iZXIpIHt9XG5cbiAgcHVibGljIGdldCB2YWx1ZSgpOiBDb250cmFjdC5EYXRhVmFsdWUge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaGllcmFyY2hpY2FsUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9oaWVyYXJjaGljYWxQYXRoO1xuICB9XG5cbiAgcHVibGljIGdldCBsZXZlbCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9sZXZlbDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSGllcmFyY2hpY2FsTGV2ZWxEZXRhaWwgaW1wbGVtZW50cyBDb250cmFjdC5IaWVyYXJjaGljYWxMZXZlbERldGFpbCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9uYW1lOiBzdHJpbmcsIHByaXZhdGUgX2xldmVsU2VsZWN0aW9uU3RhdGU6IEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUpIHt9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX25hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGxldmVsU2VsZWN0aW9uU3RhdGUoKTogSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuX2xldmVsU2VsZWN0aW9uU3RhdGU7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEhpZXJhcmNoaWNhbEZpbHRlciBleHRlbmRzIEZpbHRlciBpbXBsZW1lbnRzIENvbnRyYWN0LkhpZXJhcmNoaWNhbEZpbHRlciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICB3b3Jrc2hlZXROYW1lOiBzdHJpbmcsXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgZmllbGRJZDogc3RyaW5nLFxuICAgIGZpbHRlclR5cGU6IEZpbHRlclR5cGUsXG4gICAgcmVnaXN0cnlJZDogbnVtYmVyLFxuICAgIHByaXZhdGUgX2RpbWVuc2lvbk5hbWU6IHN0cmluZyxcbiAgICBwcml2YXRlIF9oaWVyYXJjaHlDYXB0aW9uOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBfbnVtYmVyT2ZMZXZlbHM6IG51bWJlcixcbiAgICBwcml2YXRlIF9sZXZlbERldGFpbHM6IEFycmF5PENvbnRyYWN0LkhpZXJhcmNoaWNhbExldmVsRGV0YWlsPixcbiAgICBwcml2YXRlIF9hcHBsaWVkVmFsdWVzOiBBcnJheTxDb250cmFjdC5IaWVyYXJjaGljYWxGaWx0ZXJEYXRhVmFsdWU+LFxuICAgIHByaXZhdGUgX2lzQWxsU2VsZWN0ZWQ6IGJvb2xlYW4sXG4gICkge1xuICAgIHN1cGVyKHdvcmtzaGVldE5hbWUsIGZpZWxkTmFtZSwgZmlsdGVyVHlwZSwgZmllbGRJZCwgcmVnaXN0cnlJZCk7XG4gIH1cbiAgZ2V0RG9tYWluQXN5bmMoZG9tYWluVHlwZT86IENvbnRyYWN0LkZpbHRlckRvbWFpblR5cGUpOiBQcm9taXNlPENvbnRyYWN0LkNhdGVnb3JpY2FsRG9tYWluPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG5cbiAgcHVibGljIGdldCBkaW1lbnNpb25OYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2RpbWVuc2lvbk5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGhpZXJhcmNoeUNhcHRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5faGllcmFyY2h5Q2FwdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbnVtYmVyT2ZMZXZlbHMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fbnVtYmVyT2ZMZXZlbHM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGxldmVsRGV0YWlscygpOiBDb250cmFjdC5IaWVyYXJjaGljYWxMZXZlbERldGFpbFtdIHtcbiAgICByZXR1cm4gdGhpcy5fbGV2ZWxEZXRhaWxzO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0FsbFNlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc0FsbFNlbGVjdGVkO1xuICB9XG5cbiAgcHVibGljIGdldCBhcHBsaWVkVmFsdWVzKCk6IEFycmF5PENvbnRyYWN0LkhpZXJhcmNoaWNhbEZpbHRlckRhdGFWYWx1ZT4ge1xuICAgIHJldHVybiB0aGlzLl9hcHBsaWVkVmFsdWVzO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSYW5nZUZpbHRlciBleHRlbmRzIEZpbHRlciBpbXBsZW1lbnRzIENvbnRyYWN0LlJhbmdlRmlsdGVyIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHdvcmtzaGVldE5hbWU6IHN0cmluZyxcbiAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICBmaWVsZElkOiBzdHJpbmcsXG4gICAgZmlsdGVyVHlwZTogRmlsdGVyVHlwZSxcbiAgICByZWdpc3RyeUlkOiBudW1iZXIsXG4gICAgcHJpdmF0ZSBfbWluOiBDb250cmFjdC5EYXRhVmFsdWUsXG4gICAgcHJpdmF0ZSBfbWF4OiBDb250cmFjdC5EYXRhVmFsdWUsXG4gICAgcHJpdmF0ZSBfaW5jbHVkZU51bGxWYWx1ZXM6IGJvb2xlYW4sXG4gICkge1xuICAgIHN1cGVyKHdvcmtzaGVldE5hbWUsIGZpZWxkTmFtZSwgZmlsdGVyVHlwZSwgZmllbGRJZCwgcmVnaXN0cnlJZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG1pblZhbHVlKCk6IENvbnRyYWN0LkRhdGFWYWx1ZSB7XG4gICAgcmV0dXJuIHRoaXMuX21pbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbWF4VmFsdWUoKTogQ29udHJhY3QuRGF0YVZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5fbWF4O1xuICB9XG5cbiAgcHVibGljIGdldCBpbmNsdWRlTnVsbFZhbHVlcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faW5jbHVkZU51bGxWYWx1ZXM7XG4gIH1cblxuICBwdWJsaWMgZ2V0RG9tYWluQXN5bmMoZG9tYWluVHlwZT86IEZpbHRlckRvbWFpblR5cGUpOiBQcm9taXNlPENvbnRyYWN0LlJhbmdlRG9tYWluPiB7XG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxGaWx0ZXJTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRmlsdGVyKTtcbiAgICBpZiAoIWRvbWFpblR5cGUpIHtcbiAgICAgIGRvbWFpblR5cGUgPSBGaWx0ZXJEb21haW5UeXBlLlJlbGV2YW50O1xuICAgIH1cblxuICAgIEVycm9ySGVscGVycy52ZXJpZnlFbnVtVmFsdWU8RmlsdGVyRG9tYWluVHlwZT4oZG9tYWluVHlwZSwgRmlsdGVyRG9tYWluVHlwZSwgJ0ZpbHRlckRvbWFpblR5cGUnKTtcblxuICAgIHJldHVybiBzZXJ2aWNlLmdldFJhbmdlRG9tYWluQXN5bmModGhpcy5fd29ya3NoZWV0TmFtZSwgdGhpcy5fZmllbGRJZCwgZG9tYWluVHlwZSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJlbGF0aXZlRGF0ZUZpbHRlciBleHRlbmRzIEZpbHRlciBpbXBsZW1lbnRzIENvbnRyYWN0LlJlbGF0aXZlRGF0ZUZpbHRlciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICB3b3Jrc2hlZXROYW1lOiBzdHJpbmcsXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgZmllbGRJZDogc3RyaW5nLFxuICAgIGZpbHRlclR5cGU6IEZpbHRlclR5cGUsXG4gICAgcmVnaXN0cnlJZDogbnVtYmVyLFxuICAgIHByaXZhdGUgX2FuY2hvckRhdGU6IENvbnRyYWN0LkRhdGFWYWx1ZSxcbiAgICBwcml2YXRlIF9wZXJpb2RUeXBlOiBQZXJpb2RUeXBlLFxuICAgIHByaXZhdGUgX3JhbmdlVHlwZTogRGF0ZVJhbmdlVHlwZSxcbiAgICBwcml2YXRlIF9yYW5nZU46IG51bWJlcixcbiAgKSB7XG4gICAgc3VwZXIod29ya3NoZWV0TmFtZSwgZmllbGROYW1lLCBmaWx0ZXJUeXBlLCBmaWVsZElkLCByZWdpc3RyeUlkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYW5jaG9yRGF0ZSgpOiBDb250cmFjdC5EYXRhVmFsdWUge1xuICAgIHJldHVybiB0aGlzLl9hbmNob3JEYXRlO1xuICB9XG5cbiAgcHVibGljIGdldCBwZXJpb2RUeXBlKCk6IFBlcmlvZFR5cGUge1xuICAgIHJldHVybiB0aGlzLl9wZXJpb2RUeXBlO1xuICB9XG5cbiAgcHVibGljIGdldCByYW5nZVR5cGUoKTogRGF0ZVJhbmdlVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX3JhbmdlVHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcmFuZ2VOKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3JhbmdlTjtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ2F0ZWdvcmljYWxEb21haW4gaW1wbGVtZW50cyBDb250cmFjdC5DYXRlZ29yaWNhbERvbWFpbiB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF92YWx1ZXM6IEFycmF5PENvbnRyYWN0LkRhdGFWYWx1ZT4sIHByaXZhdGUgX2RvbWFpblR5cGU6IEZpbHRlckRvbWFpblR5cGUpIHt9XG5cbiAgcHVibGljIGdldCB2YWx1ZXMoKTogQXJyYXk8Q29udHJhY3QuRGF0YVZhbHVlPiB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlcztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdHlwZSgpOiBGaWx0ZXJEb21haW5UeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fZG9tYWluVHlwZTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmFuZ2VEb21haW4gaW1wbGVtZW50cyBDb250cmFjdC5SYW5nZURvbWFpbiB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9taW46IENvbnRyYWN0LkRhdGFWYWx1ZSwgcHJpdmF0ZSBfbWF4OiBDb250cmFjdC5EYXRhVmFsdWUsIHByaXZhdGUgX2RvbWFpblR5cGU6IEZpbHRlckRvbWFpblR5cGUpIHt9XG5cbiAgcHVibGljIGdldCB0eXBlKCk6IEZpbHRlckRvbWFpblR5cGUge1xuICAgIHJldHVybiB0aGlzLl9kb21haW5UeXBlO1xuICB9XG5cbiAgcHVibGljIGdldCBtaW4oKTogQ29udHJhY3QuRGF0YVZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5fbWluO1xuICB9XG5cbiAgcHVibGljIGdldCBtYXgoKTogQ29udHJhY3QuRGF0YVZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5fbWF4O1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGF0YVR5cGUsIE1hcmtUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcblxuZXhwb3J0IGNsYXNzIERhdGFUYWJsZSBpbXBsZW1lbnRzIENvbnRyYWN0LkRhdGFUYWJsZSB7XG4gIHByaXZhdGUgX25hbWU6IHN0cmluZztcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfZGF0YTogQXJyYXk8QXJyYXk8Q29udHJhY3QuRGF0YVZhbHVlPj4sXG4gICAgcHJpdmF0ZSBfY29sdW1uczogQXJyYXk8Q29udHJhY3QuQ29sdW1uPixcbiAgICBwcml2YXRlIF90b3RhbFJvd0NvdW50OiBudW1iZXIsXG4gICAgcHJpdmF0ZSBfaXNUb3RhbFJvd0NvdW50TGltaXRlZDogYm9vbGVhbixcbiAgICBwcml2YXRlIF9pc1N1bW1hcnlEYXRhOiBib29sZWFuLFxuICAgIHByaXZhdGUgX21hcmtzSW5mbz86IEFycmF5PE1hcmtJbmZvPixcbiAgKSB7XG4gICAgdGhpcy5fbmFtZSA9IF9pc1N1bW1hcnlEYXRhID8gJ1N1bW1hcnkgRGF0YSBUYWJsZScgOiAnVW5kZXJseWluZyBEYXRhIFRhYmxlJztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBkYXRhKCk6IEFycmF5PEFycmF5PENvbnRyYWN0LkRhdGFWYWx1ZT4+IHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY29sdW1ucygpOiBBcnJheTxDb250cmFjdC5Db2x1bW4+IHtcbiAgICByZXR1cm4gdGhpcy5fY29sdW1ucztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbWFya3NJbmZvKCk6IEFycmF5PENvbnRyYWN0Lk1hcmtJbmZvPiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX21hcmtzSW5mbztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdG90YWxSb3dDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl90b3RhbFJvd0NvdW50O1xuICB9XG5cbiAgcHVibGljIGdldCBpc1RvdGFsUm93Q291bnRMaW1pdGVkKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9pc1RvdGFsUm93Q291bnRMaW1pdGVkO1xuICB9XG5cbiAgcHVibGljIGdldCBpc1N1bW1hcnlEYXRhKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9pc1N1bW1hcnlEYXRhO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNYXJrSW5mbyBpbXBsZW1lbnRzIENvbnRyYWN0Lk1hcmtJbmZvIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX3R5cGU6IE1hcmtUeXBlLCBwcml2YXRlIF9jb2xvcjogc3RyaW5nLCBwcml2YXRlIF90dXBsZUlkPzogbnVtYmVyKSB7fVxuXG4gIHB1YmxpYyBnZXQgdHlwZSgpOiBNYXJrVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX3R5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvbG9yKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbG9yO1xuICB9XG5cbiAgcHVibGljIGdldCB0dXBsZUlkKCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3R1cGxlSWQ7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbHVtbiBpbXBsZW1lbnRzIENvbnRyYWN0LkNvbHVtbiB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9maWVsZE5hbWU6IHN0cmluZyxcbiAgICBwcml2YXRlIF9maWVsZElkOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBfZGF0YVR5cGU6IERhdGFUeXBlLFxuICAgIHByaXZhdGUgX2lzUmVmZXJlbmNlZDogYm9vbGVhbixcbiAgICBwcml2YXRlIF9pbmRleDogbnVtYmVyLFxuICApIHt9XG5cbiAgcHVibGljIGdldCBmaWVsZE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGROYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWVsZElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRhdGFUeXBlKCk6IERhdGFUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzUmVmZXJlbmNlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNSZWZlcmVuY2VkO1xuICB9XG5cbiAgcHVibGljIGdldCBpbmRleCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9pbmRleDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRGF0YVZhbHVlIGltcGxlbWVudHMgQ29udHJhY3QuRGF0YVZhbHVlIHtcbiAgLyogdHNsaW50OmRpc2FibGU6bm8tYW55ICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF92YWx1ZTogYW55LFxuICAgIHByaXZhdGUgX25hdGl2ZVZhbHVlOiBhbnksXG4gICAgcHJpdmF0ZSBfZm9ybWF0dGVkVmFsdWU/OiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBfYWxpYXNWYWx1ZT86IHN0cmluZyxcbiAgICBwcml2YXRlIF9oYXNBbGlhcz86IGJvb2xlYW4sXG4gICkge31cblxuICBwdWJsaWMgZ2V0IHZhbHVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCBuYXRpdmVWYWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl9uYXRpdmVWYWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZm9ybWF0dGVkVmFsdWUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybWF0dGVkVmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFsaWFzVmFsdWUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fYWxpYXNWYWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaGFzQWxpYXMoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2hhc0FsaWFzO1xuICB9XG4gIC8qIHRzbGludDplbmFibGU6bm8tYW55ICovXG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgR2V0RGF0YVNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9HZXREYXRhU2VydmljZSc7XG5pbXBvcnQgeyBBcGlTZXJ2aWNlUmVnaXN0cnksIFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBFcnJvckhlbHBlcnMgfSBmcm9tICcuLi9VdGlscy9FcnJvckhlbHBlcnMnO1xuXG5leHBvcnQgY2xhc3MgRGF0YVRhYmxlUmVhZGVyIGltcGxlbWVudHMgQ29udHJhY3QuRGF0YVRhYmxlUmVhZGVyIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBfaWQ6IHN0cmluZywgcHJvdGVjdGVkIF90b3RhbFJvd0NvdW50OiBudW1iZXIsIHByb3RlY3RlZCBfcGFnZVJvd0NvdW50LCBwcml2YXRlIF9yZWdpc3RyeUlkOiBudW1iZXIpIHtcbiAgICB0aGlzLl9wYWdlQ291bnQgPSBNYXRoLmNlaWwoX3RvdGFsUm93Q291bnQgLyBfcGFnZVJvd0NvdW50KTtcbiAgfVxuICBwcm90ZWN0ZWQgX3BhZ2VDb3VudDogbnVtYmVyO1xuXG4gIHB1YmxpYyBnZXQgdG90YWxSb3dDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl90b3RhbFJvd0NvdW50O1xuICB9XG5cbiAgcHVibGljIGdldCBwYWdlQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fcGFnZUNvdW50O1xuICB9XG5cbiAgcHVibGljIGdldFBhZ2VBc3luYyhwYWdlTnVtYmVyOiBudW1iZXIpOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlSYW5nZShwYWdlTnVtYmVyLCAwLCB0aGlzLl9wYWdlQ291bnQpO1xuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8R2V0RGF0YVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5HZXREYXRhKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRQYWdlQXN5bmModGhpcy5faWQsIHBhZ2VOdW1iZXIsIHRoaXMuX3BhZ2VSb3dDb3VudCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0QWxsUGFnZXNBc3luYyhtYXhSb3dzPzogbnVtYmVyKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+IHtcbiAgICBjb25zdCBmaXJzdFBhZ2U6IENvbnRyYWN0LkRhdGFUYWJsZSA9IGF3YWl0IHRoaXMuZ2V0UGFnZUFzeW5jKDApO1xuICAgIG1heFJvd3MgPSBtYXhSb3dzIHx8IHRoaXMudG90YWxSb3dDb3VudDtcbiAgICBjb25zdCByb3dzUmVxdWVzdGVkID0gTWF0aC5taW4obWF4Um93cywgdGhpcy50b3RhbFJvd0NvdW50KTtcbiAgICBjb25zdCBwYWdlc1JlcXVlc3RlZCA9IE1hdGguY2VpbChyb3dzUmVxdWVzdGVkIC8gdGhpcy5fcGFnZVJvd0NvdW50KTtcblxuICAgIC8vIEZldGNoIHVwIHRvIDQwMCBwYWdlcywgd2l0aCBhIGRlZmF1bHQgb2YgMTAsMDAwIHBhZ2VSb3dDb3VudCB0aGF0IGdpdmVzIHVzIDQsMDAwLDAwMCByb3dzXG4gICAgY29uc3QgcGFnZXNUb0ZldGNoID0gTWF0aC5taW4ocGFnZXNSZXF1ZXN0ZWQsIDQwMCk7XG4gICAgY29uc3QgaXNEYXRhTGltaXRlZCA9IHBhZ2VzVG9GZXRjaCA8IHBhZ2VzUmVxdWVzdGVkO1xuICAgIGxldCByZW1haW5pbmdEYXRhOiBBcnJheTxBcnJheTxBcnJheTxDb250cmFjdC5EYXRhVmFsdWU+Pj4gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHBhZ2VzVG9GZXRjaDsgaSsrKSB7XG4gICAgICBjb25zdCBwYWdlID0gYXdhaXQgdGhpcy5nZXRQYWdlQXN5bmMoaSk7XG4gICAgICByZW1haW5pbmdEYXRhLnB1c2gocGFnZS5kYXRhKTtcbiAgICB9XG5cbiAgICBsZXQgZnVsbERhdGEgPSBmaXJzdFBhZ2UuZGF0YS5jb25jYXQoLi4ucmVtYWluaW5nRGF0YSk7XG4gICAgLy8gVGhpcyBzbGljZXMgdGhlIGFycmF5IG9ubHkgaWYgbWF4Um93cyBoYXMgYmVlbiBzZXQgYW5kIGlzIGxlc3MgdGhhbiB0b3RhbFJvd0NvdW50XG4gICAgZnVsbERhdGEubGVuZ3RoID0gcm93c1JlcXVlc3RlZDtcblxuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBmaXJzdFBhZ2UubmFtZSxcbiAgICAgIGRhdGE6IGZ1bGxEYXRhLFxuICAgICAgY29sdW1uczogZmlyc3RQYWdlLmNvbHVtbnMsXG4gICAgICB0b3RhbFJvd0NvdW50OiBpc0RhdGFMaW1pdGVkID8gcGFnZXNUb0ZldGNoICogdGhpcy5fcGFnZVJvd0NvdW50IDogcm93c1JlcXVlc3RlZCxcbiAgICAgIGlzVG90YWxSb3dDb3VudExpbWl0ZWQ6IGlzRGF0YUxpbWl0ZWQsXG4gICAgICBpc1N1bW1hcnlEYXRhOiBmaXJzdFBhZ2UuaXNTdW1tYXJ5RGF0YSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIHJlbGVhc2VBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEdldERhdGFTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuR2V0RGF0YSk7XG4gICAgcmV0dXJuIHNlcnZpY2UucmVsZWFzZUFzeW5jKHRoaXMuX2lkKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVG9vbHRpcENvbnRleHQgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgSG92ZXJUdXBsZUludGVyYWN0aW9uLCBTZWxlY3RPcHRpb25zLCBTZWxlY3RUdXBsZXNJbnRlcmFjdGlvbiwgVmlzdWFsSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG4vKipcbiAqIFNlbGVjdGlvbiBNb2RlbC5cbiAqL1xuZXhwb3J0IGNsYXNzIFNlbGVjdGlvbk1vZGVsIHtcbiAgcHVibGljIHF1YWxpZmllZEZpZWxkQ2FwdGlvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFZhbHVlIGJhc2VkIHNlbGVjdGlvbiBtb2RlbC4gTWVhbnQgZm9yIGhpZXJhcmNoaWNhbCwgcmFuZ2UgYW5kIGNhdGVnb3JpY2FsIHNlbGVjdGlvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBWYWx1ZVNlbGVjdGlvbk1vZGVsIGV4dGVuZHMgU2VsZWN0aW9uTW9kZWwge1xuICBwdWJsaWMgc2VsZWN0VmFsdWVzOiBBcnJheTxzdHJpbmc+ID0gW107XG59XG5cbi8qKlxuICogSGllcmFyY2hpY2FsIHZhbHVlIHNlbGVjdGlvbiBtb2RlbFxuICovXG5leHBvcnQgY2xhc3MgSGllcmFyY2hpY2FsU2VsZWN0aW9uTW9kZWwgZXh0ZW5kcyBWYWx1ZVNlbGVjdGlvbk1vZGVsIHt9XG5cbi8qKlxuICogUmFuZ2UgYmFzZWQgdmFsdWUgc2VsZWN0aW9uIG1vZGVsXG4gKi9cbmV4cG9ydCBjbGFzcyBSYW5nZVNlbGVjdGlvbk1vZGVsIGV4dGVuZHMgU2VsZWN0aW9uTW9kZWwge1xuICBwdWJsaWMgbWluVmFsdWU6IHN0cmluZztcbiAgcHVibGljIG1heFZhbHVlOiBzdHJpbmc7XG4gIHB1YmxpYyBpbmNsdWRlZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIERpbWVuc2lvbiB2YWx1ZSBzZWxlY3Rpb24gbW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIERpbWVuc2lvblNlbGVjdGlvbk1vZGVsIGV4dGVuZHMgVmFsdWVTZWxlY3Rpb25Nb2RlbCB7fVxuLyoqXG4gKiBUdXBsZSBiYXNlZCBzZWxlY3Rpb24gbW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIFR1cGxlU2VsZWN0aW9uTW9kZWwge1xuICBwdWJsaWMgc2VsZWN0aW9uVHlwZTogc3RyaW5nO1xuICBwdWJsaWMgb2JqZWN0SWRzOiBBcnJheTxzdHJpbmc+ID0gW107XG59XG5cbi8qKlxuICogQ29udGFpbmVyIGNsYXNzIHRvIHBvcHVsYXRlIGFsbCB0aGUgc2VsZWN0aW9uIG1vZGVscyB3aGVuIHBhcnNpbmcgaW5wdXRcbiAqL1xuZXhwb3J0IGNsYXNzIFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lciB7XG4gIHB1YmxpYyBoaWVyTW9kZWxBcnI6IEFycmF5PEhpZXJhcmNoaWNhbFNlbGVjdGlvbk1vZGVsPiA9IFtdO1xuICBwdWJsaWMgZGltTW9kZWxBcnI6IEFycmF5PERpbWVuc2lvblNlbGVjdGlvbk1vZGVsPiA9IFtdO1xuICBwdWJsaWMgcXVhbnRNb2RlbEFycjogQXJyYXk8UmFuZ2VTZWxlY3Rpb25Nb2RlbD4gPSBbXTtcbiAgcHVibGljIHNlbGVjdGlvbjogVHVwbGVTZWxlY3Rpb25Nb2RlbDtcbn1cblxuZXhwb3J0IGNsYXNzIFNlbGVjdFR1cGxlc0ludGVyYWN0aW9uTW9kZWwgaW1wbGVtZW50cyBTZWxlY3RUdXBsZXNJbnRlcmFjdGlvbiB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgdmlzdWFsSWRQcmVzTW9kZWw6IFZpc3VhbElkLFxuICAgIHB1YmxpYyB0dXBsZUlkczogQXJyYXk8bnVtYmVyPiA9IFtdLFxuICAgIHB1YmxpYyBzZWxlY3RPcHRpb25zOiBTZWxlY3RPcHRpb25zLFxuICAgIHB1YmxpYyB0b29sdGlwQ29udGV4dD86IFRvb2x0aXBDb250ZXh0LFxuICApIHt9XG59XG5cbmV4cG9ydCBjbGFzcyBIb3ZlclR1cGxlSW50ZXJhY3Rpb25Nb2RlbCBpbXBsZW1lbnRzIEhvdmVyVHVwbGVJbnRlcmFjdGlvbiB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgdmlzdWFsSWRQcmVzTW9kZWw6IFZpc3VhbElkLFxuICAgIHB1YmxpYyB0dXBsZUlkOiBudW1iZXIsXG4gICAgcHVibGljIHRvb2x0aXBDb250ZXh0PzogVG9vbHRpcENvbnRleHQgfCBudWxsLFxuICAgIHB1YmxpYyBhbGxvd0hvdmVyQWN0aW9ucz86IGJvb2xlYW4sXG4gICkge31cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmV4cG9ydCBjbGFzcyBQb2ludCBpbXBsZW1lbnRzIENvbnRyYWN0LlBvaW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX3g6IG51bWJlciwgcHJpdmF0ZSBfeTogbnVtYmVyKSB7fVxuXG4gIHB1YmxpYyBnZXQgeCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl94O1xuICB9XG5cbiAgcHVibGljIGdldCB5KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3k7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbiB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBWaXN1YWxJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBBcGlTZXJ2aWNlIH0gZnJvbSAnLi9TZXJ2aWNlUmVnaXN0cnknO1xuXG4vKipcbiAqIERlZmluZXMgd2hpY2ggdHlwZSBvZiBnZXREYXRhIGNhbGwgdG8gbWFrZS5cbiAqL1xuZXhwb3J0IGVudW0gR2V0RGF0YVR5cGUge1xuICBTdW1tYXJ5ID0gJ3N1bW1hcnknLFxuICBVbmRlcmx5aW5nID0gJ3VuZGVybHlpbmcnLFxufVxuXG4vKipcbiAqIFNlcnZpY2UgZm9yIGltcGxlbWVudGluZyB0aGUgbG9naWMgZm9yIHZhcmlvdXMgZ2V0RGF0YSBjYWxsc1xuICpcbiAqIEBpbnRlcmZhY2UgR2V0RGF0YVNlcnZpY2VcbiAqIEBleHRlbmRzIHtBcGlTZXJ2aWNlfVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldERhdGFTZXJ2aWNlIGV4dGVuZHMgQXBpU2VydmljZSB7XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBsaW1pdCBvZiByb3dzIGZvciBnZXRVbmRlcmx5aW5nRGF0YUFzeW5jXG4gICAqL1xuICBnZXRNYXhSb3dMaW1pdCgpOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHVuZGVybHlpbmcgZGF0YSBmb3IgYSBwYXJ0aWN1bGFyIHZpc3VhbFxuICAgKlxuICAgKiBAcGFyYW0ge1Zpc3VhbElkfSB2aXN1YWxJZCAgVGhlIHZpc3VhbCBpZFxuICAgKiBAcGFyYW0ge0dldERhdGFUeXBlfSBnZXRUeXBlICBUaGUgdHlwZSBvZiBnZXREYXRhIGNhbGwgdG8gbWFrZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZUFsaWFzZXMgIFdoZXRoZXIgb3Igbm90IGFsaWFzZXMgc2hvdWxkIGJlIGlnbm9yZWRcbiAgICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVTZWxlY3Rpb24gIFdoZXRoZXIgb3Igbm90IHNlbGVjdGlvbiBzaG91bGQgYmUgaWdub3JlZFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGluY2x1ZGVBbGxDb2x1bW5zICBTaG91bGQgYWxsIGNvbHVtbnMgYmUgaW5jbHVkZWRcbiAgICogQHBhcmFtIHtBcnJheX0gY29sdW1uc1RvSW5jbHVkZUJ5SWQgT3ZlcnJpZGVzIGluY2x1ZGVBbGxDb2x1bW5zLCBsaXN0cyB0aGUgY29sdW1ucyB0byBpbmNsdWRlLiBFbXB0eSBtZWFucyBhbGwgY29sdW1ucy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IG1heFJvd3MgIE1heGltdW0gbnVtYmVyIG9mIHJvd3MgdG8gcmV0dXJuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT59ICBEYXRhIHRhYmxlIHdpdGggdGhlIHJlcXVlc3RlZCBkYXRhXG4gICAqL1xuICBnZXRVbmRlcmx5aW5nRGF0YUFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBnZXRUeXBlOiBHZXREYXRhVHlwZSxcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIGlnbm9yZVNlbGVjdGlvbjogYm9vbGVhbixcbiAgICBpbmNsdWRlQWxsQ29sdW1uczogYm9vbGVhbixcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogQXJyYXk8c3RyaW5nPixcbiAgICBtYXhSb3dzOiBudW1iZXIsXG4gICAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb246IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICAgIGFwcGx5V29ya3NoZWV0Rm9ybWF0dGluZzogYm9vbGVhbixcbiAgKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1Zpc3VhbElkfSB2aXN1YWxJZCAgVGhlIHZpc3VhbCBpZFxuICAgKiBAcGFyYW0ge251bWJlcn0gcGFnZVJvd0NvdW50IFRoZSBudW1iZXIgb2Ygcm93cyBwZXIgcGFnZS4gVGhlIGRlZmF1bHQgYW5kIG1heGltdW0gaXMgMTAsMDAwIHJvd3MuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaWdub3JlQWxpYXNlcyAgV2hldGhlciBhbGlhcyB2YWx1ZXMgc2hvdWxkIGJlIGlnbm9yZWQgaW4gdGhlIHJldHVybmVkIGRhdGFcbiAgICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVTZWxlY3Rpb24gIFdoZXRoZXIgc2VsZWN0aW9ucyBpbiB0aGlzIHZpeiBzaG91bGQgYmUgaWdub3JlZCBpbiB0aGUgcmV0dXJuZWQgZGF0YVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGluY2x1ZGVBbGxDb2x1bW5zICBTaG91bGQgYWxsIGNvbHVtbnMgYmUgaW5jbHVkZWRcbiAgICogQHBhcmFtIHtBcnJheX0gY29sdW1uc1RvSW5jbHVkZUJ5SWQgT3ZlcnJpZGVzIGluY2x1ZGVBbGxDb2x1bW5zLCBsaXN0cyB0aGUgY29sdW1ucyB0byBpbmNsdWRlLiBFbXB0eSBtZWFucyBhbGwgY29sdW1uc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGVSZWFkZXI+fSAgRGF0YSB0YWJsZSByZWFkZXIgdG8gYWNjZXNzIHRoZSB1bmRlcmx5aW5nIGRhdGFcbiAgICovXG4gIGdldFN1bW1hcnlEYXRhUmVhZGVyQXN5bmMoXG4gICAgdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIHBhZ2VSb3dDb3VudDogbnVtYmVyLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgaWdub3JlU2VsZWN0aW9uOiBib29sZWFuLFxuICAgIGluY2x1ZGVBbGxDb2x1bW5zOiBib29sZWFuLFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uOiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgICBhcHBseVdvcmtzaGVldEZvcm1hdHRpbmc6IGJvb2xlYW4sXG4gICk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlUmVhZGVyPjtcblxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG1hcmtzIGZvciBhIGdpdmVuIHZpc3VhbFxuICAgKlxuICAgKiBAcGFyYW0ge1Zpc3VhbElkfSB2aXN1YWxJZCAgVGhlIHZpc3VhbCBpZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBY3RpdmVNYXJrcz59ICBDb2xsZWN0aW9uIG9mIGRhdGEgdGFibGVzIHdpdGggdGhlIGFjdGl2ZSBtYXJrc1xuICAgKi9cbiAgZ2V0U2VsZWN0ZWRNYXJrc0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8Q29udHJhY3QuTWFya3NDb2xsZWN0aW9uPjtcblxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudGx5IGhpZ2hsaWdodGVkIG1hcmtzIGZvciBhIGdpdmVuIHZpc3VhbFxuICAgKlxuICAgKiBAcGFyYW0ge1Zpc3VhbElkfSB2aXN1YWxJZCAgVGhlIHZpc3VhbCBpZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBY3RpdmVNYXJrcz59ICBDb2xsZWN0aW9uIG9mIGRhdGEgdGFibGVzIHdpdGggdGhlIGFjdGl2ZSBtYXJrc1xuICAgKi9cbiAgZ2V0SGlnaGxpZ2h0ZWRNYXJrc0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8Q29udHJhY3QuTWFya3NDb2xsZWN0aW9uPjtcblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGFzb3VyY2VJZCAgVGhlIGlkIG9mIHRoZSBkYXRhc291cmNlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaWdub3JlQWxpYXNlcyAgV2hldGhlciBhbGlhcyB2YWx1ZXMgc2hvdWxkIGJlIGlnbm9yZWQgaW4gdGhlIHJldHVybmVkIGRhdGFcbiAgICogQHBhcmFtIHtudW1iZXJ9IG1heFJvd3MgVGhlIG1heGltdW0gbnVtYmVyIG9mIHJvd3MgdG8gcmV0cmlldmVcbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBjb2x1bW5zVG9JbmNsdWRlIENvbHVtbnMgd2hpY2ggc2hvdWxkIGJlIHJldHVybmVkIHNwZWNpZmllZCBieSBjYXB0aW9uLiBFbXB0eSBtZWFucyBhbGwgY29sdW1uc1xuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGNvbHVtbnNUb0luY2x1ZGVCeUlkIENvbHVtbnMgd2hpY2ggc2hvdWxkIGJlIHJldHVybmVkIHNwZWNpZmllZCBieSBuYW1lLiBFbXB0eSBtZWFucyBhbGwgY29sdW1uc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+fSAgRGF0YSB0YWJsZSB3aXRoIHRoZSByZXF1ZXN0ZWQgZGF0YVxuICAgKi9cbiAgZ2V0RGF0YVNvdXJjZURhdGFBc3luYyhcbiAgICBkYXRhc291cmNlSWQ6IHN0cmluZyxcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIG1heFJvd3M6IG51bWJlcixcbiAgICBjb2x1bW5zVG9JbmNsdWRlOiBBcnJheTxzdHJpbmc+LFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uOiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0YXNvdXJjZUlkICBUaGUgaWQgb2YgdGhlIGRhdGFzb3VyY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxvZ2ljYWxUYWJsZUlkICBUaGUgaWQgb2YgdGhlIGxvZ2NpYWwgdGFibGVcbiAgICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVBbGlhc2VzICBXaGV0aGVyIGFsaWFzIHZhbHVlcyBzaG91bGQgYmUgaWdub3JlZCBpbiB0aGUgcmV0dXJuZWQgZGF0YVxuICAgKiBAcGFyYW0ge251bWJlcn0gbWF4Um93cyBUaGUgbWF4aW11bSBudW1iZXIgb2Ygcm93cyB0byByZXRyaWV2ZVxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGNvbHVtbnNUb0luY2x1ZGUgQ29sdW1ucyB3aGljaCBzaG91bGQgYmUgcmV0dXJuZWQgc3BlY2lmaWVkIGJ5IGNhcHRpb24uIEVtcHR5IG1lYW5zIGFsbCBjb2x1bW5zXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gY29sdW1uc1RvSW5jbHVkZUJ5SWQgQ29sdW1ucyB3aGljaCBzaG91bGQgYmUgcmV0dXJuZWQgc3BlY2lmaWVkIGJ5IG5hbWUuIEVtcHR5IG1lYW5zIGFsbCBjb2x1bW5zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT59ICBEYXRhIHRhYmxlIHdpdGggdGhlIHJlcXVlc3RlZCBkYXRhXG4gICAqL1xuICBnZXRMb2dpY2FsVGFibGVEYXRhQXN5bmMoXG4gICAgZGF0YXNvdXJjZUlkOiBzdHJpbmcsXG4gICAgbG9naWNhbFRhYmxlSWQ6IHN0cmluZyxcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIG1heFJvd3M6IG51bWJlcixcbiAgICBjb2x1bW5zVG9JbmNsdWRlOiBBcnJheTxzdHJpbmc+LFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uOiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0YXNvdXJjZUlkICBUaGUgaWQgb2YgdGhlIGRhdGFzb3VyY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxvZ2ljYWxUYWJsZUlkICBUaGUgaWQgb2YgdGhlIGxvZ2NpYWwgdGFibGVcbiAgICogQHBhcmFtIHtudW1iZXJ9IHBhZ2VSb3dDb3VudCBUaGUgbnVtYmVyIG9mIHJvd3MgcGVyIHBhZ2UuIFRoZSBkZWZhdWx0IGFuZCBtYXhpbXVtIGlzIDEwLDAwMCByb3dzLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZUFsaWFzZXMgIFdoZXRoZXIgYWxpYXMgdmFsdWVzIHNob3VsZCBiZSBpZ25vcmVkIGluIHRoZSByZXR1cm5lZCBkYXRhXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gY29sdW1uc1RvSW5jbHVkZUJ5SWQgQ29sdW1ucyB3aGljaCBzaG91bGQgYmUgcmV0dXJuZWQgc3BlY2lmaWVkIGJ5IG5hbWUuIEVtcHR5IG1lYW5zIGFsbCBjb2x1bW5zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT59ICBEYXRhIHRhYmxlIHdpdGggdGhlIHJlcXVlc3RlZCBkYXRhXG4gICAqL1xuICBnZXRMb2dpY2FsVGFibGVEYXRhUmVhZGVyQXN5bmMoXG4gICAgZGF0YXNvdXJjZUlkOiBzdHJpbmcsXG4gICAgbG9naWNhbFRhYmxlSWQ6IHN0cmluZyxcbiAgICBwYWdlUm93Q291bnQ6IG51bWJlcixcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uOiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGVSZWFkZXI+O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1Zpc3VhbElkfSB2aXN1YWxJZCAgVGhlIHZpc3VhbCBpZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbG9naWNhbFRhYmxlSWQgIFRoZSBpZCBvZiB0aGUgbG9nY2lhbCB0YWJsZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZUFsaWFzZXMgIFdoZXRoZXIgYWxpYXMgdmFsdWVzIHNob3VsZCBiZSBpZ25vcmVkIGluIHRoZSByZXR1cm5lZCBkYXRhXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaWdub3JlU2VsZWN0aW9uICBXaGV0aGVyIHNlbGVjdGlvbnMgaW4gdGhpcyB2aXogc2hvdWxkIGJlIGlnbm9yZWQgaW4gdGhlIHJldHVybmVkIGRhdGFcbiAgICogQHBhcmFtIHtib29sZWFufSBpbmNsdWRlQWxsQ29sdW1ucyAgV2hldGhlciB0byBpbmNsdWRlIGFsbCBjb2x1bW5zIG9yIG9ubHkgdGhlIHJlZmVyZW5jZWQgY29sdW1uc1xuICAgKiBAcGFyYW0ge0FycmF5fSBjb2x1bW5zVG9JbmNsdWRlQnlJZCBPdmVycmlkZXMgaW5jbHVkZUFsbENvbHVtbnMsIGxpc3RzIHRoZSBjb2x1bW5zIHRvIGluY2x1ZGUuIEVtcHR5IG1lYW5zIGFsbCBjb2x1bW5zLlxuICAgKiBAcGFyYW0ge251bWJlcn0gbWF4Um93cyBUaGUgbWF4aW11bSBudW1iZXIgb2Ygcm93cyB0byByZXRyaWV2ZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+fSAgRGF0YSB0YWJsZSB3aXRoIHRoZSByZXF1ZXN0ZWQgZGF0YVxuICAgKi9cbiAgZ2V0VW5kZXJseWluZ1RhYmxlRGF0YUFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBsb2dpY2FsVGFibGVJZDogc3RyaW5nLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgaWdub3JlU2VsZWN0aW9uOiBib29sZWFuLFxuICAgIGluY2x1ZGVBbGxDb2x1bW5zOiBib29sZWFuLFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIG1heFJvd3M6IG51bWJlcixcbiAgICBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gICAgYXBwbHlXb3Jrc2hlZXRGb3JtYXR0aW5nOiBib29sZWFuLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT47XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7VmlzdWFsSWR9IHZpc3VhbElkICBUaGUgdmlzdWFsIGlkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsb2dpY2FsVGFibGVJZCAgVGhlIGlkIG9mIHRoZSBsb2djaWFsIHRhYmxlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBwYWdlUm93Q291bnQgVGhlIG51bWJlciBvZiByb3dzIHBlciBwYWdlLiBUaGUgZGVmYXVsdCBhbmQgbWF4aW11bSBpcyAxMCwwMDAgcm93cy5cbiAgICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVBbGlhc2VzICBXaGV0aGVyIGFsaWFzIHZhbHVlcyBzaG91bGQgYmUgaWdub3JlZCBpbiB0aGUgcmV0dXJuZWQgZGF0YVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZVNlbGVjdGlvbiAgV2hldGhlciBzZWxlY3Rpb25zIGluIHRoaXMgdml6IHNob3VsZCBiZSBpZ25vcmVkIGluIHRoZSByZXR1cm5lZCBkYXRhXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5jbHVkZUFsbENvbHVtbnMgIFdoZXRoZXIgdG8gaW5jbHVkZSBhbGwgY29sdW1ucyBvciBvbmx5IHRoZSByZWZlcmVuY2VkIGNvbHVtbnNcbiAgICogQHBhcmFtIHtBcnJheX0gY29sdW1uc1RvSW5jbHVkZUJ5SWQgT3ZlcnJpZGVzIGluY2x1ZGVBbGxDb2x1bW5zLCBsaXN0cyB0aGUgY29sdW1ucyB0byBpbmNsdWRlLiBFbXB0eSBtZWFucyBhbGwgY29sdW1ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPn0gIERhdGEgdGFibGUgd2l0aCB0aGUgcmVxdWVzdGVkIGRhdGFcbiAgICovXG4gIGdldFVuZGVybHlpbmdUYWJsZURhdGFSZWFkZXJBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgbG9naWNhbFRhYmxlSWQ6IHN0cmluZyxcbiAgICBwYWdlUm93Q291bnQ6IG51bWJlcixcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIGlnbm9yZVNlbGVjdGlvbjogYm9vbGVhbixcbiAgICBpbmNsdWRlQWxsQ29sdW1uczogYm9vbGVhbixcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogQXJyYXk8c3RyaW5nPixcbiAgICBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gICAgYXBwbHlXb3Jrc2hlZXRGb3JtYXR0aW5nLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZVJlYWRlcj47XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7VmlzdWFsSWR9IHZpc3VhbElkICBUaGUgdmlzdWFsIGlkXG4gICAqL1xuICBnZXRTdW1tYXJ5Q29sdW1uc0luZm9Bc3luYyh2aXN1YWxJZDogVmlzdWFsSWQpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkNvbHVtbj4+O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gdGFibGVJZCAgICAgVGhlIHRhYmxlIGlkIHVzZWQgdG8gZmV0Y2ggZGF0YS5cbiAgICogQHBhcmFtIHBhZ2VOdW1iZXIgIFRoZSBwYWdlIG51bWJlciAoemVyby1iYXNlZCkuXG4gICAqIEBwYXJhbSBwYWdlU2l6ZSAgICBUaGUgcGFnZSBzaXplIG9mIHRoZSBvd25pbmcgRGF0YVRhYmxlUmVhZGVyXG4gICAqIEByZXR1cm5zICAgICAgICAgICBBIERhdGFUYWJsZSBjb250YWluaW5nIHRoZSByZXF1ZXN0ZWQgcGFnZS4gVGhlIG51bWJlciBvZiByb3dzIHJldHVybmVkXG4gICAqICAgICAgICAgICAgICAgICAgICBjYW4gYmUgbGVzcyB0aGFuIHJlcXVlc3RlZCBhdCB0aGUgZW5kIG9mIHRoZSBkYXRhLlxuICAgKi9cbiAgZ2V0UGFnZUFzeW5jKHRhYmxlSWQ6IHN0cmluZywgcGFnZU51bWJlcjogbnVtYmVyLCBwYWdlU2l6ZTogbnVtYmVyKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gdGFibGVJZCAgICAgVGhlIHRhYmxlIGlkIHVzZWQgdG8gZmV0Y2ggZGF0YS5cbiAgICovXG4gIHJlbGVhc2VBc3luYyh0YWJsZUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xufVxuIiwiaW1wb3J0IHsgSW50ZXJuYWxBcGlEaXNwYXRjaGVyIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEFwaVNlcnZpY2VSZWdpc3RyeSB9IGZyb20gJy4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9BY2Nlc3NpYmlsaXR5U2VydmljZUltcGwnO1xuaW1wb3J0IHsgQW5pbWF0aW9uU2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvQW5pbWF0aW9uU2VydmljZUltcGwnO1xuaW1wb3J0IHsgQW5ub3RhdGlvblNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL0Fubm90YXRpb25TZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBEYXRhU291cmNlU2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvRGF0YVNvdXJjZVNlcnZpY2VJbXBsJztcbmltcG9ydCB7IEV4cG9ydFNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL0V4cG9ydFNlcnZpY2VJbXBsJztcbmltcG9ydCB7IEV4dGVybmFsQ29udGV4dE1lbnVTZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9FeHRlcm5hbENvbnRleHRNZW51U2VydmljZUltcGwnO1xuaW1wb3J0IHsgRmlsdGVyU2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvRmlsdGVyU2VydmljZUltcGwnO1xuaW1wb3J0IHsgR2V0RGF0YVNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL0dldERhdGFTZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25TZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9Ob3RpZmljYXRpb25TZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBQYXJhbWV0ZXJzU2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvUGFyYW1ldGVyc1NlcnZpY2VJbXBsJztcbmltcG9ydCB7IFNlbGVjdGlvblNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL1NlbGVjdGlvblNlcnZpY2VJbXBsJztcbmltcG9ydCB7IFNpemVTZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9TaXplU2VydmljZUltcGwnO1xuaW1wb3J0IHsgVmlzdWFsTW9kZWxTZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9WaXN1YWxNb2RlbFNlcnZpY2VJbXBsJztcbmltcG9ydCB7IFZpelNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL1ZpelNlcnZpY2VJbXBsJztcbmltcG9ydCB7IFpvbmVTZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9ab25lU2VydmljZUltcGwnO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJBbGxTaGFyZWRTZXJ2aWNlcyhkaXNwYXRjaGVyOiBJbnRlcm5hbEFwaURpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQ6IG51bWJlcik6IHZvaWQge1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgQW5pbWF0aW9uU2VydmljZUltcGwoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCkpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgRGF0YVNvdXJjZVNlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQpKTtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChyZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IEV4cG9ydFNlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQpKTtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChyZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IEdldERhdGFTZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCByZWdpc3RyeUlkKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBGaWx0ZXJTZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCByZWdpc3RyeUlkKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBOb3RpZmljYXRpb25TZXJ2aWNlSW1wbChkaXNwYXRjaGVyKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBQYXJhbWV0ZXJzU2VydmljZUltcGwoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCkpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgU2VsZWN0aW9uU2VydmljZUltcGwoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCkpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgQW5ub3RhdGlvblNlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQpKTtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChyZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IFpvbmVTZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCByZWdpc3RyeUlkKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBTaXplU2VydmljZUltcGwoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCkpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgVmlzdWFsTW9kZWxTZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCByZWdpc3RyeUlkKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBWaXpTZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCByZWdpc3RyeUlkKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBFeHRlcm5hbENvbnRleHRNZW51U2VydmljZUltcGwoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCkpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQpKTtcbn1cbiIsImltcG9ydCB7IEVycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vVGFibGVhdUVycm9yJztcblxuLyoqXG4gKiBCYXNlIGludGVyZmFjZSBmb3IgYW4gYXBpIHNlcnZpY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcGlTZXJ2aWNlIHtcbiAgLyoqXG4gICAqIEdldHMgdGhlIG5hbWUgZm9yIHRoaXMgc2VydmljZS5cbiAgICovXG4gIHJlYWRvbmx5IHNlcnZpY2VOYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29sbGVjdGlvbiBvZiBzZXJ2aWNlIG5hbWUgd2hpY2ggd2lsbCBiZSByZWdpc3RlcmVkIGluIHRoZSBhcGktc2hhcmVkIHByb2plY3RcbiAqL1xuZXhwb3J0IGNvbnN0IGVudW0gU2VydmljZU5hbWVzIHtcbiAgQWNjZXNzaWJpbGl0eSA9ICdhY2Nlc3NpYmlsaXR5JyxcbiAgQXV0aGVudGljYXRpb24gPSAnYXV0aGVudGljYXRpb24nLFxuICBDbGllbnRJbmZvID0gJ2NsaWVudC1pbmZvLXNlcnZpY2UnLFxuICBEYXRhU291cmNlU2VydmljZSA9ICdkYXRhLXNvdXJjZS1zZXJ2aWNlJyxcbiAgR2V0RGF0YSA9ICdnZXQtZGF0YS1zZXJ2aWNlJyxcbiAgRmlsdGVyID0gJ2ZpbHRlci1zZXJ2aWNlJyxcbiAgTm90aWZpY2F0aW9uID0gJ25vdGlmaWNhdGlvbi1zZXJ2aWNlJyxcbiAgUGFyYW1ldGVycyA9ICdwYXJhbWV0ZXJzLXNlcnZpY2UnLFxuICBTZWxlY3Rpb24gPSAnc2VsZWN0aW9uLXNlcnZpY2UnLFxuICBBbm5vdGF0aW9uID0gJ2Fubm90YXRpb24tc2VydmljZScsXG4gIFpvbmUgPSAnem9uZS1zZXJ2aWNlJyxcbiAgQW5pbWF0aW9uID0gJ2FuaW1hdGlvbi1zZXJ2aWNlJyxcbiAgVml6ID0gJ3Zpei1zZXJ2aWNlJyxcbiAgRXh0ZXJuYWxDb250ZXh0TWVudSA9ICdleHRlcm5hbC1jb250ZXh0LW1lbnUtc2VydmljZScsXG4gIEluaXRpYWxpemF0aW9uID0gJ2luaXRpYWxpemF0aW9uLXNlcnZpY2UnLFxuICBTdG9yeUFjdGl2YXRpb24gPSAnc3RvcnktYWN0aXZhdGlvbi1zZXJ2aWNlJyxcbiAgU2l6ZSA9ICdzaXplLXNlcnZpY2UnLFxuICBFeHBvcnQgPSAnZXhwb3J0LXNlcnZpY2UnLFxuICBWaXN1YWxNb2RlbCA9ICd2aXN1YWwtbW9kZWwtc2VydmljZScsXG59XG5cbi8qKlxuICogRG8gc29tZSBnbG9iYWwgZGVjbGFyYXRpb25zIHNvIHdlIGNhbiBjcmVhdGUgYSBzaW5nbGV0b24gb24gdGhlIHdpbmRvdyBvYmplY3RcbiAqL1xuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgV2luZG93IHtcbiAgICBfX3RhYmxlYXVBcGlTZXJ2aWNlUmVnaXN0cnk6IHsgW3JlZ2lzdHJ5SWQ6IG51bWJlcl06IFNlcnZpY2VSZWdpc3RyeSB9O1xuICB9XG59XG5cbmlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICB3aW5kb3cuX190YWJsZWF1QXBpU2VydmljZVJlZ2lzdHJ5ID0gd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeSB8fCB7fTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlUmVnaXN0cnkge1xuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgbmV3IHNlcnZpY2UgaW50byB0aGUgc2VydmljZSByZWdpc3RyeS4gQW55IGV4aXN0aW5nIG9uZSB3aWxsXG4gICAqIGJlIG92ZXJ3cml0dGVuLiB0aGUgc2VydmljZSBpcyByZWdpc3RlcmVkIHVuZGVyIHNlcnZpY2Uuc2VydmljZU5hbWVcbiAgICpcbiAgICogQHBhcmFtIHtBcGlTZXJ2aWNlfSBzZXJ2aWNlIFRoZSBzZXJ2aXZlIHRvIHJlZ2lzdGVyXG4gICAqL1xuICByZWdpc3RlclNlcnZpY2Uoc2VydmljZTogQXBpU2VydmljZSk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgZ2l2ZW4gc2VydmljZSBmcm9tIHRoZSByZWdpc3RyeS4gSWYgdGhlcmUgaXMgbm90IGFcbiAgICogc2VydmljZSByZWdpc3RlcmVkIHVuZGVyIHRoYXQgbmFtZSwgdGhyb3dzIGFuZCBlcnJvclxuICAgKlxuICAgKiBAdGVtcGxhdGUgVCBUaGUgdHlwZSBvZiB0aGUgc2VydmljZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VydmljZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHNlcnZpY2UuXG4gICAqIEByZXR1cm5zIHtUfSBUaGUgcmVxdWVzdGVkIHNlcnZpY2VcbiAgICovXG4gIGdldFNlcnZpY2U8VCBleHRlbmRzIEFwaVNlcnZpY2U+KHNlcnZpY2VOYW1lOiBzdHJpbmcpOiBUO1xufVxuXG5jbGFzcyBTZXJ2aWNlUmVnaXN0cnlJbXBsIGltcGxlbWVudHMgU2VydmljZVJlZ2lzdHJ5IHtcbiAgcHJpdmF0ZSBfc2VydmljZXM6IHsgW3NlcnZpY2VOYW1lOiBzdHJpbmddOiBBcGlTZXJ2aWNlIH07XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX3NlcnZpY2VzID0ge307XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJTZXJ2aWNlKHNlcnZpY2U6IEFwaVNlcnZpY2UpOiB2b2lkIHtcbiAgICB0aGlzLl9zZXJ2aWNlc1tzZXJ2aWNlLnNlcnZpY2VOYW1lXSA9IHNlcnZpY2U7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2VydmljZTxUIGV4dGVuZHMgQXBpU2VydmljZT4oc2VydmljZU5hbWU6IHN0cmluZyk6IFQge1xuICAgIGlmICghdGhpcy5fc2VydmljZXMuaGFzT3duUHJvcGVydHkoc2VydmljZU5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFNlcnZpY2Ugbm90IHJlZ2lzdGVyZWQ6ICR7c2VydmljZU5hbWV9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3NlcnZpY2VzW3NlcnZpY2VOYW1lXSBhcyBUO1xuICB9XG59XG5cbi8qKlxuICogU3RhdGljIGNsYXNzIHVzZWQgZm9yIGdldHRpbmcgYWNjZXNzIHRvIHRoZSBzaW5nbGUgaW5zdGFuY2VcbiAqIG9mIHRoZSBBcGlTZXJ2aWNlUmVnaXN0cnkgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWdpc3RyeUlkLlxuICpcbiAqIEV4dGVuc2lvbnMgYnkgZGVzaWduIGRvbid0IG5lZWQgdG8gc3RvcmUvYWNjZXNzIG11bHRpcGxlIHNlcnZpY2UgcmVnaXN0cmllcy4gVGhlaXIgc2luZ2xlIGluc3RhbmNlIG9mIFNlcnZpY2VSZWdpc3RyeSBpc1xuICogc3RvcmVkL2FjY2VzcyB3aXRoIHJlZ2lzdHJ5SWQgPSAwLlxuICpcbiAqIFdoZXJlYXMgRW1iZWRkaW5nIG5lZWRzIHRvIGJlIGF3YXJlIG9mIHdoaWNoIFNlcnZpY2VSZWdpc3RyeSB0byB1c2Ugd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgdml6emVzIGVtYmVkZGVkLlxuICogQW4gZXhhbXBsZSBvZiBob3cgd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeSB3aWxsIGxvb2sgd2hlbiB0aGVyZSBhcmUgdHdvIHZpenplczogeyAwIDogU2VydmljZVJlZ2lzdHJ5LCAxIDogU2VydmljZVJlZ2lzdHJ5fVxuICogd2hlcmUgcmVnaXN0cnkgSUQgb2YgMCAmIDEgcmVmZXJzIHRvIHZpeidzIGludGVybmFsIGlkZW50aWZpZXIgKHdoaWNoIGlzIGdlbmVyYXRlZCBieSBWaXpNYW5hZ2VyKS5cbiAqL1xuZXhwb3J0IGNsYXNzIEFwaVNlcnZpY2VSZWdpc3RyeSB7XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIFNlcnZpY2VSZWdpc3RyeVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBnZXQocmVnaXN0cnlJZDogbnVtYmVyKTogU2VydmljZVJlZ2lzdHJ5IHtcbiAgICBpZiAoIXdpbmRvdy5fX3RhYmxlYXVBcGlTZXJ2aWNlUmVnaXN0cnkgfHwgIXdpbmRvdy5fX3RhYmxlYXVBcGlTZXJ2aWNlUmVnaXN0cnlbcmVnaXN0cnlJZF0pIHtcbiAgICAgIEFwaVNlcnZpY2VSZWdpc3RyeS5zZXRJbnN0YW5jZShyZWdpc3RyeUlkLCBuZXcgU2VydmljZVJlZ2lzdHJ5SW1wbCgpKTtcbiAgICB9XG5cbiAgICBpZiAoIXdpbmRvdy5fX3RhYmxlYXVBcGlTZXJ2aWNlUmVnaXN0cnlbcmVnaXN0cnlJZF0pIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnU2VydmljZSByZWdpc3RyeSBmYWlsZWQnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeVtyZWdpc3RyeUlkXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgbWV0aG9kIHRoYXQgc2V0cyB0aGUgc2VydmljZSByZWdpc3RyeSBpbnN0YW5jZSBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgcmVnaXN0cnlJZC4gQ2FuIGJlIHVzZWQgYnkgdW5pdCB0ZXN0c1xuICAgKlxuICAgKiBAcGFyYW0ge1NlcnZpY2VSZWdpc3RyeX0gc2VydmljZVJlZ2lzdHJ5IFRoZSBuZXcgcmVnaXN0cnlcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgc2V0SW5zdGFuY2UocmVnaXN0cnlJZDogbnVtYmVyLCBzZXJ2aWNlUmVnaXN0cnk6IFNlcnZpY2VSZWdpc3RyeSk6IHZvaWQge1xuICAgIGlmICghd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeSkge1xuICAgICAgd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeSA9IHt9O1xuICAgIH1cbiAgICB3aW5kb3cuX190YWJsZWF1QXBpU2VydmljZVJlZ2lzdHJ5W3JlZ2lzdHJ5SWRdID0gc2VydmljZVJlZ2lzdHJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIE9ubHkgdXNlZCBieSB1bml0IHRlc3RzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGNsZWFyUmVnaXN0cnkoKTogdm9pZCB7XG4gICAgd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeSA9IHt9O1xuICB9XG5cbiAgLy8gUHJpdmF0ZSB0byBhdm9pZCBhbnlvbmUgY29uc3RydWN0aW5nIHRoaXNcbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG59XG4iLCJpbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgUGFyYW1ldGVySWQsIFZlcmJJZCwgVmlzdWFsSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVG9vbHRpcFRleHRSZXF1ZXN0TW9kZWwgfSBmcm9tICcuLi8uLi9Nb2RlbHMvQWNjZXNzaWJpbGl0eU1vZGVscyc7XG5pbXBvcnQgeyBBY2Nlc3NpYmlsaXR5U2VydmljZSB9IGZyb20gJy4uL0FjY2Vzc2liaWxpdHlTZXJ2aWNlJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBBY2Nlc3NpYmlsaXR5U2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBBY2Nlc3NpYmlsaXR5U2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLkFjY2Vzc2liaWxpdHk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VG9vbHRpcFRleHRBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQsIHR1cGxlSWQ6IG51bWJlcik6IFByb21pc2U8U3RyaW5nPiB7XG4gICAgbGV0IHRvb2x0aXBUZXh0UmVxdWVzdCA9IG5ldyBUb29sdGlwVGV4dFJlcXVlc3RNb2RlbCh2aXN1YWxJZCwgdHVwbGVJZCk7XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0VG9vbHRpcFRleHRBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVG9vbHRpcFRleHRSZXF1ZXN0XTogdG9vbHRpcFRleHRSZXF1ZXN0LFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRUb29sdGlwVGV4dCwgcGFyYW1ldGVycykudGhlbjxTdHJpbmc+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLnJlc3VsdCBhcyBTdHJpbmc7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbGVhdmVNYXJrTmF2aWdhdGlvbkFzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdsZWF2ZU1hcmtOYXZpZ2F0aW9uQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlJhaXNlTGVhdmVNYXJrTmF2Tm90aWZpY2F0aW9uLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBSZXBsYXlTcGVlZFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgUGFyYW1ldGVySWQsIFZlcmJJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MgYXMgRXh0ZXJuYWxFbnVtQ29udmVydGVyIH0gZnJvbSAnLi4vLi4vRW51bU1hcHBpbmdzL0V4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyc7XG5pbXBvcnQgeyBFcnJvckhlbHBlcnMgfSBmcm9tICcuLi8uLi9VdGlscy9FcnJvckhlbHBlcnMnO1xuaW1wb3J0IHsgQW5pbWF0aW9uU2VydmljZSB9IGZyb20gJy4uL0FuaW1hdGlvblNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vU2VydmljZUltcGxCYXNlJztcblxuZXhwb3J0IGNsYXNzIEFuaW1hdGlvblNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgQW5pbWF0aW9uU2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLkFuaW1hdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyByZXBsYXlBc3luYyhyZXBsYXlTcGVlZDogUmVwbGF5U3BlZWRUeXBlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5SZXBsYXlTcGVlZF06IDEuMCxcbiAgICB9O1xuXG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUVudW1WYWx1ZTxSZXBsYXlTcGVlZFR5cGU+KHJlcGxheVNwZWVkLCBSZXBsYXlTcGVlZFR5cGUsICdSZXBsYXlTcGVlZFR5cGUnKTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlJlcGxheVNwZWVkXSA9IEV4dGVybmFsRW51bUNvbnZlcnRlci5zZXRSZXBsYXlTcGVlZFR5cGUuY29udmVydChyZXBsYXlTcGVlZCk7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5SZXBsYXlBbmltYXRpb24sIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBBbm5vdGF0ZUVudW0sIEFubm90YXRpb24sIEV4ZWN1dGVQYXJhbWV0ZXJzLCBQYXJhbWV0ZXJJZCwgVmVyYklkLCBWaXN1YWxJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MgfSBmcm9tICcuLi8uLi9FbnVtTWFwcGluZ3MvSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzJztcbmltcG9ydCB7IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lciwgVHVwbGVTZWxlY3Rpb25Nb2RlbCB9IGZyb20gJy4uLy4uL01vZGVscy9TZWxlY3Rpb25Nb2RlbHMnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vLi4vVGFibGVhdUVycm9yJztcbmltcG9ydCB7IEFubm90YXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vQW5ub3RhdGlvblNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vU2VydmljZUltcGxCYXNlJztcblxuZXhwb3J0IGNsYXNzIEFubm90YXRpb25TZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIEFubm90YXRpb25TZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTZXJ2aWNlTmFtZXMuQW5ub3RhdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gYW5ub3RhdGUgYSBtYXJrIG9uIHRoZSBnaXZlbiB3b3Jrc2hlZXQuXG4gICAqXG4gICAqIEBwYXJhbSB2aXN1YWxJZFxuICAgKiBAcGFyYW0gbWFya1xuICAgKiBAcGFyYW0gYW5ub3RhdGlvblRleHRcbiAgICovXG4gIHB1YmxpYyBhbm5vdGF0ZU1hcmtBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQsIG1hcms6IENvbnRyYWN0Lk1hcmtJbmZvLCBhbm5vdGF0aW9uVGV4dDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc2VsZWN0aW9uTW9kZWxDb250YWluZXI6IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lciA9IHRoaXMucGFyc2VNYXJrU2VsZWN0aW9uSWRzKFttYXJrXSk7XG4gICAgY29uc3QgZHVtbXlUYXJnZXRQb2ludCA9IHsgeDogMCwgeTogMCB9O1xuICAgIGNvbnN0IGZvcm1hdHRlZFRleHQgPSBgPGZvcm1hdHRlZC10ZXh0PjxydW4+JHthbm5vdGF0aW9uVGV4dH08L3J1bj48L2Zvcm1hdHRlZC10ZXh0PmA7XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYW5ub3RhdGVNYXJrQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQsXG4gICAgICBbUGFyYW1ldGVySWQuQW5ub3RhdGVFbnVtXTogQW5ub3RhdGVFbnVtLk1hcmssXG4gICAgICBbUGFyYW1ldGVySWQuVGFyZ2V0UG9pbnRdOiBkdW1teVRhcmdldFBvaW50LFxuICAgICAgW1BhcmFtZXRlcklkLlNlbGVjdGlvbkxpc3RdOiBbc2VsZWN0aW9uTW9kZWxDb250YWluZXIuc2VsZWN0aW9uXSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Gb3JtYXR0ZWRUZXh0XTogZm9ybWF0dGVkVGV4dCxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkNyZWF0ZUFubm90YXRpb24sIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAvLyBFeHBlY3RpbmcgYW4gZW1wdHkgbW9kZWwgYW5kIGhlbmNlIHRoZSB2b2lkIHJlc3BvbnNlLlxuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byByZXRyaWV2ZSBhbm5vdGF0aW9ucyBmb3IgdGhlIGdpdmVuIHdvcmtzaGVldC5cbiAgICpcbiAgICogQHBhcmFtIHZpc3VhbElkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEFycmF5PEFubm90YXRpb24+Pn1cbiAgICovXG4gIHB1YmxpYyBnZXRBbm5vdGF0aW9uc0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuQW5ub3RhdGlvbj4+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0QW5ub3RhdGlvbnNBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldEFubm90YXRpb25zLCBwYXJhbWV0ZXJzKS50aGVuPEFycmF5PENvbnRyYWN0LkFubm90YXRpb24+PigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGFubm90YXRpb25zTGlzdCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBBcnJheTxBbm5vdGF0aW9uPjtcbiAgICAgIHJldHVybiB0aGlzLmFubm90YXRpb25GaWx0ZXJNYXAoYW5ub3RhdGlvbnNMaXN0KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gcmVtb3ZlIGFuIGFubm90YXRpb24gZnJvbSBhIGdpdmVuIHdvcmtzaGVldC5cbiAgICpcbiAgICogQHBhcmFtIHZpc3VhbElkXG4gICAqIEBwYXJhbSBhbm5vdGF0aW9uXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlQW5ub3RhdGlvbkFzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCwgYW5ub3RhdGlvbjogQ29udHJhY3QuQW5ub3RhdGlvbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyOiBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIgPSB0aGlzLnBhcnNlQW5ub3RhdGlvblNlbGVjdGlvbklkcyhbYW5ub3RhdGlvbl0pO1xuXG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3JlbW92ZUFubm90YXRpb25Bc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TZWxlY3Rpb25MaXN0XTogW3NlbGVjdGlvbk1vZGVsQ29udGFpbmVyLnNlbGVjdGlvbl0sXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5SZW1vdmVBbm5vdGF0aW9uLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgLy8gRXhwZWN0aW5nIGFuIGVtcHR5IG1vZGVsIGFuZCBoZW5jZSB0aGUgdm9pZCByZXNwb25zZS5cbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gcHJlcGFyZSB0aGUgcHJlcyBtb2RlbHMgZm9yIHNlbGVjdGlvbiBieSBNYXJrc0luZm9cbiAgICogQHBhcmFtIG1hcmtzXG4gICAqL1xuICBwcml2YXRlIHBhcnNlTWFya1NlbGVjdGlvbklkcyhtYXJrczogQXJyYXk8Q29udHJhY3QuTWFya0luZm8+KTogU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyIHtcbiAgICBjb25zdCBpZHM6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgICBjb25zdCBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lcjogU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyID0gbmV3IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lcigpO1xuICAgIG1hcmtzLmZvckVhY2goKG1hcmspID0+IHtcbiAgICAgIGNvbnN0IHR1cGxlSWQ6IG51bWJlciB8IHVuZGVmaW5lZCA9IG1hcmsudHVwbGVJZDtcbiAgICAgIGlmICh0dXBsZUlkICE9PSB1bmRlZmluZWQgJiYgdHVwbGVJZCAhPT0gbnVsbCAmJiB0dXBsZUlkID4gMCkge1xuICAgICAgICBpZHMucHVzaCh0dXBsZUlkLnRvU3RyaW5nKCkpOyAvLyBjb2xsZWN0IHRoZSB0dXBsZSBpZHNcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnaW52YWxpZCB0dXBsZUlkJyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKGlkcy5sZW5ndGggIT09IDApIHtcbiAgICAgIC8vIHR1cGxlIGlkcyBiYXNlZCBzZWxlY3Rpb25cbiAgICAgIGNvbnN0IHR1cGxlU2VsZWN0aW9uTW9kZWw6IFR1cGxlU2VsZWN0aW9uTW9kZWwgPSBuZXcgVHVwbGVTZWxlY3Rpb25Nb2RlbCgpO1xuICAgICAgdHVwbGVTZWxlY3Rpb25Nb2RlbC5zZWxlY3Rpb25UeXBlID0gJ3R1cGxlcyc7XG4gICAgICB0dXBsZVNlbGVjdGlvbk1vZGVsLm9iamVjdElkcyA9IGlkcztcbiAgICAgIHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLnNlbGVjdGlvbiA9IHR1cGxlU2VsZWN0aW9uTW9kZWw7XG4gICAgfVxuICAgIHJldHVybiBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gcHJlcGFyZSB0aGUgcHJlcyBtb2RlbHMgZm9yIHNlbGVjdGlvbiBieSBNYXJrQW5ub3RhdGlvbkluZm9cbiAgICogQHBhcmFtIG1hcmtzXG4gICAqL1xuICBwcml2YXRlIHBhcnNlQW5ub3RhdGlvblNlbGVjdGlvbklkcyhhbm5vdGF0aW9uczogQXJyYXk8Q29udHJhY3QuQW5ub3RhdGlvbj4pOiBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIge1xuICAgIGNvbnN0IGlkczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICAgIGNvbnN0IHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyOiBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIgPSBuZXcgU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyKCk7XG4gICAgYW5ub3RhdGlvbnMuZm9yRWFjaCgoYW5ub3RhdGlvbikgPT4ge1xuICAgICAgY29uc3QgYW5ub3RhdGlvbklkOiBudW1iZXIgfCB1bmRlZmluZWQgPSBhbm5vdGF0aW9uLmFubm90YXRpb25JZDtcbiAgICAgIGlmIChhbm5vdGF0aW9uSWQgIT09IHVuZGVmaW5lZCAmJiBhbm5vdGF0aW9uSWQgIT09IG51bGwgJiYgYW5ub3RhdGlvbklkID49IDApIHtcbiAgICAgICAgaWRzLnB1c2goYW5ub3RhdGlvbklkLnRvU3RyaW5nKCkpOyAvLyBjb2xsZWN0IHRoZSBhbm5vdGF0aW9uIGlkc1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FcnJvckNvZGVzLkludGVybmFsRXJyb3IsICdpbnZhbGlkIGFubm90YXRpb25JZCcpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChpZHMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAvLyBhbm5vdGF0aW9uIGlkcyBiYXNlZCBzZWxlY3Rpb25cbiAgICAgIGNvbnN0IHR1cGxlU2VsZWN0aW9uTW9kZWw6IFR1cGxlU2VsZWN0aW9uTW9kZWwgPSBuZXcgVHVwbGVTZWxlY3Rpb25Nb2RlbCgpO1xuICAgICAgdHVwbGVTZWxlY3Rpb25Nb2RlbC5zZWxlY3Rpb25UeXBlID0gJ2Fubm90YXRpb25zJztcbiAgICAgIHR1cGxlU2VsZWN0aW9uTW9kZWwub2JqZWN0SWRzID0gaWRzO1xuICAgICAgc2VsZWN0aW9uTW9kZWxDb250YWluZXIuc2VsZWN0aW9uID0gdHVwbGVTZWxlY3Rpb25Nb2RlbDtcbiAgICB9XG4gICAgcmV0dXJuIHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byBtYXAgQW5ub3RhdGlvbiB0byBNYXJrQW5ub3RhdGlvbkluZm9cbiAgICogQHBhcmFtIGFubm90YXRpb25cbiAgICogQHJldHVybnMge0Fubm90YXRpb259XG4gICAqL1xuICBwcml2YXRlIG1hcEFubm90YXRpb24oYW5ub3RhdGlvbjogQW5ub3RhdGlvbik6IENvbnRyYWN0LkFubm90YXRpb24ge1xuICAgIHJldHVybiB7XG4gICAgICBhbm5vdGF0aW9uSFRNTDogYW5ub3RhdGlvbi5hbm5vdGF0aW9uVGV4dCxcbiAgICAgIGFubm90YXRpb25JZDogYW5ub3RhdGlvbi5hbm5vdGF0aW9uSWQsXG4gICAgICBhbm5vdGF0aW9uVGV4dDogYW5ub3RhdGlvbi5hbm5vdGF0aW9uUGxhaW5UZXh0LFxuICAgICAgYW5ub3RhdGlvblR5cGU6IEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncy5hbm5vdGF0aW9uVHlwZS5jb252ZXJ0KGFubm90YXRpb24uYW5ub3RhdGVFbnVtKSxcbiAgICAgIHR1cGxlSWQ6IGFubm90YXRpb24udHVwbGVJZCEsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXIgdGhlIEFubm90YXRpb25zIHRvIE1hcmsgQW5ub3RhdGlvbnMsIGFuZCBtYXAgdGhlbSB0byBNYXJrQW5ub3RhdGlvbkluZm9cbiAgICogQHBhcmFtIGFubm90YXRpb25zXG4gICAqIEByZXR1cm5zIHtBcnJheTxBbm5vdGF0aW9uPn1cbiAgICovXG4gIHByaXZhdGUgYW5ub3RhdGlvbkZpbHRlck1hcChhbm5vdGF0aW9uczogQXJyYXk8QW5ub3RhdGlvbj4pOiBBcnJheTxDb250cmFjdC5Bbm5vdGF0aW9uPiB7XG4gICAgY29uc3QgYW5ub3RhdGlvbkluZm9zID0gYW5ub3RhdGlvbnMubWFwKChhbm5vdGF0aW9uKSA9PiB0aGlzLm1hcEFubm90YXRpb24oYW5ub3RhdGlvbikpO1xuXG4gICAgcmV0dXJuIGFubm90YXRpb25JbmZvcztcbiAgfVxufVxuIiwiaW1wb3J0IHsgRW1iZWRkaW5nQm9vdHN0cmFwSW5mbywgRXhlY3V0ZVBhcmFtZXRlcnMsIFBhcmFtZXRlcklkLCBWZXJiSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQ2xpZW50SW5mb1NlcnZpY2UgfSBmcm9tICcuLi9DbGllbnRJbmZvU2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuXG5leHBvcnQgY2xhc3MgQ2xpZW50SW5mb1NlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgQ2xpZW50SW5mb1NlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5DbGllbnRJbmZvO1xuICB9XG5cbiAgcHVibGljIGdldENsaWVudEluZm9Bc3luYygpOiBQcm9taXNlPEVtYmVkZGluZ0Jvb3RzdHJhcEluZm8+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkdldEVtYmVkZGluZ0NsaWVudEluZm87XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldENsaWVudEluZm9Bc3luYycsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxFbWJlZGRpbmdCb290c3RyYXBJbmZvPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGNsaWVudEluZm8gPSByZXNwb25zZS5yZXN1bHQgYXMgRW1iZWRkaW5nQm9vdHN0cmFwSW5mbztcbiAgICAgIHJldHVybiBjbGllbnRJbmZvO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgKiBhcyBJbnRlcm5hbENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBDb25uZWN0aW9uRGVzY3JpcHRpb25TdW1tYXJ5LFxuICBEYXRhU2NoZW1hLFxuICBFeGVjdXRlUGFyYW1ldGVycyxcbiAgSW50ZXJuYWxBcGlEaXNwYXRjaGVyLFxuICBMb2dpY2FsVGFibGVJbmZvLFxuICBQYXJhbWV0ZXJJZCxcbiAgVGFibGVJbmZvLFxuICBUYWJsZUluZm9zLFxuICBWZXJiSWQsXG4gIFZpc3VhbElkLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGF0YVNvdXJjZSB9IGZyb20gJy4uLy4uL0RhdGFTb3VyY2UnO1xuaW1wb3J0IHsgRmllbGQgfSBmcm9tICcuLi8uLi9GaWVsZCc7XG5pbXBvcnQgeyBEYXRhU291cmNlSW1wbCB9IGZyb20gJy4uLy4uL0ltcGwvRGF0YVNvdXJjZUltcGwnO1xuaW1wb3J0IHsgRmllbGRJbXBsIH0gZnJvbSAnLi4vLi4vSW1wbC9GaWVsZEltcGwnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vLi4vVGFibGVhdUVycm9yJztcbmltcG9ydCB7IERhdGFTb3VyY2VTZXJ2aWNlIH0gZnJvbSAnLi4vRGF0YVNvdXJjZVNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vU2VydmljZUltcGxCYXNlJztcbmV4cG9ydCBjbGFzcyBEYXRhU291cmNlU2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBEYXRhU291cmNlU2VydmljZSB7XG4gIC8vIFNpbmNlIE9iamVjdCBNb2RlbCBpcyBzdXBwb3J0ZWQgc2luY2UgVGFibGVhdSAyMDIwLjIsIERhdGFTb3VyY2VTZXJ2aWNlSW1wbCBjYW4gYmUgaW5pdGlhbGl6ZWQgd2l0aCB0aGVcbiAgLy8gcGxhdGZvcm0gdmVyc2lvbiB3aGVuIE9NIHdhcyBzdXBwb3J0ZWQuIE9uY2Ugd2UgZHJvcCBzdXBwb3J0IGZvciBUYWJsZWF1IHZlcnNpb25zIDw9IDIwMjAuMSwgYWxsIGFkZGl0aW9uYWxcbiAgLy8gY29kZSBpbiBoZXJlIGZvciBPYmplY3QgTW9kZWwgY2FuIGJlIHJlbW92ZWQuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihkaXNwYXRjaGVyOiBJbnRlcm5hbEFwaURpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQ6IG51bWJlcikge1xuICAgIHN1cGVyKGRpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQpO1xuICB9XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLkRhdGFTb3VyY2VTZXJ2aWNlO1xuICB9XG5cbiAgcHVibGljIHJlZnJlc2hBc3luYyhkYXRhU291cmNlSWQ/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAncmVmcmVzaEFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EZWx0YVRpbWVNc106IDAsXG4gICAgICBbUGFyYW1ldGVySWQuU2hvdWxkUmVmcmVzaERTXTogdHJ1ZSxcbiAgICB9O1xuXG4gICAgLy8gT24gc2VydmVyOiBOb3QgcGFzc2luZyB0aGUgZGF0YXNvdXJjZSBpZCB3aWxsIHJlZnJlc2ggYWxsIGRhdGFzb3VyY2VzLlxuICAgIGlmIChkYXRhU291cmNlSWQpIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRGF0YVNvdXJjZUlkXSA9IGRhdGFTb3VyY2VJZDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5SZWZyZXNoRGF0YVNvdXJjZSwgcGFyYW1ldGVycykudGhlbjx2b2lkPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBY3RpdmVUYWJsZXNBc3luYyhkYXRhU291cmNlSWQ6IHN0cmluZyk6IFByb21pc2U8QXJyYXk8VGFibGVJbmZvPj4ge1xuICAgIGNvbnN0IGpvaW5QYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0QWN0aXZlVGFibGVzQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkRhdGFTb3VyY2VJZF06IGRhdGFTb3VyY2VJZCxcbiAgICB9O1xuXG4gICAgLy8gR2V0IHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgdGFibGVzIHVzZWQgYnkgdGhpcyBjb25uZWN0aW9uXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0QWN0aXZlVGFibGVzLCBqb2luUGFyYW1ldGVycykudGhlbjxBcnJheTxUYWJsZUluZm8+Pigoam9pblJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCB0YWJsZUluZm9zID0gam9pblJlc3BvbnNlLnJlc3VsdCBhcyBUYWJsZUluZm9zO1xuXG4gICAgICAvLyBnZXRBY3RpdmVUYWJsZXMgaXMgdW5zdXBwb3J0ZWQgZm9yIGN1YmVzIGFuZCBHQS4gV2UgZG8gbm90IGhhdmUgYSBjb25uZWN0aW9uIHR5cGUgcHJvcGVydHlcbiAgICAgIC8vIGF2YWlsYWJsZSBmcm9tIHRoZSBwbGF0Zm9ybSAoaW50ZW50aW9uYWxseSwgdG8gcmVkdWNlIGNvZGUgY2h1cm4gYXMgbmV3IGNvbm5lY3Rpb25zIGFyZSBhZGRlZCkuXG4gICAgICAvLyBJbnN0ZWFkLGp1c3QgY2hlY2sgaWYgYW55IHRhYmxlcyBhcmUgcmV0dXJuZWQuIFRoaXMgYXJyYXkgd2lsbCBiZSBlbXB0eSBmb3IgYW55IG5vbi10YWJsZSBiYXNlZCBkYXRhc291cmNlLlxuICAgICAgaWYgKHRhYmxlSW5mb3MudGFibGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuVW5zdXBwb3J0ZWRNZXRob2RGb3JEYXRhU291cmNlVHlwZSwgYGdldEFjdGl2ZVRhYmxlcyBpcyBub3Qgc3VwcG9ydGVkIGZvcjogJHtkYXRhU291cmNlSWR9YCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0YWJsZUluZm9zLnRhYmxlcztcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXREYXRhU291cmNlc0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8RGF0YVNjaGVtYT4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXREYXRhU291cmNlc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0RGF0YVNvdXJjZXMsIHBhcmFtZXRlcnMpLnRoZW48RGF0YVNjaGVtYT4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBkYXRhU2NoZW1hID0gcmVzcG9uc2UucmVzdWx0IGFzIERhdGFTY2hlbWE7XG4gICAgICByZXR1cm4gZGF0YVNjaGVtYTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBbGxEYXRhU291cmNlc0FzeW5jKCk6IFByb21pc2U8RGF0YVNjaGVtYT4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRBbGxEYXRhU291cmNlc0FzeW5jJyxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldEFsbERhdGFTb3VyY2VzLCBwYXJhbWV0ZXJzKS50aGVuPERhdGFTY2hlbWE+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgZGF0YVNjaGVtYSA9IHJlc3BvbnNlLnJlc3VsdCBhcyBEYXRhU2NoZW1hO1xuICAgICAgcmV0dXJuIGRhdGFTY2hlbWE7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29ubmVjdGlvblN1bW1hcmllc0FzeW5jKGRhdGFTb3VyY2VJZDogc3RyaW5nKTogUHJvbWlzZTxDb25uZWN0aW9uRGVzY3JpcHRpb25TdW1tYXJ5W10+IHtcbiAgICBjb25zdCBwYXJhbXM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRDb25uZWN0aW9uU3VtbWFyaWVzQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkRhdGFTb3VyY2VJZF06IGRhdGFTb3VyY2VJZCxcbiAgICB9O1xuXG4gICAgLy8gR2V0IHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgdGFibGVzIHVzZWQgYnkgdGhpcyBjb25uZWN0aW9uXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0Q29ubmVjdGlvbkRlc2NyaXB0aW9uU3VtbWFyaWVzLCBwYXJhbXMpLnRoZW48Q29ubmVjdGlvbkRlc2NyaXB0aW9uU3VtbWFyeVtdPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGRlc2NyaXB0aW9uU3VtbWFyaWVzID0gcmVzcG9uc2UucmVzdWx0IGFzIENvbm5lY3Rpb25EZXNjcmlwdGlvblN1bW1hcnlbXTtcbiAgICAgIHJldHVybiBkZXNjcmlwdGlvblN1bW1hcmllcztcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRGaWVsZEFzeW5jKGdsb2JhbGZpZWxkTmFtZTogc3RyaW5nKTogUHJvbWlzZTxDb250cmFjdC5GaWVsZD4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuR2V0RmllbGRBbmREYXRhU291cmNlO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRGaWVsZEFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5GaWVsZElkXTogZ2xvYmFsZmllbGROYW1lLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48Q29udHJhY3QuRmllbGQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgZGF0YVNvdXJjZSA9IHJlc3BvbnNlLnJlc3VsdFtQYXJhbWV0ZXJJZC5EYXRhU291cmNlXSBhcyBJbnRlcm5hbENvbnRyYWN0LkRhdGFTb3VyY2U7XG4gICAgICBjb25zdCBmaWVsZCA9IHJlc3BvbnNlLnJlc3VsdFtQYXJhbWV0ZXJJZC5GaWVsZF0gYXMgRmllbGQ7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0RmllbGQoZmllbGQsIHRoaXMuY29udmVydERhdGFTb3VyY2UoZGF0YVNvdXJjZSkpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldExvZ2ljYWxUYWJsZXNBc3luYyhkYXRhU291cmNlSWQ6IHN0cmluZyk6IFByb21pc2U8QXJyYXk8TG9naWNhbFRhYmxlSW5mbz4+IHtcbiAgICBjb25zdCBwYXJhbXM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRMb2dpY2FsVGFibGVzQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkRhdGFTb3VyY2VJZF06IGRhdGFTb3VyY2VJZCxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldExvZ2ljYWxUYWJsZXMsIHBhcmFtcykudGhlbjxBcnJheTxMb2dpY2FsVGFibGVJbmZvPj4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm4gcmVzcG9uc2UucmVzdWx0IGFzIEFycmF5PExvZ2ljYWxUYWJsZUluZm8+O1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldFVuZGVybHlpbmdUYWJsZXNBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQpOiBQcm9taXNlPEFycmF5PExvZ2ljYWxUYWJsZUluZm8+PiB7XG4gICAgY29uc3QgcGFyYW1zOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0VW5kZXJseWluZ1RhYmxlc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0VW5kZXJseWluZ1RhYmxlcywgcGFyYW1zKS50aGVuPEFycmF5PExvZ2ljYWxUYWJsZUluZm8+PigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybiByZXNwb25zZS5yZXN1bHQgYXMgQXJyYXk8TG9naWNhbFRhYmxlSW5mbz47XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRGaWVsZChmaWVsZDogSW50ZXJuYWxDb250cmFjdC5GaWVsZCwgZGF0YVNvdXJjZTogQ29udHJhY3QuRGF0YVNvdXJjZSk6IENvbnRyYWN0LkZpZWxkIHtcbiAgICByZXR1cm4gbmV3IEZpZWxkKG5ldyBGaWVsZEltcGwoZmllbGQsIGRhdGFTb3VyY2UpKTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydERhdGFTb3VyY2UoZGF0YVNvdXJjZTogSW50ZXJuYWxDb250cmFjdC5EYXRhU291cmNlKTogQ29udHJhY3QuRGF0YVNvdXJjZSB7XG4gICAgcmV0dXJuIG5ldyBEYXRhU291cmNlKG5ldyBEYXRhU291cmNlSW1wbChkYXRhU291cmNlLCB0aGlzLl9yZWdpc3RyeUlkKSk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEV4ZWN1dGVQYXJhbWV0ZXJzLFxuICBFeHBvcnRDcm9zc3RhYlNoZWV0TWFwLFxuICBFeHBvcnRGaWxlLFxuICBFeHBvcnRQREZPcHRpb25zIGFzIEludGVybmFsRXhwb3J0UERGT3B0aW9ucyxcbiAgUGFyYW1ldGVySWQsXG4gIFZlcmJJZCxcbiAgVmlzdWFsSWQsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBDcm9zc3RhYkZpbGVGb3JtYXQsXG4gIEV4cG9ydERhdGFPcHRpb25zLFxuICBFeHBvcnRQREZPcHRpb25zIGFzIEV4dGVybmFsRXhwb3J0UERGT3B0aW9ucyxcbiAgRXhwb3J0U2NlbmFyaW9zRm9yUERGQW5kUG93ZXJQb2ludCxcbiAgU2hhcmVkRXJyb3JDb2RlcyxcbiAgU2hlZXRUeXBlIGFzIEV4dGVybmFsU2hlZXRUeXBlLFxufSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzIH0gZnJvbSAnLi4vLi4vRW51bU1hcHBpbmdzL0V4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyc7XG5pbXBvcnQgeyBFeHBvcnRIZWxwZXJzIH0gZnJvbSAnLi4vLi4vVXRpbHMvRXhwb3J0SGVscGVycyc7XG5pbXBvcnQgeyBFeHBvcnRTZXJ2aWNlIH0gZnJvbSAnLi4vRXhwb3J0U2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgRXJyb3JIZWxwZXJzIH0gZnJvbSAnLi4vLi4vVXRpbHMvRXJyb3JIZWxwZXJzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uLy4uL1RhYmxlYXVFcnJvcic7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBFeHBvcnRTZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIEV4cG9ydFNlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5FeHBvcnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0RXhwb3J0Q3Jvc3N0YWJTaGVldE1hcEFzeW5jKGN1cnJlbnRTaGVldFR5cGU6IEV4dGVybmFsU2hlZXRUeXBlKTogUHJvbWlzZTxFeHBvcnRDcm9zc3RhYlNoZWV0TWFwPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5HZXRFeHBvcnRDcm9zc3RhYlNoZWV0TWFwO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRFeHBvcnRDcm9zc3RhYlNoZWV0TWFwQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkN1cnJlbnRTaGVldFR5cGVdOiBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3Muc2hlZXRUeXBlLmNvbnZlcnQoY3VycmVudFNoZWV0VHlwZSksXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48RXhwb3J0Q3Jvc3N0YWJTaGVldE1hcD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQgYXMgRXhwb3J0Q3Jvc3N0YWJTaGVldE1hcDtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZXhwb3J0Q3Jvc3N0YWJBc3luYyhcbiAgICBzaGVldE5hbWU6IHN0cmluZyxcbiAgICBmb3JtYXQ6IENyb3NzdGFiRmlsZUZvcm1hdCxcbiAgICBleHBvcnRhYmxlV29ya3NoZWV0TmFtZXM6IEFycmF5PHN0cmluZz4sXG4gICAgY3VycmVudFNoZWV0VHlwZTogRXh0ZXJuYWxTaGVldFR5cGUsXG4gICk6IFByb21pc2U8RXhwb3J0RmlsZT4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlTaGVldE5hbWUoZXhwb3J0YWJsZVdvcmtzaGVldE5hbWVzLCBzaGVldE5hbWUpO1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlFbnVtVmFsdWU8Q3Jvc3N0YWJGaWxlRm9ybWF0Pihmb3JtYXQsIENyb3NzdGFiRmlsZUZvcm1hdCwgJ0Nyb3NzdGFiRmlsZUZvcm1hdCcpO1xuXG4gICAgLy8gVGhlIHByZXMgbGF5ZXIgY29tbWFuZCBmb3IgZXhwb3J0aW5nIENyb3NzdGFiIHVzZXMgU2ltcGxlU2hlZXRJZGVudGlmaWVycyBpbnN0ZWFkIG9mIHNoZWV0IG5hbWVzLlxuICAgIC8vIFRoZSBleHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpIGN1cnJlbnQgZG9lcyBub3Qgc3RvcmUgcmVmZXJlbmNlcyB0byB0aGUgU2ltcGxlU2hlZXRJZGVudGlmaWVycyBvZiBpdHMgc2hlZXRzXG4gICAgLy8gc28gd2UgY2FsbCBhIHByZXMgbGF5ZXIgY29tbWFuZCB0aGF0IGdpdmVzIHVzIHRoZSBTaW1wbGVTaGVldElkZW50aWZpZXIgZm9yIGVhY2ggc2hlZXQgbmFtZSB0aGF0IGFwcGVhcnMgaW4gdGhlXG4gICAgLy8gZXhwb3J0IENyb3NzdGFiIGRpYWxvZyBwb3B1cC5cbiAgICBjb25zdCBzaGVldE5hbWVUb0lkTWFwID0gYXdhaXQgdGhpcy5nZXRFeHBvcnRDcm9zc3RhYlNoZWV0TWFwQXN5bmMoY3VycmVudFNoZWV0VHlwZSk7XG4gICAgaWYgKCFzaGVldE5hbWVUb0lkTWFwW3NoZWV0TmFtZV0pIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnbWlzc2luZyBzaGVldCBkb2MgaWQgZnJvbSBzaGVldE1hcCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdleHBvcnRDcm9zc3RhYkFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TaGVldElkZW50aWZpZXJdOiBzaGVldE5hbWVUb0lkTWFwW3NoZWV0TmFtZV0sXG4gICAgICBbUGFyYW1ldGVySWQuU2VuZE5vdGlmaWNhdGlvbnNdOiB0cnVlLCAvLyBzZW5kIG5vdGlmaWNhdGlvbiBvbiBwcmVzIGxheWVyIHRoYXQgdHJpZ2dlcnMgZmlsZSBkb3dubG9hZFxuICAgIH07XG5cbiAgICAvLyBwcmVzIGxheWVyIGNvbW1hbmQgaW52b2tlZCBkZXBlbmRzIG9uIHRoZSBjcm9zc3RhYiBmaWxlIGZvcm1hdFxuICAgIGxldCB2ZXJiO1xuICAgIHN3aXRjaCAoZm9ybWF0KSB7XG4gICAgICBjYXNlIENyb3NzdGFiRmlsZUZvcm1hdC5DU1Y6XG4gICAgICAgIHZlcmIgPSBWZXJiSWQuRXhwb3J0Q3Jvc3N0YWJDc3ZEb3dubG9hZDtcbiAgICAgICAgLy8gQ1NWIG9ubHkgcGFyYW1ldGVyOiBzZWUgYnJvd3Nlci1jbGllbnRzL2V4cG9ydC1jcm9zc3RhYi1vcHRpb25zLWRpYWxvZyByZXBvXG4gICAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuVXNlVGFiRGVsaW1pdGVyc10gPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQ3Jvc3N0YWJGaWxlRm9ybWF0LkV4Y2VsOlxuICAgICAgICB2ZXJiID0gVmVyYklkLkV4cG9ydENyb3NzdGFiRXhjZWxEb3dubG9hZDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ3Vuc3VwcG9ydGVkIENyb3NzdGFiIGZpbGUgZm9ybWF0LicpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycylcbiAgICAgIC50aGVuPEV4cG9ydEZpbGU+KChyZXNwb25zZSkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQgYXMgRXhwb3J0RmlsZTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKCkgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuQ3Jvc3N0YWJDcmVhdGlvbkVycm9yLCAnQW4gdW5leHBlY3RlZCBlcnJvciBvY2N1cnJlZCB3aGlsZSBnZW5lcmF0aW5nIHRoZSBkb2N1bWVudC4nKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGV4cG9ydERhdGFBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQsIG9wdGlvbnM6IEV4cG9ydERhdGFPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUV4cG9ydERhdGFPcHRpb25zKG9wdGlvbnMpO1xuXG4gICAgLy8gUmVtb3ZlIGFueSBkdXBsaWNhdGVzIGZyb20gdGhlIGlucHV0IGFycmF5XG4gICAgY29uc3QgY29sdW1uc0FzU2V0OiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQob3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlQnlJZCk7XG4gICAgY29uc3QgY29sdW1uc1RvSW5jbHVkZUJ5SWQgPSBBcnJheS5mcm9tKGNvbHVtbnNBc1NldCk7XG5cbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkV4cG9ydERhdGFEb3dubG9hZDtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZXhwb3J0RGF0YUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkLFxuICAgICAgW1BhcmFtZXRlcklkLklnbm9yZUFsaWFzZXNdOiBvcHRpb25zLmlnbm9yZUFsaWFzZXMgPz8gZmFsc2UsXG4gICAgICBbUGFyYW1ldGVySWQuQ29sdW1uc1RvSW5jbHVkZUJ5SWRdOiBjb2x1bW5zVG9JbmNsdWRlQnlJZCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKVxuICAgICAgLnRoZW48dm9pZD4oKCkgPT4ge30pXG4gICAgICAuY2F0Y2goKCkgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuRGF0YUNyZWF0aW9uRXJyb3IsICdBbiB1bmV4cGVjdGVkIGVycm9yIG9jY3VycmVkIHdoaWxlIGdlbmVyYXRpbmcgdGhlIGRvY3VtZW50LicpO1xuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZXhwb3J0UG93ZXJQb2ludEFzeW5jKHNoZWV0TmFtZXM6IEFycmF5PHN0cmluZz4sIGV4cG9ydFNjZW5hcmlvczogRXhwb3J0U2NlbmFyaW9zRm9yUERGQW5kUG93ZXJQb2ludCk6IFByb21pc2U8RXhwb3J0RmlsZT4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlTaGVldE5hbWVzRm9yUERGQW5kUFBUKHNoZWV0TmFtZXMsIGV4cG9ydFNjZW5hcmlvcyk7XG5cbiAgICAvLyBOb3RlOiB0aGUgRXhwb3J0T3JpZ2luVXJsIHBhcmFtIGlzIGxpc3RlZCBhcyBvcHRpb25hbCBmb3IgdGhlIHByZXMgbGF5ZXIgY29tbWFuZCB3ZSBhcmUgaW52b2tpbmc7IGhvd2V2ZXIsXG4gICAgLy8gcmVjZW50IGNoYW5nZXMgd2VyZSBtYWRlIHRoYXQgZW5mb3JjZWQgdGhlIHVzZSBvZiB0aGUgZW1wdHkgc3RyaW5nIHdoZW4gaW52b2tpbmcgdGhpcyBjb21tYW5kIHdpdGggbm8gRXhwb3J0T3JpZ2luVXJsLlxuICAgIC8vIHNlZSBicm93c2VyLWNsaWVudHMvZXhwb3J0LXBvd2VycG9pbnQtb3B0aW9ucy1kaWFsb2cgcmVwby5cbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkV4cG9ydFBvd2VycG9pbnREb3dubG9hZDtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZXhwb3J0UG93ZXJQb2ludEFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5FeHBvcnRPcmlnaW5VcmxdOiAnJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TZWxlY3RlZFNoZWV0TmFtZXNdOiBzaGVldE5hbWVzLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpXG4gICAgICAudGhlbjxFeHBvcnRGaWxlPigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0IGFzIEV4cG9ydEZpbGU7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKCgpID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihcbiAgICAgICAgICBTaGFyZWRFcnJvckNvZGVzLlBvd2VyUG9pbnRDcmVhdGlvbkVycm9yLFxuICAgICAgICAgICdBbiBlcnJvciBvY2N1cmVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gZ2VuZXJhdGUgdGhlIFBvd2VyUG9pbnQgZmlsZS4nLFxuICAgICAgICApO1xuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZXhwb3J0UERGQXN5bmMoXG4gICAgc2hlZXROYW1lczogQXJyYXk8c3RyaW5nPixcbiAgICBleHRlcm5hbEV4cG9ydFBkZk9wdGlvbnM6IEV4dGVybmFsRXhwb3J0UERGT3B0aW9ucyxcbiAgICBleHBvcnRTY2VuYXJpb3M6IEV4cG9ydFNjZW5hcmlvc0ZvclBERkFuZFBvd2VyUG9pbnQsXG4gICk6IFByb21pc2U8RXhwb3J0RmlsZT4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlFeHBvcnRQREZPcHRpb25zKGV4dGVybmFsRXhwb3J0UGRmT3B0aW9ucyk7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVNoZWV0TmFtZXNGb3JQREZBbmRQUFQoc2hlZXROYW1lcywgZXhwb3J0U2NlbmFyaW9zKTtcblxuICAgIGNvbnN0IGludGVybmFsRXhwb3J0UGRmT3B0aW9uczogSW50ZXJuYWxFeHBvcnRQREZPcHRpb25zID0gYXdhaXQgdGhpcy5nZXRFeHBvcnRQREZPcHRpb25zQXN5bmMoKTtcbiAgICBFeHBvcnRIZWxwZXJzLnVwZGF0ZUludGVybmFsRXhwb3J0UERGT3B0aW9ucyhpbnRlcm5hbEV4cG9ydFBkZk9wdGlvbnMsIGV4dGVybmFsRXhwb3J0UGRmT3B0aW9ucywgc2hlZXROYW1lcyk7XG5cbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkV4cG9ydFBkZkRvd25sb2FkO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdleHBvcnRQREZBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuRXhwb3J0UGRmT3B0aW9uc106IGludGVybmFsRXhwb3J0UGRmT3B0aW9ucyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKVxuICAgICAgLnRoZW48RXhwb3J0RmlsZT4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBFeHBvcnRGaWxlO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5QREZDcmVhdGlvbkVycm9yLCAnVW5hYmxlIHRvIGNyZWF0ZSBQREYgYmVjYXVzZSBzb21ldGhpbmcgd2VudCB3cm9uZy4gVHJ5IGFnYWluLicpO1xuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RXhwb3J0UERGT3B0aW9uc0FzeW5jKCk6IFByb21pc2U8SW50ZXJuYWxFeHBvcnRQREZPcHRpb25zPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5HZXRFeHBvcnRQZGZPcHRpb25zO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRFeHBvcnRQZGZPcHRpb25zQXN5bmMnLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPEludGVybmFsRXhwb3J0UERGT3B0aW9ucz4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQgYXMgSW50ZXJuYWxFeHBvcnRQREZPcHRpb25zO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQXBpTWVudVR5cGUsIENvbnRleHRNZW51T3B0aW9ucyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgUGFyYW1ldGVySWQsIFZlcmJJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeHRlcm5hbENvbnRleHRNZW51U2VydmljZSB9IGZyb20gJy4uL0V4dGVybmFsQ29udGV4dE1lbnVTZXJ2aWNlJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBFeHRlcm5hbENvbnRleHRNZW51U2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBFeHRlcm5hbENvbnRleHRNZW51U2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLkV4dGVybmFsQ29udGV4dE1lbnU7XG4gIH1cblxuICBwdWJsaWMgYXBwZW5kQ29udGV4dE1lbnVBc3luYyhzaGVldE5hbWU6IHN0cmluZywgdGFyZ2V0TWVudTogQXBpTWVudVR5cGUsIGNvbmZpZzogQ29udGV4dE1lbnVPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkFwcGVuZEV4dGVybmFsTWVudUl0ZW07XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2FwcGVuZENvbnRleHRNZW51QXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLldvcmtzaGVldE5hbWVdOiBzaGVldE5hbWUsXG4gICAgICBbUGFyYW1ldGVySWQuRXh0ZXJuYWxNZW51SXRlbURpc3BsYXlOYW1lXTogY29uZmlnLmRpc3BsYXlOYW1lLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48c3RyaW5nPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IG5ld01lbnVJdGVtSWQgPSByZXNwb25zZS5yZXN1bHQgYXMgc3RyaW5nO1xuICAgICAgcmV0dXJuIG5ld01lbnVJdGVtSWQ7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlQ29udGV4dE1lbnVBc3luYyhzaGVldE5hbWU6IHN0cmluZywgdGFyZ2V0TWVudTogQXBpTWVudVR5cGUsIG1lbnVJdGVtSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuUmVtb3ZlRXh0ZXJuYWxNZW51SXRlbTtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAncmVtb3ZlQ29udGV4dE1lbnVBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuV29ya3NoZWV0TmFtZV06IHNoZWV0TmFtZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5FeHRlcm5hbE1lbnVJdGVtSWRdOiBtZW51SXRlbUlkLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZXhlY3V0ZUNvbnRleHRNZW51QXN5bmMoc2hlZXROYW1lOiBzdHJpbmcsIHRhcmdldE1lbnU6IEFwaU1lbnVUeXBlLCBtZW51SXRlbUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkV4ZWN1dGVFeHRlcm5hbE1lbnVJdGVtO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdleGVjdXRlQ29udGV4dE1lbnVBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuV29ya3NoZWV0TmFtZV06IHNoZWV0TmFtZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5FeHRlcm5hbE1lbnVJdGVtSWRdOiBtZW51SXRlbUlkLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgcmVuYW1lQ29udGV4dE1lbnVBc3luYyhzaGVldE5hbWU6IHN0cmluZywgdGFyZ2V0TWVudTogQXBpTWVudVR5cGUsIG1lbnVIZWFkZXI6IHN0cmluZywgbWVudURlc2NyaXB0aW9uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLlJlbmFtZUV4dGVybmFsTWVudTtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAncmVuYW1lQ29udGV4dE1lbnVBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuV29ya3NoZWV0TmFtZV06IHNoZWV0TmFtZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5FeHRlcm5hbE1lbnVIZWFkZXJdOiBtZW51SGVhZGVyLFxuICAgICAgW1BhcmFtZXRlcklkLkV4dGVybmFsTWVudURlc2NyaXB0aW9uXTogbWVudURlc2NyaXB0aW9uLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBEYXRlUmFuZ2VUeXBlLFxuICBFbWJlZGRpbmdFcnJvckNvZGVzLFxuICBFcnJvckNvZGVzLFxuICBGaWx0ZXJEb21haW5UeXBlLFxuICBGaWx0ZXJUeXBlIGFzIEV4dGVybmFsRmlsdGVyVHlwZSxcbiAgU2hhcmVkRXJyb3JDb2Rlcyxcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCAqIGFzIEludGVybmFsQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBGaWx0ZXJUeXBlLCBQYXJhbWV0ZXJJZCwgVmVyYklkLCBWaXN1YWxJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi8uLi8uLi9BcGlTaGFyZWQnO1xuaW1wb3J0IHsgRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzIGFzIEV4dGVybmFsRW51bUNvbnZlcnRlciB9IGZyb20gJy4uLy4uL0VudW1NYXBwaW5ncy9FeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MnO1xuaW1wb3J0IHsgSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzIGFzIEludGVybmFsRW51bUNvbnZlcnRlciB9IGZyb20gJy4uLy4uL0VudW1NYXBwaW5ncy9JbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MnO1xuaW1wb3J0IHtcbiAgQ2F0ZWdvcmljYWxEb21haW4sXG4gIENhdGVnb3JpY2FsRmlsdGVyLFxuICBIaWVyYXJjaGljYWxEYXRhVmFsdWUsXG4gIEhpZXJhcmNoaWNhbEZpbHRlcixcbiAgSGllcmFyY2hpY2FsTGV2ZWxEZXRhaWwsXG4gIFJhbmdlRG9tYWluLFxuICBSYW5nZUZpbHRlcixcbiAgUmVsYXRpdmVEYXRlRmlsdGVyLFxufSBmcm9tICcuLi8uLi9Nb2RlbHMvRmlsdGVyTW9kZWxzJztcbmltcG9ydCB7IERhdGFWYWx1ZSB9IGZyb20gJy4uLy4uL01vZGVscy9HZXREYXRhTW9kZWxzJztcbmltcG9ydCB7IERhdGFWYWx1ZUZhY3RvcnkgfSBmcm9tICcuLi8uLi9VdGlscy9EYXRhVmFsdWVGYWN0b3J5JztcbmltcG9ydCB7IFBhcmFtIH0gZnJvbSAnLi4vLi4vVXRpbHMvUGFyYW0nO1xuaW1wb3J0IHsgRmlsdGVyU2VydmljZSB9IGZyb20gJy4uL0ZpbHRlclNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vU2VydmljZUltcGxCYXNlJztcblxuZXhwb3J0IGNsYXNzIEZpbHRlclNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgRmlsdGVyU2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLkZpbHRlcjtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseUZpbHRlckFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZXM6IEFycmF5PHN0cmluZz4sXG4gICAgdXBkYXRlVHlwZTogQ29udHJhY3QuRmlsdGVyVXBkYXRlVHlwZSxcbiAgICBmaWx0ZXJPcHRpb25zOiBDb250cmFjdC5GaWx0ZXJPcHRpb25zLFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuQXBwbHlDYXRlZ29yaWNhbEZpbHRlcjtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYXBwbHlGaWx0ZXJBc3luYycsXG4gICAgfTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlZpc3VhbElkXSA9IHZpc3VhbElkO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmllbGROYW1lXSA9IGZpZWxkTmFtZTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWVzKSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsICd2YWx1ZXMgcGFyYW1ldGVyIGZvciBhcHBseUZpbHRlckFzeW5jIG11c3QgYmUgYW4gYXJyYXknKTtcbiAgICB9XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWx0ZXJWYWx1ZXNdID0gdmFsdWVzO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmlsdGVyVXBkYXRlVHlwZV0gPSBFeHRlcm5hbEVudW1Db252ZXJ0ZXIuZmlsdGVyVXBkYXRlVHlwZS5jb252ZXJ0KHVwZGF0ZVR5cGUpO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuSXNFeGNsdWRlTW9kZV0gPVxuICAgICAgZmlsdGVyT3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8IGZpbHRlck9wdGlvbnMuaXNFeGNsdWRlTW9kZSA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiBmaWx0ZXJPcHRpb25zLmlzRXhjbHVkZU1vZGU7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48c3RyaW5nPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybiBmaWVsZE5hbWU7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlSYW5nZUZpbHRlckFzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCwgZmllbGROYW1lOiBzdHJpbmcsIGZpbHRlck9wdGlvbnM6IENvbnRyYWN0LlJhbmdlRmlsdGVyT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5BcHBseVJhbmdlRmlsdGVyO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdhcHBseVJhbmdlRmlsdGVyQXN5bmMnLFxuICAgIH07XG5cbiAgICBpZiAoZmlsdGVyT3B0aW9ucy5taW4gIT09IHVuZGVmaW5lZCAmJiBmaWx0ZXJPcHRpb25zLm1pbiAhPT0gbnVsbCkge1xuICAgICAgbGV0IG1pbjogc3RyaW5nIHwgbnVtYmVyO1xuICAgICAgaWYgKGZpbHRlck9wdGlvbnMubWluIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICBtaW4gPSBQYXJhbS5zZXJpYWxpemVEYXRlRm9yUGxhdGZvcm0oZmlsdGVyT3B0aW9ucy5taW4pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWluID0gZmlsdGVyT3B0aW9ucy5taW47XG4gICAgICB9XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpbHRlclJhbmdlTWluXSA9IG1pbjtcbiAgICB9XG5cbiAgICBpZiAoZmlsdGVyT3B0aW9ucy5tYXggIT09IHVuZGVmaW5lZCAmJiBmaWx0ZXJPcHRpb25zLm1heCAhPT0gbnVsbCkge1xuICAgICAgbGV0IG1heDogc3RyaW5nIHwgbnVtYmVyO1xuICAgICAgaWYgKGZpbHRlck9wdGlvbnMubWF4IGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICBtYXggPSBQYXJhbS5zZXJpYWxpemVEYXRlRm9yUGxhdGZvcm0oZmlsdGVyT3B0aW9ucy5tYXgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWF4ID0gZmlsdGVyT3B0aW9ucy5tYXg7XG4gICAgICB9XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpbHRlclJhbmdlTWF4XSA9IG1heDtcbiAgICB9XG5cbiAgICAvLyBUaGUgbnVsbCBvcHRpb24gaXMgdXNlZCB3aXRoIG1pbittYXggZm9yICdpbmNsdWRlLXJhbmdlJyBvciAnaW5jbHVkZS1yYW5nZS1vci1udWxsJ1xuICAgIGlmIChmaWx0ZXJPcHRpb25zLm51bGxPcHRpb24pIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmlsdGVyUmFuZ2VOdWxsT3B0aW9uXSA9IEV4dGVybmFsRW51bUNvbnZlcnRlci5udWxsT3B0aW9ucy5jb252ZXJ0KGZpbHRlck9wdGlvbnMubnVsbE9wdGlvbik7XG4gICAgfVxuXG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWVsZE5hbWVdID0gZmllbGROYW1lO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuVmlzdWFsSWRdID0gdmlzdWFsSWQ7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48c3RyaW5nPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHRoaXMuYXBpRmlsdGVySGFuZGxlckNoZWNrRm9yQ29tbWFuZEVycm9yKHJlc3BvbnNlLnJlc3VsdCBhcyB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9KTtcbiAgICAgIHJldHVybiBmaWVsZE5hbWU7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlIaWVyYXJjaGljYWxGaWx0ZXJBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgdmFsdWVzOiBBcnJheTxzdHJpbmc+IHwgQ29udHJhY3QuSGllcmFyY2hpY2FsTGV2ZWxzLFxuICAgIHVwZGF0ZVR5cGU6IENvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGUsXG4gICAgZmlsdGVyT3B0aW9uczogQ29udHJhY3QuRmlsdGVyT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkhpZXJhcmNoaWNhbEZpbHRlcjtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYXBwbHlIaWVyYXJjaGljYWxGaWx0ZXJBc3luYycsXG4gICAgfTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlZpc3VhbElkXSA9IHZpc3VhbElkO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmllbGROYW1lXSA9IGZpZWxkTmFtZTtcblxuICAgIGNvbnN0IGhpZXJhcmNoaWNhbExldmVscyA9ICh2YWx1ZXMgYXMgQ29udHJhY3QuSGllcmFyY2hpY2FsTGV2ZWxzKS5sZXZlbHM7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShoaWVyYXJjaGljYWxMZXZlbHMpICYmIGhpZXJhcmNoaWNhbExldmVscy5sZW5ndGggPiAwKSB7XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpbHRlckxldmVsc10gPSBoaWVyYXJjaGljYWxMZXZlbHM7XG4gICAgfSBlbHNlIGlmICgodmFsdWVzIGFzIEFycmF5PFN0cmluZz4pLmxlbmd0aCA+IDApIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmlsdGVyVmFsdWVzXSA9IHZhbHVlcztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdGhlIHNlcnZlciBjb21tYW5kIGV4cGVjdHMgZW1wdHkgbGlzdCBmb3IgY2xlYXJpbmcgdGhlIGZpbHRlclxuICAgICAgLy8gaXQgYWxzbyBleHBlY3RzIGVpdGhlcnMgRmlsdGVyTGV2ZWxzIG9yIEZpbHRlclZhbHVlcyB0byBiZSBzZXRcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmlsdGVyTGV2ZWxzXSA9IFtdO1xuICAgIH1cblxuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmlsdGVyVXBkYXRlVHlwZV0gPSBFeHRlcm5hbEVudW1Db252ZXJ0ZXIuZmlsdGVyVXBkYXRlVHlwZS5jb252ZXJ0KHVwZGF0ZVR5cGUpO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuSXNFeGNsdWRlTW9kZV0gPSBmaWx0ZXJPcHRpb25zICYmICEhZmlsdGVyT3B0aW9ucy5pc0V4Y2x1ZGVNb2RlO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHN0cmluZz4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm4gZmllbGROYW1lO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGNsZWFyRmlsdGVyQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkLCBmaWVsZE5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5DbGVhckZpbHRlcjtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnY2xlYXJGaWx0ZXJBc3luYycsXG4gICAgfTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlZpc3VhbElkXSA9IHZpc3VhbElkO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmllbGROYW1lXSA9IGZpZWxkTmFtZTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48c3RyaW5nPigocmVzcG9zbmUpID0+IHtcbiAgICAgIHJldHVybiBmaWVsZE5hbWU7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlSZWxhdGl2ZURhdGVGaWx0ZXJBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQsIGZpZWxkTmFtZTogc3RyaW5nLCBvcHRpb25zOiBDb250cmFjdC5SZWxhdGl2ZURhdGVGaWx0ZXJPcHRpb25zKSB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5BcHBseVJlbGF0aXZlRGF0ZUZpbHRlcjtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYXBwbHlSZWxhdGl2ZURhdGVGaWx0ZXJBc3luYycsXG4gICAgfTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlZpc3VhbElkXSA9IHZpc3VhbElkO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmllbGROYW1lXSA9IGZpZWxkTmFtZTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlBlcmlvZFR5cGVdID0gRXh0ZXJuYWxFbnVtQ29udmVydGVyLnBlcmlvZFR5cGUuY29udmVydChvcHRpb25zLnBlcmlvZFR5cGUpO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRGF0ZVJhbmdlVHlwZV0gPSBFeHRlcm5hbEVudW1Db252ZXJ0ZXIuZGF0ZVJhbmdlVHlwZS5jb252ZXJ0KG9wdGlvbnMucmFuZ2VUeXBlKTtcbiAgICBpZiAob3B0aW9ucy5yYW5nZVR5cGUgPT09IERhdGVSYW5nZVR5cGUuTGFzdE4gfHwgb3B0aW9ucy5yYW5nZVR5cGUgPT09IERhdGVSYW5nZVR5cGUuTmV4dE4pIHtcbiAgICAgIGlmIChvcHRpb25zLnJhbmdlTiA9PT0gdW5kZWZpbmVkIHx8IG9wdGlvbnMucmFuZ2VOID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoXG4gICAgICAgICAgRW1iZWRkaW5nRXJyb3JDb2Rlcy5NaXNzaW5nUmFuZ2VORm9yUmVsYXRpdmVEYXRlRmlsdGVycyxcbiAgICAgICAgICAnTWlzc2luZyByYW5nZU4gZmllbGQgZm9yIGEgcmVsYXRpdmUgZGF0ZSBmaWx0ZXIgb2YgTEFTVE4gb3IgTkVYVE4uJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuUmFuZ2VOXSA9IG9wdGlvbnMucmFuZ2VOO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmFuY2hvckRhdGUgIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLmFuY2hvckRhdGUgIT09IG51bGwpIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuQW5jaG9yRGF0ZV0gPSB0aGlzLmNvbnZlcnRBbmNob3JEYXRlKG9wdGlvbnMuYW5jaG9yRGF0ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHN0cmluZz4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm4gcmVzcG9uc2UucmVzdWx0IGFzIHN0cmluZztcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRGaWx0ZXJzQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5GaWx0ZXI+PiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5HZXRGaWx0ZXJzO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRGaWx0ZXJzQXN5bmMnLFxuICAgIH07XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5WaXN1YWxJZF0gPSB2aXN1YWxJZDtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48QXJyYXk8Q29udHJhY3QuRmlsdGVyPj4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBmaWx0ZXJzID0gcmVzcG9uc2UucmVzdWx0IGFzIEFycmF5PEludGVybmFsQ29udHJhY3QuRmlsdGVyPjtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnREb21haW5GaWx0ZXJzKGZpbHRlcnMpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldENhdGVnb3JpY2FsRG9tYWluQXN5bmMoXG4gICAgd29ya3NoZWV0TmFtZTogc3RyaW5nLFxuICAgIGZpZWxkSWQ6IHN0cmluZyxcbiAgICBkb21haW5UeXBlOiBGaWx0ZXJEb21haW5UeXBlLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkNhdGVnb3JpY2FsRG9tYWluPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5HZXRDYXRlZ29yaWNhbERvbWFpbjtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0Q2F0ZWdvcmljYWxEb21haW5Bc3luYycsXG4gICAgfTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlZpc3VhbElkXSA9IHtcbiAgICAgIHdvcmtzaGVldDogd29ya3NoZWV0TmFtZSxcbiAgICB9O1xuXG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWVsZElkXSA9IGZpZWxkSWQ7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5Eb21haW5UeXBlXSA9IEV4dGVybmFsRW51bUNvbnZlcnRlci5maWx0ZXJEb21haW5UeXBlLmNvbnZlcnQoZG9tYWluVHlwZSk7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPENvbnRyYWN0LkNhdGVnb3JpY2FsRG9tYWluPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGRvbWFpbiA9IHJlc3BvbnNlLnJlc3VsdCBhcyBJbnRlcm5hbENvbnRyYWN0LkNhdGVnb3JpY2FsRG9tYWluO1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVydENhdGVnb3JpY2FsRG9tYWluKGRvbWFpbiwgZG9tYWluVHlwZSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0UmFuZ2VEb21haW5Bc3luYyh3b3Jrc2hlZXROYW1lOiBzdHJpbmcsIGZpZWxkSWQ6IHN0cmluZywgZG9tYWluVHlwZTogRmlsdGVyRG9tYWluVHlwZSk6IFByb21pc2U8Q29udHJhY3QuUmFuZ2VEb21haW4+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkdldFJhbmdlRG9tYWluO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRSYW5nZURvbWFpbkFzeW5jJyxcbiAgICB9O1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuVmlzdWFsSWRdID0ge1xuICAgICAgd29ya3NoZWV0OiB3b3Jrc2hlZXROYW1lLFxuICAgIH07XG5cbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpZWxkSWRdID0gZmllbGRJZDtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkRvbWFpblR5cGVdID0gRXh0ZXJuYWxFbnVtQ29udmVydGVyLmZpbHRlckRvbWFpblR5cGUuY29udmVydChkb21haW5UeXBlKTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48Q29udHJhY3QuUmFuZ2VEb21haW4+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgZG9tYWluID0gcmVzcG9uc2UucmVzdWx0IGFzIEludGVybmFsQ29udHJhY3QuUmFuZ2VEb21haW47XG5cbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRSYW5nZURvbWFpbihkb21haW4sIGRvbWFpblR5cGUpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldERhc2hib2FyZEZpbHRlcnNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkZpbHRlcj4+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkdldERhc2hib2FyZEZpbHRlcnM7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldERhc2hib2FyZEZpbHRlcnNBc3luYycsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48QXJyYXk8Q29udHJhY3QuRmlsdGVyPj4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBmaWx0ZXJzID0gcmVzcG9uc2UucmVzdWx0IGFzIEFycmF5PEludGVybmFsQ29udHJhY3QuRmlsdGVyPjtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnREb21haW5GaWx0ZXJzKGZpbHRlcnMpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFwcGx5RGFzaGJvYXJkRmlsdGVyQXN5bmMoXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgdmFsdWVzOiBBcnJheTxzdHJpbmc+LFxuICAgIHVwZGF0ZVR5cGU6IENvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGUsXG4gICAgZmlsdGVyT3B0aW9uczogQ29udHJhY3QuRmlsdGVyT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkRhc2hib2FyZENhdGVnb3JpY2FsRmlsdGVyO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdhcHBseURhc2hib2FyZEZpbHRlckFzeW5jJyxcbiAgICB9O1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmllbGROYW1lXSA9IGZpZWxkTmFtZTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpbHRlclZhbHVlc10gPSB2YWx1ZXM7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWx0ZXJVcGRhdGVUeXBlXSA9IEV4dGVybmFsRW51bUNvbnZlcnRlci5maWx0ZXJVcGRhdGVUeXBlLmNvbnZlcnQodXBkYXRlVHlwZSk7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5Jc0V4Y2x1ZGVNb2RlXSA9IGZpbHRlck9wdGlvbnMgJiYgISFmaWx0ZXJPcHRpb25zLmlzRXhjbHVkZU1vZGU7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48c3RyaW5nPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybiByZXNwb25zZS5yZXN1bHQgYXMgc3RyaW5nO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldEFwcGxpZWRXb3Jrc2hlZXRzQXN5bmMod29ya3NoZWV0TmFtZTogc3RyaW5nLCBmaWVsZElkOiBzdHJpbmcpOiBQcm9taXNlPEFycmF5PHN0cmluZz4+IHtcbiAgICBjb25zdCBzaGFyZWRGaWx0ZXJNb2RlbCA9IGF3YWl0IHRoaXMuZXhlY3V0ZUdldEFwcGxpZWRXb3Jrc2hlZXRzKHdvcmtzaGVldE5hbWUsIGZpZWxkSWQsICdnZXRBcHBsaWVkV29ya3NoZWV0c0FzeW5jJyk7XG4gICAgY29uc3Qgd29ya3NoZWV0TmFtZXM6IHN0cmluZ1tdID0gW107XG4gICAgc2hhcmVkRmlsdGVyTW9kZWwud29ya3NoZWV0cz8ubWFwKCh3b3Jrc2hlZXRJbmZvOiBJbnRlcm5hbENvbnRyYWN0LlNoYXJlZEZpbHRlcldvcmtzaGVldE1vZGVsKSA9PiB7XG4gICAgICBpZiAod29ya3NoZWV0SW5mby5pc1NlbGVjdGVkKSB7XG4gICAgICAgIHdvcmtzaGVldE5hbWVzLnB1c2god29ya3NoZWV0SW5mby53b3Jrc2hlZXROYW1lKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gd29ya3NoZWV0TmFtZXM7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc2V0QXBwbGllZFdvcmtzaGVldHNBc3luYyhcbiAgICB3b3Jrc2hlZXROYW1lOiBzdHJpbmcsXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgZmllbGRJZDogc3RyaW5nLFxuICAgIGFwcGx5VG9Xb3Jrc2hlZXRzOiBBcnJheTxzdHJpbmc+LFxuICApOiBQcm9taXNlPEFycmF5PHN0cmluZz4+IHtcbiAgICBjb25zdCBzaGFyZWRGaWx0ZXJNb2RlbCA9IGF3YWl0IHRoaXMuZXhlY3V0ZUdldEFwcGxpZWRXb3Jrc2hlZXRzKHdvcmtzaGVldE5hbWUsIGZpZWxkSWQsICdnZXRBcHBsaWVkV29ya3NoZWV0c0FzeW5jSW50ZXJuYWwnKTtcbiAgICBpZiAoIXNoYXJlZEZpbHRlck1vZGVsIHx8ICFzaGFyZWRGaWx0ZXJNb2RlbC53b3Jrc2hlZXRzKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ1RoaXMgZmlsdGVyIGRvZXMgbm90IGFwcGx5IHRvIG11bHRpcGxlIHdvcmtzaGVldHMnKTtcbiAgICB9XG5cbiAgICBjb25zdCBhbGxvd2VkV29ya3NoZWV0czogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgYWN0aXZlV29ya3NoZWV0ID0gJyc7XG4gICAgc2hhcmVkRmlsdGVyTW9kZWwud29ya3NoZWV0cy5mb3JFYWNoKCh3b3Jrc2hlZXQpID0+IHtcbiAgICAgIC8vIEdldCBhY3RpdmUgd29ya3NoZWV0XG4gICAgICBpZiAod29ya3NoZWV0LmlzQWN0aXZlKSB7XG4gICAgICAgIGFjdGl2ZVdvcmtzaGVldCA9IHdvcmtzaGVldC53b3Jrc2hlZXROYW1lO1xuICAgICAgfVxuXG4gICAgICAvLyBQb3B1bGF0ZSBhbGxvd2VkIHdvcmtzaGVldHNcbiAgICAgIGlmICh3b3Jrc2hlZXQuaXNTZWxlY3RlZCB8fCB3b3Jrc2hlZXQuaXNFbmFibGVkKSB7XG4gICAgICAgIGFsbG93ZWRXb3Jrc2hlZXRzLnB1c2god29ya3NoZWV0LndvcmtzaGVldE5hbWUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKGFjdGl2ZVdvcmtzaGVldCA9PT0gJycpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnTm8gYWN0aXZlIHdvcmtzaGVldCcpO1xuICAgIH1cblxuICAgIGlmICghYXBwbHlUb1dvcmtzaGVldHMuaW5jbHVkZXMoYWN0aXZlV29ya3NoZWV0KSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludGVybmFsRXJyb3IsIGAke2FjdGl2ZVdvcmtzaGVldH0gbXVzdCBiZSBpbmNsdWRlZCBpbiB0aGUgYXBwbGllZCB3b3Jrc2hlZXRzYCk7XG4gICAgfVxuXG4gICAgYXBwbHlUb1dvcmtzaGVldHMuZm9yRWFjaCgoc2hlZXQpID0+IHtcbiAgICAgIC8vIGNoZWNrIGlmIGl0J3MgcHJlc2VudCB3aXRoaW4gY29tcGF0aWJsZSBzaGVldHNcbiAgICAgIGlmICghYWxsb3dlZFdvcmtzaGVldHMuaW5jbHVkZXMoc2hlZXQpKSB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgVGhlIGZpZWxkICR7ZmllbGROYW1lfSBpc24ndCBhcHBsaWNhYmxlIHRvIHRoZSB3b3Jrc2hlZXQgJHtzaGVldH1gKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuQ2hhbmdlU2hhcmVkRmlsdGVyO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge307XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdID0gJ3NldEFwcGxpZWRXb3Jrc2hlZXRzQXN5bmMnO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuVmlzdWFsSWRdID0ge1xuICAgICAgd29ya3NoZWV0OiB3b3Jrc2hlZXROYW1lLFxuICAgIH07XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWVsZElkXSA9IGZpZWxkSWQ7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5TaGFyZWRGaWx0ZXJTaGVldHNdID0gYXBwbHlUb1dvcmtzaGVldHM7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48c3RyaW5nW10+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuIGFwcGx5VG9Xb3Jrc2hlZXRzO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gSGVscGVyIE1ldGhvZHNcblxuICBwcml2YXRlIGV4ZWN1dGVHZXRBcHBsaWVkV29ya3NoZWV0cyhcbiAgICB3b3Jrc2hlZXROYW1lOiBzdHJpbmcsXG4gICAgZmllbGRJZDogc3RyaW5nLFxuICAgIHRlbGVtZXRyeUZ1bmN0aW9uTmFtZTogc3RyaW5nLFxuICApOiBQcm9taXNlPEludGVybmFsQ29udHJhY3QuU2hhcmVkRmlsdGVyTW9kZWw+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkdldFNoYXJlZEZpbHRlcjtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHt9O1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXSA9IHRlbGVtZXRyeUZ1bmN0aW9uTmFtZTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlZpc3VhbElkXSA9IHtcbiAgICAgIHdvcmtzaGVldDogd29ya3NoZWV0TmFtZSxcbiAgICB9O1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmllbGRJZF0gPSBmaWVsZElkO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPEludGVybmFsQ29udHJhY3QuU2hhcmVkRmlsdGVyTW9kZWw+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3Qgc2hhcmVkRmlsdGVyTW9kZWwgPSByZXNwb25zZS5yZXN1bHQgYXMgSW50ZXJuYWxDb250cmFjdC5TaGFyZWRGaWx0ZXJNb2RlbDtcbiAgICAgIHJldHVybiBzaGFyZWRGaWx0ZXJNb2RlbDtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydERvbWFpbkZpbHRlcnMoZG9tYWluRmlsdGVyczogQXJyYXk8SW50ZXJuYWxDb250cmFjdC5GaWx0ZXI+KTogQXJyYXk8Q29udHJhY3QuRmlsdGVyPiB7XG4gICAgY29uc3QgZmlsdGVyczogQXJyYXk8Q29udHJhY3QuRmlsdGVyPiA9IFtdO1xuICAgIGRvbWFpbkZpbHRlcnMuZm9yRWFjaCgoZG9tYWluRmlsdGVyKSA9PiB7XG4gICAgICBzd2l0Y2ggKGRvbWFpbkZpbHRlci5maWx0ZXJUeXBlKSB7XG4gICAgICAgIGNhc2UgRmlsdGVyVHlwZS5DYXRlZ29yaWNhbDoge1xuICAgICAgICAgIGNvbnN0IGZpbHRlciA9IGRvbWFpbkZpbHRlciBhcyBJbnRlcm5hbENvbnRyYWN0LkNhdGVnb3JpY2FsRmlsdGVyO1xuICAgICAgICAgIGlmIChmaWx0ZXIpIHtcbiAgICAgICAgICAgIGZpbHRlcnMucHVzaCh0aGlzLmNvbnZlcnRDYXRlZ29yaWNhbEZpbHRlcihmaWx0ZXIpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIENhdGVnb3JpY2FsIEZpbHRlcicpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgRmlsdGVyVHlwZS5IaWVyYXJjaGljYWw6IHtcbiAgICAgICAgICBjb25zdCBmaWx0ZXIgPSBkb21haW5GaWx0ZXIgYXMgSW50ZXJuYWxDb250cmFjdC5IaWVyYXJjaGljYWxGaWx0ZXI7XG4gICAgICAgICAgaWYgKGZpbHRlcikge1xuICAgICAgICAgICAgZmlsdGVycy5wdXNoKHRoaXMuY29udmVydEhpZXJhcmNoaWNhbEZpbHRlcihmaWx0ZXIpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIEhpZXJhcmNoaWNhbCBGaWx0ZXInKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlIEZpbHRlclR5cGUuUmFuZ2U6IHtcbiAgICAgICAgICBjb25zdCBmaWx0ZXIgPSBkb21haW5GaWx0ZXIgYXMgSW50ZXJuYWxDb250cmFjdC5SYW5nZUZpbHRlcjtcbiAgICAgICAgICBpZiAoZmlsdGVyKSB7XG4gICAgICAgICAgICBmaWx0ZXJzLnB1c2godGhpcy5jb252ZXJ0UmFuZ2VGaWx0ZXIoZmlsdGVyKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBSYW5nZSBGaWx0ZXInKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlIEZpbHRlclR5cGUuUmVsYXRpdmVEYXRlOiB7XG4gICAgICAgICAgY29uc3QgZmlsdGVyID0gZG9tYWluRmlsdGVyIGFzIEludGVybmFsQ29udHJhY3QuUmVsYXRpdmVEYXRlRmlsdGVyO1xuICAgICAgICAgIGlmIChmaWx0ZXIpIHtcbiAgICAgICAgICAgIGZpbHRlcnMucHVzaCh0aGlzLmNvbnZlcnRSZWxhdGl2ZURhdGVGaWx0ZXIoZmlsdGVyKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBSZWxhdGl2ZSBEYXRlIEZpbHRlcicpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBmaWx0ZXJzO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0Q2F0ZWdvcmljYWxGaWx0ZXIoZG9tYWluRmlsdGVyOiBJbnRlcm5hbENvbnRyYWN0LkNhdGVnb3JpY2FsRmlsdGVyKTogQ29udHJhY3QuQ2F0ZWdvcmljYWxGaWx0ZXIge1xuICAgIGNvbnN0IGFwcGxpZWRWYWx1ZXM6IEFycmF5PENvbnRyYWN0LkRhdGFWYWx1ZT4gPSBkb21haW5GaWx0ZXIudmFsdWVzLm1hcCgoZHYpID0+IHtcbiAgICAgIHJldHVybiBEYXRhVmFsdWVGYWN0b3J5Lk1ha2VGaWx0ZXJEYXRhVmFsdWUoZHYpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBDYXRlZ29yaWNhbEZpbHRlcihcbiAgICAgIGRvbWFpbkZpbHRlci52aXN1YWxJZC53b3Jrc2hlZXQsXG4gICAgICBkb21haW5GaWx0ZXIuZmllbGRDYXB0aW9uLFxuICAgICAgZG9tYWluRmlsdGVyLmZpZWxkTmFtZSxcbiAgICAgIEZpbHRlclR5cGUuQ2F0ZWdvcmljYWwsXG4gICAgICB0aGlzLl9yZWdpc3RyeUlkLFxuICAgICAgYXBwbGllZFZhbHVlcyxcbiAgICAgIGRvbWFpbkZpbHRlci5pc0V4Y2x1ZGUsXG4gICAgICBkb21haW5GaWx0ZXIuaXNBbGxTZWxlY3RlZCxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0SGllcmFyY2hpY2FsRmlsdGVyKGRvbWFpbkZpbHRlcjogSW50ZXJuYWxDb250cmFjdC5IaWVyYXJjaGljYWxGaWx0ZXIpOiBDb250cmFjdC5IaWVyYXJjaGljYWxGaWx0ZXIge1xuICAgIGNvbnN0IGFwcGxpZWRWYWx1ZXM6IEFycmF5PENvbnRyYWN0LkhpZXJhcmNoaWNhbEZpbHRlckRhdGFWYWx1ZT4gPSBkb21haW5GaWx0ZXIudmFsdWVzLm1hcCgoaGllcmFyY2hpY2FsRGF0YVZhbHVlKSA9PiB7XG4gICAgICByZXR1cm4gbmV3IEhpZXJhcmNoaWNhbERhdGFWYWx1ZShcbiAgICAgICAgRGF0YVZhbHVlRmFjdG9yeS5NYWtlRmlsdGVyRGF0YVZhbHVlKGhpZXJhcmNoaWNhbERhdGFWYWx1ZS52YWx1ZSksXG4gICAgICAgIGhpZXJhcmNoaWNhbERhdGFWYWx1ZS5oaWVyYXJjaGljYWxQYXRoLFxuICAgICAgICBoaWVyYXJjaGljYWxEYXRhVmFsdWUubGV2ZWwsXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgY29uc3QgbGV2ZWxEZXRhaWxzOiBBcnJheTxDb250cmFjdC5IaWVyYXJjaGljYWxMZXZlbERldGFpbD4gPSBkb21haW5GaWx0ZXIubGV2ZWxJbmZvLm1hcCgoYUxldmVsKSA9PiB7XG4gICAgICByZXR1cm4gbmV3IEhpZXJhcmNoaWNhbExldmVsRGV0YWlsKFxuICAgICAgICBhTGV2ZWwubmFtZSxcbiAgICAgICAgSW50ZXJuYWxFbnVtQ29udmVydGVyLmhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUuY29udmVydChhTGV2ZWwubGV2ZWxTZWxlY3Rpb25TdGF0ZSksXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBIaWVyYXJjaGljYWxGaWx0ZXIoXG4gICAgICBkb21haW5GaWx0ZXIudmlzdWFsSWQud29ya3NoZWV0LFxuICAgICAgZG9tYWluRmlsdGVyLmZpZWxkQ2FwdGlvbixcbiAgICAgIGRvbWFpbkZpbHRlci5maWVsZE5hbWUsXG4gICAgICBGaWx0ZXJUeXBlLkhpZXJhcmNoaWNhbCxcbiAgICAgIHRoaXMuX3JlZ2lzdHJ5SWQsXG4gICAgICBkb21haW5GaWx0ZXIuZGltZW5zaW9uTmFtZSxcbiAgICAgIGRvbWFpbkZpbHRlci5oaWVyYXJjaHlDYXB0aW9uLFxuICAgICAgZG9tYWluRmlsdGVyLmxldmVscyxcbiAgICAgIGxldmVsRGV0YWlscyxcbiAgICAgIGFwcGxpZWRWYWx1ZXMsXG4gICAgICBkb21haW5GaWx0ZXIuaXNBbGxTZWxlY3RlZCxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0UmFuZ2VGaWx0ZXIoZG9tYWluRmlsdGVyOiBJbnRlcm5hbENvbnRyYWN0LlJhbmdlRmlsdGVyKTogQ29udHJhY3QuUmFuZ2VGaWx0ZXIge1xuICAgIGNvbnN0IG1pblZhbHVlOiBEYXRhVmFsdWUgPSBEYXRhVmFsdWVGYWN0b3J5Lk1ha2VGaWx0ZXJEYXRhVmFsdWUoZG9tYWluRmlsdGVyLm1pbik7XG4gICAgY29uc3QgbWF4VmFsdWU6IERhdGFWYWx1ZSA9IERhdGFWYWx1ZUZhY3RvcnkuTWFrZUZpbHRlckRhdGFWYWx1ZShkb21haW5GaWx0ZXIubWF4KTtcbiAgICByZXR1cm4gbmV3IFJhbmdlRmlsdGVyKFxuICAgICAgZG9tYWluRmlsdGVyLnZpc3VhbElkLndvcmtzaGVldCxcbiAgICAgIGRvbWFpbkZpbHRlci5maWVsZENhcHRpb24sXG4gICAgICBkb21haW5GaWx0ZXIuZmllbGROYW1lLFxuICAgICAgRmlsdGVyVHlwZS5SYW5nZSxcbiAgICAgIHRoaXMuX3JlZ2lzdHJ5SWQsXG4gICAgICBtaW5WYWx1ZSxcbiAgICAgIG1heFZhbHVlLFxuICAgICAgZG9tYWluRmlsdGVyLmluY2x1ZGVOdWxsVmFsdWVzLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRSZWxhdGl2ZURhdGVGaWx0ZXIoZG9tYWluRmlsdGVyOiBJbnRlcm5hbENvbnRyYWN0LlJlbGF0aXZlRGF0ZUZpbHRlcik6IENvbnRyYWN0LlJlbGF0aXZlRGF0ZUZpbHRlciB7XG4gICAgY29uc3QgYW5jaG9yRGF0ZVZhbHVlOiBEYXRhVmFsdWUgPSBEYXRhVmFsdWVGYWN0b3J5Lk1ha2VGaWx0ZXJEYXRhVmFsdWUoZG9tYWluRmlsdGVyLmFuY2hvckRhdGUpO1xuICAgIHJldHVybiBuZXcgUmVsYXRpdmVEYXRlRmlsdGVyKFxuICAgICAgZG9tYWluRmlsdGVyLnZpc3VhbElkLndvcmtzaGVldCxcbiAgICAgIGRvbWFpbkZpbHRlci5maWVsZENhcHRpb24sXG4gICAgICBkb21haW5GaWx0ZXIuZmllbGROYW1lLFxuICAgICAgRXh0ZXJuYWxGaWx0ZXJUeXBlLlJlbGF0aXZlRGF0ZSxcbiAgICAgIHRoaXMuX3JlZ2lzdHJ5SWQsXG4gICAgICBhbmNob3JEYXRlVmFsdWUsXG4gICAgICBJbnRlcm5hbEVudW1Db252ZXJ0ZXIuZGF0ZVN0ZXBQZXJpb2QuY29udmVydChkb21haW5GaWx0ZXIucGVyaW9kVHlwZSksXG4gICAgICBJbnRlcm5hbEVudW1Db252ZXJ0ZXIuZGF0ZVJhbmdlVHlwZS5jb252ZXJ0KGRvbWFpbkZpbHRlci5yYW5nZVR5cGUpLFxuICAgICAgZG9tYWluRmlsdGVyLnJhbmdlTixcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0Q2F0ZWdvcmljYWxEb21haW4oZG9tYWluOiBJbnRlcm5hbENvbnRyYWN0LkNhdGVnb3JpY2FsRG9tYWluLCBkb21haW5UeXBlOiBGaWx0ZXJEb21haW5UeXBlKTogQ29udHJhY3QuQ2F0ZWdvcmljYWxEb21haW4ge1xuICAgIGNvbnN0IHZhbHVlczogQXJyYXk8RGF0YVZhbHVlPiA9IGRvbWFpbi52YWx1ZXMubWFwKChkb21haW5EdikgPT4ge1xuICAgICAgcmV0dXJuIERhdGFWYWx1ZUZhY3RvcnkuTWFrZUZpbHRlckRhdGFWYWx1ZShkb21haW5Edik7XG4gICAgfSk7XG4gICAgcmV0dXJuIG5ldyBDYXRlZ29yaWNhbERvbWFpbih2YWx1ZXMsIGRvbWFpblR5cGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0UmFuZ2VEb21haW4oZG9tYWluOiBJbnRlcm5hbENvbnRyYWN0LlJhbmdlRG9tYWluLCBkb21haW5UeXBlOiBGaWx0ZXJEb21haW5UeXBlKTogQ29udHJhY3QuUmFuZ2VEb21haW4ge1xuICAgIGNvbnN0IG1pbjogRGF0YVZhbHVlID0gRGF0YVZhbHVlRmFjdG9yeS5NYWtlRmlsdGVyRGF0YVZhbHVlKGRvbWFpbi5taW4pO1xuICAgIGNvbnN0IG1heDogRGF0YVZhbHVlID0gRGF0YVZhbHVlRmFjdG9yeS5NYWtlRmlsdGVyRGF0YVZhbHVlKGRvbWFpbi5tYXgpO1xuICAgIHJldHVybiBuZXcgUmFuZ2VEb21haW4obWluLCBtYXgsIGRvbWFpblR5cGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0QW5jaG9yRGF0ZShhbmNob3JEYXRlOiBEYXRlKTogc3RyaW5nIHtcbiAgICAvLyBDb252ZXJ0cyBhIERhdGUgb2JqZWN0IGludG8gYSBzdHJpbmcgZm9ybWF0IHRoYXQgdGhlIHNlcnZlciBleHBlY3RzIGZvciBkYXRlL3RpbWUgdmFsdWVzLlxuICAgIC8vIElmIGFuY2hvckRhdGUgZG9lc24ndCByZXByZXNlbnQgYSB2YWxpZCBEYXRlIG9iamVjdCwgYW55IG9mIHRoZXNlIHdvdWxkIGJlIE5hTi5cbiAgICBjb25zdCB5ZWFyID0gYW5jaG9yRGF0ZS5nZXRVVENGdWxsWWVhcigpO1xuICAgIGNvbnN0IG1vbnRoID0gYW5jaG9yRGF0ZS5nZXRVVENNb250aCgpICsgMTtcbiAgICBjb25zdCBkYXkgPSBhbmNob3JEYXRlLmdldFVUQ0RhdGUoKTtcbiAgICBjb25zdCBoaCA9IGFuY2hvckRhdGUuZ2V0VVRDSG91cnMoKTtcbiAgICBjb25zdCBtbSA9IGFuY2hvckRhdGUuZ2V0VVRDTWludXRlcygpO1xuICAgIGNvbnN0IHNlYyA9IGFuY2hvckRhdGUuZ2V0VVRDU2Vjb25kcygpO1xuXG4gICAgaWYgKGlzTmFOKHllYXIpIHx8IGlzTmFOKG1vbnRoKSB8fCBpc05hTihkYXkpIHx8IGlzTmFOKGhoKSB8fCBpc05hTihtbSkgfHwgaXNOYU4oc2VjKSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFbWJlZGRpbmdFcnJvckNvZGVzLkludmFsaWREYXRlUGFyYW1ldGVyLCAnSW52YWxpZCBkYXRlIHBhcmFtZXRlcjogYW5jaG9yRGF0ZScpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGAke3llYXJ9LSR7bW9udGh9LSR7ZGF5fSAke2hofToke21tfToke3NlY31gO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIGFwaUZpbHRlckhhbmRsZXJDaGVja0ZvckNvbW1hbmRFcnJvcihzZXJ2ZXJQbTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSkge1xuICAgIGlmICghc2VydmVyUG1bSW50ZXJuYWxDb250cmFjdC5QYXJhbWV0ZXJJZC5QYXJhbWV0ZXJFcnJvcl0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHNlcnZlclBtW0ludGVybmFsQ29udHJhY3QuUGFyYW1ldGVySWQuSW52YWxpZEZpZWxkQ2FwdGlvbl0pIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkRmlsdGVyRmllbGROYW1lLCBzZXJ2ZXJQbVtJbnRlcm5hbENvbnRyYWN0LlBhcmFtZXRlcklkLkludmFsaWRGaWVsZENhcHRpb25dKTtcbiAgICB9XG4gICAgaWYgKHNlcnZlclBtW0ludGVybmFsQ29udHJhY3QuUGFyYW1ldGVySWQuSW52YWxpZFZhbHVlc10pIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkRmlsdGVyRmllbGRWYWx1ZSwgc2VydmVyUG1bSW50ZXJuYWxDb250cmFjdC5QYXJhbWV0ZXJJZC5JbnZhbGlkVmFsdWVzXSk7XG4gICAgfVxuICAgIGlmIChzZXJ2ZXJQbVtJbnRlcm5hbENvbnRyYWN0LlBhcmFtZXRlcklkLkludmFsaWRBZ2dGaWVsZE5hbWVdKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW52YWxpZEFnZ3JlZ2F0aW9uRmllbGROYW1lLCBzZXJ2ZXJQbVtJbnRlcm5hbENvbnRyYWN0LlBhcmFtZXRlcklkLkludmFsaWRBZ2dGaWVsZE5hbWVdKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLlNlcnZlckVycm9yLCAnU2VydmVyIEVycm9yJyk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFcnJvckNvZGVzLCBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbiB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBBcGlTaG93RGF0YVRhYmxlRm9ybWF0LFxuICBEYXRhVGFibGUgYXMgRGF0YVRhYmxlSW50ZXJuYWxDb250cmFjdCxcbiAgRGF0YVRhYmxlUmVhZGVyIGFzIERhdGFUYWJsZVJlYWRlckludGVybmFsQ29udHJhY3QsXG4gIEV4ZWN1dGVQYXJhbWV0ZXJzLFxuICBIaWdobGlnaHRlZE1hcmtzVGFibGUsXG4gIFBhcmFtZXRlcklkLFxuICBTZWxlY3RlZE1hcmtzVGFibGUsXG4gIFVuZGVybHlpbmdEYXRhVGFibGUsXG4gIFZlcmJJZCxcbiAgVmlzdWFsSWQsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyB2NCBhcyB1dWlkdjQgfSBmcm9tICd1dWlkJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uLy4uLy4uL0FwaVNoYXJlZCc7XG5pbXBvcnQgeyBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MgfSBmcm9tICcuLi8uLi9FbnVtTWFwcGluZ3MvRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzJztcbmltcG9ydCB7IENvbHVtbiwgRGF0YVRhYmxlLCBNYXJrSW5mbyB9IGZyb20gJy4uLy4uL01vZGVscy9HZXREYXRhTW9kZWxzJztcbmltcG9ydCB7IERhdGFUYWJsZVJlYWRlciB9IGZyb20gJy4uLy4uL01vZGVscy9HZXREYXRhVGFibGVSZWFkZXJNb2RlbHMnO1xuaW1wb3J0IHsgRGF0YVZhbHVlRmFjdG9yeSB9IGZyb20gJy4uLy4uL1V0aWxzL0RhdGFWYWx1ZUZhY3RvcnknO1xuaW1wb3J0IHsgR2V0RGF0YVNlcnZpY2UsIEdldERhdGFUeXBlIH0gZnJvbSAnLi4vR2V0RGF0YVNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vU2VydmljZUltcGxCYXNlJztcblxuZXhwb3J0IGNsYXNzIEdldERhdGFTZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIEdldERhdGFTZXJ2aWNlIHtcbiAgLy8gVGhlIGV4dGVuc2lvbi9lbWJlZGRpbmcgaW5zdGFuY2UgdXNlcyB0aGUgc2FtZSBjYWNoZSBmb3IgYWxsIERhdGFUYWJsZVJlYWRlcnMuXG4gIHByaXZhdGUgdmlld0RhdGFUYWJsZUNhY2hlSWQ6IHN0cmluZyA9IHV1aWR2NCgpO1xuXG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLkdldERhdGE7XG4gIH1cblxuICBwdWJsaWMgZ2V0TWF4Um93TGltaXQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gMTAwMDA7XG4gIH1cblxuICBwdWJsaWMgZ2V0Vmlld0RhdGFUYWJsZUNhY2hlSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy52aWV3RGF0YVRhYmxlQ2FjaGVJZDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TGltaXRlZE1heFJvd3MocmVxdWVzdGVkUm93czogbnVtYmVyLCByb3dDb3VudExpbWl0OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiByZXF1ZXN0ZWRSb3dzID4gMCAmJiByZXF1ZXN0ZWRSb3dzIDwgcm93Q291bnRMaW1pdCA/IHJlcXVlc3RlZFJvd3MgOiByb3dDb3VudExpbWl0O1xuICB9XG5cbiAgcHVibGljIGdldFVuZGVybHlpbmdEYXRhQXN5bmMoXG4gICAgdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIGdldFR5cGU6IEdldERhdGFUeXBlLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgaWdub3JlU2VsZWN0aW9uOiBib29sZWFuLFxuICAgIGluY2x1ZGVBbGxDb2x1bW5zOiBib29sZWFuLFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIG1heFJvd3M6IG51bWJlcixcbiAgICBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gICAgYXBwbHlXb3Jrc2hlZXRGb3JtYXR0aW5nOiBib29sZWFuLFxuICApOiBQcm9taXNlPERhdGFUYWJsZT4ge1xuICAgIC8vIENyZWF0ZSBhbGwgb2Ygb3VyIHBhcmFtZXRlcnNcbiAgICBjb25zdCBzdW1tYXJ5RGF0YSA9IGdldFR5cGUgPT09IEdldERhdGFUeXBlLlN1bW1hcnk7XG4gICAgY29uc3QgZnVuY3Rpb25OYW1lID0gc3VtbWFyeURhdGEgPyAnZ2V0U3VtbWFyeURhdGFBc3luYycgOiAnZ2V0VW5kZXJseWluZ0RhdGFBc3luYyc7XG4gICAgY29uc3QgdmVyYiA9IHN1bW1hcnlEYXRhID8gVmVyYklkLkdldERhdGFTdW1tYXJ5RGF0YSA6IFZlcmJJZC5HZXRVbmRlcmx5aW5nRGF0YTtcbiAgICBjb25zdCByZXF1ZXN0TWF4Um93cyA9IHZlcmIgPT09IFZlcmJJZC5HZXRVbmRlcmx5aW5nRGF0YSA/IHRoaXMuZ2V0TGltaXRlZE1heFJvd3MobWF4Um93cywgdGhpcy5nZXRNYXhSb3dMaW1pdCgpICsgMSkgOiBtYXhSb3dzO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06IGZ1bmN0aW9uTmFtZSxcbiAgICB9O1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuVmlzdWFsSWRdID0gdmlzdWFsSWQ7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5JZ25vcmVBbGlhc2VzXSA9IGlnbm9yZUFsaWFzZXM7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5JZ25vcmVTZWxlY3Rpb25dID0gaWdub3JlU2VsZWN0aW9uO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuSW5jbHVkZUFsbENvbHVtbnNdID0gaW5jbHVkZUFsbENvbHVtbnM7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5Db2x1bW5zVG9JbmNsdWRlQnlJZF0gPSB0aGlzLnZlcmlmeUluY2x1ZGVDb2x1bW5BcnJheShjb2x1bW5zVG9JbmNsdWRlQnlJZCk7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5NYXhSb3dzXSA9IHJlcXVlc3RNYXhSb3dzO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuU2hvd0RhdGFUYWJsZUZvcm1hdF0gPSBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3Muc2hvd0RhdGFUYWJsZUZvcm1hdFR5cGUuY29udmVydChpbmNsdWRlRGF0YVZhbHVlc09wdGlvbik7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5BcHBseVdvcmtzaGVldEZvcm1hdHRpbmddID0gYXBwbHlXb3Jrc2hlZXRGb3JtYXR0aW5nO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPERhdGFUYWJsZT4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZURhdGEgPSByZXNwb25zZS5yZXN1bHQgYXMgVW5kZXJseWluZ0RhdGFUYWJsZTtcbiAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NSZXN1bHRzVGFibGUocmVzcG9uc2VEYXRhLmRhdGEsIHJlc3BvbnNlRGF0YS5pc1N1bW1hcnkpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldFN1bW1hcnlEYXRhUmVhZGVyQXN5bmMoXG4gICAgdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIHBhZ2VSb3dDb3VudDogbnVtYmVyLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgaWdub3JlU2VsZWN0aW9uOiBib29sZWFuLFxuICAgIGluY2x1ZGVBbGxDb2x1bW5zOiBib29sZWFuLFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uOiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgICBhcHBseVdvcmtzaGVldEZvcm1hdHRpbmc6IGJvb2xlYW4sXG4gICk6IFByb21pc2U8RGF0YVRhYmxlUmVhZGVyPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldFN1bW1hcnlEYXRhUmVhZGVyQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpZXdEYXRhVGFibGVDYWNoZUlkXTogdGhpcy5nZXRWaWV3RGF0YVRhYmxlQ2FjaGVJZCgpLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQsXG4gICAgICBbUGFyYW1ldGVySWQuUGFnZVJvd0NvdW50XTogcGFnZVJvd0NvdW50LFxuICAgICAgW1BhcmFtZXRlcklkLklnbm9yZUFsaWFzZXNdOiBpZ25vcmVBbGlhc2VzLFxuICAgICAgW1BhcmFtZXRlcklkLklnbm9yZVNlbGVjdGlvbl06IGlnbm9yZVNlbGVjdGlvbixcbiAgICAgIFtQYXJhbWV0ZXJJZC5JbmNsdWRlQWxsQ29sdW1uc106IGluY2x1ZGVBbGxDb2x1bW5zLFxuICAgICAgW1BhcmFtZXRlcklkLkNvbHVtbnNUb0luY2x1ZGVCeUlkXTogdGhpcy52ZXJpZnlJbmNsdWRlQ29sdW1uQXJyYXkoY29sdW1uc1RvSW5jbHVkZUJ5SWQpLFxuICAgICAgW1BhcmFtZXRlcklkLlNob3dEYXRhVGFibGVGb3JtYXRdOiBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3Muc2hvd0RhdGFUYWJsZUZvcm1hdFR5cGUuY29udmVydChpbmNsdWRlRGF0YVZhbHVlc09wdGlvbiksXG4gICAgICBbUGFyYW1ldGVySWQuQXBwbHlXb3Jrc2hlZXRGb3JtYXR0aW5nXTogYXBwbHlXb3Jrc2hlZXRGb3JtYXR0aW5nLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXREYXRhU3VtbWFyeURhdGFSZWFkZXIsIHBhcmFtZXRlcnMpLnRoZW48RGF0YVRhYmxlUmVhZGVyPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9IHJlc3BvbnNlLnJlc3VsdCBhcyBEYXRhVGFibGVSZWFkZXJJbnRlcm5hbENvbnRyYWN0O1xuXG4gICAgICByZXR1cm4gbmV3IERhdGFUYWJsZVJlYWRlcihyZXNwb25zZURhdGEuaWQsIHJlc3BvbnNlRGF0YS50b3RhbFJvd0NvdW50LCBwYWdlUm93Q291bnQsIHRoaXMuX3JlZ2lzdHJ5SWQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldFN1bW1hcnlDb2x1bW5zSW5mb0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuQ29sdW1uPj4ge1xuICAgIC8vIENyZWF0ZSBhbGwgdGhlIHBhcmFtZXRlcnMgZm9yIEdldERhdGFUeXBlIG9mIFN1bW1hcnkgd2l0aCAxIHJvdywgYW5kIG9ubHkgbmF0aXZlIHZhbHVlc1xuICAgIC8vIFRoZW4gcmV0dXJuIGp1c3QgdGhlIGNvbHVtbnNcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkdldERhdGFTdW1tYXJ5RGF0YTtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0U3VtbWFyeUNvbHVtbnNJbmZvQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQsXG4gICAgICBbUGFyYW1ldGVySWQuSWdub3JlQWxpYXNlc106IHRydWUsXG4gICAgICBbUGFyYW1ldGVySWQuSWdub3JlU2VsZWN0aW9uXTogdHJ1ZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5JbmNsdWRlQWxsQ29sdW1uc106IHRydWUsXG4gICAgICBbUGFyYW1ldGVySWQuTWF4Um93c106IDEsXG4gICAgICBbUGFyYW1ldGVySWQuU2hvd0RhdGFUYWJsZUZvcm1hdF06IEFwaVNob3dEYXRhVGFibGVGb3JtYXQuTmF0aXZlVmFsdWVzT25seSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPEFycmF5PENvbnRyYWN0LkNvbHVtbj4+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgdW5kZXJseWluZ0RhdGFUYWJsZSA9IHJlc3BvbnNlLnJlc3VsdCBhcyBVbmRlcmx5aW5nRGF0YVRhYmxlO1xuICAgICAgY29uc3QgZGF0YVRhYmxlID0gdW5kZXJseWluZ0RhdGFUYWJsZS5kYXRhO1xuICAgICAgY29uc3QgY29sdW1ucyA9IGRhdGFUYWJsZS5oZWFkZXJzLm1hcCgoaCkgPT4gbmV3IENvbHVtbihoLmZpZWxkQ2FwdGlvbiwgaC5maWVsZE5hbWUsIGguZGF0YVR5cGUsIGguaXNSZWZlcmVuY2VkLCBoLmluZGV4KSk7XG4gICAgICByZXR1cm4gY29sdW1ucztcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTZWxlY3RlZE1hcmtzQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkKTogUHJvbWlzZTxDb250cmFjdC5NYXJrc0NvbGxlY3Rpb24+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0U2VsZWN0ZWRNYXJrc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0U2VsZWN0ZWRNYXJrcywgcGFyYW1ldGVycykudGhlbjxDb250cmFjdC5NYXJrc0NvbGxlY3Rpb24+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gcmVzcG9uc2UucmVzdWx0IGFzIFNlbGVjdGVkTWFya3NUYWJsZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IHJlc3BvbnNlRGF0YS5kYXRhLm1hcCgodGFibGUpID0+IHRoaXMucHJvY2Vzc1Jlc3VsdHNUYWJsZSh0YWJsZSwgdHJ1ZSkpLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRIaWdobGlnaHRlZE1hcmtzQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkKTogUHJvbWlzZTxDb250cmFjdC5NYXJrc0NvbGxlY3Rpb24+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0SGlnaGxpZ2h0ZWRNYXJrc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0SGlnaGxpZ2h0ZWRNYXJrcywgcGFyYW1ldGVycykudGhlbjxDb250cmFjdC5NYXJrc0NvbGxlY3Rpb24+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gcmVzcG9uc2UucmVzdWx0IGFzIEhpZ2hsaWdodGVkTWFya3NUYWJsZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IHJlc3BvbnNlRGF0YS5kYXRhLm1hcCgodGFibGUpID0+IHRoaXMucHJvY2Vzc1Jlc3VsdHNUYWJsZSh0YWJsZSwgdHJ1ZSkpLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXREYXRhU291cmNlRGF0YUFzeW5jKFxuICAgIGRhdGFTb3VyY2VJZDogc3RyaW5nLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgbWF4Um93czogbnVtYmVyLFxuICAgIGNvbHVtbnNUb0luY2x1ZGU6IEFycmF5PHN0cmluZz4sXG4gICAgY29sdW1uc1RvSW5jbHVkZUJ5SWQ6IEFycmF5PHN0cmluZz4sXG4gICAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb246IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICApOiBQcm9taXNlPERhdGFUYWJsZT4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXREYXRhU291cmNlRGF0YUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EYXRhU291cmNlSWRdOiBkYXRhU291cmNlSWQsXG4gICAgICBbUGFyYW1ldGVySWQuSWdub3JlQWxpYXNlc106IGlnbm9yZUFsaWFzZXMsXG4gICAgICBbUGFyYW1ldGVySWQuTWF4Um93c106IHRoaXMuZ2V0TGltaXRlZE1heFJvd3MobWF4Um93cywgdGhpcy5nZXRNYXhSb3dMaW1pdCgpICsgMSksXG4gICAgICBbUGFyYW1ldGVySWQuQ29sdW1uc1RvSW5jbHVkZV06IHRoaXMudmVyaWZ5SW5jbHVkZUNvbHVtbkFycmF5KGNvbHVtbnNUb0luY2x1ZGUpLFxuICAgICAgW1BhcmFtZXRlcklkLkNvbHVtbnNUb0luY2x1ZGVCeUlkXTogdGhpcy52ZXJpZnlJbmNsdWRlQ29sdW1uQXJyYXkoY29sdW1uc1RvSW5jbHVkZUJ5SWQpLFxuICAgICAgW1BhcmFtZXRlcklkLlNob3dEYXRhVGFibGVGb3JtYXRdOiBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3Muc2hvd0RhdGFUYWJsZUZvcm1hdFR5cGUuY29udmVydChpbmNsdWRlRGF0YVZhbHVlc09wdGlvbiksXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldERhdGFTb3VyY2VEYXRhLCBwYXJhbWV0ZXJzKS50aGVuPERhdGFUYWJsZT4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZURhdGEgPSByZXNwb25zZS5yZXN1bHQgYXMgVW5kZXJseWluZ0RhdGFUYWJsZTtcbiAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NSZXN1bHRzVGFibGUocmVzcG9uc2VEYXRhLmRhdGEsIGZhbHNlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMb2dpY2FsVGFibGVEYXRhQXN5bmMoXG4gICAgZGF0YXNvdXJjZUlkOiBzdHJpbmcsXG4gICAgbG9naWNhbFRhYmxlSWQ6IHN0cmluZyxcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIG1heFJvd3M6IG51bWJlcixcbiAgICBjb2x1bW5zVG9JbmNsdWRlOiBBcnJheTxzdHJpbmc+LFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uOiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgKTogUHJvbWlzZTxEYXRhVGFibGU+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0TG9naWNhbFRhYmxlRGF0YUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Db2x1bW5zVG9JbmNsdWRlXTogY29sdW1uc1RvSW5jbHVkZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Db2x1bW5zVG9JbmNsdWRlQnlJZF06IHRoaXMudmVyaWZ5SW5jbHVkZUNvbHVtbkFycmF5KGNvbHVtbnNUb0luY2x1ZGVCeUlkKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EYXRhU291cmNlSWRdOiBkYXRhc291cmNlSWQsXG4gICAgICBbUGFyYW1ldGVySWQuSWdub3JlQWxpYXNlc106IGlnbm9yZUFsaWFzZXMsXG4gICAgICBbUGFyYW1ldGVySWQuTG9naWNhbFRhYmxlSWRdOiBsb2dpY2FsVGFibGVJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5NYXhSb3dzXTogdGhpcy5nZXRMaW1pdGVkTWF4Um93cyhtYXhSb3dzLCB0aGlzLmdldE1heFJvd0xpbWl0KCkgKyAxKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TaG93RGF0YVRhYmxlRm9ybWF0XTogRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzLnNob3dEYXRhVGFibGVGb3JtYXRUeXBlLmNvbnZlcnQoaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24pLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRMb2dpY2FsVGFibGVEYXRhLCBwYXJhbWV0ZXJzKS50aGVuPERhdGFUYWJsZT4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZURhdGEgPSByZXNwb25zZS5yZXN1bHQgYXMgVW5kZXJseWluZ0RhdGFUYWJsZTtcbiAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NSZXN1bHRzVGFibGUocmVzcG9uc2VEYXRhLmRhdGEsIGZhbHNlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMb2dpY2FsVGFibGVEYXRhUmVhZGVyQXN5bmMoXG4gICAgZGF0YXNvdXJjZUlkOiBzdHJpbmcsXG4gICAgbG9naWNhbFRhYmxlSWQ6IHN0cmluZyxcbiAgICBwYWdlUm93Q291bnQ6IG51bWJlcixcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uOiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgKTogUHJvbWlzZTxEYXRhVGFibGVSZWFkZXI+IHtcbiAgICBwYWdlUm93Q291bnQgPSB0aGlzLmdldExpbWl0ZWRNYXhSb3dzKHBhZ2VSb3dDb3VudCwgdGhpcy5nZXRNYXhSb3dMaW1pdCgpKTtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0TG9naWNhbFRhYmxlRGF0YVJlYWRlckFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaWV3RGF0YVRhYmxlQ2FjaGVJZF06IHRoaXMuZ2V0Vmlld0RhdGFUYWJsZUNhY2hlSWQoKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EYXRhU291cmNlSWRdOiBkYXRhc291cmNlSWQsXG4gICAgICBbUGFyYW1ldGVySWQuTG9naWNhbFRhYmxlSWRdOiBsb2dpY2FsVGFibGVJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5QYWdlUm93Q291bnRdOiBwYWdlUm93Q291bnQsXG4gICAgICBbUGFyYW1ldGVySWQuSWdub3JlQWxpYXNlc106IGlnbm9yZUFsaWFzZXMsXG4gICAgICBbUGFyYW1ldGVySWQuQ29sdW1uc1RvSW5jbHVkZUJ5SWRdOiB0aGlzLnZlcmlmeUluY2x1ZGVDb2x1bW5BcnJheShjb2x1bW5zVG9JbmNsdWRlQnlJZCksXG4gICAgICBbUGFyYW1ldGVySWQuU2hvd0RhdGFUYWJsZUZvcm1hdF06IEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncy5zaG93RGF0YVRhYmxlRm9ybWF0VHlwZS5jb252ZXJ0KGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uKSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0TG9naWNhbFRhYmxlRGF0YVJlYWRlciwgcGFyYW1ldGVycykudGhlbjxEYXRhVGFibGVSZWFkZXI+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gcmVzcG9uc2UucmVzdWx0IGFzIERhdGFUYWJsZVJlYWRlckludGVybmFsQ29udHJhY3Q7XG5cbiAgICAgIHJldHVybiBuZXcgRGF0YVRhYmxlUmVhZGVyKHJlc3BvbnNlRGF0YS5pZCwgcmVzcG9uc2VEYXRhLnRvdGFsUm93Q291bnQsIHBhZ2VSb3dDb3VudCwgdGhpcy5fcmVnaXN0cnlJZCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ1RhYmxlRGF0YUFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBsb2dpY2FsVGFibGVJZDogc3RyaW5nLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgaWdub3JlU2VsZWN0aW9uOiBib29sZWFuLFxuICAgIGluY2x1ZGVBbGxDb2x1bW5zOiBib29sZWFuLFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIG1heFJvd3M6IG51bWJlcixcbiAgICBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gICAgYXBwbHlXb3Jrc2hlZXRGb3JtYXR0aW5nOiBib29sZWFuLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRVbmRlcmx5aW5nVGFibGVEYXRhQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQsXG4gICAgICBbUGFyYW1ldGVySWQuTG9naWNhbFRhYmxlSWRdOiBsb2dpY2FsVGFibGVJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5JZ25vcmVBbGlhc2VzXTogaWdub3JlQWxpYXNlcyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5JZ25vcmVTZWxlY3Rpb25dOiBpZ25vcmVTZWxlY3Rpb24sXG4gICAgICBbUGFyYW1ldGVySWQuSW5jbHVkZUFsbENvbHVtbnNdOiBpbmNsdWRlQWxsQ29sdW1ucyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Db2x1bW5zVG9JbmNsdWRlQnlJZF06IHRoaXMudmVyaWZ5SW5jbHVkZUNvbHVtbkFycmF5KGNvbHVtbnNUb0luY2x1ZGVCeUlkKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5NYXhSb3dzXTogdGhpcy5nZXRMaW1pdGVkTWF4Um93cyhtYXhSb3dzLCB0aGlzLmdldE1heFJvd0xpbWl0KCkgKyAxKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TaG93RGF0YVRhYmxlRm9ybWF0XTogRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzLnNob3dEYXRhVGFibGVGb3JtYXRUeXBlLmNvbnZlcnQoaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24pLFxuICAgICAgW1BhcmFtZXRlcklkLkFwcGx5V29ya3NoZWV0Rm9ybWF0dGluZ106IGFwcGx5V29ya3NoZWV0Rm9ybWF0dGluZyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0VW5kZXJseWluZ1RhYmxlRGF0YSwgcGFyYW1ldGVycykudGhlbjxEYXRhVGFibGU+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gcmVzcG9uc2UucmVzdWx0IGFzIFVuZGVybHlpbmdEYXRhVGFibGU7XG4gICAgICByZXR1cm4gdGhpcy5wcm9jZXNzUmVzdWx0c1RhYmxlKHJlc3BvbnNlRGF0YS5kYXRhLCBmYWxzZSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ1RhYmxlRGF0YVJlYWRlckFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBsb2dpY2FsVGFibGVJZDogc3RyaW5nLFxuICAgIHBhZ2VSb3dDb3VudDogbnVtYmVyLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgaWdub3JlU2VsZWN0aW9uOiBib29sZWFuLFxuICAgIGluY2x1ZGVBbGxDb2x1bW5zOiBib29sZWFuLFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uOiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgICBhcHBseVdvcmtzaGVldEZvcm1hdHRpbmc6IGJvb2xlYW4sXG4gICk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlUmVhZGVyPiB7XG4gICAgcGFnZVJvd0NvdW50ID0gdGhpcy5nZXRMaW1pdGVkTWF4Um93cyhwYWdlUm93Q291bnQsIHRoaXMuZ2V0TWF4Um93TGltaXQoKSk7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldFVuZGVybHlpbmdUYWJsZURhdGFSZWFkZXJBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlld0RhdGFUYWJsZUNhY2hlSWRdOiB0aGlzLmdldFZpZXdEYXRhVGFibGVDYWNoZUlkKCksXG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Mb2dpY2FsVGFibGVJZF06IGxvZ2ljYWxUYWJsZUlkLFxuICAgICAgW1BhcmFtZXRlcklkLklnbm9yZUFsaWFzZXNdOiBpZ25vcmVBbGlhc2VzLFxuICAgICAgW1BhcmFtZXRlcklkLklnbm9yZVNlbGVjdGlvbl06IGlnbm9yZVNlbGVjdGlvbixcbiAgICAgIFtQYXJhbWV0ZXJJZC5JbmNsdWRlQWxsQ29sdW1uc106IGluY2x1ZGVBbGxDb2x1bW5zLFxuICAgICAgW1BhcmFtZXRlcklkLkNvbHVtbnNUb0luY2x1ZGVCeUlkXTogdGhpcy52ZXJpZnlJbmNsdWRlQ29sdW1uQXJyYXkoY29sdW1uc1RvSW5jbHVkZUJ5SWQpLFxuICAgICAgW1BhcmFtZXRlcklkLlNob3dEYXRhVGFibGVGb3JtYXRdOiBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3Muc2hvd0RhdGFUYWJsZUZvcm1hdFR5cGUuY29udmVydChpbmNsdWRlRGF0YVZhbHVlc09wdGlvbiksXG4gICAgICBbUGFyYW1ldGVySWQuUGFnZVJvd0NvdW50XTogcGFnZVJvd0NvdW50LFxuICAgICAgW1BhcmFtZXRlcklkLkFwcGx5V29ya3NoZWV0Rm9ybWF0dGluZ106IGFwcGx5V29ya3NoZWV0Rm9ybWF0dGluZyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0VW5kZXJseWluZ1RhYmxlRGF0YVJlYWRlciwgcGFyYW1ldGVycykudGhlbjxEYXRhVGFibGVSZWFkZXI+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gcmVzcG9uc2UucmVzdWx0IGFzIERhdGFUYWJsZVJlYWRlckludGVybmFsQ29udHJhY3Q7XG5cbiAgICAgIHJldHVybiBuZXcgRGF0YVRhYmxlUmVhZGVyKHJlc3BvbnNlRGF0YS5pZCwgcmVzcG9uc2VEYXRhLnRvdGFsUm93Q291bnQsIHBhZ2VSb3dDb3VudCwgdGhpcy5fcmVnaXN0cnlJZCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBzdW1tYXJ5VGFibGVJZCA9ICcnO1xuXG4gIHB1YmxpYyBnZXRQYWdlQXN5bmModGFibGVJZDogc3RyaW5nLCBwYWdlTnVtYmVyOiBudW1iZXIsIHBhZ2VTaXplOiBudW1iZXIpOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRQYWdlQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpZXdEYXRhVGFibGVDYWNoZUlkXTogdGhpcy5nZXRWaWV3RGF0YVRhYmxlQ2FjaGVJZCgpLFxuICAgICAgW1BhcmFtZXRlcklkLlZpZXdEYXRhVGFibGVJZF06IHRhYmxlSWQsXG4gICAgICBbUGFyYW1ldGVySWQuRGF0YVJvd0luZGV4XTogcGFnZU51bWJlciAqIHBhZ2VTaXplLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXREYXRhVGFibGVSZWFkZXJQYWdlLCBwYXJhbWV0ZXJzKS50aGVuPERhdGFUYWJsZT4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZURhdGEgPSByZXNwb25zZS5yZXN1bHQgYXMgRGF0YVRhYmxlSW50ZXJuYWxDb250cmFjdDtcbiAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NSZXN1bHRzUGFnZShyZXNwb25zZURhdGEsIHRhYmxlSWQgPT09IEdldERhdGFTZXJ2aWNlSW1wbC5zdW1tYXJ5VGFibGVJZCA/IHRydWUgOiBmYWxzZSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgcmVsZWFzZUFzeW5jKHRhYmxlSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdyZWxlYXNlJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaWV3RGF0YVRhYmxlQ2FjaGVJZF06IHRoaXMuZ2V0Vmlld0RhdGFUYWJsZUNhY2hlSWQoKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaWV3RGF0YVRhYmxlSWRdOiB0YWJsZUlkLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5SZWxlYXNlRGF0YVRhYmxlUmVhZGVyLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB2ZXJpZnlJbmNsdWRlQ29sdW1uQXJyYXkoY29sdW1uczogQXJyYXk8c3RyaW5nPik6IEFycmF5PHN0cmluZz4ge1xuICAgIC8vIGNvbHVtbnMgbXVzdCBiZSBhIHZhbGlkIGFycmF5XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbHVtbnMpKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgJ2NvbHVtbnNUb0luY2x1ZGUgYW5kIGNvbHVtbnNUb0luY2x1ZGVCeUlkIG11c3QgYmUgdmFsaWQgYXJyYXlzJyk7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGFueSBkdXBsaWNhdGVzIGZyb20gdGhlIGlucHV0IGFycmF5XG4gICAgY29uc3QgY29sdW1uc0FzU2V0OiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoY29sdW1ucyk7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oY29sdW1uc0FzU2V0KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwcm9jZXNzUmVzdWx0c1RhYmxlKHJlc3BvbnNlRGF0YTogRGF0YVRhYmxlSW50ZXJuYWxDb250cmFjdCwgaXNTdW1tYXJ5OiBib29sZWFuKTogRGF0YVRhYmxlIHtcbiAgICBjb25zdCBoZWFkZXJzID0gcmVzcG9uc2VEYXRhLmhlYWRlcnMubWFwKChoKSA9PiBuZXcgQ29sdW1uKGguZmllbGRDYXB0aW9uLCBoLmZpZWxkTmFtZSwgaC5kYXRhVHlwZSwgaC5pc1JlZmVyZW5jZWQsIGguaW5kZXgpKTtcblxuICAgIC8vIFRPRE8gVGhpcyBzaG91bGQgYmUgY29udHJvbGxlZCBieSBhIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoaXMgYXBpIHdpbGwgcmVzcG9uZCBtYXJrcyBpbmZvIG9yIG5vdFxuICAgIGxldCBtYXJrcztcbiAgICBpZiAocmVzcG9uc2VEYXRhLm1hcmtzKSB7XG4gICAgICBtYXJrcyA9IHJlc3BvbnNlRGF0YS5tYXJrcy5tYXAoKGgpID0+IG5ldyBNYXJrSW5mbyhoLnR5cGUsIGguY29sb3IsIGgudHVwbGVJZCkpO1xuICAgIH1cblxuICAgIC8vIExpbWl0KzEgaXMgb3VyIHNlbnRpbmFsIHRoYXQgdW5kZXJseWluZyBkYXRhIGNvbnRhaW5zIG1vcmUgcm93cyB0aGFuIHVzZXIgaXMgYWxsb3dlZCB0byBmZXRjaC5cbiAgICAvLyBSZW1vdmUgdGhlIGxhc3QgZWxlbWVudCBzbyB3ZSBhbHdheXMgcmV0dXJuIE1heFJvd0xpbWl0XG4gICAgY29uc3QgaXNUb3RhbFJvd0NvdW50TGltaXRlZCA9IGlzU3VtbWFyeSA9PT0gZmFsc2UgJiYgcmVzcG9uc2VEYXRhLmRhdGFUYWJsZS5sZW5ndGggPT09IHRoaXMuZ2V0TWF4Um93TGltaXQoKSArIDE7XG4gICAgaWYgKGlzVG90YWxSb3dDb3VudExpbWl0ZWQpIHtcbiAgICAgIHJlc3BvbnNlRGF0YS5kYXRhVGFibGUubGVuZ3RoIC09IDE7XG4gICAgfVxuXG4gICAgY29uc3QgdGFibGUgPSByZXNwb25zZURhdGEuZGF0YVRhYmxlLm1hcCgocm93KSA9PiB7XG4gICAgICByZXR1cm4gcm93Lm1hcCgoY2VsbCwgaW5kZXgpID0+IHtcbiAgICAgICAgcmV0dXJuIERhdGFWYWx1ZUZhY3RvcnkuTWFrZVRhYmxlRGF0YVZhbHVlKGNlbGwsIGhlYWRlcnNbaW5kZXhdLmRhdGFUeXBlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaWYgKG1hcmtzKSB7XG4gICAgICByZXR1cm4gbmV3IERhdGFUYWJsZSh0YWJsZSwgaGVhZGVycywgdGFibGUubGVuZ3RoLCBpc1RvdGFsUm93Q291bnRMaW1pdGVkLCBpc1N1bW1hcnksIG1hcmtzKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBEYXRhVGFibGUodGFibGUsIGhlYWRlcnMsIHRhYmxlLmxlbmd0aCwgaXNUb3RhbFJvd0NvdW50TGltaXRlZCwgaXNTdW1tYXJ5KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwcm9jZXNzUmVzdWx0c1BhZ2UocmVzcG9uc2VEYXRhOiBEYXRhVGFibGVJbnRlcm5hbENvbnRyYWN0LCBpc1N1bW1hcnk6IGJvb2xlYW4pOiBEYXRhVGFibGUge1xuICAgIGNvbnN0IGhlYWRlcnMgPSByZXNwb25zZURhdGEuaGVhZGVycy5tYXAoKGgpID0+IG5ldyBDb2x1bW4oaC5maWVsZENhcHRpb24sIGguZmllbGROYW1lLCBoLmRhdGFUeXBlLCBoLmlzUmVmZXJlbmNlZCwgaC5pbmRleCkpO1xuXG4gICAgbGV0IG1hcmtzO1xuICAgIGlmIChyZXNwb25zZURhdGEubWFya3MpIHtcbiAgICAgIG1hcmtzID0gcmVzcG9uc2VEYXRhLm1hcmtzLm1hcCgoaCkgPT4gbmV3IE1hcmtJbmZvKGgudHlwZSwgaC5jb2xvciwgaC50dXBsZUlkKSk7XG4gICAgfVxuXG4gICAgY29uc3QgdGFibGUgPSByZXNwb25zZURhdGEuZGF0YVRhYmxlLm1hcCgocm93KSA9PiB7XG4gICAgICByZXR1cm4gcm93Lm1hcCgoY2VsbCwgaW5kZXgpID0+IHtcbiAgICAgICAgcmV0dXJuIERhdGFWYWx1ZUZhY3RvcnkuTWFrZVRhYmxlRGF0YVZhbHVlKGNlbGwsIGhlYWRlcnNbaW5kZXhdLmRhdGFUeXBlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaWYgKG1hcmtzKSB7XG4gICAgICByZXR1cm4gbmV3IERhdGFUYWJsZSh0YWJsZSwgaGVhZGVycywgdGFibGUubGVuZ3RoLCBmYWxzZSwgaXNTdW1tYXJ5LCBtYXJrcyk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRGF0YVRhYmxlKHRhYmxlLCBoZWFkZXJzLCB0YWJsZS5sZW5ndGgsIGZhbHNlLCBpc1N1bW1hcnkpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBOb3RpZmljYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vTm90aWZpY2F0aW9uU2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgTm90aWZpY2F0aW9uU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9Ob3RpZmljYXRpb25TZXJ2aWNlSW1wbEJhc2UnO1xuXG5leHBvcnQgY2xhc3MgTm90aWZpY2F0aW9uU2VydmljZUltcGwgZXh0ZW5kcyBOb3RpZmljYXRpb25TZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBOb3RpZmljYXRpb25TZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTZXJ2aWNlTmFtZXMuTm90aWZpY2F0aW9uO1xuICB9XG59XG4iLCJpbXBvcnQgeyBJbnRlcm5hbEFwaURpc3BhdGNoZXIsIE1vZGVsLCBOb3RpZmljYXRpb24sIE5vdGlmaWNhdGlvbklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFVucmVnaXN0ZXJGbiB9IGZyb20gJy4uL05vdGlmaWNhdGlvblNlcnZpY2UnO1xuXG5leHBvcnQgY2xhc3MgUmVnaXN0cmF0aW9uIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2ZpbHRlckZuOiAobm90aWZpY2F0aW9uTW9kZWw6IE1vZGVsKSA9PiBib29sZWFuLCBwcml2YXRlIF9jYWxsYmFja0ZuOiAobm90aWZpY2F0aW9uTW9kZWw6IE1vZGVsKSA9PiB2b2lkKSB7XG4gICAgLy8gTm90aGluZyBIZXJlXG4gIH1cblxuICBwdWJsaWMgb25Ob3RpZmljYXRpb24obm90aWZpY2F0aW9uTW9kZWw6IE1vZGVsKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2ZpbHRlckZuKG5vdGlmaWNhdGlvbk1vZGVsKSkge1xuICAgICAgdGhpcy5fY2FsbGJhY2tGbihub3RpZmljYXRpb25Nb2RlbCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOb3RpZmljYXRpb25TZXJ2aWNlSW1wbEJhc2Uge1xuICBwcml2YXRlIF9oYW5kbGVyczogeyBbbm90aWZpY2F0aW9uSWQ6IHN0cmluZ106IEFycmF5PFJlZ2lzdHJhdGlvbj4gfTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBkaXNwYXRjaGVyOiBJbnRlcm5hbEFwaURpc3BhdGNoZXIpIHtcbiAgICB0aGlzLl9oYW5kbGVycyA9IHt9O1xuICAgIHRoaXMuZGlzcGF0Y2hlci5yZWdpc3Rlck5vdGlmaWNhdGlvbkhhbmRsZXIodGhpcy5vbk5vdGlmaWNhdGlvbi5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3RlckhhbmRsZXIoaWQ6IE5vdGlmaWNhdGlvbklkLCBmaWx0ZXJGbjogKG1vZGVsOiBNb2RlbCkgPT4gYm9vbGVhbiwgaGFuZGxlcjogKG1vZGVsOiBNb2RlbCkgPT4gdm9pZCk6IFVucmVnaXN0ZXJGbiB7XG4gICAgY29uc3QgaGFuZGxlcnMgPSB0aGlzLl9oYW5kbGVyc1tpZF0gfHwgbmV3IEFycmF5PFJlZ2lzdHJhdGlvbj4oKTtcbiAgICBjb25zdCByZWdpc3RyYXRpb24gPSBuZXcgUmVnaXN0cmF0aW9uKGZpbHRlckZuLCBoYW5kbGVyKTtcbiAgICBoYW5kbGVycy5wdXNoKHJlZ2lzdHJhdGlvbik7XG4gICAgdGhpcy5faGFuZGxlcnNbaWRdID0gaGFuZGxlcnM7XG4gICAgcmV0dXJuICgpID0+IHRoaXMucmVtb3ZlUmVnaXN0cmF0aW9uKGlkLCByZWdpc3RyYXRpb24pO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNIYW5kbGVyc0Zvck5vdGlmaWNhdGlvblR5cGUoaWQ6IE5vdGlmaWNhdGlvbklkKTogYm9vbGVhbiB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgIHJldHVybiB0aGlzLl9oYW5kbGVycy5oYXNPd25Qcm9wZXJ0eShpZCk7XG4gIH1cblxuICBwcml2YXRlIG9uTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmhhc0hhbmRsZXJzRm9yTm90aWZpY2F0aW9uVHlwZShub3RpZmljYXRpb24ubm90aWZpY2F0aW9uSWQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gR28gdGhyb3VnaCBhbmQgY2hlY2sgZm9yIGFsbCB0aGUgaGFuZGxlcnMgb2YgdGhpcyBwYXJ0aWN1bGFyIG5vdGlmaWNhdGlvblxuICAgIHRoaXMuX2hhbmRsZXJzW25vdGlmaWNhdGlvbi5ub3RpZmljYXRpb25JZF0uZm9yRWFjaCgoaCkgPT4gaC5vbk5vdGlmaWNhdGlvbihub3RpZmljYXRpb24uZGF0YSkpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVSZWdpc3RyYXRpb24oaWQ6IE5vdGlmaWNhdGlvbklkLCByZWdpc3RyYXRpb246IFJlZ2lzdHJhdGlvbik6IHZvaWQge1xuICAgIGlmICghdGhpcy5oYXNIYW5kbGVyc0Zvck5vdGlmaWNhdGlvblR5cGUoaWQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5faGFuZGxlcnNbaWRdID0gdGhpcy5faGFuZGxlcnNbaWRdLmZpbHRlcigocmVnKSA9PiByZWcgIT09IHJlZ2lzdHJhdGlvbik7XG4gIH1cbn1cbiIsImltcG9ydCB7IEVycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXhlY3V0ZVBhcmFtZXRlcnMsIE1vZGVsLCBQYXJhbWV0ZXJJZCwgUGFyYW1ldGVySW5mbywgU2hlZXRQYXRoLCBWZXJiSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgUGFyYW1ldGVySW1wbCB9IGZyb20gJy4uLy4uL0ltcGwvUGFyYW1ldGVySW1wbCc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi8uLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgUGFyYW1ldGVyc1NlcnZpY2UgfSBmcm9tICcuLi9QYXJhbWV0ZXJzU2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuXG5leHBvcnQgY2xhc3MgUGFyYW1ldGVyc1NlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgUGFyYW1ldGVyc1NlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5QYXJhbWV0ZXJzO1xuICB9XG5cbiAgcHVibGljIGdldFBhcmFtZXRlcnNGb3JTaGVldEFzeW5jKHNoZWV0UGF0aDogU2hlZXRQYXRoKTogUHJvbWlzZTxBcnJheTxQYXJhbWV0ZXJJbXBsPj4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldFBhcmFtZXRlcnNGb3JTaGVldEFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TaGVldFBhdGhdOiBzaGVldFBhdGgsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcnNBc3luYyhwYXJhbWV0ZXJzKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBbGxQYXJhbWV0ZXJzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxQYXJhbWV0ZXJJbXBsPj4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldFBhcmFtZXRlcnNGb3JTaGVldEFzeW5jJyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyc0FzeW5jKHBhcmFtZXRlcnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQYXJhbWV0ZXJzQXN5bmMoaW5wdXRQYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyk6IFByb21pc2U8QXJyYXk8UGFyYW1ldGVySW1wbD4+IHtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRQYXJhbWV0ZXJzRm9yU2hlZXQsIGlucHV0UGFyYW1ldGVycykudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBBcnJheTxQYXJhbWV0ZXJJbmZvPjtcbiAgICAgIHJldHVybiByZXN1bHQubWFwKChwYXJhbWV0ZXJJbmZvKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgUGFyYW1ldGVySW1wbChwYXJhbWV0ZXJJbmZvLCB0aGlzLl9yZWdpc3RyeUlkKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGNoYW5nZVBhcmFtZXRlclZhbHVlQXN5bmMoZmllbGROYW1lOiBzdHJpbmcsIG5ld1ZhbHVlOiBzdHJpbmcpOiBQcm9taXNlPFBhcmFtZXRlckluZm8+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdjaGFuZ2VQYXJhbWV0ZXJWYWx1ZUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5QYXJhbWV0ZXJGaWVsZE5hbWVdOiBmaWVsZE5hbWUsXG4gICAgICBbUGFyYW1ldGVySWQuUGFyYW1ldGVyVmFsdWVdOiBuZXdWYWx1ZSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuQ2hhbmdlUGFyYW1ldGVyVmFsdWUsIHBhcmFtZXRlcnMpLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQgYXMgUGFyYW1ldGVySW5mbztcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZmluZFBhcmFtZXRlckJ5TmFtZUFzeW5jKG5hbWU6IHN0cmluZyk6IFByb21pc2U8UGFyYW1ldGVySW1wbCB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiB0aGlzLmZpbmRQYXJhbWV0ZXJBc3luYyhuYW1lLCB1bmRlZmluZWQpO1xuICB9XG5cbiAgcHVibGljIGZpbmRQYXJhbWV0ZXJCeUdsb2JhbEZpZWxkTmFtZUFzeW5jKGZpZWxkTmFtZTogc3RyaW5nKTogUHJvbWlzZTxQYXJhbWV0ZXJJbXBsIHwgdW5kZWZpbmVkPiB7XG4gICAgcmV0dXJuIHRoaXMuZmluZFBhcmFtZXRlckFzeW5jKHVuZGVmaW5lZCwgZmllbGROYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZFBhcmFtZXRlckFzeW5jKG5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCwgZmllbGROYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBQcm9taXNlPFBhcmFtZXRlckltcGwgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZmluZFBhcmFtZXRlckFzeW5jJyxcbiAgICB9O1xuICAgIGlmIChuYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuUGFyYW1ldGVyQ2FwdGlvbl0gPSBuYW1lO1xuICAgIH0gZWxzZSBpZiAoZmllbGROYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuUGFyYW1ldGVyRmllbGROYW1lXSA9IGZpZWxkTmFtZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsICduYW1lIG9yIGZpZWxkTmFtZSBtdXN0IGJlIHByb3ZpZGVkIHRvIGZpbmQgcGFyYW1ldGVyJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuRmluZFBhcmFtZXRlciwgcGFyYW1ldGVycykudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGluc3RhbmNlT2ZQYXJhbWV0ZXJJbmZvID0gKG9iamVjdDogTW9kZWwpOiBvYmplY3QgaXMgUGFyYW1ldGVySW5mbyA9PiB7XG4gICAgICAgIHJldHVybiAnZmllbGROYW1lJyBpbiBvYmplY3Q7XG4gICAgICB9O1xuXG4gICAgICAvLyBXZSBuZWVkIHRvIGNoZWNrIHRvIHNlZSBpZiB3ZSBnb3QgYSB2YWxpZCByZXNwb25zZSBiYWNrIGFnYWluXG4gICAgICBpZiAoaW5zdGFuY2VPZlBhcmFtZXRlckluZm8ocmVzcG9uc2UucmVzdWx0KSkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQ7XG4gICAgICAgIHJldHVybiBuZXcgUGFyYW1ldGVySW1wbChyZXN1bHQsIHRoaXMuX3JlZ2lzdHJ5SWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIEV4ZWN1dGVQYXJhbWV0ZXJzLFxuICBQYXJhbWV0ZXJJZCxcbiAgUXVhbnRpdGF0aXZlSW5jbHVkZWRWYWx1ZXMsXG4gIFNlbGVjdGlvblVwZGF0ZVR5cGUgYXMgU2VsZWN0aW9uVXBkYXRlVHlwZUludGVybmFsLFxuICBWZXJiSWQsXG4gIFZpc3VhbElkLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgRGltZW5zaW9uU2VsZWN0aW9uTW9kZWwsXG4gIEhpZXJhcmNoaWNhbFNlbGVjdGlvbk1vZGVsLFxuICBIb3ZlclR1cGxlSW50ZXJhY3Rpb25Nb2RlbCxcbiAgUmFuZ2VTZWxlY3Rpb25Nb2RlbCxcbiAgU2VsZWN0VHVwbGVzSW50ZXJhY3Rpb25Nb2RlbCxcbiAgU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyLFxuICBUdXBsZVNlbGVjdGlvbk1vZGVsLFxuICBWYWx1ZVNlbGVjdGlvbk1vZGVsLFxufSBmcm9tICcuLi8uLi9Nb2RlbHMvU2VsZWN0aW9uTW9kZWxzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uLy4uL1RhYmxlYXVFcnJvcic7XG5pbXBvcnQgeyBQYXJhbSB9IGZyb20gJy4uLy4uL1V0aWxzL1BhcmFtJztcbmltcG9ydCB7IFNlbGVjdGlvblNlcnZpY2UgfSBmcm9tICcuLi9TZWxlY3Rpb25TZXJ2aWNlJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBTZWxlY3Rpb25TZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIFNlbGVjdGlvblNlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5TZWxlY3Rpb247XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIGNsZWFyIGFsbCB0aGUgc2VsZWN0ZWQgbWFya3MgZm9yIHRoZSBnaXZlbiB3b3Jrc2hlZXQuXG4gICAqXG4gICAqIEBwYXJhbSB2aXN1YWxJZFxuICAgKi9cbiAgcHVibGljIGNsZWFyU2VsZWN0ZWRNYXJrc0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdjbGVhclNlbGVjdGVkTWFya3NBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkNsZWFyU2VsZWN0ZWRNYXJrcywgcGFyYW1ldGVycykudGhlbjx2b2lkPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybjsgLy8gRXhwZWN0aW5nIGFuIGVtcHR5IG1vZGVsIGFuZCBoZW5jZSB0aGUgdm9pZCByZXNwb25zZS5cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gc2VsZWN0IG1hcmtzIGZvciB0aGUgZ2l2ZW4gd29ya3NoZWV0LlxuICAgKlxuICAgKiBAcGFyYW0gdmlzdWFsSWRcbiAgICogQHBhcmFtIHNlbGVjdGlvbkNyaXRlcmlhXG4gICAqIEBwYXJhbSBzZWxlY3Rpb25VcGRhdGVUeXBlXG4gICAqL1xuICBwdWJsaWMgc2VsZWN0TWFya3NCeVZhbHVlQXN5bmMoXG4gICAgdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIHNlbGVjdGlvbkNyaXRlcmlhczogQXJyYXk8Q29udHJhY3QuU2VsZWN0aW9uQ3JpdGVyaWE+LFxuICAgIHNlbGVjdGlvblVwZGF0ZVR5cGU6IENvbnRyYWN0LlNlbGVjdGlvblVwZGF0ZVR5cGUsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChzZWxlY3Rpb25Dcml0ZXJpYXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgJ1NlbGVjdGlvbiBjcml0ZXJpYSBtaXNzaW5nIGZvciBzZWxlY3RpbmcgbWFya3MgYnkgdmFsdWUnKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3Rpb25UeXBlOiBzdHJpbmcgPSB0aGlzLnZhbGlkYXRlU2VsZWN0aW9uVXBkYXRlVHlwZShzZWxlY3Rpb25VcGRhdGVUeXBlKTtcbiAgICBjb25zdCBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lcjogU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyID0gdGhpcy5wYXJzZVNlbGVjdGlvbk1hcmtzKHNlbGVjdGlvbkNyaXRlcmlhcyk7XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnc2VsZWN0TWFya3NCeVZhbHVlQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQsXG4gICAgICBbUGFyYW1ldGVySWQuU2VsZWN0aW9uVXBkYXRlVHlwZV06IHNlbGVjdGlvblR5cGUsXG4gICAgfTtcblxuICAgIGlmIChzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5oaWVyTW9kZWxBcnIgJiYgc2VsZWN0aW9uTW9kZWxDb250YWluZXIuaGllck1vZGVsQXJyLmxlbmd0aCkge1xuICAgICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5IaWVyVmFsU2VsZWN0aW9uTW9kZWxzXSA9IHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLmhpZXJNb2RlbEFycjtcbiAgICB9XG4gICAgaWYgKHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLnF1YW50TW9kZWxBcnIgJiYgc2VsZWN0aW9uTW9kZWxDb250YWluZXIucXVhbnRNb2RlbEFyci5sZW5ndGgpIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuUXVhbnRSYW5nZVNlbGVjdGlvbk1vZGVsc10gPSBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5xdWFudE1vZGVsQXJyO1xuICAgIH1cbiAgICBpZiAoc2VsZWN0aW9uTW9kZWxDb250YWluZXIuZGltTW9kZWxBcnIgJiYgc2VsZWN0aW9uTW9kZWxDb250YWluZXIuZGltTW9kZWxBcnIubGVuZ3RoKSB7XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkRpbVZhbFNlbGVjdGlvbk1vZGVsc10gPSBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5kaW1Nb2RlbEFycjtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5TZWxlY3RCeVZhbHVlLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgdGhpcy5hcGlGaWx0ZXJIYW5kbGVyQ2hlY2tGb3JDb21tYW5kRXJyb3IocmVzcG9uc2UucmVzdWx0IGFzIHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byBleGVjdXRlIGhvdmVyIGFjdGlvbnMgYW5kIHJlbmRlciB0b29sdGlwIGZvciBhIGdpdmVuIHR1cGxlIHJlcHJlc2VudGluZyBhIG1hcmsgaW4gdGhlIHZpc3VhbGl6YXRpb24uXG4gICAqIElmIHRoZSB0b29sdGlwIHBhcmFtZXRlciBpcyBpbmNsdWRlZCBpdCB3aWxsIHNob3cgdGhlIHRvb2x0aXAgb24gaG92ZXIuIElmIG5vdCwgbm8gdG9vbHRpcCBpcyBzaG93bi5cbiAgICpcbiAgICogQHBhcmFtIHZpc3VhbElkXG4gICAqIEBwYXJhbSBob3ZlcmVkVHVwbGVcbiAgICogQHBhcmFtIHRvb2x0aXBcbiAgICogQHJldHVybnMgZW1wdHkgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGV4dGVuc2lvbiBob3N0IGhhcyBzdWNjZXNzZnVsbHkgYmVlbiBpbmZvcm1lZCBvZiB0aGUgcmVxdWVzdCBhbmQgcmVqZWN0cyBvbiBlcnJvclxuICAgKi9cbiAgcHVibGljIGhvdmVyVHVwbGVBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgaG92ZXJlZFR1cGxlPzogbnVtYmVyLFxuICAgIHRvb2x0aXA/OiBDb250cmFjdC5Ub29sdGlwQ29udGV4dCB8IG51bGwsXG4gICAgYWxsb3dIb3ZlckFjdGlvbnM/OiBib29sZWFuLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgaW50ZXJhY3Rpb25Nb2RlbCA9IG5ldyBIb3ZlclR1cGxlSW50ZXJhY3Rpb25Nb2RlbChcbiAgICAgIHZpc3VhbElkLFxuICAgICAgdGhpcy5lbnN1cmVUdXBsZUlESXNOb25OZWdhdGl2ZShob3ZlcmVkVHVwbGUpLFxuICAgICAgdG9vbHRpcCxcbiAgICAgIGFsbG93SG92ZXJBY3Rpb25zLFxuICAgICk7XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnaG92ZXJUdXBsZUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Ib3ZlclR1cGxlSW50ZXJhY3Rpb25dOiBpbnRlcmFjdGlvbk1vZGVsLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5SYWlzZUhvdmVyVHVwbGVOb3RpZmljYXRpb24sIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIG1vZGlmeSBzZWxlY3Rpb24sIGV4ZWN1dGUgc2VsZWN0IGFjdGlvbnMgYW5kIHJlbmRlciB0b29sdGlwIGZvciBhIGdpdmVuIGxpc3Qgb2YgdHVwbGVzIHJlcHJlc2VudGluZyBhIG1hcmsgb3IgbWFya3MgaW4gdGhlIHZpc3VhbGl6YXRpb24uXG4gICAqIElmIHRoZSB0b29sdGlwIHBhcmFtZXRlciBpcyBpbmNsdWRlZCBpdCB3aWxsIHNob3cgdGhlIHRvb2x0aXAgb24gc2VsZWN0LiBJZiBub3QsIG5vIHRvb2x0aXAgaXMgc2hvd24uXG4gICAqXG4gICAqIEBwYXJhbSB2aXN1YWxJZFxuICAgKiBAcGFyYW0gc2VsZWN0ZWRUdXBsZXNcbiAgICogQHBhcmFtIHNlbGVjdE9wdGlvblxuICAgKiBAcGFyYW0gdG9vbHRpcFxuICAgKiBAcmV0dXJucyBlbXB0eSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZXh0ZW5zaW9uIGhvc3QgaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIGluZm9ybWVkIG9mIHRoZSByZXF1ZXN0IGFuZCByZWplY3RzIG9uIGVycm9yXG4gICAqL1xuICBwdWJsaWMgc2VsZWN0VHVwbGVzQXN5bmMoXG4gICAgdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIHNlbGVjdGVkVHVwbGVzOiBBcnJheTxudW1iZXI+LFxuICAgIHNlbGVjdE9wdGlvbjogQ29udHJhY3QuU2VsZWN0T3B0aW9ucyxcbiAgICB0b29sdGlwPzogQ29udHJhY3QuVG9vbHRpcENvbnRleHQsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBpbnRlcmFjdGlvbk1vZGVsID0gbmV3IFNlbGVjdFR1cGxlc0ludGVyYWN0aW9uTW9kZWwodmlzdWFsSWQsIHNlbGVjdGVkVHVwbGVzLCBzZWxlY3RPcHRpb24sIHRvb2x0aXApO1xuXG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3NlbGVjdFR1cGxlc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TZWxlY3RUdXBsZXNJbnRlcmFjdGlvbl06IGludGVyYWN0aW9uTW9kZWwsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlJhaXNlU2VsZWN0VHVwbGVzTm90aWZpY2F0aW9uLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhcGlGaWx0ZXJIYW5kbGVyQ2hlY2tGb3JDb21tYW5kRXJyb3Ioc2VydmVyUG06IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0pIHtcbiAgICBpZiAoIXNlcnZlclBtW1BhcmFtZXRlcklkLlBhcmFtZXRlckVycm9yXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoc2VydmVyUG1bUGFyYW1ldGVySWQuSW52YWxpZEZpZWxkc10pIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkU2VsZWN0aW9uRmllbGROYW1lLCBzZXJ2ZXJQbVtQYXJhbWV0ZXJJZC5JbnZhbGlkRmllbGRzXSk7XG4gICAgfVxuICAgIGlmIChzZXJ2ZXJQbVtQYXJhbWV0ZXJJZC5JbnZhbGlkVmFsdWVzXSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5TaGFyZWRFcnJvckNvZGVzLkludmFsaWRTZWxlY3Rpb25WYWx1ZSwgc2VydmVyUG1bUGFyYW1ldGVySWQuSW52YWxpZFZhbHVlc10pO1xuICAgIH1cbiAgICBpZiAoc2VydmVyUG1bUGFyYW1ldGVySWQuSW52YWxpZERhdGVzXSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5TaGFyZWRFcnJvckNvZGVzLkludmFsaWRTZWxlY3Rpb25EYXRlLCBzZXJ2ZXJQbVtQYXJhbWV0ZXJJZC5JbnZhbGlkRGF0ZXNdKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIHNlbGVjdCBtYXJrcyBmb3IgdGhlIGdpdmVuIHdvcmtzaGVldC5cbiAgICpcbiAgICogQHBhcmFtIHZpc3VhbElkXG4gICAqIEBwYXJhbSBNYXJrSW5mb1xuICAgKiBAcGFyYW0gc2VsZWN0aW9uVXBkYXRlVHlwZVxuICAgKi9cbiAgcHVibGljIHNlbGVjdE1hcmtzQnlJZEFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBtYXJrczogQXJyYXk8Q29udHJhY3QuTWFya0luZm8+LFxuICAgIHNlbGVjdGlvblVwZGF0ZVR5cGU6IENvbnRyYWN0LlNlbGVjdGlvblVwZGF0ZVR5cGUsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChtYXJrcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLCAnTWFya3MgaW5mbyBtaXNzaW5nIGZvciBzZWxlY3RpbmcgbWFya3MgYnkgSWQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3Rpb25UeXBlOiBzdHJpbmcgPSB0aGlzLnZhbGlkYXRlU2VsZWN0aW9uVXBkYXRlVHlwZShzZWxlY3Rpb25VcGRhdGVUeXBlKTtcbiAgICBjb25zdCBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lcjogU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyID0gdGhpcy5wYXJzZVNlbGVjdGlvbklkcyhtYXJrcyk7XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnc2VsZWN0TWFya3NCeUlkQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQsXG4gICAgICBbUGFyYW1ldGVySWQuU2VsZWN0aW9uVXBkYXRlVHlwZV06IHNlbGVjdGlvblR5cGUsXG4gICAgICBbUGFyYW1ldGVySWQuU2VsZWN0aW9uXTogc2VsZWN0aW9uTW9kZWxDb250YWluZXIuc2VsZWN0aW9uLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuU2VsZWN0QnlWYWx1ZSwgcGFyYW1ldGVycykudGhlbjx2b2lkPigocmVzcG9uc2UpID0+IHtcbiAgICAgIC8vIEV4cGVjdGluZyBhbiBlbXB0eSBtb2RlbCBhbmQgaGVuY2UgdGhlIHZvaWQgcmVzcG9uc2UuXG4gICAgICByZXR1cm47XG4gICAgICAvLyBUT0RPIEludmVzdGlnYXRlIHRoZSBlcnJvciByZXNwb25zZSB3aXRoIG11bHRpcGxlIG91dHB1dCBwYXJhbXMgYW5kIHRocm93IGVycm9yIGFjY29yZGluZ2x5LlxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byBwcmVwYXJlIHRoZSBwcmVzIG1vZGVscyBmb3Igc2VsZWN0aW9uIGJ5IE1hcmtzSW5mb1xuICAgKiBAcGFyYW0gbWFya3NcbiAgICovXG4gIHByaXZhdGUgcGFyc2VTZWxlY3Rpb25JZHMobWFya3M6IEFycmF5PENvbnRyYWN0Lk1hcmtJbmZvPik6IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lciB7XG4gICAgY29uc3QgaWRzOiBBcnJheTxzdHJpbmc+ID0gW107XG4gICAgY29uc3Qgc2VsZWN0aW9uTW9kZWxDb250YWluZXI6IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lciA9IG5ldyBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1hcmtzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCB0dXBsZUlkOiBudW1iZXIgfCB1bmRlZmluZWQgPSBtYXJrc1tpXS50dXBsZUlkO1xuICAgICAgaWYgKHR1cGxlSWQgIT09IHVuZGVmaW5lZCAmJiB0dXBsZUlkICE9PSBudWxsKSB7XG4gICAgICAgIC8vIElmIHR1cGxlIGlkIGlzIHByb3ZpZGVkIHVzZSB0aGF0IGluc3RlYWQgb2YgcGFpclxuICAgICAgICBpZHMucHVzaCh0dXBsZUlkLnRvU3RyaW5nKCkpOyAvLyBjb2xsZWN0IHRoZSB0dXBsZSBpZHNcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAndHVwbGVJZCBwYXJzaW5nIGVycm9yJyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpZHMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAvLyB0dXBsZSBpZHMgYmFzZWQgc2VsZWN0aW9uXG4gICAgICBjb25zdCB0dXBsZVNlbGVjdGlvbk1vZGVsOiBUdXBsZVNlbGVjdGlvbk1vZGVsID0gbmV3IFR1cGxlU2VsZWN0aW9uTW9kZWwoKTtcbiAgICAgIHR1cGxlU2VsZWN0aW9uTW9kZWwuc2VsZWN0aW9uVHlwZSA9ICd0dXBsZXMnO1xuICAgICAgdHVwbGVTZWxlY3Rpb25Nb2RlbC5vYmplY3RJZHMgPSBpZHM7XG4gICAgICBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5zZWxlY3Rpb24gPSB0dXBsZVNlbGVjdGlvbk1vZGVsO1xuICAgIH1cbiAgICByZXR1cm4gc2VsZWN0aW9uTW9kZWxDb250YWluZXI7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIHByZXBhcmUgdGhlIHByZXMgbW9kZWxzIGZvciBzZWxlY3Rpb24gYnkgdmFsdWVzLlxuICAgKlxuICAgKiBTdXBwb3J0cyAzIHR5cGVzIGZvciBzZWxlY3Rpb246XG4gICAqIDEpIEhpZXJhcmNoaWNhbCB2YWx1ZSBiYXNlZCBzZWxlY3Rpb25cbiAgICogMikgUmFuZ2UgdmFsdWUgYmFzZWQgc2VsZWN0aW9uXG4gICAqIDMpIERpbWVuc2lvbiB2YWx1ZSBiYXNlZCBzZWxlY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIG1hcmtzXG4gICAqL1xuICBwcml2YXRlIHBhcnNlU2VsZWN0aW9uTWFya3Moc2VsZWN0aW9uQ3JpdGVyaWFzOiBBcnJheTxDb250cmFjdC5TZWxlY3Rpb25Dcml0ZXJpYT4pOiBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIge1xuICAgIGNvbnN0IHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyOiBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIgPSBuZXcgU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyKCk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlbGVjdGlvbkNyaXRlcmlhcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgc3QgPSBzZWxlY3Rpb25Dcml0ZXJpYXNbaV07XG4gICAgICBpZiAoIShzdC5maWVsZE5hbWUgJiYgc3QudmFsdWUgIT09IHVuZGVmaW5lZCAmJiBzdC52YWx1ZSAhPT0gbnVsbCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FcnJvckNvZGVzLkludGVybmFsRXJyb3IsICdTZWxlY3Rpb24gQ3JpdGVyaWEgcGFyc2luZyBlcnJvcicpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjYXRSZWdleCA9IG5ldyBSZWdFeHAoJyhbW0EtWmEtejAtOV0rXSkuKicsICdnJyk7XG4gICAgICBjb25zdCByYW5nZU9wdGlvbiA9IHN0LnZhbHVlIGFzIENvbnRyYWN0LlJhbmdlVmFsdWU7XG4gICAgICBpZiAoY2F0UmVnZXgudGVzdChzdC5maWVsZE5hbWUpKSB7XG4gICAgICAgIC8vIEhpZXJhcmNoaWNhbCB2YWx1ZSBzZWxlY3Rpb25cbiAgICAgICAgY29uc3QgaGllck1vZGVsOiBIaWVyYXJjaGljYWxTZWxlY3Rpb25Nb2RlbCA9IHRoaXMuYWRkVG9QYXJhbXNMaXN0KHN0LmZpZWxkTmFtZSwgc3QudmFsdWUpIGFzIEhpZXJhcmNoaWNhbFNlbGVjdGlvbk1vZGVsO1xuICAgICAgICBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5oaWVyTW9kZWxBcnIucHVzaChoaWVyTW9kZWwpO1xuICAgICAgfSBlbHNlIGlmIChyYW5nZU9wdGlvbi5taW4gIT09IHVuZGVmaW5lZCAmJiByYW5nZU9wdGlvbi5tYXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBSYW5nZSB2YWx1ZSBzZWxlY3Rpb25cbiAgICAgICAgY29uc3QgcXVhbnRNb2RlbDogUmFuZ2VTZWxlY3Rpb25Nb2RlbCA9IHRoaXMuYWRkVG9SYW5nZVBhcmFtc0xpc3Qoc3QuZmllbGROYW1lLCByYW5nZU9wdGlvbik7XG4gICAgICAgIHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLnF1YW50TW9kZWxBcnIucHVzaChxdWFudE1vZGVsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIERpbWVuc2lvbiB2YWx1ZSBzZWxlY3Rpb25cbiAgICAgICAgY29uc3QgZGltTW9kZWw6IERpbWVuc2lvblNlbGVjdGlvbk1vZGVsID0gdGhpcy5hZGRUb1BhcmFtc0xpc3Qoc3QuZmllbGROYW1lLCBzdC52YWx1ZSkgYXMgRGltZW5zaW9uU2VsZWN0aW9uTW9kZWw7XG4gICAgICAgIHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLmRpbU1vZGVsQXJyLnB1c2goZGltTW9kZWwpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gdHJhbnNmb3JtIHRoZSBrZXkgdmFsdWUgcGFpciBpbnRvIHZhbHVlIGJhc2VkIHByZXMgbW9kZWwgb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWVTZWxlY3Rpb25Nb2RlbFxuICAgKiBAcGFyYW0gZmllbGROYW1lXG4gICAqIEBwYXJhbSB2YWx1ZVxuICAgKi9cbiAgcHJpdmF0ZSBhZGRUb1BhcmFtc0xpc3QoZmllbGROYW1lOiBzdHJpbmcsIHZhbHVlOiBDb250cmFjdC5DYXRlZ29yaWNhbFZhbHVlIHwgQ29udHJhY3QuUmFuZ2VWYWx1ZSk6IFZhbHVlU2VsZWN0aW9uTW9kZWwge1xuICAgIGNvbnN0IHZhbHVlU2VsZWN0aW9uTW9kZWw6IFZhbHVlU2VsZWN0aW9uTW9kZWwgPSBuZXcgVmFsdWVTZWxlY3Rpb25Nb2RlbCgpO1xuICAgIGNvbnN0IG1hcmtWYWx1ZXM6IEFycmF5PHN0cmluZz4gPSBbXTtcblxuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICBjb25zdCB2YWx1ZUFycjogQXJyYXk8c3RyaW5nPiA9IHZhbHVlO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZUFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICBtYXJrVmFsdWVzLnB1c2goUGFyYW0uc2VyaWFsaXplUGFyYW1ldGVyVmFsdWUodmFsdWVBcnJbaV0pKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbWFya1ZhbHVlcy5wdXNoKFBhcmFtLnNlcmlhbGl6ZVBhcmFtZXRlclZhbHVlKHZhbHVlKSk7XG4gICAgfVxuXG4gICAgdmFsdWVTZWxlY3Rpb25Nb2RlbC5xdWFsaWZpZWRGaWVsZENhcHRpb24gPSBmaWVsZE5hbWU7XG4gICAgdmFsdWVTZWxlY3Rpb25Nb2RlbC5zZWxlY3RWYWx1ZXMgPSBtYXJrVmFsdWVzO1xuICAgIHJldHVybiB2YWx1ZVNlbGVjdGlvbk1vZGVsO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byB0cmFuc2Zvcm0gdGhlIGtleSB2YWx1ZSBwYWlyIGludG8gcmFuZ2UgYmFzZWQgc2VsZWN0aW9uIHByZXMgbW9kZWwuXG4gICAqXG4gICAqIFRPRE86IE5lZWQgdG8gaGFuZGxlIHRoZSBwYXJzaW5nIG9mIGRhdGUgdHlwZSB2YWx1ZXMuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZVNlbGVjdGlvbk1vZGVsXG4gICAqIEBwYXJhbSBmaWVsZE5hbWVcbiAgICogQHBhcmFtIHZhbHVlXG4gICAqL1xuICBwcml2YXRlIGFkZFRvUmFuZ2VQYXJhbXNMaXN0KGZpZWxkTmFtZTogc3RyaW5nLCB2YWx1ZTogQ29udHJhY3QuUmFuZ2VWYWx1ZSk6IFJhbmdlU2VsZWN0aW9uTW9kZWwge1xuICAgIGNvbnN0IHJhbmdlU2VsZWN0aW9uTW9kZWw6IFJhbmdlU2VsZWN0aW9uTW9kZWwgPSBuZXcgUmFuZ2VTZWxlY3Rpb25Nb2RlbCgpO1xuICAgIHJhbmdlU2VsZWN0aW9uTW9kZWwucXVhbGlmaWVkRmllbGRDYXB0aW9uID0gZmllbGROYW1lO1xuICAgIGlmICh2YWx1ZS5tYXggIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS5tYXggIT09IG51bGwpIHtcbiAgICAgIHJhbmdlU2VsZWN0aW9uTW9kZWwubWF4VmFsdWUgPSBQYXJhbS5zZXJpYWxpemVQYXJhbWV0ZXJWYWx1ZSh2YWx1ZS5tYXgpO1xuICAgIH1cbiAgICBpZiAodmFsdWUubWluICE9PSB1bmRlZmluZWQgJiYgdmFsdWUubWluICE9PSBudWxsKSB7XG4gICAgICByYW5nZVNlbGVjdGlvbk1vZGVsLm1pblZhbHVlID0gUGFyYW0uc2VyaWFsaXplUGFyYW1ldGVyVmFsdWUodmFsdWUubWluKTtcbiAgICB9XG4gICAgcmFuZ2VTZWxlY3Rpb25Nb2RlbC5pbmNsdWRlZCA9IHRoaXMudmFsaWRhdGVOdWxsT3B0aW9uVHlwZSh2YWx1ZS5udWxsT3B0aW9uKTtcbiAgICByZXR1cm4gcmFuZ2VTZWxlY3Rpb25Nb2RlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gdmFsaWRhdGUgdGhlIHNlbGVjdGlvbiB1cGRhdGUgdHlwZS5cbiAgICpcbiAgICogQHBhcmFtIHNlbGVjdGlvblVwZGF0ZVR5cGVcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVTZWxlY3Rpb25VcGRhdGVUeXBlKHNlbGVjdGlvblVwZGF0ZVR5cGU6IENvbnRyYWN0LlNlbGVjdGlvblVwZGF0ZVR5cGUpOiBzdHJpbmcge1xuICAgIGlmIChzZWxlY3Rpb25VcGRhdGVUeXBlID09PSBDb250cmFjdC5TZWxlY3Rpb25VcGRhdGVUeXBlLlJlcGxhY2UpIHtcbiAgICAgIHJldHVybiBTZWxlY3Rpb25VcGRhdGVUeXBlSW50ZXJuYWwuUmVwbGFjZTtcbiAgICB9IGVsc2UgaWYgKHNlbGVjdGlvblVwZGF0ZVR5cGUgPT09IENvbnRyYWN0LlNlbGVjdGlvblVwZGF0ZVR5cGUuQWRkKSB7XG4gICAgICByZXR1cm4gU2VsZWN0aW9uVXBkYXRlVHlwZUludGVybmFsLkFkZDtcbiAgICB9IGVsc2UgaWYgKHNlbGVjdGlvblVwZGF0ZVR5cGUgPT09IENvbnRyYWN0LlNlbGVjdGlvblVwZGF0ZVR5cGUuUmVtb3ZlKSB7XG4gICAgICByZXR1cm4gU2VsZWN0aW9uVXBkYXRlVHlwZUludGVybmFsLlJlbW92ZTtcbiAgICB9XG4gICAgcmV0dXJuIFNlbGVjdGlvblVwZGF0ZVR5cGVJbnRlcm5hbC5SZXBsYWNlO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byB2YWxpZGF0ZSB0aGUgaW5jbHVkZSB0eXBlIGZvciByYW5nZSBzZWxlY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSBudWxsT3B0aW9uXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlTnVsbE9wdGlvblR5cGUobnVsbE9wdGlvbjogQ29udHJhY3QuRmlsdGVyTnVsbE9wdGlvbiB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gICAgaWYgKG51bGxPcHRpb24pIHtcbiAgICAgIGlmIChudWxsT3B0aW9uID09PSBDb250cmFjdC5GaWx0ZXJOdWxsT3B0aW9uLk51bGxWYWx1ZXMpIHtcbiAgICAgICAgcmV0dXJuIFF1YW50aXRhdGl2ZUluY2x1ZGVkVmFsdWVzLkluY2x1ZGVOdWxsO1xuICAgICAgfSBlbHNlIGlmIChudWxsT3B0aW9uID09PSBDb250cmFjdC5GaWx0ZXJOdWxsT3B0aW9uLk5vbk51bGxWYWx1ZXMpIHtcbiAgICAgICAgcmV0dXJuIFF1YW50aXRhdGl2ZUluY2x1ZGVkVmFsdWVzLkluY2x1ZGVOb25OdWxsO1xuICAgICAgfSBlbHNlIGlmIChudWxsT3B0aW9uID09PSBDb250cmFjdC5GaWx0ZXJOdWxsT3B0aW9uLkFsbFZhbHVlcykge1xuICAgICAgICByZXR1cm4gUXVhbnRpdGF0aXZlSW5jbHVkZWRWYWx1ZXMuSW5jbHVkZUFsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gUXVhbnRpdGF0aXZlSW5jbHVkZWRWYWx1ZXMuSW5jbHVkZUFsbDtcbiAgfVxuXG4gIHByaXZhdGUgZW5zdXJlVHVwbGVJRElzTm9uTmVnYXRpdmUodHVwbGVJZD86IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKHR1cGxlSWQgJiYgdHVwbGVJZCA+IDApIHtcbiAgICAgIHJldHVybiB0dXBsZUlkO1xuICAgIH1cblxuICAgIC8vIDAgd2lsbCBub3QgcmVmZXIgdG8gYSB2YWxpZCB0dXBsZSAoc2luY2UgdHVwbGUgaWRzIGFyZSAxLWJhc2VkKSxcbiAgICAvLyBidXQgY2FuIGJlIHVzZWQgZm9yIGNsZWFyaW5nIHRoZSBjdXJyZW50IGhvdmVyIG9yIHNlbGVjdGlvblxuICAgIHJldHVybiAwO1xuICB9XG59XG4iLCJpbXBvcnQgeyBFcnJvckNvZGVzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBFeGVjdXRlUmVzcG9uc2UsIEludGVybmFsQXBpRGlzcGF0Y2hlciwgSW50ZXJuYWxUYWJsZWF1RXJyb3IsIFZlcmJJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MgfSBmcm9tICcuLi8uLi9FbnVtTWFwcGluZ3MvSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uLy4uL1RhYmxlYXVFcnJvcic7XG5pbXBvcnQgeyBTaG91bGRUaHJvdyB9IGZyb20gJy4uLy4uL1V0aWxzL0VudW1Db252ZXJ0ZXInO1xuXG4vKipcbiAqIEVhY2ggU2VydmNlSW1wbCBzaG91bGQgZXh0ZW5kIHRoaXMgYmFzZSBjbGFzcyBmb3IgdGhlIHNha2Ugb2ZcbiAqIHByb3BlciBlcnJvciBoYW5kbGluZy4gIFRoaXMgYmFzZSBoYW5kbGVzIHRoZSBjb252ZXJzaW9uXG4gKiBmcm9tIGludGVybmFsIGVycm9ycyB0byBleHRlcm5hbCBlcnJvcnMgdGhhdCB3ZSB0aHJvdyB0byBkZXZlbG9wZXJzXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXJ2aWNlSW1wbEJhc2Uge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfZGlzcGF0Y2hlcjogSW50ZXJuYWxBcGlEaXNwYXRjaGVyLCBwcm90ZWN0ZWQgX3JlZ2lzdHJ5SWQ6IG51bWJlcikge31cblxuICBwcm90ZWN0ZWQgZXhlY3V0ZSh2ZXJiOiBWZXJiSWQsIHBhcmFtczogRXhlY3V0ZVBhcmFtZXRlcnMpOiBQcm9taXNlPEV4ZWN1dGVSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLl9kaXNwYXRjaGVyLmV4ZWN1dGUodmVyYiwgcGFyYW1zKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgIC8vIEFueSBpbnRlcm5hbCBlcnJvciB0aGF0IGNvbWVzIGZyb20gdGhlIGRpc3BhdGNoZXIgc2hvdWxkIGJlIGNvbnZlcnRlZFxuICAgICAgLy8gdG8gYW4gZXh0ZXJuYWwgZXJyb3IgdXNpbmcgdGhlIGVudW0gbWFwcGVyIGZvciBlcnJvciBjb2Rlcy5cbiAgICAgIGNvbnN0IGludGVybmFsRXJyb3IgPSBlcnJvciBhcyBJbnRlcm5hbFRhYmxlYXVFcnJvcjtcbiAgICAgIGNvbnN0IGV4dGVybmFsRXJyb3JDb2RlOiBFcnJvckNvZGVzID0gSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzLmVycm9yQ29kZS5jb252ZXJ0KGludGVybmFsRXJyb3IuZXJyb3JDb2RlLCBTaG91bGRUaHJvdy5Obyk7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKGV4dGVybmFsRXJyb3JDb2RlLCBpbnRlcm5hbEVycm9yLm1lc3NhZ2UpO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBTaGVldFNpemUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXhlY3V0ZVBhcmFtZXRlcnMsIFBhcmFtZXRlcklkLCBWZXJiSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFNpemVTZXJ2aWNlIH0gZnJvbSAnLi4vU2l6ZVNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuXG5leHBvcnQgY2xhc3MgU2l6ZVNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgU2l6ZVNlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5TaXplO1xuICB9XG5cbiAgY2hhbmdlU2l6ZUFzeW5jKG5hbWU6IHN0cmluZywgbmV3U2l6ZTogU2hlZXRTaXplKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2NoYW5nZVNpemVBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuU2hlZXROYW1lXTogbmFtZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5NaW5IZWlnaHRdOiBuZXdTaXplLm1pblNpemU/LmhlaWdodCB8fCAwLFxuICAgICAgW1BhcmFtZXRlcklkLk1pbldpZHRoXTogbmV3U2l6ZS5taW5TaXplPy53aWR0aCB8fCAwLFxuICAgICAgW1BhcmFtZXRlcklkLk1heEhlaWdodF06IG5ld1NpemUubWF4U2l6ZT8uaGVpZ2h0IHx8IDAsXG4gICAgICBbUGFyYW1ldGVySWQuTWF4V2lkdGhdOiBuZXdTaXplLm1heFNpemU/LndpZHRoIHx8IDAsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlNldFNoZWV0U2l6ZSwgcGFyYW1ldGVycykudGhlbjx2b2lkPigoX3Jlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBQYXJhbWV0ZXJJZCwgU3RvcnlQb2ludE1vZGVsLCBWZXJiSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFN0b3J5QWN0aXZhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9TdG9yeUFjdGl2YXRpb25TZXJ2aWNlJztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vU2VydmljZUltcGxCYXNlJztcblxuZXhwb3J0IGNsYXNzIFN0b3J5QWN0aXZhdGlvblNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgU3RvcnlBY3RpdmF0aW9uU2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLlN0b3J5QWN0aXZhdGlvbjtcbiAgfVxuXG4gIGFjdGl2YXRlTmV4dFN0b3J5UG9pbnRBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkFjdGl2YXRlTmV4dFN0b3J5UG9pbnQ7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2FjdGl2YXRlTmV4dFN0b3J5UG9pbnRBc3luYycsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjx2b2lkPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIGFjdGl2YXRlUHJldmlvdXNTdG9yeVBvaW50QXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5BY3RpdmF0ZVByZXZpb3VzU3RvcnlQb2ludDtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYWN0aXZhdGVQcmV2aW91c1N0b3J5UG9pbnRBc3luYycsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjx2b2lkPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIGFjdGl2YXRlU3RvcnlQb2ludEFzeW5jKGluZGV4OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkFjdGl2YXRlU3RvcnlQb2ludDtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYWN0aXZhdGVTdG9yeVBvaW50QXN5bmMnLFxuICAgIH07XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5TdG9yeVBvaW50SW5kZXhdID0gaW5kZXg7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cblxuICByZXZlcnRTdG9yeVBvaW50QXN5bmMoaW5kZXg6IG51bWJlcik6IFByb21pc2U8U3RvcnlQb2ludE1vZGVsPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5SZXZlcnRTdG9yeVBvaW50O1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdyZXZlcnRTdG9yeVBvaW50QXN5bmMnLFxuICAgIH07XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5TdG9yeVBvaW50SW5kZXhdID0gaW5kZXg7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48U3RvcnlQb2ludE1vZGVsPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybiByZXNwb25zZS5yZXN1bHQgYXMgU3RvcnlQb2ludE1vZGVsO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXhlY3V0ZVBhcmFtZXRlcnMsIFBhcmFtZXRlcklkLCBWZXJiSWQsIFZpc3VhbElkLCBWaXN1YWxTcGVjaWZpY2F0aW9uIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBWaXN1YWxNb2RlbFNlcnZpY2UgfSBmcm9tICcuLi9WaXN1YWxNb2RlbFNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuXG5leHBvcnQgY2xhc3MgVmlzdWFsTW9kZWxTZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIFZpc3VhbE1vZGVsU2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLlZpc3VhbE1vZGVsO1xuICB9XG5cbiAgcHVibGljIGdldFZpc3VhbFNwZWNpZmljYXRpb25Bc3luYyh2aXN1YWxJZDogVmlzdWFsSWQpOiBQcm9taXNlPENvbnRyYWN0LlZpc3VhbFNwZWNpZmljYXRpb24+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0VmlzdWFsU3BlY2lmaWNhdGlvbkFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Xb3Jrc2hlZXROYW1lXTogdmlzdWFsSWQud29ya3NoZWV0LFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRWaXN1YWxTcGVjaWZpY2F0aW9uLCBwYXJhbWV0ZXJzKS50aGVuPENvbnRyYWN0LlZpc3VhbFNwZWNpZmljYXRpb24+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0IGFzIFZpc3VhbFNwZWNpZmljYXRpb247XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFkZE1hcmtzQ2FyZEZpZWxkc0FzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBtYXJrc0NhcmRJbmRleDogbnVtYmVyLFxuICAgIGVuY29kaW5nVHlwZTogQ29udHJhY3QuRW5jb2RpbmdUeXBlLFxuICAgIGNvbHVtbnM6IEFycmF5PENvbnRyYWN0LkNvbHVtbj4sXG4gICAgc3RhcnRJbmRleDogbnVtYmVyLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYWRkTWFya3NDYXJkRmllbGRzQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLldvcmtzaGVldE5hbWVdOiB2aXN1YWxJZC53b3Jrc2hlZXQsXG4gICAgICBbUGFyYW1ldGVySWQuTWFya3NDYXJkSW5kZXhdOiBtYXJrc0NhcmRJbmRleCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5FbmNvZGluZ1R5cGVdOiBlbmNvZGluZ1R5cGUsXG4gICAgICBbUGFyYW1ldGVySWQuQ29sdW1uc106IGNvbHVtbnMsXG4gICAgICBbUGFyYW1ldGVySWQuU3RhcnRJbmRleF06IHN0YXJ0SW5kZXgsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5BZGRNYXJrc0NhcmRGaWVsZHMsIHBhcmFtZXRlcnMpLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG1vdmVNYXJrc0NhcmRGaWVsZEFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBtYXJrc0NhcmRJbmRleDogbnVtYmVyLFxuICAgIGZyb21JbmRleDogbnVtYmVyLFxuICAgIHRvSW5kZXg6IG51bWJlcixcbiAgICBmaWVsZENvdW50ID0gMSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2FkZE1hcmtzQ2FyZEZpZWxkc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Xb3Jrc2hlZXROYW1lXTogdmlzdWFsSWQud29ya3NoZWV0LFxuICAgICAgW1BhcmFtZXRlcklkLk1hcmtzQ2FyZEluZGV4XTogbWFya3NDYXJkSW5kZXgsXG4gICAgICBbUGFyYW1ldGVySWQuRnJvbUluZGV4XTogZnJvbUluZGV4LFxuICAgICAgW1BhcmFtZXRlcklkLlRvSW5kZXhdOiB0b0luZGV4LFxuICAgICAgW1BhcmFtZXRlcklkLkZpZWxkQ291bnRdOiBmaWVsZENvdW50LFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuTW92ZU1hcmtzQ2FyZEZpZWxkLCBwYXJhbWV0ZXJzKS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzcGxpY2VNYXJrc0NhcmRGaWVsZHNBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgbWFya3NDYXJkSW5kZXg6IG51bWJlcixcbiAgICBlbmNvZGluZ1R5cGU6IENvbnRyYWN0LkVuY29kaW5nVHlwZSxcbiAgICBzdGFydEluZGV4OiBudW1iZXIsXG4gICAgZGVsZXRlQ291bnQ6IG51bWJlcixcbiAgICBjb2x1bW5zOiBBcnJheTxDb250cmFjdC5Db2x1bW4+LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnc3BsaWNlTWFya3NDYXJkRmllbGRzQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLldvcmtzaGVldE5hbWVdOiB2aXN1YWxJZC53b3Jrc2hlZXQsXG4gICAgICBbUGFyYW1ldGVySWQuTWFya3NDYXJkSW5kZXhdOiBtYXJrc0NhcmRJbmRleCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5FbmNvZGluZ1R5cGVdOiBlbmNvZGluZ1R5cGUsXG4gICAgICBbUGFyYW1ldGVySWQuU3RhcnRJbmRleF06IHN0YXJ0SW5kZXgsXG4gICAgICBbUGFyYW1ldGVySWQuRGVsZXRlQ291bnRdOiBkZWxldGVDb3VudCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Db2x1bW5zXTogY29sdW1ucyxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlNwbGljZU1hcmtzQ2FyZEZpZWxkcywgcGFyYW1ldGVycykudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cblxuICBlZGl0QWxpYXNlc0RpYWxvZ0FzeW5jKGZpZWxkTmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2VkaXRBbGlhc2VzRGlhbG9nQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkZpZWxkSWRdOiBmaWVsZE5hbWUsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5FZGl0QWxpYXNlc0RpYWxvZywgcGFyYW1ldGVycykudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEN1c3RvbVZpZXdNb2RlbCwgRXhlY3V0ZVBhcmFtZXRlcnMsIFBhcmFtZXRlcklkLCBWZXJiSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQ3VzdG9tVmlld0ltcGwgfSBmcm9tICcuLi8uLi9JbXBsL0N1c3RvbVZpZXdJbXBsJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBWaXpTZXJ2aWNlIH0gZnJvbSAnLi4vVml6U2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBWaXpTZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIFZpelNlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5WaXo7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlVml6SW1hZ2VBc3luYyhpbnB1dFNwZWM6IG9iamVjdCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2NyZWF0ZVZpekltYWdlQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpekFQSUlucHV0SnNvbl06IEpTT04uc3RyaW5naWZ5KGlucHV0U3BlYyksXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlZpekFQSSwgcGFyYW1ldGVycykudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBzdHJpbmc7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFjdGl2YXRlU2hlZXRBc3luYyhuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYWN0aXZhdGVTaGVldEFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Td2l0Y2hUb1NoZWV0TmFtZV06IG5hbWUsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkFjdGl2YXRlU2hlZXQsIHBhcmFtZXRlcnMpLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldEN1c3RvbVZpZXdzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDdXN0b21WaWV3SW1wbD4+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0Q3VzdG9tVmlld3NBc3luYycsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldEN1c3RvbVZpZXdzLCBwYXJhbWV0ZXJzKS50aGVuPEFycmF5PEN1c3RvbVZpZXdJbXBsPj4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBjdXN0b21WaWV3cyA9IHJlc3BvbnNlLnJlc3VsdCBhcyBBcnJheTxDdXN0b21WaWV3TW9kZWw+O1xuICAgICAgcmV0dXJuIGN1c3RvbVZpZXdzLm1hcCgoY3VzdG9tVmlldzogQ3VzdG9tVmlld01vZGVsKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgQ3VzdG9tVmlld0ltcGwoY3VzdG9tVmlldywgdGhpcy5fcmVnaXN0cnlJZCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzaG93Q3VzdG9tVmlld0FzeW5jKGN1c3RvbVZpZXdOYW1lPzogc3RyaW5nIHwgbnVsbCk6IFByb21pc2U8Q3VzdG9tVmlld0ltcGwgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnc2hvd0N1c3RvbVZpZXdBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuQ3VzdG9tVmlld05hbWVdOiBjdXN0b21WaWV3TmFtZSB8fCAnJywgLy8gYSBmYWxzZXkgdmFsdWUgbWVhbnMgXCJzaG93IG9yaWdpbmFsIHZpZXdcIlxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5TaG93Q3VzdG9tVmlldywgcGFyYW1ldGVycykudGhlbjxDdXN0b21WaWV3SW1wbCB8IHVuZGVmaW5lZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBjdXN0b21WaWV3ID0gcmVzcG9uc2UucmVzdWx0IGFzIEN1c3RvbVZpZXdNb2RlbDtcbiAgICAgIHJldHVybiBjdXN0b21WaWV3Py5sdWlkID8gbmV3IEN1c3RvbVZpZXdJbXBsKGN1c3RvbVZpZXcsIHRoaXMuX3JlZ2lzdHJ5SWQpIDogdW5kZWZpbmVkO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUN1c3RvbVZpZXdBc3luYyhjdXN0b21WaWV3TmFtZTogc3RyaW5nKTogUHJvbWlzZTxDdXN0b21WaWV3SW1wbD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdyZW1vdmVDdXN0b21WaWV3QXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkN1c3RvbVZpZXdOYW1lXTogY3VzdG9tVmlld05hbWUsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlJlbW92ZUN1c3RvbVZpZXcsIHBhcmFtZXRlcnMpLnRoZW48Q3VzdG9tVmlld0ltcGw+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgY3VzdG9tVmlldyA9IHJlc3BvbnNlLnJlc3VsdCBhcyBDdXN0b21WaWV3TW9kZWw7XG4gICAgICByZXR1cm4gbmV3IEN1c3RvbVZpZXdJbXBsKGN1c3RvbVZpZXcsIHRoaXMuX3JlZ2lzdHJ5SWQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNhdmVDdXN0b21WaWV3QXN5bmMoY3VzdG9tVmlld05hbWU6IHN0cmluZyk6IFByb21pc2U8Q3VzdG9tVmlld0ltcGw+IHtcbiAgICAvLyBDdXN0b21WaWV3SXNEZWZhdWx0IGlzIGEgcmVxdWlyZWQgcGFyYW1ldGVyLCBidXQgb3VyIEFQSSBoYXMgbm90IGJlZW4gdXBkYXRlZCB0byBhbGxvdyBpdCB0byBiZSBzcGVjaWZpZWQgeWV0LlxuICAgIC8vIFdlIHNob3VsZCBhZGQgYSAnZGVmYXVsdCcgcGFyYW1ldGVyIHRvIHRoZSBpbnRlcmZhY2UuXG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3NhdmVDdXN0b21WaWV3QXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkN1c3RvbVZpZXdOYW1lXTogY3VzdG9tVmlld05hbWUsXG4gICAgICBbUGFyYW1ldGVySWQuQ3VzdG9tVmlld0lzRGVmYXVsdF06IGZhbHNlLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5TYXZlV29ya2Jvb2tBc0N1c3RvbVZpZXcsIHBhcmFtZXRlcnMpLnRoZW48Q3VzdG9tVmlld0ltcGw+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgY3VzdG9tVmlldyA9IHJlc3BvbnNlLnJlc3VsdCBhcyBDdXN0b21WaWV3TW9kZWw7XG4gICAgICByZXR1cm4gbmV3IEN1c3RvbVZpZXdJbXBsKGN1c3RvbVZpZXcsIHRoaXMuX3JlZ2lzdHJ5SWQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNldEFjdGl2ZUN1c3RvbVZpZXdBc0RlZmF1bHRBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnc2V0QWN0aXZlQ3VzdG9tVmlld0FzRGVmYXVsdEFzeW5jJyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuU2V0QWN0aXZlQ3VzdG9tVmlld0FzRGVmYXVsdCwgcGFyYW1ldGVycykudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc2F2ZUFzeW5jKGN1c3RvbVZpZXc6IEN1c3RvbVZpZXdJbXBsKTogUHJvbWlzZTxDdXN0b21WaWV3SW1wbD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdzYXZlQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkN1c3RvbVZpZXdMdWlkXTogY3VzdG9tVmlldy5sdWlkLFxuICAgICAgW1BhcmFtZXRlcklkLkN1c3RvbVZpZXdOYW1lXTogY3VzdG9tVmlldy5uYW1lLFxuICAgICAgW1BhcmFtZXRlcklkLkN1c3RvbVZpZXdJc0RlZmF1bHRdOiBjdXN0b21WaWV3LmlzRGVmYXVsdCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5DdXN0b21WaWV3SXNQdWJsaWNdOiBjdXN0b21WaWV3LnNoYXJlZCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuVXBkYXRlQ3VzdG9tVmlldywgcGFyYW1ldGVycykudGhlbjxDdXN0b21WaWV3SW1wbD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBjdXN0b21WaWV3ID0gcmVzcG9uc2UucmVzdWx0IGFzIEN1c3RvbVZpZXdNb2RlbDtcbiAgICAgIHJldHVybiBuZXcgQ3VzdG9tVmlld0ltcGwoY3VzdG9tVmlldywgdGhpcy5fcmVnaXN0cnlJZCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q3VycmVudFNyY0FzeW5jKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldEN1cnJlbnRTcmNBc3luYycsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldEN1cnJlbnRTcmMsIHBhcmFtZXRlcnMpLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5yZXN1bHQgYXMgc3RyaW5nKTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IERhc2hib2FyZE9iamVjdFZpc2liaWxpdHlUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFBhcmFtZXRlcklkLCBWZXJiSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzIGFzIEV4dGVybmFsRW51bUNvbnZlcnRlciB9IGZyb20gJy4uLy4uL0VudW1NYXBwaW5ncy9FeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MnO1xuaW1wb3J0IHsgRGFzaGJvYXJkT2JqZWN0SW1wbCB9IGZyb20gJy4uLy4uL0ltcGwvRGFzaGJvYXJkT2JqZWN0SW1wbCc7XG5pbXBvcnQgeyBFcnJvckhlbHBlcnMgfSBmcm9tICcuLi8uLi9VdGlscy9FcnJvckhlbHBlcnMnO1xuaW1wb3J0IHsgUGFyYW0gfSBmcm9tICcuLi8uLi9VdGlscy9QYXJhbSc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgWm9uZVNlcnZpY2UgfSBmcm9tICcuLi9ab25lU2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBab25lU2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBab25lU2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLlpvbmU7XG4gIH1cblxuICBwdWJsaWMgc2V0VmlzaWJpbGl0eUFzeW5jKFxuICAgIGRhc2hib2FyZDogc3RyaW5nLFxuICAgIGRhc2hib2FyZFpvbmVNYXA6IE1hcDxudW1iZXIsIERhc2hib2FyZE9iamVjdEltcGw+LFxuICAgIHpvbmVWaXNpYmlsaXR5TWFwOiBDb250cmFjdC5ab25lVmlzaWJpbGl0eU1hcCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnc2V0VmlzaWJpbGl0eUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EYXNoYm9hcmRdOiBkYXNoYm9hcmQsXG4gICAgICBbUGFyYW1ldGVySWQuWm9uZUlkc1Zpc2liaWxpdHlNYXBdOiB7fSxcbiAgICB9O1xuXG4gICAgLy8gem9uZVZpc2liaWxpdHlNYXAgY2FuIGJlIGVpdGhlciBhbiBvYmplY3Qgb3IgYSBNYXAgLSBjb252ZXJ0IGl0IHRvIGEgTWFwXG4gICAgY29uc3QgcGFyYW1ldGVyQXNNYXAgPSBQYXJhbS5jb252ZXJ0UGFyYW1ldGVyVG9NYXAoem9uZVZpc2liaWxpdHlNYXAsICd6b25lVmlzaWJpbGl0eU1hcCcpO1xuXG4gICAgcGFyYW1ldGVyQXNNYXAuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgRXJyb3JIZWxwZXJzLnZlcmlmeVpvbmVJc1ZhbGlkKGRhc2hib2FyZFpvbmVNYXAsIE51bWJlci5wYXJzZUludChrZXksIDEwKSk7XG4gICAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPERhc2hib2FyZE9iamVjdFZpc2liaWxpdHlUeXBlPih2YWx1ZSwgRGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eVR5cGUsICdEYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5VHlwZScpO1xuICAgICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5ab25lSWRzVmlzaWJpbGl0eU1hcF1ba2V5XSA9IEV4dGVybmFsRW51bUNvbnZlcnRlci5zZXRWaXNpYmlsaXR5VHlwZS5jb252ZXJ0KHZhbHVlKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlNldFpvbmVWaXNpYmlsaXR5LCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG1vdmVBbmRSZXNpemVBc3luYyhcbiAgICBkYXNoYm9hcmQ6IHN0cmluZyxcbiAgICBkYXNoYm9hcmRab25lTWFwOiBNYXA8bnVtYmVyLCBEYXNoYm9hcmRPYmplY3RJbXBsPixcbiAgICBkYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGVBcnJheTogQ29udHJhY3QuRGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlQXJyYXksXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRGFzaGJvYXJkXTogZGFzaGJvYXJkLFxuICAgICAgW1BhcmFtZXRlcklkLkRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUxpc3RdOiBkYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGVBcnJheSxcbiAgICB9O1xuXG4gICAgZGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlQXJyYXkuZm9yRWFjaCgoZGFzaGJvYXJkT2JqZWN0OiBDb250cmFjdC5EYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUpID0+IHtcbiAgICAgIEVycm9ySGVscGVycy52ZXJpZnlab25lSXNWYWxpZEFuZEZsb2F0aW5nKGRhc2hib2FyZFpvbmVNYXAsIGRhc2hib2FyZE9iamVjdC5kYXNoYm9hcmRPYmplY3RJRCk7XG4gICAgICBFcnJvckhlbHBlcnMudmVyaWZ5V2lkdGhBbmRIZWlnaHRPZkRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZShkYXNoYm9hcmRPYmplY3QpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuTW92ZUFuZFJlc2l6ZVpvbmVzLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVJbmZvIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiBhIHRhYmxlIHN1bW1hcnkuXG4gKiBUaGlzIGRvZXMgbm90IGZvbGxvdyB0aGUgSW1wbCBwYXR0ZXJuIGFzIGl0IGlzIGp1c3QgYSBwcm9wZXJ0eSBiYWcuXG4gKi9cbmV4cG9ydCBjbGFzcyBUYWJsZVN1bW1hcnkgaW1wbGVtZW50cyBDb250cmFjdC5UYWJsZVN1bW1hcnkge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfdGFibGVJbmZvOiBUYWJsZUluZm8pIHt9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3RhYmxlSW5mby5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90YWJsZUluZm8uaWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvbm5lY3Rpb25JZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90YWJsZUluZm8uY29ubmVjdGlvbklkO1xuICB9XG5cbiAgcHVibGljIGdldCBjdXN0b21TUUwoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fdGFibGVJbmZvLmN1c3RvbVNRTDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRW1iZWRkaW5nRXJyb3JDb2RlcywgRXJyb3JDb2RlcywgU2hhcmVkRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbi8qKlxuICogQ3VzdG9tIGVycm9yIGNsYXNzIHRoYXQgZXh0ZW5kcyB0aGUgZGVmYXVsdCBKYXZhU2NyaXB0IEVycm9yIG9iamVjdC5cbiAqIFRoaXMgYWxsb3dzIHVzIHRvIHByb3ZpZGUgYSBmaWVsZCB3aXRoIGEgc3BlY2lmaWMgZXJyb3IgY29kZVxuICogc28gdGhhdCBkZXZlbG9wZXJzIGNhbiBtb3JlIGVhc2lseSBwcm9ncmFtbWF0aWNhbGx5IHJlc3BvbmRcbiAqIHRvIGVycm9yIHNjZW5hcmlvcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFRhYmxlYXVFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2Vycm9yQ29kZTogRXJyb3JDb2RlcyB8IEVtYmVkZGluZ0Vycm9yQ29kZXMgfCBTaGFyZWRFcnJvckNvZGVzLCBtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihgJHtfZXJyb3JDb2RlfTogJHttZXNzYWdlfWApO1xuXG4gICAgLyp0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgKi9cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vTWljcm9zb2Z0L1R5cGVTY3JpcHQtd2lraS9ibG9iL21hc3Rlci9CcmVha2luZy1DaGFuZ2VzLm1kI2V4dGVuZGluZy1idWlsdC1pbnMtbGlrZS1lcnJvci1hcnJheS1hbmQtbWFwLW1heS1uby1sb25nZXItd29ya1xuICAgIC8vIEVycm9yIGluaGVyaXRhbmNlIGRvZXMgbm90IHdvcmsgcHJvcGVydGx5IHdoZW4gY29tcGlsaW5nIHRvIEVTNSwgdGhpcyBpcyBhIHdvcmthcm91bmQgdG8gZm9yY2VcbiAgICAvLyB0aGUgcHJvdG8gY2hhaW4gdG8gYmUgYnVpbHQgY29ycmVjdGx5LiAgU2VlIHRoZSBnaXRodWIgbGluayBhYm92ZSBmb3IgZGV0YWlscy5cbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgVGFibGVhdUVycm9yLnByb3RvdHlwZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGVycm9yQ29kZSgpOiBFcnJvckNvZGVzIHwgRW1iZWRkaW5nRXJyb3JDb2RlcyB8IFNoYXJlZEVycm9yQ29kZXMge1xuICAgIHJldHVybiB0aGlzLl9lcnJvckNvZGU7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIEludGVybmFsQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IERhdGFWYWx1ZSB9IGZyb20gJy4uL01vZGVscy9HZXREYXRhTW9kZWxzJztcblxuLyoqXG4gKiBJbiB2ZXJzaW9uIDIgb2YgdGhlIGludGVyZmFjZSwgd2Ugc2hvdWxkIGNvbGxhcHNlIHZhbHVlIGludG8gbmF0aXZlVmFsdWUsIGFuZCBkbyBhbGwgdGhpcyB3b3JrIG92ZXJcbiAqIGluIHRoZSBwbGF0Zm9ybS5cbiAqL1xuZXhwb3J0IGNsYXNzIERhdGFWYWx1ZUZhY3Rvcnkge1xuICBwdWJsaWMgc3RhdGljIE1ha2VQYXJhbWV0ZXJEYXRhVmFsdWUoaW50ZXJuYWxEYXRhVmFsdWU6IEludGVybmFsQ29udHJhY3QuRGF0YVZhbHVlLCBkYXRhVHlwZTogSW50ZXJuYWxDb250cmFjdC5EYXRhVHlwZSk6IERhdGFWYWx1ZSB7XG4gICAgLy8gUGFyYW1ldGVyIHZhbHVlcyBhcmUgYWxsIHN0cmluZ3MsIGNvbnZlcnQgZnJvbSBzdHJpbmcgdG8gdmFsdWVcbiAgICByZXR1cm4gbmV3IERhdGFWYWx1ZShcbiAgICAgIGludGVybmFsRGF0YVZhbHVlLnZhbHVlLFxuICAgICAgSW50ZXJuYWxDb250cmFjdC5EYXRhVHlwZUNvbnZlcnRlci5jb252ZXJ0U3RyaW5nVmFsdWVUb05hdGl2ZVZhbHVlKGludGVybmFsRGF0YVZhbHVlLnZhbHVlLCBkYXRhVHlwZSksXG4gICAgICBpbnRlcm5hbERhdGFWYWx1ZS5mb3JtYXR0ZWRWYWx1ZSxcbiAgICAgIGludGVybmFsRGF0YVZhbHVlLmFsaWFzZWRWYWx1ZSxcbiAgICAgIGludGVybmFsRGF0YVZhbHVlLmhhc0FsaWFzLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIE1ha2VGaWx0ZXJEYXRhVmFsdWUoaW50ZXJuYWxEYXRhVmFsdWU6IEludGVybmFsQ29udHJhY3QuRGF0YVZhbHVlKTogRGF0YVZhbHVlIHtcbiAgICAvLyBGaWx0ZXJzIGFscmVhZHkgaGF2ZSBuYXRpdmUgdHlwZSBpbiB2YWx1ZSwganVzdCB1c2UgdGhhdCBmb3IgbmF0aXZlVmFsdWUgYWxzb1xuICAgIHJldHVybiBuZXcgRGF0YVZhbHVlKGludGVybmFsRGF0YVZhbHVlLnZhbHVlLCBpbnRlcm5hbERhdGFWYWx1ZS52YWx1ZSwgaW50ZXJuYWxEYXRhVmFsdWUuZm9ybWF0dGVkVmFsdWUpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBNYWtlVGFibGVEYXRhVmFsdWUoaW50ZXJuYWxEYXRhVmFsdWU6IEludGVybmFsQ29udHJhY3QuRGF0YVZhbHVlLCBkYXRhVHlwZTogSW50ZXJuYWxDb250cmFjdC5EYXRhVHlwZSk6IERhdGFWYWx1ZSB7XG4gICAgLy8gRGF0YVRhYmxlcyBjb250YWluIGJvb2xlYW4gfCBudW1iZXIgfCBzdHJpbmcgfCBkYXRlIGFzIHN0cmluZyB8ICclbnVsbCVcbiAgICAvLyBjb252ZXJ0VmFsdWVUb05hdGl2ZVZhbHVlIGNvbnZlcnRzIGRhdGVzIGFzIHN0cmluZyB0byBkYXRlcywgYW5kIGFueSBzcGVjaWFsIHRvIG51bGxcbiAgICAvLyAoYm9vbGVhbiwgbnVtYmVycywgc3RyaW5ncyBhcmUgcGFzc2VkIHRocm91Z2gpXG4gICAgLy8gQmVjYXVzZSBvZiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbiAtIHdlIGNhbiBoYXZlIHVuZGVmaW5lZCB2YWx1ZXMsIHdoaWNoIGFyZSBkaWZmZXJlbnQgdGhhbiBhbnkgc3BlY2lhbFxuICAgIHJldHVybiBuZXcgRGF0YVZhbHVlKFxuICAgICAgaW50ZXJuYWxEYXRhVmFsdWUudmFsdWUsXG4gICAgICBpbnRlcm5hbERhdGFWYWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gSW50ZXJuYWxDb250cmFjdC5EYXRhVHlwZUNvbnZlcnRlci5jb252ZXJ0VmFsdWVUb05hdGl2ZVZhbHVlKGludGVybmFsRGF0YVZhbHVlLnZhbHVlLCBkYXRhVHlwZSlcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBpbnRlcm5hbERhdGFWYWx1ZS5mb3JtYXR0ZWRWYWx1ZSxcbiAgICApO1xuICB9XG59XG4iLCIvKipcbiAqIEEgUHJvbWlzZSB3cmFwcGVyIGNsYXNzIGFsbG93aW5nIGZvciByZXNvbHZpbmcvcmVqZWN0aW5nIHRoZSBQcm9taXNlIG91dHNpZGUgdGhlIGNvbnRleHQgb2YgaXRzIGNvbnN0cnVjdG9yLlxuICpcbiAqIEBleHBvcnRcbiAqIEBjbGFzcyBEZWZlcnJlZFxuICogQHRlbXBsYXRlIFRSZXNvbHZlIFRoZSB0eXBlIHVzZWQgdG8gcmVzb2x2ZSB0aGUgcHJvbWlzZS5cbiAqIEB0ZW1wbGF0ZSBUUmVqZWN0IFRoZSB0eXBlIHVzZWQgdG8gcmVqZWN0IHRoZSBwcm9taXNlLiBEZWZhdWx0cyB0byBhbnkuXG4gKiBAbGluayBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzQ2Mzc0MzZcbiAqL1xuZXhwb3J0IGNsYXNzIERlZmVycmVkPFRSZXNvbHZlLCBUUmVqZWN0ID0gYW55PiB7XG4gIHByaXZhdGUgX3Byb21pc2U6IFByb21pc2U8VFJlc29sdmU+O1xuICBwcml2YXRlIF9yZXNvbHZlOiAocmVzcG9uc2U6IFRSZXNvbHZlIHwgUHJvbWlzZUxpa2U8VFJlc29sdmU+KSA9PiB2b2lkO1xuICBwcml2YXRlIF9yZWplY3Q6IChyZWFzb24/OiBUUmVqZWN0KSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIERlZmVycmVkLlxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5fcHJvbWlzZSA9IG5ldyBQcm9taXNlPFRSZXNvbHZlPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLl9yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgIHRoaXMuX3JlamVjdCA9IHJlamVjdDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBQcm9taXNlLlxuICAgKlxuICAgKiBAcmVhZG9ubHlcbiAgICogQHR5cGUge1Byb21pc2U8VFJlc29sdmU+fVxuICAgKi9cbiAgZ2V0IHByb21pc2UoKTogUHJvbWlzZTxUUmVzb2x2ZT4ge1xuICAgIHJldHVybiB0aGlzLl9wcm9taXNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSB3cmFwcGVkIFByb21pc2UuXG4gICAqXG4gICAqIEBwYXJhbSB7KFRSZXNvbHZlIHwgUHJvbWlzZUxpa2U8VFJlc29sdmU+KX0gcmVzcG9uc2UgVGhlIGFyZ3VtZW50IHRvIGJlIHJlc29sdmVkIGJ5IHRoZSBQcm9taXNlLlxuICAgKiBAcmV0dXJucyB7Kn0gIHt2b2lkfVxuICAgKi9cbiAgcmVzb2x2ZShyZXNwb25zZTogVFJlc29sdmUgfCBQcm9taXNlTGlrZTxUUmVzb2x2ZT4pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3Jlc29sdmUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9yZXNvbHZlKHJlc3BvbnNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKlxuICAgKiBAcGFyYW0ge1RSZWplY3R9IFtyZWFzb25dIFRoZSByZWFzb24gd2h5IHRoZSBQcm9taXNlIHJlamVjdGVkLlxuICAgKiBAcmV0dXJucyB7Kn0gIHt2b2lkfVxuICAgKi9cbiAgcmVqZWN0KHJlYXNvbj86IFRSZWplY3QpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3JlamVjdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3JlamVjdChyZWFzb24pO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBVbnJlZ2lzdGVyVGltZW91dEluTWlsbGlzZWNvbmRzID0gMzAwMDA7XG4iLCJpbXBvcnQgeyBFcnJvckNvZGVzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uL1RhYmxlYXVFcnJvcic7XG5cbi8qKlxuICogVGhpcyBjbGFzcyBjb252ZXJ0cyBmcm9tIGEgc291cmNlIGVudW0gdmFsdWUgdG8gZGVzdGluYXRpb24gZW51bVxuICogdmFsdWUgZ2l2ZW4gYSBtYXBwaW5nIGZyb20gc291cmNlIHRvIGRlc3RpbmF0aW9uIHdoZW4gY29uc3RydWN0ZWQuXG4gKlxuICogTm90ZTogVGhpcyBleGFjdCBzYW1lIGNsYXNzIGlzIGRlZmluZWQgaW4gYXBpLWNvcmUuICBHaXZlbiBpdHMgc21hbGxcbiAqIG5hdHVyZSwgaXQgaXMgbm90IHdvcnRoIGhhdmluZyBpbiBhIHNlcGFyYXRlIHByb2plY3QgdG8gc2hhcmUgdGhpcyBiZXR3ZWVuXG4gKiBhcGktY29yZSBhbmQgYXBpLXNoYXJlZC4gIElmIG1vcmUgdXRpbGl0eSBmdW5jdGlvbmFsaXR5IGlzIGFkZGVkIHRoYXQgaXMgdXNlZCBieSBhcGktY29yZVxuICogYW5kIGFwaS1zaGFyZWQgYnV0IGhhcyBubyBvdGhlciBkZXBlbmRlY2llcywgYSB1dGlsdGl0eSBwcm9qZWN0IG1pZ2h0IGJlIG1lcml0ZWQsXG4gKiBhbmQgdGhpcyBjbGFzcyBjb3VsZCBiZSBtb3ZlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIEVudW1Db252ZXJ0ZXI8VFNvdXJjZVR5cGUgZXh0ZW5kcyBzdHJpbmcsIFREZXN0aW5hdGlvblR5cGU+IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX21hcHBpbmdzOiB7IFtlbnVtVmFsOiBzdHJpbmddOiBURGVzdGluYXRpb25UeXBlIH0sIHByaXZhdGUgX2RlZmF1bHRWYWw/OiBURGVzdGluYXRpb25UeXBlKSB7fVxuXG4gIHB1YmxpYyBjb252ZXJ0KGVudW1WYWw6IFRTb3VyY2VUeXBlLCB0aHJvd0lmTWlzc2luZzogU2hvdWxkVGhyb3cgPSBTaG91bGRUaHJvdy5ZZXMpOiBURGVzdGluYXRpb25UeXBlIHtcbiAgICBpZiAodGhpcy5fbWFwcGluZ3MuaGFzT3duUHJvcGVydHkoZW51bVZhbCkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9tYXBwaW5nc1tlbnVtVmFsIGFzIHN0cmluZ107XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2RlZmF1bHRWYWwgIT09IHVuZGVmaW5lZCAmJiB0aHJvd0lmTWlzc2luZyAhPT0gU2hvdWxkVGhyb3cuWWVzKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZGVmYXVsdFZhbDtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYEVudW0gTWFwcGluZyBub3QgZm91bmQgZm9yOiAke2VudW1WYWx9YCk7XG4gIH1cbn1cblxuZXhwb3J0IGVudW0gU2hvdWxkVGhyb3cge1xuICBZZXMgPSAneWVzJyxcbiAgTm8gPSAnbm8nLFxufVxuIiwiaW1wb3J0IHtcbiAgRGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlLFxuICBFeHBvcnREYXRhT3B0aW9ucyxcbiAgRXhwb3J0U2NlbmFyaW9zRm9yUERGQW5kUG93ZXJQb2ludCxcbiAgRXhwb3J0UERGT3B0aW9ucyBhcyBFeHRlcm5hbEV4cG9ydFBERk9wdGlvbnMsXG4gIFByaW50T3JpZW50YXRpb24sXG4gIFByaW50UGFnZVNpemUsXG4gIFByaW50U2NhbGluZyxcbiAgUmFuZ2VGaWx0ZXJPcHRpb25zLFxuICBTaGFyZWRFcnJvckNvZGVzLFxufSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkT2JqZWN0SW1wbCB9IGZyb20gJy4uL0ltcGwvRGFzaGJvYXJkT2JqZWN0SW1wbCc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgUGFyYW0gfSBmcm9tICcuL1BhcmFtJztcblxuaW50ZXJmYWNlIEVudW1MaWtlIHtcbiAgdG9TdHJpbmcoKTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBjb25zdHJ1Y3QgY29tbW9uIGVycm9ycyB0aHJvdWdob3V0IHRoZSBleHRlcm5hbFxuICogcHJvamVjdHMgKGFwaS1zaGFyZWQsIGV4dGVuc2lvbnMtYXBpLCBldGMuKS4gIEl0IGhhcyBzb21lIGR1cGxpY2F0aW9uIHdpdGhcbiAqIHRoZSBFcnJvckhlbHBlcnMgY2xhc3MgaW4gYXBpLWNvcmUsIGJ1dCBpcyBzZXBhcmF0ZSBkdWUgdG8gdGhlIG5lZWQgdG8gdGhyb3dcbiAqIGFuIGV4dGVybmFsIFRhYmxlYXVFcnJvciB2cy4gYW4gSW50ZXJuYWxUYWJsZWF1RXJyb3IuXG4gKi9cbmV4cG9ydCBjbGFzcyBFcnJvckhlbHBlcnMge1xuICAvKipcbiAgICogVGhyb3dzIHdpdGggY29kZSBJbnRlcm5hbEVycm9yLlxuICAgKlxuICAgKiBAcGFyYW0gYXBpTmFtZSBuYW1lIG9mIGFwaSB0aGF0IHdhcyBjYWxsZWQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFwaU5vdEltcGxlbWVudGVkKGFwaU5hbWU6IHN0cmluZyk6IFRhYmxlYXVFcnJvciB7XG4gICAgcmV0dXJuIG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgJHthcGlOYW1lfSBBUEkgbm90IHlldCBpbXBsZW1lbnRlZC5gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd3MgYW4gaW50ZXJuYWwgZXJyb3IgaWYgYXJndW1lbnQgaXMgbnVsbCBvciB1bmRlZmluZWQuXG4gICAqXG4gICAqIEBwYXJhbSBhcmd1bWVudFZhbHVlIHZhbHVlIHRvIHZlcmlmeVxuICAgKiBAcGFyYW0gYXJndW1lbnROYW1lIG5hbWUgb2YgYXJndW1lbnQgdG8gdmVyaWZ5XG4gICAqL1xuICAvKnRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeUludGVybmFsVmFsdWUoYXJndW1lbnRWYWx1ZTogYW55LCBhcmd1bWVudE5hbWU6IHN0cmluZykge1xuICAgIGlmIChhcmd1bWVudFZhbHVlID09PSBudWxsIHx8IGFyZ3VtZW50VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludGVybmFsRXJyb3IsIGAke2FyZ3VtZW50VmFsdWV9IGlzIGludmFsaWQgdmFsdWUgZm9yOiAke2FyZ3VtZW50TmFtZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhyb3dzIGFuIEludmFsaWRQYXJhbWV0ZXIgZXJyb3IgaWYgYXJndW1lbnQgaXMgbnVsbCBvciB1bmRlZmluZWQuXG4gICAqXG4gICAqIEBwYXJhbSBhcmd1bWVudFZhbHVlIHZhbHVlIHRvIHZlcmlmeVxuICAgKiBAcGFyYW0gYXJndW1lbnROYW1lIG5hbWUgb2YgYXJndW1lbnQgdG8gdmVyaWZ5XG4gICAqL1xuICAvKnRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeVBhcmFtZXRlcihhcmd1bWVudFZhbHVlOiBhbnksIGFyZ3VtZW50TmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKGFyZ3VtZW50VmFsdWUgPT09IG51bGwgfHwgYXJndW1lbnRWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgYCR7YXJndW1lbnRWYWx1ZX0gaXMgaW52YWxpZCB2YWx1ZSBmb3IgcGFyYW1ldGVyOiAke2FyZ3VtZW50TmFtZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhyb3dzIGFuIEludmFsaWRQYXJhbWV0ZXIgZXJyb3IgaWYgYXJndW1lbnQgaXMgbm90IHRoZSBzcGVjaWZpZWQgdHlwZS5cbiAgICogRm9yIG9iamVjdHMsIGl0IGp1c3QgdGVzdHMgdGhhdCBpdCBpcyBhbiBvYmplY3RcbiAgICpcbiAgICogQHBhcmFtIGFyZ3VtZW50VmFsdWUgdmFsdWUgdG8gdmVyaWZ5XG4gICAqIEBwYXJhbSBleHBlY3RlZFR5cGUgZXhwZWN0ZWQgcmVzdWx0IG9mIHR5cGVvZlxuICAgKiBAcGFyYW0gYXJndW1lbnROYW1lIG5hbWUgb2YgYXJndW1lbnQgdG8gdmVyaWZ5XG4gICAqL1xuICAvKnRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeVBhcmFtZXRlclR5cGUoYXJndW1lbnRWYWx1ZTogYW55LCBleHBlY3RlZFR5cGU6IHN0cmluZywgYXJndW1lbnROYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50VmFsdWUgIT09IGV4cGVjdGVkVHlwZSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsIGAke2FyZ3VtZW50VmFsdWV9IGhhcyBpbnZhbGlkIHR5cGUgZm9yIHBhcmFtZXRlcjogJHthcmd1bWVudE5hbWV9LmApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd3MgYW4gSW52YWxpZFBhcmFtZXRlciBlcnJvciBpZiBhcmd1bWVudCBpcyBlbXB0eSBzdHJpbmcsIG51bGwgb3IgdW5kZWZpbmVkLlxuICAgKlxuICAgKiBAcGFyYW0gYXJndW1lbnRWYWx1ZSB2YWx1ZSB0byB2ZXJpZnlcbiAgICogQHBhcmFtIGFyZ3VtZW50TmFtZSBuYW1lIG9mIGFyZ3VtZW50IHRvIHZlcmlmeVxuICAgKi9cbiAgLyp0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlTdHJpbmdQYXJhbWV0ZXIoYXJndW1lbnRWYWx1ZTogc3RyaW5nLCBhcmd1bWVudE5hbWU6IHN0cmluZykge1xuICAgIGlmIChhcmd1bWVudFZhbHVlID09PSBudWxsIHx8IGFyZ3VtZW50VmFsdWUgPT09IHVuZGVmaW5lZCB8fCBhcmd1bWVudFZhbHVlID09PSAnJykge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsIGAke2FyZ3VtZW50VmFsdWV9IGlzIGludmFsaWQgdmFsdWUgZm9yIHBhcmFtdGVyOiAke2FyZ3VtZW50TmFtZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgcGFzc2VkIHZhbHVlIGlzIGEgdmFsaWQgdmFsdWUgZm9yIHRoYXQgZW51bS5cbiAgICpcbiAgICogU3RyaW5nIGVudW1zIGFyZSB7c3RyaW5nIDogc3RyaW5nfSBkaWN0aW9uYXJpZXMgd2hpY2ggYXJlIG5vdCByZXZlcnNlIG1hcHBhYmxlXG4gICAqIFRoaXMgaXMgYW4gdWdseSB3b3JrYXJvdW5kXG4gICAqXG4gICAqIEBwYXJhbSBlbnVtVmFsdWUgdmFsdWUgdG8gdmVyaWZ5XG4gICAqIEBwYXJhbSBlbnVtVHlwZSBlbnVtIHRvIHZlcmlmeSBhZ2FpbnN0XG4gICAqL1xuICAvKnRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICBwdWJsaWMgc3RhdGljIGlzVmFsaWRFbnVtVmFsdWU8RW51bVR5cGUgZXh0ZW5kcyBFbnVtTGlrZT4oZW51bVZhbHVlOiBFbnVtVHlwZSwgZW51bVR5cGU6IGFueSk6IGJvb2xlYW4ge1xuICAgIGxldCBpc1ZhbGlkID0gZmFsc2U7XG4gICAgT2JqZWN0LmtleXMoZW51bVR5cGUpLmZvckVhY2goKGVudW1LZXkpID0+IHtcbiAgICAgIGlmIChlbnVtVHlwZVtlbnVtS2V5XSA9PT0gZW51bVZhbHVlLnRvU3RyaW5nKCkpIHtcbiAgICAgICAgaXNWYWxpZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gaXNWYWxpZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyBwYXNzZWQgdmFsdWUgaXMgYSB2YWxpZCB2YWx1ZSBmb3IgdGhhdCBlbnVtLlxuICAgKiBUaHJvd3MgYW4gSW52YWxpZFBhcmFtZXRlciBlcnJvciBpZiB0aGUgZW51bSB2YWx1ZSBpcyBub3QgdmFsaWQuXG4gICAqXG4gICAqIFN0cmluZyBlbnVtcyBhcmUge3N0cmluZyA6IHN0cmluZ30gZGljdGlvbmFyaWVzIHdoaWNoIGFyZSBub3QgcmV2ZXJzZSBtYXBwYWJsZVxuICAgKiBUaGlzIGlzIGFuIHVnbHkgd29ya2Fyb3VuZFxuICAgKlxuICAgKiBAcGFyYW0gZW51bVZhbHVlIHZhbHVlIHRvIHZlcmlmeVxuICAgKiBAcGFyYW0gZW51bVR5cGUgZW51bSB0byB2ZXJpZnkgYWdhaW5zdFxuICAgKiBAcGFyYW0gZW51bU5hbWUgZW51bSBuYW1lIGZvciBjbGVhciBlcnJvciBtZXNzYWdlXG4gICAqL1xuICAvKnRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeUVudW1WYWx1ZTxFbnVtVHlwZSBleHRlbmRzIEVudW1MaWtlPihlbnVtVmFsdWU6IEVudW1UeXBlLCBlbnVtVHlwZTogYW55LCBlbnVtTmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKCFFcnJvckhlbHBlcnMuaXNWYWxpZEVudW1WYWx1ZShlbnVtVmFsdWUsIGVudW1UeXBlKSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsIGAke2VudW1WYWx1ZX0gaXMgaW52YWxpZCB2YWx1ZSBmb3IgZW51bTogJHtlbnVtTmFtZX0uYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHBhc3NlZCB2YWx1ZSBpcyBiZXR3ZWVuIFttaW4sIG1heCkgLi4uIG1pbiA8PSB2YWx1ZSA8IG1heFxuICAgKiBUaHJvd3MgYW4gSW52YWxpZFBhcmFtZXRlciBlcnJvciBpZiB0aGUgdmFsdWUgaXMgbm90IHZhbGlkLlxuICAgKlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgdmFsdWUgdG8gdmVyaWZ5XG4gICAqIEBwYXJhbSBtaW4gICB2YWx1ZSBtdXN0IGJlID49IG1pblxuICAgKiBAcGFyYW0gbWF4ICAgdmFsdWUgbXVzdCBiZSA8IG1heFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlSYW5nZSh2YWx1ZTogbnVtYmVyLCBtaW46IG51bWJlciwgbWF4OiBudW1iZXIpIHtcbiAgICBsZXQgaXNWYWxpZCA9IG1pbiA8PSB2YWx1ZSAmJiB2YWx1ZSA8IG1heDtcblxuICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsIGAke3ZhbHVlfSBpcyBpbnZhbGlkIHZhbHVlIGZvciByYW5nZTogWyR7bWlufS4uJHttYXh9KWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGUgcGFyYW1zIG1pbiBhbmQgbWF4IGZvciBhcHBseWluZyByYW5nZSBmaWx0ZXIuXG4gICAqIFRocm93cyB3aXRoIGVycm9yIGNvZGUgSW52YWxpZFBhcmFtZXRlciBpZiByYW5nZSBpcyBpbnZhbGlkLlxuICAgKlxuICAgKiBAcGFyYW0gbWluIHJhbmdlIG1pblxuICAgKiBAcGFyYW0gbWF4IHJhbmdlIG1heFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlSYW5nZVBhcmFtVHlwZShtaW46IFJhbmdlRmlsdGVyT3B0aW9uc1snbWluJ10sIG1heDogUmFuZ2VGaWx0ZXJPcHRpb25zWydtYXgnXSk6IHZvaWQge1xuICAgIGNvbnN0IGlzTWluRGVmaW5lZCA9IG1pbiAhPT0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGlzTWF4RGVmaW5lZCA9IG1heCAhPT0gdW5kZWZpbmVkO1xuXG4gICAgaWYgKCFpc01pbkRlZmluZWQgJiYgIWlzTWF4RGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsICdVbmV4cGVjdGVkIGludmFsaWQgcGFyYW0gdmFsdWUsIGF0IGxlYXN0IG9uZSBvZiBtaW4gb3IgbWF4IGlzIHJlcXVpcmVkLicpO1xuICAgIH1cblxuICAgIGlmIChpc01pbkRlZmluZWQgJiYgIVBhcmFtLmlzVHlwZU51bWJlcihtaW4pICYmICFQYXJhbS5pc1R5cGVEYXRlKG1pbikpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoXG4gICAgICAgIFNoYXJlZEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlcixcbiAgICAgICAgJ1VuZXhwZWN0ZWQgaW52YWxpZCBwYXJhbSB2YWx1ZSwgb25seSBEYXRlIGFuZCBudW1iZXIgYXJlIGFsbG93ZWQgZm9yIHBhcmFtZXRlciBtaW4uJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGlzTWF4RGVmaW5lZCAmJiAhUGFyYW0uaXNUeXBlTnVtYmVyKG1heCkgJiYgIVBhcmFtLmlzVHlwZURhdGUobWF4KSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihcbiAgICAgICAgU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLFxuICAgICAgICAnVW5leHBlY3RlZCBpbnZhbGlkIHBhcmFtIHZhbHVlLCBvbmx5IERhdGUgYW5kIG51bWJlciBhcmUgYWxsb3dlZCBmb3IgcGFyYW1ldGVyIG1heC4nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoaXNNaW5EZWZpbmVkICYmIGlzTWF4RGVmaW5lZCAmJiB0eXBlb2YgbWluICE9PSB0eXBlb2YgbWF4KSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgICBTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsXG4gICAgICAgICdVbmV4cGVjdGVkIGludmFsaWQgcGFyYW0gdmFsdWUsIHBhcmFtZXRlcnMgbWluIGFuZCBtYXggc2hvdWxkIGJlIG9mIHRoZSBzYW1lIHR5cGUuJyxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoYXQgdGhlIHpvbmVJZCBpcyBwcmVzZW50IGluIHRoZSBjdXJyZW50IGRhc2hib2FyZC5cbiAgICogVGhyb3dzIHdpdGggZXJyb3IgY29kZSBJbnZhbGlkUGFyYW1ldGVyIGlmIGVpdGhlciBjb25kaXRpb24gaXMgZmFsc2UuXG4gICAqXG4gICAqIEBwYXJhbSBkYXNoYm9hcmRab25lTWFwIEEgbWFwIG9mIHpvbmVJZCdzIHRvIHRoZSBjb3JyZXNwb25kaW5nIGRhc2hib2FyZCBvYmplY3QuXG4gICAqIEBwYXJhbSB6b25lSUQgWm9uZUlkIHRvIGJlIHZhbGlkYXRlZFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlab25lSXNWYWxpZChkYXNoYm9hcmRab25lTWFwOiBNYXA8bnVtYmVyLCBEYXNoYm9hcmRPYmplY3RJbXBsPiwgem9uZUlEOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoZGFzaGJvYXJkWm9uZU1hcC5oYXMoem9uZUlEKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoXG4gICAgICBTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsXG4gICAgICBgVW5leHBlY3RlZCBpbnZhbGlkIHBhcmFtIHZhbHVlLCBEYXNoYm9hcmQgT2JqZWN0IElkOiAke3pvbmVJRH0gaXMgbm90IHByZXNlbnQgaW4gZGFzaGJvYXJkLmAsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGF0IHRoZSB6b25lIGlzIHByZXNlbnQgYW5kIGZsb2F0aW5nIGluIHRoZSBjdXJyZW50IGRhc2hib2FyZC5cbiAgICogVGhyb3dzIHdpdGggZXJyb3IgY29kZSBJbnZhbGlkUGFyYW1ldGVyIGlmIGVpdGhlciBjb25kaXRpb24gaXMgZmFsc2UuXG4gICAqXG4gICAqIEBwYXJhbSBkYXNoYm9hcmRab25lTWFwIEEgbWFwIG9mIHpvbmVJZCdzIHRvIHRoZSBjb3JyZXNwb25kaW5nIGRhc2hib2FyZCBvYmplY3QuXG4gICAqIEBwYXJhbSB6b25lSUQgWm9uZUlkIHRvIGJlIHZhbGlkYXRlZFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlab25lSXNWYWxpZEFuZEZsb2F0aW5nKGRhc2hib2FyZFpvbmVNYXA6IE1hcDxudW1iZXIsIERhc2hib2FyZE9iamVjdEltcGw+LCB6b25lSUQ6IG51bWJlcik6IHZvaWQge1xuICAgIGlmIChkYXNoYm9hcmRab25lTWFwLmhhcyh6b25lSUQpICYmIGRhc2hib2FyZFpvbmVNYXAuZ2V0KHpvbmVJRCkhLmlzRmxvYXRpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLFxuICAgICAgYFVuZXhwZWN0ZWQgaW52YWxpZCBwYXJhbSB2YWx1ZSwgRGFzaGJvYXJkIE9iamVjdCBJZDogJHt6b25lSUR9IGlzIG5vdCBwcmVzZW50IG9yIGlzIGEgZml4ZWQgem9uZSBpbiB0aGUgZGFzaGJvYXJkLmAsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGF0IHdpZHRoIGFuZCBoZWlnaHQgYXJlID4gMCBmb3IgZWFjaCBEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUgb2JqZWN0LlxuICAgKiBUaHJvd3Mgd2l0aCBlcnJvciBjb2RlIEludmFsaWRQYXJhbWV0ZXIgaWYgZWl0aGVyIGNvbmRpdGlvbiBpcyBmYWxzZS5cbiAgICpcbiAgICogQHBhcmFtIGRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZSBEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUgb2JqZWN0IGZvciB3aGljaCB3aWR0aCBhbmQgaGVpZ2h0IHdpbGwgYmUgdmFsaWRhdGVkXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeVdpZHRoQW5kSGVpZ2h0T2ZEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUoXG4gICAgZGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlOiBEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUsXG4gICk6IHZvaWQge1xuICAgIGlmIChkYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUud2lkdGggPCAwIHx8IGRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZS5oZWlnaHQgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgICBTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsXG4gICAgICAgIGBVbmV4cGVjdGVkIGludmFsaWQgcGFyYW0gdmFsdWUgZm9yIGRhc2hib2FyZCBvYmplY3QgSUQgJHtkYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUuZGFzaGJvYXJkT2JqZWN0SUR9OmAgK1xuICAgICAgICAgIGAgbmVnYXRpdmUgd2lkdGhzIGFuZCBoZWlnaHRzIGFyZSBub3QgYWxsb3dlZC5gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgaXMgdGhlIGdpdmVuIHNoZWV0IG5hbWUgaXMgaW4gdGhlIGxpc3Qgb2Ygc2hlZXRzIG5hbWVzIGFsbG93ZWQgZm9yIGV4cG9ydGluZy5cbiAgICogVGhyb3dzIHdpdGggZXJyb3IgY29kZSBJbnZhbGlkUGFyYW1ldGVyIGlmIHRoZSBjb25kaXRpb24gYWJvdmUgaXMgZmFsc2UuXG4gICAqXG4gICAqIEBwYXJhbSBleHBvcnRhYmxlU2hlZXROYW1lcyBBIGxpc3Qgb2Ygc2hlZXQgbmFtZXMgYWxsb3dlZCBmb3IgZXhwb3J0aW5nXG4gICAqIEBwYXJhbSBzaGVldE5hbWUgdGhlIG5hbWUgb2YgdGhlIHNoZWV0IHNlbGVjdGVkIGZvciBleHBvcnRcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdmVyaWZ5U2hlZXROYW1lKGV4cG9ydGFibGVTaGVldE5hbWVzOiBBcnJheTxzdHJpbmc+LCBzaGVldE5hbWU6IHN0cmluZykge1xuICAgIGlmICghZXhwb3J0YWJsZVNoZWV0TmFtZXMuaW5jbHVkZXMoc2hlZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihcbiAgICAgICAgU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkU2VsZWN0aW9uU2hlZXQsXG4gICAgICAgICdzaGVldE5hbWUgcGFyYW1ldGVyIG11c3QgYmVsb25nIHRvIGEgd29ya3NoZWV0IHdpdGhpbiB0aGUgY3VycmVudCB2aWV3JyxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoZSBFeHBvcnREYXRhT3B0aW9ucyBvYmplY3RcbiAgICogVGhyb3dzIHdpdGggZXJyb3IgY29kZSBJbnZhbGlkUGFyYW1ldGVyIGlmIHRoZSBwYXJhbWV0ZXIgaXMgbm90IG9mIEV4cG9ydERhdGFPcHRpb25zIHR5cGUuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSBFeHBvcnREYXRhT3B0aW9ucyBvYmplY3QgdXNlZCB0byBjb25maWd1cmUgdGhlIG91dHB1dCBDU1YgZmlsZSBmb3IgZXhwb3J0RGF0YUFzeW5jLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlFeHBvcnREYXRhT3B0aW9ucyhvcHRpb25zOiBFeHBvcnREYXRhT3B0aW9ucyk6IHZvaWQge1xuICAgIGlmIChcbiAgICAgICghUGFyYW0uaXNOdWxsT3JVbmRlZmluZWQob3B0aW9ucy5pZ25vcmVBbGlhc2VzKSAmJiAhUGFyYW0uaXNUeXBlQm9vbChvcHRpb25zLmlnbm9yZUFsaWFzZXMpKSB8fFxuICAgICAgKCFQYXJhbS5pc051bGxPclVuZGVmaW5lZChvcHRpb25zLmNvbHVtbnNUb0luY2x1ZGVCeUlkKSAmJiAhQXJyYXkuaXNBcnJheShvcHRpb25zLmNvbHVtbnNUb0luY2x1ZGVCeUlkKSlcbiAgICApXG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgJ29wdGlvbnMgcGFyYW1hdGVyIG11c3QgYmUgb2YgdHlwZSBFeHBvcnREYXRhT3B0aW9ucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIGlmIHRoZSBzaGVldCBuYW1lcyBhcmUgaW5jbHVkZWQgaW4gYW55IG9mIHRoZSBleHBvcnQgc2NlbmFyaW9zLlxuICAgKiBUaHJvd3Mgd2l0aCBlcnJvciBjb2RlIEludmFsaWRQYXJhbWV0ZXIgaWYgdGhlIHBhcmFtZXRlciBpcyBub3QgYW4gYXJyYXkuXG4gICAqIFRocm93cyB3aXRoIGVycm9yIGNvZGUgSW52YWxpZFNlbGVjdGlvblNoZWV0IGlmIHRoZXJlIGFyZSBhcnJheSBlbnRyaWVzIHRoYXQgZG9udCBleGlzdCBvciBpZiB0aGVyZSBpcyBtaXhpbmcgYmV0d2VlbiBzaGVldHMgZnJvbSB0aGUgZGFzaGJvYXJkIGFuZCBzaGVldCBmcm9tIHRoZSB3b3JrYm9vay5cbiAgICpcbiAgICogQHBhcmFtIHNoZWV0TmFtZXMgTGlzdCBvZiBzaGVldCBuYW1lcyBzZWxlY3RlZCBmb3IgZXhwb3J0aW5nLlxuICAgKiBAcGFyYW0gZXhwb3J0U2NlbmFyaW9zIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBjdXJyZW50IHNoZWV0IG5hbWUsIGV4cG9ydGFibGUgc2hlZXRzIGZyb20gdGhlIGRhc2hib2FyZCwgYW5kIGV4cG9ydGFibGUgc2hlZXRzIGZyb20gdGhlIHdvcmtib29rLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlTaGVldE5hbWVzRm9yUERGQW5kUFBUKHNoZWV0TmFtZXM6IEFycmF5PHN0cmluZz4sIGV4cG9ydFNjZW5hcmlvczogRXhwb3J0U2NlbmFyaW9zRm9yUERGQW5kUG93ZXJQb2ludCk6IHZvaWQge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShzaGVldE5hbWVzKSkgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsICdzaGVldE5hbWVzIHBhcmFtZXRlciBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gICAgaWYgKHNoZWV0TmFtZXMubGVuZ3RoID09PSAwKSB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ3NoZWV0TmFtZXMgc2hvdWxkIG5vdCBiZSBlbXB0eScpO1xuXG4gICAgY29uc3QgaXNJbmNsdWRlZEluRGFzaGJvYXJkID0gc2hlZXROYW1lcy5ldmVyeSgoc2hlZXROYW1lOiBzdHJpbmcpID0+XG4gICAgICBleHBvcnRTY2VuYXJpb3MuZXhwb3J0YWJsZVNoZWV0TmFtZXNGcm9tRGFzaGJvYXJkLmluY2x1ZGVzKHNoZWV0TmFtZSksXG4gICAgKTtcbiAgICBpZiAoaXNJbmNsdWRlZEluRGFzaGJvYXJkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGlzSW5jbHVkZWRJbldvcmtib29rID0gc2hlZXROYW1lcy5ldmVyeSgoc2hlZXROYW1lOiBzdHJpbmcpID0+XG4gICAgICBleHBvcnRTY2VuYXJpb3MuZXhwb3J0YWJsZVNoZWV0TmFtZXNGcm9tV29ya2Jvb2suaW5jbHVkZXMoc2hlZXROYW1lKSxcbiAgICApO1xuICAgIGlmIChpc0luY2x1ZGVkSW5Xb3JrYm9vaykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpc0N1cnJlbnRTaGVldCA9IHNoZWV0TmFtZXMubGVuZ3RoID09PSAxICYmIHNoZWV0TmFtZXNbMF0gPT09IGV4cG9ydFNjZW5hcmlvcy5jdXJyZW50U2hlZXROYW1lO1xuICAgIGlmIChpc0N1cnJlbnRTaGVldCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEV4cG9ydCByZXF1aXJlbWVudDogYWxsIHNoZWV0IG5hbWVzIG11c3QgYmUgaW5jbHVkZWQgaW4gdGhlIGxpc3Qgb2YgZXhwb3J0YWJsZSBzaGVldHMgaW4gdGhlIGRhc2hib2FyZCBvclxuICAgIC8vIGFsbCBzaGVldCBuYW1lcyBtdXN0IGJlIGluY2x1ZGVkIGluIHRoZSBsaXN0IG9mIGV4cG9ydGFibGUgc2hlZXRzIGluIHRoZSB3b3JrYm9vaywgb3IgdGhlIHNoZWV0IG5hbWUgaXMgdGhlIGN1cnJlbnQgc2hlZXRcbiAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkU2VsZWN0aW9uU2hlZXQsXG4gICAgICAnc2hlZXROYW1lcyBwYXJhbWV0ZXIgbXVzdCBoYXZlIGFsbCBpdHMgZW50cmllcyBiZSBleHBvcnRhYmxlIHNoZWV0IG5hbWVzIGZyb20gdGhlIGRhc2hib2FyZCBvciBhbGwgaXRzIGVudHJpZXMgYmUgZXhwb3J0YWJsZSBzaGVldCBuYW1lcyBmcm9tIHRoZSB3b3JrYm9vaycsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGUgZXh0ZXJuYWwgRXhwb3J0UERGT3B0aW9ucyBvYmplY3QncyBwcm9wZXJ0aWVzLlxuICAgKiBUaHJvd3Mgd2l0aCBlcnJvciBjb2RlIEludmFsaWRQYXJhbWV0ZXIgaWYgdGhlIHBhcmFtZXRlciBpcyBub3Qgb2YgZXh0ZXJuYWwgRXhwb3J0UERGT3B0aW9ucyB0eXBlLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgZXh0ZXJuYWwgdXNlci1mYWNpbmcgRXhwb3J0UERGT3B0aW9ucyBvYmplY3QgdXNlZCB0byBjb25maWd1cmUgdGhlIG91dHB1dCBQREYgZmlsZSBmb3IgZXhwb3J0UERGQXN5bmMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeUV4cG9ydFBERk9wdGlvbnMob3B0aW9uczogRXh0ZXJuYWxFeHBvcnRQREZPcHRpb25zKSB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMudmVyaWZ5RW51bVZhbHVlPFByaW50T3JpZW50YXRpb24+KG9wdGlvbnMub3JpZW50YXRpb24sIFByaW50T3JpZW50YXRpb24sICdQcmludE9yaWVudGF0aW9uJyk7XG4gICAgICB0aGlzLnZlcmlmeUVudW1WYWx1ZTxQcmludFBhZ2VTaXplPihvcHRpb25zLnBhZ2VTaXplLCBQcmludFBhZ2VTaXplLCAnUHJpbnRQYWdlU2l6ZScpO1xuICAgICAgdGhpcy52ZXJpZnlFbnVtVmFsdWU8UHJpbnRTY2FsaW5nPihvcHRpb25zLnNjYWxpbmcsIFByaW50U2NhbGluZywgJ1ByaW50U2NhbGluZycpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsICdvcHRpb25zIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgRXhwb3J0UERGT3B0aW9ucycpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgRXhwb3J0TGF5b3V0T3B0aW9ucyxcbiAgRXhwb3J0UERGT3B0aW9ucyBhcyBJbnRlcm5hbEV4cG9ydFBERk9wdGlvbnMsXG4gIEZpdFBhZ2VzLFxuICBQYWdlT3JpZW50YXRpb24sXG4gIFBhZ2VTY2FsaW5nT3B0aW9uLFxuICBQYWdlU2l6ZU9wdGlvbixcbiAgU2NhbGVNb2RlLFxuICBTY2FsaW5nU2VsZWN0aW9uLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgRXhwb3J0RGF0YU9wdGlvbnMsXG4gIEV4cG9ydFBERk9wdGlvbnMgYXMgRXh0ZXJuYWxFeHBvcnRQREZPcHRpb25zLFxuICBQcmludE9yaWVudGF0aW9uLFxuICBQcmludFBhZ2VTaXplLFxuICBQcmludFNjYWxpbmcsXG4gIFNoYXJlZEVycm9yQ29kZXMsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuXG4vKipcbiAqIEhlbHBlciBtZXRob2RzIGZvciBFeHBvcnQgQVBJcy5cbiAqXG4gKiBAY2xhc3MgRXhwb3J0SGVscGVyc1xuICovXG5leHBvcnQgY2xhc3MgRXhwb3J0SGVscGVycyB7XG4gIHB1YmxpYyBzdGF0aWMgRGVmYXVsdERhdGFPcHRpb25zOiBFeHBvcnREYXRhT3B0aW9ucyA9IHtcbiAgICBpZ25vcmVBbGlhc2VzOiBmYWxzZSxcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogW10sXG4gIH07XG5cbiAgcHVibGljIHN0YXRpYyBEZWZhdWx0UERGT3B0aW9uczogRXh0ZXJuYWxFeHBvcnRQREZPcHRpb25zID0ge1xuICAgIHNjYWxpbmc6IFByaW50U2NhbGluZy5BdXRvbWF0aWMsXG4gICAgcGFnZVNpemU6IFByaW50UGFnZVNpemUuTGV0dGVyLFxuICAgIG9yaWVudGF0aW9uOiBQcmludE9yaWVudGF0aW9uLlBvcnRyYWl0LFxuICB9O1xuXG4gIHByaXZhdGUgc3RhdGljIERlZmF1bHRMYXlvdXRPcHRpb25zOiBFeHBvcnRMYXlvdXRPcHRpb25zID0ge1xuICAgIGltYWdlSGVpZ2h0OiAwLFxuICAgIGltYWdlV2lkdGg6IDAsXG4gICAgcGFnZUZpdEhvcml6b250YWw6IDEsXG4gICAgcGFnZUZpdFZlcnRpY2FsOiAxLFxuICAgIHBhZ2VPcmllbnRhdGlvbk9wdGlvbjogUGFnZU9yaWVudGF0aW9uLlBvcnRyYWl0LFxuICAgIHBhZ2VTY2FsZU1vZGU6IFNjYWxlTW9kZS5TY2FsZUF1dG8sXG4gICAgcGFnZVNjYWxlUGVyY2VudDogMTAwLFxuICAgIHBhZ2VTaXplT3B0aW9uOiBQYWdlU2l6ZU9wdGlvbi5MZXR0ZXIsXG4gIH07XG5cbiAgLyoqXG4gICAqIE1vZGlmaWVzIHRoZSBpbnRlcm5hbCBFeHBvcnRQREZPcHRpb25zJyBwcm9wZXJ0aWVzIGJhc2VkIG9uIHRoZSBnaXZlbiBQREYgZXhwb3J0IGNvbmZpZ3VyYXRpb24uXG4gICAqIFRoaXMgbWV0aG9kIHdpbGwgY29uc3RydWN0IHRoZSBpbnRlcm5hbCBFeHBvcnRQREZPcHRpb25zIGlkZW50aWNhbGx5IHRvIGhvdyB0aGUgJ0V4cG9ydCBQREYnIGRpYWxvZyBjb25zdHJ1Y3RzIHRoZSBFeHBvcnRQZGZPcHRpb25zUHJlc01vZGVsLlxuICAgKiBTZWUgdGhlIGhhbmRsZUV4cG9ydENsaWNrIG1ldGhvZCBpbiBAYnJvd3Nlci1jbGllbnRzL2V4cG9ydC1wZGYtb3B0aW9ucy1kaWFsb2cgZm9yIHJlZmVyZW5jZS5cbiAgICpcbiAgICogQHBhcmFtIGludGVybmFsRXhwb3J0UGRmT3B0aW9ucyBUaGUgaW50ZXJuYWwgRXhwb3J0UERGT3B0aW9ucyBwcmVzIG1vZGVsIHVzZWQgdG8gY29uZmlndXJlIHRoZSBvdXRwdXQgUERGIGZpbGUuXG4gICAqIEBwYXJhbSBleHRlcm5hbEV4cG9ydFBkZk9wdGlvbnMgVGhlIGV4dGVybmFsIEV4cG9ydFBERk9wdGlvbnMgdXNlci1mYWNpbmcgb2JqZWN0IHBhc3NlZCB0byBleHBvcnRQREZBc3luYy5cbiAgICogQHBhcmFtIHNoZWV0TmFtZXMgVGhlIGxpc3Qgb2Ygc2hlZXRzIHNlbGVjdGVkIGZvciBleHBvcnQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHVwZGF0ZUludGVybmFsRXhwb3J0UERGT3B0aW9ucyhcbiAgICBpbnRlcm5hbEV4cG9ydFBkZk9wdGlvbnM6IEludGVybmFsRXhwb3J0UERGT3B0aW9ucyxcbiAgICBleHRlcm5hbEV4cG9ydFBkZk9wdGlvbnM6IEV4dGVybmFsRXhwb3J0UERGT3B0aW9ucyxcbiAgICBzaGVldE5hbWVzOiBBcnJheTxzdHJpbmc+LFxuICApOiB2b2lkIHtcbiAgICBpbnRlcm5hbEV4cG9ydFBkZk9wdGlvbnMuY3VycmVudFNoZWV0ID0gc2hlZXROYW1lc1swXTtcbiAgICB0aGlzLnVwZGF0ZUV4cG9ydExheW91dE9wdGlvbnMoaW50ZXJuYWxFeHBvcnRQZGZPcHRpb25zLCBleHRlcm5hbEV4cG9ydFBkZk9wdGlvbnMpO1xuICAgIHRoaXMudXBkYXRlU2hlZXRPcHRpb25zKGludGVybmFsRXhwb3J0UGRmT3B0aW9ucywgc2hlZXROYW1lcyk7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIG1ldGhvZCBmb3IgdXBkYXRlSW50ZXJuYWxFeHBvcnRQREZPcHRpb25zLlxuICAgKiBNb2RpZmllcyB0aGUgZXhwb3J0TGF5b3V0T3B0aW9ucyBwcm9wZXJ0eSBvZiB0aGUgaW50ZXJuYWwgRXhwb3J0UERGT3B0aW9ucyBiYXNlZCBvbiB0aGUgZXh0ZXJuYWwgRXhwb3J0UERGT3B0aW9ucy5cbiAgICogU2VlIHRoZSBnZXRFeHBvcnRMYXlvdXRPcHRpb25zIG1ldGhvZCBpbiBAYnJvd3Nlci1jbGllbnRzL2V4cG9ydC1wZGYtb3B0aW9ucy1kaWFsb2cgZm9yIHJlZmVyZW5jZS5cbiAgICpcbiAgICogQHBhcmFtIGludGVybmFsRXhwb3J0UGRmT3B0aW9ucyBUaGUgaW50ZXJuYWwgRXhwb3J0UERGT3B0aW9ucyBwcmVzIG1vZGVsIHVzZWQgdG8gY29uZmlndXJlIHRoZSBvdXRwdXQgUERGIGZpbGUuXG4gICAqIEBwYXJhbSBleHRlcm5hbEV4cG9ydFBkZk9wdGlvbnMgVGhlIGV4dGVybmFsIEV4cG9ydFBERk9wdGlvbnMgdXNlci1mYWNpbmcgb2JqZWN0IHBhc3NlZCB0byBleHBvcnRQREZBc3luYy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdXBkYXRlRXhwb3J0TGF5b3V0T3B0aW9ucyhcbiAgICBpbnRlcm5hbEV4cG9ydFBkZk9wdGlvbnM6IEludGVybmFsRXhwb3J0UERGT3B0aW9ucyxcbiAgICBleHRlcm5hbEV4cG9ydFBkZk9wdGlvbnM6IEV4dGVybmFsRXhwb3J0UERGT3B0aW9ucyxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgZXhwb3J0TGF5b3V0T3B0aW9ucyA9IGludGVybmFsRXhwb3J0UGRmT3B0aW9ucy5leHBvcnRMYXlvdXRPcHRpb25zO1xuXG4gICAgLy8gc2V0dGluZyB0aGUgaW1hZ2UgaGVpZ2h0IGFuZCB3aWR0aCBwcm9wZXJ0aWVzIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzXG4gICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5pbWFnZUhlaWdodCA9IHRoaXMuRGVmYXVsdExheW91dE9wdGlvbnMuaW1hZ2VIZWlnaHQ7XG4gICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5pbWFnZVdpZHRoID0gdGhpcy5EZWZhdWx0TGF5b3V0T3B0aW9ucy5pbWFnZVdpZHRoO1xuXG4gICAgLy8gIHNldHRpbmcgdGhlIG9yaWVudGF0aW9uIHZhbHVlIGZvciB0aGUgZXhwb3J0TGF5b3V0T3B0aW9uc1xuICAgIHN3aXRjaCAoZXh0ZXJuYWxFeHBvcnRQZGZPcHRpb25zLm9yaWVudGF0aW9uKSB7XG4gICAgICBjYXNlIFByaW50T3JpZW50YXRpb24uTGFuZHNjYXBlOlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VPcmllbnRhdGlvbk9wdGlvbiA9IFBhZ2VPcmllbnRhdGlvbi5MYW5kc2NhcGU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludE9yaWVudGF0aW9uLlBvcnRyYWl0OlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VPcmllbnRhdGlvbk9wdGlvbiA9IFBhZ2VPcmllbnRhdGlvbi5Qb3J0cmFpdDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ2ludmFsaWQgb3JpZW50YXRpb24gZm9yIEV4cG9ydFBERk9wdGlvbicpO1xuICAgIH1cblxuICAgIC8vIHNldHRpbmcgdGhlIHBhZ2Ugc2l6ZSB2YWx1ZSBmb3IgdGhlIGV4cG9ydExheW91dE9wdGlvbnNcbiAgICBzd2l0Y2ggKGV4dGVybmFsRXhwb3J0UGRmT3B0aW9ucy5wYWdlU2l6ZSkge1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLkEzOlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VTaXplT3B0aW9uID0gUGFnZVNpemVPcHRpb24uQTM7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLkE0OlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VTaXplT3B0aW9uID0gUGFnZVNpemVPcHRpb24uQTQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLkE1OlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VTaXplT3B0aW9uID0gUGFnZVNpemVPcHRpb24uQTU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLkI0OlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VTaXplT3B0aW9uID0gUGFnZVNpemVPcHRpb24uQjQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLkI1OlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VTaXplT3B0aW9uID0gUGFnZVNpemVPcHRpb24uQjU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLkV4ZWN1dGl2ZTpcbiAgICAgICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5wYWdlU2l6ZU9wdGlvbiA9IFBhZ2VTaXplT3B0aW9uLkV4ZWN1dGl2ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50UGFnZVNpemUuRm9saW86XG4gICAgICAgIGV4cG9ydExheW91dE9wdGlvbnMucGFnZVNpemVPcHRpb24gPSBQYWdlU2l6ZU9wdGlvbi5Gb2xpbztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50UGFnZVNpemUuTGVkZ2VyOlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VTaXplT3B0aW9uID0gUGFnZVNpemVPcHRpb24uTGVkZ2VyO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRQYWdlU2l6ZS5MZWdhbDpcbiAgICAgICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5wYWdlU2l6ZU9wdGlvbiA9IFBhZ2VTaXplT3B0aW9uLkxlZ2FsO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRQYWdlU2l6ZS5MZXR0ZXI6XG4gICAgICAgIGV4cG9ydExheW91dE9wdGlvbnMucGFnZVNpemVPcHRpb24gPSBQYWdlU2l6ZU9wdGlvbi5MZXR0ZXI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLk5vdGU6XG4gICAgICAgIGV4cG9ydExheW91dE9wdGlvbnMucGFnZVNpemVPcHRpb24gPSBQYWdlU2l6ZU9wdGlvbi5Ob3RlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRQYWdlU2l6ZS5RdWFydG86XG4gICAgICAgIGV4cG9ydExheW91dE9wdGlvbnMucGFnZVNpemVPcHRpb24gPSBQYWdlU2l6ZU9wdGlvbi5RdWFydG87XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLlN0YXRlbWVudDpcbiAgICAgICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5wYWdlU2l6ZU9wdGlvbiA9IFBhZ2VTaXplT3B0aW9uLlN0YXRlbWVudDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50UGFnZVNpemUuVGFibG9pZDpcbiAgICAgICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5wYWdlU2l6ZU9wdGlvbiA9IFBhZ2VTaXplT3B0aW9uLlRhYmxvaWQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLlVuc3BlY2lmaWVkOlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VTaXplT3B0aW9uID0gUGFnZVNpemVPcHRpb24uVW5zcGVjaWZpZWQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludGVybmFsRXJyb3IsICdpbnZhbGlkIHBhZ2VTaXplIGZvciBFeHBvcnRQREZPcHRpb24nKTtcbiAgICB9XG5cbiAgICAvLyBzZXR0aW5nIHRoZSBzY2FsaW5nIHZhbHVlcyBmb3IgdGhlIGV4cG9ydExheW91dE9wdGlvbnNcbiAgICBzd2l0Y2ggKGV4dGVybmFsRXhwb3J0UGRmT3B0aW9ucy5zY2FsaW5nKSB7XG4gICAgICBjYXNlIFByaW50U2NhbGluZy5BdE1vc3QxUGFnZUhpZ2g6XG4gICAgICAgIHRoaXMuc2V0Rml0QW5kU2NhbGVWYWx1ZXMoZXhwb3J0TGF5b3V0T3B0aW9ucywgRml0UGFnZXMuRml0T25lSGlnaCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFNjYWxpbmcuQXRNb3N0MVBhZ2VXaWRlOlxuICAgICAgICB0aGlzLnNldEZpdEFuZFNjYWxlVmFsdWVzKGV4cG9ydExheW91dE9wdGlvbnMsIEZpdFBhZ2VzLkZpdE9uZVdpZGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRTY2FsaW5nLkF0TW9zdDJQYWdlc0hpZ2g6XG4gICAgICAgIHRoaXMuc2V0Rml0QW5kU2NhbGVWYWx1ZXMoZXhwb3J0TGF5b3V0T3B0aW9ucywgRml0UGFnZXMuRml0VHdvSGlnaCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFNjYWxpbmcuQXRNb3N0MlBhZ2VzV2lkZTpcbiAgICAgICAgdGhpcy5zZXRGaXRBbmRTY2FsZVZhbHVlcyhleHBvcnRMYXlvdXRPcHRpb25zLCBGaXRQYWdlcy5GaXRUd29XaWRlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50U2NhbGluZy5BdXRvbWF0aWM6XG4gICAgICAgIHRoaXMuc2V0Rml0QW5kU2NhbGVWYWx1ZXMoZXhwb3J0TGF5b3V0T3B0aW9ucywgUGFnZVNjYWxpbmdPcHRpb24uU2NhbGVQY3RBdXRvKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50U2NhbGluZy5QZXJjMTAwOlxuICAgICAgICB0aGlzLnNldEZpdEFuZFNjYWxlVmFsdWVzKGV4cG9ydExheW91dE9wdGlvbnMsIFBhZ2VTY2FsaW5nT3B0aW9uLlNjYWxlUGN0MTAwKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50U2NhbGluZy5QZXJjMjAwOlxuICAgICAgICB0aGlzLnNldEZpdEFuZFNjYWxlVmFsdWVzKGV4cG9ydExheW91dE9wdGlvbnMsIFBhZ2VTY2FsaW5nT3B0aW9uLlNjYWxlUGN0MjAwKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50U2NhbGluZy5QZXJjMjU6XG4gICAgICAgIHRoaXMuc2V0Rml0QW5kU2NhbGVWYWx1ZXMoZXhwb3J0TGF5b3V0T3B0aW9ucywgUGFnZVNjYWxpbmdPcHRpb24uU2NhbGVQY3QyNSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFNjYWxpbmcuUGVyYzQwMDpcbiAgICAgICAgdGhpcy5zZXRGaXRBbmRTY2FsZVZhbHVlcyhleHBvcnRMYXlvdXRPcHRpb25zLCBQYWdlU2NhbGluZ09wdGlvbi5TY2FsZVBjdDQwMCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFNjYWxpbmcuUGVyYzUwOlxuICAgICAgICB0aGlzLnNldEZpdEFuZFNjYWxlVmFsdWVzKGV4cG9ydExheW91dE9wdGlvbnMsIFBhZ2VTY2FsaW5nT3B0aW9uLlNjYWxlUGN0NTApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRTY2FsaW5nLlBlcmM2MDpcbiAgICAgICAgdGhpcy5zZXRGaXRBbmRTY2FsZVZhbHVlcyhleHBvcnRMYXlvdXRPcHRpb25zLCBQYWdlU2NhbGluZ09wdGlvbi5TY2FsZVBjdDYwKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50U2NhbGluZy5QZXJjNzU6XG4gICAgICAgIHRoaXMuc2V0Rml0QW5kU2NhbGVWYWx1ZXMoZXhwb3J0TGF5b3V0T3B0aW9ucywgUGFnZVNjYWxpbmdPcHRpb24uU2NhbGVQY3Q3NSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFNjYWxpbmcuUGVyYzgwOlxuICAgICAgICB0aGlzLnNldEZpdEFuZFNjYWxlVmFsdWVzKGV4cG9ydExheW91dE9wdGlvbnMsIFBhZ2VTY2FsaW5nT3B0aW9uLlNjYWxlUGN0ODApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRTY2FsaW5nLlBlcmM5MDpcbiAgICAgICAgdGhpcy5zZXRGaXRBbmRTY2FsZVZhbHVlcyhleHBvcnRMYXlvdXRPcHRpb25zLCBQYWdlU2NhbGluZ09wdGlvbi5TY2FsZVBjdDkwKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ2ludmFsaWQgc2NhbGluZyBmb3IgRXhwb3J0UERGT3B0aW9uJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciBtZXRob2QgZm9yIHVwZGF0ZUludGVybmFsRXhwb3J0UERGT3B0aW9ucy5cbiAgICogTW9kaWZpZXMgdGhlIHNoZWV0T3B0aW9ucyBwcm9wZXJ0eSBvZiB0aGUgaW50ZXJuYWwgRXhwb3J0UERGT3B0aW9ucyBiYXNlZCBvbiB0aGUgc2hlZXRzIHNlbGVjdGVkIGZvciBleHBvcnQuXG4gICAqIFNlZSB0aGUgaGFuZGxlRXhwb3J0Q2xpY2sgbWV0aG9kIGluIEBicm93c2VyLWNsaWVudHMvZXhwb3J0LXBkZi1vcHRpb25zLWRpYWxvZyBmb3IgcmVmZXJlbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gaW50ZXJuYWxFeHBvcnRQZGZPcHRpb25zIFRoZSBpbnRlcm5hbCBFeHBvcnRQREZPcHRpb25zIHByZXMgbW9kZWwgdXNlZCB0byBjb25maWd1cmUgdGhlIG91dHB1dCBQREYgZmlsZS5cbiAgICogQHBhcmFtIHNoZWV0TmFtZXMgVGhlIGxpc3Qgb2Ygc2hlZXRzIHNlbGVjdGVkIGZvciBleHBvcnQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHVwZGF0ZVNoZWV0T3B0aW9ucyhpbnRlcm5hbEV4cG9ydFBkZk9wdGlvbnM6IEludGVybmFsRXhwb3J0UERGT3B0aW9ucywgc2hlZXROYW1lczogQXJyYXk8c3RyaW5nPik6IHZvaWQge1xuICAgIGNvbnN0IHsgZXhwb3J0TGF5b3V0T3B0aW9ucywgc2hlZXRPcHRpb25zIH0gPSBpbnRlcm5hbEV4cG9ydFBkZk9wdGlvbnM7XG4gICAgLy8gdXBkYXRpbmcgdGhlIGV4cG9ydCBsYXlvdXRzIG9wdGlvbnMgZm9yIGVhY2ggc2hlZXQgYW5kIHNlbGVjdGluZyBzaGVldCBmb3IgZXhwb3J0IGlmIGluY2x1ZGVkIGluIGxpc3RcbiAgICBmb3IgKGNvbnN0IHNoZWV0T3B0aW9uIG9mIHNoZWV0T3B0aW9ucykge1xuICAgICAgc2hlZXRPcHRpb24uZXhwb3J0TGF5b3V0T3B0aW9ucyA9IGV4cG9ydExheW91dE9wdGlvbnM7XG4gICAgICBzaGVldE9wdGlvbi5pc1NlbGVjdGVkID0gc2hlZXROYW1lcy5pbmNsdWRlcyhzaGVldE9wdGlvbi5zaGVldCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciBtZXRob2QgZm9yIHVwZGF0ZUV4cG9ydExheW91dE9wdG9ucy5cbiAgICogVGhpcyBtZXRob2QgaXMgYSBzcG9vZiBvZiB0aGUgZ2V0Rml0QW5kU2NhbGVWYWx1ZXMgbWV0aG9kIHVzZWQgaW4gQGJyb3dzZXItY2xpZW50cy9leHBvcnQtcGRmLW9wdGlvbnMgdG8gc2V0IHRoZSBleHBvcnRMYXlvdXRPcHRpb25zJyBzY2FsaW5nIHByb3BlcnRpZXMuXG4gICAqIEluIHRoZSBmdXR1cmUsIHRoaXMgZmlsZSBzaG91bGQgYmUgcmVmYWN0b3JlZCB0byBpbXBvcnQgdGhlIG1ldGhvZCBkaXJlY3RseSBmcm9tIEBicm93c2VyLWNsaWVudHMvZXhwb3J0LXBkZi1vcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0gc2NhbGluZ1NlbGVjdGlvbiBzdHJpbmcgdXNlZCBmb3Igc2V0dGluZyB0aGUgZXhwb3J0TGF5b3V0T3B0aW9ucyBiYXNlZCBvbiB0aGUgUHJpbnRTY2FsaW5nIHByb3BlcnR5IGZyb20gdGhlIEV4dGVybmFsRXhwb3J0UERGT3B0aW9ucy5cbiAgICogQHBhcmFtIGV4cG9ydExheW91dE9wdGlvbnMgdGhlIEV4cG9ydExheW91dE9wdGlvbnMgdXNlZCBieSB0aGUgaW50ZXJuYWwgRXhwb3J0UERGT3B0aW9ucyBwcmVzIG1vZGVsLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzZXRGaXRBbmRTY2FsZVZhbHVlcyhleHBvcnRMYXlvdXRPcHRpb25zOiBFeHBvcnRMYXlvdXRPcHRpb25zLCBzY2FsaW5nU2VsZWN0aW9uOiBTY2FsaW5nU2VsZWN0aW9uKTogdm9pZCB7XG4gICAgbGV0IHsgcGFnZUZpdEhvcml6b250YWwsIHBhZ2VGaXRWZXJ0aWNhbCwgcGFnZVNjYWxlTW9kZSwgcGFnZVNjYWxlUGVyY2VudCB9ID0gdGhpcy5EZWZhdWx0TGF5b3V0T3B0aW9ucztcblxuICAgIGNvbnN0IGZpdE1hdGNoID0gdGhpcy5maXRSZWdleC5leGVjKHNjYWxpbmdTZWxlY3Rpb24pO1xuICAgIGNvbnN0IHBlcmNlbnRNYXRjaCA9IHRoaXMucGN0UmVnZXguZXhlYyhzY2FsaW5nU2VsZWN0aW9uKTtcblxuICAgIGlmIChmaXRNYXRjaCkge1xuICAgICAgW3BhZ2VGaXRIb3Jpem9udGFsLCBwYWdlRml0VmVydGljYWxdID0gZml0TWF0Y2guc2xpY2UoMSkubWFwKCh2YWx1ZSkgPT4gTnVtYmVyKHZhbHVlKSk7XG4gICAgICBwYWdlU2NhbGVNb2RlID0gU2NhbGVNb2RlLlNjYWxlRml0UGFnZXM7XG4gICAgfSBlbHNlIGlmIChwZXJjZW50TWF0Y2gpIHtcbiAgICAgIFtwYWdlU2NhbGVQZXJjZW50XSA9IHBlcmNlbnRNYXRjaC5zbGljZSgxKS5tYXAoKHZhbHVlKSA9PiBOdW1iZXIodmFsdWUpKTtcbiAgICAgIHBhZ2VTY2FsZU1vZGUgPSBTY2FsZU1vZGUuU2NhbGVQZXJjZW50YWdlO1xuICAgIH1cblxuICAgIC8vIGdldEZpdEFuZFNjYWxlVmFsdWVzIHJldHVybnMgdGhlIHByb3BlcnRpZXMgYmVsb3csIGJ1dCBpbnN0ZWFkIHRoaXMgbWV0aG9kIHdpbGwgc2V0IHRoZW0uXG4gICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5wYWdlRml0SG9yaXpvbnRhbCA9IHBhZ2VGaXRIb3Jpem9udGFsO1xuICAgIGV4cG9ydExheW91dE9wdGlvbnMucGFnZUZpdFZlcnRpY2FsID0gcGFnZUZpdFZlcnRpY2FsO1xuICAgIGV4cG9ydExheW91dE9wdGlvbnMucGFnZVNjYWxlTW9kZSA9IHBhZ2VTY2FsZU1vZGU7XG4gICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5wYWdlU2NhbGVQZXJjZW50ID0gcGFnZVNjYWxlUGVyY2VudDtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGZpdFJlZ2V4ID0gbmV3IFJlZ0V4cCgnZml0KFswLTldKyl4KFswLTldKyknKTtcbiAgcHJpdmF0ZSBzdGF0aWMgcGN0UmVnZXggPSBuZXcgUmVnRXhwKCdwY3QoWzAtOV0rKScpO1xufVxuIiwiaW1wb3J0IHsgRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgRXJyb3JIZWxwZXJzIH0gZnJvbSAnLi9FcnJvckhlbHBlcnMnO1xuXG5leHBvcnQgY2xhc3MgUGFyYW0ge1xuICAvKipcbiAgICogc2VyaWFsaXplcyB0aGUgZGF0ZSBpbnRvIHRoZSBmb3JtYXQgdGhhdCB0aGUgc2VydmVyIGV4cGVjdHMuXG4gICAqIEBwYXJhbSBkYXRlIHRoZSBkYXRlIHRvIHNlcmlhbGl6ZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzZXJpYWxpemVEYXRlRm9yUGxhdGZvcm0oZGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgY29uc3QgeWVhcjogbnVtYmVyID0gZGF0ZS5nZXRVVENGdWxsWWVhcigpO1xuICAgIGNvbnN0IG1vbnRoOiBudW1iZXIgPSBkYXRlLmdldFVUQ01vbnRoKCkgKyAxO1xuICAgIGNvbnN0IGRheTogbnVtYmVyID0gZGF0ZS5nZXRVVENEYXRlKCk7XG4gICAgY29uc3QgaGg6IG51bWJlciA9IGRhdGUuZ2V0VVRDSG91cnMoKTtcbiAgICBjb25zdCBtbTogbnVtYmVyID0gZGF0ZS5nZXRVVENNaW51dGVzKCk7XG4gICAgY29uc3Qgc2VjOiBudW1iZXIgPSBkYXRlLmdldFVUQ1NlY29uZHMoKTtcbiAgICByZXR1cm4gYCR7eWVhcn0tJHttb250aH0tJHtkYXl9ICR7aGh9OiR7bW19OiR7c2VjfWA7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZUJvb2xlYW5Gb3JQbGF0Zm9ybShib29sOiBib29sZWFuKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYm9vbCA/ICd0cnVlJyA6ICdmYWxzZSc7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZU51bWJlckZvclBsYXRmb3JtKG51bTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbnVtLnRvU3RyaW5nKDEwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGUgaW5wdXQgaXMgYSBudW1iZXJcbiAgICovXG4gIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnkgKi9cbiAgcHVibGljIHN0YXRpYyBpc1R5cGVOdW1iZXIoaW5wdXQ6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0eXBlb2YgaW5wdXQgPT09ICdudW1iZXInIHx8IGlucHV0IGluc3RhbmNlb2YgTnVtYmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoZSBpbnB1dCBpcyBhIERhdGVcbiAgICovXG4gIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnkgKi9cbiAgcHVibGljIHN0YXRpYyBpc1R5cGVEYXRlKGlucHV0OiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaW5wdXQgaW5zdGFuY2VvZiBEYXRlO1xuICB9XG5cbiAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueSAqL1xuICBwdWJsaWMgc3RhdGljIGlzVHlwZVN0cmluZyhpbnB1dDogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycgfHwgaW5wdXQgaW5zdGFuY2VvZiBTdHJpbmc7XG4gIH1cblxuICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55ICovXG4gIHB1YmxpYyBzdGF0aWMgaXNUeXBlQm9vbChpbnB1dDogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHR5cGVvZiBpbnB1dCA9PT0gJ2Jvb2xlYW4nIHx8IGlucHV0IGluc3RhbmNlb2YgQm9vbGVhbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBpbnB1dCBpcyBudWxsIG9yIHVuZGVmaW5lZFxuICAgKi9cbiAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueSAqL1xuICBwdWJsaWMgc3RhdGljIGlzTnVsbE9yVW5kZWZpbmVkKGlucHV0OiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaW5wdXQgPT09IG51bGwgfHwgaW5wdXQgPT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnkgKi9cbiAgcHVibGljIHN0YXRpYyBzZXJpYWxpemVQYXJhbWV0ZXJWYWx1ZSh2YWx1ZTogYW55KTogc3RyaW5nIHtcbiAgICBpZiAoUGFyYW0uaXNUeXBlTnVtYmVyKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIFBhcmFtLnNlcmlhbGl6ZU51bWJlckZvclBsYXRmb3JtKHZhbHVlIGFzIG51bWJlcik7XG4gICAgfSBlbHNlIGlmIChQYXJhbS5pc1R5cGVEYXRlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIFBhcmFtLnNlcmlhbGl6ZURhdGVGb3JQbGF0Zm9ybSh2YWx1ZSBhcyBEYXRlKTtcbiAgICB9IGVsc2UgaWYgKFBhcmFtLmlzVHlwZUJvb2wodmFsdWUpKSB7XG4gICAgICByZXR1cm4gUGFyYW0uc2VyaWFsaXplQm9vbGVhbkZvclBsYXRmb3JtKHZhbHVlIGFzIGJvb2xlYW4pO1xuICAgIH0gZWxzZSBpZiAoUGFyYW0uaXNUeXBlU3RyaW5nKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFVuZXhwZWN0ZWQgaW52YWxpZCB2YWx1ZSBmb3I6ICR7dmFsdWV9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoYXQgdGhlIHBhcmFtZXRlciBpcyBhbHJlYWR5IGEgTWFwLCBvciBjb252ZXJ0cyBhbiBvYmplY3QgdG8gYSBNYXAuXG4gICAqIElmIHRoZSBwYXJhbWV0ZXIgaXMgYW4gb2JqZWN0LCB3ZSBjb252ZXJ0IGl0IHRvIGEgTWFwIHVzaW5nIE9iamVjdC5lbnRyaWVzLlxuICAgKiBAdGhyb3dzIGlmIHRoZSBwYXJhbWV0ZXIgaXMgbm90IGFuIG9iamVjdCBvciBNYXBcbiAgICovXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgcHVibGljIHN0YXRpYyBjb252ZXJ0UGFyYW1ldGVyVG9NYXAocGFyYW06IG9iamVjdCwgcGFyYW1OYW1lOiBzdHJpbmcpOiBNYXA8YW55LCBhbnk+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyVHlwZShwYXJhbSwgJ29iamVjdCcsIHBhcmFtTmFtZSk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocGFyYW0pKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgYEV4cGVjdGluZyBvYmplY3Qgb3IgTWFwIGZvcjogJHtwYXJhbU5hbWV9LmApO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJhbSBpbnN0YW5jZW9mIE1hcCA/IHBhcmFtIDogbmV3IE1hcChPYmplY3QuZW50cmllcyhwYXJhbSkpO1xuICB9XG5cbiAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueSAqL1xuICBwdWJsaWMgc3RhdGljIHRyeVBhcnNlTnVtYmVyKHZhbHVlOiBhbnkpOiB7IHBhcnNlZD86IG51bWJlcjsgc3VjY2VzczogYm9vbGVhbiB9IHtcbiAgICBpZiAoUGFyYW0uaXNOdWxsT3JVbmRlZmluZWQodmFsdWUpKSB7XG4gICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIGlmIChQYXJhbS5pc1R5cGVOdW1iZXIodmFsdWUpKSB7XG4gICAgICByZXR1cm4geyBwYXJzZWQ6IHZhbHVlIGFzIG51bWJlciwgc3VjY2VzczogdHJ1ZSB9O1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlU3RyaW5nID0gdmFsdWUudG9TdHJpbmcoKTtcbiAgICBpZiAodmFsdWVTdHJpbmcgPT09ICdOYU4nKSB7XG4gICAgICAvLyAnTmFOJyBwYXJzZXMgYXMgTmFOIHdoaWNoIGlzIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gYSBmYWlsZWQgcGFyc2UuXG4gICAgICByZXR1cm4geyBwYXJzZWQ6IE5hTiwgc3VjY2VzczogdHJ1ZSB9O1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlRmxvYXQodmFsdWVTdHJpbmcpO1xuICAgIGlmIChpc05hTihwYXJzZWQpKSB7XG4gICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IHBhcnNlZCwgc3VjY2VzczogdHJ1ZSB9O1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgU2hlZXRJbmZvLCBTaGVldFR5cGUsIFNpemVDb25zdHJhaW50IH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uL1RhYmxlYXVFcnJvcic7XG5cbmV4cG9ydCBjbGFzcyBTaGVldFV0aWxzIHtcbiAgLy8gVGhpcyBpcyBhIGRpcmVjdCBwb3J0IGZyb20gU2hlZXRTaXplLmNzIC0gU2hlZXRTaXplRmFjdG9yeVxuICBwdWJsaWMgc3RhdGljIGdldFNoZWV0U2l6ZUZyb21TaXplQ29uc3RyYWludHMoc2l6ZUNvbnN0cmFpbnQ6IFNpemVDb25zdHJhaW50KTogQ29udHJhY3QuU2hlZXRTaXplIHtcbiAgICBjb25zdCB7IG1pbldpZHRoLCBtaW5IZWlnaHQsIG1heFdpZHRoLCBtYXhIZWlnaHQgfSA9IHNpemVDb25zdHJhaW50O1xuXG4gICAgaWYgKG1pbkhlaWdodCA9PT0gMCAmJiBtaW5XaWR0aCA9PT0gMCkge1xuICAgICAgaWYgKG1heEhlaWdodCA9PT0gMCAmJiBtYXhXaWR0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGJlaGF2aW9yOiBDb250cmFjdC5TaGVldFNpemVCZWhhdmlvci5BdXRvbWF0aWMsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGJlaGF2aW9yOiBDb250cmFjdC5TaGVldFNpemVCZWhhdmlvci5BdE1vc3QsXG4gICAgICAgIG1heFNpemU6IHsgd2lkdGg6IG1heFdpZHRoLCBoZWlnaHQ6IG1heEhlaWdodCB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAobWF4SGVpZ2h0ID09PSAwICYmIG1heFdpZHRoID09PSAwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBiZWhhdmlvcjogQ29udHJhY3QuU2hlZXRTaXplQmVoYXZpb3IuQXRMZWFzdCxcbiAgICAgICAgbWluU2l6ZTogeyB3aWR0aDogbWluV2lkdGgsIGhlaWdodDogbWluSGVpZ2h0IH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChtYXhIZWlnaHQgPT09IG1pbkhlaWdodCAmJiBtYXhXaWR0aCA9PT0gbWluV2lkdGggJiYgbWluV2lkdGggPiAwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBiZWhhdmlvcjogQ29udHJhY3QuU2hlZXRTaXplQmVoYXZpb3IuRXhhY3RseSxcbiAgICAgICAgbWluU2l6ZTogeyB3aWR0aDogbWluV2lkdGgsIGhlaWdodDogbWluSGVpZ2h0IH0sXG4gICAgICAgIG1heFNpemU6IHsgd2lkdGg6IG1pbldpZHRoLCBoZWlnaHQ6IG1pbkhlaWdodCB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyAnRml0IFdpZHRoJyBmb3IgYSBEU0QgbGF5b3V0XG4gICAgY29uc3QgaXNEc2RMYXlvdXQgPSBtaW5XaWR0aCA9PT0gMCAmJiBtYXhXaWR0aCA9PT0gMDtcblxuICAgIHJldHVybiB7XG4gICAgICBiZWhhdmlvcjogQ29udHJhY3QuU2hlZXRTaXplQmVoYXZpb3IuUmFuZ2UsXG4gICAgICBtaW5TaXplOiB7IHdpZHRoOiBtaW5XaWR0aCwgaGVpZ2h0OiBtaW5IZWlnaHQgfSxcbiAgICAgIG1heFNpemU6IHsgd2lkdGg6IGlzRHNkTGF5b3V0ID8gMjE0NzQ4MzY0NyA6IG1heFdpZHRoLCBoZWlnaHQ6IG1heEhlaWdodCB9LFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGNyZWF0ZUF1dG9tYXRpY1NpemUoKTogQ29udHJhY3QuU2hlZXRTaXplIHtcbiAgICBsZXQgYmVoYXZpb3IgPSBDb250cmFjdC5TaGVldFNpemVCZWhhdmlvci5BdXRvbWF0aWM7XG4gICAgbGV0IG1pblNpemUgPSB7IHdpZHRoOiAwLCBoZWlnaHQ6IDAgfTtcbiAgICBsZXQgbWF4U2l6ZSA9IHsgd2lkdGg6IDAsIGhlaWdodDogMCB9O1xuICAgIHJldHVybiB7IGJlaGF2aW9yLCBtaW5TaXplLCBtYXhTaXplIH07XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGdldFB1Ymxpc2hlZFNoZWV0SW5mb0J5TmFtZShuYW1lOiBzdHJpbmcsIHNoZWV0SW5mb3M6IEFycmF5PFNoZWV0SW5mbz4pOiBTaGVldEluZm8gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHNoZWV0SW5mbyA9IHNoZWV0SW5mb3MuZmluZCgoc2hlZXQpID0+IHNoZWV0Lm5hbWUgPT09IG5hbWUpO1xuICAgIHJldHVybiBzaGVldEluZm87XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGdldFNoZWV0VHlwZUVudW0oaW50ZXJuYWxTaGVldFR5cGU6IFNoZWV0VHlwZSk6IENvbnRyYWN0LlNoZWV0VHlwZSB7XG4gICAgbGV0IHNoZWV0VHlwZTogQ29udHJhY3QuU2hlZXRUeXBlO1xuICAgIHN3aXRjaCAoaW50ZXJuYWxTaGVldFR5cGUpIHtcbiAgICAgIGNhc2UgU2hlZXRUeXBlLldvcmtzaGVldDoge1xuICAgICAgICBzaGVldFR5cGUgPSBDb250cmFjdC5TaGVldFR5cGUuV29ya3NoZWV0O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgU2hlZXRUeXBlLkRhc2hib2FyZDoge1xuICAgICAgICBzaGVldFR5cGUgPSBDb250cmFjdC5TaGVldFR5cGUuRGFzaGJvYXJkO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgU2hlZXRUeXBlLlN0b3J5OiB7XG4gICAgICAgIHNoZWV0VHlwZSA9IENvbnRyYWN0LlNoZWV0VHlwZS5TdG9yeTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuU2hhcmVkRXJyb3JDb2Rlcy5TZXJ2ZXJFcnJvciwgJ0ludmFsaWQgU2hlZXRUeXBlJyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzaGVldFR5cGU7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzVmFsaWRTaGVldFNpemUoc2l6ZU9iamVjdDogQ29udHJhY3QuU2l6ZSB8IENvbnRyYWN0LlNoZWV0U2l6ZSk6IHNpemVPYmplY3QgaXMgQ29udHJhY3QuU2hlZXRTaXplIHtcbiAgICByZXR1cm4gKDxDb250cmFjdC5TaGVldFNpemU+c2l6ZU9iamVjdCkuYmVoYXZpb3IgIT09IHVuZGVmaW5lZDtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uL1RhYmxlYXVFcnJvcic7XG5pbXBvcnQgeyBEZWZlcnJlZCwgVW5yZWdpc3RlclRpbWVvdXRJbk1pbGxpc2Vjb25kcyB9IGZyb20gJy4vRGVmZXJyZWQnO1xuXG4vKipcbiAqIEEgRGVmZXJyZWQgd3JhcHBlciBjbGFzcyBhZGRpbmcgZnVuY3Rpb25hbGl0eSB0byByZWplY3QgdW5yZXNwb25zaXZlIHByb21pc2VzIGFmdGVyIHRpbWVvdXRcbiAqXG4gKiB0aGlzIGNsYXNzIGhhbmRsZXMgdHdvIHRoaW5nczpcblxuICogICAgMS4gQWRkcyB0aW1lb3V0IGxvZ2ljIGZvciBkZWZlcnJlZFxuICogICAgMi4gSXQgYmxvY2tzIG11bHRpcGxlIGNhbGxzIGZyb20gZXhlY3V0aW5nIGF0IHRoZSBzYW1lIHRpbWUuXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIFNob3J0TGl2ZWREZWZlcnJlZFxuICogQHRlbXBsYXRlIFRSZXNvbHZlIFRoZSB0eXBlIHVzZWQgdG8gcmVzb2x2ZSB0aGUgcHJvbWlzZS5cbiAqIEB0ZW1wbGF0ZSBUUmVqZWN0IFRoZSB0eXBlIHVzZWQgdG8gcmVqZWN0IHRoZSBwcm9taXNlLiBEZWZhdWx0cyB0byBhbnkuXG4gKlxuICovXG5leHBvcnQgY2xhc3MgU2hvcnRMaXZlZERlZmVycmVkPFRSZXNvbHZlLCBUUmVqZWN0ID0gYW55PiB7XG4gIHByaXZhdGUgX2RlZmVycmVkOiBEZWZlcnJlZDxUUmVzb2x2ZSwgVFJlamVjdD4gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX3RpbWVvdXRJZDtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfdGltZW91dEluTWlsbGlzZWNvbmRzID0gVW5yZWdpc3RlclRpbWVvdXRJbk1pbGxpc2Vjb25kcykge31cblxuICBwdWJsaWMgZ2V0TmV3UHJvbWlzZU9yVGhyb3dJZkJ1c3koKTogUHJvbWlzZTxUUmVzb2x2ZT4ge1xuICAgIGlmICh0aGlzLl9kZWZlcnJlZCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5TaGFyZWRFcnJvckNvZGVzLkFwaUV4ZWN1dGlvbkVycm9yLCAnVGhpcyBhcGkgY2Fubm90IGJlIGV4ZWN1dGVkIHRpbGwgcHJldmlvdXMgY2FsbCBpcyByZXNvbHZlZC4nKTtcbiAgICB9XG4gICAgdGhpcy5fZGVmZXJyZWQgPSBuZXcgRGVmZXJyZWQoKTtcblxuICAgIHRoaXMuX3RpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgICBDb250cmFjdC5TaGFyZWRFcnJvckNvZGVzLlRpbWVvdXQsXG4gICAgICAgIGBBcGkgZmFpbGVkIHRvIGNvbXBsZXRlIGluICR7dGhpcy5fdGltZW91dEluTWlsbGlzZWNvbmRzIC8gMTAwMH0gc2Vjb25kc2AsXG4gICAgICApO1xuICAgICAgdGhpcy5yZWplY3QoZXJyb3IpO1xuICAgIH0sIHRoaXMuX3RpbWVvdXRJbk1pbGxpc2Vjb25kcyk7XG5cbiAgICByZXR1cm4gdGhpcy5fZGVmZXJyZWQucHJvbWlzZTtcbiAgfVxuXG4gIHB1YmxpYyByZXNvbHZlKHJlc3BvbnNlOiBUUmVzb2x2ZSB8IFByb21pc2VMaWtlPFRSZXNvbHZlPik6IHZvaWQge1xuICAgIGlmICh0aGlzLl9kZWZlcnJlZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXRJZCk7XG4gICAgICB0aGlzLl9kZWZlcnJlZC5yZXNvbHZlKHJlc3BvbnNlKTtcbiAgICAgIHRoaXMuX2RlZmVycmVkID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZWplY3QoZXJyb3I6IGFueSk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9kZWZlcnJlZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXRJZCk7XG4gICAgICB0aGlzLl9kZWZlcnJlZC5yZWplY3QoZXJyb3IpO1xuICAgICAgdGhpcy5fZGVmZXJyZWQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBFcnJvckNvZGVzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4vVGFibGVhdUVycm9yJztcbmltcG9ydCB7IFZlcnNpb25OdW1iZXJDb250cmFjdCB9IGZyb20gJy4vVmVyc2lvbk51bWJlckNvbnRyYWN0JztcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIGV4dGVuc2lvbnMsIGVtYmVkZGluZ1xuICogYW5kIGV4dGVuc2lvbnMtYXBpLXR5cGVzIGxpYnJhcnlcbiAqL1xuZXhwb3J0IGNsYXNzIFZlcnNpb25OdW1iZXIgaW1wbGVtZW50cyBWZXJzaW9uTnVtYmVyQ29udHJhY3Qge1xuICBwdWJsaWMgbWFqb3I6IG51bWJlcjtcbiAgcHVibGljIG1pbm9yOiBudW1iZXI7XG4gIHB1YmxpYyBmaXg6IG51bWJlcjtcbiAgcHVibGljIGJ1aWxkOiBudW1iZXI7XG4gIHB1YmxpYyBpc0FscGhhOiBib29sZWFuO1xuXG4gIC8vIHByaXZhdGUgY29uc3RydWN0b3Igc28gZXZlcnlvbmUgdXNlcyB0aGUgc2luZ2xldG9uIGluc3RhbmNlXG4gIC8vIGJ1aWxkIG51bWJlcnMgaGF2ZSB0aGlzIGZvcm06IE0ubS5mLXByZS5OXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih2ZXJzaW9uU3RyaW5nOiBzdHJpbmcsIGlzQWxwaGE6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBwYXJ0U3RyID0gdmVyc2lvblN0cmluZy5zcGxpdCgnLScpO1xuICAgIHRoaXMuYnVpbGQgPSB0aGlzLmdldEJ1aWxkTnVtYmVyKHBhcnRTdHJbMV0pO1xuICAgIHZlcnNpb25TdHJpbmcgPSBwYXJ0U3RyWzBdO1xuXG4gICAgY29uc3QgcGFydHMgPSB2ZXJzaW9uU3RyaW5nLnNwbGl0KCcuJykubWFwKChwKSA9PiBwYXJzZUludChwLCAxMCkpO1xuICAgIGlmIChwYXJ0cy5sZW5ndGggIT09IDMpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgSW52YWxpZCB2ZXJzaW9uIG51bWJlcjogJHt2ZXJzaW9uU3RyaW5nfWApO1xuICAgIH1cblxuICAgIHRoaXMubWFqb3IgPSBwYXJ0c1swXTtcbiAgICB0aGlzLm1pbm9yID0gcGFydHNbMV07XG4gICAgdGhpcy5maXggPSBwYXJ0c1syXTtcbiAgICB0aGlzLmlzQWxwaGEgPSBpc0FscGhhO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRCdWlsZE51bWJlcihwcmVSZWxlYXNlU3RyaW5nOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGNvbnN0IG5vQnVpbGROdW1iZXIgPSAtMTtcbiAgICBpZiAoIXByZVJlbGVhc2VTdHJpbmcpIHtcbiAgICAgIHJldHVybiBub0J1aWxkTnVtYmVyO1xuICAgIH1cblxuICAgIC8vIFRoZSBwcmVSZWxlYXNlIHN0cmluZyBoYXMgdGhpcyBmb3JtOiBwcmUuTiwgYnV0IHdlIGRvbid0IGRlcGVuZCBvbiB0aGUgYWN0dWFsIHN0cmluZyBiZWluZyAncHJlJ1xuICAgIGNvbnN0IHBhcnRTdHIgPSBwcmVSZWxlYXNlU3RyaW5nLnNwbGl0KCcuJyk7XG4gICAgcmV0dXJuIHBhcnRTdHJbMV0gPyBwYXJzZUludChwYXJ0U3RyWzFdLCAxMCkgOiBub0J1aWxkTnVtYmVyO1xuICB9XG5cbiAgcHVibGljIGdldCBmb3JtYXR0ZWRWYWx1ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLm1ham9yfS4ke3RoaXMubWlub3J9LiR7dGhpcy5maXh9YDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZnVsbEZvcm1hdHRlZFZhbHVlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMubWFqb3J9LiR7dGhpcy5taW5vcn0uJHt0aGlzLmZpeH0tcHJlLiR7dGhpcy5idWlsZH1gO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBDcmVhdGVFeHRlcm5hbENvbXBhdGlibGVWZXJzaW9uQ29udmVydGVyLFxuICBFeGVjdXRlUGFyYW1ldGVycyxcbiAgRXhlY3V0ZVJlc3BvbnNlLFxuICBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcixcbiAgSW50ZXJuYWxBcGlEaXNwYXRjaGVyLFxuICBJTlRFUk5BTF9DT05UUkFDVF9WRVJTSU9OLFxuICBOb3RpZmljYXRpb24sXG4gIE5vdGlmaWNhdGlvbkhhbmRsZXIsXG4gIFZlcmJJZCxcbiAgVmVyc2lvbkxlc3NUaGFuLFxuICBWZXJzaW9uTnVtYmVyLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBJbnRlcm5hbEFwaURpc3BhdGNoZXIgd2hpY2ggc3VwcG9ydHMgdXBncmFkaW5nIGFuZCBkb3duZ3JhZGluZyB0aGUgaW5wdXRcbiAqIGludGVybmFsIGNvbnRyYWN0IHRvIHRoZSB2ZXJzaW9uIHRoYXQgdGhpcyBtb2R1bGUgaXMgYnVpbHQgYWdhaW5zdFxuICpcbiAqIEBjbGFzcyBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXJcbiAqIEBpbXBsZW1lbnRzIHtJbnRlcm5hbEFwaURpc3BhdGNoZXJ9XG4gKi9cbmV4cG9ydCBjbGFzcyBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIgaW1wbGVtZW50cyBJbnRlcm5hbEFwaURpc3BhdGNoZXIge1xuICBwcml2YXRlIF92ZXJzaW9uQ29udmVydGVyOiBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcjtcbiAgcHJpdmF0ZSBfbm90aWZpY2F0aW9uSGFuZGxlcnM6IEFycmF5PE5vdGlmaWNhdGlvbkhhbmRsZXI+O1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXJcbiAgICogV2UgaGF2ZSBtdWx0aXBsZSB2ZXJzaW9uIGNvbnZlcnRpbmcgZGlzcGF0Y2hlcnMgdGhhdCB3b3JrIHRvZ2V0aGVyLlxuICAgKiBJZiBuZWVkZWQsIHRoZSBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIgd3JhcHMgZWl0aGVyIHRoZSBJbnRlcm5hbEFwaURpc3BhdGNoZXIgKGRlc2t0b3ApXG4gICAqIG9yIHRoZSBDcm9zc0ZyYW1lRGlzcGF0Y2hlciAoc2VydmVyKS5cbiAgICogVGhlIEludGVybmFsL0Nyb3NzRnJhbWUgZGlzcGF0Y2hlcnMgaGFuZGxlIGFuIHVwZGF0ZWQgcGxhdGZvcm0gd2l0aCBhbiBvbGRlciBleHRlcm5hbCBsaWJyYXJ5LlxuICAgKiAoVGhlIENyb3NzRnJhbWVEaXNwYXRjaGVyIHNlbmRzIG1lc3NhZ2VzIGFjcm9zcyB0aGUgZnJhbWUsIGFuZCBpdCBpcyBoYW5kbGVkIGJ5IHRoZSBQcmVzTGF5ZXJIYW5kbGVyLilcbiAgICogTWVhbndoaWxlLCB0aGUgVmVyc2lvbmVkRXh0ZXJuYWxBcGlEaXNwYXRjaGVyIGhhbmRsZXMgYW4gdXBkYXRlZCBleHRlcm5hbCBsaWJyYXJ5IHdpdGggYW4gb2xkZXIgcGxhdGZvcm0uXG5cbiAgICogQHBhcmFtIF9hcGlEZWxlZ2F0ZURpc3BhdGNoZXIgVGhlIGRlbGVnYXRlIHRoYXQgZG9lcyB0aGUgYWN0dWFsIHdvcmsuXG4gICAqIEBwYXJhbSBwbGF0Zm9ybVZlcnNpb25OdW1iZXIgVGhlIHZlcnNpb24gb2YgdGhlIGludGVybmFsIGNvbnRyYWN0IHdoaWNoIHRoZSBwbGF0Zm9ybSBtb2R1bGUgaXMgdXNpbmcuXG4gICAqIFRoaXMgbnVtYmVyIHdpbGwgYmUgdXNlZCB0byBmaWd1cmUgb3V0IGhvdyB0byBkb3duZ3JhZGUgaW5jb21pbmcgY29tbWFuZHMgYW5kIHVwZ3JhZGUgdGhlIHJlc3VsdHNcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9hcGlEZWxlZ2F0ZURpc3BhdGNoZXI6IEludGVybmFsQXBpRGlzcGF0Y2hlciwgcGxhdGZvcm1WZXJzaW9uTnVtYmVyOiBWZXJzaW9uTnVtYmVyKSB7XG4gICAgdGhpcy5fdmVyc2lvbkNvbnZlcnRlciA9IENyZWF0ZUV4dGVybmFsQ29tcGF0aWJsZVZlcnNpb25Db252ZXJ0ZXIoSU5URVJOQUxfQ09OVFJBQ1RfVkVSU0lPTiwgcGxhdGZvcm1WZXJzaW9uTnVtYmVyKTtcblxuICAgIHRoaXMuX25vdGlmaWNhdGlvbkhhbmRsZXJzID0gW107XG4gICAgX2FwaURlbGVnYXRlRGlzcGF0Y2hlci5yZWdpc3Rlck5vdGlmaWNhdGlvbkhhbmRsZXIoKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uKTogdm9pZCA9PiB7XG4gICAgICBpZiAodGhpcy5fbm90aWZpY2F0aW9uSGFuZGxlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHVwZ3JhZGVkTm90aWZpY2F0aW9uID0gdGhpcy5fdmVyc2lvbkNvbnZlcnRlci51cGdyYWRlTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbik7XG4gICAgICB0aGlzLl9ub3RpZmljYXRpb25IYW5kbGVycy5mb3JFYWNoKChoYW5kbGVyKSA9PiB7XG4gICAgICAgIGhhbmRsZXIodXBncmFkZWROb3RpZmljYXRpb24pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIG5lZWRzVmVyc2lvbkNvbnZlcnRlcihwbGF0Zm9ybVZlcnNpb246IFZlcnNpb25OdW1iZXIpOiBib29sZWFuIHtcbiAgICAvLyBJZiBvdXIgcGxhdGZvcm0gaXMgbGVzcyB0aGFuIGV4dGVybmFsIGxpYnJhcnkgdmVyc2lvbiwgdGhlbiB3ZSBuZWVkIGEgY29udmVydGVyXG4gICAgcmV0dXJuIFZlcnNpb25MZXNzVGhhbihwbGF0Zm9ybVZlcnNpb24sIElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT04pO1xuICB9XG5cbiAgcHVibGljIGV4ZWN1dGUodmVyYjogVmVyYklkLCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyk6IFByb21pc2U8RXhlY3V0ZVJlc3BvbnNlPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRvd25ncmFkZVBhcmFtZXRlcnMgPSB0aGlzLl92ZXJzaW9uQ29udmVydGVyLmRvd25ncmFkZUV4ZWN1dGVDYWxsKHZlcmIsIHBhcmFtZXRlcnMpO1xuICAgICAgcmV0dXJuIHRoaXMuX2FwaURlbGVnYXRlRGlzcGF0Y2hlci5leGVjdXRlKGRvd25ncmFkZVBhcmFtZXRlcnMudmVyYiwgZG93bmdyYWRlUGFyYW1ldGVycy5wYXJhbWV0ZXJzKS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICBjb25zdCB1cGdyYWRlUmVzcG9uc2UgPSB0aGlzLl92ZXJzaW9uQ29udmVydGVyLnVwZ3JhZGVFeGVjdXRlUmV0dXJuKHJlc3BvbnNlLCB2ZXJiLCBwYXJhbWV0ZXJzKTtcbiAgICAgICAgcmV0dXJuIHVwZ3JhZGVSZXNwb25zZTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJOb3RpZmljYXRpb25IYW5kbGVyKGhhbmRsZXI6IE5vdGlmaWNhdGlvbkhhbmRsZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9ub3RpZmljYXRpb25IYW5kbGVycy5wdXNoKGhhbmRsZXIpO1xuICB9XG5cbiAgcHVibGljIHVucmVnaXN0ZXJOb3RpZmljYXRpb25IYW5kbGVyKGhhbmRsZXI6IE5vdGlmaWNhdGlvbkhhbmRsZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9ub3RpZmljYXRpb25IYW5kbGVycyA9IHRoaXMuX25vdGlmaWNhdGlvbkhhbmRsZXJzLmZpbHRlcigoaCkgPT4gaCAhPT0gaGFuZGxlcik7XG4gIH1cbn1cbiIsImV4cG9ydCB7IGRlZmF1bHQgYXMgdjEgfSBmcm9tICcuL3YxLmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdjMgfSBmcm9tICcuL3YzLmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdjQgfSBmcm9tICcuL3Y0LmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdjUgfSBmcm9tICcuL3Y1LmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgTklMIH0gZnJvbSAnLi9uaWwuanMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB2ZXJzaW9uIH0gZnJvbSAnLi92ZXJzaW9uLmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdmFsaWRhdGUgfSBmcm9tICcuL3ZhbGlkYXRlLmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgc3RyaW5naWZ5IH0gZnJvbSAnLi9zdHJpbmdpZnkuanMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBwYXJzZSB9IGZyb20gJy4vcGFyc2UuanMnOyIsIi8qXG4gKiBCcm93c2VyLWNvbXBhdGlibGUgSmF2YVNjcmlwdCBNRDVcbiAqXG4gKiBNb2RpZmljYXRpb24gb2YgSmF2YVNjcmlwdCBNRDVcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ibHVlaW1wL0phdmFTY3JpcHQtTUQ1XG4gKlxuICogQ29weXJpZ2h0IDIwMTEsIFNlYmFzdGlhbiBUc2NoYW5cbiAqIGh0dHBzOi8vYmx1ZWltcC5uZXRcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2U6XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVFxuICpcbiAqIEJhc2VkIG9uXG4gKiBBIEphdmFTY3JpcHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuIE1ENSBNZXNzYWdlXG4gKiBEaWdlc3QgQWxnb3JpdGhtLCBhcyBkZWZpbmVkIGluIFJGQyAxMzIxLlxuICogVmVyc2lvbiAyLjIgQ29weXJpZ2h0IChDKSBQYXVsIEpvaG5zdG9uIDE5OTkgLSAyMDA5XG4gKiBPdGhlciBjb250cmlidXRvcnM6IEdyZWcgSG9sdCwgQW5kcmV3IEtlcGVydCwgWWRuYXIsIExvc3RpbmV0XG4gKiBEaXN0cmlidXRlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2VcbiAqIFNlZSBodHRwOi8vcGFqaG9tZS5vcmcudWsvY3J5cHQvbWQ1IGZvciBtb3JlIGluZm8uXG4gKi9cbmZ1bmN0aW9uIG1kNShieXRlcykge1xuICBpZiAodHlwZW9mIGJ5dGVzID09PSAnc3RyaW5nJykge1xuICAgIHZhciBtc2cgPSB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoYnl0ZXMpKTsgLy8gVVRGOCBlc2NhcGVcblxuICAgIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkobXNnLmxlbmd0aCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1zZy5sZW5ndGg7ICsraSkge1xuICAgICAgYnl0ZXNbaV0gPSBtc2cuY2hhckNvZGVBdChpKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWQ1VG9IZXhFbmNvZGVkQXJyYXkod29yZHNUb01kNShieXRlc1RvV29yZHMoYnl0ZXMpLCBieXRlcy5sZW5ndGggKiA4KSk7XG59XG4vKlxuICogQ29udmVydCBhbiBhcnJheSBvZiBsaXR0bGUtZW5kaWFuIHdvcmRzIHRvIGFuIGFycmF5IG9mIGJ5dGVzXG4gKi9cblxuXG5mdW5jdGlvbiBtZDVUb0hleEVuY29kZWRBcnJheShpbnB1dCkge1xuICB2YXIgb3V0cHV0ID0gW107XG4gIHZhciBsZW5ndGgzMiA9IGlucHV0Lmxlbmd0aCAqIDMyO1xuICB2YXIgaGV4VGFiID0gJzAxMjM0NTY3ODlhYmNkZWYnO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoMzI7IGkgKz0gOCkge1xuICAgIHZhciB4ID0gaW5wdXRbaSA+PiA1XSA+Pj4gaSAlIDMyICYgMHhmZjtcbiAgICB2YXIgaGV4ID0gcGFyc2VJbnQoaGV4VGFiLmNoYXJBdCh4ID4+PiA0ICYgMHgwZikgKyBoZXhUYWIuY2hhckF0KHggJiAweDBmKSwgMTYpO1xuICAgIG91dHB1dC5wdXNoKGhleCk7XG4gIH1cblxuICByZXR1cm4gb3V0cHV0O1xufVxuLyoqXG4gKiBDYWxjdWxhdGUgb3V0cHV0IGxlbmd0aCB3aXRoIHBhZGRpbmcgYW5kIGJpdCBsZW5ndGhcbiAqL1xuXG5cbmZ1bmN0aW9uIGdldE91dHB1dExlbmd0aChpbnB1dExlbmd0aDgpIHtcbiAgcmV0dXJuIChpbnB1dExlbmd0aDggKyA2NCA+Pj4gOSA8PCA0KSArIDE0ICsgMTtcbn1cbi8qXG4gKiBDYWxjdWxhdGUgdGhlIE1ENSBvZiBhbiBhcnJheSBvZiBsaXR0bGUtZW5kaWFuIHdvcmRzLCBhbmQgYSBiaXQgbGVuZ3RoLlxuICovXG5cblxuZnVuY3Rpb24gd29yZHNUb01kNSh4LCBsZW4pIHtcbiAgLyogYXBwZW5kIHBhZGRpbmcgKi9cbiAgeFtsZW4gPj4gNV0gfD0gMHg4MCA8PCBsZW4gJSAzMjtcbiAgeFtnZXRPdXRwdXRMZW5ndGgobGVuKSAtIDFdID0gbGVuO1xuICB2YXIgYSA9IDE3MzI1ODQxOTM7XG4gIHZhciBiID0gLTI3MTczMzg3OTtcbiAgdmFyIGMgPSAtMTczMjU4NDE5NDtcbiAgdmFyIGQgPSAyNzE3MzM4Nzg7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB4Lmxlbmd0aDsgaSArPSAxNikge1xuICAgIHZhciBvbGRhID0gYTtcbiAgICB2YXIgb2xkYiA9IGI7XG4gICAgdmFyIG9sZGMgPSBjO1xuICAgIHZhciBvbGRkID0gZDtcbiAgICBhID0gbWQ1ZmYoYSwgYiwgYywgZCwgeFtpXSwgNywgLTY4MDg3NjkzNik7XG4gICAgZCA9IG1kNWZmKGQsIGEsIGIsIGMsIHhbaSArIDFdLCAxMiwgLTM4OTU2NDU4Nik7XG4gICAgYyA9IG1kNWZmKGMsIGQsIGEsIGIsIHhbaSArIDJdLCAxNywgNjA2MTA1ODE5KTtcbiAgICBiID0gbWQ1ZmYoYiwgYywgZCwgYSwgeFtpICsgM10sIDIyLCAtMTA0NDUyNTMzMCk7XG4gICAgYSA9IG1kNWZmKGEsIGIsIGMsIGQsIHhbaSArIDRdLCA3LCAtMTc2NDE4ODk3KTtcbiAgICBkID0gbWQ1ZmYoZCwgYSwgYiwgYywgeFtpICsgNV0sIDEyLCAxMjAwMDgwNDI2KTtcbiAgICBjID0gbWQ1ZmYoYywgZCwgYSwgYiwgeFtpICsgNl0sIDE3LCAtMTQ3MzIzMTM0MSk7XG4gICAgYiA9IG1kNWZmKGIsIGMsIGQsIGEsIHhbaSArIDddLCAyMiwgLTQ1NzA1OTgzKTtcbiAgICBhID0gbWQ1ZmYoYSwgYiwgYywgZCwgeFtpICsgOF0sIDcsIDE3NzAwMzU0MTYpO1xuICAgIGQgPSBtZDVmZihkLCBhLCBiLCBjLCB4W2kgKyA5XSwgMTIsIC0xOTU4NDE0NDE3KTtcbiAgICBjID0gbWQ1ZmYoYywgZCwgYSwgYiwgeFtpICsgMTBdLCAxNywgLTQyMDYzKTtcbiAgICBiID0gbWQ1ZmYoYiwgYywgZCwgYSwgeFtpICsgMTFdLCAyMiwgLTE5OTA0MDQxNjIpO1xuICAgIGEgPSBtZDVmZihhLCBiLCBjLCBkLCB4W2kgKyAxMl0sIDcsIDE4MDQ2MDM2ODIpO1xuICAgIGQgPSBtZDVmZihkLCBhLCBiLCBjLCB4W2kgKyAxM10sIDEyLCAtNDAzNDExMDEpO1xuICAgIGMgPSBtZDVmZihjLCBkLCBhLCBiLCB4W2kgKyAxNF0sIDE3LCAtMTUwMjAwMjI5MCk7XG4gICAgYiA9IG1kNWZmKGIsIGMsIGQsIGEsIHhbaSArIDE1XSwgMjIsIDEyMzY1MzUzMjkpO1xuICAgIGEgPSBtZDVnZyhhLCBiLCBjLCBkLCB4W2kgKyAxXSwgNSwgLTE2NTc5NjUxMCk7XG4gICAgZCA9IG1kNWdnKGQsIGEsIGIsIGMsIHhbaSArIDZdLCA5LCAtMTA2OTUwMTYzMik7XG4gICAgYyA9IG1kNWdnKGMsIGQsIGEsIGIsIHhbaSArIDExXSwgMTQsIDY0MzcxNzcxMyk7XG4gICAgYiA9IG1kNWdnKGIsIGMsIGQsIGEsIHhbaV0sIDIwLCAtMzczODk3MzAyKTtcbiAgICBhID0gbWQ1Z2coYSwgYiwgYywgZCwgeFtpICsgNV0sIDUsIC03MDE1NTg2OTEpO1xuICAgIGQgPSBtZDVnZyhkLCBhLCBiLCBjLCB4W2kgKyAxMF0sIDksIDM4MDE2MDgzKTtcbiAgICBjID0gbWQ1Z2coYywgZCwgYSwgYiwgeFtpICsgMTVdLCAxNCwgLTY2MDQ3ODMzNSk7XG4gICAgYiA9IG1kNWdnKGIsIGMsIGQsIGEsIHhbaSArIDRdLCAyMCwgLTQwNTUzNzg0OCk7XG4gICAgYSA9IG1kNWdnKGEsIGIsIGMsIGQsIHhbaSArIDldLCA1LCA1Njg0NDY0MzgpO1xuICAgIGQgPSBtZDVnZyhkLCBhLCBiLCBjLCB4W2kgKyAxNF0sIDksIC0xMDE5ODAzNjkwKTtcbiAgICBjID0gbWQ1Z2coYywgZCwgYSwgYiwgeFtpICsgM10sIDE0LCAtMTg3MzYzOTYxKTtcbiAgICBiID0gbWQ1Z2coYiwgYywgZCwgYSwgeFtpICsgOF0sIDIwLCAxMTYzNTMxNTAxKTtcbiAgICBhID0gbWQ1Z2coYSwgYiwgYywgZCwgeFtpICsgMTNdLCA1LCAtMTQ0NDY4MTQ2Nyk7XG4gICAgZCA9IG1kNWdnKGQsIGEsIGIsIGMsIHhbaSArIDJdLCA5LCAtNTE0MDM3ODQpO1xuICAgIGMgPSBtZDVnZyhjLCBkLCBhLCBiLCB4W2kgKyA3XSwgMTQsIDE3MzUzMjg0NzMpO1xuICAgIGIgPSBtZDVnZyhiLCBjLCBkLCBhLCB4W2kgKyAxMl0sIDIwLCAtMTkyNjYwNzczNCk7XG4gICAgYSA9IG1kNWhoKGEsIGIsIGMsIGQsIHhbaSArIDVdLCA0LCAtMzc4NTU4KTtcbiAgICBkID0gbWQ1aGgoZCwgYSwgYiwgYywgeFtpICsgOF0sIDExLCAtMjAyMjU3NDQ2Myk7XG4gICAgYyA9IG1kNWhoKGMsIGQsIGEsIGIsIHhbaSArIDExXSwgMTYsIDE4MzkwMzA1NjIpO1xuICAgIGIgPSBtZDVoaChiLCBjLCBkLCBhLCB4W2kgKyAxNF0sIDIzLCAtMzUzMDk1NTYpO1xuICAgIGEgPSBtZDVoaChhLCBiLCBjLCBkLCB4W2kgKyAxXSwgNCwgLTE1MzA5OTIwNjApO1xuICAgIGQgPSBtZDVoaChkLCBhLCBiLCBjLCB4W2kgKyA0XSwgMTEsIDEyNzI4OTMzNTMpO1xuICAgIGMgPSBtZDVoaChjLCBkLCBhLCBiLCB4W2kgKyA3XSwgMTYsIC0xNTU0OTc2MzIpO1xuICAgIGIgPSBtZDVoaChiLCBjLCBkLCBhLCB4W2kgKyAxMF0sIDIzLCAtMTA5NDczMDY0MCk7XG4gICAgYSA9IG1kNWhoKGEsIGIsIGMsIGQsIHhbaSArIDEzXSwgNCwgNjgxMjc5MTc0KTtcbiAgICBkID0gbWQ1aGgoZCwgYSwgYiwgYywgeFtpXSwgMTEsIC0zNTg1MzcyMjIpO1xuICAgIGMgPSBtZDVoaChjLCBkLCBhLCBiLCB4W2kgKyAzXSwgMTYsIC03MjI1MjE5NzkpO1xuICAgIGIgPSBtZDVoaChiLCBjLCBkLCBhLCB4W2kgKyA2XSwgMjMsIDc2MDI5MTg5KTtcbiAgICBhID0gbWQ1aGgoYSwgYiwgYywgZCwgeFtpICsgOV0sIDQsIC02NDAzNjQ0ODcpO1xuICAgIGQgPSBtZDVoaChkLCBhLCBiLCBjLCB4W2kgKyAxMl0sIDExLCAtNDIxODE1ODM1KTtcbiAgICBjID0gbWQ1aGgoYywgZCwgYSwgYiwgeFtpICsgMTVdLCAxNiwgNTMwNzQyNTIwKTtcbiAgICBiID0gbWQ1aGgoYiwgYywgZCwgYSwgeFtpICsgMl0sIDIzLCAtOTk1MzM4NjUxKTtcbiAgICBhID0gbWQ1aWkoYSwgYiwgYywgZCwgeFtpXSwgNiwgLTE5ODYzMDg0NCk7XG4gICAgZCA9IG1kNWlpKGQsIGEsIGIsIGMsIHhbaSArIDddLCAxMCwgMTEyNjg5MTQxNSk7XG4gICAgYyA9IG1kNWlpKGMsIGQsIGEsIGIsIHhbaSArIDE0XSwgMTUsIC0xNDE2MzU0OTA1KTtcbiAgICBiID0gbWQ1aWkoYiwgYywgZCwgYSwgeFtpICsgNV0sIDIxLCAtNTc0MzQwNTUpO1xuICAgIGEgPSBtZDVpaShhLCBiLCBjLCBkLCB4W2kgKyAxMl0sIDYsIDE3MDA0ODU1NzEpO1xuICAgIGQgPSBtZDVpaShkLCBhLCBiLCBjLCB4W2kgKyAzXSwgMTAsIC0xODk0OTg2NjA2KTtcbiAgICBjID0gbWQ1aWkoYywgZCwgYSwgYiwgeFtpICsgMTBdLCAxNSwgLTEwNTE1MjMpO1xuICAgIGIgPSBtZDVpaShiLCBjLCBkLCBhLCB4W2kgKyAxXSwgMjEsIC0yMDU0OTIyNzk5KTtcbiAgICBhID0gbWQ1aWkoYSwgYiwgYywgZCwgeFtpICsgOF0sIDYsIDE4NzMzMTMzNTkpO1xuICAgIGQgPSBtZDVpaShkLCBhLCBiLCBjLCB4W2kgKyAxNV0sIDEwLCAtMzA2MTE3NDQpO1xuICAgIGMgPSBtZDVpaShjLCBkLCBhLCBiLCB4W2kgKyA2XSwgMTUsIC0xNTYwMTk4MzgwKTtcbiAgICBiID0gbWQ1aWkoYiwgYywgZCwgYSwgeFtpICsgMTNdLCAyMSwgMTMwOTE1MTY0OSk7XG4gICAgYSA9IG1kNWlpKGEsIGIsIGMsIGQsIHhbaSArIDRdLCA2LCAtMTQ1NTIzMDcwKTtcbiAgICBkID0gbWQ1aWkoZCwgYSwgYiwgYywgeFtpICsgMTFdLCAxMCwgLTExMjAyMTAzNzkpO1xuICAgIGMgPSBtZDVpaShjLCBkLCBhLCBiLCB4W2kgKyAyXSwgMTUsIDcxODc4NzI1OSk7XG4gICAgYiA9IG1kNWlpKGIsIGMsIGQsIGEsIHhbaSArIDldLCAyMSwgLTM0MzQ4NTU1MSk7XG4gICAgYSA9IHNhZmVBZGQoYSwgb2xkYSk7XG4gICAgYiA9IHNhZmVBZGQoYiwgb2xkYik7XG4gICAgYyA9IHNhZmVBZGQoYywgb2xkYyk7XG4gICAgZCA9IHNhZmVBZGQoZCwgb2xkZCk7XG4gIH1cblxuICByZXR1cm4gW2EsIGIsIGMsIGRdO1xufVxuLypcbiAqIENvbnZlcnQgYW4gYXJyYXkgYnl0ZXMgdG8gYW4gYXJyYXkgb2YgbGl0dGxlLWVuZGlhbiB3b3Jkc1xuICogQ2hhcmFjdGVycyA+MjU1IGhhdmUgdGhlaXIgaGlnaC1ieXRlIHNpbGVudGx5IGlnbm9yZWQuXG4gKi9cblxuXG5mdW5jdGlvbiBieXRlc1RvV29yZHMoaW5wdXQpIHtcbiAgaWYgKGlucHV0Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHZhciBsZW5ndGg4ID0gaW5wdXQubGVuZ3RoICogODtcbiAgdmFyIG91dHB1dCA9IG5ldyBVaW50MzJBcnJheShnZXRPdXRwdXRMZW5ndGgobGVuZ3RoOCkpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoODsgaSArPSA4KSB7XG4gICAgb3V0cHV0W2kgPj4gNV0gfD0gKGlucHV0W2kgLyA4XSAmIDB4ZmYpIDw8IGkgJSAzMjtcbiAgfVxuXG4gIHJldHVybiBvdXRwdXQ7XG59XG4vKlxuICogQWRkIGludGVnZXJzLCB3cmFwcGluZyBhdCAyXjMyLiBUaGlzIHVzZXMgMTYtYml0IG9wZXJhdGlvbnMgaW50ZXJuYWxseVxuICogdG8gd29yayBhcm91bmQgYnVncyBpbiBzb21lIEpTIGludGVycHJldGVycy5cbiAqL1xuXG5cbmZ1bmN0aW9uIHNhZmVBZGQoeCwgeSkge1xuICB2YXIgbHN3ID0gKHggJiAweGZmZmYpICsgKHkgJiAweGZmZmYpO1xuICB2YXIgbXN3ID0gKHggPj4gMTYpICsgKHkgPj4gMTYpICsgKGxzdyA+PiAxNik7XG4gIHJldHVybiBtc3cgPDwgMTYgfCBsc3cgJiAweGZmZmY7XG59XG4vKlxuICogQml0d2lzZSByb3RhdGUgYSAzMi1iaXQgbnVtYmVyIHRvIHRoZSBsZWZ0LlxuICovXG5cblxuZnVuY3Rpb24gYml0Um90YXRlTGVmdChudW0sIGNudCkge1xuICByZXR1cm4gbnVtIDw8IGNudCB8IG51bSA+Pj4gMzIgLSBjbnQ7XG59XG4vKlxuICogVGhlc2UgZnVuY3Rpb25zIGltcGxlbWVudCB0aGUgZm91ciBiYXNpYyBvcGVyYXRpb25zIHRoZSBhbGdvcml0aG0gdXNlcy5cbiAqL1xuXG5cbmZ1bmN0aW9uIG1kNWNtbihxLCBhLCBiLCB4LCBzLCB0KSB7XG4gIHJldHVybiBzYWZlQWRkKGJpdFJvdGF0ZUxlZnQoc2FmZUFkZChzYWZlQWRkKGEsIHEpLCBzYWZlQWRkKHgsIHQpKSwgcyksIGIpO1xufVxuXG5mdW5jdGlvbiBtZDVmZihhLCBiLCBjLCBkLCB4LCBzLCB0KSB7XG4gIHJldHVybiBtZDVjbW4oYiAmIGMgfCB+YiAmIGQsIGEsIGIsIHgsIHMsIHQpO1xufVxuXG5mdW5jdGlvbiBtZDVnZyhhLCBiLCBjLCBkLCB4LCBzLCB0KSB7XG4gIHJldHVybiBtZDVjbW4oYiAmIGQgfCBjICYgfmQsIGEsIGIsIHgsIHMsIHQpO1xufVxuXG5mdW5jdGlvbiBtZDVoaChhLCBiLCBjLCBkLCB4LCBzLCB0KSB7XG4gIHJldHVybiBtZDVjbW4oYiBeIGMgXiBkLCBhLCBiLCB4LCBzLCB0KTtcbn1cblxuZnVuY3Rpb24gbWQ1aWkoYSwgYiwgYywgZCwgeCwgcywgdCkge1xuICByZXR1cm4gbWQ1Y21uKGMgXiAoYiB8IH5kKSwgYSwgYiwgeCwgcywgdCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IG1kNTsiLCJleHBvcnQgZGVmYXVsdCAnMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwJzsiLCJpbXBvcnQgdmFsaWRhdGUgZnJvbSAnLi92YWxpZGF0ZS5qcyc7XG5cbmZ1bmN0aW9uIHBhcnNlKHV1aWQpIHtcbiAgaWYgKCF2YWxpZGF0ZSh1dWlkKSkge1xuICAgIHRocm93IFR5cGVFcnJvcignSW52YWxpZCBVVUlEJyk7XG4gIH1cblxuICB2YXIgdjtcbiAgdmFyIGFyciA9IG5ldyBVaW50OEFycmF5KDE2KTsgLy8gUGFyc2UgIyMjIyMjIyMtLi4uLi0uLi4uLS4uLi4tLi4uLi4uLi4uLi4uXG5cbiAgYXJyWzBdID0gKHYgPSBwYXJzZUludCh1dWlkLnNsaWNlKDAsIDgpLCAxNikpID4+PiAyNDtcbiAgYXJyWzFdID0gdiA+Pj4gMTYgJiAweGZmO1xuICBhcnJbMl0gPSB2ID4+PiA4ICYgMHhmZjtcbiAgYXJyWzNdID0gdiAmIDB4ZmY7IC8vIFBhcnNlIC4uLi4uLi4uLSMjIyMtLi4uLi0uLi4uLS4uLi4uLi4uLi4uLlxuXG4gIGFycls0XSA9ICh2ID0gcGFyc2VJbnQodXVpZC5zbGljZSg5LCAxMyksIDE2KSkgPj4+IDg7XG4gIGFycls1XSA9IHYgJiAweGZmOyAvLyBQYXJzZSAuLi4uLi4uLi0uLi4uLSMjIyMtLi4uLi0uLi4uLi4uLi4uLi5cblxuICBhcnJbNl0gPSAodiA9IHBhcnNlSW50KHV1aWQuc2xpY2UoMTQsIDE4KSwgMTYpKSA+Pj4gODtcbiAgYXJyWzddID0gdiAmIDB4ZmY7IC8vIFBhcnNlIC4uLi4uLi4uLS4uLi4tLi4uLi0jIyMjLS4uLi4uLi4uLi4uLlxuXG4gIGFycls4XSA9ICh2ID0gcGFyc2VJbnQodXVpZC5zbGljZSgxOSwgMjMpLCAxNikpID4+PiA4O1xuICBhcnJbOV0gPSB2ICYgMHhmZjsgLy8gUGFyc2UgLi4uLi4uLi4tLi4uLi0uLi4uLS4uLi4tIyMjIyMjIyMjIyMjXG4gIC8vIChVc2UgXCIvXCIgdG8gYXZvaWQgMzItYml0IHRydW5jYXRpb24gd2hlbiBiaXQtc2hpZnRpbmcgaGlnaC1vcmRlciBieXRlcylcblxuICBhcnJbMTBdID0gKHYgPSBwYXJzZUludCh1dWlkLnNsaWNlKDI0LCAzNiksIDE2KSkgLyAweDEwMDAwMDAwMDAwICYgMHhmZjtcbiAgYXJyWzExXSA9IHYgLyAweDEwMDAwMDAwMCAmIDB4ZmY7XG4gIGFyclsxMl0gPSB2ID4+PiAyNCAmIDB4ZmY7XG4gIGFyclsxM10gPSB2ID4+PiAxNiAmIDB4ZmY7XG4gIGFyclsxNF0gPSB2ID4+PiA4ICYgMHhmZjtcbiAgYXJyWzE1XSA9IHYgJiAweGZmO1xuICByZXR1cm4gYXJyO1xufVxuXG5leHBvcnQgZGVmYXVsdCBwYXJzZTsiLCJleHBvcnQgZGVmYXVsdCAvXig/OlswLTlhLWZdezh9LVswLTlhLWZdezR9LVsxLTVdWzAtOWEtZl17M30tWzg5YWJdWzAtOWEtZl17M30tWzAtOWEtZl17MTJ9fDAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCkkL2k7IiwiLy8gVW5pcXVlIElEIGNyZWF0aW9uIHJlcXVpcmVzIGEgaGlnaCBxdWFsaXR5IHJhbmRvbSAjIGdlbmVyYXRvci4gSW4gdGhlIGJyb3dzZXIgd2UgdGhlcmVmb3JlXG4vLyByZXF1aXJlIHRoZSBjcnlwdG8gQVBJIGFuZCBkbyBub3Qgc3VwcG9ydCBidWlsdC1pbiBmYWxsYmFjayB0byBsb3dlciBxdWFsaXR5IHJhbmRvbSBudW1iZXJcbi8vIGdlbmVyYXRvcnMgKGxpa2UgTWF0aC5yYW5kb20oKSkuXG52YXIgZ2V0UmFuZG9tVmFsdWVzO1xudmFyIHJuZHM4ID0gbmV3IFVpbnQ4QXJyYXkoMTYpO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcm5nKCkge1xuICAvLyBsYXp5IGxvYWQgc28gdGhhdCBlbnZpcm9ubWVudHMgdGhhdCBuZWVkIHRvIHBvbHlmaWxsIGhhdmUgYSBjaGFuY2UgdG8gZG8gc29cbiAgaWYgKCFnZXRSYW5kb21WYWx1ZXMpIHtcbiAgICAvLyBnZXRSYW5kb21WYWx1ZXMgbmVlZHMgdG8gYmUgaW52b2tlZCBpbiBhIGNvbnRleHQgd2hlcmUgXCJ0aGlzXCIgaXMgYSBDcnlwdG8gaW1wbGVtZW50YXRpb24uIEFsc28sXG4gICAgLy8gZmluZCB0aGUgY29tcGxldGUgaW1wbGVtZW50YXRpb24gb2YgY3J5cHRvIChtc0NyeXB0bykgb24gSUUxMS5cbiAgICBnZXRSYW5kb21WYWx1ZXMgPSB0eXBlb2YgY3J5cHRvICE9PSAndW5kZWZpbmVkJyAmJiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzICYmIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChjcnlwdG8pIHx8IHR5cGVvZiBtc0NyeXB0byAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcyA9PT0gJ2Z1bmN0aW9uJyAmJiBtc0NyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChtc0NyeXB0byk7XG5cbiAgICBpZiAoIWdldFJhbmRvbVZhbHVlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKCkgbm90IHN1cHBvcnRlZC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS91dWlkanMvdXVpZCNnZXRyYW5kb212YWx1ZXMtbm90LXN1cHBvcnRlZCcpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBnZXRSYW5kb21WYWx1ZXMocm5kczgpO1xufSIsIi8vIEFkYXB0ZWQgZnJvbSBDaHJpcyBWZW5lc3MnIFNIQTEgY29kZSBhdFxuLy8gaHR0cDovL3d3dy5tb3ZhYmxlLXR5cGUuY28udWsvc2NyaXB0cy9zaGExLmh0bWxcbmZ1bmN0aW9uIGYocywgeCwgeSwgeikge1xuICBzd2l0Y2ggKHMpIHtcbiAgICBjYXNlIDA6XG4gICAgICByZXR1cm4geCAmIHkgXiB+eCAmIHo7XG5cbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4geCBeIHkgXiB6O1xuXG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuIHggJiB5IF4geCAmIHogXiB5ICYgejtcblxuICAgIGNhc2UgMzpcbiAgICAgIHJldHVybiB4IF4geSBeIHo7XG4gIH1cbn1cblxuZnVuY3Rpb24gUk9UTCh4LCBuKSB7XG4gIHJldHVybiB4IDw8IG4gfCB4ID4+PiAzMiAtIG47XG59XG5cbmZ1bmN0aW9uIHNoYTEoYnl0ZXMpIHtcbiAgdmFyIEsgPSBbMHg1YTgyNzk5OSwgMHg2ZWQ5ZWJhMSwgMHg4ZjFiYmNkYywgMHhjYTYyYzFkNl07XG4gIHZhciBIID0gWzB4Njc0NTIzMDEsIDB4ZWZjZGFiODksIDB4OThiYWRjZmUsIDB4MTAzMjU0NzYsIDB4YzNkMmUxZjBdO1xuXG4gIGlmICh0eXBlb2YgYnl0ZXMgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFyIG1zZyA9IHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChieXRlcykpOyAvLyBVVEY4IGVzY2FwZVxuXG4gICAgYnl0ZXMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgKytpKSB7XG4gICAgICBieXRlcy5wdXNoKG1zZy5jaGFyQ29kZUF0KGkpKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoIUFycmF5LmlzQXJyYXkoYnl0ZXMpKSB7XG4gICAgLy8gQ29udmVydCBBcnJheS1saWtlIHRvIEFycmF5XG4gICAgYnl0ZXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChieXRlcyk7XG4gIH1cblxuICBieXRlcy5wdXNoKDB4ODApO1xuICB2YXIgbCA9IGJ5dGVzLmxlbmd0aCAvIDQgKyAyO1xuICB2YXIgTiA9IE1hdGguY2VpbChsIC8gMTYpO1xuICB2YXIgTSA9IG5ldyBBcnJheShOKTtcblxuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgTjsgKytfaSkge1xuICAgIHZhciBhcnIgPSBuZXcgVWludDMyQXJyYXkoMTYpO1xuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCAxNjsgKytqKSB7XG4gICAgICBhcnJbal0gPSBieXRlc1tfaSAqIDY0ICsgaiAqIDRdIDw8IDI0IHwgYnl0ZXNbX2kgKiA2NCArIGogKiA0ICsgMV0gPDwgMTYgfCBieXRlc1tfaSAqIDY0ICsgaiAqIDQgKyAyXSA8PCA4IHwgYnl0ZXNbX2kgKiA2NCArIGogKiA0ICsgM107XG4gICAgfVxuXG4gICAgTVtfaV0gPSBhcnI7XG4gIH1cblxuICBNW04gLSAxXVsxNF0gPSAoYnl0ZXMubGVuZ3RoIC0gMSkgKiA4IC8gTWF0aC5wb3coMiwgMzIpO1xuICBNW04gLSAxXVsxNF0gPSBNYXRoLmZsb29yKE1bTiAtIDFdWzE0XSk7XG4gIE1bTiAtIDFdWzE1XSA9IChieXRlcy5sZW5ndGggLSAxKSAqIDggJiAweGZmZmZmZmZmO1xuXG4gIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IE47ICsrX2kyKSB7XG4gICAgdmFyIFcgPSBuZXcgVWludDMyQXJyYXkoODApO1xuXG4gICAgZm9yICh2YXIgdCA9IDA7IHQgPCAxNjsgKyt0KSB7XG4gICAgICBXW3RdID0gTVtfaTJdW3RdO1xuICAgIH1cblxuICAgIGZvciAodmFyIF90ID0gMTY7IF90IDwgODA7ICsrX3QpIHtcbiAgICAgIFdbX3RdID0gUk9UTChXW190IC0gM10gXiBXW190IC0gOF0gXiBXW190IC0gMTRdIF4gV1tfdCAtIDE2XSwgMSk7XG4gICAgfVxuXG4gICAgdmFyIGEgPSBIWzBdO1xuICAgIHZhciBiID0gSFsxXTtcbiAgICB2YXIgYyA9IEhbMl07XG4gICAgdmFyIGQgPSBIWzNdO1xuICAgIHZhciBlID0gSFs0XTtcblxuICAgIGZvciAodmFyIF90MiA9IDA7IF90MiA8IDgwOyArK190Mikge1xuICAgICAgdmFyIHMgPSBNYXRoLmZsb29yKF90MiAvIDIwKTtcbiAgICAgIHZhciBUID0gUk9UTChhLCA1KSArIGYocywgYiwgYywgZCkgKyBlICsgS1tzXSArIFdbX3QyXSA+Pj4gMDtcbiAgICAgIGUgPSBkO1xuICAgICAgZCA9IGM7XG4gICAgICBjID0gUk9UTChiLCAzMCkgPj4+IDA7XG4gICAgICBiID0gYTtcbiAgICAgIGEgPSBUO1xuICAgIH1cblxuICAgIEhbMF0gPSBIWzBdICsgYSA+Pj4gMDtcbiAgICBIWzFdID0gSFsxXSArIGIgPj4+IDA7XG4gICAgSFsyXSA9IEhbMl0gKyBjID4+PiAwO1xuICAgIEhbM10gPSBIWzNdICsgZCA+Pj4gMDtcbiAgICBIWzRdID0gSFs0XSArIGUgPj4+IDA7XG4gIH1cblxuICByZXR1cm4gW0hbMF0gPj4gMjQgJiAweGZmLCBIWzBdID4+IDE2ICYgMHhmZiwgSFswXSA+PiA4ICYgMHhmZiwgSFswXSAmIDB4ZmYsIEhbMV0gPj4gMjQgJiAweGZmLCBIWzFdID4+IDE2ICYgMHhmZiwgSFsxXSA+PiA4ICYgMHhmZiwgSFsxXSAmIDB4ZmYsIEhbMl0gPj4gMjQgJiAweGZmLCBIWzJdID4+IDE2ICYgMHhmZiwgSFsyXSA+PiA4ICYgMHhmZiwgSFsyXSAmIDB4ZmYsIEhbM10gPj4gMjQgJiAweGZmLCBIWzNdID4+IDE2ICYgMHhmZiwgSFszXSA+PiA4ICYgMHhmZiwgSFszXSAmIDB4ZmYsIEhbNF0gPj4gMjQgJiAweGZmLCBIWzRdID4+IDE2ICYgMHhmZiwgSFs0XSA+PiA4ICYgMHhmZiwgSFs0XSAmIDB4ZmZdO1xufVxuXG5leHBvcnQgZGVmYXVsdCBzaGExOyIsImltcG9ydCB2YWxpZGF0ZSBmcm9tICcuL3ZhbGlkYXRlLmpzJztcbi8qKlxuICogQ29udmVydCBhcnJheSBvZiAxNiBieXRlIHZhbHVlcyB0byBVVUlEIHN0cmluZyBmb3JtYXQgb2YgdGhlIGZvcm06XG4gKiBYWFhYWFhYWC1YWFhYLVhYWFgtWFhYWC1YWFhYWFhYWFhYWFhcbiAqL1xuXG52YXIgYnl0ZVRvSGV4ID0gW107XG5cbmZvciAodmFyIGkgPSAwOyBpIDwgMjU2OyArK2kpIHtcbiAgYnl0ZVRvSGV4LnB1c2goKGkgKyAweDEwMCkudG9TdHJpbmcoMTYpLnN1YnN0cigxKSk7XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeShhcnIpIHtcbiAgdmFyIG9mZnNldCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMDtcbiAgLy8gTm90ZTogQmUgY2FyZWZ1bCBlZGl0aW5nIHRoaXMgY29kZSEgIEl0J3MgYmVlbiB0dW5lZCBmb3IgcGVyZm9ybWFuY2VcbiAgLy8gYW5kIHdvcmtzIGluIHdheXMgeW91IG1heSBub3QgZXhwZWN0LiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3V1aWRqcy91dWlkL3B1bGwvNDM0XG4gIHZhciB1dWlkID0gKGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDJdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgM11dICsgJy0nICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA0XV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDVdXSArICctJyArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgNl1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA3XV0gKyAnLScgKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDhdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgOV1dICsgJy0nICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxMF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxMV1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxMl1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxM11dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxNF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxNV1dKS50b0xvd2VyQ2FzZSgpOyAvLyBDb25zaXN0ZW5jeSBjaGVjayBmb3IgdmFsaWQgVVVJRC4gIElmIHRoaXMgdGhyb3dzLCBpdCdzIGxpa2VseSBkdWUgdG8gb25lXG4gIC8vIG9mIHRoZSBmb2xsb3dpbmc6XG4gIC8vIC0gT25lIG9yIG1vcmUgaW5wdXQgYXJyYXkgdmFsdWVzIGRvbid0IG1hcCB0byBhIGhleCBvY3RldCAobGVhZGluZyB0b1xuICAvLyBcInVuZGVmaW5lZFwiIGluIHRoZSB1dWlkKVxuICAvLyAtIEludmFsaWQgaW5wdXQgdmFsdWVzIGZvciB0aGUgUkZDIGB2ZXJzaW9uYCBvciBgdmFyaWFudGAgZmllbGRzXG5cbiAgaWYgKCF2YWxpZGF0ZSh1dWlkKSkge1xuICAgIHRocm93IFR5cGVFcnJvcignU3RyaW5naWZpZWQgVVVJRCBpcyBpbnZhbGlkJyk7XG4gIH1cblxuICByZXR1cm4gdXVpZDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgc3RyaW5naWZ5OyIsImltcG9ydCBybmcgZnJvbSAnLi9ybmcuanMnO1xuaW1wb3J0IHN0cmluZ2lmeSBmcm9tICcuL3N0cmluZ2lmeS5qcyc7IC8vICoqYHYxKClgIC0gR2VuZXJhdGUgdGltZS1iYXNlZCBVVUlEKipcbi8vXG4vLyBJbnNwaXJlZCBieSBodHRwczovL2dpdGh1Yi5jb20vTGlvc0svVVVJRC5qc1xuLy8gYW5kIGh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvbGlicmFyeS91dWlkLmh0bWxcblxudmFyIF9ub2RlSWQ7XG5cbnZhciBfY2xvY2tzZXE7IC8vIFByZXZpb3VzIHV1aWQgY3JlYXRpb24gdGltZVxuXG5cbnZhciBfbGFzdE1TZWNzID0gMDtcbnZhciBfbGFzdE5TZWNzID0gMDsgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS91dWlkanMvdXVpZCBmb3IgQVBJIGRldGFpbHNcblxuZnVuY3Rpb24gdjEob3B0aW9ucywgYnVmLCBvZmZzZXQpIHtcbiAgdmFyIGkgPSBidWYgJiYgb2Zmc2V0IHx8IDA7XG4gIHZhciBiID0gYnVmIHx8IG5ldyBBcnJheSgxNik7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgbm9kZSA9IG9wdGlvbnMubm9kZSB8fCBfbm9kZUlkO1xuICB2YXIgY2xvY2tzZXEgPSBvcHRpb25zLmNsb2Nrc2VxICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmNsb2Nrc2VxIDogX2Nsb2Nrc2VxOyAvLyBub2RlIGFuZCBjbG9ja3NlcSBuZWVkIHRvIGJlIGluaXRpYWxpemVkIHRvIHJhbmRvbSB2YWx1ZXMgaWYgdGhleSdyZSBub3RcbiAgLy8gc3BlY2lmaWVkLiAgV2UgZG8gdGhpcyBsYXppbHkgdG8gbWluaW1pemUgaXNzdWVzIHJlbGF0ZWQgdG8gaW5zdWZmaWNpZW50XG4gIC8vIHN5c3RlbSBlbnRyb3B5LiAgU2VlICMxODlcblxuICBpZiAobm9kZSA9PSBudWxsIHx8IGNsb2Nrc2VxID09IG51bGwpIHtcbiAgICB2YXIgc2VlZEJ5dGVzID0gb3B0aW9ucy5yYW5kb20gfHwgKG9wdGlvbnMucm5nIHx8IHJuZykoKTtcblxuICAgIGlmIChub2RlID09IG51bGwpIHtcbiAgICAgIC8vIFBlciA0LjUsIGNyZWF0ZSBhbmQgNDgtYml0IG5vZGUgaWQsICg0NyByYW5kb20gYml0cyArIG11bHRpY2FzdCBiaXQgPSAxKVxuICAgICAgbm9kZSA9IF9ub2RlSWQgPSBbc2VlZEJ5dGVzWzBdIHwgMHgwMSwgc2VlZEJ5dGVzWzFdLCBzZWVkQnl0ZXNbMl0sIHNlZWRCeXRlc1szXSwgc2VlZEJ5dGVzWzRdLCBzZWVkQnl0ZXNbNV1dO1xuICAgIH1cblxuICAgIGlmIChjbG9ja3NlcSA9PSBudWxsKSB7XG4gICAgICAvLyBQZXIgNC4yLjIsIHJhbmRvbWl6ZSAoMTQgYml0KSBjbG9ja3NlcVxuICAgICAgY2xvY2tzZXEgPSBfY2xvY2tzZXEgPSAoc2VlZEJ5dGVzWzZdIDw8IDggfCBzZWVkQnl0ZXNbN10pICYgMHgzZmZmO1xuICAgIH1cbiAgfSAvLyBVVUlEIHRpbWVzdGFtcHMgYXJlIDEwMCBuYW5vLXNlY29uZCB1bml0cyBzaW5jZSB0aGUgR3JlZ29yaWFuIGVwb2NoLFxuICAvLyAoMTU4Mi0xMC0xNSAwMDowMCkuICBKU051bWJlcnMgYXJlbid0IHByZWNpc2UgZW5vdWdoIGZvciB0aGlzLCBzb1xuICAvLyB0aW1lIGlzIGhhbmRsZWQgaW50ZXJuYWxseSBhcyAnbXNlY3MnIChpbnRlZ2VyIG1pbGxpc2Vjb25kcykgYW5kICduc2VjcydcbiAgLy8gKDEwMC1uYW5vc2Vjb25kcyBvZmZzZXQgZnJvbSBtc2Vjcykgc2luY2UgdW5peCBlcG9jaCwgMTk3MC0wMS0wMSAwMDowMC5cblxuXG4gIHZhciBtc2VjcyA9IG9wdGlvbnMubXNlY3MgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMubXNlY3MgOiBEYXRlLm5vdygpOyAvLyBQZXIgNC4yLjEuMiwgdXNlIGNvdW50IG9mIHV1aWQncyBnZW5lcmF0ZWQgZHVyaW5nIHRoZSBjdXJyZW50IGNsb2NrXG4gIC8vIGN5Y2xlIHRvIHNpbXVsYXRlIGhpZ2hlciByZXNvbHV0aW9uIGNsb2NrXG5cbiAgdmFyIG5zZWNzID0gb3B0aW9ucy5uc2VjcyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5uc2VjcyA6IF9sYXN0TlNlY3MgKyAxOyAvLyBUaW1lIHNpbmNlIGxhc3QgdXVpZCBjcmVhdGlvbiAoaW4gbXNlY3MpXG5cbiAgdmFyIGR0ID0gbXNlY3MgLSBfbGFzdE1TZWNzICsgKG5zZWNzIC0gX2xhc3ROU2VjcykgLyAxMDAwMDsgLy8gUGVyIDQuMi4xLjIsIEJ1bXAgY2xvY2tzZXEgb24gY2xvY2sgcmVncmVzc2lvblxuXG4gIGlmIChkdCA8IDAgJiYgb3B0aW9ucy5jbG9ja3NlcSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY2xvY2tzZXEgPSBjbG9ja3NlcSArIDEgJiAweDNmZmY7XG4gIH0gLy8gUmVzZXQgbnNlY3MgaWYgY2xvY2sgcmVncmVzc2VzIChuZXcgY2xvY2tzZXEpIG9yIHdlJ3ZlIG1vdmVkIG9udG8gYSBuZXdcbiAgLy8gdGltZSBpbnRlcnZhbFxuXG5cbiAgaWYgKChkdCA8IDAgfHwgbXNlY3MgPiBfbGFzdE1TZWNzKSAmJiBvcHRpb25zLm5zZWNzID09PSB1bmRlZmluZWQpIHtcbiAgICBuc2VjcyA9IDA7XG4gIH0gLy8gUGVyIDQuMi4xLjIgVGhyb3cgZXJyb3IgaWYgdG9vIG1hbnkgdXVpZHMgYXJlIHJlcXVlc3RlZFxuXG5cbiAgaWYgKG5zZWNzID49IDEwMDAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwidXVpZC52MSgpOiBDYW4ndCBjcmVhdGUgbW9yZSB0aGFuIDEwTSB1dWlkcy9zZWNcIik7XG4gIH1cblxuICBfbGFzdE1TZWNzID0gbXNlY3M7XG4gIF9sYXN0TlNlY3MgPSBuc2VjcztcbiAgX2Nsb2Nrc2VxID0gY2xvY2tzZXE7IC8vIFBlciA0LjEuNCAtIENvbnZlcnQgZnJvbSB1bml4IGVwb2NoIHRvIEdyZWdvcmlhbiBlcG9jaFxuXG4gIG1zZWNzICs9IDEyMjE5MjkyODAwMDAwOyAvLyBgdGltZV9sb3dgXG5cbiAgdmFyIHRsID0gKChtc2VjcyAmIDB4ZmZmZmZmZikgKiAxMDAwMCArIG5zZWNzKSAlIDB4MTAwMDAwMDAwO1xuICBiW2krK10gPSB0bCA+Pj4gMjQgJiAweGZmO1xuICBiW2krK10gPSB0bCA+Pj4gMTYgJiAweGZmO1xuICBiW2krK10gPSB0bCA+Pj4gOCAmIDB4ZmY7XG4gIGJbaSsrXSA9IHRsICYgMHhmZjsgLy8gYHRpbWVfbWlkYFxuXG4gIHZhciB0bWggPSBtc2VjcyAvIDB4MTAwMDAwMDAwICogMTAwMDAgJiAweGZmZmZmZmY7XG4gIGJbaSsrXSA9IHRtaCA+Pj4gOCAmIDB4ZmY7XG4gIGJbaSsrXSA9IHRtaCAmIDB4ZmY7IC8vIGB0aW1lX2hpZ2hfYW5kX3ZlcnNpb25gXG5cbiAgYltpKytdID0gdG1oID4+PiAyNCAmIDB4ZiB8IDB4MTA7IC8vIGluY2x1ZGUgdmVyc2lvblxuXG4gIGJbaSsrXSA9IHRtaCA+Pj4gMTYgJiAweGZmOyAvLyBgY2xvY2tfc2VxX2hpX2FuZF9yZXNlcnZlZGAgKFBlciA0LjIuMiAtIGluY2x1ZGUgdmFyaWFudClcblxuICBiW2krK10gPSBjbG9ja3NlcSA+Pj4gOCB8IDB4ODA7IC8vIGBjbG9ja19zZXFfbG93YFxuXG4gIGJbaSsrXSA9IGNsb2Nrc2VxICYgMHhmZjsgLy8gYG5vZGVgXG5cbiAgZm9yICh2YXIgbiA9IDA7IG4gPCA2OyArK24pIHtcbiAgICBiW2kgKyBuXSA9IG5vZGVbbl07XG4gIH1cblxuICByZXR1cm4gYnVmIHx8IHN0cmluZ2lmeShiKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdjE7IiwiaW1wb3J0IHYzNSBmcm9tICcuL3YzNS5qcyc7XG5pbXBvcnQgbWQ1IGZyb20gJy4vbWQ1LmpzJztcbnZhciB2MyA9IHYzNSgndjMnLCAweDMwLCBtZDUpO1xuZXhwb3J0IGRlZmF1bHQgdjM7IiwiaW1wb3J0IHN0cmluZ2lmeSBmcm9tICcuL3N0cmluZ2lmeS5qcyc7XG5pbXBvcnQgcGFyc2UgZnJvbSAnLi9wYXJzZS5qcyc7XG5cbmZ1bmN0aW9uIHN0cmluZ1RvQnl0ZXMoc3RyKSB7XG4gIHN0ciA9IHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChzdHIpKTsgLy8gVVRGOCBlc2NhcGVcblxuICB2YXIgYnl0ZXMgPSBbXTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgIGJ5dGVzLnB1c2goc3RyLmNoYXJDb2RlQXQoaSkpO1xuICB9XG5cbiAgcmV0dXJuIGJ5dGVzO1xufVxuXG5leHBvcnQgdmFyIEROUyA9ICc2YmE3YjgxMC05ZGFkLTExZDEtODBiNC0wMGMwNGZkNDMwYzgnO1xuZXhwb3J0IHZhciBVUkwgPSAnNmJhN2I4MTEtOWRhZC0xMWQxLTgwYjQtMDBjMDRmZDQzMGM4JztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChuYW1lLCB2ZXJzaW9uLCBoYXNoZnVuYykge1xuICBmdW5jdGlvbiBnZW5lcmF0ZVVVSUQodmFsdWUsIG5hbWVzcGFjZSwgYnVmLCBvZmZzZXQpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgdmFsdWUgPSBzdHJpbmdUb0J5dGVzKHZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG5hbWVzcGFjZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIG5hbWVzcGFjZSA9IHBhcnNlKG5hbWVzcGFjZSk7XG4gICAgfVxuXG4gICAgaWYgKG5hbWVzcGFjZS5sZW5ndGggIT09IDE2KSB7XG4gICAgICB0aHJvdyBUeXBlRXJyb3IoJ05hbWVzcGFjZSBtdXN0IGJlIGFycmF5LWxpa2UgKDE2IGl0ZXJhYmxlIGludGVnZXIgdmFsdWVzLCAwLTI1NSknKTtcbiAgICB9IC8vIENvbXB1dGUgaGFzaCBvZiBuYW1lc3BhY2UgYW5kIHZhbHVlLCBQZXIgNC4zXG4gICAgLy8gRnV0dXJlOiBVc2Ugc3ByZWFkIHN5bnRheCB3aGVuIHN1cHBvcnRlZCBvbiBhbGwgcGxhdGZvcm1zLCBlLmcuIGBieXRlcyA9XG4gICAgLy8gaGFzaGZ1bmMoWy4uLm5hbWVzcGFjZSwgLi4uIHZhbHVlXSlgXG5cblxuICAgIHZhciBieXRlcyA9IG5ldyBVaW50OEFycmF5KDE2ICsgdmFsdWUubGVuZ3RoKTtcbiAgICBieXRlcy5zZXQobmFtZXNwYWNlKTtcbiAgICBieXRlcy5zZXQodmFsdWUsIG5hbWVzcGFjZS5sZW5ndGgpO1xuICAgIGJ5dGVzID0gaGFzaGZ1bmMoYnl0ZXMpO1xuICAgIGJ5dGVzWzZdID0gYnl0ZXNbNl0gJiAweDBmIHwgdmVyc2lvbjtcbiAgICBieXRlc1s4XSA9IGJ5dGVzWzhdICYgMHgzZiB8IDB4ODA7XG5cbiAgICBpZiAoYnVmKSB7XG4gICAgICBvZmZzZXQgPSBvZmZzZXQgfHwgMDtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAxNjsgKytpKSB7XG4gICAgICAgIGJ1ZltvZmZzZXQgKyBpXSA9IGJ5dGVzW2ldO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYnVmO1xuICAgIH1cblxuICAgIHJldHVybiBzdHJpbmdpZnkoYnl0ZXMpO1xuICB9IC8vIEZ1bmN0aW9uI25hbWUgaXMgbm90IHNldHRhYmxlIG9uIHNvbWUgcGxhdGZvcm1zICgjMjcwKVxuXG5cbiAgdHJ5IHtcbiAgICBnZW5lcmF0ZVVVSUQubmFtZSA9IG5hbWU7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1lbXB0eVxuICB9IGNhdGNoIChlcnIpIHt9IC8vIEZvciBDb21tb25KUyBkZWZhdWx0IGV4cG9ydCBzdXBwb3J0XG5cblxuICBnZW5lcmF0ZVVVSUQuRE5TID0gRE5TO1xuICBnZW5lcmF0ZVVVSUQuVVJMID0gVVJMO1xuICByZXR1cm4gZ2VuZXJhdGVVVUlEO1xufSIsImltcG9ydCBybmcgZnJvbSAnLi9ybmcuanMnO1xuaW1wb3J0IHN0cmluZ2lmeSBmcm9tICcuL3N0cmluZ2lmeS5qcyc7XG5cbmZ1bmN0aW9uIHY0KG9wdGlvbnMsIGJ1Ziwgb2Zmc2V0KSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgcm5kcyA9IG9wdGlvbnMucmFuZG9tIHx8IChvcHRpb25zLnJuZyB8fCBybmcpKCk7IC8vIFBlciA0LjQsIHNldCBiaXRzIGZvciB2ZXJzaW9uIGFuZCBgY2xvY2tfc2VxX2hpX2FuZF9yZXNlcnZlZGBcblxuICBybmRzWzZdID0gcm5kc1s2XSAmIDB4MGYgfCAweDQwO1xuICBybmRzWzhdID0gcm5kc1s4XSAmIDB4M2YgfCAweDgwOyAvLyBDb3B5IGJ5dGVzIHRvIGJ1ZmZlciwgaWYgcHJvdmlkZWRcblxuICBpZiAoYnVmKSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHx8IDA7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDE2OyArK2kpIHtcbiAgICAgIGJ1ZltvZmZzZXQgKyBpXSA9IHJuZHNbaV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1ZjtcbiAgfVxuXG4gIHJldHVybiBzdHJpbmdpZnkocm5kcyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHY0OyIsImltcG9ydCB2MzUgZnJvbSAnLi92MzUuanMnO1xuaW1wb3J0IHNoYTEgZnJvbSAnLi9zaGExLmpzJztcbnZhciB2NSA9IHYzNSgndjUnLCAweDUwLCBzaGExKTtcbmV4cG9ydCBkZWZhdWx0IHY1OyIsImltcG9ydCBSRUdFWCBmcm9tICcuL3JlZ2V4LmpzJztcblxuZnVuY3Rpb24gdmFsaWRhdGUodXVpZCkge1xuICByZXR1cm4gdHlwZW9mIHV1aWQgPT09ICdzdHJpbmcnICYmIFJFR0VYLnRlc3QodXVpZCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHZhbGlkYXRlOyIsImltcG9ydCB2YWxpZGF0ZSBmcm9tICcuL3ZhbGlkYXRlLmpzJztcblxuZnVuY3Rpb24gdmVyc2lvbih1dWlkKSB7XG4gIGlmICghdmFsaWRhdGUodXVpZCkpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ0ludmFsaWQgVVVJRCcpO1xuICB9XG5cbiAgcmV0dXJuIHBhcnNlSW50KHV1aWQuc3Vic3RyKDE0LCAxKSwgMTYpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB2ZXJzaW9uOyIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiLyoqXG4gKiBUaGlzIGlzIHlvdXIgbWFpbi4gVGhpcyBpcyB3aGVyZSB5b3UgcmUtZXhwb3J0IGV2ZXJ5dGhpbmcgeW91IHdhbnQgdG8gYmUgcHVibGljbHkgYXZhaWxhYmxlLlxuICpcbiAqIFRoZSBidWlsZCBlbmZvcmNlcyB0aGF0IHRoZSBmaWxlIGhhcyB0aGUgc2FtZSBuYW1lIGFzIHRoZSBnbG9iYWwgdmFyaWFibGUgdGhhdCBpcyBleHBvcnRlZC5cbiAqL1xuXG5pbXBvcnQgeyBBcGlWZXJzaW9uIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5cbi8vIER1ZSB0byB0aGUgd2F5IHdlIGNvbmZpZ3VyZWQgd2VicGFjaywgd2Ugc2hvdWxkIGJlIGV4cG9ydGluZyB0aGluZ3Mgd2hpY2ggd2lsbCBiZSB1bmRlclxuLy8gYSBnbG9iYWwgdmFyaWFibGUgY2FsbGVkIFwidGFibGVhdVwiLiBFeHBvcnQgZXZlcnl0aGluZyB3ZSB3YW50IHRvIGJlIHZpc2libGUgdW5kZXIgdGFibGVhdVxuLy8gZnJvbSB0aGlzIGZpbGUuXG5pbXBvcnQgeyBFeHRlbnNpb25zSW1wbCB9IGZyb20gJy4vRXh0ZW5zaW9uc0FwaS9JbXBsL0V4dGVuc2lvbnNJbXBsJztcbmltcG9ydCB7IEV4dGVuc2lvbnMgfSBmcm9tICcuL0V4dGVuc2lvbnNBcGkvTmFtZXNwYWNlcy9FeHRlbnNpb25zJztcblxuZGVjbGFyZSBsZXQgVkVSU0lPTl9JU19BTFBIQTogYm9vbGVhbjtcbmNvbnN0IGlzQWxwaGE6IGJvb2xlYW4gPSB0eXBlb2YgVkVSU0lPTl9JU19BTFBIQSAhPT0gJ3VuZGVmaW5lZCcgPyBWRVJTSU9OX0lTX0FMUEhBIDogZmFsc2U7XG5cbmRlY2xhcmUgbGV0IEFQSV9WRVJTSU9OX05VTUJFUjogc3RyaW5nO1xuQXBpVmVyc2lvbi5TZXRWZXJzaW9uTnVtYmVyKHR5cGVvZiBBUElfVkVSU0lPTl9OVU1CRVIgIT09ICd1bmRlZmluZWQnID8gQVBJX1ZFUlNJT05fTlVNQkVSIDogJzAuMC4wJywgaXNBbHBoYSk7XG5cbmNvbnN0IGV4dGVuc2lvbkltcGwgPSBuZXcgRXh0ZW5zaW9uc0ltcGwoKTtcbmV4cG9ydCBjb25zdCBleHRlbnNpb25zID0gbmV3IEV4dGVuc2lvbnMoZXh0ZW5zaW9uSW1wbCk7XG5cbi8vIEV4cG9ydCBFbnVtc1xuLy8gVGhlc2Ugc2hvdyB1cCB1bmRlciB0aGUgdGFibGVhdSBvYmplY3QuIEkuZS4gdGFibGVhdS5FeHRlbnNpb25Db250ZXh0LlNlcnZlclxuZXhwb3J0IHtcbiAgQW5hbHl0aWNzT2JqZWN0VHlwZSxcbiAgQW5ub3RhdGlvblR5cGUsXG4gIENsYXNzTmFtZUtleSxcbiAgQ29sdW1uVHlwZSxcbiAgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlLFxuICBEYXNoYm9hcmRPYmplY3RUeXBlLFxuICBEYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5VHlwZSxcbiAgRGF0YVR5cGUsXG4gIERhdGVSYW5nZVR5cGUsXG4gIERpYWxvZ1N0eWxlLFxuICBFbmNvZGluZ1R5cGUsXG4gIEVycm9yQ29kZXMsXG4gIEV4dGVuc2lvbkNvbnRleHQsXG4gIEV4dGVuc2lvbk1vZGUsXG4gIEZpZWxkQWdncmVnYXRpb25UeXBlLFxuICBGaWVsZFJvbGVUeXBlLFxuICBGaWx0ZXJEb21haW5UeXBlLFxuICBGaWx0ZXJOdWxsT3B0aW9uLFxuICBGaWx0ZXJUeXBlLFxuICBGaWx0ZXJVcGRhdGVUeXBlLFxuICBIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlLFxuICBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgTWFya1R5cGUsXG4gIFBhcmFtZXRlclZhbHVlVHlwZSxcbiAgUGVyaW9kVHlwZSxcbiAgUXVpY2tUYWJsZUNhbGNUeXBlLFxuICBSZWxhdGl2ZURhdGVGaWx0ZXJPcHRpb25zLFxuICBSZXBsYXlTcGVlZFR5cGUsXG4gIFNlbGVjdGlvblVwZGF0ZVR5cGUsXG4gIFNlbGVjdE9wdGlvbnMsXG4gIFNoZWV0VHlwZSxcbiAgU29ydERpcmVjdGlvbixcbiAgVGFibGVhdUV2ZW50VHlwZSxcbiAgVHJlbmRMaW5lTW9kZWxUeXBlLFxuICBWaXpJbWFnZUVuY29kaW5nVHlwZSxcbiAgVml6SW1hZ2VQYWxldHRlVHlwZSxcbiAgVml6SW1hZ2VTaXplU2V0dGluZ0FsaWdubWVudFR5cGUsXG4gIFZpekltYWdlU2l6ZVNldHRpbmdUeXBlLFxuICBWaXpJbWFnZVNvcnREaXJlY3Rpb25UeXBlLFxuICBab25lVmlzaWJpbGl0eVR5cGUsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file diff --git a/lib/beta/tableau.extensions.1.latest.min.js b/lib/beta/tableau.extensions.1.latest.min.js deleted file mode 100644 index d267ad3..0000000 --- a/lib/beta/tableau.extensions.1.latest.min.js +++ /dev/null @@ -1,2 +0,0 @@ -(()=>{var e={1808:e=>{!function(){var t=new RegExp("^[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}$","i");function r(e){for(var t="",r=0;r{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(7112);class n extends i.TableauEvent{constructor(e){super(a.TableauEventType.DashboardLayoutChanged),this._dashboardLayoutChangeDetails=e}get dashboardLayoutChangeDetails(){return this._dashboardLayoutChangeDetails}}t.DashboardLayoutChangedEvent=n},1672:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(5136),n=r(4144);class s extends n.TableauWorksheetEvent{constructor(e,t,r){super(a.TableauEventType.FilterChanged,e),this._fieldName=t,this._fieldId=r}get fieldName(){return this._fieldName}get fieldId(){return this._fieldId}getFilterAsync(){return this._worksheet.getFiltersAsync().then((e=>{const t=this.fieldId?e.find((e=>e.fieldId===this.fieldId),this):e.find((e=>e.fieldName===this.fieldName),this);if(!t)throw new i.TableauError(a.ErrorCodes.MissingFilter,`cannot find filter: ${this._fieldName}`);return t}))}}t.FilterChangedEvent=s},5572:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(4144);class n extends i.TableauWorksheetEvent{constructor(e){super(a.TableauEventType.MarkSelectionChanged,e)}getMarksAsync(){return this.worksheet.getSelectedMarksAsync()}}t.MarksSelectedEvent=n},864:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(5136),n=r(4592),s=r(3848),o=r(3248);class l extends o.TableauSheetEvent{constructor(e,t){super(a.TableauEventType.ParameterChanged,t),this._globalFieldName=e}getParameterAsync(){return i.ApiServiceRegistry.get(s.ExtensionsRegistryId).getService("parameters-service").findParameterByGlobalFieldNameAsync(this._globalFieldName).then((e=>{if(void 0===e)throw new i.TableauError(a.ErrorCodes.MissingParameter,`Cannot find parameter: ${this._globalFieldName}`);return new n.Parameter(e,this.sheet)}))}}t.ParameterChangedEvent=l},3464:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(4144);class n extends i.TableauWorksheetEvent{constructor(e){super(a.TableauEventType.SummaryDataChanged,e)}}t.SummaryDataChangedEvent=n},7112:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.TableauEvent=class{constructor(e){this._type=e}get type(){return this._type}}},3248:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7112);class i extends a.TableauEvent{constructor(e,t){super(e),this._sheet=t}get sheet(){return this._sheet}}t.TableauSheetEvent=i},4144:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3248);class i extends a.TableauSheetEvent{constructor(e,t){super(e,t),this._worksheet=t}get worksheet(){return this._worksheet}}t.TableauWorksheetEvent=i},4164:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(7112);class n extends i.TableauEvent{constructor(e){super(a.TableauEventType.WorkbookFormattingChanged),this._formatting=e}get formatting(){return this._formatting}}t.WorkbookFormattingChangedEvent=n},4712:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(4144);class n extends i.TableauWorksheetEvent{constructor(e,t){super(a.TableauEventType.WorksheetFormattingChanged,e),this._formatting=t}get formatting(){return this._formatting}}t.WorksheetFormattingChangedEvent=n},92:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.BentonSansFontFamilyName="Benton Sans",t.BentonSansLowDPIFontFamilyName="Benton Sans Low-DPI",t.BentonSansBookFontFaceName="Benton Sans Book",t.BentonSansBookItalicFontFaceName="Benton Sans Book Italic",t.BentonSansSemiDemiFontFaceName="Benton Sans SemiDemi",t.BentonSansSemiDemiItalicFontFaceName="Benton Sans SemiDemi Italic",t.BentonSansLightFontFaceName="Benton Sans Light",t.BentonSansMediumFontFaceName="Benton Sans Medium",t.SupportedBentonSansFontFaces=[t.BentonSansBookFontFaceName,t.BentonSansBookItalicFontFaceName,t.BentonSansSemiDemiFontFaceName,t.BentonSansSemiDemiItalicFontFaceName,t.BentonSansLightFontFaceName,t.BentonSansMediumFontFaceName]},8396:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ConnectedServer=class{constructor(e,t,r,a){this._userId=e,this._siteId=t,this._siteNamespace=r,this._workbookId=a}get userId(){return this._userId}get siteId(){return this._siteId}get siteNamespace(){return this._siteNamespace}get workbookId(){return this._workbookId}}},5920:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(5136),i=r(3848);class n extends a.WorkbookImpl{getAllDataSourcesAsync(){return a.ApiServiceRegistry.get(i.ExtensionsRegistryId).getService("data-source-service").getAllDataSourcesAsync().then((e=>{const t=e,r=[];return Object.values(t.dataSources).forEach((e=>{r.push(this.createDataSourceFromInfo(e))})),r}))}createDataSourceFromInfo(e){const t=new a.DataSourceImpl(e,i.ExtensionsRegistryId),r=new a.DataSource(t);return t.initializeWithPublicInterfaces(r),r}}t.ExtensionWorkbookImpl=n},976:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(5136),s=r(4252),o=r(9224),l=r(5548),d=r(893),c=r(520),u=r(3032),h=r(1964),p=r(8012),m=r(7e3),g=r(6616),y=r(3848),I=r(92),v=r(5920),S=r(7269),T=r(5436),b=r(2200),f=r(1024);t.ExtensionsImpl=class{initializeAsync(e,t){return this._initializationPromise||(this._initializationPromise=new Promise(((r,a)=>{var s;const o={isAlpha:n.ApiVersion.Instance.isAlpha};if(S.LegacyInternalApiDispatcherHolder.hasDesktopApiDispatcherPromise(o))null===(s=S.LegacyInternalApiDispatcherHolder.getDesktopDispatcherPromise(o))||void 0===s||s.then((r=>this.onDispatcherReceived(r,e,t))).then((e=>{r(e)})).catch((e=>{a(e)}));else{const s=this.onDispatcherReceived.bind(this);n.doCrossFrameBootstrap(window,i.INTERNAL_CONTRACT_VERSION,o).then((r=>s(r,e,t))).then((e=>{r(e)})).catch((e=>{a(e)}))}}))),this._initializationPromise}createVizImageAsync(e){return n.ApiServiceRegistry.get(y.ExtensionsRegistryId).getService("viz-service").createVizImageAsync(e)}setClickThroughAsync(e){return n.ApiServiceRegistry.get(y.ExtensionsRegistryId).getService("UIService").setClickThroughAsync(e,this.extensionZoneId)}isDashboardExtensionLocator(e){if(!e.dashboardPath)throw new n.TableauError(a.ErrorCodes.InternalError,"Unexpected error during initialization.");return!0}onDispatcherReceived(e,t,r){let a=e(i.INTERNAL_CONTRACT_VERSION);g.registerInitializationExtensionsServices(a);const s=n.ApiServiceRegistry.get(y.ExtensionsRegistryId).getService("InitializationService"),l=r?Object.keys(r):[];return s.initializeDashboardExtensionsAsync(t,l).then((e=>{const t=e.extensionEnvironment.platformVersion?e.extensionEnvironment.platformVersion:{major:1,minor:9,fix:0};return n.VersionedExternalApiDispatcher.needsVersionConverter(t)&&(a=new n.VersionedExternalApiDispatcher(a,t)),n.registerAllSharedServices(a,y.ExtensionsRegistryId),g.registerAllExtensionsServices(a),e.extensionDashboardInfo&&this.isDashboardExtensionLocator(e.extensionInstance.locator)&&(this.dashboardContent=this.initializeDashboardContent(e.extensionDashboardInfo,e.extensionInstance.locator.dashboardPath),this.extensionZoneId=e.extensionDashboardInfo.extensionZoneId),e.extensionWorksheetInfo&&(this.worksheetContent=this.initializeWorksheetContent(e.extensionWorksheetInfo)),this.environment=new c.Environment(e.extensionEnvironment),this.settings=this.initializeSettings(e.extensionSettingsInfo),this.ui=new h.UI(new f.UIImpl),this.workbook=new o.Workbook(new v.ExtensionWorkbookImpl),e.extensionEnvironment.workbookFormatting&&(this.initializeTableauFonts(a,e.extensionEnvironment.workbookFormatting),this.applyAllFormatting(e.extensionEnvironment.workbookFormatting)),this.initializeContextMenuCallbacks(r),this.initializeWorkbookFormattingChangedEventCallback(a),e.extensionDialogPayload}))}applyAllFormatting(e){if(this._styleElement||(this._styleElement=document.createElement("style"),this._styleElement.id="Tableau-Extension-Formatting",document.head.appendChild(this._styleElement)),!this._styleElement.sheet||!e)return;const t=this._styleElement.sheet;for(;t.cssRules.length>0;)t.deleteRule(t.cssRules.length-1);e.formattingSheets.map((e=>{this.applyFormattingSheetToStyleSheet(e,t)}))}applyFormattingSheetToStyleSheet(e,t){let r="";const a=e.cssProperties;a.fontFamily&&(r+="font-family: "+a.fontFamily.toString()+"; "),a.fontSize&&(r+="font-size: "+a.fontSize.toString()+"; "),a.fontWeight&&(r+="font-weight: "+a.fontWeight.toString()+"; "),a.fontStyle&&(r+="font-style: "+a.fontStyle.toString()+"; "),a.textDecoration&&(r+="text-decoration: "+a.textDecoration.toString()+"; "),a.color&&(r+="color: "+a.color+"; ");const i="."+e.classNameKey+" { "+r+" }";t.insertRule(i,t.cssRules.length)}initializeWorkbookFormattingChangedEventCallback(e){n.ApiServiceRegistry.get(y.ExtensionsRegistryId).getService("notification-service").registerHandler(i.NotificationId.WorkbookFormattingChanged,(()=>!0),(t=>{t&&(this.initializeTableauFonts(e,t),this.applyAllFormatting(t))}))}initializeTableauFonts(e,t){const r=[...I.SupportedBentonSansFontFaces,...b.SupportedTableauFontFaces];if(t.formattingSheets.forEach((e=>{e.cssProperties.fontFamily&&r.push(e.cssProperties.fontFamily)})),r.length>0){const t={[i.ParameterId.FontNameListItems]:r};e.execute(i.VerbId.GetFonts,t).then((e=>{this.loadFonts(e.result)})).catch()}}loadFonts(e){e.forEach((e=>{b.SupportedTableauFontFaces.includes(e.fontName)?this.loadTableauFonts(e):I.SupportedBentonSansFontFaces.includes(e.fontName)?this.loadBentonSansFonts(e):document.fonts.add(new FontFace(e.fontName,e.fontBinaryInfo))}))}initializeDashboardContent(e,t){const r=new n.SheetInfoImpl(e.name,a.SheetType.Dashboard,{width:e.size.w,height:e.size.h},void 0,!0),i=new n.DashboardImpl(r,e.zones,t,y.ExtensionsRegistryId,null,e.activeDashboardObjectId),o=new s.Dashboard(i);return new d.DashboardContent(o)}initializeWorksheetContent(e){const t=new n.SheetInfoImpl(e.visualId.worksheet,a.SheetType.Worksheet,{width:e.size.w,height:e.size.h},void 0,!0),r=new n.WorksheetImpl(t,y.ExtensionsRegistryId,e.visualId,null,null,e.backgroundColor,p.WorkbookFormattingEnvUtil.convertToWorkbookFormatting(e.formatting)),i=new l.Worksheet(r);return new m.WorksheetContent(i)}initializeSettings(e){const t=new T.SettingsImpl(e);return new u.Settings(t)}initializeContextMenuCallbacks(e){n.ApiServiceRegistry.get(y.ExtensionsRegistryId).getService("notification-service").registerHandler(i.NotificationId.ContextMenuClick,(()=>!0),(t=>{if(e){if(!e[t.id])throw new n.TableauError(a.ErrorCodes.InternalError,`Received unexpected context menu Id from event: ${t.id}`);e[t.id]()}}))}loadTableauFonts(e){switch(e.fontName){case b.TableauBookFontFaceName:document.fonts.add(new FontFace(b.TableauBookFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"}));break;case b.TableauLightFontFaceName:document.fonts.add(new FontFace(b.TableauLightFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"}));break;case b.TableauRegularFontFaceName:document.fonts.add(new FontFace(b.TableauRegularFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"}));break;case b.TableauSemiBoldFontFaceName:document.fonts.add(new FontFace(b.TableauSemiboldFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"})),document.fonts.add(new FontFace(b.TableauRegularFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"}));break;case b.TableauBoldFontFaceName:document.fonts.add(new FontFace(b.TableauBoldFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"})),document.fonts.add(new FontFace(b.TableauBoldFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"})),document.fonts.add(new FontFace(b.TableauMediumFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"})),document.fonts.add(new FontFace(b.TableauSemiboldFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"}));break;case b.TableauMediumFontFaceName:document.fonts.add(new FontFace(b.TableauMediumFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"})),document.fonts.add(new FontFace(b.TableauLightFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"})),document.fonts.add(new FontFace(b.TableauBookFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"}));break;default:throw new n.TableauError(a.ErrorCodes.InternalError,`'attempted to load unsupported font: ${e.fontName}.'`)}}loadBentonSansFonts(e){switch(e.fontName){case I.BentonSansBookFontFaceName:document.fonts.add(new FontFace(I.BentonSansFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"})),document.fonts.add(new FontFace(I.BentonSansLowDPIFontFamilyName,e.fontBinaryInfo,{weight:"100",style:"normal"}));break;case I.BentonSansLightFontFaceName:document.fonts.add(new FontFace(I.BentonSansFontFamilyName,e.fontBinaryInfo,{weight:"100",style:"normal"}));break;case I.BentonSansMediumFontFaceName:document.fonts.add(new FontFace(I.BentonSansFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"})),document.fonts.add(new FontFace(I.BentonSansLowDPIFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"}));break;case I.BentonSansSemiDemiFontFaceName:document.fonts.add(new FontFace(I.BentonSansLowDPIFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"}));break;case I.BentonSansBookItalicFontFaceName:document.fonts.add(new FontFace(I.BentonSansFontFamilyName,e.fontBinaryInfo,{style:"italic"}));break;case I.BentonSansSemiDemiItalicFontFaceName:document.fonts.add(new FontFace(I.BentonSansLowDPIFontFamilyName,e.fontBinaryInfo,{style:"italic"}));break;default:throw new n.TableauError(a.ErrorCodes.InternalError,`'attempted to load unsupported font: ${e.fontName}.'`)}}}},7269:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3448);!function(e){function t(e){var t;return e&&void 0!==e.isAlpha||window.__warningIssued?(null===(t=e)||void 0===t?void 0:t.isAlpha)&&window.__platformIsOfficialRelease&&window.__tableauDesktopDispatcher.then((e=>{e(a.INTERNAL_CONTRACT_VERSION).execute(a.VerbId.BlockExtension,{}).catch()})).catch():(console.warn("This is a beta version of the Extensions API. Please upgrade to an official release."),window.__warningIssued=!0),window.__tableauDesktopDispatcher}e.getDesktopDispatcherPromise=t,e.hasDesktopApiDispatcherPromise=function(e){return!!t(e)}}(t.LegacyInternalApiDispatcherHolder||(t.LegacyInternalApiDispatcherHolder={}))},5436:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(5136),s=r(7112),o=r(3848);class l extends s.TableauEvent{constructor(e){super(a.TableauEventType.SettingsChanged),this._newSettings=e}get newSettings(){return this._newSettings}}class d{constructor(e){this._saveInProgress=!1,this.initializeSettings(e)}erase(e){n.ErrorHelpers.verifyParameter(e,"key"),this._currentSettings[e]&&(this.verifySettingsAreUnlocked(),delete this._currentSettings[e],this._isModified=!0)}get(e){return n.ErrorHelpers.verifyParameter(e,"key"),this._currentSettings[e]}getAll(){return Object.assign({},this._currentSettings)}get isModified(){return this._isModified}saveAsync(){return this.verifySettingsAreUnlocked(),this._isModified?(this._saveInProgress=!0,n.ApiServiceRegistry.get(o.ExtensionsRegistryId).getService("SettingsService").saveSettingsAsync(this._currentSettings).then((e=>(this._saveInProgress=!1,this._isModified=!1,void 0===this._currentSettings?this._currentSettings=e:Object.assign(this._currentSettings,e),e)),(e=>(this._saveInProgress=!1,Promise.reject(e))))):Promise.resolve(this._currentSettings)}set(e,t){n.ErrorHelpers.verifyStringParameter(e,"key"),n.ErrorHelpers.verifyParameter(t,"value"),this.verifySettingsAreUnlocked(),this._currentSettings[e]=t,this._isModified=!0}initializeEvents(){const e=new Array;let t;try{t=n.ApiServiceRegistry.get(o.ExtensionsRegistryId).getService("notification-service")}catch(t){return e}const r=new n.SingleEventManagerImpl(a.TableauEventType.SettingsChanged);return t.registerHandler(i.NotificationId.SettingsChanged,(()=>!0),(e=>{this._currentSettings=e.newSettings,r.triggerEvent((()=>new l(e.newSettings)))})),e.push(r),e}initializeSettings(e){n.ErrorHelpers.verifyParameter(e,"settingsInfo"),n.ErrorHelpers.verifyParameter(e.settingsValues,"settingsInfo.SettingsValues"),this._currentSettings=e.settingsValues,this._isModified=!1}verifySettingsAreUnlocked(){if(this._saveInProgress)throw new n.TableauError(a.ErrorCodes.SettingSaveInProgress,d.ASYNC_SAVE_IN_PROGRESS)}}t.SettingsImpl=d,d.ASYNC_SAVE_IN_PROGRESS="Async Save is in progress, updating settings is not allowed."},2200:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.TableauBookFontFamilyName="Tableau Book",t.TableauLightFontFamilyName="Tableau Light",t.TableauRegularFontFamilyName="Tableau Regular",t.TableauMediumFontFamilyName="Tableau Medium",t.TableauSemiboldFontFamilyName="Tableau Semibold",t.TableauBoldFontFamilyName="Tableau Bold",t.TableauBookFontFaceName="Tableau Book",t.TableauBoldFontFaceName="Tableau Bold",t.TableauLightFontFaceName="Tableau Light",t.TableauMediumFontFaceName="Tableau Medium",t.TableauRegularFontFaceName="Tableau Regular",t.TableauSemiBoldFontFaceName="Tableau Semi Bold",t.SupportedTableauFontFaces=[t.TableauBookFontFaceName,t.TableauBoldFontFaceName,t.TableauLightFontFaceName,t.TableauMediumFontFaceName,t.TableauRegularFontFaceName,t.TableauSemiBoldFontFaceName]},1024:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(7419),n=r(3448),s=r(5136),o=r(7112),l=r(3848);class d extends o.TableauEvent{constructor(e){super(a.TableauEventType.DialogMessageReceived),this.message=e}}t.DialogMessageEvent=d,t.UIImpl=class{constructor(){}displayDialogAsync(e,t,r){const o=s.ApiServiceRegistry.get(l.ExtensionsRegistryId).getService("UIService"),d=s.ApiServiceRegistry.get(l.ExtensionsRegistryId).getService("notification-service");return new Promise(((l,c)=>{o.displayDialogAsync(e,t||"",r).then((()=>{const e=d.registerHandler(n.NotificationId.ExtensionDialogUpdate,(()=>!0),(t=>{if(t.isCloseEvent){if(void 0===t.closePayload)throw new s.TableauError(a.ErrorCodes.InternalError,"closePayload is undefined");l(t.closePayload)}else c(new s.TableauError(i.ErrorCodes.DialogClosedByUser,"Extension dialog closed by user."));e()}))})).catch((e=>{c(e)}))}))}sendDialogMessageAsync(e,t){s.ApiServiceRegistry.get(l.ExtensionsRegistryId).getService("UIService").sendDialogMessageAsync(e,t)}closeDialog(e){s.ApiServiceRegistry.get(l.ExtensionsRegistryId).getService("UIService").closeDialog(e)}initializeEvents(){const e=new Array;let t;try{t=s.ApiServiceRegistry.get(l.ExtensionsRegistryId).getService("notification-service")}catch(t){return e}const r=new s.SingleEventManagerImpl(a.TableauEventType.DialogMessageReceived);return t.registerHandler(n.NotificationId.ExtensionDialogMessage,(()=>!0),(e=>{r.triggerEvent((()=>new d(e.message)))})),e.push(r),e}}},4252:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(5136),s=r(6416),o=r(4164),l=r(3848),d=r(3192),c=r(8512),u=r(5548);class h extends c.Sheet{constructor(e){super(e),this._dashboardImpl=e,e.initializeWithPublicInterfaces(),this.initializeEvents().forEach((e=>this.addNewEventType(e)))}get worksheets(){return this._dashboardImpl.worksheetsImpl.map((e=>new u.Worksheet(e)))}get objects(){return this._dashboardImpl.objects.map((e=>new d.DashboardObject(e)))}get activeDashboardObjectId(){return this._dashboardImpl.activeDashboardObjectId}get activeDashboardName(){return this._dashboardImpl.activeDashboardName}setZoneVisibilityAsync(e){return this._dashboardImpl.setDashboardObjectVisibilityAsync(e)}setDashboardObjectVisibilityAsync(e){return this._dashboardImpl.setDashboardObjectVisibilityAsync(e)}getDashboardObjectById(e){const t=this._dashboardImpl.getDashboardObjectById(e);return t&&new d.DashboardObject(t)}initializeEvents(){const e=new Array;let t;try{t=n.ApiServiceRegistry.get(l.ExtensionsRegistryId).getService("notification-service")}catch(t){return e}const r=new n.SingleEventManagerImpl(a.TableauEventType.DashboardLayoutChanged);t.registerHandler(i.NotificationId.DashboardLayoutChanged,(()=>!0),(e=>{const t=this._dashboardImpl.updateZones(e.zones,e.activeZoneId,e.activeDashboardName);r.triggerEvent((()=>new s.DashboardLayoutChangedEvent(t)))})),e.push(r);const d=new n.SingleEventManagerImpl(a.TableauEventType.WorkbookFormattingChanged);return t.registerHandler(i.NotificationId.WorkbookFormattingChanged,(()=>!0),(e=>{d.triggerEvent((()=>new o.WorkbookFormattingChangedEvent(e)))})),e.push(d),e}moveAndResizeDashboardObjectsAsync(e){return this._dashboardImpl.moveAndResizeDashboardObjectsAsync(e)}replayAnimationAsync(e){return this._dashboardImpl.replayAnimationAsync(e)}getFiltersAsync(){return this._dashboardImpl.getFiltersAsync()}applyFilterAsync(e,t,r,a){return this._dashboardImpl.applyFilterAsync(e,t,r,a)}}t.Dashboard=h},3192:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(4252),i=r(5548);t.DashboardObject=class{constructor(e){this._dashboardObjectImpl=e}get dashboard(){return new a.Dashboard(this._dashboardObjectImpl.dashboardImpl)}get type(){return this._dashboardObjectImpl.type}get position(){return this._dashboardObjectImpl.position}get size(){return this._dashboardObjectImpl.size}get worksheet(){if(this._dashboardObjectImpl.worksheetImpl)return new i.Worksheet(this._dashboardObjectImpl.worksheetImpl)}get name(){return this._dashboardObjectImpl.name}get isFloating(){return this._dashboardObjectImpl.isFloating}get isVisible(){return this._dashboardObjectImpl.isVisible}get id(){return this._dashboardObjectImpl.id}get fieldId(){return this._dashboardObjectImpl.fieldId}}},4592:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(5136),s=r(864),o=r(3848);class l extends n.EventListenerManager{constructor(e,t){super(),this.parameterImpl=e,this.initializeEvents(t).forEach((e=>this.addNewEventType(e)))}get name(){return this.parameterImpl.name}get currentValue(){return this.parameterImpl.currentValue}get dataType(){return this.parameterImpl.dataType}get allowableValues(){return this.parameterImpl.allowableValues}get id(){return this.parameterImpl.id}changeValueAsync(e){return this.parameterImpl.changeValueAsync(e)}initializeEvents(e){n.ErrorHelpers.verifyInternalValue(e,"sheet");const t=new Array;let r;try{r=n.ApiServiceRegistry.get(o.ExtensionsRegistryId).getService("notification-service")}catch(e){return t}const l=new n.SingleEventManagerImpl(a.TableauEventType.ParameterChanged);return r.registerHandler(i.NotificationId.ParameterChanged,(e=>e===this.parameterImpl.id),(t=>{l.triggerEvent((()=>new s.ParameterChangedEvent(t,e)))})),t.push(l),t}}t.Parameter=l},8512:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(5136),n=r(4592);class s extends i.EventListenerManager{constructor(e){super(),this._sheetImpl=e}get name(){return this._sheetImpl.name}get sheetType(){return this._sheetImpl.sheetType}get size(){if(this.isValidSize(this._sheetImpl.size))return this._sheetImpl.size;throw new i.TableauError(a.EmbeddingErrorCodes.ImplementationError,"Size not implemented")}isValidSize(e){const t=e;return void 0!==t.width&&void 0!==t.height}findParameterAsync(e){return this._sheetImpl.findParameterAsync(e).then((e=>new Promise(e?t=>t(new n.Parameter(e,this)):e=>e(void 0))))}getParametersAsync(){return this._sheetImpl.getParametersAsync().then((e=>e.map((e=>new n.Parameter(e,this)))))}}t.Sheet=s},9224:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Workbook=class{constructor(e){this._workbookImpl=e}getAllDataSourcesAsync(){return this._workbookImpl.getAllDataSourcesAsync()}}},5548:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(7419),n=r(3448),s=r(5136),o=r(1672),l=r(5572),d=r(3464),c=r(4712),u=r(3848),h=r(4252),p=r(8512);class m extends p.Sheet{constructor(e){super(e),this._worksheetImpl=e,this.initializeEvents().forEach((e=>this.addNewEventType(e)))}get parentDashboard(){if(null==this._worksheetImpl.parentDashboard)throw new s.TableauError(a.SharedErrorCodes.ImplementationError,"Parent dashboard not implemented");return new h.Dashboard(this._worksheetImpl.parentDashboard)}get backgroundColor(){if(null==this._worksheetImpl.backgroundColor)throw new s.TableauError(a.SharedErrorCodes.ImplementationError,"Worksheet background color is not available");return this._worksheetImpl.backgroundColor}get formatting(){if(null==this._worksheetImpl.formatting)throw new s.TableauError(a.SharedErrorCodes.ImplementationError,"Worksheet formatting information is not available");return this._worksheetImpl.formatting}initializeEvents(){const e=new Array;let t;try{t=s.ApiServiceRegistry.get(u.ExtensionsRegistryId).getService("notification-service")}catch(t){return e}const r=new s.SingleEventManagerImpl(i.TableauEventType.MarkSelectionChanged);t.registerHandler(n.NotificationId.SelectedMarksChanged,(e=>{const t=e;return this.visualIdsAreEqual(t,this._worksheetImpl.visualId)}),(()=>r.triggerEvent((()=>new l.MarksSelectedEvent(this)))));const a=new s.SingleEventManagerImpl(i.TableauEventType.FilterChanged);t.registerHandler(n.NotificationId.FilterChanged,(e=>{const t=e;return this._worksheetImpl.visualId.worksheet===t.visualId.worksheet}),(e=>{a.triggerEvent((()=>new o.FilterChangedEvent(this,e.fieldName,e.fieldId)))}));const h=new s.SingleEventManagerImpl(i.TableauEventType.SummaryDataChanged);t.registerHandler(n.NotificationId.SummaryDataChanged,(e=>{const t=e;return this._worksheetImpl.visualId.worksheet===t.visualId.worksheet}),(e=>{h.triggerEvent((()=>new d.SummaryDataChangedEvent(this)))}));const p=new s.SingleEventManagerImpl(i.TableauEventType.WorksheetFormattingChanged);return t.registerHandler(n.NotificationId.WorksheetFormattingChanged,(e=>{const t=e;return this._worksheetImpl.visualId.worksheet===t.visualId.worksheet}),(e=>{p.triggerEvent((()=>new c.WorksheetFormattingChangedEvent(this,e)))})),e.push(r),e.push(a),e.push(h),e.push(p),e}applyFilterAsync(e,t,r,a){return this._worksheetImpl.applyFilterAsync(e,t,r,a)}applyRangeFilterAsync(e,t){return this._worksheetImpl.applyRangeFilterAsync(e,t)}applyHierarchicalFilterAsync(e,t,r,a){return this._worksheetImpl.applyHierarchicalFilterAsync(e,t,r,a)}applyRelativeDateFilterAsync(e,t){return this._worksheetImpl.applyRelativeDateFilterAsync(e,t)}clearFilterAsync(e){return this._worksheetImpl.clearFilterAsync(e)}getDataSourcesAsync(){return this._worksheetImpl.getDataSourcesAsync()}getFiltersAsync(){return this._worksheetImpl.getFiltersAsync()}getSelectedMarksAsync(){return this._worksheetImpl.getSelectedMarksAsync()}getHighlightedMarksAsync(){return this._worksheetImpl.getHighlightedMarksAsync()}getSummaryDataAsync(e){return this._worksheetImpl.getSummaryDataAsync(e)}getSummaryDataReaderAsync(e,t){return this._worksheetImpl.getSummaryDataReaderAsync(e,t)}getSummaryColumnsInfoAsync(){return this._worksheetImpl.getSummaryColumnsInfoAsync()}getUnderlyingDataAsync(e){return console.warn("Worksheet.getUnderlyingDataAsync is deprecated. Please use Worksheet.getUnderlyingTablesAsync and Worksheet.getUnderlyingTableDataAsync"),this._worksheetImpl.getUnderlyingDataAsync(e)}getUnderlyingTablesAsync(){return this._worksheetImpl.getUnderlyingTablesAsync()}getUnderlyingTableDataAsync(e,t){return this._worksheetImpl.getUnderlyingTableDataAsync(e,t)}getUnderlyingTableDataReaderAsync(e,t,r){return this._worksheetImpl.getUnderlyingTableDataReaderAsync(e,t,r)}getVisualSpecificationAsync(){return this._worksheetImpl.getVisualSpecificationAsync()}addMarksCardFieldsAsync(e,t,r,a){return this._worksheetImpl.addMarksCardFieldsAsync(e,t,r,a)}moveMarksCardFieldAsync(e,t,r,a=1){return this._worksheetImpl.moveMarksCardFieldAsync(e,t,r,a)}spliceMarksCardFieldsAsync(e,t,r,a,i){return this._worksheetImpl.spliceMarksCardFieldsAsync(e,t,r,a,i)}clearSelectedMarksAsync(){return this._worksheetImpl.clearSelectedMarksAsync()}selectMarksByIDAsync(e,t){return this._worksheetImpl.selectMarksByIdAsync(e,t)}selectMarksByValueAsync(e,t){return this._worksheetImpl.selectMarksByValueAsync(e,t)}selectMarksByIdAsync(e,t){return this._worksheetImpl.selectMarksByIdAsync(e,t)}annotateMarkAsync(e,t){return this._worksheetImpl.annotateMarkAsync(e,t)}getAnnotationsAsync(){return this._worksheetImpl.getAnnotationsAsync()}removeAnnotationAsync(e){return this._worksheetImpl.removeAnnotationAsync(e)}hoverTupleAsync(e,t,r=!0){return this._worksheetImpl.hoverTupleAsync(e,t,r)}selectTuplesAsync(e,t,r){return this._worksheetImpl.selectTuplesAsync(e,t,r)}getTooltipTextAsync(e){return this._worksheetImpl.getTooltipTextAsync(e)}leaveMarkNavigationAsync(){return this._worksheetImpl.leaveMarkNavigationAsync()}editAliasesDialogAsync(e){return this._worksheetImpl.editAliasesDialogAsync(e)}visualIdsAreEqual(e,t){return e&&t&&e.worksheet===t.worksheet&&e.dashboard===t.dashboard&&e.storyboard===t.storyboard&&e.storyPointID===t.storyPointID}}t.Worksheet=m},893:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DashboardContent=class{constructor(e){this._dashboard=e}get dashboard(){return this._dashboard}}},520:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(5136),i=r(8396),n=r(8012);t.Environment=class{constructor(e){this._apiVersion=a.ApiVersion.Instance&&a.ApiVersion.Instance.formattedValue,this._context=a.InternalToExternalEnumMappings.extensionContext.convert(e.extensionContext),this._formatting=n.WorkbookFormattingEnvUtil.convertToWorkbookFormatting(e.workbookFormatting),this._language=e.extensionLanguage,this._country=e.extensionCountry,this._locale=e.extensionLocale,this._mode=a.InternalToExternalEnumMappings.extensionMode.convert(e.extensionMode),this._operatingSystem=e.operatingSystem,this._tableauVersion=e.tableauVersion,this._uniqueUserId=e.uniqueUserId,e.userId&&(this.connectedServer=new i.ConnectedServer(e.userId,e.siteId,e.siteNamespace,e.workbookId),this.featureFlags=e.featureFlags)}get apiVersion(){return this._apiVersion}get context(){return this._context}get workbookFormatting(){return this._formatting}get language(){return this._language}get country(){return this._country}get locale(){return this._locale}get mode(){return this._mode}get operatingSystem(){return this._operatingSystem}get tableauVersion(){return this._tableauVersion}get uniqueUserId(){return this._uniqueUserId}}},5408:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Extensions=class{constructor(e){this.extensionImpl=e,this.extensionImpl=e}get dashboardContent(){return this.extensionImpl.dashboardContent}get worksheetContent(){return this.extensionImpl.worksheetContent}get environment(){return this.extensionImpl.environment}get settings(){return this.extensionImpl.settings}get ui(){return this.extensionImpl.ui}get workbook(){return this.extensionImpl.workbook}get dashboardObjectId(){return this.extensionImpl.extensionZoneId}initializeAsync(e){return this.extensionImpl.initializeAsync(!1,e).then()}initializeDialogAsync(){return this.extensionImpl.initializeAsync(!0)}createVizImageAsync(e){return this.extensionImpl.createVizImageAsync(e)}setClickThroughAsync(e){return this.extensionImpl.setClickThroughAsync(e)}}},3032:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(5136);class i extends a.EventListenerManager{constructor(e){super(),this._settingsImpl=e,this._settingsImpl.initializeEvents().forEach((e=>this.addNewEventType(e)))}erase(e){this._settingsImpl.erase(e)}get(e){return this._settingsImpl.get(e)}getAll(){return this._settingsImpl.getAll()}get isModified(){return this._settingsImpl.isModified}saveAsync(){return this._settingsImpl.saveAsync()}set(e,t){this._settingsImpl.set(e,t)}}t.Settings=i},1964:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(5136);class i extends a.EventListenerManager{constructor(e){super(),this._impl=e,this._impl.initializeEvents().forEach((e=>this.addNewEventType(e)))}displayDialogAsync(e,t,r){return this._impl.displayDialogAsync(e,t,r)}sendDialogMessageAsync(e,t){return this._impl.sendDialogMessageAsync(e,t)}closeDialog(e){this._impl.closeDialog(e)}}t.UI=i},8012:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(5136);t.WorkbookFormattingEnvUtil=class{static convertToWorkbookFormatting(e){if(e)return{formattingSheets:e.formattingSheets.map((e=>{return{classNameKey:a.InternalToExternalEnumMappings.classNameKey.convert(e.classNameKey),cssProperties:(t=e.classNameKey,r=e.cssProperties,"tableau-row-dividers"===t||"tableau-column-dividers"===t?{borderColor:r.borderColor,borderStyle:r.borderStyle,borderWidth:r.borderWidth}:{fontFamily:r.fontFamily,fontSize:r.fontSize,fontWeight:r.fontWeight,fontStyle:r.fontStyle,textDecoration:r.textDecoration,color:r.color})};var t,r}))}}}},7e3:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.WorksheetContent=class{constructor(e){this._worksheet=e}get worksheet(){return this._worksheet}}},6336:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3448),i=r(5136);class n extends i.ServiceImplBase{get serviceName(){return"InitializationService"}initializeDashboardExtensionsAsync(e,t){const r={[a.ParameterId.FunctionName]:"initializeDashboardExtensionsAsync",[a.ParameterId.ExtensionContextMenuIds]:t,[a.ParameterId.IsExtensionDialog]:e};return this.execute(a.VerbId.InitializeExtension,r).then((e=>e.result))}}t.InitializationServiceImpl=n},5432:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(5136);class s extends n.ServiceImplBase{get serviceName(){return"SettingsService"}saveSettingsAsync(e){const t={[i.ParameterId.FunctionName]:"saveSettingsAsync",[i.ParameterId.SettingsValues]:e};return this.execute(i.VerbId.SaveExtensionSettings,t).then((e=>{const t=e.result;if(!t||!t.settingsValues)throw new n.TableauError(a.ErrorCodes.InternalError,"Unexpected error savings settings.");return t.settingsValues}))}}t.SettingsServiceImpl=s},752:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(5136),s=a.DialogStyle.Window;class o extends n.ServiceImplBase{get serviceName(){return"UIService"}displayDialogAsync(e,t,r){const o={[i.ParameterId.FunctionName]:"displayDialogAsync",[i.ParameterId.ExtensionDialogUrl]:e,[i.ParameterId.ExtensionDialogPayload]:t},l=r&&r.height?r.height:400,d=r&&r.width?r.width:600,c=r&&r.dialogStyle?r.dialogStyle:s;if(l<=0||d<=0)throw new n.TableauError(a.ErrorCodes.InvalidParameter,"Size parameters for displayDialogAsync must be positive");return o[i.ParameterId.ExtensionDialogH]=l,o[i.ParameterId.ExtensionDialogW]=d,n.ErrorHelpers.verifyEnumValue(c,a.DialogStyle,"DialogStyle"),o[i.ParameterId.ExtensionDialogStyle]=n.ExternalToInternalEnumMappings.dialogStyles.convert(c),this.execute(i.VerbId.DisplayDialog,o).then((e=>{switch(e.result){case i.ExtensionDialogResult.DialogAlreadyOpen:throw new n.TableauError(a.ErrorCodes.DialogAlreadyOpen,"There already exists an open dialog for this extension.");case i.ExtensionDialogResult.InvalidDomain:throw new n.TableauError(a.ErrorCodes.InvalidDomainDialog,"The url of an extension dialog must match the domain of the parent extension.");default:return}}))}closeDialog(e){const t={[i.ParameterId.FunctionName]:"closeDialog"};return e&&(t[i.ParameterId.ExtensionDialogPayload]=e),this.execute(i.VerbId.CloseDialog,t).then((()=>{}))}sendDialogMessageAsync(e,t){const r={[i.ParameterId.FunctionName]:"sendDialogMessage",[i.ParameterId.ExtensionDialogMessage]:e};return t&&(r[i.ParameterId.ExtensionDialogUrl]=t),this.execute(i.VerbId.SendDialogMessage,r).then((()=>{}))}setClickThroughAsync(e,t){if(n.ErrorHelpers.verifyParameterType(e,"boolean","clickThroughEnabled"),void 0===t||t<=0)throw new n.TableauError(a.ErrorCodes.InternalError,"Extension Id is invalid.");const r={[i.ParameterId.ExtensionZoneId]:t,[i.ParameterId.ClickThroughEnabled]:e};return this.execute(i.VerbId.SetClickThrough,r).then((()=>{}))}}t.UIServiceImpl=o},6616:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(5136),i=r(6336),n=r(5432),s=r(752),o=r(3848);t.registerAllExtensionsServices=function(e){a.ApiServiceRegistry.get(o.ExtensionsRegistryId).registerService(new n.SettingsServiceImpl(e,o.ExtensionsRegistryId)),a.ApiServiceRegistry.get(o.ExtensionsRegistryId).registerService(new s.UIServiceImpl(e,o.ExtensionsRegistryId))},t.registerInitializationExtensionsServices=function(e){a.ApiServiceRegistry.get(o.ExtensionsRegistryId).registerService(new i.InitializationServiceImpl(e,o.ExtensionsRegistryId))}},3848:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ExtensionsRegistryId=0},268:(e,t,r)=>{"use strict";function a(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}Object.defineProperty(t,"__esModule",{value:!0}),a(r(4171));var i=r(3536);t.ApiMenuType=i.ApiMenuType,t.CrosstabFileFormat=i.CrosstabFileFormat,t.DeviceType=i.DeviceType,t.EmbeddingErrorCodes=i.EmbeddingErrorCodes,t.EmbeddingTableauEventType=i.TableauEventType,t.FileFormats=i.FileFormats,t.PrintOrientation=i.PrintOrientation,t.PrintPageSize=i.PrintPageSize,t.PrintScaling=i.PrintScaling,t.PulseErrorMessageVisibility=i.PulseErrorMessageVisibility,t.PulseLayout=i.PulseLayout,t.PulseTimeDimension=i.PulseTimeDimension,t.SheetSizeBehavior=i.SheetSizeBehavior,t.TableauDialogType=i.TableauDialogType,t.Toolbar=i.Toolbar,a(r(828)),a(r(3432)),a(r(1480)),a(r(5488))},5840:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var a=r(4744);t.ErrorCodes=a.ErrorCodes,t.ExtensionContext=a.ExtensionContext,t.ExtensionMode=a.ExtensionMode,t.TableauEventType=a.TableauEventType,t.VizImageEncodingType=a.VizImageEncodingType,t.VizImagePaletteType=a.VizImagePaletteType,t.VizImageSizeSettingAlignmentType=a.VizImageSizeSettingAlignmentType,t.VizImageSizeSettingType=a.VizImageSizeSettingType,t.VizImageSortDirectionType=a.VizImageSortDirectionType,function(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}(r(5488))},7419:(e,t,r)=>{"use strict";function a(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}Object.defineProperty(t,"__esModule",{value:!0}),a(r(268)),a(r(5840))},4171:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.AskDataAttributes||(t.AskDataAttributes={})).Origin="origin",r.ShowEmbed="show-embed",r.ShowPin="show-pin",r.ShowSave="show-save",r.ShowShare="show-share"},3536:(e,t)=>{"use strict";var r,a,i,n,s,o,l,d,c,u,h,p,m,g,y,I;Object.defineProperty(t,"__esModule",{value:!0}),(I=t.CrosstabFileFormat||(t.CrosstabFileFormat={})).CSV="csv",I.Excel="xlsx",(y=t.DeviceType||(t.DeviceType={})).Default="default",y.Desktop="desktop",y.Tablet="tablet",y.Phone="phone",(g=t.EmbeddingErrorCodes||(t.EmbeddingErrorCodes={})).AuthFailed="auth-failed",g.BrowserNotCapable="browser-not-capable",g.DownloadWorkbookNotAllowed="download-workbook-not-allowed",g.FilterCannotBePerformed="filter-cannot-be-performed",g.IndexOutOfRange="index-out-of-range",g.InternalError="internal-error",g.InvalidCustomViewName="invalid-custom-view-name",g.InvalidDateParameter="invalid-date-parameter",g.invalidFilterFieldNameOrValue="invalid-filter-field-name",g.InvalidParameter="invalid-parameter",g.InvalidTimeDimension="invalid-time-dimension",g.InvalidSize="invalid-size",g.InvalidSheetType="invalid-sheet-type",g.InvalidSizeBehavior="invalid-size-behavior",g.InvalidSizeBehaviorOnWorksheet="invalid-size-behavior-on-worksheet",g.InvalidUrl="invalid-url",g.MissingMaxSize="missing-max-size",g.MissingMinSize="missing-min-size",g.MissingMinMaxSize="missing-min-max-size",g.MissingParameter="missing-parameter",g.MissingRangeNForRelativeDateFilters="missing-range-n-for-relative-date-filters",g.NoUrlForHiddenWorksheet="no-url-for-hidden-worksheet",g.NoUrlOrParentElementNotFound="no-url-or-parent-element-not-found",g.NotActiveSheet="not-active-sheet",g.NullOrEmptyParameter="null-or-empty-parameter",g.SheetNotInWorkbook="sheet-not-in-workbook",g.StaleDataReference="stale-data-reference",g.UnknownAuthError="unknown-auth-error",g.UnsupportedEventName="unsupported-event-name",g.VizAlreadyInManager="viz-already-in-manager",g.ImplementationError="wrong-implementation",g.NotImplemented="not-implemented",g.EventInitializationError="event-initialization-error",g.IncompatibleVersionError="incompatible-version-error",g.UnknownDialogType="unknown-dialog-type",g.FilterMissingOrNotImplemented="filter-missing-not-implemented",g.StoryPointIdMismatch="storypoint-id-mismatch",(m=t.FileFormats||(t.FileFormats={})).PDF="pdf",m.PNG="png",(p=t.PrintOrientation||(t.PrintOrientation={})).Portrait="portrait",p.Landscape="landscape",(h=t.PrintPageSize||(t.PrintPageSize={})).Letter="letter",h.Legal="legal",h.Note="note",h.Folio="folio",h.Tabloid="tabloid",h.Ledger="ledger",h.Statement="statement",h.Executive="executive",h.A3="A3",h.A4="A4",h.A5="A5",h.B4="B4",h.B5="B5",h.Quarto="quarto",h.Unspecified="unspecified",(u=t.PrintScaling||(t.PrintScaling={})).Automatic="automatic",u.Perc25="25%",u.Perc50="50%",u.Perc60="60%",u.Perc75="75%",u.Perc80="80%",u.Perc90="90%",u.Perc100="100%",u.Perc200="200%",u.Perc400="400%",u.AtMost1PageHigh="at-most-1-page-high",u.AtMost2PagesHigh="at-most-2-pages-high",u.AtMost1PageWide="at-most-1-page-wide",u.AtMost2PagesWide="at-most-2-pages-wide",(c=t.RevertVizSelection||(t.RevertVizSelection={})).All="all",c.Axes="axes",c.Filters="filters",c.Sorts="sorts",c.Shelves="shelves",(d=t.ToolbarButtons||(t.ToolbarButtons={})).Alerts="alerts",d.AskData="askData",d.CustomViews="customViews",d.DataDetails="dataDetails",d.Share="share",d.Subscribe="subscribe",(l=t.Toolbar||(t.Toolbar={})).Top="top",l.Bottom="bottom",l.Hidden="hidden",(o=t.SheetSizeBehavior||(t.SheetSizeBehavior={})).Automatic="automatic",o.Exactly="exactly",o.Range="range",o.AtLeast="atleast",o.AtMost="atmost",(s=t.PulseLayout||(t.PulseLayout={})).Default="default",s.Card="card",s.Ban="ban",(n=t.PulseTimeDimension||(t.PulseTimeDimension={})).Today="Today",n.Yesterday="Yesterday",n.WeekToDate="WeekToDate",n.LastWeek="LastWeek",n.MonthToDate="MonthToDate",n.LastMonth="LastMonth",n.QuarterToDate="QuarterToDate",n.LastQuarter="LastQuarter",n.YearToDate="YearToDate",n.LastYear="LastYear",(i=t.PulseErrorMessageVisibility||(t.PulseErrorMessageVisibility={})).Visible="visible",i.Hidden="hidden",i.Suppressed="suppressed",(a=t.TableauEventType||(t.TableauEventType={})).CustomViewLoaded="customviewloaded",a.CustomViewRemoved="customviewremoved",a.CustomViewSaved="customviewsaved",a.CustomViewSetDefault="customviewsetdefault",a.EditButtonClicked="editbuttonclicked",a.EditInDesktopButtonClicked="editindesktopbuttonclicked",a.FilterChanged="filterchanged",a.FirstVizSizeKnown="firstvizsizeknown",a.FirstInteractive="firstinteractive",a.CustomMarkContextMenuEvent="custommarkcontextmenu",a.MarkSelectionChanged="markselectionchanged",a.ParameterChanged="parameterchanged",a.ToolbarStateChanged="toolbarstatechanged",a.WorkbookReadyToClose="workbookreadytoclose",a.WorkbookPublished="workbookpublished",a.WorkbookPublishedAs="workbookpublishedas",a.UrlAction="urlaction",a.TabSwitched="tabswitched",a.StoryPointSwitched="storypointswitched",a.VizLoadError="vizloaderror",a.IframeSrcUpdated="iframesrcupdated",a.SummaryDataChanged="summarydatachanged",a.ReadyToReceiveAuthToken="readytoreceiveauthtoken",a.FirstPulseMetricSizeKnown="firstpulsemetricsizeknown",a.PulseError="pulseerror",a.PulseFiltersChanged="pulsefilterschanged",a.PulseInsightDiscovered="pulseinsightdiscovered",a.PulseMetricSizeChanged="pulsemetricsizechanged",a.PulseTimeDimensionChanged="pulsetimedimensionchanged",a.PulseUrlChanged="pulseurlchanged",(t.ApiMenuType||(t.ApiMenuType={})).Ubertip="ubertip",(r=t.TableauDialogType||(t.TableauDialogType={})).ExportPDF="export-pdf",r.ExportPowerPoint="export-powerpoint",r.ExportData="export-data",r.ExportCrossTab="export-cross-tab",r.ExportWorkbook="export-workbook",r.Share="share"},828:(e,t)=>{"use strict";var r,a,i;Object.defineProperty(t,"__esModule",{value:!0}),(i=t.PulseAttributes||(t.PulseAttributes={})).DisableExploreFilter="disable-explore-filter",i.Layout="layout",i.OnFirstInteractive="onFirstInteractive",i.OnFirstPulseMetricSizeKnown="onFirstPulseMetricSizeKnown",i.OnPulseUrlError="onPulseError",i.OnPulseFiltersChanged="onPulseFiltersChanged",i.OnPulseInsightDiscovered="onPulseInsightDiscovered",i.OnPulseMetricSizeChanged="onPulseMetricSizeChanged",i.OnPulseTimeDimensionChanged="onPulseTimeDimensionChanged",i.OnPulseUrlChanged="onPulseUrlChanged",i.TimeDimension="time-dimension",i.TokenOptional="token-optional",(a=t.PulseChildElements||(t.PulseChildElements={})).IframeStyle="iframe-style",a.ThemeParameter="theme-parameter",a.PulseFilter="pulse-filter",(r=t.PulseChildElementAttributes||(t.PulseChildElementAttributes={})).Name="name",r.Field="field",r.Value="value",r.Type="type"},3432:(e,t)=>{"use strict";var r,a,i,n,s;Object.defineProperty(t,"__esModule",{value:!0}),(s=t.VizSharedAttributes||(t.VizSharedAttributes={})).TouchOptimize="touch-optimize",s.HideEditInDesktopButton="hide-edit-in-desktop-button",s.SuppressDefaultEditBehavior="suppress-default-edit-behavior",s.DisableVersionCheck="disable-version-check",s.OnEditInDesktopButtonClicked="onEditInDesktopButtonClicked",s.OnFirstVizSizeKnown="onFirstVizSizeKnown",s.OnFirstInteractive="onFirstInteractive",(n=t.VizAttributes||(t.VizAttributes={})).DisableUrlActionsPopups="disable-url-actions",n.HideTabs="hide-tabs",n.Toolbar="toolbar",n.InstanceIdToClone="instance-id-to-clone",n.Device="device",n.HideEditButton="hide-edit-button",n.OnEditButtonClicked="onEditButtonClicked",n.OnFilterChanged="onFilterChanged",n.OnCustomMarkContextMenuEvent="onCustomMarkContextMenuEvent",n.OnMarkSelectionChanged="onMarkSelectionChanged",n.OnParameterChanged="onParameterChanged",n.OnToolbarStateChanged="onToolbarStateChanged",n.OnUrlAction="onUrlAction",n.OnTabSwitched="onTabSwitched",n.OnCustomViewLoaded="onCustomViewLoaded",n.OnCustomViewRemoved="onCustomViewRemoved",n.OnCustomViewSaved="onCustomViewSaved",n.OnCustomViewSetDefault="onCustomViewSetDefault",n.OnStoryPointSwitched="onStoryPointSwitched",n.OnSummaryDataChanged="onSummaryDataChanged",n.OnReadyToReceiveAuthToken="onReadyToReceiveAuthToken",(i=t.VizAuthoringAttributes||(t.VizAuthoringAttributes={})).OnWorkbookPublished="onWorkbookPublished",i.OnWorkbookPublishedAs="onWorkbookPublishedAs",i.OnWorkbookReadyToClose="onWorkbookReadyToClose",i.HideCloseButton="hide-close-button",(a=t.VizChildElements||(t.VizChildElements={})).VizFilter="viz-filter",a.VizParameter="viz-parameter",a.CustomParameter="custom-parameter",a.IframeStyle="iframe-style",(r=t.VizChildElementAttributes||(t.VizChildElementAttributes={})).Field="field",r.Value="value",r.Name="name"},1480:(e,t)=>{"use strict";var r,a,i,n;Object.defineProperty(t,"__esModule",{value:!0}),(n=t.WebComponentAttributes||(t.WebComponentAttributes={})).Src="src",n.Width="width",n.Height="height",n.Token="token",n.Debug="debug",n.IframeAuth="iframe-auth",n.OnVizLoadError="onvizloaderror",n.ForceTokenSync="force-token-sync",(i=t.EmbeddedIframeAttributes||(t.EmbeddedIframeAttributes={})).Loading="iframe-attr-loading",i.Style="iframe-attr-style",i.Class="iframe-attr-class",(a=t.WebComponentChildElements||(t.WebComponentChildElements={})).CustomParameter="custom-parameter",a.IframeStyle="iframe-style",(r=t.WebComponentChildElementAttributes||(t.WebComponentChildElementAttributes={})).Field="field",r.Value="value",r.Name="name"},4744:e=>{"use strict";var t;!function(e){let t,r,a,i,n,s,o,l,d;!function(e){e.APINotInitialized="api-not-initialized",e.VisibilityError="visibility-error",e.DialogAlreadyOpen="dialog-already-open",e.DialogClosedByUser="dialog-closed-by-user",e.InternalError="internal-error",e.InvalidDomainDialog="invalid-dialog-domain",e.InvalidParameter="invalid-parameter",e.MissingFilter="missing-filter",e.MissingParameter="missing-parameter",e.ServerError="server-error",e.SettingSaveInProgress="setting-save-in-progress",e.UnsupportedEventName="unsupported-event-name",e.UnsupportedMethodForDataSourceType="unsupported-method-for-data-source-type"}(t=e.ErrorCodes||(e.ErrorCodes={})),function(e){e.Desktop="desktop",e.Server="server",e.Cloud="cloud",e.PublicWeb="public-web",e.PublicDesktop="public-desktop"}(r=e.ExtensionContext||(e.ExtensionContext={})),function(e){e.Authoring="authoring",e.Viewing="viewing"}(a=e.ExtensionMode||(e.ExtensionMode={})),function(e){e.DialogMessageReceived="dialog-message-received",e.FilterChanged="filter-changed",e.MarkSelectionChanged="mark-selection-changed",e.SummaryDataChanged="summary-data-changed",e.ParameterChanged="parameter-changed",e.SettingsChanged="settings-changed",e.DashboardLayoutChanged="dashboard-layout-changed",e.WorkbookFormattingChanged="workbook-formatting-changed",e.WorksheetFormattingChanged="worksheet-formatting-changed"}(i=e.TableauEventType||(e.TableauEventType={})),function(e){e.Discrete="discrete",e.Continuous="continuous"}(n=e.VizImageEncodingType||(e.VizImageEncodingType={})),function(e){e.Ascending="ascending",e.Descending="descending"}(s=e.VizImageSortDirectionType||(e.VizImageSortDirectionType={})),function(e){e.CustomDiverging="custom-diverging",e.CustomSequential="custom-sequential"}(o=e.VizImagePaletteType||(e.VizImagePaletteType={})),function(e){e.Fixed="fixed",e.Manual="manual"}(l=e.VizImageSizeSettingType||(e.VizImageSizeSettingType={})),function(e){e.Right="right",e.Left="left",e.Center="center"}(d=e.VizImageSizeSettingAlignmentType||(e.VizImageSizeSettingAlignmentType={}))}(t||(t={})),e.exports=t},4912:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.SharedErrorCodes||(t.SharedErrorCodes={})).CrosstabCreationError="crosstab-creation-error",r.DataCreationError="data-creation-error",r.InvalidAggregationFieldName="invalid-aggregation-field-name",r.InvalidFilterFieldName="invalid-filter-name",r.InvalidFilterFieldValue="invalid-filter-fieldValue",r.InvalidSelectionDate="invalid-selection-date",r.InvalidSelectionFieldName="invalid-selection-fieldName",r.InvalidSelectionValue="invalid-selection-value",r.InvalidSelectionSheet="invalid-selection-sheet",r.InternalError="internal-error",r.InvalidParameter="invalid-parameter",r.PDFCreationError="pdf-creation-error",r.PowerPointCreationError="powerpoint-creation-error",r.NotActiveSheet="not-active-sheet",r.ImplementationError="wrong-implementation",r.ApiExecutionError="api-execution-error",r.ServerError="server-error",r.Timeout="timeout"},808:e=>{"use strict";var t;!function(e){let t,r,a,i,n,s,o,l,d,c,u,h,p,m,g,y,I,v,S,T,b,f,E,A,P,_,w,D,C;!function(e){e.Cluster="cluster",e.Forecast="forecast",e.TrendLine="trend-line"}(t=e.AnalyticsObjectType||(e.AnalyticsObjectType={})),function(e){e.Mark="mark",e.Point="point",e.Area="area"}(r=e.AnnotationType||(e.AnnotationType={})),function(e){e.Discrete="discrete",e.Continuous="continuous",e.Unknown="unknown"}(a=e.ColumnType||(e.ColumnType={})),function(e){e.WorksheetTitle="tableau-worksheet-title",e.Worksheet="tableau-worksheet",e.Tooltip="tableau-tooltip",e.StoryTitle="tableau-story-title",e.DashboardTitle="tableau-dashboard-title",e.Pane="tableau-pane",e.RowDividers="tableau-row-dividers",e.ColumnDividers="tableau-column-dividers"}(i=e.ClassNameKey||(e.ClassNameKey={})),function(e){e.Blank="blank",e.Worksheet="worksheet",e.QuickFilter="quick-filter",e.ParameterControl="parameter-control",e.PageFilter="page-filter",e.Legend="legend",e.Title="title",e.Text="text",e.Image="image",e.WebPage="web-page",e.Extension="extension"}(n=e.DashboardObjectType||(e.DashboardObjectType={})),function(e){e.Show="show",e.Hide="hide"}(s=e.DashboardObjectVisibilityType||(e.DashboardObjectVisibilityType={})),function(e){e.String="string",e.Int="int",e.Float="float",e.Bool="bool",e.Date="date",e.DateTime="date-time",e.Spatial="spatial",e.Unknown="unknown"}(o=e.DataType||(e.DataType={})),function(e){e.Added="added",e.Removed="removed",e.IsFloatingChanged="is-floating-changed",e.IsVisibleChanged="is-visible-changed",e.PositionChanged="position-changed",e.SizeChanged="size-changed",e.NameChanged="name-changed",e.Selected="selected",e.Deselected="deselected",e.DashboardChanged="dashboard-changed"}(l=e.DashboardLayoutChange||(e.DashboardLayoutChange={})),function(e){e.Last="last",e.LastN="last-n",e.Next="next",e.NextN="next-n",e.Current="current",e.ToDate="to-date"}(d=e.DateRangeType||(e.DateRangeType={})),function(e){e.Window="window",e.Modal="modal",e.Modeless="modeless"}(c=e.DialogStyle||(e.DialogStyle={})),function(e){e.Column="column",e.Row="row",e.Page="page",e.Filter="filter",e.MarksType="marks-type",e.MeasureValues="measure-values",e.Color="color",e.Size="size",e.Label="label",e.Detail="detail",e.Tooltip="tooltip",e.Shape="shape",e.Path="path",e.Angle="angle",e.Geometry="geometry",e.Custom="custom"}(u=e.EncodingType||(e.EncodingType={})),function(e){e.Sum="sum",e.Avg="avg",e.Min="min",e.Max="max",e.Stdev="stdev",e.Stdevp="stdevp",e.Var="var",e.Varp="varp",e.Collect="collect",e.Count="count",e.Countd="countd",e.Median="median",e.Attr="attr",e.None="none",e.Year="year",e.Qtr="qtr",e.Month="month",e.Day="day",e.Hour="hour",e.Minute="minute",e.Second="second",e.Week="week",e.Weekday="weekday",e.MonthYear="month-year",e.Mdy="mdy",e.End="end",e.TruncYear="trunc-year",e.TruncQtr="trunc-qtr",e.TruncMonth="trunc-month",e.TruncWeek="trunc-week",e.TruncDay="trunc-day",e.TruncHour="trunc-hour",e.TruncMinute="trunc-minute",e.TruncSecond="trunc-second",e.Quart1="quart1",e.Quart3="quart3",e.Skewness="skewness",e.Kurtosis="kurtosis",e.InOut="in-out",e.User="user"}(h=e.FieldAggregationType||(e.FieldAggregationType={})),function(e){e.Dimension="dimension",e.Measure="measure",e.Unknown="unknown"}(p=e.FieldRoleType||(e.FieldRoleType={})),function(e){e.Categorical="categorical",e.Range="range",e.Hierarchical="hierarchical",e.RelativeDate="relative-date"}(m=e.FilterType||(e.FilterType={})),function(e){e.Add="add",e.All="all",e.Replace="replace",e.Remove="remove"}(g=e.FilterUpdateType||(e.FilterUpdateType={})),function(e){e.Relevant="relevant",e.Database="database"}(y=e.FilterDomainType||(e.FilterDomainType={})),function(e){e.NullValues="null-values",e.NonNullValues="non-null-values",e.AllValues="all-values"}(I=e.FilterNullOption||(e.FilterNullOption={})),function(e){e.AllValues="all-values",e.OnlyNativeValues="only-native-values",e.OnlyFormattedValues="only-formatted-values"}(v=e.IncludeDataValuesOption||(e.IncludeDataValuesOption={})),function(e){e.Bar="bar",e.Line="line",e.Area="area",e.Square="square",e.Circle="circle",e.Shape="shape",e.Text="text",e.Map="map",e.Pie="pie",e.GanttBar="gantt-bar",e.Polygon="polygon",e.Heatmap="heatmap",e.VizExtension="viz-extension"}(S=e.MarkType||(e.MarkType={})),function(e){e.All="all",e.List="list",e.Range="range"}(T=e.ParameterValueType||(e.ParameterValueType={})),function(e){e.Years="years",e.Quarters="quarters",e.Months="months",e.Weeks="weeks",e.Days="days",e.Hours="hours",e.Minutes="minutes",e.Seconds="seconds"}(b=e.PeriodType||(e.PeriodType={})),function(e){e.RunningTotal="running-total",e.Difference="difference",e.PercentDifference="percent-difference",e.PercentOfTotal="percent-of-total",e.Rank="rank",e.Percentile="percentile",e.MovingAverage="moving-average",e.YTDTotal="ytd-total",e.CompoundGrowthRate="compound-growth-rate",e.YearOverYearGrowth="year-over-year-growth",e.YTDGrowth="ytd-growth",e.Undefined="undefined"}(f=e.QuickTableCalcType||(e.QuickTableCalcType={})),function(e){e.Replace="select-replace",e.Add="select-add",e.Remove="select-remove"}(E=e.SelectionUpdateType||(e.SelectionUpdateType={})),function(e){e.Simple="select-options-simple",e.Toggle="select-options-toggle"}(A=e.SelectOptions||(e.SelectOptions={})),function(e){e.Dashboard="dashboard",e.Story="story",e.Worksheet="worksheet"}(P=e.SheetType||(e.SheetType={})),function(e){e.Increasing="increasing",e.Decreasing="decreasing"}(_=e.SortDirection||(e.SortDirection={})),function(e){e.Linear="linear",e.Logarithmic="logarithmic",e.Exponential="exponential",e.Polynomial="polynomial"}(w=e.TrendLineModelType||(e.TrendLineModelType={})),function(e){e.Slow="slow",e.Normal="normal",e.Fast="fast"}(D=e.ReplaySpeedType||(e.ReplaySpeedType={})),function(e){e.AllSelected="all-selected",e.NoneSelected="none-selected",e.SomeSelected="some-selected",e.UnknownSelected="unknown-selected"}(C=e.HierarchicalLevelSelectionState||(e.HierarchicalLevelSelectionState={})),e.ZoneVisibilityType=Object.assign({},s)}(t||(t={})),e.exports=t},5488:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}(r(4912));var a=r(808);t.AnalyticsObjectType=a.AnalyticsObjectType,t.AnnotationType=a.AnnotationType,t.ClassNameKey=a.ClassNameKey,t.ColumnType=a.ColumnType,t.DashboardLayoutChange=a.DashboardLayoutChange,t.DashboardObjectType=a.DashboardObjectType,t.DashboardObjectVisibilityType=a.DashboardObjectVisibilityType,t.DataType=a.DataType,t.DateRangeType=a.DateRangeType,t.DialogStyle=a.DialogStyle,t.EncodingType=a.EncodingType,t.FieldAggregationType=a.FieldAggregationType,t.FieldRoleType=a.FieldRoleType,t.FilterDomainType=a.FilterDomainType,t.FilterNullOption=a.FilterNullOption,t.FilterType=a.FilterType,t.FilterUpdateType=a.FilterUpdateType,t.HierarchicalLevelSelectionState=a.HierarchicalLevelSelectionState,t.IncludeDataValuesOption=a.IncludeDataValuesOption,t.MarkType=a.MarkType,t.ParameterValueType=a.ParameterValueType,t.PeriodType=a.PeriodType,t.QuickTableCalcType=a.QuickTableCalcType,t.ReplaySpeedType=a.ReplaySpeedType,t.SelectOptions=a.SelectOptions,t.SelectionUpdateType=a.SelectionUpdateType,t.SheetType=a.SheetType,t.SortDirection=a.SortDirection,t.TrendLineModelType=a.TrendLineModelType,t.ZoneVisibilityType=a.ZoneVisibilityType},3448:(e,t,r)=>{"use strict";function a(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}Object.defineProperty(t,"__esModule",{value:!0});const i=r(5892);t.INTERNAL_CONTRACT_VERSION=i,a(r(6716)),a(r(1080)),a(r(5824)),a(r(4547)),a(r(2400)),a(r(2496)),a(r(2472)),a(r(552)),a(r(3256)),a(r(7204)),a(r(4528)),a(r(3388)),a(r(3760)),t.MESSAGING_VERSION={major:1,minor:0,fix:0}},6716:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(1080);class i{static isSpecial(e){return e.length>2&&"%"===e[0]&&"%"===e[e.length-1]}static parseBoolean(e){const t=e.toLowerCase();return"true"!==t&&"false"!==t?this.specialValueIndicator:"true"===t}static parseNumber(e){const t=Number(e);return isNaN(t)?this.specialValueIndicator:t}static parseDate(e){const t=new Date(e);return Number.isNaN(t.getTime())?null:t}static parseDateTime(e){const t=e.replace(" ","T").concat("Z"),r=new Date(t);return Number.isNaN(r.getTime())?null:r}static convertValueAsStringToValue(e,t){if(null!=e){if(this.isSpecial(e))return e;switch(t){case a.DataType.Bool:return this.parseBoolean(e);case a.DataType.Int:case a.DataType.Float:return this.parseNumber(e);case a.DataType.Date:return null===this.parseDate(e)?this.specialValueIndicator:e;case a.DataType.DateTime:return null===this.parseDateTime(e)?this.specialValueIndicator:e;case a.DataType.Spatial:case a.DataType.String:default:return e}}}static convertValueToNativeValue(e,t){if(null==e)return null;switch(t){case a.DataType.Bool:case a.DataType.Int:case a.DataType.Float:return"string"==typeof e?null:e;case a.DataType.Date:return this.parseDate(e);case a.DataType.DateTime:return this.parseDateTime(e);case a.DataType.String:return this.isSpecial(e)?null:e;case a.DataType.Spatial:default:return e}}static convertStringValueToNativeValue(e,t){return this.convertValueToNativeValue(this.convertValueAsStringToValue(e,t),t)}}t.DataTypeConverter=i,i.specialValueIndicator="%null%"},1080:(e,t)=>{"use strict";var r,a,i,n,s,o,l,d,c,u,h,p,m,g,y,I,v,S,T,b,f,E,A,P,_,w,D,C,F,x,M,k,N,R;Object.defineProperty(t,"__esModule",{value:!0}),(R=t.ExtensionContext||(t.ExtensionContext={})).Desktop="desktop",R.Server="server",R.Unknown="unknown",R.Cloud="cloud",R.PublicWeb="public-web",R.PublicDesktop="public-desktop",(N=t.ExtensionMode||(t.ExtensionMode={})).Authoring="authoring",N.Viewing="viewing",N.Unknown="unknown",(k=t.AnnotateEnum||(t.AnnotateEnum={})).Mark="mark",k.Point="point",k.Area="area",(M=t.ColumnType||(t.ColumnType={})).Discrete="discrete",M.Continuous="continuous",M.Unknown="unknown",(x=t.DashboardObjectType||(t.DashboardObjectType={})).Blank="blank",x.Worksheet="worksheet",x.QuickFilter="quick-filter",x.ParameterControl="parameter-control",x.PageFilter="page-filter",x.Legend="legend",x.Title="title",x.Text="text",x.Image="image",x.WebPage="web-page",x.Extension="extension",(F=t.DataType||(t.DataType={})).String="string",F.Int="int",F.Float="float",F.Bool="bool",F.Date="date",F.DateTime="date-time",F.Spatial="spatial",F.Unknown="unknown",(C=t.DialogStyle||(t.DialogStyle={})).Window="window",C.Modal="modal",C.Modeless="modeless",(D=t.EncodedDataType||(t.EncodedDataType={})).Number="number",D.String="string",D.Date="date",D.Boolean="boolean",(w=t.ErrorCodes||(t.ErrorCodes={})).INITIALIZATION_ERROR="initialization-error",w.INTERNAL_ERROR="internal-error",w.MISSING_ENUM_MAPPING="missing-enum-mapping",w.MISSING_PARAMETER="missing-parameter",w.PERMISSION_DENIED="permission-denied",w.PRES_MODEL_PARSING_ERROR="pres-model-parsing-error",w.VERSION_NOT_CONFIGURED="version-not-configured",w.VISIBILITY_ERROR="visibility-error",w.UNKNOWN_VERB_ID="unknown-verb-id",(_=t.FieldAggregationType||(t.FieldAggregationType={})).Sum="sum",_.Avg="avg",_.Min="min",_.Max="max",_.Stdev="stdev",_.Stdevp="stdevp",_.Var="var",_.Varp="varp",_.Collect="collect",_.Count="count",_.Countd="countd",_.Median="median",_.Attr="attr",_.None="none",_.Year="year",_.Qtr="qtr",_.Month="month",_.Day="day",_.Hour="hour",_.Minute="minute",_.Second="second",_.Week="week",_.Weekday="weekday",_.MonthYear="month-year",_.Mdy="mdy",_.End="end",_.TruncYear="trunc-year",_.TruncQtr="trunc-qtr",_.TruncMonth="trunc-month",_.TruncWeek="trunc-week",_.TruncDay="trunc-day",_.TruncHour="trunc-hour",_.TruncMinute="trunc-minute",_.TruncSecond="trunc-second",_.Quart1="quart1",_.Quart3="quart3",_.Skewness="skewness",_.Kurtosis="kurtosis",_.InOut="in-out",_.User="user",(P=t.FieldRoleType||(t.FieldRoleType={})).Dimension="dimension",P.Measure="measure",P.Unknown="unknown",(A=t.FilterUpdateType||(t.FilterUpdateType={})).Add="add",A.All="all",A.Replace="replace",A.Remove="remove",(E=t.SheetType||(t.SheetType={})).Dashboard="dashboard",E.Story="story",E.Worksheet="worksheet",(f=t.DomainRestrictionType||(t.DomainRestrictionType={})).All="all",f.List="list",f.Range="range",(b=t.DateStepPeriod||(t.DateStepPeriod={})).Years="years",b.Quarters="quarters",b.Months="months",b.Weeks="weeks",b.Days="days",b.Hours="hours",b.Minutes="minutes",b.Seconds="seconds",(T=t.FilterNullOption||(t.FilterNullOption={})).NullValues="nullvalues",T.NonNullValues="nonnullvalues",T.AllValues="allvalues",(S=t.FilterDomainType||(t.FilterDomainType={})).Relevant="relevant",S.Database="database",(v=t.SelectionUpdateType||(t.SelectionUpdateType={})).Replace="select-replace",v.Add="select-add",v.Remove="select-remove",(I=t.SelectOptions||(t.SelectOptions={})).Simple="select-options-simple",I.Toggle="select-options-toggle",I.Menu="select-options-menu",I.Range="select-options-range",I.Search="select-options-search",(y=t.QuantitativeIncludedValues||(t.QuantitativeIncludedValues={})).IncludeNull="include-null",y.IncludeNonNull="include-non-null",y.IncludeAll="include-all",(g=t.HierarchicalLevelSelectionState||(t.HierarchicalLevelSelectionState={})).AllSelected="all-selected",g.NoneSelected="none-selected",g.SomeSelected="some-selected",g.UnknownSelected="unknown-selected",(m=t.MarkType||(t.MarkType={})).Bar="bar",m.Line="line",m.Area="area",m.Square="square",m.Circle="circle",m.Shape="shape",m.Text="text",m.Map="map",m.Pie="pie",m.GanttBar="gantt-bar",m.Polygon="polygon",m.Heatmap="heatmap",m.VizExtension="viz-extension",(p=t.FilterType||(t.FilterType={})).Categorical="categorical",p.Range="range",p.RelativeDate="relativeDate",p.Hierarchical="hierarchical",(h=t.DateRangeType||(t.DateRangeType={})).Last="last",h.LastN="lastN",h.Next="next",h.NextN="nextN",h.Current="current",h.ToDate="toDate",(u=t.ExtensionDialogResult||(t.ExtensionDialogResult={})).DialogAlreadyOpen="dialog-already-open",u.InvalidDomain="invalid-domain",u.Success="success",(c=t.ApiShowDataTableFormat||(t.ApiShowDataTableFormat={})).NativeValuesOnly="native-values-only",c.FormattedValuesOnly="formatted-values-only",c.NativeAndFormattedValues="native-and-formatted-values",(d=t.PageSizeOption||(t.PageSizeOption={})).Letter="letter",d.Legal="legal",d.Note="note",d.Folio="folio",d.Tabloid="tabloid",d.Ledger="ledger",d.Statement="statement",d.Executive="executive",d.A3="a3",d.A4="a4",d.A5="a5",d.B4="b4",d.B5="b5",d.Quarto="quarto",d.Unspecified="unspecified",(l=t.PageOrientation||(t.PageOrientation={})).Printer="printer",l.Portrait="portrait",l.Landscape="landscape",(o=t.ScaleMode||(t.ScaleMode={})).ScaleAuto="auto",o.ScalePercentage="percent",o.ScaleFitPages="fit-pages",(s=t.PageScalingOption||(t.PageScalingOption={})).ScalePctAuto="auto",s.ScalePct400="pct400",s.ScalePct200="pct200",s.ScalePct100="pct100",s.ScalePct90="pct90",s.ScalePct80="pct80",s.ScalePct75="pct75",s.ScalePct60="pct60",s.ScalePct50="pct50",s.ScalePct25="pct25",(n=t.FitPages||(t.FitPages={})).FitOneHigh="fit0x1",n.FitTwoHigh="fit0x2",n.FitOneWide="fit1x0",n.FitTwoWide="fit2x0",(i=t.EncodingType||(t.EncodingType={})).Color="color",i.Size="size",i.Label="label",i.Detail="detail",i.Tooltip="tooltip",i.Shape="shape",i.Path="path",i.Angle="angle",i.Geometry="geometry",i.Custom="custom",(a=t.PulseTimeDimension||(t.PulseTimeDimension={})).Today="Today",a.Yesterday="Yesterday",a.WeekToDate="WeekToDate",a.LastWeek="LastWeek",a.MonthToDate="MonthToDate",a.LastMonth="LastMonth",a.QuarterToDate="QuarterToDate",a.LastQuarter="LastQuarter",a.YearToDate="YearToDate",a.LastYear="LastYear",(r=t.PulseErrorMessageVisibility||(t.PulseErrorMessageVisibility={})).Visible="visible",r.Hidden="hidden",r.Suppressed="suppressed"},5824:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.NotificationId||(t.NotificationId={})).CustomMarkContextMenuClicked="custom-mark-context-menu-clicked",r.ContextMenuClick="context-menu-click",r.CustomViewRemoved="custom-view-removed",r.CustomViewSaved="custom-view-saved",r.CustomViewSetDefault="custom-view-set-default",r.CustomViewsLoaded="custom-views-loaded",r.DashboardLayoutChanged="dashboard-layout-changed",r.EditButtonClicked="edit-button-clicked",r.EditInDesktopButtonClicked="edit-in-desktop-button-clicked",r.ExtensionDialogUpdate="extension-dialog-update",r.ExtensionDialogMessage="extension-dialog-message",r.FilterChanged="filter-changed",r.FirstVizSizeKnown="first-viz-size-known",r.FirstPulseMetricSizeKnown="first-pulse-metric-size-known",r.ParameterChanged="parameter-changed",r.PulseError="pulse-error",r.PulseFiltersChanged="pulse-filters-changed",r.PulseMetricSizeChanged="pulse-metric-size-changed",r.PulseInsightDiscovered="pulse-insight-discovered",r.PulseInteractive="pulse-interactive",r.PulseTimeDimensionChanged="pulse-time-dimension-changed",r.PulseUrlChanged="pulse-url-changed",r.SelectedMarksChanged="selected-marks-changed",r.SettingsChanged="settings-changed",r.SummaryDataChanged="summary-data-changed",r.TestConversionNotification="test-conversion-notification",r.ToolbarStateChanged="toolbar-state-changed",r.VizInteractive="viz-interactive",r.AskDataInteractive="ask-data-interactive",r.WorkbookReadyToClose="workbook-ready-to-close",r.WorkbookFormattingChanged="workbook-formatting-changed",r.WorkbookPublished="workbook-published",r.WorkbookPublishedAs="workbook-published-as",r.WorksheetFormattingChanged="worksheet-formatting-changed",r.UrlAction="url-action",r.TabSwitched="tab-switched",r.StoryPointSwitched="story-point-switched",r.ReadyToReceiveAuthToken="ready-to-receive-auth-token"},4547:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.ParameterId||(t.ParameterId={})).ActiveTablesInfo="active-tables-info",r.AnchorDate="anchor-date",r.AnnotateEnum="annotate-enum",r.AnnotationList="annotation-list",r.ApplyWorksheetFormatting="apply-worksheet-formatting",r.CategoricalDomain="categorical-domain",r.ClickThroughEnabled="click-through-enabled",r.Columns="columns",r.ColumnsToInclude="columns-to-include",r.ColumnsToIncludeById="columns-to-include-by-id",r.ConnectionDescriptionSummaries="connection-description-summaries",r.CurrentSheetType="current-sheet-type",r.CustomView="custom-view",r.CustomViewIsDefault="custom-view-is-default",r.CustomViewIsPublic="custom-view-is-public",r.CustomViewLuid="custom-view-luid",r.CustomViewName="custom-view-name",r.CustomViews="custom-views",r.Dashboard="dashboard",r.DashboardFilters="dashboard-filters",r.DashboardName="dashboard",r.DashboardObjectPositionAndSizeUpdate="dashboard-object-position-and-size-update",r.DashboardObjectPositionAndSizeUpdateList="dashboard-object-position-and-size-update-list",r.DataRowIndex="data-row-index",r.DataSchema="data-schema",r.DataSource="data-source",r.DataSourceDataTable="data-source-data-table",r.DataSourceId="data-source-id",r.DataSourceName="data-source-name",r.DataTable="data-table",r.DataTableReader="data-table-reader",r.DateRangeType="date-range-type",r.DeleteCount="delete-count",r.DeltaTimeMs="delta-time-ms",r.DimValSelectionModels="dimensionValueSelectionModels",r.DomainType="domain-type",r.EmbeddingAbstractQuery="embedding-abstract-query",r.EmbeddingBootstrapInfo="embedding-bootstrap-info",r.EncodingType="encoding-type",r.ExportCrosstabSheetMap="export-crosstab-sheet-map",r.ExportFile="export-file",r.ExportOriginUrl="export-origin-url",r.ExportPdfOptions="export-pdf-options",r.ExtensionBootstrapInfo="extension-bootstrap-info",r.ExtensionContextMenuIds="extension-context-menu-ids",r.ExtensionDialogH="extension-dialog-height",r.ExtensionDialogMessage="extension-dialog-message",r.ExtensionDialogPayload="extension-dialog-payload",r.ExtensionDialogResult="extension-dialog-result",r.ExtensionDialogStyle="extension-dialog-style",r.ExtensionDialogUrl="extension-dialog-url",r.ExtensionDialogW="extension-dialog-width",r.ExtensionLocator="extension-locator",r.ExtensionSettingsInfo="extension-settings-info",r.ExtensionZoneId="extension-zone-id",r.ExternalMenuDescription="external-menu-description",r.ExternalMenuHeader="external-menu-header",r.ExternalMenuItemDisplayName="external-menu-item-display-name",r.ExternalMenuItemId="external-menu-item-id",r.Field="field",r.FieldCount="field-count",r.FieldId="field-id",r.FieldName="field-name",r.FilterLevels="filter-levels",r.FilterRangeMax="filter-range-max",r.FilterRangeMin="filter-range-min",r.FilterRangeNullOption="filter-range-null-option",r.FilterUpdateType="filter-update-type",r.FilterValues="filter-values",r.FontNameListItems="font-name-list-items",r.FormattedText="formatted-text",r.FunctionName="function-name",r.FromIndex="from-index",r.HierValSelectionModels="hierarchicalValueSelectionModels",r.HighlightedData="highlighted-data",r.HoverTupleInteraction="hover-tuple-interaction",r.IgnoreAliases="ignore-aliases",r.IgnoreSelection="ignore-selection",r.IncludeAllColumns="include-all-columns",r.InvalidAggFieldName="invalid-agg-field-name",r.InvalidDates="invalid-dates",r.InvalidFieldCaption="invalid-field-caption",r.InvalidFields="invalid-fields",r.InvalidValues="invalid-values",r.IsAnalyticsAssistantAvailable="is-analytics-assistant-available",r.IsExcludeMode="is-exclude",r.IsExtensionDialog="is-extension-dialog",r.IsFromCalcDialog="is-from-calc-dialog",r.JoinDescription="join-description",r.LogicalTableId="logical-table-id",r.LogicalTableInfoList="logical-table-info-list",r.MarksCardIndex="marks-card-index",r.MaxHeight="max-height",r.MaxRows="max-rows",r.MaxWidth="max-width",r.MinHeight="min-height",r.MinWidth="min-width",r.PageRowCount="page-row-count",r.ParameterCaption="paremeter-caption",r.ParameterError="parameter-error",r.ParameterFieldName="parameter-field-name",r.ParameterInfo="parameter-info",r.ParameterInfos="parameter-infos",r.ParameterValue="parameter-value",r.PeriodType="period-type",r.PulseFieldName="fieldName",r.PulseFieldNames="fieldNames",r.PulseFilterDomainType="domainType",r.PulseFilterDomainSearchTerm="searchTerm",r.PulsePageSize="pageSize",r.PulseNextPageToken="nextPageToken",r.PulseFilters="filters",r.PulseTimeDimension="timeDimension",r.QuantitativeDomain="quantitative-dmain",r.QuantRangeSelectionModels="quantativeRangeSelectionModels",r.RangeN="range-n",r.ReplaySpeed="replay-speed",r.SelectedData="selected-data",r.SelectedSheetNames="selected-sheet-names",r.Selection="selection",r.SelectionList="selection-list",r.SelectionUpdateType="selectionUpdateType",r.SelectTuplesInteraction="select-tuples-interaction",r.SendNotifications="send-notifications",r.SettingsValues="settings-values",r.SharedFilterSheets="shared-filter-sheets",r.SharedFiltersInfo="shared-filters-info",r.SheetIdentifier="sheet-identifier",r.SheetName="sheet-name",r.SheetPath="sheet-path",r.ShouldRefreshDS="should-refresh-ds",r.ShowDataTableFormat="show-data-table-format",r.StartIndex="start-index",r.State="state",r.StoryPointIndex="story-point-index",r.StoryPointInfo="story-point-info",r.SwitchToSheetName="switch-to-sheet-name",r.TargetPoint="target-point",r.TestConversionParameter="test-conversion-parameter",r.Text="formatted-text",r.ToIndex="to-index",r.TooltipContext="tooltip-context",r.TooltipTextRequest="tooltip-text-request",r.TooltipText="tooltip-text",r.UnderlyingDataTable="underlying-data-table",r.UnderlyingSummaryDataTable="underlying-summary-data-table",r.Url="url",r.UseTabDelimiters="use-tab-delimiters",r.ViewDataTableCacheId="view-data-table-cache-id",r.ViewDataTableId="view-data-table-id",r.VisualId="visual-id",r.VisualSpecification="visual-specification",r.VizAPIInputJson="vizapi-input-json",r.VizAPIStateWithDataModel="vizapi-state-with-data-model",r.VizAPIStateWarningMsg="vizapi-state-warning-msg",r.VizAPISVG="vizapi-svg",r.WorksheetName="worksheet-name",r.WorksheetFilters="worksheet-filters",r.ZoneIdsVisibilityMap="zone-ids-visibility-map"},2400:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.VerbId||(t.VerbId={})).ActivateNextStoryPoint="activate-next-story-point",r.ActivatePreviousStoryPoint="activate-previous-story-point",r.ActivateSheet="activateSheet",r.ActivateStoryPoint="activate-story-point",r.AddMarksCardFields="add-marks-card-fields",r.AppendExternalMenuItem="append-external-menu-item",r.ApplyCategoricalFilter="categorical-filter",r.ApplyPulseFilters="apply-pulse-filters",r.ApplyPulseTimeDimension="apply-pulse-time-dimension",r.ApplyRangeFilter="range-filter",r.ApplyRelativeDateFilter="apply-relative-date-Filter",r.Authenticate="authenticate",r.BlockExtension="block-extension",r.ChangeParameterValue="change-parameter-value",r.ChangeSharedFilter="change-shared-filter",r.ClearAllPulseFilters="clear-all-pulse-filters",r.ClearFilter="clear-filter",r.ClearPulseFilters="clear-pulse-filters",r.ClearSelectedMarks="clear-selected-marks",r.CloseDialog="close-dialog",r.CreateAnnotation="create-annotation",r.DashboardCategoricalFilter="dashboard-categorical-filter",r.DisplayDialog="display-dialog",r.DownloadWorkbook="download-workbook",r.EditAliasesDialog="edit-aliases-dialog",r.ExecuteExternalMenuItem="execute-external-menu-item",r.ExportCrosstab="export-crosstab",r.ExportCrosstabCsvDownload="export-crosstab-csv-download",r.ExportCrosstabExcelDownload="export-crosstab-excel-download",r.ExportData="export-data",r.ExportDataDownload="export-data-download",r.ExportImage="export-image",r.ExportPdf="export-pdf",r.ExportPdfDownload="export-pdf-download",r.ExportPowerpoint="export-powerpoint",r.ExportPowerpointDownload="export-powerpoint-download",r.FindParameter="find-parameter",r.GetActiveTables="get-active-tables",r.GetAllDataSources="get-all-data-sources",r.GetAnnotations="get-annotations",r.GetCategoricalDomain="get-categorical-domain",r.GetConnectionDescriptionSummaries="get-connection-description-summaries",r.GetCurrentSrc="get-current-src",r.GetCustomViews="get-custom-views",r.GetDashboardFilters="get-dashboard-filters",r.GetDataSource="get-datasource",r.GetDataSourceData="get-datasource-data",r.GetDataSources="get-data-sources",r.GetDataSummaryData="get-summary-data",r.GetDataSummaryDataReader="get-summary-data-reader",r.GetDataTableReaderPage="get-data-table-reader-page",r.GetEmbeddingAbstractQueryWithDataModel="get-embedding-abstract-query-with-data-model",r.GetEmbeddingClientInfo="get-embedding-client-info",r.GetVizStateWithDataModel="get-viz-state-with-data-model",r.GetExportCrosstabSheetMap="get-export-crosstab-sheet-map",r.GetExportPdfOptions="get-export-pdf-options",r.GetField="get-field",r.GetFieldAndDataSource="get-field-and-datasource",r.GetVisualSpecification="get-visual-specification",r.GetFilters="get-filters",r.GetFonts="get-fonts",r.GetHighlightedMarks="get-highlighted-marks",r.GetJoinDescription="get-join-description",r.GetLogicalTableData="get-logical-table-data",r.GetLogicalTableDataReader="get-logical-table-data-reader",r.GetLogicalTables="get-logical-tables",r.GetParametersForSheet="get-parameters-for-sheet",r.GetPulseCategoricalDomain="get-pulse-categorical-domain",r.GetPulseFilters="get-pulse-filters",r.GetPulseTimeDimension="get-pulse-time-dimension",r.GetRangeDomain="get-range-domain",r.GetSelectedMarks="get-selected-marks",r.GetSharedFilter="get-shared-filter",r.GetTooltipText="get-tooltip-text",r.GetUnderlyingData="get-underlying-data",r.GetUnderlyingTableData="get-underlying-table-data",r.GetUnderlyingTableDataReader="get-underlying-table-data-reader",r.GetUnderlyingTables="get-underlying-tables",r.HierarchicalFilter="hierachical-filter",r.InitializeExtension="initialize-extension",r.IsAnalyticsAssistantAvailable="is-analytics-assistant-available",r.LaunchAnalyticsAssistant="launch-analytics-assistant",r.MoveAndResizeZones="move-and-resize-zones",r.MoveMarksCardField="move-marks-card-field",r.RaiseLeaveMarkNavNotification="raise-leave-mark-nav-notification",r.RaiseHoverTupleNotification="raise-hover-tuple-notification",r.RaiseSelectTuplesNotification="raise-select-tuples-notification",r.Redo="redo",r.RefreshDataSource="refresh-data-source",r.ReleaseDataTableReader="release-data-table-reader",r.RemoveAnnotation="remove-annotation",r.RemoveCustomView="remove-custom-view",r.RemoveExternalMenuItem="remove-external-menu-item",r.RenameExternalMenu="rename-external-menu",r.ReplayAnimation="replay-animation",r.RevertStoryPoint="revert-story-point",r.RevertWorkbook="revert-workbook",r.SaveExtensionSettings="save-extension-settings",r.SaveWorkbookAsCustomView="save-workbook-as-custom-view",r.SelectByValue="select-by-value",r.SetActiveCustomViewAsDefault="set-active-custom-view-as-default",r.SetAutoUpdate="set-auto-update",r.SetClickThrough="set-click-through",r.SendDialogMessage="send-dialog-message",r.SetVizStateWithDataModel="set-viz-state-with-data-model",r.SetSheetSize="set-sheet-size",r.SetZoneVisibility="set-zone-visibility",r.Share="share",r.ShowCustomView="show-custom-view",r.SpliceMarksCardFields="splice-marks-card-fields",r.TestConversionVerb="test-conversion-verb",r.Undo="undo",r.UpdateCustomView="update-custom-view",r.VizAPI="viz-api"},2496:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.AskDataOptionNames||(t.AskDataOptionNames={})).token="token",r.origin="origin",r.showEmbed="showEmbed",r.showPin="showPin",r.showSave="showSave",r.showShare="showShare",r.debug=":jsdebug",r.ApiID=":apiID",r.ApiExternalVersion=":apiExternalVersion",r.ApiInternalVersion=":apiInternalVersion",r.AskDataWebComponent=":askDataWebComponent"},2472:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.PulseOptionNames||(t.PulseOptionNames={})).embed="embed",r.token="token",r.disableExploreFilter="disableExploreFilter",r.layout="embed_layout",r.theme="embed_theme",r.ApiExternalVersion=":apiExternalVersion",r.ApiInternalVersion=":apiInternalVersion",r.PulseWebComponent=":pulseWebComponent"},552:(e,t)=>{"use strict";var r,a,i;Object.defineProperty(t,"__esModule",{value:!0}),function(e){e.ONE="1",e.ALERTS=":alerts",e.ALIAS="alias",e.ALLOW_DEFERRED_BOOTSTRAP=":allowDeferredBootstrap",e.ALLOW_AUTOGEN_WORKSHEET_PHONE_LAYOUTS="allowAutogenWorksheetPhoneLayouts",e.API_ID=":apiID",e.APP=":app",e.ATTACHMENT="attachment",e.IS_IPAD_APP="app",e.ANIMATE_TRANSITION=":animate_transition",e.ASCENDING="ascending",e.AUTHENTICATION="authentication",e.ATTRIBUTES="attributes",e.AUTHORING_SHEET=":authSheet",e.AXIS="axis",e.BOOTSTRAP_WHEN_NOTIFIED=":bootstrapWhenNotified",e.BROWSER_BACK_BUTTON_UNDO=":browserBackButtonUndo",e.BROWSER_RENDERING_ON="isBrowserRendering",e.BROWSER_RENDERING_THRESHOLD="browserRenderingThreshold",e.CHARSET="charset",e.CLIENT_DIMENSION="clientDimension",e.CLIENT_IP="client_ip",e.CLIENT_NUM="clientNum",e.COLON_EMBEDDED=":embedded",e.COLON_MOBILE=":mobile",e.COLON_DEEP_LINKING_DISABLED=":deepLinkingDisabled",e.COLON_WATERMARK=":watermark",e.COMMENTS=":comments",e.COMMENTING_ENABLED=":commentingEnabled",e.COMMENTING_MENTIONS_ENABLED=":commentingMentions",e.CONNECTION="connection",e.CREATED_BY_FEATURE="createdByFeature",e.CRYPTED_PASSWORD="crypted",e.CSSDEBUG=":cssdebug",e.CSV="csv",e.CUSTOM_VIEWS=":customViews",e.CV=":cv",e.CV_ID="cvId",e.DASHBOARD_PORT_SIZE="dashboardPortSize",e.DATA_DETAILS=":dataDetails",e.DATASOURCE="datasource",e.DEBUG=":debug",e.DELAY=":delay",e.DEPTH="depth",e.DEVICE_TYPE=":device",e.DEVICE_PIXEL_RATIO="devicePixelRatio",e.DEVICE_PREVIEW_MODE=":devicepreviewmode",e.DIMENSIONS=":dimensions",e.DISABLE_SHARED_SESSIONS=":disable_shared_sessions",e.DISABLE_URL_ACTIONS_POPUPS=":disableUrlActionsPopups",e.DIRECTION="direction",e.DISPLAY_OVERLAY=":display_overlay",e.DISPLAY_SHARE=":display_share",e.DISPLAY_SPINNER=":display_spinner",e.DISPLAY_STATIC_IMAGE=":display_static_image",e.DISPLAY_TABS="display_tabs",e.DISPLAY_VIEW_COUNT=":display_count",e.IGNORE_STICKY_SESSION=":ignore_sticky_session",e.INCREMENT_VIEW_COUNT=":increment_view_count",e.DOCMODE="docmode",e.DOMAIN="domain",e.DO_WORK="do_work",e.DX="dx",e.DY="dy",e.EDIT_DATA_ALERT=":editDataAlert",e.EMBED=":embed",e.EMBEDDED="embedded",e.ENCRYPTED="encrypted",e.API_EXTERNAL_VERSION=":apiExternalVersion",e.API_INTERNAL_VERSION=":apiInternalVersion",e.EXCLUDE="exclude",e.EXPORT_FORMAT=":export_format",e.FIELDNAME="fieldname",e.FIELD_NAME="field_name",e.FIELD_SEP="field_sep",e.FILE="file",e.FILTER_TILE_SIZE="filterTileSize",e.FN="fn",e.FOCUS="focus",e.FORCE_CACHE="force_cache",e.FORMAT="format",e.FORMAT_DATA_VALUE_LOCALLY="formatDataValueLocally",e.FROM_WG=":from_wg",e.GRAPHQL_DATABASE_ID=":graphQLDatabaseId",e.GRAPHQL_TABLE_ID=":graphQLTableId",e.GUID=":guid",e.H="h",e.HIDDEN="hidden",e.HIDE_CLOSE_BUTTON=":hideCloseButton",e.HIDE_EDIT_BUTTON=":hideEditButton",e.HIDE_EDIT_IN_DESKTOP_BUTTON=":hideEditInDesktopButton",e.HIGH_DPI=":highdpi",e.IMAGE_SIZE_LIMIT="imageSizeLimit",e.TRANSPARENT_LINE_MARKS_LIMIT="transparentLineMarkLimit",e.CLIENT_RENDER_PIXEL_LIMIT="clientRenderPixelLimit",e.IN="in",e.INSTANCE_ID=":iid",e.IS_GUEST_REDIRECT_FROM_VIZPORTAL=":isGuestRedirectFromVizportal",e.IS_MARK_ANIMATION_ENABLED="isMarkAnimationEnabled",e.IS_VIZPORTAL=":isVizPortal",e.INPUT_="input_string",e.JSDEBUG=":jsdebug",e.JSON="json",e.JSON_ONLY=":jsonOnly",e.KEEPFILE="keepfile",e.KEY="key",e.LANGUAGE="language",e.LANGUAGE_REQUESTED=":language",e.LINKTARGET=":linktarget",e.LOAD_ORDER_ID=":loadOrderID",e.LOAD_NEWEST_REVISION=":loadNewestRevision",e.LOCAL_PATHS=":localPaths",e.LOCALE="locale",e.LOCATION_ID="locationid",e.LOCATION_TYPE="locationtype",e.WORKBOOK_LOCALE="workbookLocale",e.MAXROWS="maxrows",e.MAX_AGE="maxAge",e.MAX_ROWS="maxRows",e.METHOD="method",e.MOBILE="mobile",e.MODIFIER="modifier",e.NAME="name",e.NAV_TYPE="navType",e.NAV_SRC="navSrc",e.NOATTACHMENT="no-attachment",e.NO_OVERWRITE="no_overwrite",e.OPEN_AUTHORING_IN_TOP_WINDOW=":openAuthoringInTopWindow",e.OPENID_HD=":openid_hd",e.OPENID_LOGIN_HINT=":openid_login_hint",e.OAUTHREQUEST="oauthrequest",e.OAUTH_CREDENTIAL_IDS="oauth_credential_ids",e.OFFLINE_MODE=":offlinemode",e.ORIGIN=":origin",e.OVERLAY=":overlay",e.P="p",e.PATH="path",e.PANE_RESOLVER_X="paneResolverX",e.PANE_RESOLVER_Y="paneResolverY",e.PARAM="param",e.PARENT_ID="parent_id",e.PASSWORD="password",e.PATTERN="pattern",e.PIXEL_RATIO=":pixelratio",e.PREFIX=":prefix",e.PREVIEW=":preview",e.PRIMARY_CONTENT_URL="primary_content_url",e.PROJECT="project",e.PROTOCOL="protocol",e.PSEUDO=":pseudo",e.QUERY="query",e.R="r",e.RANGE_TYPE="range_type",e.RECORD_SEP="record_sep",e.RECORD_CLIENT_PERFORMANCE=":record_client_performance",e.RECORD_PERFORMANCE=":record_performance",e.RECOVER_OLD_SESSION_ID=":recover_old_session_id",e.RECOVER_SESSION_STATE_TICKETS=":recover_session_state_tickets",e.REFRESH=":refresh",e.REFRESHUNMODIFIED=":refreshunmodified",e.REGION="region",e.RELOAD_ON_CUSTOM_VIEW_SAVE=":reloadOnCustomViewSave",e.RENDER=":render",e.RENDER_MAPS_CLIENT_SIDE="renderMapsClientSide",e.RETRY=":retry",e.REUSE="reuse",e.REUSE_FOREVER="reuse_forever",e.REVERT=":revert",e.SAVE_DB_PASSWORDS="save_db_passwords",e.SELECT_X="select_x",e.SELECT_Y="select_y",e.SESSION_FEATURE_PREFIX=":ff_",e.SESSION_FLAGS=":session_feature_flags",e.SHARE_BUTTON="share_button",e.SHEET_ID="sheet_id",e.SHARED="shared",e.SHOWALL="showall",e.SHOW_APP_BANNER=":showAppBanner",e.SHOW_ASK_DATA=":showAskData",e.SHOW_PARAMS="showParams",e.SHOW_SHARE_OPTIONS=":showShareOptions",e.SIZE=":size",e.SOURCE="source",e.STATE="state",e.STICKY_SESSION_KEY="stickySessionKey",e.SUBSCRIPTIONS=":subscriptions",e.SUMMARY="summary",e.SUPPRESS_DEFAULT_EDIT_BEHAVIOR=":suppressDefaultEditBehavior",e.SYNC_SESSION=":sync_session",e.SYNC_SESSION_STATE="sync_session_state",e.TABS=":tabs",e.TARGET="target",e.TARGET_SITE="target_site",e.TOOLBAR=":toolbar",e.TOOLTIP=":tooltip",e.TS="ts",e.UNDERLYING_TABLE_ID="underlying_table_id",e.UNDERLYING_TABLE_CAPTION="underlying_table_caption",e.UPDATE_TYPE="update_type",e.USE_GUEST=":useGuest",e.USE_INLINE_IMAGES="use_inline_images",e.USERAGENT="useragent",e.USERNAME="username",e.VALUE="value",e.VERBOSE_MODE="verboseMode",e.VIEW_ID="views_id",e.VIZ_SNAPSHOT_ID="viz_snapshot_id",e.VW=":vw",e.W="w",e.WORKSHEET_PORT_SIZE="worksheetPortSize",e.WATERMARK="watermark",e.WATERMARK_MARGIN=":watermark_margin",e.WB=":wb",e.WHICH="which",e.X="x",e.Y="y",e.ZID="zid",e.ZONE_ID="zone_id",e.KEYCHAIN_VERSION="keychain_version",e.DATASOURCE_ID="datasource_id",e.DATASOURCE_NAME="datasource_name",e.LENS_ID="lens_id",e.WIDTH="width",e.HEIGHT="height",e.LAYOUT_VIEWS="views",e.LAYOUT_MENUS="menus",e.LAYOUT_GEOMETRY="geometry",e.LAYOUT_PAGES="pages",e.LAYOUT_CACHEURL="cacheurl",e.LAYOUT_SHEET="sheet",e.LAYOUT_DEPTH="depth"}(r||(r={})),function(e){e.SHOW_VIZ_HOME=":showVizHome"}(a||(a={})),(i=t.VizOptionNames||(t.VizOptionNames={})).Size=":size",i.Embed=":embed",i.ApiInternalVersion=":apiInternalVersion",i.ApiExternalVersion=":apiExternalVersion",i.ShowVizHome=":showVizHome",i.Jsdebug=":jsdebug",i.BootstrapWhenNotified=":bootstrapWhenNotified",i.NavType="navType",i.NavSrc="navSrc",i.debug=":jsdebug",i.ApiID=":apiID",i.disableUrlActionsPopups=":disableUrlActionsPopups",i.hideTabs=":tabs",i.toolbar=":toolbar",i.device=":device",i.instanceIdToClone=":iid",i.touchOptimize="mobile",i.hideEditButton=":hideEditButton",i.hideEditInDesktopButton=":hideEditInDesktopButton",i.suppressDefaultEditBehavior=":suppressDefaultEditBehavior",i.hideCloseButton=":hideCloseButton"},3256:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(1808),i=r(3448),n=r(1680),s=r(4020),o=r(7204);t.CrossFrameMessenger=class{constructor(e,t,r){this.thisWindow=e,this.otherWindow=t,this.otherWindowOrigin=r}startListening(){if(!this.unregisterFunction){const e=this.onMessageReceived.bind(this);this.thisWindow.addEventListener("message",e,!0),this.unregisterFunction=()=>this.thisWindow.removeEventListener("message",e,!0)}}stopListening(){this.unregisterFunction&&(this.unregisterFunction(),this.unregisterFunction=void 0)}setInitializeMessageHandler(e){this.initializeMessageHandler=e}setCommandResponseMessageHandler(e){this.commandResponseMessageHandler=e}setCommandMessageHandler(e){this.commandMessageHandler=e}setNotificationMessageHandler(e){this.notificationMessageHandler=e}setHandshakeMessageHandler(e){this.handshakeMessageHandler=e}prepareInitializationMessage(e,t,r){const i={msgGuid:a.raw(),msgType:o.MessageType.Initialize,crossFrameVersion:t,apiVersion:e,options:r};return this.prepareMessage(i)}prepareCommandMessage(e,t){const r={msgGuid:a.raw(),msgType:o.MessageType.Command,verbId:e,parameters:t};return this.prepareMessage(r)}prepareCommandResponseMessage(e,t,r){const i={msgGuid:a.raw(),msgType:o.MessageType.CommandResponse,commandGuid:e,data:t,error:r};return r&&(i.error=JSON.parse(JSON.stringify(r))),this.prepareMessage(i)}prepareNotificationMessage(e,t){const r={msgGuid:a.raw(),msgType:o.MessageType.Notification,notificationId:e,data:t};return this.prepareMessage(r)}prepareAckMessage(){const e={msgGuid:a.raw(),msgType:o.MessageType.Ack,platformVersion:i.INTERNAL_CONTRACT_VERSION};return this.prepareMessage(e)}prepareMessage(e){if(!this.otherWindow||!this.otherWindowOrigin)throw"Other window not initialized, cannot dispatch messages";return new n.CrossFramePreparedMessage(e,this.otherWindow,this.otherWindowOrigin)}onMessageReceived(e){if(this.otherWindow&&e.source!==this.otherWindow)return;if(!e.data)return;const t=e.data;if(s.isMessage(t))switch(t.msgType){case o.MessageType.Initialize:if(!s.isInitMessage(t)||!this.initializeMessageHandler)return;this.initializeMessageHandler(t,e.source);break;case o.MessageType.CommandResponse:if(!s.isCommandResponseMessage(t)||!this.commandResponseMessageHandler)return;this.commandResponseMessageHandler(t,e.source);break;case o.MessageType.Command:if(!s.isCommandMessage(t)||!this.commandMessageHandler)return;this.commandMessageHandler(t,e.source);break;case o.MessageType.Notification:if(!s.isNotificationMessage(t)||!this.notificationMessageHandler)return;this.notificationMessageHandler(t,e.source);break;case o.MessageType.Handshake:if(!s.isHandshakeMessage(t)||!this.handshakeMessageHandler)return;this.handshakeMessageHandler(t,e.source)}}setOtherWindow(e){this.otherWindow=e}setOtherWindowOrigin(e){this.otherWindowOrigin=e}}},1680:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.CrossFramePreparedMessage=class{constructor(e,t,r){this._message=e,this._target=t,this._origin=r}get messageGuid(){return this._message.msgGuid}send(){return this._target.postMessage(this._message,this._origin),this}}},4020:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(1808),i=r(5824),n=r(7204),s=new Set([i.NotificationId.EditButtonClicked,i.NotificationId.EditInDesktopButtonClicked,i.NotificationId.WorkbookPublished,i.NotificationId.WorkbookReadyToClose,i.NotificationId.ReadyToReceiveAuthToken]);function o(e){if(!e)return!1;const t=e;return!!(t&&t.msgGuid&&t.msgType)&&(!!a.isGuid(t.msgGuid)&&("string"==typeof t.msgType&&!([n.MessageType.Command,n.MessageType.CommandResponse,n.MessageType.Initialize,n.MessageType.Notification,n.MessageType.Handshake].indexOf(t.msgType)<0)))}function l(e){if(!e)return!1;const t=e;return"object"==typeof t&&"number"==typeof t.fix&&"number"==typeof t.minor&&"number"==typeof t.major}t.isMessage=o,t.isVersion=l,t.isInitMessage=function(e){if(!o(e))return!1;const t=e;return!!(t.msgType===n.MessageType.Initialize&&t.apiVersion&&l(t.apiVersion)&&t.crossFrameVersion&&l(t.crossFrameVersion))},t.isCommandResponseMessage=function(e){if(!o(e))return!1;const t=e;return!(t.msgType!==n.MessageType.CommandResponse||!a.isGuid(t.commandGuid)||!t.data&&!t.error)},t.isCommandMessage=function(e){if(!o(e))return!1;const t=e;return!(t.msgType!==n.MessageType.Command||!t.parameters||"object"!=typeof t.parameters||!t.verbId||"string"!=typeof t.verbId)},t.isNotificationMessage=function(e){if(!o(e))return!1;const t=e;return!(t.msgType!==n.MessageType.Notification||!t.data&&!s.has(t.notificationId)||!t.notificationId||"string"!=typeof t.notificationId)},t.isHandshakeMessage=function(e){return!!o(e)&&e.msgType===n.MessageType.Handshake}},7204:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.MessageType||(t.MessageType={})).Initialize="initialize",r.Notification="notification",r.Command="command",r.CommandResponse="command-response",r.Handshake="v-handshake",r.Ack="v-ack"},1600:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.IdentityVersionConverter=class{upgradeExecuteCall(e,t){return{verb:e,parameters:t}}downgradeExecuteReturn(e){return e}downgradeNotification(e){return e}}},2320:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.StackingVersionConverter=class{constructor(e,t,r,a,i){if(this._externalMajorVersion=e,this._platformMajorVersion=t,this._upgradeExecuteTranslations=r,this._downgradeExecuteTranslations=a,this._downgradeNotificationTranslations=i,this._externalMajorVersion>this._platformMajorVersion)throw new Error(`Cannot convert between external version ${this._externalMajorVersion} and ${this._platformMajorVersion}`)}static fromData(e,t,r,a,i){return new this(e.major,t.major,r,a,i)}upgradeExecuteCall(e,t){let r={verb:e,parameters:t};for(const e of this._upgradeExecuteTranslations)r=e(r.verb,r.parameters);return r}downgradeExecuteReturn(e){let t=e;for(const e of this._downgradeExecuteTranslations)t=e(t);return t}downgradeNotification(e){let t=e;for(const e of this._downgradeNotificationTranslations)t=e(t);return t}}},3760:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(1600),i=r(2320),n=r(720);function s(e,t){return e.major===t.major&&e.minor===t.minor}function o(e,t,r,n,o){const d=e.major,c=e.minor,u=t.major;if(d>u)throw new Error(`External version must be less than or equal to platform version.\n externalMajorVersion=${d} platformMajorVersion=${u}`);if(s(e,t))return new a.IdentityVersionConverter;const h=l(d,u,c,r),p=l(d,u,c,n),m=l(d,u,c,o);return p.reverse(),m.reverse(),i.StackingVersionConverter.fromData(e,t,h,p,m)}function l(e,t,r,a){const i=[];for(let n=e;n<=t;n++)if(n in a){const t=n===e?r:0,s=d(Object.keys(a[n]));for(let e=t;e<=s;e++)e in a[n]&&i.push(...a[n][e])}return i}function d(e){return e.map((e=>Number(e))).reduce(((e,t)=>e>t?e:t))}t.VersionLessThan=function(e,t){return!(e.major>t.major)&&(e.major{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3448),i=r(5824);t.DowngradeWorksheetNames=function(e){const t=e.result;return void 0!==t.extensionDashboardInfo&&t.extensionDashboardInfo.zones.forEach((e=>{e.sheetInfo&&(e.name=e.sheetInfo.name)})),e},t.DowngradeFlipboardZoneID=function(e){if(e.notificationId===i.NotificationId.SelectedMarksChanged){const t=e.data;void 0===t.flipboardZoneID&&(t.flipboardZoneID=0)}return e};const n=["tableau-row-dividers","tableau-column-dividers","tableau-pane"];t.DowngradeWorksheetFomatting175=e=>function(e,t){var r,a;const i=e.result;return(null===(a=null===(r=i)||void 0===r?void 0:r.extensionWorksheetInfo)||void 0===a?void 0:a.formatting)&&(i.extensionWorksheetInfo.formatting.formattingSheets=i.extensionWorksheetInfo.formatting.formattingSheets.filter((e=>!t.includes(e.classNameKey)))),e}(e,n),t.DowngradeWorksheetFomattingNotification175=e=>function(e,t){if(e.notificationId===i.NotificationId.WorksheetFormattingChanged){const r=e.data;e.data=r.formattingSheets.filter((e=>!t.includes(e.classNameKey)))}return e}(e,n),t.DowngradeExtensionEnvironmentContext=function(e){const t=e.result;if(void 0!==t.extensionEnvironment){const e=t.extensionEnvironment.extensionContext;e===a.ExtensionContext.PublicWeb||e===a.ExtensionContext.Cloud?t.extensionEnvironment.extensionContext=a.ExtensionContext.Server:e===a.ExtensionContext.PublicDesktop&&(t.extensionEnvironment.extensionContext=a.ExtensionContext.Desktop)}return e}},4528:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ExternalIdentityVersionConverter=class{downgradeExecuteCall(e,t){return{verb:e,parameters:t}}upgradeExecuteReturn(e,t,r){return e}upgradeNotification(e){return e}}},5768:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ExternalStackingVersionConverter=class{constructor(e,t,r,a,i){if(this._externalVersion=e,this._platformVersion=t,this._downgradeExecuteCallTranslations=r,this._upgradeExecuteReturnTranslations=a,this._upgradeNotificationTranslations=i,this._externalVersion.major>this._platformVersion.major)throw new Error(`Cannot convert between external version ${this._externalVersion.major}\n and ${this._platformVersion.major}`)}downgradeExecuteCall(e,t){let r={verb:e,parameters:t};for(const e of this._downgradeExecuteCallTranslations)r=e(r.verb,r.parameters);return r}upgradeExecuteReturn(e,t,r){let a=e;for(const e of this._upgradeExecuteReturnTranslations)a=e(a,t,r);return a}upgradeNotification(e){let t=e;for(const e of this._upgradeNotificationTranslations)t=e(t);return t}}},3388:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3760),i=r(4528),n=r(5768);function s(e,t,r,s,l){const d=e.major,c=t.major,u=t.minor;if(d>c)throw new Error(`External version must be less than or equal to platform version.\n externalMajorVersion=${d} platformMajorVersion=${c}`);if(d{"use strict";function a(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}Object.defineProperty(t,"__esModule",{value:!0});var i=r(2808);t.ApiVersion=i.ApiVersion,a(r(5184));var n=r(8540);t.CrossFrameDispatcher=n.CrossFrameDispatcher;var s=r(8340);t.DataSource=s.DataSource;var o=r(1044);t.ExternalToInternalEnumMappings=o.ExternalToInternalEnumMappings;var l=r(6557);t.InternalToExternalEnumMappings=l.InternalToExternalEnumMappings;var d=r(2680);t.EventListenerManager=d.EventListenerManager;var c=r(1072);t.Field=c.Field;var u=r(2520);t.CustomViewImpl=u.CustomViewImpl;var h=r(1940);t.DashboardImpl=h.DashboardImpl;var p=r(6488);t.DashboardObjectImpl=p.DashboardObjectImpl;var m=r(2180);t.DataSourceImpl=m.DataSourceImpl;var g=r(8552);t.ParameterImpl=g.ParameterImpl;var y=r(8332);t.SheetImpl=y.SheetImpl;var I=r(8736);t.SheetInfoImpl=I.SheetInfoImpl;var v=r(5144);t.SingleEventManagerImpl=v.SingleEventManagerImpl;var S=r(6804);t.StoryImpl=S.StoryImpl;var T=r(2608);t.StoryPointImpl=T.StoryPointImpl;var b=r(6068);t.StoryPointInfoImpl=b.StoryPointInfoImpl;var f=r(3044);t.WorkbookImpl=f.WorkbookImpl;var E=r(6500);t.WorksheetImpl=E.WorksheetImpl;var A=r(6368);t.Point=A.Point,a(r(8672)),a(r(3008));var P=r(1832);t.ClientInfoServiceImpl=P.ClientInfoServiceImpl;var _=r(1288);t.NotificationServiceImpl=_.NotificationServiceImpl;var w=r(8808);t.NotificationServiceImplBase=w.NotificationServiceImplBase,t.Registration=w.Registration;var D=r(1776);t.ServiceImplBase=D.ServiceImplBase;var C=r(4109);t.SizeServiceImpl=C.SizeServiceImpl;var F=r(2248);t.StoryActivationServiceImpl=F.StoryActivationServiceImpl;var x=r(6664);t.TableauError=x.TableauError;var M=r(1724);t.Deferred=M.Deferred;var k=r(7480);t.ErrorHelpers=k.ErrorHelpers;var N=r(5044);t.ExportHelpers=N.ExportHelpers;var R=r(2780);t.SheetUtils=R.SheetUtils;var V=r(1576);t.VersionNumber=V.VersionNumber;var O=r(8648);t.VersionedExternalApiDispatcher=O.VersionedExternalApiDispatcher},2808:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(1576);class i{static get Instance(){return i._instance}static SetVersionNumber(e,t){i._instance=new a.VersionNumber(e,t)}}t.ApiVersion=i},716:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ConnectionSummary=class{constructor(e){this._connectionInfo=e}get name(){return this._connectionInfo.name}get id(){return this._connectionInfo.id}get serverURI(){return this._connectionInfo.serverURI}get type(){return this._connectionInfo.type}}},5184:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3448),i=r(8540);t.doCrossFrameBootstrap=function(e,t,r){return new Promise(((n,s)=>{let o;o=function(e){try{return e.self!==e.parent}catch(e){return!0}}(e)?e.parent:e.opener,o||s("This extension is not running inside an iframe, desktop, or popup window. Initialization failed.");const l=new a.CrossFrameMessenger(e,o,"*"),d=l.prepareInitializationMessage(t,a.MESSAGING_VERSION,r);l.setCommandResponseMessageHandler((function(e){e.commandGuid===d.messageGuid&&n((()=>new i.CrossFrameDispatcher(l)))})),l.startListening(),d.send()}))}},8540:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419);t.CrossFrameDispatcher=class{constructor(e){if(this._messenger=e,this._pendingPromises={},this._notificationHandlers=[],!this._messenger)throw"Missing messenger object";this._messenger.setCommandResponseMessageHandler(this.onCommandResponse.bind(this)),this._messenger.setNotificationMessageHandler(this.onNotification.bind(this))}execute(e,t){const r=this._messenger.prepareCommandMessage(e,t),a=new Promise(((e,t)=>{this._pendingPromises[r.messageGuid]={resolve:e,reject:t}}));return r.send(),a}registerNotificationHandler(e){this._notificationHandlers.push(e)}unregisterNotificationHandler(e){this._notificationHandlers=this._notificationHandlers.filter((t=>t!==e))}onCommandResponse(e){if(Object.keys(this._pendingPromises).indexOf(e.commandGuid)<0)return;const t=this._pendingPromises[e.commandGuid];e.error&&t.reject(e.error),e.data&&t.resolve({result:e.data}),delete this._pendingPromises[e.commandGuid]}onNotification(e){for(const t of this._notificationHandlers)try{t({notificationId:e.notificationId,data:e.data})}catch(e){if(e.errorCode===a.EmbeddingErrorCodes.IncompatibleVersionError)throw e}}}},8340:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DataSource=class{constructor(e){this._dataSourceImpl=e}get name(){return this._dataSourceImpl.name}get id(){return this._dataSourceImpl.id}get fields(){return this._dataSourceImpl.fields}get extractUpdateTime(){return this._dataSourceImpl.extractUpdateTime}get isExtract(){return this._dataSourceImpl.isExtract}get isPublished(){return this._dataSourceImpl.isPublished}publishedUrl(){return this._dataSourceImpl.publishedUrl()}refreshAsync(){return this._dataSourceImpl.refreshAsync()}getActiveTablesAsync(){return console.warn("DataSource.getActiveTablesAsync is deprecated. Please use DataSource.getLogicalTablesAsync."),this._dataSourceImpl.getActiveTablesAsync()}getConnectionSummariesAsync(){return this._dataSourceImpl.getConnectionSummariesAsync()}getUnderlyingDataAsync(e){return console.warn("DataSource.getUnderlyingDataAsync is deprecated. Please use DataSource.getLogicalTablesAsync and DataSource.getLogicalTableDataAsync."),this._dataSourceImpl.getUnderlyingDataAsync(e)}getLogicalTablesAsync(){return this._dataSourceImpl.getLogicalTablesAsync()}getLogicalTableDataAsync(e,t){return this._dataSourceImpl.getLogicalTableDataAsync(e,t)}getLogicalTableDataReaderAsync(e,t,r){return this._dataSourceImpl.getLogicalTableDataReaderAsync(e,t,r)}}},1044:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(5520);class s{}t.ExternalToInternalEnumMappings=s,s.filterDomainType=new n.EnumConverter({[a.FilterDomainType.Relevant]:i.FilterDomainType.Relevant,[a.FilterDomainType.Database]:i.FilterDomainType.Database}),s.nullOptions=new n.EnumConverter({[a.FilterNullOption.AllValues]:i.FilterNullOption.AllValues,[a.FilterNullOption.NonNullValues]:i.FilterNullOption.NonNullValues,[a.FilterNullOption.NullValues]:i.FilterNullOption.NullValues}),s.filterUpdateType=new n.EnumConverter({[a.FilterUpdateType.Add]:i.FilterUpdateType.Add,[a.FilterUpdateType.All]:i.FilterUpdateType.All,[a.FilterUpdateType.Remove]:i.FilterUpdateType.Remove,[a.FilterUpdateType.Replace]:i.FilterUpdateType.Replace}),s.setVisibilityType=new n.EnumConverter({[a.ZoneVisibilityType.Show]:!0,[a.ZoneVisibilityType.Hide]:!1}),s.setReplaySpeedType=new n.EnumConverter({[a.ReplaySpeedType.Slow]:2,[a.ReplaySpeedType.Normal]:1,[a.ReplaySpeedType.Fast]:.5}),s.sheetType=new n.EnumConverter({[a.SheetType.Dashboard]:i.SheetType.Dashboard,[a.SheetType.Worksheet]:i.SheetType.Worksheet,[a.SheetType.Story]:i.SheetType.Story}),s.showDataTableFormatType=new n.EnumConverter({[a.IncludeDataValuesOption.AllValues]:i.ApiShowDataTableFormat.NativeAndFormattedValues,[a.IncludeDataValuesOption.OnlyNativeValues]:i.ApiShowDataTableFormat.NativeValuesOnly,[a.IncludeDataValuesOption.OnlyFormattedValues]:i.ApiShowDataTableFormat.FormattedValuesOnly}),s.periodType=new n.EnumConverter({[a.PeriodType.Years]:i.DateStepPeriod.Years,[a.PeriodType.Quarters]:i.DateStepPeriod.Quarters,[a.PeriodType.Months]:i.DateStepPeriod.Months,[a.PeriodType.Weeks]:i.DateStepPeriod.Weeks,[a.PeriodType.Days]:i.DateStepPeriod.Days,[a.PeriodType.Hours]:i.DateStepPeriod.Hours,[a.PeriodType.Minutes]:i.DateStepPeriod.Minutes,[a.PeriodType.Seconds]:i.DateStepPeriod.Seconds}),s.dateRangeType=new n.EnumConverter({[a.DateRangeType.Last]:i.DateRangeType.Last,[a.DateRangeType.LastN]:i.DateRangeType.LastN,[a.DateRangeType.Next]:i.DateRangeType.Next,[a.DateRangeType.NextN]:i.DateRangeType.NextN,[a.DateRangeType.Current]:i.DateRangeType.Current,[a.DateRangeType.ToDate]:i.DateRangeType.ToDate}),s.dialogStyles=new n.EnumConverter({[a.DialogStyle.Window]:i.DialogStyle.Window,[a.DialogStyle.Modal]:i.DialogStyle.Modal,[a.DialogStyle.Modeless]:i.DialogStyle.Modeless})},6557:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(5520);class s{}t.InternalToExternalEnumMappings=s,s.extensionContext=new n.EnumConverter({[i.ExtensionContext.Desktop]:a.ExtensionContext.Desktop,[i.ExtensionContext.Server]:a.ExtensionContext.Server,[i.ExtensionContext.PublicWeb]:a.ExtensionContext.PublicWeb,[i.ExtensionContext.PublicDesktop]:a.ExtensionContext.PublicDesktop,[i.ExtensionContext.Cloud]:a.ExtensionContext.Cloud}),s.extensionMode=new n.EnumConverter({[i.ExtensionMode.Authoring]:a.ExtensionMode.Authoring,[i.ExtensionMode.Viewing]:a.ExtensionMode.Viewing}),s.columnType=new n.EnumConverter({[i.ColumnType.Continuous]:a.ColumnType.Continuous,[i.ColumnType.Discrete]:a.ColumnType.Discrete,[i.ColumnType.Unknown]:a.ColumnType.Unknown}),s.fieldAggregationType=new n.EnumConverter({[i.FieldAggregationType.Attr]:a.FieldAggregationType.Attr,[i.FieldAggregationType.Avg]:a.FieldAggregationType.Avg,[i.FieldAggregationType.Collect]:a.FieldAggregationType.Collect,[i.FieldAggregationType.Count]:a.FieldAggregationType.Count,[i.FieldAggregationType.Countd]:a.FieldAggregationType.Countd,[i.FieldAggregationType.Day]:a.FieldAggregationType.Day,[i.FieldAggregationType.End]:a.FieldAggregationType.End,[i.FieldAggregationType.Hour]:a.FieldAggregationType.Hour,[i.FieldAggregationType.InOut]:a.FieldAggregationType.InOut,[i.FieldAggregationType.Kurtosis]:a.FieldAggregationType.Kurtosis,[i.FieldAggregationType.Max]:a.FieldAggregationType.Max,[i.FieldAggregationType.Mdy]:a.FieldAggregationType.Mdy,[i.FieldAggregationType.Median]:a.FieldAggregationType.Median,[i.FieldAggregationType.Min]:a.FieldAggregationType.Min,[i.FieldAggregationType.Minute]:a.FieldAggregationType.Minute,[i.FieldAggregationType.MonthYear]:a.FieldAggregationType.MonthYear,[i.FieldAggregationType.None]:a.FieldAggregationType.None,[i.FieldAggregationType.Qtr]:a.FieldAggregationType.Qtr,[i.FieldAggregationType.Quart1]:a.FieldAggregationType.Quart1,[i.FieldAggregationType.Quart3]:a.FieldAggregationType.Quart3,[i.FieldAggregationType.Second]:a.FieldAggregationType.Second,[i.FieldAggregationType.Skewness]:a.FieldAggregationType.Skewness,[i.FieldAggregationType.Stdev]:a.FieldAggregationType.Stdev,[i.FieldAggregationType.Stdevp]:a.FieldAggregationType.Stdevp,[i.FieldAggregationType.Sum]:a.FieldAggregationType.Sum,[i.FieldAggregationType.TruncDay]:a.FieldAggregationType.TruncDay,[i.FieldAggregationType.TruncHour]:a.FieldAggregationType.TruncHour,[i.FieldAggregationType.TruncMinute]:a.FieldAggregationType.TruncMinute,[i.FieldAggregationType.TruncMonth]:a.FieldAggregationType.TruncMonth,[i.FieldAggregationType.TruncQtr]:a.FieldAggregationType.TruncQtr,[i.FieldAggregationType.TruncSecond]:a.FieldAggregationType.TruncSecond,[i.FieldAggregationType.TruncWeek]:a.FieldAggregationType.TruncWeek,[i.FieldAggregationType.TruncYear]:a.FieldAggregationType.TruncYear,[i.FieldAggregationType.User]:a.FieldAggregationType.User,[i.FieldAggregationType.Var]:a.FieldAggregationType.Var,[i.FieldAggregationType.Varp]:a.FieldAggregationType.Varp,[i.FieldAggregationType.Week]:a.FieldAggregationType.Week,[i.FieldAggregationType.Weekday]:a.FieldAggregationType.Weekday,[i.FieldAggregationType.Year]:a.FieldAggregationType.Year}),s.fieldRoleType=new n.EnumConverter({[i.FieldRoleType.Dimension]:a.FieldRoleType.Dimension,[i.FieldRoleType.Measure]:a.FieldRoleType.Measure,[i.FieldRoleType.Unknown]:a.FieldRoleType.Unknown}),s.sheetType=new n.EnumConverter({[i.SheetType.Dashboard]:a.SheetType.Dashboard,[i.SheetType.Story]:a.SheetType.Story,[i.SheetType.Worksheet]:a.SheetType.Worksheet}),s.dashboardObjectType=new n.EnumConverter({[i.DashboardObjectType.Extension]:a.DashboardObjectType.Extension,[i.DashboardObjectType.Blank]:a.DashboardObjectType.Blank,[i.DashboardObjectType.Image]:a.DashboardObjectType.Image,[i.DashboardObjectType.Legend]:a.DashboardObjectType.Legend,[i.DashboardObjectType.PageFilter]:a.DashboardObjectType.PageFilter,[i.DashboardObjectType.ParameterControl]:a.DashboardObjectType.ParameterControl,[i.DashboardObjectType.QuickFilter]:a.DashboardObjectType.QuickFilter,[i.DashboardObjectType.Text]:a.DashboardObjectType.Text,[i.DashboardObjectType.Title]:a.DashboardObjectType.Title,[i.DashboardObjectType.WebPage]:a.DashboardObjectType.WebPage,[i.DashboardObjectType.Worksheet]:a.DashboardObjectType.Worksheet}),s.dataType=new n.EnumConverter({[i.DataType.Bool]:a.DataType.Bool,[i.DataType.Date]:a.DataType.Date,[i.DataType.DateTime]:a.DataType.DateTime,[i.DataType.Float]:a.DataType.Float,[i.DataType.Int]:a.DataType.Int,[i.DataType.Spatial]:a.DataType.Spatial,[i.DataType.String]:a.DataType.String}),s.filterUpdateType=new n.EnumConverter({[i.FilterUpdateType.Add]:a.FilterUpdateType.Add,[i.FilterUpdateType.All]:a.FilterUpdateType.All,[i.FilterUpdateType.Remove]:a.FilterUpdateType.Remove,[i.FilterUpdateType.Replace]:a.FilterUpdateType.Replace}),s.allowableValues=new n.EnumConverter({[i.DomainRestrictionType.All]:a.ParameterValueType.All,[i.DomainRestrictionType.List]:a.ParameterValueType.List,[i.DomainRestrictionType.Range]:a.ParameterValueType.Range}),s.dateStepPeriod=new n.EnumConverter({[i.DateStepPeriod.Years]:a.PeriodType.Years,[i.DateStepPeriod.Quarters]:a.PeriodType.Quarters,[i.DateStepPeriod.Months]:a.PeriodType.Months,[i.DateStepPeriod.Weeks]:a.PeriodType.Weeks,[i.DateStepPeriod.Days]:a.PeriodType.Days,[i.DateStepPeriod.Hours]:a.PeriodType.Hours,[i.DateStepPeriod.Minutes]:a.PeriodType.Minutes,[i.DateStepPeriod.Seconds]:a.PeriodType.Seconds}),s.dateRangeType=new n.EnumConverter({[i.DateRangeType.Current]:a.DateRangeType.Current,[i.DateRangeType.Last]:a.DateRangeType.Last,[i.DateRangeType.LastN]:a.DateRangeType.LastN,[i.DateRangeType.Next]:a.DateRangeType.Next,[i.DateRangeType.NextN]:a.DateRangeType.NextN,[i.DateRangeType.ToDate]:a.DateRangeType.ToDate}),s.errorCode=new n.EnumConverter({[i.ErrorCodes.INITIALIZATION_ERROR]:a.ErrorCodes.InternalError,[i.ErrorCodes.INTERNAL_ERROR]:a.ErrorCodes.InternalError,[i.ErrorCodes.MISSING_ENUM_MAPPING]:a.ErrorCodes.InternalError,[i.ErrorCodes.MISSING_PARAMETER]:a.ErrorCodes.InternalError,[i.ErrorCodes.PERMISSION_DENIED]:a.ErrorCodes.InternalError,[i.ErrorCodes.PRES_MODEL_PARSING_ERROR]:a.ErrorCodes.InternalError,[i.ErrorCodes.UNKNOWN_VERB_ID]:a.ErrorCodes.InternalError,[i.ErrorCodes.VERSION_NOT_CONFIGURED]:a.ErrorCodes.APINotInitialized,[i.ErrorCodes.VISIBILITY_ERROR]:a.ErrorCodes.VisibilityError},a.ErrorCodes.InternalError),s.filterType=new n.EnumConverter({[i.FilterType.Categorical]:a.FilterType.Categorical,[i.FilterType.Range]:a.FilterType.Range,[i.FilterType.RelativeDate]:a.FilterType.RelativeDate,[i.FilterType.Hierarchical]:a.FilterType.Hierarchical}),s.classNameKey=new n.EnumConverter({"tableau-dashboard-title":a.ClassNameKey.DashboardTitle,"tableau-story-title":a.ClassNameKey.StoryTitle,"tableau-tooltip":a.ClassNameKey.Tooltip,"tableau-worksheet":a.ClassNameKey.Worksheet,"tableau-worksheet-title":a.ClassNameKey.WorksheetTitle,"tableau-pane":a.ClassNameKey.Pane,"tableau-row-dividers":a.ClassNameKey.RowDividers,"tableau-column-dividers":a.ClassNameKey.ColumnDividers,"dashboard-title":a.ClassNameKey.DashboardTitle,"story-title":a.ClassNameKey.StoryTitle,tooltip:a.ClassNameKey.Tooltip,worksheet:a.ClassNameKey.Worksheet,"worksheet-title":a.ClassNameKey.WorksheetTitle,pane:a.ClassNameKey.Pane,"row-dividers":a.ClassNameKey.RowDividers,"column-dividers":a.ClassNameKey.ColumnDividers}),s.hierarchicalLevelSelectionState=new n.EnumConverter({[i.HierarchicalLevelSelectionState.AllSelected]:a.HierarchicalLevelSelectionState.AllSelected,[i.HierarchicalLevelSelectionState.NoneSelected]:a.HierarchicalLevelSelectionState.NoneSelected,[i.HierarchicalLevelSelectionState.SomeSelected]:a.HierarchicalLevelSelectionState.SomeSelected,[i.HierarchicalLevelSelectionState.UnknownSelected]:a.HierarchicalLevelSelectionState.UnknownSelected}),s.annotationType=new n.EnumConverter({[i.AnnotateEnum.Area]:a.AnnotationType.Area,[i.AnnotateEnum.Mark]:a.AnnotationType.Mark,[i.AnnotateEnum.Point]:a.AnnotationType.Point}),s.markType=new n.EnumConverter({[i.MarkType.Area]:a.MarkType.Area,[i.MarkType.Bar]:a.MarkType.Bar,[i.MarkType.Circle]:a.MarkType.Circle,[i.MarkType.GanttBar]:a.MarkType.GanttBar,[i.MarkType.Heatmap]:a.MarkType.Heatmap,[i.MarkType.Line]:a.MarkType.Line,[i.MarkType.Map]:a.MarkType.Map,[i.MarkType.Pie]:a.MarkType.Pie,[i.MarkType.Polygon]:a.MarkType.Polygon,[i.MarkType.Shape]:a.MarkType.Shape,[i.MarkType.Square]:a.MarkType.Square,[i.MarkType.Text]:a.MarkType.Text,[i.MarkType.VizExtension]:a.MarkType.VizExtension})},2680:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(6664);t.EventListenerManager=class{constructor(){this._eventListenerManagers={}}addEventListener(e,t){if(!this._eventListenerManagers.hasOwnProperty(e))throw new i.TableauError(a.ErrorCodes.UnsupportedEventName,`Cannot add event, unsupported event type: ${e}`);return this._eventListenerManagers[e].addEventListener(t)}removeEventListener(e,t){if(!this._eventListenerManagers.hasOwnProperty(e))throw new i.TableauError(a.ErrorCodes.UnsupportedEventName,`Cannot remove event, unsupported event type: ${e}`);return this._eventListenerManagers[e].removeEventListener(t)}addNewEventType(e){this._eventListenerManagers[e.eventType]=e}}},1072:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Field=class{constructor(e){this._fieldImpl=e}get name(){return this._fieldImpl.name}get id(){return this._fieldImpl.id}get description(){return this._fieldImpl.description}get dataType(){return this._fieldImpl.dataType}get aggregation(){return this._fieldImpl.aggregation}get dataSource(){return this._fieldImpl.dataSource}get role(){return this._fieldImpl.role}get columnType(){return this._fieldImpl.columnType}get isCalculatedField(){return this._fieldImpl.isCalculatedField}get isCombinedField(){return this._fieldImpl.isCombinedField}get isGenerated(){return this._fieldImpl.isGenerated}get isGeospatial(){return this._fieldImpl.isGeospatial}get isHidden(){return this._fieldImpl.isHidden}get isPresentOnPublishedDatasource(){return this._fieldImpl.isPresentOnPublishedDatasource}}},2520:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(5136);t.CustomViewImpl=class{constructor(e,t){this._registryId=t,this._luid=e.luid,this._name=e.name,this._shared=e.shared,this._isDefault=e.isDefault,this._ownerName=e.owner.userFriendlyName,this._url=e.url}get luid(){return this._luid}get name(){return this._name}set name(e){this._name=e}get shared(){return this._shared}set shared(e){this._shared=e}get isDefault(){return this._isDefault}set isDefault(e){this._isDefault=e}get ownerName(){return this._ownerName}get url(){return this._url}saveAsync(){return a.ApiServiceRegistry.get(this._registryId).getService("viz-service").saveAsync(this)}}},1940:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(7419),n=r(3448),s=r(6557),o=r(6368),l=r(3008),d=r(6664),c=r(7480),u=r(6488),h=r(8332),p=r(8736),m=r(6500);class g extends h.SheetImpl{constructor(e,t,r,a,i,n=0){super(e,a),this._zones=t,this._sheetPath=r,this._parentStoryPointImpl=i,this._activeDashboardObjectId=n}get worksheetsImpl(){return this._worksheetsImpl}get objects(){return this._objects}get parentStoryPoint(){return this._parentStoryPointImpl}get activeDashboardObjectId(){return this._activeDashboardObjectId}get activeDashboardName(){return this._sheetPath.sheetName}initializeWithPublicInterfaces(){this._worksheetsImpl=new Array,this._objects=new Array,this.zoneMap=new Map;for(const e of this._zones){let t;const r={width:e.width,height:e.height},a=!1;if(e.zoneType===n.DashboardObjectType.Worksheet||e.zoneType===n.DashboardObjectType.QuickFilter){let s="",o="",l=!1;e.sheetInfo?(s=e.sheetInfo.name,o=e.sheetInfo.url||"",l=""===o):s=e.name;const d=new p.SheetInfoImpl(s,i.SheetType.Worksheet,r,this._worksheetsImpl.length,a,l,o),c={worksheet:s,dashboard:this._sheetInfoImpl.name,storyboard:this._sheetPath.storyboard,flipboardZoneID:this._sheetPath.flipboardZoneID,storyPointID:this._sheetPath.storyPointID};t=new m.WorksheetImpl(d,this._registryId,c,this,this._parentStoryPointImpl),e.zoneType===n.DashboardObjectType.Worksheet&&this._worksheetsImpl.push(t)}const l=new o.Point(e.x,e.y),d=new u.DashboardObjectImpl(this,s.InternalToExternalEnumMappings.dashboardObjectType.convert(e.zoneType),l,r,t,e.name,void 0!==e.isFloating&&e.isFloating,void 0===e.isVisible||e.isVisible,e.zoneId,e.fieldId);this._objects.push(d),this.zoneMap.set(e.zoneId,d)}}setDashboardObjectVisibilityAsync(e){return l.ApiServiceRegistry.get(this._registryId).getService("zone-service").setVisibilityAsync(this.name,this.zoneMap,e)}getDashboardObjectById(e){return this.zoneMap.get(e)}updateZones(e,t=0,r=""){const a=this._objects,n=this.zoneMap,s=this._activeDashboardObjectId,o=this._sheetPath.sheetName;this._zones=e,this._activeDashboardObjectId=t,r&&(this._sheetPath.sheetName=r,this._sheetInfoImpl.name=r),this.initializeWithPublicInterfaces();const l=this._objects,d=this.zoneMap,c=new Map;return a.forEach((e=>{const t=e.id;if(!d.has(t))return void this.addChange(t,c,i.DashboardLayoutChange.Removed);const r=d.get(t);e.isFloating!==r.isFloating&&this.addChange(t,c,i.DashboardLayoutChange.IsFloatingChanged),e.isVisible!==r.isVisible&&this.addChange(t,c,i.DashboardLayoutChange.IsVisibleChanged),e.name!==r.name&&this.addChange(t,c,i.DashboardLayoutChange.NameChanged),e.position.x===r.position.x&&e.position.y===r.position.y||this.addChange(t,c,i.DashboardLayoutChange.PositionChanged),e.size.width===r.size.width&&e.size.height===r.size.height||this.addChange(t,c,i.DashboardLayoutChange.SizeChanged)})),l.forEach((e=>{n.has(e.id)||this.addChange(e.id,c,i.DashboardLayoutChange.Added)})),s!==t&&(0!==t&&this.addChange(t,c,i.DashboardLayoutChange.Selected),0!==s&&this.addChange(s,c,i.DashboardLayoutChange.Deselected)),r&&o!==r&&this.addChange(0,c,i.DashboardLayoutChange.DashboardChanged),c}addChange(e,t,r){t.has(e)||t.set(e,[]),t.get(e).push(r)}moveAndResizeDashboardObjectsAsync(e){return l.ApiServiceRegistry.get(this._registryId).getService("zone-service").moveAndResizeAsync(this.name,this.zoneMap,e)}replayAnimationAsync(e){return l.ApiServiceRegistry.get(this._registryId).getService("animation-service").replayAsync(e)}getFiltersAsync(){return this.verifyActiveSheetOrEmbeddedInActiveStoryPoint(),l.ApiServiceRegistry.get(this._registryId).getService("filter-service").getDashboardFiltersAsync()}applyFilterAsync(e,t,r,n){if(c.ErrorHelpers.verifyEnumValue(r,a.FilterUpdateType,"FilterUpdateType"),c.ErrorHelpers.verifyStringParameter(e,"fieldName"),!Array.isArray(t))throw new d.TableauError(i.ErrorCodes.InvalidParameter,"values parameter for applyDashboardFilterAsync must be an array");return this.verifyActiveSheetOrEmbeddedInActiveStoryPoint(),l.ApiServiceRegistry.get(this._registryId).getService("filter-service").applyDashboardFilterAsync(e,t,r,n)}getWorksheetNamesFromZones(){const e=[];for(const t of this._zones){if(t.zoneType!==n.DashboardObjectType.Worksheet)continue;const r=t.sheetInfo?t.sheetInfo.name:t.name;e.push(r)}return e}verifyActiveSheetOrEmbeddedInActiveStoryPoint(){const e=this.active,t=null!=this.parentStoryPoint&&this.parentStoryPoint.active;if(!e&&!t)throw new d.TableauError(i.SharedErrorCodes.NotActiveSheet,"Operation not allowed on non-active sheet")}}t.DashboardImpl=g},6488:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DashboardObjectImpl=class{constructor(e,t,r,a,i,n,s,o,l,d){this._dashboardImpl=e,this._type=t,this._position=r,this._size=a,this._worksheetImpl=i,this._name=n,this._isFloating=s,this._isVisible=o,this._id=l,this._fieldId=d}get dashboardImpl(){return this._dashboardImpl}get type(){return this._type}get position(){return this._position}get size(){return this._size}get worksheetImpl(){return this._worksheetImpl}get name(){return this._name}get isFloating(){return this._isFloating}get isVisible(){return this._isVisible}get id(){return this._id}get fieldId(){return this._fieldId}}},2180:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(716),n=r(1072),s=r(624),o=r(3008),l=r(7603),d=r(7480),c=r(5288);t.DataSourceImpl=class{constructor(e,t){this._dataSourceInfo=e,this._registryId=t,this._fields=e.fields.map((e=>{const t=new c.FieldImpl(e,this);return new n.Field(t)}))}get name(){return this._dataSourceInfo.name}get id(){return this._dataSourceInfo.id}get extractUpdateTime(){return this._dataSourceInfo.extractUpdateTime}get fields(){return this._fields}get isExtract(){return this._dataSourceInfo.isExtract}get isPublished(){return this._dataSourceInfo.isPublished}publishedUrl(){return this._dataSourceInfo.publishedUrl}getMaxPageRowLimit(){return 1e4}refreshAsync(){return o.ApiServiceRegistry.get(this._registryId).getService("data-source-service").refreshAsync(this._dataSourceInfo.id)}getConnectionSummariesAsync(){return o.ApiServiceRegistry.get(this._registryId).getService("data-source-service").getConnectionSummariesAsync(this._dataSourceInfo.id).then((e=>e.map((e=>new i.ConnectionSummary(e)))))}getActiveTablesAsync(){return o.ApiServiceRegistry.get(this._registryId).getService("data-source-service").getActiveTablesAsync(this._dataSourceInfo.id).then((e=>e.map((e=>new l.TableSummary(e)))))}getUnderlyingDataAsync(e){return e=e||{},o.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getDataSourceDataAsync(this.id,!!e.ignoreAliases,e.maxRows||0,e.columnsToInclude||[],e.columnsToIncludeById||[],e.includeDataValuesOption||a.IncludeDataValuesOption.AllValues)}getLogicalTableDataAsync(e,t){return t=t||{},o.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getLogicalTableDataAsync(this.id,e,!!t.ignoreAliases,t.maxRows||0,t.columnsToInclude||[],t.columnsToIncludeById||[],t.includeDataValuesOption||a.IncludeDataValuesOption.AllValues)}getLogicalTableDataReaderAsync(e,t,r){return r=r||{},o.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getLogicalTableDataReaderAsync(this.id,e,t||this.getMaxPageRowLimit(),!!r.ignoreAliases,r.columnsToIncludeById||[],r.includeDataValuesOption||a.IncludeDataValuesOption.AllValues)}initializeWithPublicInterfaces(e){d.ErrorHelpers.verifyInternalValue(e,"dataSource"),this._fields=this._dataSourceInfo.fields.map((t=>{const r=new c.FieldImpl(t,e);return new n.Field(r)}))}getLogicalTablesAsync(){return o.ApiServiceRegistry.get(this._registryId).getService("data-source-service").getLogicalTablesAsync(this.id).then((e=>e.map((e=>new s.LogicalTable(e)))))}}},5288:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(6557);t.FieldImpl=class{constructor(e,t){this._fieldInfo=e,this._parentDataSource=t}get name(){return this._fieldInfo.name}get id(){return this._fieldInfo.id}get description(){return this._fieldInfo.description}get dataType(){var e;return null!=(e=this._fieldInfo.dataType)?e:a.DataType.Unknown}get aggregation(){return n.InternalToExternalEnumMappings.fieldAggregationType.convert(this._fieldInfo.aggregation)}get dataSource(){if(!this._parentDataSource)throw new Error("Data source information is not available for this field. Please use getFieldAsync method to get field's data source information");return this._parentDataSource}get role(){return n.InternalToExternalEnumMappings.fieldRoleType.convert(this._fieldInfo.role)}get columnType(){let e=this._fieldInfo.columnType||i.ColumnType.Unknown;return n.InternalToExternalEnumMappings.columnType.convert(e)}get isCalculatedField(){return this._fieldInfo.isCalculatedField}get isCombinedField(){return this._fieldInfo.isCombinedField}get isGenerated(){return this._fieldInfo.isGenerated}get isGeospatial(){return this._fieldInfo.isGeospatial}get isHidden(){return this._fieldInfo.isHidden}get isPresentOnPublishedDatasource(){return this._fieldInfo.isPresentOnPublishedDatasource}}},8552:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(6557),n=r(3008),s=r(8052),o=r(7480),l=r(1172);t.ParameterImpl=class{constructor(e,t){this._registryId=t,this.setParameterInfo(e)}get name(){return this._parameterInfo.name}get currentValue(){return s.DataValueFactory.MakeParameterDataValue(this._parameterInfo.currentValue,this._parameterInfo.dataType)}get dataType(){return i.InternalToExternalEnumMappings.dataType.convert(this._parameterInfo.dataType)}get id(){return this._globalFieldName}get allowableValues(){return this._allowableValues}changeValueAsync(e){o.ErrorHelpers.verifyParameter(e,"newValue");const t=l.Param.serializeParameterValue(e);return n.ApiServiceRegistry.get(this._registryId).getService("parameters-service").changeParameterValueAsync(this._globalFieldName,t).then((e=>(this.setParameterInfo(e),this.currentValue)))}setParameterInfo(e){this._parameterInfo=e,this._globalFieldName=e.fieldName;const t=i.InternalToExternalEnumMappings.allowableValues.convert(e.allowableValuesType);let r,n,o,l,d;t===a.ParameterValueType.List?r=(e.allowableValues||[]).map((t=>s.DataValueFactory.MakeParameterDataValue(t,e.dataType))):t===a.ParameterValueType.Range&&(n=e.minValue&&s.DataValueFactory.MakeParameterDataValue(e.minValue,e.dataType),o=e.maxValue&&s.DataValueFactory.MakeParameterDataValue(e.maxValue,e.dataType),l=e.stepSize,d=e.dateStepPeriod&&i.InternalToExternalEnumMappings.dateStepPeriod.convert(e.dateStepPeriod)),this._allowableValues={type:t,allowableValues:r,minValue:n,maxValue:o,stepSize:l,dateStepPeriod:d}}}},8332:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3008),n=r(6664),s=r(7480),o=r(1172),l=r(2780);class d{constructor(e,t){this._sheetInfoImpl=e,this._registryId=t}get name(){return this._sheetInfoImpl.name}get sheetType(){return this._sheetInfoImpl.sheetType}get sheetPath(){return this._sheetInfoImpl.sheetPath}get size(){return this._sheetInfoImpl.sheetSize}get hidden(){if(void 0!==this._sheetInfoImpl.isHidden)return this._sheetInfoImpl.isHidden;throw new n.TableauError(a.EmbeddingErrorCodes.ImplementationError,"isHidden not implemented")}get active(){if(void 0!==this._sheetInfoImpl.isActive)return this._sheetInfoImpl.isActive;throw new n.TableauError(a.EmbeddingErrorCodes.ImplementationError,"active not implemented")}set active(e){void 0!==this._sheetInfoImpl.isActive&&(this._sheetInfoImpl.active=e)}get index(){if(void 0!==this._sheetInfoImpl.index)return this._sheetInfoImpl.index;throw new n.TableauError(a.EmbeddingErrorCodes.ImplementationError,"index not implemented")}get url(){if(void 0!==this._sheetInfoImpl.url)return this._sheetInfoImpl.url;throw new n.TableauError(a.EmbeddingErrorCodes.ImplementationError,"url not implemented")}getSheetSize(){if(!l.SheetUtils.isValidSheetSize(this.size))throw new n.TableauError(a.EmbeddingErrorCodes.InternalError,"size is not of type SheetSize");return this.size}findParameterAsync(e){return s.ErrorHelpers.verifyParameter(e,"parameterName"),i.ApiServiceRegistry.get(this._registryId).getService("parameters-service").findParameterByNameAsync(e)}getParametersAsync(){return i.ApiServiceRegistry.get(this._registryId).getService("parameters-service").getParametersForSheetAsync(this.sheetPath)}changeSizeAsync(e){const t=new n.TableauError(a.EmbeddingErrorCodes.InvalidSize,"Invalid sheet size parameter");if(!e||!e.behavior)throw t;const r=this.normalizeSheetSize(e),s=r.behavior===a.SheetSizeBehavior.Automatic;if(!s&&!r.minSize&&!r.maxSize)throw t;if(!s&&this.sheetType===a.SheetType.Worksheet)throw new n.TableauError(a.EmbeddingErrorCodes.InvalidSizeBehaviorOnWorksheet,"Only SheetSizeBehavior.Automatic is allowed on Worksheets");if(s&&this.getSheetSize().behavior===r.behavior)return Promise.resolve(e);const o=this.processNewSize(r);return i.ApiServiceRegistry.get(this._registryId).getService("size-service").changeSizeAsync(this.name,o).then((()=>i.ApiServiceRegistry.get(this._registryId).getService("client-info-service").getClientInfoAsync().then((e=>{const t=e.publishedSheets.find((e=>e.name===this.name));if(!t)throw new n.TableauError(a.SharedErrorCodes.InternalError,`Can't find sheet with name ${this.name}`);const r=l.SheetUtils.getSheetSizeFromSizeConstraints(t.sizeConstraint);return this._sheetInfoImpl.sheetSize=r,r}))))}normalizeSheetSize(e){const{behavior:t}=e;return s.ErrorHelpers.verifyEnumValue(t,a.SheetSizeBehavior,"SheetSizeBehavior"),{behavior:t,minSize:d.parseDimensions(e.minSize),maxSize:d.parseDimensions(e.maxSize)}}processNewSize(e){var t,r,i,s;const{behavior:l,minSize:d,maxSize:c}=e,u=!o.Param.isNullOrUndefined(null===(t=d)||void 0===t?void 0:t.width),h=!o.Param.isNullOrUndefined(null===(r=d)||void 0===r?void 0:r.height),p=!o.Param.isNullOrUndefined(null===(i=c)||void 0===i?void 0:i.width),m=!o.Param.isNullOrUndefined(null===(s=c)||void 0===s?void 0:s.height),g=u&&h,y=p&&m;switch(l){case a.SheetSizeBehavior.Automatic:return{behavior:l};case a.SheetSizeBehavior.AtMost:{if(!c||!y)throw new n.TableauError(a.EmbeddingErrorCodes.MissingMaxSize,"Missing maxSize for SheetSizeBehavior.AtMost");const e={width:c.width,height:c.height};if(e.width<0||e.height<0)throw new n.TableauError(a.EmbeddingErrorCodes.InvalidSize,"Size value cannot be less than zero");return{behavior:l,maxSize:e}}case a.SheetSizeBehavior.AtLeast:{if(!d||!g)throw new n.TableauError(a.EmbeddingErrorCodes.MissingMinSize,"Missing minSize for SheetSizeBehavior.AtLeast");const e={width:d.width,height:d.height};if(e.width<0||e.height<0)throw new n.TableauError(a.EmbeddingErrorCodes.InvalidSize,"Size value cannot be less than zero");return{behavior:l,minSize:e}}case a.SheetSizeBehavior.Range:{if(!(d&&c&&g&&y))throw new n.TableauError(a.EmbeddingErrorCodes.MissingMinMaxSize,"Missing minSize or maxSize for SheetSizeBehavior.Range");const e={width:d.width,height:d.height},t={width:c.width,height:c.height};if(e.width<0||e.height<0||t.width<0||t.height<0||e.width>t.width||e.height>t.height)throw new n.TableauError(a.EmbeddingErrorCodes.InvalidSize,"Missing minSize or maxSize for SheetSizeBehavior.Range");return{behavior:l,minSize:e,maxSize:t}}case a.SheetSizeBehavior.Exactly:if(d&&c){if(g&&y){const e={width:d.width,height:d.height},t={width:c.width,height:c.height};if(e.width!==t.width||e.height!==t.height)throw new n.TableauError(a.EmbeddingErrorCodes.InvalidSize,"Conflicting size values for SheetSizeBehavior.Exactly");return{behavior:l,minSize:e,maxSize:t}}if(g){const e={width:d.width,height:d.height};return{behavior:l,minSize:e,maxSize:e}}if(y){const e={width:c.width,height:c.height};return{behavior:l,minSize:e,maxSize:e}}}throw new n.TableauError(a.EmbeddingErrorCodes.InvalidSize,"Invalid sheet size parameter");default:throw new n.TableauError(a.SharedErrorCodes.InternalError,`Unsupported sheet size behavior: ${l}`)}}}t.SheetImpl=d,d.parseDimensions=e=>{const t={width:void 0,height:void 0};if(!e)return t;const{success:r,parsed:a}=o.Param.tryParseNumber(e.width),{success:i,parsed:n}=o.Param.tryParseNumber(e.height);return r&&i?{width:a,height:n}:r?{width:a}:i?{height:n}:t}},8736:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419);t.SheetInfoImpl=class{constructor(e,t,r,a,i,n,s){this._name=e,this._sheetType=t,this._sheetSize=r,this._index=a,this._isActive=i,this._isHidden=n,this._url=s}get name(){return this._name}set name(e){this._name=e}get sheetSize(){return this._sheetSize}set sheetSize(e){this._sheetSize=e}get sheetType(){return this._sheetType}get sheetPath(){return{sheetName:this.name,isDashboard:this.sheetType===a.SheetType.Dashboard}}get index(){return this._index}get isActive(){return this._isActive}set active(e){this._isActive=e}get isHidden(){return this._isHidden}get url(){return this._url}}},5144:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SingleEventManagerImpl=class{constructor(e){this._eventType=e,this._handlers=[]}get eventType(){return this._eventType}addEventListener(e){return this._handlers.push(e),()=>this.removeEventListener(e)}removeEventListener(e){const t=this._handlers.length;return this._handlers=this._handlers.filter((t=>t!==e)),t>this._handlers.length}triggerEvent(e){for(const t of this._handlers)try{t(e())}catch(e){continue}}}},6804:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3008),n=r(6664),s=r(7480),o=r(3036),l=r(8332),d=r(2608),c=r(6068);class u extends l.SheetImpl{constructor(e,t,r,a){super(e,a),this._sheetInfoImpl=e,this._publishedSheetInfos=r,this._registryId=a,this._storyPointInfoImpls=[],this._deferred=new o.ShortLivedDeferred,this.initializeStory(t)}initializeStory(e){e.storyPoints.forEach((t=>{const r=t.index===e.activeStoryPointIndex,a=new c.StoryPointInfoImpl(t.caption,t.index,t.storyPointId,r,t.updated,this);this._storyPointInfoImpls.push(a),r&&(this._activeStoryPointImpl=new d.StoryPointImpl(a,this._publishedSheetInfos,this._registryId,t.containedSheetInfo))}))}updateStoryInfo(e,t){if(!this._storyPointInfoImpls)return;let r=this._storyPointInfoImpls[e];if(r.storyPointId!==t.storyPointId)throw new n.TableauError(a.EmbeddingErrorCodes.StoryPointIdMismatch,`We should not be updating a story point when the IDs don't match. Existing storyPointID=${r.storyPointId}, newStoryPointID=${t.storyPointId}`);r.caption=t.caption,r.updated=t.updated,this._activeStoryPointImpl.storyPointId===t.storyPointId&&(this._activeStoryPointImpl.updated=r.updated)}updateStory(e){this._storyPointInfoImpls&&(this._storyPointInfoImpls.forEach((t=>{t.storyPointId===e.storyPointId?(t.caption=e.caption,t.index=e.index,t.active=!0,t.updated=e.updated,this._activeStoryPointImpl=new d.StoryPointImpl(t,this._publishedSheetInfos,this._registryId,e.containedSheetInfo)):t.active=!1})),this.activeStoryPoint&&this._deferred.resolve(this.activeStoryPoint))}get activeStoryPoint(){return this._activeStoryPointImpl}get storyPointsInfo(){return this._storyPointInfoImpls}get isActive(){return this._sheetInfoImpl.active}get isHidden(){return!!this._sheetInfoImpl.isHidden}activateNextStoryPointAsync(){if(this._activeStoryPointImpl.index===this._storyPointInfoImpls.length-1)return Promise.resolve(this._activeStoryPointImpl);let e=this._deferred.getNewPromiseOrThrowIfBusy();return i.ApiServiceRegistry.get(this._registryId).getService("story-activation-service").activateNextStoryPointAsync(),e}activatePreviousStoryPointAsync(){if(0===this._activeStoryPointImpl.index)return Promise.resolve(this._activeStoryPointImpl);let e=this._deferred.getNewPromiseOrThrowIfBusy();return i.ApiServiceRegistry.get(this._registryId).getService("story-activation-service").activatePreviousStoryPointAsync(),e}activateStoryPointAsync(e){if(s.ErrorHelpers.verifyParameter(e,"index"),s.ErrorHelpers.verifyParameterType(e,"number","index"),e<0||e>=this._storyPointInfoImpls.length)throw new n.TableauError(a.EmbeddingErrorCodes.IndexOutOfRange,"The index passed to this command is out of range.");if(e===this._activeStoryPointImpl.index)return Promise.resolve(this._activeStoryPointImpl);let t=this._deferred.getNewPromiseOrThrowIfBusy();return i.ApiServiceRegistry.get(this._registryId).getService("story-activation-service").activateStoryPointAsync(e),t}revertStoryPointAsync(e){if(s.ErrorHelpers.verifyParameter(e,"index"),s.ErrorHelpers.verifyParameterType(e,"number","index"),e<0||e>=this._storyPointInfoImpls.length)throw new n.TableauError(a.EmbeddingErrorCodes.IndexOutOfRange,"The index passed to this command is out of range.");return i.ApiServiceRegistry.get(this._registryId).getService("story-activation-service").revertStoryPointAsync(e).then((e=>(this.updateStoryInfo(e.index,e),new c.StoryPointInfoImpl(e.caption,e.index,e.storyPointId,!1,e.updated,this))))}clearPendingPromises(){this._deferred&&this._deferred.reject("All pending promises cleared")}}t.StoryImpl=u},2608:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(6664),n=r(2780),s=r(1940),o=r(8736),l=r(6500);t.StoryPointImpl=class{constructor(e,t,r,a){this._storyPointInfoImpl=e,a&&(this._containedSheetImpl=this.createContainedSheet(a,t,r))}get index(){return this._storyPointInfoImpl.index}get caption(){return this._storyPointInfoImpl.caption}get active(){return this._storyPointInfoImpl.active}get updated(){return this._storyPointInfoImpl.updated}set updated(e){this._storyPointInfoImpl.updated=e}get parentStory(){return this._storyPointInfoImpl.parentStory}get containedSheet(){return this._containedSheetImpl}get storyPointId(){return this._storyPointInfoImpl.storyPointId}createContainedSheet(e,t,r){const d=n.SheetUtils.getPublishedSheetInfoByName(e.name,t),c=n.SheetUtils.createAutomaticSize(),u=void 0===d,h=d?d.url:"",p=new o.SheetInfoImpl(e.name,n.SheetUtils.getSheetTypeEnum(e.sheetType),c,-1,!1,u,h);let m;switch(p.sheetType){case a.SheetType.Worksheet:{const e={worksheet:p.name};m=new l.WorksheetImpl(p,r,e,null,this);break}case a.SheetType.Dashboard:{const t={sheetName:p.name,isDashboard:!0};m=new s.DashboardImpl(p,e.dashboardZones,t,r,this);break}default:throw new i.TableauError(a.SharedErrorCodes.ServerError,"Invalid SheetType")}return m}}},6068:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.StoryPointInfoImpl=class{constructor(e,t,r,a,i,n){this._caption=e,this._index=t,this._storyPointId=r,this._active=a,this._updated=i,this._parentStoryImpl=n}get caption(){return this._caption}set caption(e){this._caption=e}get index(){return this._index}set index(e){this._index=e}get storyPointId(){return this._storyPointId}get active(){return this._active}set active(e){this._active=e}get updated(){return this._updated}set updated(e){this._updated=e}get parentStory(){return this._parentStoryImpl}}},3044:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.WorkbookImpl=class{}},6500:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(7419),n=r(8340),s=r(624),o=r(3483),l=r(3008),d=r(6664),c=r(7480),u=r(2180),h=r(8332);class p extends h.SheetImpl{constructor(e,t,r,a,i,n=null,s=null){super(e,t),this._visualId=r,this._parentDashboardImpl=a,this._parentStoryPointImpl=i,this._backgroundColor=n,this._formatting=s}get parentDashboard(){return this._parentDashboardImpl}get parentStoryPoint(){return this._parentStoryPointImpl}get visualId(){return this._visualId}getMaxPageRowLimit(){return 1e4}get backgroundColor(){return this._backgroundColor}get formatting(){return this._formatting}applyFilterAsync(e,t,r,i){return c.ErrorHelpers.verifyEnumValue(r,a.FilterUpdateType,"Contract.FilterUpdateType"),this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("filter-service").applyFilterAsync(this.visualId,e,t,r,i)}applyRangeFilterAsync(e,t){return c.ErrorHelpers.verifyParameter(e,"fieldName"),c.ErrorHelpers.verifyParameter(t,"filterOptions"),t.nullOption?c.ErrorHelpers.verifyEnumValue(t.nullOption,i.FilterNullOption,"FilterNullOption"):c.ErrorHelpers.verifyRangeParamType(t.min,t.max),this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("filter-service").applyRangeFilterAsync(this.visualId,e,t)}applyHierarchicalFilterAsync(e,t,r,n){if(c.ErrorHelpers.verifyParameter(e,"fieldName"),c.ErrorHelpers.verifyParameter(t,"values"),c.ErrorHelpers.verifyEnumValue(r,a.FilterUpdateType,"Contract.FilterUpdateType"),!Array.isArray(t)&&!t.levels)throw new d.TableauError(i.ErrorCodes.InvalidParameter,"values parameter for applyHierarchicalFilterAsync must be an array or contain a levels key");return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("filter-service").applyHierarchicalFilterAsync(this.visualId,e,t,r,n)}clearFilterAsync(e){return c.ErrorHelpers.verifyParameter(e,"fieldName"),this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("filter-service").clearFilterAsync(this.visualId,e)}applyRelativeDateFilterAsync(e,t){return c.ErrorHelpers.verifyStringParameter(e,"fieldName"),c.ErrorHelpers.verifyParameter(t,"options"),c.ErrorHelpers.verifyEnumValue(t.periodType,i.PeriodType,"PeriodType"),c.ErrorHelpers.verifyEnumValue(t.rangeType,i.DateRangeType,"DateRangeType"),this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("filter-service").applyRelativeDateFilterAsync(this.visualId,e,t)}getDataSourcesAsync(){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("data-source-service").getDataSourcesAsync(this.visualId).then((e=>{const t=e,r=t.worksheetDataSchemaMap[this.name],a=[],i=r.primaryDataSource;a.push(this.createDataSourceFromInfo(t.dataSources[i]));for(const e of r.referencedDataSourceList)e!==i&&a.push(this.createDataSourceFromInfo(t.dataSources[e]));return a}))}getFiltersAsync(){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("filter-service").getFiltersAsync(this.visualId)}getSelectedMarksAsync(){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getSelectedMarksAsync(this.visualId)}getHighlightedMarksAsync(){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getHighlightedMarksAsync(this.visualId)}getSummaryDataAsync(e){var t;return this.verifyActiveSheet(),e=e||{},l.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getUnderlyingDataAsync(this.visualId,o.GetDataType.Summary,!!e.ignoreAliases,!!e.ignoreSelection,!0,e.columnsToIncludeById||[],e.maxRows||0,e.includeDataValuesOption||i.IncludeDataValuesOption.AllValues,null!=(t=e.applyWorksheetFormatting)&&t)}getSummaryDataReaderAsync(e,t){var r;return this.verifyActiveSheet(),t=t||{},l.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getSummaryDataReaderAsync(this.visualId,e||this.getMaxPageRowLimit(),!!t.ignoreAliases,!!t.ignoreSelection,!0,t.columnsToIncludeById||[],t.includeDataValuesOption||i.IncludeDataValuesOption.AllValues,null!=(r=t.applyWorksheetFormatting)&&r)}getVisualSpecificationAsync(){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("visual-model-service").getVisualSpecificationAsync(this.visualId)}addMarksCardFieldsAsync(e,t,r,a){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("visual-model-service").addMarksCardFieldsAsync(this.visualId,e,t,r,a)}moveMarksCardFieldAsync(e,t,r,a){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("visual-model-service").moveMarksCardFieldAsync(this.visualId,e,t,r,a)}spliceMarksCardFieldsAsync(e,t,r,a,i){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("visual-model-service").spliceMarksCardFieldsAsync(this.visualId,e,t,r,a,i)}getSummaryColumnsInfoAsync(){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getSummaryColumnsInfoAsync(this.visualId)}getUnderlyingDataAsync(e){var t;return this.verifyActiveSheet(),e=e||{},l.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getUnderlyingDataAsync(this.visualId,o.GetDataType.Underlying,!!e.ignoreAliases,!!e.ignoreSelection,!!e.includeAllColumns,e.columnsToIncludeById||[],e.maxRows||0,e.includeDataValuesOption||i.IncludeDataValuesOption.AllValues,null!=(t=e.applyWorksheetFormatting)&&t)}getUnderlyingTablesAsync(){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("data-source-service").getUnderlyingTablesAsync(this.visualId).then((e=>e.map((e=>new s.LogicalTable(e)))))}getUnderlyingTableDataAsync(e,t){var r;return this.verifyActiveSheet(),t=t||{},l.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getUnderlyingTableDataAsync(this.visualId,e,!!t.ignoreAliases,!!t.ignoreSelection,!!t.includeAllColumns,t.columnsToIncludeById||[],t.maxRows||0,t.includeDataValuesOption||i.IncludeDataValuesOption.AllValues,null!=(r=t.applyWorksheetFormatting)&&r)}getUnderlyingTableDataReaderAsync(e,t,r){var a;return this.verifyActiveSheet(),r=r||{},l.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getUnderlyingTableDataReaderAsync(this.visualId,e,t||this.getMaxPageRowLimit(),!!r.ignoreAliases,!!r.ignoreSelection,!!r.includeAllColumns,r.columnsToIncludeById||[],r.includeDataValuesOption||i.IncludeDataValuesOption.AllValues,null!=(a=r.applyWorksheetFormatting)&&a)}clearSelectedMarksAsync(){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("selection-service").clearSelectedMarksAsync(this.visualId)}selectMarksByValueAsync(e,t){return c.ErrorHelpers.verifyParameter(e,"fieldName"),c.ErrorHelpers.verifyEnumValue(t,i.SelectionUpdateType,"SelectionUpdateType"),this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("selection-service").selectMarksByValueAsync(this.visualId,e,t)}selectMarksByIdAsync(e,t){return c.ErrorHelpers.verifyParameter(e,"fieldName"),c.ErrorHelpers.verifyEnumValue(t,i.SelectionUpdateType,"SelectionUpdateType"),this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("selection-service").selectMarksByIdAsync(this.visualId,e,t)}annotateMarkAsync(e,t){return c.ErrorHelpers.verifyParameter(e,"mark"),this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("annotation-service").annotateMarkAsync(this.visualId,e,t)}getAnnotationsAsync(){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("annotation-service").getAnnotationsAsync(this.visualId)}removeAnnotationAsync(e){return c.ErrorHelpers.verifyParameter(e,"annotation"),this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("annotation-service").removeAnnotationAsync(this.visualId,e)}appendContextMenuAsync(e,t){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("external-context-menu-service").appendContextMenuAsync(this.visualId.worksheet,e,t)}removeContextMenuAsync(e,t){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("external-context-menu-service").removeContextMenuAsync(this.visualId.worksheet,e,t)}executeContextMenuAsync(e,t){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("external-context-menu-service").executeContextMenuAsync(this.visualId.worksheet,e,t)}renameContextMenuAsync(e,t,r){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("external-context-menu-service").renameContextMenuAsync(this.visualId.worksheet,e,t,r)}hoverTupleAsync(e,t,r){return this.isInsideDashboardExtension()?Promise.reject(new d.TableauError(a.SharedErrorCodes.ImplementationError,"hoverTupleAsync is not supported in dashboard extensions")):l.ApiServiceRegistry.get(this._registryId).getService("selection-service").hoverTupleAsync(this.visualId,e,t,r)}selectTuplesAsync(e,t,r){return this.isInsideDashboardExtension()?Promise.reject(new d.TableauError(a.SharedErrorCodes.ImplementationError,"selectTuplesAsync is not supported in dashboard extensions")):l.ApiServiceRegistry.get(this._registryId).getService("selection-service").selectTuplesAsync(this.visualId,e,t,r)}getTooltipTextAsync(e){return this.isInsideDashboardExtension()?Promise.reject(new d.TableauError(a.SharedErrorCodes.ImplementationError,"getTooltipTextAsync is not supported in dashboard extensions")):l.ApiServiceRegistry.get(this._registryId).getService("accessibility").getTooltipTextAsync(this.visualId,e)}leaveMarkNavigationAsync(){return this.isInsideDashboardExtension()?Promise.reject(new d.TableauError(a.SharedErrorCodes.ImplementationError,"leaveMarkNavigationAsync is not supported in dashboard extensions")):l.ApiServiceRegistry.get(this._registryId).getService("accessibility").leaveMarkNavigationAsync(this.visualId)}editAliasesDialogAsync(e){return l.ApiServiceRegistry.get(this._registryId).getService("visual-model-service").editAliasesDialogAsync(e)}createDataSourceFromInfo(e){const t=new u.DataSourceImpl(e,this._registryId),r=new n.DataSource(t);return t.initializeWithPublicInterfaces(r),r}verifyActiveSheet(){const e=this.active,t=this.isInsideActiveDashboard(),r=this.isInsideActiveStoryPoint();if(!e&&!t&&!r)throw new d.TableauError(i.SharedErrorCodes.NotActiveSheet,"Operation not allowed on non-active sheet")}isInsideActiveStoryPoint(){return this._parentStoryPointImpl&&this._parentStoryPointImpl.active}isInsideActiveDashboard(){return this._parentDashboardImpl&&this._parentDashboardImpl.active}isInsideDashboardExtension(){return null!==this._parentDashboardImpl}}t.WorksheetImpl=p},624:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.LogicalTable=class{constructor(e){this._logicalTable=e}get id(){return this._logicalTable.id}get caption(){return this._logicalTable.caption}}},5064:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.TooltipTextRequestModel=class{constructor(e,t){this.visualIdPresModel=e,this.tupleId=t}}},6296:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3008),n=r(7480);class s{constructor(e,t,r,a,i){this._worksheetName=e,this._fieldName=t,this._filterType=r,this._fieldId=a,this._registryId=i}get worksheetName(){return this._worksheetName}get fieldName(){return this._fieldName}get fieldId(){return this._fieldId}get filterType(){return this._filterType}getFieldAsync(){return i.ApiServiceRegistry.get(this._registryId).getService("data-source-service").getFieldAsync(this._fieldId)}getAppliedWorksheetsAsync(){return i.ApiServiceRegistry.get(this._registryId).getService("filter-service").getAppliedWorksheetsAsync(this._worksheetName,this._fieldId)}setAppliedWorksheetsAsync(e){n.ErrorHelpers.verifyParameter(e,"applyToWorksheets");const t=new Set(e);return i.ApiServiceRegistry.get(this._registryId).getService("filter-service").setAppliedWorksheetsAsync(this._worksheetName,this._fieldName,this._fieldId,Array.from(t))}}t.Filter=s,t.CategoricalFilter=class extends s{constructor(e,t,r,a,i,n,s,o){super(e,t,a,r,i),this._appliedValues=n,this._isExcludeMode=s,this._isAllSelected=o}get isAllSelected(){return this._isAllSelected}get appliedValues(){return this._appliedValues}get isExcludeMode(){return this._isExcludeMode}getDomainAsync(e){return e||(e=a.FilterDomainType.Relevant),n.ErrorHelpers.verifyEnumValue(e,a.FilterDomainType,"FilterDomainType"),i.ApiServiceRegistry.get(this._registryId).getService("filter-service").getCategoricalDomainAsync(this._worksheetName,this._fieldId,e)}},t.HierarchicalDataValue=class{constructor(e,t,r){this._value=e,this._hierarchicalPath=t,this._level=r}get value(){return this._value}get hierarchicalPath(){return this._hierarchicalPath}get level(){return this._level}},t.HierarchicalLevelDetail=class{constructor(e,t){this._name=e,this._levelSelectionState=t}get name(){return this._name}get levelSelectionState(){return this._levelSelectionState}},t.HierarchicalFilter=class extends s{constructor(e,t,r,a,i,n,s,o,l,d,c){super(e,t,a,r,i),this._dimensionName=n,this._hierarchyCaption=s,this._numberOfLevels=o,this._levelDetails=l,this._appliedValues=d,this._isAllSelected=c}getDomainAsync(e){throw new Error("Method not implemented.")}get dimensionName(){return this._dimensionName}get hierarchyCaption(){return this._hierarchyCaption}get numberOfLevels(){return this._numberOfLevels}get levelDetails(){return this._levelDetails}get isAllSelected(){return this._isAllSelected}get appliedValues(){return this._appliedValues}},t.RangeFilter=class extends s{constructor(e,t,r,a,i,n,s,o){super(e,t,a,r,i),this._min=n,this._max=s,this._includeNullValues=o}get minValue(){return this._min}get maxValue(){return this._max}get includeNullValues(){return this._includeNullValues}getDomainAsync(e){const t=i.ApiServiceRegistry.get(this._registryId).getService("filter-service");return e||(e=a.FilterDomainType.Relevant),n.ErrorHelpers.verifyEnumValue(e,a.FilterDomainType,"FilterDomainType"),t.getRangeDomainAsync(this._worksheetName,this._fieldId,e)}},t.RelativeDateFilter=class extends s{constructor(e,t,r,a,i,n,s,o,l){super(e,t,a,r,i),this._anchorDate=n,this._periodType=s,this._rangeType=o,this._rangeN=l}get anchorDate(){return this._anchorDate}get periodType(){return this._periodType}get rangeType(){return this._rangeType}get rangeN(){return this._rangeN}},t.CategoricalDomain=class{constructor(e,t){this._values=e,this._domainType=t}get values(){return this._values}get type(){return this._domainType}},t.RangeDomain=class{constructor(e,t,r){this._min=e,this._max=t,this._domainType=r}get type(){return this._domainType}get min(){return this._min}get max(){return this._max}}},5068:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DataTable=class{constructor(e,t,r,a,i,n){this._data=e,this._columns=t,this._totalRowCount=r,this._isTotalRowCountLimited=a,this._isSummaryData=i,this._marksInfo=n,this._name=i?"Summary Data Table":"Underlying Data Table"}get name(){return this._name}get data(){return this._data}get columns(){return this._columns}get marksInfo(){return this._marksInfo}get totalRowCount(){return this._totalRowCount}get isTotalRowCountLimited(){return this._isTotalRowCountLimited}get isSummaryData(){return this._isSummaryData}},t.MarkInfo=class{constructor(e,t,r){this._type=e,this._color=t,this._tupleId=r}get type(){return this._type}get color(){return this._color}get tupleId(){return this._tupleId}},t.Column=class{constructor(e,t,r,a,i){this._fieldName=e,this._fieldId=t,this._dataType=r,this._isReferenced=a,this._index=i}get fieldName(){return this._fieldName}get fieldId(){return this._fieldId}get dataType(){return this._dataType}get isReferenced(){return this._isReferenced}get index(){return this._index}},t.DataValue=class{constructor(e,t,r,a,i){this._value=e,this._nativeValue=t,this._formattedValue=r,this._aliasValue=a,this._hasAlias=i}get value(){return this._value}get nativeValue(){return this._nativeValue}get formattedValue(){return this._formattedValue}get aliasValue(){return this._aliasValue}get hasAlias(){return this._hasAlias}}},7968:function(e,t,r){"use strict";var a=this&&this.__awaiter||function(e,t,r,a){return new(r||(r=Promise))((function(i,n){function s(e){try{l(a.next(e))}catch(e){n(e)}}function o(e){try{l(a.throw(e))}catch(e){n(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(s,o)}l((a=a.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0});const i=r(3008),n=r(7480);t.DataTableReader=class{constructor(e,t,r,a){this._id=e,this._totalRowCount=t,this._pageRowCount=r,this._registryId=a,this._pageCount=Math.ceil(t/r)}get totalRowCount(){return this._totalRowCount}get pageCount(){return this._pageCount}getPageAsync(e){return n.ErrorHelpers.verifyRange(e,0,this._pageCount),i.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getPageAsync(this._id,e,this._pageRowCount)}getAllPagesAsync(e){return a(this,void 0,void 0,(function*(){const t=yield this.getPageAsync(0);e=e||this.totalRowCount;const r=Math.min(e,this.totalRowCount),a=Math.ceil(r/this._pageRowCount),i=Math.min(a,400),n=i{"use strict";Object.defineProperty(t,"__esModule",{value:!0});class r{}t.SelectionModel=r;class a extends r{constructor(){super(...arguments),this.selectValues=[]}}t.ValueSelectionModel=a,t.HierarchicalSelectionModel=class extends a{},t.RangeSelectionModel=class extends r{},t.DimensionSelectionModel=class extends a{},t.TupleSelectionModel=class{constructor(){this.objectIds=[]}},t.SelectionModelsContainer=class{constructor(){this.hierModelArr=[],this.dimModelArr=[],this.quantModelArr=[]}},t.SelectTuplesInteractionModel=class{constructor(e,t=[],r,a){this.visualIdPresModel=e,this.tupleIds=t,this.selectOptions=r,this.tooltipContext=a}},t.HoverTupleInteractionModel=class{constructor(e,t,r,a){this.visualIdPresModel=e,this.tupleId=t,this.tooltipContext=r,this.allowHoverActions=a}}},6368:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Point=class{constructor(e,t){this._x=e,this._y=t}get x(){return this._x}get y(){return this._y}}},3483:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.GetDataType||(t.GetDataType={})).Summary="summary",r.Underlying="underlying"},8672:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3008),i=r(3964),n=r(8028),s=r(1384),o=r(9196),l=r(4924),d=r(3851),c=r(8864),u=r(7712),h=r(1288),p=r(7260),m=r(8784),g=r(4109),y=r(6096),I=r(744),v=r(8856);t.registerAllSharedServices=function(e,t){a.ApiServiceRegistry.get(t).registerService(new n.AnimationServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new o.DataSourceServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new l.ExportServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new u.GetDataServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new c.FilterServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new h.NotificationServiceImpl(e)),a.ApiServiceRegistry.get(t).registerService(new p.ParametersServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new m.SelectionServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new s.AnnotationServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new v.ZoneServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new g.SizeServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new y.VisualModelServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new I.VizServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new d.ExternalContextMenuServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new i.AccessibilityServiceImpl(e,t))}},3008:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(6664);"undefined"!=typeof window&&(window.__tableauApiServiceRegistry=window.__tableauApiServiceRegistry||{});class n{constructor(){this._services={}}registerService(e){this._services[e.serviceName]=e}getService(e){if(!this._services.hasOwnProperty(e))throw new i.TableauError(a.ErrorCodes.InternalError,`Service not registered: ${e}`);return this._services[e]}}class s{static get(e){if(window.__tableauApiServiceRegistry&&window.__tableauApiServiceRegistry[e]||s.setInstance(e,new n),!window.__tableauApiServiceRegistry[e])throw new i.TableauError(a.ErrorCodes.InternalError,"Service registry failed");return window.__tableauApiServiceRegistry[e]}static setInstance(e,t){window.__tableauApiServiceRegistry||(window.__tableauApiServiceRegistry={}),window.__tableauApiServiceRegistry[e]=t}static clearRegistry(){window.__tableauApiServiceRegistry={}}constructor(){}}t.ApiServiceRegistry=s},3964:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3448),i=r(5064),n=r(1776);class s extends n.ServiceImplBase{get serviceName(){return"accessibility"}getTooltipTextAsync(e,t){let r=new i.TooltipTextRequestModel(e,t);const n={[a.ParameterId.FunctionName]:"getTooltipTextAsync",[a.ParameterId.TooltipTextRequest]:r};return this.execute(a.VerbId.GetTooltipText,n).then((e=>e.result))}leaveMarkNavigationAsync(e){const t={[a.ParameterId.FunctionName]:"leaveMarkNavigationAsync",[a.ParameterId.VisualId]:e};return this.execute(a.VerbId.RaiseLeaveMarkNavNotification,t).then((e=>{}))}}t.AccessibilityServiceImpl=s},8028:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(1044),s=r(7480),o=r(1776);class l extends o.ServiceImplBase{get serviceName(){return"animation-service"}replayAsync(e){const t={[i.ParameterId.ReplaySpeed]:1};return s.ErrorHelpers.verifyEnumValue(e,a.ReplaySpeedType,"ReplaySpeedType"),t[i.ParameterId.ReplaySpeed]=n.ExternalToInternalEnumMappings.setReplaySpeedType.convert(e),this.execute(i.VerbId.ReplayAnimation,t).then((e=>{}))}}t.AnimationServiceImpl=l},1384:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(6557),s=r(7104),o=r(6664),l=r(1776);class d extends l.ServiceImplBase{get serviceName(){return"annotation-service"}annotateMarkAsync(e,t,r){const a=this.parseMarkSelectionIds([t]),n=`${r}`,s={[i.ParameterId.FunctionName]:"annotateMarkAsync",[i.ParameterId.VisualId]:e,[i.ParameterId.AnnotateEnum]:i.AnnotateEnum.Mark,[i.ParameterId.TargetPoint]:{x:0,y:0},[i.ParameterId.SelectionList]:[a.selection],[i.ParameterId.FormattedText]:n};return this.execute(i.VerbId.CreateAnnotation,s).then((e=>{}))}getAnnotationsAsync(e){const t={[i.ParameterId.FunctionName]:"getAnnotationsAsync",[i.ParameterId.VisualId]:e};return this.execute(i.VerbId.GetAnnotations,t).then((e=>{const t=e.result;return this.annotationFilterMap(t)}))}removeAnnotationAsync(e,t){const r=this.parseAnnotationSelectionIds([t]),a={[i.ParameterId.FunctionName]:"removeAnnotationAsync",[i.ParameterId.VisualId]:e,[i.ParameterId.SelectionList]:[r.selection]};return this.execute(i.VerbId.RemoveAnnotation,a).then((e=>{}))}parseMarkSelectionIds(e){const t=[],r=new s.SelectionModelsContainer;if(e.forEach((e=>{const r=e.tupleId;if(!(null!=r&&r>0))throw new o.TableauError(a.ErrorCodes.InternalError,"invalid tupleId");t.push(r.toString())})),0!==t.length){const e=new s.TupleSelectionModel;e.selectionType="tuples",e.objectIds=t,r.selection=e}return r}parseAnnotationSelectionIds(e){const t=[],r=new s.SelectionModelsContainer;if(e.forEach((e=>{const r=e.annotationId;if(!(null!=r&&r>=0))throw new o.TableauError(a.ErrorCodes.InternalError,"invalid annotationId");t.push(r.toString())})),0!==t.length){const e=new s.TupleSelectionModel;e.selectionType="annotations",e.objectIds=t,r.selection=e}return r}mapAnnotation(e){return{annotationHTML:e.annotationText,annotationId:e.annotationId,annotationText:e.annotationPlainText,annotationType:n.InternalToExternalEnumMappings.annotationType.convert(e.annotateEnum),tupleId:e.tupleId}}annotationFilterMap(e){return e.map((e=>this.mapAnnotation(e)))}}t.AnnotationServiceImpl=d},1832:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3448),i=r(1776);class n extends i.ServiceImplBase{get serviceName(){return"client-info-service"}getClientInfoAsync(){const e=a.VerbId.GetEmbeddingClientInfo,t={[a.ParameterId.FunctionName]:"getClientInfoAsync"};return this.execute(e,t).then((e=>e.result))}}t.ClientInfoServiceImpl=n},9196:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(8340),s=r(1072),o=r(2180),l=r(5288),d=r(6664),c=r(1776);class u extends c.ServiceImplBase{constructor(e,t){super(e,t)}get serviceName(){return"data-source-service"}refreshAsync(e){const t={[i.ParameterId.FunctionName]:"refreshAsync",[i.ParameterId.DeltaTimeMs]:0,[i.ParameterId.ShouldRefreshDS]:!0};return e&&(t[i.ParameterId.DataSourceId]=e),this.execute(i.VerbId.RefreshDataSource,t).then((e=>{}))}getActiveTablesAsync(e){const t={[i.ParameterId.FunctionName]:"getActiveTablesAsync",[i.ParameterId.DataSourceId]:e};return this.execute(i.VerbId.GetActiveTables,t).then((t=>{const r=t.result;if(0===r.tables.length)throw new d.TableauError(a.ErrorCodes.UnsupportedMethodForDataSourceType,`getActiveTables is not supported for: ${e}`);return r.tables}))}getDataSourcesAsync(e){const t={[i.ParameterId.FunctionName]:"getDataSourcesAsync",[i.ParameterId.VisualId]:e};return this.execute(i.VerbId.GetDataSources,t).then((e=>e.result))}getAllDataSourcesAsync(){const e={[i.ParameterId.FunctionName]:"getAllDataSourcesAsync"};return this.execute(i.VerbId.GetAllDataSources,e).then((e=>e.result))}getConnectionSummariesAsync(e){const t={[i.ParameterId.FunctionName]:"getConnectionSummariesAsync",[i.ParameterId.DataSourceId]:e};return this.execute(i.VerbId.GetConnectionDescriptionSummaries,t).then((e=>e.result))}getFieldAsync(e){const t=i.VerbId.GetFieldAndDataSource,r={[i.ParameterId.FunctionName]:"getFieldAsync",[i.ParameterId.FieldId]:e};return this.execute(t,r).then((e=>{const t=e.result[i.ParameterId.DataSource],r=e.result[i.ParameterId.Field];return this.convertField(r,this.convertDataSource(t))}))}getLogicalTablesAsync(e){const t={[i.ParameterId.FunctionName]:"getLogicalTablesAsync",[i.ParameterId.DataSourceId]:e};return this.execute(i.VerbId.GetLogicalTables,t).then((e=>e.result))}getUnderlyingTablesAsync(e){const t={[i.ParameterId.FunctionName]:"getUnderlyingTablesAsync",[i.ParameterId.VisualId]:e};return this.execute(i.VerbId.GetUnderlyingTables,t).then((e=>e.result))}convertField(e,t){return new s.Field(new l.FieldImpl(e,t))}convertDataSource(e){return new n.DataSource(new o.DataSourceImpl(e,this._registryId))}}t.DataSourceServiceImpl=u},4924:function(e,t,r){"use strict";var a=this&&this.__awaiter||function(e,t,r,a){return new(r||(r=Promise))((function(i,n){function s(e){try{l(a.next(e))}catch(e){n(e)}}function o(e){try{l(a.throw(e))}catch(e){n(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(s,o)}l((a=a.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0});const i=r(3448),n=r(7419),s=r(1044),o=r(5044),l=r(7480),d=r(6664),c=r(1776);class u extends c.ServiceImplBase{get serviceName(){return"export-service"}getExportCrosstabSheetMapAsync(e){const t=i.VerbId.GetExportCrosstabSheetMap,r={[i.ParameterId.FunctionName]:"getExportCrosstabSheetMapAsync",[i.ParameterId.CurrentSheetType]:s.ExternalToInternalEnumMappings.sheetType.convert(e)};return this.execute(t,r).then((e=>e.result))}exportCrosstabAsync(e,t,r,s){return a(this,void 0,void 0,(function*(){l.ErrorHelpers.verifySheetName(r,e),l.ErrorHelpers.verifyEnumValue(t,n.CrosstabFileFormat,"CrosstabFileFormat");const a=yield this.getExportCrosstabSheetMapAsync(s);if(!a[e])throw new d.TableauError(n.SharedErrorCodes.InternalError,"missing sheet doc id from sheetMap");const o={[i.ParameterId.FunctionName]:"exportCrosstabAsync",[i.ParameterId.SheetIdentifier]:a[e],[i.ParameterId.SendNotifications]:!0};let c;switch(t){case n.CrosstabFileFormat.CSV:c=i.VerbId.ExportCrosstabCsvDownload,o[i.ParameterId.UseTabDelimiters]=!0;break;case n.CrosstabFileFormat.Excel:c=i.VerbId.ExportCrosstabExcelDownload;break;default:throw new d.TableauError(n.SharedErrorCodes.InternalError,"unsupported Crosstab file format.")}return this.execute(c,o).then((e=>e.result)).catch((()=>{throw new d.TableauError(n.SharedErrorCodes.CrosstabCreationError,"An unexpected error occurred while generating the document.")}))}))}exportDataAsync(e,t){var r;l.ErrorHelpers.verifyExportDataOptions(t);const a=new Set(t.columnsToIncludeById),s=Array.from(a),o=i.VerbId.ExportDataDownload,c={[i.ParameterId.FunctionName]:"exportDataAsync",[i.ParameterId.VisualId]:e,[i.ParameterId.IgnoreAliases]:(r=t.ignoreAliases,null!=r&&r),[i.ParameterId.ColumnsToIncludeById]:s};return this.execute(o,c).then((()=>{})).catch((()=>{throw new d.TableauError(n.SharedErrorCodes.DataCreationError,"An unexpected error occurred while generating the document.")}))}exportPowerPointAsync(e,t){l.ErrorHelpers.verifySheetNamesForPDFAndPPT(e,t);const r=i.VerbId.ExportPowerpointDownload,a={[i.ParameterId.FunctionName]:"exportPowerPointAsync",[i.ParameterId.ExportOriginUrl]:"",[i.ParameterId.SelectedSheetNames]:e};return this.execute(r,a).then((e=>e.result)).catch((()=>{throw new d.TableauError(n.SharedErrorCodes.PowerPointCreationError,"An error occured while attempting to generate the PowerPoint file.")}))}exportPDFAsync(e,t,r){return a(this,void 0,void 0,(function*(){l.ErrorHelpers.verifyExportPDFOptions(t),l.ErrorHelpers.verifySheetNamesForPDFAndPPT(e,r);const a=yield this.getExportPDFOptionsAsync();o.ExportHelpers.updateInternalExportPDFOptions(a,t,e);const s=i.VerbId.ExportPdfDownload,c={[i.ParameterId.FunctionName]:"exportPDFAsync",[i.ParameterId.ExportPdfOptions]:a};return this.execute(s,c).then((e=>e.result)).catch((()=>{throw new d.TableauError(n.SharedErrorCodes.PDFCreationError,"Unable to create PDF because something went wrong. Try again.")}))}))}getExportPDFOptionsAsync(){const e=i.VerbId.GetExportPdfOptions,t={[i.ParameterId.FunctionName]:"getExportPdfOptionsAsync"};return this.execute(e,t).then((e=>e.result))}}t.ExportServiceImpl=u},3851:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3448),i=r(1776);class n extends i.ServiceImplBase{get serviceName(){return"external-context-menu-service"}appendContextMenuAsync(e,t,r){const i=a.VerbId.AppendExternalMenuItem,n={[a.ParameterId.FunctionName]:"appendContextMenuAsync",[a.ParameterId.WorksheetName]:e,[a.ParameterId.ExternalMenuItemDisplayName]:r.displayName};return this.execute(i,n).then((e=>e.result))}removeContextMenuAsync(e,t,r){const i=a.VerbId.RemoveExternalMenuItem,n={[a.ParameterId.FunctionName]:"removeContextMenuAsync",[a.ParameterId.WorksheetName]:e,[a.ParameterId.ExternalMenuItemId]:r};return this.execute(i,n).then((e=>{}))}executeContextMenuAsync(e,t,r){const i=a.VerbId.ExecuteExternalMenuItem,n={[a.ParameterId.FunctionName]:"executeContextMenuAsync",[a.ParameterId.WorksheetName]:e,[a.ParameterId.ExternalMenuItemId]:r};return this.execute(i,n).then((e=>{}))}renameContextMenuAsync(e,t,r,i){const n=a.VerbId.RenameExternalMenu,s={[a.ParameterId.FunctionName]:"renameContextMenuAsync",[a.ParameterId.WorksheetName]:e,[a.ParameterId.ExternalMenuHeader]:r,[a.ParameterId.ExternalMenuDescription]:i};return this.execute(n,s).then((e=>{}))}}t.ExternalContextMenuServiceImpl=n},8864:function(e,t,r){"use strict";var a=this&&this.__awaiter||function(e,t,r,a){return new(r||(r=Promise))((function(i,n){function s(e){try{l(a.next(e))}catch(e){n(e)}}function o(e){try{l(a.throw(e))}catch(e){n(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(s,o)}l((a=a.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0});const i=r(7419),n=r(3448),s=r(3448),o=r(5136),l=r(1044),d=r(6557),c=r(6296),u=r(8052),h=r(1172),p=r(1776);class m extends p.ServiceImplBase{get serviceName(){return"filter-service"}applyFilterAsync(e,t,r,a,n){const d=s.VerbId.ApplyCategoricalFilter,c={[s.ParameterId.FunctionName]:"applyFilterAsync"};if(c[s.ParameterId.VisualId]=e,c[s.ParameterId.FieldName]=t,!Array.isArray(r))throw new o.TableauError(i.ErrorCodes.InvalidParameter,"values parameter for applyFilterAsync must be an array");return c[s.ParameterId.FilterValues]=r,c[s.ParameterId.FilterUpdateType]=l.ExternalToInternalEnumMappings.filterUpdateType.convert(a),c[s.ParameterId.IsExcludeMode]=void 0!==n&&void 0!==n.isExcludeMode&&n.isExcludeMode,this.execute(d,c).then((e=>t))}applyRangeFilterAsync(e,t,r){const a=s.VerbId.ApplyRangeFilter,i={[s.ParameterId.FunctionName]:"applyRangeFilterAsync"};if(void 0!==r.min&&null!==r.min){let e;e=r.min instanceof Date?h.Param.serializeDateForPlatform(r.min):r.min,i[s.ParameterId.FilterRangeMin]=e}if(void 0!==r.max&&null!==r.max){let e;e=r.max instanceof Date?h.Param.serializeDateForPlatform(r.max):r.max,i[s.ParameterId.FilterRangeMax]=e}return r.nullOption&&(i[s.ParameterId.FilterRangeNullOption]=l.ExternalToInternalEnumMappings.nullOptions.convert(r.nullOption)),i[s.ParameterId.FieldName]=t,i[s.ParameterId.VisualId]=e,this.execute(a,i).then((e=>(this.apiFilterHandlerCheckForCommandError(e.result),t)))}applyHierarchicalFilterAsync(e,t,r,a,i){const n=s.VerbId.HierarchicalFilter,o={[s.ParameterId.FunctionName]:"applyHierarchicalFilterAsync"};o[s.ParameterId.VisualId]=e,o[s.ParameterId.FieldName]=t;const d=r.levels;return Array.isArray(d)&&d.length>0?o[s.ParameterId.FilterLevels]=d:r.length>0?o[s.ParameterId.FilterValues]=r:o[s.ParameterId.FilterLevels]=[],o[s.ParameterId.FilterUpdateType]=l.ExternalToInternalEnumMappings.filterUpdateType.convert(a),o[s.ParameterId.IsExcludeMode]=i&&!!i.isExcludeMode,this.execute(n,o).then((e=>t))}clearFilterAsync(e,t){const r=s.VerbId.ClearFilter,a={[s.ParameterId.FunctionName]:"clearFilterAsync"};return a[s.ParameterId.VisualId]=e,a[s.ParameterId.FieldName]=t,this.execute(r,a).then((e=>t))}applyRelativeDateFilterAsync(e,t,r){const a=s.VerbId.ApplyRelativeDateFilter,n={[s.ParameterId.FunctionName]:"applyRelativeDateFilterAsync"};if(n[s.ParameterId.VisualId]=e,n[s.ParameterId.FieldName]=t,n[s.ParameterId.PeriodType]=l.ExternalToInternalEnumMappings.periodType.convert(r.periodType),n[s.ParameterId.DateRangeType]=l.ExternalToInternalEnumMappings.dateRangeType.convert(r.rangeType),r.rangeType===i.DateRangeType.LastN||r.rangeType===i.DateRangeType.NextN){if(void 0===r.rangeN||null===r.rangeN)throw new o.TableauError(i.EmbeddingErrorCodes.MissingRangeNForRelativeDateFilters,"Missing rangeN field for a relative date filter of LASTN or NEXTN.");n[s.ParameterId.RangeN]=r.rangeN}return void 0!==r.anchorDate&&null!==r.anchorDate&&(n[s.ParameterId.AnchorDate]=this.convertAnchorDate(r.anchorDate)),this.execute(a,n).then((e=>e.result))}getFiltersAsync(e){const t=s.VerbId.GetFilters,r={[s.ParameterId.FunctionName]:"getFiltersAsync"};return r[s.ParameterId.VisualId]=e,this.execute(t,r).then((e=>{const t=e.result;return this.convertDomainFilters(t)}))}getCategoricalDomainAsync(e,t,r){const a=s.VerbId.GetCategoricalDomain,i={[s.ParameterId.FunctionName]:"getCategoricalDomainAsync"};return i[s.ParameterId.VisualId]={worksheet:e},i[s.ParameterId.FieldId]=t,i[s.ParameterId.DomainType]=l.ExternalToInternalEnumMappings.filterDomainType.convert(r),this.execute(a,i).then((e=>{const t=e.result;return this.convertCategoricalDomain(t,r)}))}getRangeDomainAsync(e,t,r){const a=s.VerbId.GetRangeDomain,i={[s.ParameterId.FunctionName]:"getRangeDomainAsync"};return i[s.ParameterId.VisualId]={worksheet:e},i[s.ParameterId.FieldId]=t,i[s.ParameterId.DomainType]=l.ExternalToInternalEnumMappings.filterDomainType.convert(r),this.execute(a,i).then((e=>{const t=e.result;return this.convertRangeDomain(t,r)}))}getDashboardFiltersAsync(){const e=s.VerbId.GetDashboardFilters,t={[s.ParameterId.FunctionName]:"getDashboardFiltersAsync"};return this.execute(e,t).then((e=>{const t=e.result;return this.convertDomainFilters(t)}))}applyDashboardFilterAsync(e,t,r,a){const i=s.VerbId.DashboardCategoricalFilter,n={[s.ParameterId.FunctionName]:"applyDashboardFilterAsync"};return n[s.ParameterId.FieldName]=e,n[s.ParameterId.FilterValues]=t,n[s.ParameterId.FilterUpdateType]=l.ExternalToInternalEnumMappings.filterUpdateType.convert(r),n[s.ParameterId.IsExcludeMode]=a&&!!a.isExcludeMode,this.execute(i,n).then((e=>e.result))}getAppliedWorksheetsAsync(e,t){var r;return a(this,void 0,void 0,(function*(){const a=yield this.executeGetAppliedWorksheets(e,t,"getAppliedWorksheetsAsync"),i=[];return null===(r=a.worksheets)||void 0===r||r.map((e=>{e.isSelected&&i.push(e.worksheetName)})),i}))}setAppliedWorksheetsAsync(e,t,r,n){return a(this,void 0,void 0,(function*(){const a=yield this.executeGetAppliedWorksheets(e,r,"getAppliedWorksheetsAsyncInternal");if(!a||!a.worksheets)throw new o.TableauError(i.SharedErrorCodes.InternalError,"This filter does not apply to multiple worksheets");const l=[];let d="";if(a.worksheets.forEach((e=>{e.isActive&&(d=e.worksheetName),(e.isSelected||e.isEnabled)&&l.push(e.worksheetName)})),""===d)throw new o.TableauError(i.SharedErrorCodes.InternalError,"No active worksheet");if(!n.includes(d))throw new o.TableauError(i.SharedErrorCodes.InternalError,`${d} must be included in the applied worksheets`);n.forEach((e=>{if(!l.includes(e))throw new o.TableauError(i.SharedErrorCodes.InternalError,`The field ${t} isn't applicable to the worksheet ${e}`)}));const c=s.VerbId.ChangeSharedFilter,u={};return u[s.ParameterId.FunctionName]="setAppliedWorksheetsAsync",u[s.ParameterId.VisualId]={worksheet:e},u[s.ParameterId.FieldId]=r,u[s.ParameterId.SharedFilterSheets]=n,this.execute(c,u).then((e=>n))}))}executeGetAppliedWorksheets(e,t,r){const a=s.VerbId.GetSharedFilter,i={};return i[s.ParameterId.FunctionName]=r,i[s.ParameterId.VisualId]={worksheet:e},i[s.ParameterId.FieldId]=t,this.execute(a,i).then((e=>e.result))}convertDomainFilters(e){const t=[];return e.forEach((e=>{switch(e.filterType){case s.FilterType.Categorical:{const r=e;if(!r)throw new Error("Invalid Categorical Filter");t.push(this.convertCategoricalFilter(r));break}case s.FilterType.Hierarchical:{const r=e;if(!r)throw new Error("Invalid Hierarchical Filter");t.push(this.convertHierarchicalFilter(r));break}case s.FilterType.Range:{const r=e;if(!r)throw new Error("Invalid Range Filter");t.push(this.convertRangeFilter(r));break}case s.FilterType.RelativeDate:{const r=e;if(!r)throw new Error("Invalid Relative Date Filter");t.push(this.convertRelativeDateFilter(r));break}}})),t}convertCategoricalFilter(e){const t=e.values.map((e=>u.DataValueFactory.MakeFilterDataValue(e)));return new c.CategoricalFilter(e.visualId.worksheet,e.fieldCaption,e.fieldName,s.FilterType.Categorical,this._registryId,t,e.isExclude,e.isAllSelected)}convertHierarchicalFilter(e){const t=e.values.map((e=>new c.HierarchicalDataValue(u.DataValueFactory.MakeFilterDataValue(e.value),e.hierarchicalPath,e.level))),r=e.levelInfo.map((e=>new c.HierarchicalLevelDetail(e.name,d.InternalToExternalEnumMappings.hierarchicalLevelSelectionState.convert(e.levelSelectionState))));return new c.HierarchicalFilter(e.visualId.worksheet,e.fieldCaption,e.fieldName,s.FilterType.Hierarchical,this._registryId,e.dimensionName,e.hierarchyCaption,e.levels,r,t,e.isAllSelected)}convertRangeFilter(e){const t=u.DataValueFactory.MakeFilterDataValue(e.min),r=u.DataValueFactory.MakeFilterDataValue(e.max);return new c.RangeFilter(e.visualId.worksheet,e.fieldCaption,e.fieldName,s.FilterType.Range,this._registryId,t,r,e.includeNullValues)}convertRelativeDateFilter(e){const t=u.DataValueFactory.MakeFilterDataValue(e.anchorDate);return new c.RelativeDateFilter(e.visualId.worksheet,e.fieldCaption,e.fieldName,i.FilterType.RelativeDate,this._registryId,t,d.InternalToExternalEnumMappings.dateStepPeriod.convert(e.periodType),d.InternalToExternalEnumMappings.dateRangeType.convert(e.rangeType),e.rangeN)}convertCategoricalDomain(e,t){const r=e.values.map((e=>u.DataValueFactory.MakeFilterDataValue(e)));return new c.CategoricalDomain(r,t)}convertRangeDomain(e,t){const r=u.DataValueFactory.MakeFilterDataValue(e.min),a=u.DataValueFactory.MakeFilterDataValue(e.max);return new c.RangeDomain(r,a,t)}convertAnchorDate(e){const t=e.getUTCFullYear(),r=e.getUTCMonth()+1,a=e.getUTCDate(),n=e.getUTCHours(),s=e.getUTCMinutes(),l=e.getUTCSeconds();if(isNaN(t)||isNaN(r)||isNaN(a)||isNaN(n)||isNaN(s)||isNaN(l))throw new o.TableauError(i.EmbeddingErrorCodes.InvalidDateParameter,"Invalid date parameter: anchorDate");return`${t}-${r}-${a} ${n}:${s}:${l}`}apiFilterHandlerCheckForCommandError(e){if(e[n.ParameterId.ParameterError]){if(e[n.ParameterId.InvalidFieldCaption])throw new o.TableauError(i.SharedErrorCodes.InvalidFilterFieldName,e[n.ParameterId.InvalidFieldCaption]);if(e[n.ParameterId.InvalidValues])throw new o.TableauError(i.SharedErrorCodes.InvalidFilterFieldValue,e[n.ParameterId.InvalidValues]);if(e[n.ParameterId.InvalidAggFieldName])throw new o.TableauError(i.SharedErrorCodes.InvalidAggregationFieldName,e[n.ParameterId.InvalidAggFieldName]);throw new o.TableauError(i.SharedErrorCodes.ServerError,"Server Error")}}}t.FilterServiceImpl=m},7712:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(6680),s=r(5136),o=r(1044),l=r(5068),d=r(7968),c=r(8052),u=r(3483),h=r(1776);class p extends h.ServiceImplBase{constructor(){super(...arguments),this.viewDataTableCacheId=n.v4()}get serviceName(){return"get-data-service"}getMaxRowLimit(){return 1e4}getViewDataTableCacheId(){return this.viewDataTableCacheId}getLimitedMaxRows(e,t){return e>0&&e{const t=e.result;return this.processResultsTable(t.data,t.isSummary)}))}getSummaryDataReaderAsync(e,t,r,a,n,s,l,c){const u={[i.ParameterId.FunctionName]:"getSummaryDataReaderAsync",[i.ParameterId.ViewDataTableCacheId]:this.getViewDataTableCacheId(),[i.ParameterId.VisualId]:e,[i.ParameterId.PageRowCount]:t,[i.ParameterId.IgnoreAliases]:r,[i.ParameterId.IgnoreSelection]:a,[i.ParameterId.IncludeAllColumns]:n,[i.ParameterId.ColumnsToIncludeById]:this.verifyIncludeColumnArray(s),[i.ParameterId.ShowDataTableFormat]:o.ExternalToInternalEnumMappings.showDataTableFormatType.convert(l),[i.ParameterId.ApplyWorksheetFormatting]:c};return this.execute(i.VerbId.GetDataSummaryDataReader,u).then((e=>{const r=e.result;return new d.DataTableReader(r.id,r.totalRowCount,t,this._registryId)}))}getSummaryColumnsInfoAsync(e){const t=i.VerbId.GetDataSummaryData,r={[i.ParameterId.FunctionName]:"getSummaryColumnsInfoAsync",[i.ParameterId.VisualId]:e,[i.ParameterId.IgnoreAliases]:!0,[i.ParameterId.IgnoreSelection]:!0,[i.ParameterId.IncludeAllColumns]:!0,[i.ParameterId.MaxRows]:1,[i.ParameterId.ShowDataTableFormat]:i.ApiShowDataTableFormat.NativeValuesOnly};return this.execute(t,r).then((e=>e.result.data.headers.map((e=>new l.Column(e.fieldCaption,e.fieldName,e.dataType,e.isReferenced,e.index)))))}getSelectedMarksAsync(e){const t={[i.ParameterId.FunctionName]:"getSelectedMarksAsync",[i.ParameterId.VisualId]:e};return this.execute(i.VerbId.GetSelectedMarks,t).then((e=>({data:e.result.data.map((e=>this.processResultsTable(e,!0)))})))}getHighlightedMarksAsync(e){const t={[i.ParameterId.FunctionName]:"getHighlightedMarksAsync",[i.ParameterId.VisualId]:e};return this.execute(i.VerbId.GetHighlightedMarks,t).then((e=>({data:e.result.data.map((e=>this.processResultsTable(e,!0)))})))}getDataSourceDataAsync(e,t,r,a,n,s){const l={[i.ParameterId.FunctionName]:"getDataSourceDataAsync",[i.ParameterId.DataSourceId]:e,[i.ParameterId.IgnoreAliases]:t,[i.ParameterId.MaxRows]:this.getLimitedMaxRows(r,this.getMaxRowLimit()+1),[i.ParameterId.ColumnsToInclude]:this.verifyIncludeColumnArray(a),[i.ParameterId.ColumnsToIncludeById]:this.verifyIncludeColumnArray(n),[i.ParameterId.ShowDataTableFormat]:o.ExternalToInternalEnumMappings.showDataTableFormatType.convert(s)};return this.execute(i.VerbId.GetDataSourceData,l).then((e=>{const t=e.result;return this.processResultsTable(t.data,!1)}))}getLogicalTableDataAsync(e,t,r,a,n,s,l){const d={[i.ParameterId.FunctionName]:"getLogicalTableDataAsync",[i.ParameterId.ColumnsToInclude]:n,[i.ParameterId.ColumnsToIncludeById]:this.verifyIncludeColumnArray(s),[i.ParameterId.DataSourceId]:e,[i.ParameterId.IgnoreAliases]:r,[i.ParameterId.LogicalTableId]:t,[i.ParameterId.MaxRows]:this.getLimitedMaxRows(a,this.getMaxRowLimit()+1),[i.ParameterId.ShowDataTableFormat]:o.ExternalToInternalEnumMappings.showDataTableFormatType.convert(l)};return this.execute(i.VerbId.GetLogicalTableData,d).then((e=>{const t=e.result;return this.processResultsTable(t.data,!1)}))}getLogicalTableDataReaderAsync(e,t,r,a,n,s){r=this.getLimitedMaxRows(r,this.getMaxRowLimit());const l={[i.ParameterId.FunctionName]:"getLogicalTableDataReaderAsync",[i.ParameterId.ViewDataTableCacheId]:this.getViewDataTableCacheId(),[i.ParameterId.DataSourceId]:e,[i.ParameterId.LogicalTableId]:t,[i.ParameterId.PageRowCount]:r,[i.ParameterId.IgnoreAliases]:a,[i.ParameterId.ColumnsToIncludeById]:this.verifyIncludeColumnArray(n),[i.ParameterId.ShowDataTableFormat]:o.ExternalToInternalEnumMappings.showDataTableFormatType.convert(s)};return this.execute(i.VerbId.GetLogicalTableDataReader,l).then((e=>{const t=e.result;return new d.DataTableReader(t.id,t.totalRowCount,r,this._registryId)}))}getUnderlyingTableDataAsync(e,t,r,a,n,s,l,d,c){const u={[i.ParameterId.FunctionName]:"getUnderlyingTableDataAsync",[i.ParameterId.VisualId]:e,[i.ParameterId.LogicalTableId]:t,[i.ParameterId.IgnoreAliases]:r,[i.ParameterId.IgnoreSelection]:a,[i.ParameterId.IncludeAllColumns]:n,[i.ParameterId.ColumnsToIncludeById]:this.verifyIncludeColumnArray(s),[i.ParameterId.MaxRows]:this.getLimitedMaxRows(l,this.getMaxRowLimit()+1),[i.ParameterId.ShowDataTableFormat]:o.ExternalToInternalEnumMappings.showDataTableFormatType.convert(d),[i.ParameterId.ApplyWorksheetFormatting]:c};return this.execute(i.VerbId.GetUnderlyingTableData,u).then((e=>{const t=e.result;return this.processResultsTable(t.data,!1)}))}getUnderlyingTableDataReaderAsync(e,t,r,a,n,s,l,c,u){r=this.getLimitedMaxRows(r,this.getMaxRowLimit());const h={[i.ParameterId.FunctionName]:"getUnderlyingTableDataReaderAsync",[i.ParameterId.ViewDataTableCacheId]:this.getViewDataTableCacheId(),[i.ParameterId.VisualId]:e,[i.ParameterId.LogicalTableId]:t,[i.ParameterId.IgnoreAliases]:a,[i.ParameterId.IgnoreSelection]:n,[i.ParameterId.IncludeAllColumns]:s,[i.ParameterId.ColumnsToIncludeById]:this.verifyIncludeColumnArray(l),[i.ParameterId.ShowDataTableFormat]:o.ExternalToInternalEnumMappings.showDataTableFormatType.convert(c),[i.ParameterId.PageRowCount]:r,[i.ParameterId.ApplyWorksheetFormatting]:u};return this.execute(i.VerbId.GetUnderlyingTableDataReader,h).then((e=>{const t=e.result;return new d.DataTableReader(t.id,t.totalRowCount,r,this._registryId)}))}getPageAsync(e,t,r){const a={[i.ParameterId.FunctionName]:"getPageAsync",[i.ParameterId.ViewDataTableCacheId]:this.getViewDataTableCacheId(),[i.ParameterId.ViewDataTableId]:e,[i.ParameterId.DataRowIndex]:t*r};return this.execute(i.VerbId.GetDataTableReaderPage,a).then((t=>{const r=t.result;return this.processResultsPage(r,e===p.summaryTableId)}))}releaseAsync(e){const t={[i.ParameterId.FunctionName]:"release",[i.ParameterId.ViewDataTableCacheId]:this.getViewDataTableCacheId(),[i.ParameterId.ViewDataTableId]:e};return this.execute(i.VerbId.ReleaseDataTableReader,t).then((e=>{}))}verifyIncludeColumnArray(e){if(!Array.isArray(e))throw new s.TableauError(a.ErrorCodes.InvalidParameter,"columnsToInclude and columnsToIncludeById must be valid arrays");const t=new Set(e);return Array.from(t)}processResultsTable(e,t){const r=e.headers.map((e=>new l.Column(e.fieldCaption,e.fieldName,e.dataType,e.isReferenced,e.index)));let a;e.marks&&(a=e.marks.map((e=>new l.MarkInfo(e.type,e.color,e.tupleId))));const i=!1===t&&e.dataTable.length===this.getMaxRowLimit()+1;i&&(e.dataTable.length-=1);const n=e.dataTable.map((e=>e.map(((e,t)=>c.DataValueFactory.MakeTableDataValue(e,r[t].dataType)))));return a?new l.DataTable(n,r,n.length,i,t,a):new l.DataTable(n,r,n.length,i,t)}processResultsPage(e,t){const r=e.headers.map((e=>new l.Column(e.fieldCaption,e.fieldName,e.dataType,e.isReferenced,e.index)));let a;e.marks&&(a=e.marks.map((e=>new l.MarkInfo(e.type,e.color,e.tupleId))));const i=e.dataTable.map((e=>e.map(((e,t)=>c.DataValueFactory.MakeTableDataValue(e,r[t].dataType)))));return a?new l.DataTable(i,r,i.length,!1,t,a):new l.DataTable(i,r,i.length,!1,t)}}t.GetDataServiceImpl=p,p.summaryTableId=""},1288:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(8808);class i extends a.NotificationServiceImplBase{get serviceName(){return"notification-service"}}t.NotificationServiceImpl=i},8808:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});class r{constructor(e,t){this._filterFn=e,this._callbackFn=t}onNotification(e){this._filterFn(e)&&this._callbackFn(e)}}t.Registration=r,t.NotificationServiceImplBase=class{constructor(e){this.dispatcher=e,this._handlers={},this.dispatcher.registerNotificationHandler(this.onNotification.bind(this))}registerHandler(e,t,a){const i=this._handlers[e]||new Array,n=new r(t,a);return i.push(n),this._handlers[e]=i,()=>this.removeRegistration(e,n)}hasHandlersForNotificationType(e){return this._handlers.hasOwnProperty(e)}onNotification(e){this.hasHandlersForNotificationType(e.notificationId)&&this._handlers[e.notificationId].forEach((t=>t.onNotification(e.data)))}removeRegistration(e,t){this.hasHandlersForNotificationType(e)&&(this._handlers[e]=this._handlers[e].filter((e=>e!==t)))}}},7260:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(8552),s=r(6664),o=r(1776);class l extends o.ServiceImplBase{get serviceName(){return"parameters-service"}getParametersForSheetAsync(e){const t={[i.ParameterId.FunctionName]:"getParametersForSheetAsync",[i.ParameterId.SheetPath]:e};return this.getParametersAsync(t)}getAllParametersAsync(){const e={[i.ParameterId.FunctionName]:"getParametersForSheetAsync"};return this.getParametersAsync(e)}getParametersAsync(e){return this.execute(i.VerbId.GetParametersForSheet,e).then((e=>e.result.map((e=>new n.ParameterImpl(e,this._registryId)))))}changeParameterValueAsync(e,t){const r={[i.ParameterId.FunctionName]:"changeParameterValueAsync",[i.ParameterId.ParameterFieldName]:e,[i.ParameterId.ParameterValue]:t};return this.execute(i.VerbId.ChangeParameterValue,r).then((e=>e.result))}findParameterByNameAsync(e){return this.findParameterAsync(e,void 0)}findParameterByGlobalFieldNameAsync(e){return this.findParameterAsync(void 0,e)}findParameterAsync(e,t){const r={[i.ParameterId.FunctionName]:"findParameterAsync"};if(void 0!==e)r[i.ParameterId.ParameterCaption]=e;else{if(void 0===t)throw new s.TableauError(a.ErrorCodes.InvalidParameter,"name or fieldName must be provided to find parameter");r[i.ParameterId.ParameterFieldName]=t}return this.execute(i.VerbId.FindParameter,r).then((e=>{if("fieldName"in e.result){const t=e.result;return new n.ParameterImpl(t,this._registryId)}}))}}t.ParametersServiceImpl=l},8784:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(7104),s=r(6664),o=r(1172),l=r(1776);class d extends l.ServiceImplBase{get serviceName(){return"selection-service"}clearSelectedMarksAsync(e){const t={[i.ParameterId.FunctionName]:"clearSelectedMarksAsync",[i.ParameterId.VisualId]:e};return this.execute(i.VerbId.ClearSelectedMarks,t).then((e=>{}))}selectMarksByValueAsync(e,t,r){if(0===t.length)throw new s.TableauError(a.ErrorCodes.InvalidParameter,"Selection criteria missing for selecting marks by value");const n=this.validateSelectionUpdateType(r),o=this.parseSelectionMarks(t),l={[i.ParameterId.FunctionName]:"selectMarksByValueAsync",[i.ParameterId.VisualId]:e,[i.ParameterId.SelectionUpdateType]:n};return o.hierModelArr&&o.hierModelArr.length&&(l[i.ParameterId.HierValSelectionModels]=o.hierModelArr),o.quantModelArr&&o.quantModelArr.length&&(l[i.ParameterId.QuantRangeSelectionModels]=o.quantModelArr),o.dimModelArr&&o.dimModelArr.length&&(l[i.ParameterId.DimValSelectionModels]=o.dimModelArr),this.execute(i.VerbId.SelectByValue,l).then((e=>{this.apiFilterHandlerCheckForCommandError(e.result)}))}hoverTupleAsync(e,t,r,a){let s=new n.HoverTupleInteractionModel(e,this.ensureTupleIDIsNonNegative(t),r,a);const o={[i.ParameterId.FunctionName]:"hoverTupleAsync",[i.ParameterId.HoverTupleInteraction]:s};return this.execute(i.VerbId.RaiseHoverTupleNotification,o).then((e=>{}))}selectTuplesAsync(e,t,r,a){let s=new n.SelectTuplesInteractionModel(e,t,r,a);const o={[i.ParameterId.FunctionName]:"selectTuplesAsync",[i.ParameterId.SelectTuplesInteraction]:s};return this.execute(i.VerbId.RaiseSelectTuplesNotification,o).then((e=>{}))}apiFilterHandlerCheckForCommandError(e){if(e[i.ParameterId.ParameterError]){if(e[i.ParameterId.InvalidFields])throw new s.TableauError(a.SharedErrorCodes.InvalidSelectionFieldName,e[i.ParameterId.InvalidFields]);if(e[i.ParameterId.InvalidValues])throw new s.TableauError(a.SharedErrorCodes.InvalidSelectionValue,e[i.ParameterId.InvalidValues]);if(e[i.ParameterId.InvalidDates])throw new s.TableauError(a.SharedErrorCodes.InvalidSelectionDate,e[i.ParameterId.InvalidDates])}}selectMarksByIdAsync(e,t,r){if(0===t.length)throw new s.TableauError(a.ErrorCodes.InvalidParameter,"Marks info missing for selecting marks by Id");const n=this.validateSelectionUpdateType(r),o=this.parseSelectionIds(t),l={[i.ParameterId.FunctionName]:"selectMarksByIdAsync",[i.ParameterId.VisualId]:e,[i.ParameterId.SelectionUpdateType]:n,[i.ParameterId.Selection]:o.selection};return this.execute(i.VerbId.SelectByValue,l).then((e=>{}))}parseSelectionIds(e){const t=[],r=new n.SelectionModelsContainer;for(let r=0;r0?e:0}}t.SelectionServiceImpl=d},1776:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(6557),i=r(6664),n=r(5520);t.ServiceImplBase=class{constructor(e,t){this._dispatcher=e,this._registryId=t}execute(e,t){return this._dispatcher.execute(e,t).catch((e=>{const t=e,r=a.InternalToExternalEnumMappings.errorCode.convert(t.errorCode,n.ShouldThrow.No);throw new i.TableauError(r,t.message)}))}}},4109:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3448),i=r(1776);class n extends i.ServiceImplBase{get serviceName(){return"size-service"}changeSizeAsync(e,t){var r,i,n,s;const o={[a.ParameterId.FunctionName]:"changeSizeAsync",[a.ParameterId.SheetName]:e,[a.ParameterId.MinHeight]:(null===(r=t.minSize)||void 0===r?void 0:r.height)||0,[a.ParameterId.MinWidth]:(null===(i=t.minSize)||void 0===i?void 0:i.width)||0,[a.ParameterId.MaxHeight]:(null===(n=t.maxSize)||void 0===n?void 0:n.height)||0,[a.ParameterId.MaxWidth]:(null===(s=t.maxSize)||void 0===s?void 0:s.width)||0};return this.execute(a.VerbId.SetSheetSize,o).then((e=>{}))}}t.SizeServiceImpl=n},2248:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3448),i=r(1776);class n extends i.ServiceImplBase{get serviceName(){return"story-activation-service"}activateNextStoryPointAsync(){const e=a.VerbId.ActivateNextStoryPoint,t={[a.ParameterId.FunctionName]:"activateNextStoryPointAsync"};return this.execute(e,t).then((e=>{}))}activatePreviousStoryPointAsync(){const e=a.VerbId.ActivatePreviousStoryPoint,t={[a.ParameterId.FunctionName]:"activatePreviousStoryPointAsync"};return this.execute(e,t).then((e=>{}))}activateStoryPointAsync(e){const t=a.VerbId.ActivateStoryPoint,r={[a.ParameterId.FunctionName]:"activateStoryPointAsync"};return r[a.ParameterId.StoryPointIndex]=e,this.execute(t,r).then((e=>{}))}revertStoryPointAsync(e){const t=a.VerbId.RevertStoryPoint,r={[a.ParameterId.FunctionName]:"revertStoryPointAsync"};return r[a.ParameterId.StoryPointIndex]=e,this.execute(t,r).then((e=>e.result))}}t.StoryActivationServiceImpl=n},6096:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3448),i=r(1776);class n extends i.ServiceImplBase{get serviceName(){return"visual-model-service"}getVisualSpecificationAsync(e){const t={[a.ParameterId.FunctionName]:"getVisualSpecificationAsync",[a.ParameterId.WorksheetName]:e.worksheet};return this.execute(a.VerbId.GetVisualSpecification,t).then((e=>e.result))}addMarksCardFieldsAsync(e,t,r,i,n){const s={[a.ParameterId.FunctionName]:"addMarksCardFieldsAsync",[a.ParameterId.WorksheetName]:e.worksheet,[a.ParameterId.MarksCardIndex]:t,[a.ParameterId.EncodingType]:r,[a.ParameterId.Columns]:i,[a.ParameterId.StartIndex]:n};return this.execute(a.VerbId.AddMarksCardFields,s).then((()=>{}))}moveMarksCardFieldAsync(e,t,r,i,n=1){const s={[a.ParameterId.FunctionName]:"addMarksCardFieldsAsync",[a.ParameterId.WorksheetName]:e.worksheet,[a.ParameterId.MarksCardIndex]:t,[a.ParameterId.FromIndex]:r,[a.ParameterId.ToIndex]:i,[a.ParameterId.FieldCount]:n};return this.execute(a.VerbId.MoveMarksCardField,s).then((()=>{}))}spliceMarksCardFieldsAsync(e,t,r,i,n,s){const o={[a.ParameterId.FunctionName]:"spliceMarksCardFieldsAsync",[a.ParameterId.WorksheetName]:e.worksheet,[a.ParameterId.MarksCardIndex]:t,[a.ParameterId.EncodingType]:r,[a.ParameterId.StartIndex]:i,[a.ParameterId.DeleteCount]:n,[a.ParameterId.Columns]:s};return this.execute(a.VerbId.SpliceMarksCardFields,o).then((()=>{}))}editAliasesDialogAsync(e){const t={[a.ParameterId.FunctionName]:"editAliasesDialogAsync",[a.ParameterId.FieldId]:e};return this.execute(a.VerbId.EditAliasesDialog,t).then((()=>{}))}}t.VisualModelServiceImpl=n},744:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3448),i=r(2520),n=r(1776);class s extends n.ServiceImplBase{get serviceName(){return"viz-service"}createVizImageAsync(e){const t={[a.ParameterId.FunctionName]:"createVizImageAsync",[a.ParameterId.VizAPIInputJson]:JSON.stringify(e)};return this.execute(a.VerbId.VizAPI,t).then((e=>e.result))}activateSheetAsync(e){const t={[a.ParameterId.FunctionName]:"activateSheetAsync",[a.ParameterId.SwitchToSheetName]:e};return this.execute(a.VerbId.ActivateSheet,t).then((()=>{}))}getCustomViewsAsync(){const e={[a.ParameterId.FunctionName]:"getCustomViewsAsync"};return this.execute(a.VerbId.GetCustomViews,e).then((e=>e.result.map((e=>new i.CustomViewImpl(e,this._registryId)))))}showCustomViewAsync(e){const t={[a.ParameterId.FunctionName]:"showCustomViewAsync",[a.ParameterId.CustomViewName]:e||""};return this.execute(a.VerbId.ShowCustomView,t).then((e=>{var t;const r=e.result;return(null===(t=r)||void 0===t?void 0:t.luid)?new i.CustomViewImpl(r,this._registryId):void 0}))}removeCustomViewAsync(e){const t={[a.ParameterId.FunctionName]:"removeCustomViewAsync",[a.ParameterId.CustomViewName]:e};return this.execute(a.VerbId.RemoveCustomView,t).then((e=>{const t=e.result;return new i.CustomViewImpl(t,this._registryId)}))}saveCustomViewAsync(e){const t={[a.ParameterId.FunctionName]:"saveCustomViewAsync",[a.ParameterId.CustomViewName]:e,[a.ParameterId.CustomViewIsDefault]:!1};return this.execute(a.VerbId.SaveWorkbookAsCustomView,t).then((e=>{const t=e.result;return new i.CustomViewImpl(t,this._registryId)}))}setActiveCustomViewAsDefaultAsync(){const e={[a.ParameterId.FunctionName]:"setActiveCustomViewAsDefaultAsync"};return this.execute(a.VerbId.SetActiveCustomViewAsDefault,e).then((()=>{}))}saveAsync(e){const t={[a.ParameterId.FunctionName]:"saveAsync",[a.ParameterId.CustomViewLuid]:e.luid,[a.ParameterId.CustomViewName]:e.name,[a.ParameterId.CustomViewIsDefault]:e.isDefault,[a.ParameterId.CustomViewIsPublic]:e.shared};return this.execute(a.VerbId.UpdateCustomView,t).then((e=>{const t=e.result;return new i.CustomViewImpl(t,this._registryId)}))}getCurrentSrcAsync(){const e={[a.ParameterId.FunctionName]:"getCurrentSrcAsync"};return this.execute(a.VerbId.GetCurrentSrc,e).then((e=>e.result))}}t.VizServiceImpl=s},8856:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(1044),s=r(7480),o=r(1172),l=r(1776);class d extends l.ServiceImplBase{get serviceName(){return"zone-service"}setVisibilityAsync(e,t,r){const l={[i.ParameterId.FunctionName]:"setVisibilityAsync",[i.ParameterId.Dashboard]:e,[i.ParameterId.ZoneIdsVisibilityMap]:{}};return o.Param.convertParameterToMap(r,"zoneVisibilityMap").forEach(((e,r)=>{s.ErrorHelpers.verifyZoneIsValid(t,Number.parseInt(r,10)),s.ErrorHelpers.verifyEnumValue(e,a.DashboardObjectVisibilityType,"DashboardObjectVisibilityType"),l[i.ParameterId.ZoneIdsVisibilityMap][r]=n.ExternalToInternalEnumMappings.setVisibilityType.convert(e)})),this.execute(i.VerbId.SetZoneVisibility,l).then((e=>{}))}moveAndResizeAsync(e,t,r){const a={[i.ParameterId.Dashboard]:e,[i.ParameterId.DashboardObjectPositionAndSizeUpdateList]:r};return r.forEach((e=>{s.ErrorHelpers.verifyZoneIsValidAndFloating(t,e.dashboardObjectID),s.ErrorHelpers.verifyWidthAndHeightOfDashboardObjectPositionAndSizeUpdate(e)})),this.execute(i.VerbId.MoveAndResizeZones,a).then((e=>{}))}}t.ZoneServiceImpl=d},7603:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.TableSummary=class{constructor(e){this._tableInfo=e}get name(){return this._tableInfo.name}get id(){return this._tableInfo.id}get connectionId(){return this._tableInfo.connectionId}get customSQL(){return this._tableInfo.customSQL}}},6664:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});class r extends Error{constructor(e,t){super(`${e}: ${t}`),this._errorCode=e,Object.setPrototypeOf(this,r.prototype)}get errorCode(){return this._errorCode}}t.TableauError=r},8052:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3448),i=r(5068);t.DataValueFactory=class{static MakeParameterDataValue(e,t){return new i.DataValue(e.value,a.DataTypeConverter.convertStringValueToNativeValue(e.value,t),e.formattedValue,e.aliasedValue,e.hasAlias)}static MakeFilterDataValue(e){return new i.DataValue(e.value,e.value,e.formattedValue)}static MakeTableDataValue(e,t){return new i.DataValue(e.value,void 0!==e.value?a.DataTypeConverter.convertValueToNativeValue(e.value,t):void 0,e.formattedValue)}}},1724:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Deferred=class{constructor(){this._promise=new Promise(((e,t)=>{this._resolve=e,this._reject=t}))}get promise(){return this._promise}resolve(e){this._resolve&&this._resolve(e)}reject(e){this._reject&&this._reject(e)}},t.UnregisterTimeoutInMilliseconds=3e4},5520:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(6664);var n;t.EnumConverter=class{constructor(e,t){this._mappings=e,this._defaultVal=t}convert(e,t=n.Yes){if(this._mappings.hasOwnProperty(e))return this._mappings[e];if(void 0!==this._defaultVal&&t!==n.Yes)return this._defaultVal;throw new i.TableauError(a.ErrorCodes.InternalError,`Enum Mapping not found for: ${e}`)}},function(e){e.Yes="yes",e.No="no"}(n=t.ShouldThrow||(t.ShouldThrow={}))},7480:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(6664),n=r(1172);class s{static apiNotImplemented(e){return new i.TableauError(a.SharedErrorCodes.InternalError,`${e} API not yet implemented.`)}static verifyInternalValue(e,t){if(null==e)throw new i.TableauError(a.SharedErrorCodes.InternalError,`${e} is invalid value for: ${t}`)}static verifyParameter(e,t){if(null==e)throw new i.TableauError(a.SharedErrorCodes.InvalidParameter,`${e} is invalid value for parameter: ${t}`)}static verifyParameterType(e,t,r){if(typeof e!==t)throw new i.TableauError(a.SharedErrorCodes.InvalidParameter,`${e} has invalid type for parameter: ${r}.`)}static verifyStringParameter(e,t){if(null==e||""===e)throw new i.TableauError(a.SharedErrorCodes.InvalidParameter,`${e} is invalid value for paramter: ${t}`)}static isValidEnumValue(e,t){let r=!1;return Object.keys(t).forEach((a=>{t[a]===e.toString()&&(r=!0)})),r}static verifyEnumValue(e,t,r){if(!s.isValidEnumValue(e,t))throw new i.TableauError(a.SharedErrorCodes.InvalidParameter,`${e} is invalid value for enum: ${r}.`)}static verifyRange(e,t,r){if(!(t<=e&&et.exportableSheetNamesFromDashboard.includes(e)))||e.every((e=>t.exportableSheetNamesFromWorkbook.includes(e)))||1===e.length&&e[0]===t.currentSheetName))throw new i.TableauError(a.SharedErrorCodes.InvalidSelectionSheet,"sheetNames parameter must have all its entries be exportable sheet names from the dashboard or all its entries be exportable sheet names from the workbook")}static verifyExportPDFOptions(e){try{this.verifyEnumValue(e.orientation,a.PrintOrientation,"PrintOrientation"),this.verifyEnumValue(e.pageSize,a.PrintPageSize,"PrintPageSize"),this.verifyEnumValue(e.scaling,a.PrintScaling,"PrintScaling")}catch(e){throw new i.TableauError(a.SharedErrorCodes.InvalidParameter,"options parameter must be of type ExportPDFOptions")}}}t.ErrorHelpers=s},5044:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3448),i=r(7419),n=r(6664);class s{static updateInternalExportPDFOptions(e,t,r){e.currentSheet=r[0],this.updateExportLayoutOptions(e,t),this.updateSheetOptions(e,r)}static updateExportLayoutOptions(e,t){const r=e.exportLayoutOptions;switch(r.imageHeight=this.DefaultLayoutOptions.imageHeight,r.imageWidth=this.DefaultLayoutOptions.imageWidth,t.orientation){case i.PrintOrientation.Landscape:r.pageOrientationOption=a.PageOrientation.Landscape;break;case i.PrintOrientation.Portrait:r.pageOrientationOption=a.PageOrientation.Portrait;break;default:throw new n.TableauError(i.SharedErrorCodes.InternalError,"invalid orientation for ExportPDFOption")}switch(t.pageSize){case i.PrintPageSize.A3:r.pageSizeOption=a.PageSizeOption.A3;break;case i.PrintPageSize.A4:r.pageSizeOption=a.PageSizeOption.A4;break;case i.PrintPageSize.A5:r.pageSizeOption=a.PageSizeOption.A5;break;case i.PrintPageSize.B4:r.pageSizeOption=a.PageSizeOption.B4;break;case i.PrintPageSize.B5:r.pageSizeOption=a.PageSizeOption.B5;break;case i.PrintPageSize.Executive:r.pageSizeOption=a.PageSizeOption.Executive;break;case i.PrintPageSize.Folio:r.pageSizeOption=a.PageSizeOption.Folio;break;case i.PrintPageSize.Ledger:r.pageSizeOption=a.PageSizeOption.Ledger;break;case i.PrintPageSize.Legal:r.pageSizeOption=a.PageSizeOption.Legal;break;case i.PrintPageSize.Letter:r.pageSizeOption=a.PageSizeOption.Letter;break;case i.PrintPageSize.Note:r.pageSizeOption=a.PageSizeOption.Note;break;case i.PrintPageSize.Quarto:r.pageSizeOption=a.PageSizeOption.Quarto;break;case i.PrintPageSize.Statement:r.pageSizeOption=a.PageSizeOption.Statement;break;case i.PrintPageSize.Tabloid:r.pageSizeOption=a.PageSizeOption.Tabloid;break;case i.PrintPageSize.Unspecified:r.pageSizeOption=a.PageSizeOption.Unspecified;break;default:throw new n.TableauError(i.SharedErrorCodes.InternalError,"invalid pageSize for ExportPDFOption")}switch(t.scaling){case i.PrintScaling.AtMost1PageHigh:this.setFitAndScaleValues(r,a.FitPages.FitOneHigh);break;case i.PrintScaling.AtMost1PageWide:this.setFitAndScaleValues(r,a.FitPages.FitOneWide);break;case i.PrintScaling.AtMost2PagesHigh:this.setFitAndScaleValues(r,a.FitPages.FitTwoHigh);break;case i.PrintScaling.AtMost2PagesWide:this.setFitAndScaleValues(r,a.FitPages.FitTwoWide);break;case i.PrintScaling.Automatic:this.setFitAndScaleValues(r,a.PageScalingOption.ScalePctAuto);break;case i.PrintScaling.Perc100:this.setFitAndScaleValues(r,a.PageScalingOption.ScalePct100);break;case i.PrintScaling.Perc200:this.setFitAndScaleValues(r,a.PageScalingOption.ScalePct200);break;case i.PrintScaling.Perc25:this.setFitAndScaleValues(r,a.PageScalingOption.ScalePct25);break;case i.PrintScaling.Perc400:this.setFitAndScaleValues(r,a.PageScalingOption.ScalePct400);break;case i.PrintScaling.Perc50:this.setFitAndScaleValues(r,a.PageScalingOption.ScalePct50);break;case i.PrintScaling.Perc60:this.setFitAndScaleValues(r,a.PageScalingOption.ScalePct60);break;case i.PrintScaling.Perc75:this.setFitAndScaleValues(r,a.PageScalingOption.ScalePct75);break;case i.PrintScaling.Perc80:this.setFitAndScaleValues(r,a.PageScalingOption.ScalePct80);break;case i.PrintScaling.Perc90:this.setFitAndScaleValues(r,a.PageScalingOption.ScalePct90);break;default:throw new n.TableauError(i.SharedErrorCodes.InternalError,"invalid scaling for ExportPDFOption")}}static updateSheetOptions(e,t){const{exportLayoutOptions:r,sheetOptions:a}=e;for(const e of a)e.exportLayoutOptions=r,e.isSelected=t.includes(e.sheet)}static setFitAndScaleValues(e,t){let{pageFitHorizontal:r,pageFitVertical:i,pageScaleMode:n,pageScalePercent:s}=this.DefaultLayoutOptions;const o=this.fitRegex.exec(t),l=this.pctRegex.exec(t);o?([r,i]=o.slice(1).map((e=>Number(e))),n=a.ScaleMode.ScaleFitPages):l&&([s]=l.slice(1).map((e=>Number(e))),n=a.ScaleMode.ScalePercentage),e.pageFitHorizontal=r,e.pageFitVertical=i,e.pageScaleMode=n,e.pageScalePercent=s}}t.ExportHelpers=s,s.DefaultDataOptions={ignoreAliases:!1,columnsToIncludeById:[]},s.DefaultPDFOptions={scaling:i.PrintScaling.Automatic,pageSize:i.PrintPageSize.Letter,orientation:i.PrintOrientation.Portrait},s.DefaultLayoutOptions={imageHeight:0,imageWidth:0,pageFitHorizontal:1,pageFitVertical:1,pageOrientationOption:a.PageOrientation.Portrait,pageScaleMode:a.ScaleMode.ScaleAuto,pageScalePercent:100,pageSizeOption:a.PageSizeOption.Letter},s.fitRegex=new RegExp("fit([0-9]+)x([0-9]+)"),s.pctRegex=new RegExp("pct([0-9]+)")},1172:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(6664),n=r(7480);class s{static serializeDateForPlatform(e){return`${e.getUTCFullYear()}-${e.getUTCMonth()+1}-${e.getUTCDate()} ${e.getUTCHours()}:${e.getUTCMinutes()}:${e.getUTCSeconds()}`}static serializeBooleanForPlatform(e){return e?"true":"false"}static serializeNumberForPlatform(e){return e.toString(10)}static isTypeNumber(e){return"number"==typeof e||e instanceof Number}static isTypeDate(e){return e instanceof Date}static isTypeString(e){return"string"==typeof e||e instanceof String}static isTypeBool(e){return"boolean"==typeof e||e instanceof Boolean}static isNullOrUndefined(e){return null==e}static serializeParameterValue(e){if(s.isTypeNumber(e))return s.serializeNumberForPlatform(e);if(s.isTypeDate(e))return s.serializeDateForPlatform(e);if(s.isTypeBool(e))return s.serializeBooleanForPlatform(e);if(s.isTypeString(e))return e;throw new i.TableauError(a.ErrorCodes.InternalError,`Unexpected invalid value for: ${e}`)}static convertParameterToMap(e,t){if(n.ErrorHelpers.verifyParameterType(e,"object",t),Array.isArray(e))throw new i.TableauError(a.ErrorCodes.InvalidParameter,`Expecting object or Map for: ${t}.`);return e instanceof Map?e:new Map(Object.entries(e))}static tryParseNumber(e){if(s.isNullOrUndefined(e))return{success:!1};if(s.isTypeNumber(e))return{parsed:e,success:!0};const t=e.toString();if("NaN"===t)return{parsed:NaN,success:!0};const r=parseFloat(t);return isNaN(r)?{success:!1}:{parsed:r,success:!0}}}t.Param=s},2780:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(6664);t.SheetUtils=class{static getSheetSizeFromSizeConstraints(e){const{minWidth:t,minHeight:r,maxWidth:i,maxHeight:n}=e;if(0===r&&0===t)return 0===n&&0===i?{behavior:a.SheetSizeBehavior.Automatic}:{behavior:a.SheetSizeBehavior.AtMost,maxSize:{width:i,height:n}};if(0===n&&0===i)return{behavior:a.SheetSizeBehavior.AtLeast,minSize:{width:t,height:r}};if(n===r&&i===t&&t>0)return{behavior:a.SheetSizeBehavior.Exactly,minSize:{width:t,height:r},maxSize:{width:t,height:r}};const s=0===t&&0===i;return{behavior:a.SheetSizeBehavior.Range,minSize:{width:t,height:r},maxSize:{width:s?2147483647:i,height:n}}}static createAutomaticSize(){return{behavior:a.SheetSizeBehavior.Automatic,minSize:{width:0,height:0},maxSize:{width:0,height:0}}}static getPublishedSheetInfoByName(e,t){return t.find((t=>t.name===e))}static getSheetTypeEnum(e){let t;switch(e){case i.SheetType.Worksheet:t=a.SheetType.Worksheet;break;case i.SheetType.Dashboard:t=a.SheetType.Dashboard;break;case i.SheetType.Story:t=a.SheetType.Story;break;default:throw new n.TableauError(a.SharedErrorCodes.ServerError,"Invalid SheetType")}return t}static isValidSheetSize(e){return void 0!==e.behavior}}},3036:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(6664),n=r(1724);t.ShortLivedDeferred=class{constructor(e=n.UnregisterTimeoutInMilliseconds){this._timeoutInMilliseconds=e}getNewPromiseOrThrowIfBusy(){if(this._deferred)throw new i.TableauError(a.SharedErrorCodes.ApiExecutionError,"This api cannot be executed till previous call is resolved.");return this._deferred=new n.Deferred,this._timeoutId=setTimeout((()=>{const e=new i.TableauError(a.SharedErrorCodes.Timeout,`Api failed to complete in ${this._timeoutInMilliseconds/1e3} seconds`);this.reject(e)}),this._timeoutInMilliseconds),this._deferred.promise}resolve(e){this._deferred&&(clearTimeout(this._timeoutId),this._deferred.resolve(e),this._deferred=void 0)}reject(e){this._deferred&&(clearTimeout(this._timeoutId),this._deferred.reject(e),this._deferred=void 0)}}},1576:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(6664);t.VersionNumber=class{constructor(e,t){const r=e.split("-");this.build=this.getBuildNumber(r[1]);const n=(e=r[0]).split(".").map((e=>parseInt(e,10)));if(3!==n.length)throw new i.TableauError(a.ErrorCodes.InternalError,`Invalid version number: ${e}`);this.major=n[0],this.minor=n[1],this.fix=n[2],this.isAlpha=t}getBuildNumber(e){if(!e)return-1;const t=e.split(".");return t[1]?parseInt(t[1],10):-1}get formattedValue(){return`${this.major}.${this.minor}.${this.fix}`}get fullFormattedValue(){return`${this.major}.${this.minor}.${this.fix}-pre.${this.build}`}}},8648:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3448);t.VersionedExternalApiDispatcher=class{constructor(e,t){this._apiDelegateDispatcher=e,this._versionConverter=a.CreateExternalCompatibleVersionConverter(a.INTERNAL_CONTRACT_VERSION,t),this._notificationHandlers=[],e.registerNotificationHandler((e=>{if(0===this._notificationHandlers.length)return;const t=this._versionConverter.upgradeNotification(e);this._notificationHandlers.forEach((e=>{e(t)}))}))}static needsVersionConverter(e){return a.VersionLessThan(e,a.INTERNAL_CONTRACT_VERSION)}execute(e,t){try{const r=this._versionConverter.downgradeExecuteCall(e,t);return this._apiDelegateDispatcher.execute(r.verb,r.parameters).then((r=>this._versionConverter.upgradeExecuteReturn(r,e,t)))}catch(e){return Promise.reject(e)}}registerNotificationHandler(e){this._notificationHandlers.push(e)}unregisterNotificationHandler(e){this._notificationHandlers=this._notificationHandlers.filter((t=>t!==e))}}},6680:(e,t,r)=>{"use strict";var a;r.r(t),r.d(t,{NIL:()=>F,parse:()=>y,stringify:()=>c,v1:()=>g,v3:()=>P,v4:()=>_,v5:()=>C,validate:()=>o,version:()=>x});var i=new Uint8Array(16);function n(){if(!a&&!(a="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto)))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return a(i)}const s=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i,o=function(e){return"string"==typeof e&&s.test(e)};for(var l=[],d=0;d<256;++d)l.push((d+256).toString(16).substr(1));const c=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,r=(l[e[t+0]]+l[e[t+1]]+l[e[t+2]]+l[e[t+3]]+"-"+l[e[t+4]]+l[e[t+5]]+"-"+l[e[t+6]]+l[e[t+7]]+"-"+l[e[t+8]]+l[e[t+9]]+"-"+l[e[t+10]]+l[e[t+11]]+l[e[t+12]]+l[e[t+13]]+l[e[t+14]]+l[e[t+15]]).toLowerCase();if(!o(r))throw TypeError("Stringified UUID is invalid");return r};var u,h,p=0,m=0;const g=function(e,t,r){var a=t&&r||0,i=t||new Array(16),s=(e=e||{}).node||u,o=void 0!==e.clockseq?e.clockseq:h;if(null==s||null==o){var l=e.random||(e.rng||n)();null==s&&(s=u=[1|l[0],l[1],l[2],l[3],l[4],l[5]]),null==o&&(o=h=16383&(l[6]<<8|l[7]))}var d=void 0!==e.msecs?e.msecs:Date.now(),g=void 0!==e.nsecs?e.nsecs:m+1,y=d-p+(g-m)/1e4;if(y<0&&void 0===e.clockseq&&(o=o+1&16383),(y<0||d>p)&&void 0===e.nsecs&&(g=0),g>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");p=d,m=g,h=o;var I=(1e4*(268435455&(d+=122192928e5))+g)%4294967296;i[a++]=I>>>24&255,i[a++]=I>>>16&255,i[a++]=I>>>8&255,i[a++]=255&I;var v=d/4294967296*1e4&268435455;i[a++]=v>>>8&255,i[a++]=255&v,i[a++]=v>>>24&15|16,i[a++]=v>>>16&255,i[a++]=o>>>8|128,i[a++]=255&o;for(var S=0;S<6;++S)i[a+S]=s[S];return t||c(i)},y=function(e){if(!o(e))throw TypeError("Invalid UUID");var t,r=new Uint8Array(16);return r[0]=(t=parseInt(e.slice(0,8),16))>>>24,r[1]=t>>>16&255,r[2]=t>>>8&255,r[3]=255&t,r[4]=(t=parseInt(e.slice(9,13),16))>>>8,r[5]=255&t,r[6]=(t=parseInt(e.slice(14,18),16))>>>8,r[7]=255&t,r[8]=(t=parseInt(e.slice(19,23),16))>>>8,r[9]=255&t,r[10]=(t=parseInt(e.slice(24,36),16))/1099511627776&255,r[11]=t/4294967296&255,r[12]=t>>>24&255,r[13]=t>>>16&255,r[14]=t>>>8&255,r[15]=255&t,r};function I(e,t,r){function a(e,a,i,n){if("string"==typeof e&&(e=function(e){e=unescape(encodeURIComponent(e));for(var t=[],r=0;r>>9<<4)+1}function S(e,t){var r=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(r>>16)<<16|65535&r}function T(e,t,r,a,i,n){return S((s=S(S(t,e),S(a,n)))<<(o=i)|s>>>32-o,r);var s,o}function b(e,t,r,a,i,n,s){return T(t&r|~t&a,e,t,i,n,s)}function f(e,t,r,a,i,n,s){return T(t&a|r&~a,e,t,i,n,s)}function E(e,t,r,a,i,n,s){return T(t^r^a,e,t,i,n,s)}function A(e,t,r,a,i,n,s){return T(r^(t|~a),e,t,i,n,s)}const P=I("v3",48,(function(e){if("string"==typeof e){var t=unescape(encodeURIComponent(e));e=new Uint8Array(t.length);for(var r=0;r>5]>>>i%32&255,s=parseInt(a.charAt(n>>>4&15)+a.charAt(15&n),16);t.push(s)}return t}(function(e,t){e[t>>5]|=128<>5]|=(255&e[a/8])<>>32-t}const C=I("v5",80,(function(e){var t=[1518500249,1859775393,2400959708,3395469782],r=[1732584193,4023233417,2562383102,271733878,3285377520];if("string"==typeof e){var a=unescape(encodeURIComponent(e));e=[];for(var i=0;i>>0;S=v,v=I,I=D(y,30)>>>0,y=g,g=f}r[0]=r[0]+g>>>0,r[1]=r[1]+y>>>0,r[2]=r[2]+I>>>0,r[3]=r[3]+v>>>0,r[4]=r[4]+S>>>0}return[r[0]>>24&255,r[0]>>16&255,r[0]>>8&255,255&r[0],r[1]>>24&255,r[1]>>16&255,r[1]>>8&255,255&r[1],r[2]>>24&255,r[2]>>16&255,r[2]>>8&255,255&r[2],r[3]>>24&255,r[3]>>16&255,r[3]>>8&255,255&r[3],r[4]>>24&255,r[4]>>16&255,r[4]>>8&255,255&r[4]]})),F="00000000-0000-0000-0000-000000000000",x=function(e){if(!o(e))throw TypeError("Invalid UUID");return parseInt(e.substr(14,1),16)}},5892:e=>{"use strict";e.exports=JSON.parse('{"major":1,"minor":188,"fix":0}')}},t={};function r(a){var i=t[a];if(void 0!==i)return i.exports;var n=t[a]={exports:{}};return e[a].call(n.exports,n,n.exports,r),n.exports}r.d=(e,t)=>{for(var a in t)r.o(t,a)&&!r.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var a={};(()=>{"use strict";var e=a;Object.defineProperty(e,"__esModule",{value:!0});const t=r(5136),i=r(976),n=r(5408),s="undefined"!=typeof VERSION_IS_ALPHA&&VERSION_IS_ALPHA;t.ApiVersion.SetVersionNumber("1.15.0-pre.15",s);const o=new i.ExtensionsImpl;e.extensions=new n.Extensions(o);var l=r(7419);e.AnalyticsObjectType=l.AnalyticsObjectType,e.AnnotationType=l.AnnotationType,e.ClassNameKey=l.ClassNameKey,e.ColumnType=l.ColumnType,e.DashboardLayoutChange=l.DashboardLayoutChange,e.DashboardObjectType=l.DashboardObjectType,e.DashboardObjectVisibilityType=l.DashboardObjectVisibilityType,e.DataType=l.DataType,e.DateRangeType=l.DateRangeType,e.DialogStyle=l.DialogStyle,e.EncodingType=l.EncodingType,e.ErrorCodes=l.ErrorCodes,e.ExtensionContext=l.ExtensionContext,e.ExtensionMode=l.ExtensionMode,e.FieldAggregationType=l.FieldAggregationType,e.FieldRoleType=l.FieldRoleType,e.FilterDomainType=l.FilterDomainType,e.FilterNullOption=l.FilterNullOption,e.FilterType=l.FilterType,e.FilterUpdateType=l.FilterUpdateType,e.HierarchicalLevelSelectionState=l.HierarchicalLevelSelectionState,e.IncludeDataValuesOption=l.IncludeDataValuesOption,e.MarkType=l.MarkType,e.ParameterValueType=l.ParameterValueType,e.PeriodType=l.PeriodType,e.QuickTableCalcType=l.QuickTableCalcType,e.ReplaySpeedType=l.ReplaySpeedType,e.SelectionUpdateType=l.SelectionUpdateType,e.SelectOptions=l.SelectOptions,e.SheetType=l.SheetType,e.SortDirection=l.SortDirection,e.TableauEventType=l.TableauEventType,e.TrendLineModelType=l.TrendLineModelType,e.VizImageEncodingType=l.VizImageEncodingType,e.VizImagePaletteType=l.VizImagePaletteType,e.VizImageSizeSettingAlignmentType=l.VizImageSizeSettingAlignmentType,e.VizImageSizeSettingType=l.VizImageSizeSettingType,e.VizImageSortDirectionType=l.VizImageSortDirectionType,e.ZoneVisibilityType=l.ZoneVisibilityType})(),window.tableau=a})(); -//# sourceMappingURL=tableau.extensions.1.15.0-pre.15.min.js.map \ No newline at end of file diff --git a/lib/tableau.extensions.1.14.0-pre.9.min.js.map b/lib/previous/tableau.extensions.1.14.0-pre.9.min.js.map similarity index 100% rename from lib/tableau.extensions.1.14.0-pre.9.min.js.map rename to lib/previous/tableau.extensions.1.14.0-pre.9.min.js.map diff --git a/lib/tableau.extensions.1.14.0.js b/lib/previous/tableau.extensions.1.14.0.js similarity index 100% rename from lib/tableau.extensions.1.14.0.js rename to lib/previous/tableau.extensions.1.14.0.js diff --git a/lib/tableau.extensions.1.14.0.min.js b/lib/previous/tableau.extensions.1.14.0.min.js similarity index 100% rename from lib/tableau.extensions.1.14.0.min.js rename to lib/previous/tableau.extensions.1.14.0.min.js diff --git a/lib/beta/tableau.extensions.1.15.0-pre.15.min.js.map b/lib/tableau.extensions.1.15.0-pre.15.min.js.map similarity index 100% rename from lib/beta/tableau.extensions.1.15.0-pre.15.min.js.map rename to lib/tableau.extensions.1.15.0-pre.15.min.js.map diff --git a/lib/beta/tableau.extensions.1.15.0.js b/lib/tableau.extensions.1.15.0.js similarity index 100% rename from lib/beta/tableau.extensions.1.15.0.js rename to lib/tableau.extensions.1.15.0.js diff --git a/lib/beta/tableau.extensions.1.15.0.min.js b/lib/tableau.extensions.1.15.0.min.js similarity index 100% rename from lib/beta/tableau.extensions.1.15.0.min.js rename to lib/tableau.extensions.1.15.0.min.js diff --git a/lib/tableau.extensions.1.latest.js b/lib/tableau.extensions.1.latest.js index e7f4568..e55d068 100644 --- a/lib/tableau.extensions.1.latest.js +++ b/lib/tableau.extensions.1.latest.js @@ -1,5171 +1,6 @@ /******/ (() => { // webpackBootstrap /******/ var __webpack_modules__ = ({ -/***/ "../../node_modules/core-js/es/array/find.js": -/*!***************************************************!*\ - !*** ../../node_modules/core-js/es/array/find.js ***! - \***************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -__webpack_require__(/*! ../../modules/es.array.find */ "../../node_modules/core-js/modules/es.array.find.js"); -var entryUnbind = __webpack_require__(/*! ../../internals/entry-unbind */ "../../node_modules/core-js/internals/entry-unbind.js"); - -module.exports = entryUnbind('Array', 'find'); - - -/***/ }), - -/***/ "../../node_modules/core-js/es/array/from.js": -/*!***************************************************!*\ - !*** ../../node_modules/core-js/es/array/from.js ***! - \***************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -__webpack_require__(/*! ../../modules/es.string.iterator */ "../../node_modules/core-js/modules/es.string.iterator.js"); -__webpack_require__(/*! ../../modules/es.array.from */ "../../node_modules/core-js/modules/es.array.from.js"); -var path = __webpack_require__(/*! ../../internals/path */ "../../node_modules/core-js/internals/path.js"); - -module.exports = path.Array.from; - - -/***/ }), - -/***/ "../../node_modules/core-js/es/map/index.js": -/*!**************************************************!*\ - !*** ../../node_modules/core-js/es/map/index.js ***! - \**************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -__webpack_require__(/*! ../../modules/es.array.iterator */ "../../node_modules/core-js/modules/es.array.iterator.js"); -__webpack_require__(/*! ../../modules/es.map */ "../../node_modules/core-js/modules/es.map.js"); -__webpack_require__(/*! ../../modules/es.object.to-string */ "../../node_modules/core-js/modules/es.object.to-string.js"); -__webpack_require__(/*! ../../modules/es.string.iterator */ "../../node_modules/core-js/modules/es.string.iterator.js"); -var path = __webpack_require__(/*! ../../internals/path */ "../../node_modules/core-js/internals/path.js"); - -module.exports = path.Map; - - -/***/ }), - -/***/ "../../node_modules/core-js/es/number/is-integer.js": -/*!**********************************************************!*\ - !*** ../../node_modules/core-js/es/number/is-integer.js ***! - \**********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -__webpack_require__(/*! ../../modules/es.number.is-integer */ "../../node_modules/core-js/modules/es.number.is-integer.js"); -var path = __webpack_require__(/*! ../../internals/path */ "../../node_modules/core-js/internals/path.js"); - -module.exports = path.Number.isInteger; - - -/***/ }), - -/***/ "../../node_modules/core-js/es/number/is-nan.js": -/*!******************************************************!*\ - !*** ../../node_modules/core-js/es/number/is-nan.js ***! - \******************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -__webpack_require__(/*! ../../modules/es.number.is-nan */ "../../node_modules/core-js/modules/es.number.is-nan.js"); -var path = __webpack_require__(/*! ../../internals/path */ "../../node_modules/core-js/internals/path.js"); - -module.exports = path.Number.isNaN; - - -/***/ }), - -/***/ "../../node_modules/core-js/es/number/parse-float.js": -/*!***********************************************************!*\ - !*** ../../node_modules/core-js/es/number/parse-float.js ***! - \***********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -__webpack_require__(/*! ../../modules/es.number.parse-float */ "../../node_modules/core-js/modules/es.number.parse-float.js"); -var path = __webpack_require__(/*! ../../internals/path */ "../../node_modules/core-js/internals/path.js"); - -module.exports = path.Number.parseFloat; - - -/***/ }), - -/***/ "../../node_modules/core-js/es/number/parse-int.js": -/*!*********************************************************!*\ - !*** ../../node_modules/core-js/es/number/parse-int.js ***! - \*********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -__webpack_require__(/*! ../../modules/es.number.parse-int */ "../../node_modules/core-js/modules/es.number.parse-int.js"); -var path = __webpack_require__(/*! ../../internals/path */ "../../node_modules/core-js/internals/path.js"); - -module.exports = path.Number.parseInt; - - -/***/ }), - -/***/ "../../node_modules/core-js/es/object/assign.js": -/*!******************************************************!*\ - !*** ../../node_modules/core-js/es/object/assign.js ***! - \******************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -__webpack_require__(/*! ../../modules/es.object.assign */ "../../node_modules/core-js/modules/es.object.assign.js"); -var path = __webpack_require__(/*! ../../internals/path */ "../../node_modules/core-js/internals/path.js"); - -module.exports = path.Object.assign; - - -/***/ }), - -/***/ "../../node_modules/core-js/es/object/entries.js": -/*!*******************************************************!*\ - !*** ../../node_modules/core-js/es/object/entries.js ***! - \*******************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -__webpack_require__(/*! ../../modules/es.object.entries */ "../../node_modules/core-js/modules/es.object.entries.js"); -var path = __webpack_require__(/*! ../../internals/path */ "../../node_modules/core-js/internals/path.js"); - -module.exports = path.Object.entries; - - -/***/ }), - -/***/ "../../node_modules/core-js/es/object/set-prototype-of.js": -/*!****************************************************************!*\ - !*** ../../node_modules/core-js/es/object/set-prototype-of.js ***! - \****************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -__webpack_require__(/*! ../../modules/es.object.set-prototype-of */ "../../node_modules/core-js/modules/es.object.set-prototype-of.js"); -var path = __webpack_require__(/*! ../../internals/path */ "../../node_modules/core-js/internals/path.js"); - -module.exports = path.Object.setPrototypeOf; - - -/***/ }), - -/***/ "../../node_modules/core-js/es/promise/index.js": -/*!******************************************************!*\ - !*** ../../node_modules/core-js/es/promise/index.js ***! - \******************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -__webpack_require__(/*! ../../modules/es.aggregate-error */ "../../node_modules/core-js/modules/es.aggregate-error.js"); -__webpack_require__(/*! ../../modules/es.array.iterator */ "../../node_modules/core-js/modules/es.array.iterator.js"); -__webpack_require__(/*! ../../modules/es.object.to-string */ "../../node_modules/core-js/modules/es.object.to-string.js"); -__webpack_require__(/*! ../../modules/es.promise */ "../../node_modules/core-js/modules/es.promise.js"); -__webpack_require__(/*! ../../modules/es.promise.all-settled */ "../../node_modules/core-js/modules/es.promise.all-settled.js"); -__webpack_require__(/*! ../../modules/es.promise.any */ "../../node_modules/core-js/modules/es.promise.any.js"); -__webpack_require__(/*! ../../modules/es.promise.finally */ "../../node_modules/core-js/modules/es.promise.finally.js"); -__webpack_require__(/*! ../../modules/es.string.iterator */ "../../node_modules/core-js/modules/es.string.iterator.js"); -var path = __webpack_require__(/*! ../../internals/path */ "../../node_modules/core-js/internals/path.js"); - -module.exports = path.Promise; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/a-callable.js": -/*!**********************************************************!*\ - !*** ../../node_modules/core-js/internals/a-callable.js ***! - \**********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); -var isCallable = __webpack_require__(/*! ../internals/is-callable */ "../../node_modules/core-js/internals/is-callable.js"); -var tryToString = __webpack_require__(/*! ../internals/try-to-string */ "../../node_modules/core-js/internals/try-to-string.js"); - -var TypeError = global.TypeError; - -// `Assert: IsCallable(argument) is true` -module.exports = function (argument) { - if (isCallable(argument)) return argument; - throw TypeError(tryToString(argument) + ' is not a function'); -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/a-constructor.js": -/*!*************************************************************!*\ - !*** ../../node_modules/core-js/internals/a-constructor.js ***! - \*************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); -var isConstructor = __webpack_require__(/*! ../internals/is-constructor */ "../../node_modules/core-js/internals/is-constructor.js"); -var tryToString = __webpack_require__(/*! ../internals/try-to-string */ "../../node_modules/core-js/internals/try-to-string.js"); - -var TypeError = global.TypeError; - -// `Assert: IsConstructor(argument) is true` -module.exports = function (argument) { - if (isConstructor(argument)) return argument; - throw TypeError(tryToString(argument) + ' is not a constructor'); -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/a-possible-prototype.js": -/*!********************************************************************!*\ - !*** ../../node_modules/core-js/internals/a-possible-prototype.js ***! - \********************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); -var isCallable = __webpack_require__(/*! ../internals/is-callable */ "../../node_modules/core-js/internals/is-callable.js"); - -var String = global.String; -var TypeError = global.TypeError; - -module.exports = function (argument) { - if (typeof argument == 'object' || isCallable(argument)) return argument; - throw TypeError("Can't set " + String(argument) + ' as a prototype'); -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/add-to-unscopables.js": -/*!******************************************************************!*\ - !*** ../../node_modules/core-js/internals/add-to-unscopables.js ***! - \******************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../../node_modules/core-js/internals/well-known-symbol.js"); -var create = __webpack_require__(/*! ../internals/object-create */ "../../node_modules/core-js/internals/object-create.js"); -var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "../../node_modules/core-js/internals/object-define-property.js"); - -var UNSCOPABLES = wellKnownSymbol('unscopables'); -var ArrayPrototype = Array.prototype; - -// Array.prototype[@@unscopables] -// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables -if (ArrayPrototype[UNSCOPABLES] == undefined) { - definePropertyModule.f(ArrayPrototype, UNSCOPABLES, { - configurable: true, - value: create(null) - }); -} - -// add a key to Array.prototype[@@unscopables] -module.exports = function (key) { - ArrayPrototype[UNSCOPABLES][key] = true; -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/an-instance.js": -/*!***********************************************************!*\ - !*** ../../node_modules/core-js/internals/an-instance.js ***! - \***********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); -var isPrototypeOf = __webpack_require__(/*! ../internals/object-is-prototype-of */ "../../node_modules/core-js/internals/object-is-prototype-of.js"); - -var TypeError = global.TypeError; - -module.exports = function (it, Prototype) { - if (isPrototypeOf(Prototype, it)) return it; - throw TypeError('Incorrect invocation'); -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/an-object.js": -/*!*********************************************************!*\ - !*** ../../node_modules/core-js/internals/an-object.js ***! - \*********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); -var isObject = __webpack_require__(/*! ../internals/is-object */ "../../node_modules/core-js/internals/is-object.js"); - -var String = global.String; -var TypeError = global.TypeError; - -// `Assert: Type(argument) is Object` -module.exports = function (argument) { - if (isObject(argument)) return argument; - throw TypeError(String(argument) + ' is not an object'); -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/array-from.js": -/*!**********************************************************!*\ - !*** ../../node_modules/core-js/internals/array-from.js ***! - \**********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - -var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); -var bind = __webpack_require__(/*! ../internals/function-bind-context */ "../../node_modules/core-js/internals/function-bind-context.js"); -var call = __webpack_require__(/*! ../internals/function-call */ "../../node_modules/core-js/internals/function-call.js"); -var toObject = __webpack_require__(/*! ../internals/to-object */ "../../node_modules/core-js/internals/to-object.js"); -var callWithSafeIterationClosing = __webpack_require__(/*! ../internals/call-with-safe-iteration-closing */ "../../node_modules/core-js/internals/call-with-safe-iteration-closing.js"); -var isArrayIteratorMethod = __webpack_require__(/*! ../internals/is-array-iterator-method */ "../../node_modules/core-js/internals/is-array-iterator-method.js"); -var isConstructor = __webpack_require__(/*! ../internals/is-constructor */ "../../node_modules/core-js/internals/is-constructor.js"); -var lengthOfArrayLike = __webpack_require__(/*! ../internals/length-of-array-like */ "../../node_modules/core-js/internals/length-of-array-like.js"); -var createProperty = __webpack_require__(/*! ../internals/create-property */ "../../node_modules/core-js/internals/create-property.js"); -var getIterator = __webpack_require__(/*! ../internals/get-iterator */ "../../node_modules/core-js/internals/get-iterator.js"); -var getIteratorMethod = __webpack_require__(/*! ../internals/get-iterator-method */ "../../node_modules/core-js/internals/get-iterator-method.js"); - -var Array = global.Array; - -// `Array.from` method implementation -// https://tc39.es/ecma262/#sec-array.from -module.exports = function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) { - var O = toObject(arrayLike); - var IS_CONSTRUCTOR = isConstructor(this); - var argumentsLength = arguments.length; - var mapfn = argumentsLength > 1 ? arguments[1] : undefined; - var mapping = mapfn !== undefined; - if (mapping) mapfn = bind(mapfn, argumentsLength > 2 ? arguments[2] : undefined); - var iteratorMethod = getIteratorMethod(O); - var index = 0; - var length, result, step, iterator, next, value; - // if the target is not iterable or it's an array with the default iterator - use a simple case - if (iteratorMethod && !(this == Array && isArrayIteratorMethod(iteratorMethod))) { - iterator = getIterator(O, iteratorMethod); - next = iterator.next; - result = IS_CONSTRUCTOR ? new this() : []; - for (;!(step = call(next, iterator)).done; index++) { - value = mapping ? callWithSafeIterationClosing(iterator, mapfn, [step.value, index], true) : step.value; - createProperty(result, index, value); - } - } else { - length = lengthOfArrayLike(O); - result = IS_CONSTRUCTOR ? new this(length) : Array(length); - for (;length > index; index++) { - value = mapping ? mapfn(O[index], index) : O[index]; - createProperty(result, index, value); - } - } - result.length = index; - return result; -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/array-includes.js": -/*!**************************************************************!*\ - !*** ../../node_modules/core-js/internals/array-includes.js ***! - \**************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "../../node_modules/core-js/internals/to-indexed-object.js"); -var toAbsoluteIndex = __webpack_require__(/*! ../internals/to-absolute-index */ "../../node_modules/core-js/internals/to-absolute-index.js"); -var lengthOfArrayLike = __webpack_require__(/*! ../internals/length-of-array-like */ "../../node_modules/core-js/internals/length-of-array-like.js"); - -// `Array.prototype.{ indexOf, includes }` methods implementation -var createMethod = function (IS_INCLUDES) { - return function ($this, el, fromIndex) { - var O = toIndexedObject($this); - var length = lengthOfArrayLike(O); - var index = toAbsoluteIndex(fromIndex, length); - var value; - // Array#includes uses SameValueZero equality algorithm - // eslint-disable-next-line no-self-compare -- NaN check - if (IS_INCLUDES && el != el) while (length > index) { - value = O[index++]; - // eslint-disable-next-line no-self-compare -- NaN check - if (value != value) return true; - // Array#indexOf ignores holes, Array#includes - not - } else for (;length > index; index++) { - if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0; - } return !IS_INCLUDES && -1; - }; -}; - -module.exports = { - // `Array.prototype.includes` method - // https://tc39.es/ecma262/#sec-array.prototype.includes - includes: createMethod(true), - // `Array.prototype.indexOf` method - // https://tc39.es/ecma262/#sec-array.prototype.indexof - indexOf: createMethod(false) -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/array-iteration.js": -/*!***************************************************************!*\ - !*** ../../node_modules/core-js/internals/array-iteration.js ***! - \***************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var bind = __webpack_require__(/*! ../internals/function-bind-context */ "../../node_modules/core-js/internals/function-bind-context.js"); -var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); -var IndexedObject = __webpack_require__(/*! ../internals/indexed-object */ "../../node_modules/core-js/internals/indexed-object.js"); -var toObject = __webpack_require__(/*! ../internals/to-object */ "../../node_modules/core-js/internals/to-object.js"); -var lengthOfArrayLike = __webpack_require__(/*! ../internals/length-of-array-like */ "../../node_modules/core-js/internals/length-of-array-like.js"); -var arraySpeciesCreate = __webpack_require__(/*! ../internals/array-species-create */ "../../node_modules/core-js/internals/array-species-create.js"); - -var push = uncurryThis([].push); - -// `Array.prototype.{ forEach, map, filter, some, every, find, findIndex, filterReject }` methods implementation -var createMethod = function (TYPE) { - var IS_MAP = TYPE == 1; - var IS_FILTER = TYPE == 2; - var IS_SOME = TYPE == 3; - var IS_EVERY = TYPE == 4; - var IS_FIND_INDEX = TYPE == 6; - var IS_FILTER_REJECT = TYPE == 7; - var NO_HOLES = TYPE == 5 || IS_FIND_INDEX; - return function ($this, callbackfn, that, specificCreate) { - var O = toObject($this); - var self = IndexedObject(O); - var boundFunction = bind(callbackfn, that); - var length = lengthOfArrayLike(self); - var index = 0; - var create = specificCreate || arraySpeciesCreate; - var target = IS_MAP ? create($this, length) : IS_FILTER || IS_FILTER_REJECT ? create($this, 0) : undefined; - var value, result; - for (;length > index; index++) if (NO_HOLES || index in self) { - value = self[index]; - result = boundFunction(value, index, O); - if (TYPE) { - if (IS_MAP) target[index] = result; // map - else if (result) switch (TYPE) { - case 3: return true; // some - case 5: return value; // find - case 6: return index; // findIndex - case 2: push(target, value); // filter - } else switch (TYPE) { - case 4: return false; // every - case 7: push(target, value); // filterReject - } - } - } - return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target; - }; -}; - -module.exports = { - // `Array.prototype.forEach` method - // https://tc39.es/ecma262/#sec-array.prototype.foreach - forEach: createMethod(0), - // `Array.prototype.map` method - // https://tc39.es/ecma262/#sec-array.prototype.map - map: createMethod(1), - // `Array.prototype.filter` method - // https://tc39.es/ecma262/#sec-array.prototype.filter - filter: createMethod(2), - // `Array.prototype.some` method - // https://tc39.es/ecma262/#sec-array.prototype.some - some: createMethod(3), - // `Array.prototype.every` method - // https://tc39.es/ecma262/#sec-array.prototype.every - every: createMethod(4), - // `Array.prototype.find` method - // https://tc39.es/ecma262/#sec-array.prototype.find - find: createMethod(5), - // `Array.prototype.findIndex` method - // https://tc39.es/ecma262/#sec-array.prototype.findIndex - findIndex: createMethod(6), - // `Array.prototype.filterReject` method - // https://github.com/tc39/proposal-array-filtering - filterReject: createMethod(7) -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/array-slice.js": -/*!***********************************************************!*\ - !*** ../../node_modules/core-js/internals/array-slice.js ***! - \***********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); - -module.exports = uncurryThis([].slice); - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/array-species-constructor.js": -/*!*************************************************************************!*\ - !*** ../../node_modules/core-js/internals/array-species-constructor.js ***! - \*************************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); -var isArray = __webpack_require__(/*! ../internals/is-array */ "../../node_modules/core-js/internals/is-array.js"); -var isConstructor = __webpack_require__(/*! ../internals/is-constructor */ "../../node_modules/core-js/internals/is-constructor.js"); -var isObject = __webpack_require__(/*! ../internals/is-object */ "../../node_modules/core-js/internals/is-object.js"); -var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../../node_modules/core-js/internals/well-known-symbol.js"); - -var SPECIES = wellKnownSymbol('species'); -var Array = global.Array; - -// a part of `ArraySpeciesCreate` abstract operation -// https://tc39.es/ecma262/#sec-arrayspeciescreate -module.exports = function (originalArray) { - var C; - if (isArray(originalArray)) { - C = originalArray.constructor; - // cross-realm fallback - if (isConstructor(C) && (C === Array || isArray(C.prototype))) C = undefined; - else if (isObject(C)) { - C = C[SPECIES]; - if (C === null) C = undefined; - } - } return C === undefined ? Array : C; -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/array-species-create.js": -/*!********************************************************************!*\ - !*** ../../node_modules/core-js/internals/array-species-create.js ***! - \********************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var arraySpeciesConstructor = __webpack_require__(/*! ../internals/array-species-constructor */ "../../node_modules/core-js/internals/array-species-constructor.js"); - -// `ArraySpeciesCreate` abstract operation -// https://tc39.es/ecma262/#sec-arrayspeciescreate -module.exports = function (originalArray, length) { - return new (arraySpeciesConstructor(originalArray))(length === 0 ? 0 : length); -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/call-with-safe-iteration-closing.js": -/*!********************************************************************************!*\ - !*** ../../node_modules/core-js/internals/call-with-safe-iteration-closing.js ***! - \********************************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var anObject = __webpack_require__(/*! ../internals/an-object */ "../../node_modules/core-js/internals/an-object.js"); -var iteratorClose = __webpack_require__(/*! ../internals/iterator-close */ "../../node_modules/core-js/internals/iterator-close.js"); - -// call something on iterator step with safe closing on error -module.exports = function (iterator, fn, value, ENTRIES) { - try { - return ENTRIES ? fn(anObject(value)[0], value[1]) : fn(value); - } catch (error) { - iteratorClose(iterator, 'throw', error); - } -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/check-correctness-of-iteration.js": -/*!******************************************************************************!*\ - !*** ../../node_modules/core-js/internals/check-correctness-of-iteration.js ***! - \******************************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../../node_modules/core-js/internals/well-known-symbol.js"); - -var ITERATOR = wellKnownSymbol('iterator'); -var SAFE_CLOSING = false; - -try { - var called = 0; - var iteratorWithReturn = { - next: function () { - return { done: !!called++ }; - }, - 'return': function () { - SAFE_CLOSING = true; - } - }; - iteratorWithReturn[ITERATOR] = function () { - return this; - }; - // eslint-disable-next-line es/no-array-from, no-throw-literal -- required for testing - Array.from(iteratorWithReturn, function () { throw 2; }); -} catch (error) { /* empty */ } - -module.exports = function (exec, SKIP_CLOSING) { - if (!SKIP_CLOSING && !SAFE_CLOSING) return false; - var ITERATION_SUPPORT = false; - try { - var object = {}; - object[ITERATOR] = function () { - return { - next: function () { - return { done: ITERATION_SUPPORT = true }; - } - }; - }; - exec(object); - } catch (error) { /* empty */ } - return ITERATION_SUPPORT; -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/classof-raw.js": -/*!***********************************************************!*\ - !*** ../../node_modules/core-js/internals/classof-raw.js ***! - \***********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); - -var toString = uncurryThis({}.toString); -var stringSlice = uncurryThis(''.slice); - -module.exports = function (it) { - return stringSlice(toString(it), 8, -1); -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/classof.js": -/*!*******************************************************!*\ - !*** ../../node_modules/core-js/internals/classof.js ***! - \*******************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); -var TO_STRING_TAG_SUPPORT = __webpack_require__(/*! ../internals/to-string-tag-support */ "../../node_modules/core-js/internals/to-string-tag-support.js"); -var isCallable = __webpack_require__(/*! ../internals/is-callable */ "../../node_modules/core-js/internals/is-callable.js"); -var classofRaw = __webpack_require__(/*! ../internals/classof-raw */ "../../node_modules/core-js/internals/classof-raw.js"); -var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../../node_modules/core-js/internals/well-known-symbol.js"); - -var TO_STRING_TAG = wellKnownSymbol('toStringTag'); -var Object = global.Object; - -// ES3 wrong here -var CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) == 'Arguments'; - -// fallback for IE11 Script Access Denied error -var tryGet = function (it, key) { - try { - return it[key]; - } catch (error) { /* empty */ } -}; - -// getting tag from ES6+ `Object.prototype.toString` -module.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) { - var O, tag, result; - return it === undefined ? 'Undefined' : it === null ? 'Null' - // @@toStringTag case - : typeof (tag = tryGet(O = Object(it), TO_STRING_TAG)) == 'string' ? tag - // builtinTag case - : CORRECT_ARGUMENTS ? classofRaw(O) - // ES3 arguments fallback - : (result = classofRaw(O)) == 'Object' && isCallable(O.callee) ? 'Arguments' : result; -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/clear-error-stack.js": -/*!*****************************************************************!*\ - !*** ../../node_modules/core-js/internals/clear-error-stack.js ***! - \*****************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); -var arraySlice = __webpack_require__(/*! ../internals/array-slice */ "../../node_modules/core-js/internals/array-slice.js"); - -var replace = uncurryThis(''.replace); -var split = uncurryThis(''.split); -var join = uncurryThis([].join); - -var TEST = (function (arg) { return String(Error(arg).stack); })('zxcasd'); -var V8_OR_CHAKRA_STACK_ENTRY = /\n\s*at [^:]*:[^\n]*/; -var IS_V8_OR_CHAKRA_STACK = V8_OR_CHAKRA_STACK_ENTRY.test(TEST); -var IS_FIREFOX_OR_SAFARI_STACK = /@[^\n]*\n/.test(TEST) && !/zxcasd/.test(TEST); - -module.exports = function (stack, dropEntries) { - if (typeof stack != 'string') return stack; - if (IS_V8_OR_CHAKRA_STACK) { - while (dropEntries--) stack = replace(stack, V8_OR_CHAKRA_STACK_ENTRY, ''); - } else if (IS_FIREFOX_OR_SAFARI_STACK) { - return join(arraySlice(split(stack, '\n'), dropEntries), '\n'); - } return stack; -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/collection-strong.js": -/*!*****************************************************************!*\ - !*** ../../node_modules/core-js/internals/collection-strong.js ***! - \*****************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - -var defineProperty = (__webpack_require__(/*! ../internals/object-define-property */ "../../node_modules/core-js/internals/object-define-property.js").f); -var create = __webpack_require__(/*! ../internals/object-create */ "../../node_modules/core-js/internals/object-create.js"); -var redefineAll = __webpack_require__(/*! ../internals/redefine-all */ "../../node_modules/core-js/internals/redefine-all.js"); -var bind = __webpack_require__(/*! ../internals/function-bind-context */ "../../node_modules/core-js/internals/function-bind-context.js"); -var anInstance = __webpack_require__(/*! ../internals/an-instance */ "../../node_modules/core-js/internals/an-instance.js"); -var iterate = __webpack_require__(/*! ../internals/iterate */ "../../node_modules/core-js/internals/iterate.js"); -var defineIterator = __webpack_require__(/*! ../internals/define-iterator */ "../../node_modules/core-js/internals/define-iterator.js"); -var setSpecies = __webpack_require__(/*! ../internals/set-species */ "../../node_modules/core-js/internals/set-species.js"); -var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "../../node_modules/core-js/internals/descriptors.js"); -var fastKey = (__webpack_require__(/*! ../internals/internal-metadata */ "../../node_modules/core-js/internals/internal-metadata.js").fastKey); -var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "../../node_modules/core-js/internals/internal-state.js"); - -var setInternalState = InternalStateModule.set; -var internalStateGetterFor = InternalStateModule.getterFor; - -module.exports = { - getConstructor: function (wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER) { - var Constructor = wrapper(function (that, iterable) { - anInstance(that, Prototype); - setInternalState(that, { - type: CONSTRUCTOR_NAME, - index: create(null), - first: undefined, - last: undefined, - size: 0 - }); - if (!DESCRIPTORS) that.size = 0; - if (iterable != undefined) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP }); - }); - - var Prototype = Constructor.prototype; - - var getInternalState = internalStateGetterFor(CONSTRUCTOR_NAME); - - var define = function (that, key, value) { - var state = getInternalState(that); - var entry = getEntry(that, key); - var previous, index; - // change existing entry - if (entry) { - entry.value = value; - // create new entry - } else { - state.last = entry = { - index: index = fastKey(key, true), - key: key, - value: value, - previous: previous = state.last, - next: undefined, - removed: false - }; - if (!state.first) state.first = entry; - if (previous) previous.next = entry; - if (DESCRIPTORS) state.size++; - else that.size++; - // add to index - if (index !== 'F') state.index[index] = entry; - } return that; - }; - - var getEntry = function (that, key) { - var state = getInternalState(that); - // fast case - var index = fastKey(key); - var entry; - if (index !== 'F') return state.index[index]; - // frozen object case - for (entry = state.first; entry; entry = entry.next) { - if (entry.key == key) return entry; - } - }; - - redefineAll(Prototype, { - // `{ Map, Set }.prototype.clear()` methods - // https://tc39.es/ecma262/#sec-map.prototype.clear - // https://tc39.es/ecma262/#sec-set.prototype.clear - clear: function clear() { - var that = this; - var state = getInternalState(that); - var data = state.index; - var entry = state.first; - while (entry) { - entry.removed = true; - if (entry.previous) entry.previous = entry.previous.next = undefined; - delete data[entry.index]; - entry = entry.next; - } - state.first = state.last = undefined; - if (DESCRIPTORS) state.size = 0; - else that.size = 0; - }, - // `{ Map, Set }.prototype.delete(key)` methods - // https://tc39.es/ecma262/#sec-map.prototype.delete - // https://tc39.es/ecma262/#sec-set.prototype.delete - 'delete': function (key) { - var that = this; - var state = getInternalState(that); - var entry = getEntry(that, key); - if (entry) { - var next = entry.next; - var prev = entry.previous; - delete state.index[entry.index]; - entry.removed = true; - if (prev) prev.next = next; - if (next) next.previous = prev; - if (state.first == entry) state.first = next; - if (state.last == entry) state.last = prev; - if (DESCRIPTORS) state.size--; - else that.size--; - } return !!entry; - }, - // `{ Map, Set }.prototype.forEach(callbackfn, thisArg = undefined)` methods - // https://tc39.es/ecma262/#sec-map.prototype.foreach - // https://tc39.es/ecma262/#sec-set.prototype.foreach - forEach: function forEach(callbackfn /* , that = undefined */) { - var state = getInternalState(this); - var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined); - var entry; - while (entry = entry ? entry.next : state.first) { - boundFunction(entry.value, entry.key, this); - // revert to the last existing entry - while (entry && entry.removed) entry = entry.previous; - } - }, - // `{ Map, Set}.prototype.has(key)` methods - // https://tc39.es/ecma262/#sec-map.prototype.has - // https://tc39.es/ecma262/#sec-set.prototype.has - has: function has(key) { - return !!getEntry(this, key); - } - }); - - redefineAll(Prototype, IS_MAP ? { - // `Map.prototype.get(key)` method - // https://tc39.es/ecma262/#sec-map.prototype.get - get: function get(key) { - var entry = getEntry(this, key); - return entry && entry.value; - }, - // `Map.prototype.set(key, value)` method - // https://tc39.es/ecma262/#sec-map.prototype.set - set: function set(key, value) { - return define(this, key === 0 ? 0 : key, value); - } - } : { - // `Set.prototype.add(value)` method - // https://tc39.es/ecma262/#sec-set.prototype.add - add: function add(value) { - return define(this, value = value === 0 ? 0 : value, value); - } - }); - if (DESCRIPTORS) defineProperty(Prototype, 'size', { - get: function () { - return getInternalState(this).size; - } - }); - return Constructor; - }, - setStrong: function (Constructor, CONSTRUCTOR_NAME, IS_MAP) { - var ITERATOR_NAME = CONSTRUCTOR_NAME + ' Iterator'; - var getInternalCollectionState = internalStateGetterFor(CONSTRUCTOR_NAME); - var getInternalIteratorState = internalStateGetterFor(ITERATOR_NAME); - // `{ Map, Set }.prototype.{ keys, values, entries, @@iterator }()` methods - // https://tc39.es/ecma262/#sec-map.prototype.entries - // https://tc39.es/ecma262/#sec-map.prototype.keys - // https://tc39.es/ecma262/#sec-map.prototype.values - // https://tc39.es/ecma262/#sec-map.prototype-@@iterator - // https://tc39.es/ecma262/#sec-set.prototype.entries - // https://tc39.es/ecma262/#sec-set.prototype.keys - // https://tc39.es/ecma262/#sec-set.prototype.values - // https://tc39.es/ecma262/#sec-set.prototype-@@iterator - defineIterator(Constructor, CONSTRUCTOR_NAME, function (iterated, kind) { - setInternalState(this, { - type: ITERATOR_NAME, - target: iterated, - state: getInternalCollectionState(iterated), - kind: kind, - last: undefined - }); - }, function () { - var state = getInternalIteratorState(this); - var kind = state.kind; - var entry = state.last; - // revert to the last existing entry - while (entry && entry.removed) entry = entry.previous; - // get next entry - if (!state.target || !(state.last = entry = entry ? entry.next : state.state.first)) { - // or finish the iteration - state.target = undefined; - return { value: undefined, done: true }; - } - // return step by kind - if (kind == 'keys') return { value: entry.key, done: false }; - if (kind == 'values') return { value: entry.value, done: false }; - return { value: [entry.key, entry.value], done: false }; - }, IS_MAP ? 'entries' : 'values', !IS_MAP, true); - - // `{ Map, Set }.prototype[@@species]` accessors - // https://tc39.es/ecma262/#sec-get-map-@@species - // https://tc39.es/ecma262/#sec-get-set-@@species - setSpecies(CONSTRUCTOR_NAME); - } -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/collection.js": -/*!**********************************************************!*\ - !*** ../../node_modules/core-js/internals/collection.js ***! - \**********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - -var $ = __webpack_require__(/*! ../internals/export */ "../../node_modules/core-js/internals/export.js"); -var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); -var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); -var isForced = __webpack_require__(/*! ../internals/is-forced */ "../../node_modules/core-js/internals/is-forced.js"); -var redefine = __webpack_require__(/*! ../internals/redefine */ "../../node_modules/core-js/internals/redefine.js"); -var InternalMetadataModule = __webpack_require__(/*! ../internals/internal-metadata */ "../../node_modules/core-js/internals/internal-metadata.js"); -var iterate = __webpack_require__(/*! ../internals/iterate */ "../../node_modules/core-js/internals/iterate.js"); -var anInstance = __webpack_require__(/*! ../internals/an-instance */ "../../node_modules/core-js/internals/an-instance.js"); -var isCallable = __webpack_require__(/*! ../internals/is-callable */ "../../node_modules/core-js/internals/is-callable.js"); -var isObject = __webpack_require__(/*! ../internals/is-object */ "../../node_modules/core-js/internals/is-object.js"); -var fails = __webpack_require__(/*! ../internals/fails */ "../../node_modules/core-js/internals/fails.js"); -var checkCorrectnessOfIteration = __webpack_require__(/*! ../internals/check-correctness-of-iteration */ "../../node_modules/core-js/internals/check-correctness-of-iteration.js"); -var setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ "../../node_modules/core-js/internals/set-to-string-tag.js"); -var inheritIfRequired = __webpack_require__(/*! ../internals/inherit-if-required */ "../../node_modules/core-js/internals/inherit-if-required.js"); - -module.exports = function (CONSTRUCTOR_NAME, wrapper, common) { - var IS_MAP = CONSTRUCTOR_NAME.indexOf('Map') !== -1; - var IS_WEAK = CONSTRUCTOR_NAME.indexOf('Weak') !== -1; - var ADDER = IS_MAP ? 'set' : 'add'; - var NativeConstructor = global[CONSTRUCTOR_NAME]; - var NativePrototype = NativeConstructor && NativeConstructor.prototype; - var Constructor = NativeConstructor; - var exported = {}; - - var fixMethod = function (KEY) { - var uncurriedNativeMethod = uncurryThis(NativePrototype[KEY]); - redefine(NativePrototype, KEY, - KEY == 'add' ? function add(value) { - uncurriedNativeMethod(this, value === 0 ? 0 : value); - return this; - } : KEY == 'delete' ? function (key) { - return IS_WEAK && !isObject(key) ? false : uncurriedNativeMethod(this, key === 0 ? 0 : key); - } : KEY == 'get' ? function get(key) { - return IS_WEAK && !isObject(key) ? undefined : uncurriedNativeMethod(this, key === 0 ? 0 : key); - } : KEY == 'has' ? function has(key) { - return IS_WEAK && !isObject(key) ? false : uncurriedNativeMethod(this, key === 0 ? 0 : key); - } : function set(key, value) { - uncurriedNativeMethod(this, key === 0 ? 0 : key, value); - return this; - } - ); - }; - - var REPLACE = isForced( - CONSTRUCTOR_NAME, - !isCallable(NativeConstructor) || !(IS_WEAK || NativePrototype.forEach && !fails(function () { - new NativeConstructor().entries().next(); - })) - ); - - if (REPLACE) { - // create collection constructor - Constructor = common.getConstructor(wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER); - InternalMetadataModule.enable(); - } else if (isForced(CONSTRUCTOR_NAME, true)) { - var instance = new Constructor(); - // early implementations not supports chaining - var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance; - // V8 ~ Chromium 40- weak-collections throws on primitives, but should return false - var THROWS_ON_PRIMITIVES = fails(function () { instance.has(1); }); - // most early implementations doesn't supports iterables, most modern - not close it correctly - // eslint-disable-next-line no-new -- required for testing - var ACCEPT_ITERABLES = checkCorrectnessOfIteration(function (iterable) { new NativeConstructor(iterable); }); - // for early implementations -0 and +0 not the same - var BUGGY_ZERO = !IS_WEAK && fails(function () { - // V8 ~ Chromium 42- fails only with 5+ elements - var $instance = new NativeConstructor(); - var index = 5; - while (index--) $instance[ADDER](index, index); - return !$instance.has(-0); - }); - - if (!ACCEPT_ITERABLES) { - Constructor = wrapper(function (dummy, iterable) { - anInstance(dummy, NativePrototype); - var that = inheritIfRequired(new NativeConstructor(), dummy, Constructor); - if (iterable != undefined) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP }); - return that; - }); - Constructor.prototype = NativePrototype; - NativePrototype.constructor = Constructor; - } - - if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) { - fixMethod('delete'); - fixMethod('has'); - IS_MAP && fixMethod('get'); - } - - if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER); - - // weak collections should not contains .clear method - if (IS_WEAK && NativePrototype.clear) delete NativePrototype.clear; - } - - exported[CONSTRUCTOR_NAME] = Constructor; - $({ global: true, forced: Constructor != NativeConstructor }, exported); - - setToStringTag(Constructor, CONSTRUCTOR_NAME); - - if (!IS_WEAK) common.setStrong(Constructor, CONSTRUCTOR_NAME, IS_MAP); - - return Constructor; -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/copy-constructor-properties.js": -/*!***************************************************************************!*\ - !*** ../../node_modules/core-js/internals/copy-constructor-properties.js ***! - \***************************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "../../node_modules/core-js/internals/has-own-property.js"); -var ownKeys = __webpack_require__(/*! ../internals/own-keys */ "../../node_modules/core-js/internals/own-keys.js"); -var getOwnPropertyDescriptorModule = __webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "../../node_modules/core-js/internals/object-get-own-property-descriptor.js"); -var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "../../node_modules/core-js/internals/object-define-property.js"); - -module.exports = function (target, source) { - var keys = ownKeys(source); - var defineProperty = definePropertyModule.f; - var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f; - for (var i = 0; i < keys.length; i++) { - var key = keys[i]; - if (!hasOwn(target, key)) defineProperty(target, key, getOwnPropertyDescriptor(source, key)); - } -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/correct-prototype-getter.js": -/*!************************************************************************!*\ - !*** ../../node_modules/core-js/internals/correct-prototype-getter.js ***! - \************************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var fails = __webpack_require__(/*! ../internals/fails */ "../../node_modules/core-js/internals/fails.js"); - -module.exports = !fails(function () { - function F() { /* empty */ } - F.prototype.constructor = null; - // eslint-disable-next-line es/no-object-getprototypeof -- required for testing - return Object.getPrototypeOf(new F()) !== F.prototype; -}); - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/create-iterator-constructor.js": -/*!***************************************************************************!*\ - !*** ../../node_modules/core-js/internals/create-iterator-constructor.js ***! - \***************************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - -var IteratorPrototype = (__webpack_require__(/*! ../internals/iterators-core */ "../../node_modules/core-js/internals/iterators-core.js").IteratorPrototype); -var create = __webpack_require__(/*! ../internals/object-create */ "../../node_modules/core-js/internals/object-create.js"); -var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "../../node_modules/core-js/internals/create-property-descriptor.js"); -var setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ "../../node_modules/core-js/internals/set-to-string-tag.js"); -var Iterators = __webpack_require__(/*! ../internals/iterators */ "../../node_modules/core-js/internals/iterators.js"); - -var returnThis = function () { return this; }; - -module.exports = function (IteratorConstructor, NAME, next) { - var TO_STRING_TAG = NAME + ' Iterator'; - IteratorConstructor.prototype = create(IteratorPrototype, { next: createPropertyDescriptor(1, next) }); - setToStringTag(IteratorConstructor, TO_STRING_TAG, false, true); - Iterators[TO_STRING_TAG] = returnThis; - return IteratorConstructor; -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/create-non-enumerable-property.js": -/*!******************************************************************************!*\ - !*** ../../node_modules/core-js/internals/create-non-enumerable-property.js ***! - \******************************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "../../node_modules/core-js/internals/descriptors.js"); -var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "../../node_modules/core-js/internals/object-define-property.js"); -var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "../../node_modules/core-js/internals/create-property-descriptor.js"); - -module.exports = DESCRIPTORS ? function (object, key, value) { - return definePropertyModule.f(object, key, createPropertyDescriptor(1, value)); -} : function (object, key, value) { - object[key] = value; - return object; -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/create-property-descriptor.js": -/*!**************************************************************************!*\ - !*** ../../node_modules/core-js/internals/create-property-descriptor.js ***! - \**************************************************************************/ -/***/ ((module) => { - -module.exports = function (bitmap, value) { - return { - enumerable: !(bitmap & 1), - configurable: !(bitmap & 2), - writable: !(bitmap & 4), - value: value - }; -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/create-property.js": -/*!***************************************************************!*\ - !*** ../../node_modules/core-js/internals/create-property.js ***! - \***************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - -var toPropertyKey = __webpack_require__(/*! ../internals/to-property-key */ "../../node_modules/core-js/internals/to-property-key.js"); -var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "../../node_modules/core-js/internals/object-define-property.js"); -var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "../../node_modules/core-js/internals/create-property-descriptor.js"); - -module.exports = function (object, key, value) { - var propertyKey = toPropertyKey(key); - if (propertyKey in object) definePropertyModule.f(object, propertyKey, createPropertyDescriptor(0, value)); - else object[propertyKey] = value; -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/define-iterator.js": -/*!***************************************************************!*\ - !*** ../../node_modules/core-js/internals/define-iterator.js ***! - \***************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - -var $ = __webpack_require__(/*! ../internals/export */ "../../node_modules/core-js/internals/export.js"); -var call = __webpack_require__(/*! ../internals/function-call */ "../../node_modules/core-js/internals/function-call.js"); -var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "../../node_modules/core-js/internals/is-pure.js"); -var FunctionName = __webpack_require__(/*! ../internals/function-name */ "../../node_modules/core-js/internals/function-name.js"); -var isCallable = __webpack_require__(/*! ../internals/is-callable */ "../../node_modules/core-js/internals/is-callable.js"); -var createIteratorConstructor = __webpack_require__(/*! ../internals/create-iterator-constructor */ "../../node_modules/core-js/internals/create-iterator-constructor.js"); -var getPrototypeOf = __webpack_require__(/*! ../internals/object-get-prototype-of */ "../../node_modules/core-js/internals/object-get-prototype-of.js"); -var setPrototypeOf = __webpack_require__(/*! ../internals/object-set-prototype-of */ "../../node_modules/core-js/internals/object-set-prototype-of.js"); -var setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ "../../node_modules/core-js/internals/set-to-string-tag.js"); -var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "../../node_modules/core-js/internals/create-non-enumerable-property.js"); -var redefine = __webpack_require__(/*! ../internals/redefine */ "../../node_modules/core-js/internals/redefine.js"); -var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../../node_modules/core-js/internals/well-known-symbol.js"); -var Iterators = __webpack_require__(/*! ../internals/iterators */ "../../node_modules/core-js/internals/iterators.js"); -var IteratorsCore = __webpack_require__(/*! ../internals/iterators-core */ "../../node_modules/core-js/internals/iterators-core.js"); - -var PROPER_FUNCTION_NAME = FunctionName.PROPER; -var CONFIGURABLE_FUNCTION_NAME = FunctionName.CONFIGURABLE; -var IteratorPrototype = IteratorsCore.IteratorPrototype; -var BUGGY_SAFARI_ITERATORS = IteratorsCore.BUGGY_SAFARI_ITERATORS; -var ITERATOR = wellKnownSymbol('iterator'); -var KEYS = 'keys'; -var VALUES = 'values'; -var ENTRIES = 'entries'; - -var returnThis = function () { return this; }; - -module.exports = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) { - createIteratorConstructor(IteratorConstructor, NAME, next); - - var getIterationMethod = function (KIND) { - if (KIND === DEFAULT && defaultIterator) return defaultIterator; - if (!BUGGY_SAFARI_ITERATORS && KIND in IterablePrototype) return IterablePrototype[KIND]; - switch (KIND) { - case KEYS: return function keys() { return new IteratorConstructor(this, KIND); }; - case VALUES: return function values() { return new IteratorConstructor(this, KIND); }; - case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); }; - } return function () { return new IteratorConstructor(this); }; - }; - - var TO_STRING_TAG = NAME + ' Iterator'; - var INCORRECT_VALUES_NAME = false; - var IterablePrototype = Iterable.prototype; - var nativeIterator = IterablePrototype[ITERATOR] - || IterablePrototype['@@iterator'] - || DEFAULT && IterablePrototype[DEFAULT]; - var defaultIterator = !BUGGY_SAFARI_ITERATORS && nativeIterator || getIterationMethod(DEFAULT); - var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator; - var CurrentIteratorPrototype, methods, KEY; - - // fix native - if (anyNativeIterator) { - CurrentIteratorPrototype = getPrototypeOf(anyNativeIterator.call(new Iterable())); - if (CurrentIteratorPrototype !== Object.prototype && CurrentIteratorPrototype.next) { - if (!IS_PURE && getPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype) { - if (setPrototypeOf) { - setPrototypeOf(CurrentIteratorPrototype, IteratorPrototype); - } else if (!isCallable(CurrentIteratorPrototype[ITERATOR])) { - redefine(CurrentIteratorPrototype, ITERATOR, returnThis); - } - } - // Set @@toStringTag to native iterators - setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true, true); - if (IS_PURE) Iterators[TO_STRING_TAG] = returnThis; - } - } - - // fix Array.prototype.{ values, @@iterator }.name in V8 / FF - if (PROPER_FUNCTION_NAME && DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) { - if (!IS_PURE && CONFIGURABLE_FUNCTION_NAME) { - createNonEnumerableProperty(IterablePrototype, 'name', VALUES); - } else { - INCORRECT_VALUES_NAME = true; - defaultIterator = function values() { return call(nativeIterator, this); }; - } - } - - // export additional methods - if (DEFAULT) { - methods = { - values: getIterationMethod(VALUES), - keys: IS_SET ? defaultIterator : getIterationMethod(KEYS), - entries: getIterationMethod(ENTRIES) - }; - if (FORCED) for (KEY in methods) { - if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) { - redefine(IterablePrototype, KEY, methods[KEY]); - } - } else $({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods); - } - - // define iterator - if ((!IS_PURE || FORCED) && IterablePrototype[ITERATOR] !== defaultIterator) { - redefine(IterablePrototype, ITERATOR, defaultIterator, { name: DEFAULT }); - } - Iterators[NAME] = defaultIterator; - - return methods; -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/descriptors.js": -/*!***********************************************************!*\ - !*** ../../node_modules/core-js/internals/descriptors.js ***! - \***********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var fails = __webpack_require__(/*! ../internals/fails */ "../../node_modules/core-js/internals/fails.js"); - -// Detect IE8's incomplete defineProperty implementation -module.exports = !fails(function () { - // eslint-disable-next-line es/no-object-defineproperty -- required for testing - return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] != 7; -}); - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/document-create-element.js": -/*!***********************************************************************!*\ - !*** ../../node_modules/core-js/internals/document-create-element.js ***! - \***********************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); -var isObject = __webpack_require__(/*! ../internals/is-object */ "../../node_modules/core-js/internals/is-object.js"); - -var document = global.document; -// typeof document.createElement is 'object' in old IE -var EXISTS = isObject(document) && isObject(document.createElement); - -module.exports = function (it) { - return EXISTS ? document.createElement(it) : {}; -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/engine-is-browser.js": -/*!*****************************************************************!*\ - !*** ../../node_modules/core-js/internals/engine-is-browser.js ***! - \*****************************************************************/ -/***/ ((module) => { - -module.exports = typeof window == 'object'; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/engine-is-ios-pebble.js": -/*!********************************************************************!*\ - !*** ../../node_modules/core-js/internals/engine-is-ios-pebble.js ***! - \********************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var userAgent = __webpack_require__(/*! ../internals/engine-user-agent */ "../../node_modules/core-js/internals/engine-user-agent.js"); -var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); - -module.exports = /ipad|iphone|ipod/i.test(userAgent) && global.Pebble !== undefined; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/engine-is-ios.js": -/*!*************************************************************!*\ - !*** ../../node_modules/core-js/internals/engine-is-ios.js ***! - \*************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var userAgent = __webpack_require__(/*! ../internals/engine-user-agent */ "../../node_modules/core-js/internals/engine-user-agent.js"); - -module.exports = /(?:ipad|iphone|ipod).*applewebkit/i.test(userAgent); - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/engine-is-node.js": -/*!**************************************************************!*\ - !*** ../../node_modules/core-js/internals/engine-is-node.js ***! - \**************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var classof = __webpack_require__(/*! ../internals/classof-raw */ "../../node_modules/core-js/internals/classof-raw.js"); -var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); - -module.exports = classof(global.process) == 'process'; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/engine-is-webos-webkit.js": -/*!**********************************************************************!*\ - !*** ../../node_modules/core-js/internals/engine-is-webos-webkit.js ***! - \**********************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var userAgent = __webpack_require__(/*! ../internals/engine-user-agent */ "../../node_modules/core-js/internals/engine-user-agent.js"); - -module.exports = /web0s(?!.*chrome)/i.test(userAgent); - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/engine-user-agent.js": -/*!*****************************************************************!*\ - !*** ../../node_modules/core-js/internals/engine-user-agent.js ***! - \*****************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "../../node_modules/core-js/internals/get-built-in.js"); - -module.exports = getBuiltIn('navigator', 'userAgent') || ''; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/engine-v8-version.js": -/*!*****************************************************************!*\ - !*** ../../node_modules/core-js/internals/engine-v8-version.js ***! - \*****************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); -var userAgent = __webpack_require__(/*! ../internals/engine-user-agent */ "../../node_modules/core-js/internals/engine-user-agent.js"); - -var process = global.process; -var Deno = global.Deno; -var versions = process && process.versions || Deno && Deno.version; -var v8 = versions && versions.v8; -var match, version; - -if (v8) { - match = v8.split('.'); - // in old Chrome, versions of V8 isn't V8 = Chrome / 10 - // but their correct versions are not interesting for us - version = match[0] > 0 && match[0] < 4 ? 1 : +(match[0] + match[1]); -} - -// BrowserFS NodeJS `process` polyfill incorrectly set `.v8` to `0.0` -// so check `userAgent` even if `.v8` exists, but 0 -if (!version && userAgent) { - match = userAgent.match(/Edge\/(\d+)/); - if (!match || match[1] >= 74) { - match = userAgent.match(/Chrome\/(\d+)/); - if (match) version = +match[1]; - } -} - -module.exports = version; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/entry-unbind.js": -/*!************************************************************!*\ - !*** ../../node_modules/core-js/internals/entry-unbind.js ***! - \************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); -var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); - -module.exports = function (CONSTRUCTOR, METHOD) { - return uncurryThis(global[CONSTRUCTOR].prototype[METHOD]); -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/enum-bug-keys.js": -/*!*************************************************************!*\ - !*** ../../node_modules/core-js/internals/enum-bug-keys.js ***! - \*************************************************************/ -/***/ ((module) => { - -// IE8- don't enum bug keys -module.exports = [ - 'constructor', - 'hasOwnProperty', - 'isPrototypeOf', - 'propertyIsEnumerable', - 'toLocaleString', - 'toString', - 'valueOf' -]; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/error-stack-installable.js": -/*!***********************************************************************!*\ - !*** ../../node_modules/core-js/internals/error-stack-installable.js ***! - \***********************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var fails = __webpack_require__(/*! ../internals/fails */ "../../node_modules/core-js/internals/fails.js"); -var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "../../node_modules/core-js/internals/create-property-descriptor.js"); - -module.exports = !fails(function () { - var error = Error('a'); - if (!('stack' in error)) return true; - // eslint-disable-next-line es/no-object-defineproperty -- safe - Object.defineProperty(error, 'stack', createPropertyDescriptor(1, 7)); - return error.stack !== 7; -}); - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/export.js": -/*!******************************************************!*\ - !*** ../../node_modules/core-js/internals/export.js ***! - \******************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); -var getOwnPropertyDescriptor = (__webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "../../node_modules/core-js/internals/object-get-own-property-descriptor.js").f); -var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "../../node_modules/core-js/internals/create-non-enumerable-property.js"); -var redefine = __webpack_require__(/*! ../internals/redefine */ "../../node_modules/core-js/internals/redefine.js"); -var setGlobal = __webpack_require__(/*! ../internals/set-global */ "../../node_modules/core-js/internals/set-global.js"); -var copyConstructorProperties = __webpack_require__(/*! ../internals/copy-constructor-properties */ "../../node_modules/core-js/internals/copy-constructor-properties.js"); -var isForced = __webpack_require__(/*! ../internals/is-forced */ "../../node_modules/core-js/internals/is-forced.js"); - -/* - options.target - name of the target object - options.global - target is the global object - options.stat - export as static methods of target - options.proto - export as prototype methods of target - options.real - real prototype method for the `pure` version - options.forced - export even if the native feature is available - options.bind - bind methods to the target, required for the `pure` version - options.wrap - wrap constructors to preventing global pollution, required for the `pure` version - options.unsafe - use the simple assignment of property instead of delete + defineProperty - options.sham - add a flag to not completely full polyfills - options.enumerable - export as enumerable property - options.noTargetGet - prevent calling a getter on target - options.name - the .name of the function if it does not match the key -*/ -module.exports = function (options, source) { - var TARGET = options.target; - var GLOBAL = options.global; - var STATIC = options.stat; - var FORCED, target, key, targetProperty, sourceProperty, descriptor; - if (GLOBAL) { - target = global; - } else if (STATIC) { - target = global[TARGET] || setGlobal(TARGET, {}); - } else { - target = (global[TARGET] || {}).prototype; - } - if (target) for (key in source) { - sourceProperty = source[key]; - if (options.noTargetGet) { - descriptor = getOwnPropertyDescriptor(target, key); - targetProperty = descriptor && descriptor.value; - } else targetProperty = target[key]; - FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced); - // contained in target - if (!FORCED && targetProperty !== undefined) { - if (typeof sourceProperty == typeof targetProperty) continue; - copyConstructorProperties(sourceProperty, targetProperty); - } - // add a flag to not completely full polyfills - if (options.sham || (targetProperty && targetProperty.sham)) { - createNonEnumerableProperty(sourceProperty, 'sham', true); - } - // extend global - redefine(target, key, sourceProperty, options); - } -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/fails.js": -/*!*****************************************************!*\ - !*** ../../node_modules/core-js/internals/fails.js ***! - \*****************************************************/ -/***/ ((module) => { - -module.exports = function (exec) { - try { - return !!exec(); - } catch (error) { - return true; - } -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/freezing.js": -/*!********************************************************!*\ - !*** ../../node_modules/core-js/internals/freezing.js ***! - \********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var fails = __webpack_require__(/*! ../internals/fails */ "../../node_modules/core-js/internals/fails.js"); - -module.exports = !fails(function () { - // eslint-disable-next-line es/no-object-isextensible, es/no-object-preventextensions -- required for testing - return Object.isExtensible(Object.preventExtensions({})); -}); - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/function-apply.js": -/*!**************************************************************!*\ - !*** ../../node_modules/core-js/internals/function-apply.js ***! - \**************************************************************/ -/***/ ((module) => { - -var FunctionPrototype = Function.prototype; -var apply = FunctionPrototype.apply; -var bind = FunctionPrototype.bind; -var call = FunctionPrototype.call; - -// eslint-disable-next-line es/no-reflect -- safe -module.exports = typeof Reflect == 'object' && Reflect.apply || (bind ? call.bind(apply) : function () { - return call.apply(apply, arguments); -}); - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/function-bind-context.js": -/*!*********************************************************************!*\ - !*** ../../node_modules/core-js/internals/function-bind-context.js ***! - \*********************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); -var aCallable = __webpack_require__(/*! ../internals/a-callable */ "../../node_modules/core-js/internals/a-callable.js"); - -var bind = uncurryThis(uncurryThis.bind); - -// optional / simple context binding -module.exports = function (fn, that) { - aCallable(fn); - return that === undefined ? fn : bind ? bind(fn, that) : function (/* ...args */) { - return fn.apply(that, arguments); - }; -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/function-call.js": -/*!*************************************************************!*\ - !*** ../../node_modules/core-js/internals/function-call.js ***! - \*************************************************************/ -/***/ ((module) => { - -var call = Function.prototype.call; - -module.exports = call.bind ? call.bind(call) : function () { - return call.apply(call, arguments); -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/function-name.js": -/*!*************************************************************!*\ - !*** ../../node_modules/core-js/internals/function-name.js ***! - \*************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "../../node_modules/core-js/internals/descriptors.js"); -var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "../../node_modules/core-js/internals/has-own-property.js"); - -var FunctionPrototype = Function.prototype; -// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe -var getDescriptor = DESCRIPTORS && Object.getOwnPropertyDescriptor; - -var EXISTS = hasOwn(FunctionPrototype, 'name'); -// additional protection from minified / mangled / dropped function names -var PROPER = EXISTS && (function something() { /* empty */ }).name === 'something'; -var CONFIGURABLE = EXISTS && (!DESCRIPTORS || (DESCRIPTORS && getDescriptor(FunctionPrototype, 'name').configurable)); - -module.exports = { - EXISTS: EXISTS, - PROPER: PROPER, - CONFIGURABLE: CONFIGURABLE -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/function-uncurry-this.js": -/*!*********************************************************************!*\ - !*** ../../node_modules/core-js/internals/function-uncurry-this.js ***! - \*********************************************************************/ -/***/ ((module) => { - -var FunctionPrototype = Function.prototype; -var bind = FunctionPrototype.bind; -var call = FunctionPrototype.call; -var callBind = bind && bind.bind(call); - -module.exports = bind ? function (fn) { - return fn && callBind(call, fn); -} : function (fn) { - return fn && function () { - return call.apply(fn, arguments); - }; -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/get-built-in.js": -/*!************************************************************!*\ - !*** ../../node_modules/core-js/internals/get-built-in.js ***! - \************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); -var isCallable = __webpack_require__(/*! ../internals/is-callable */ "../../node_modules/core-js/internals/is-callable.js"); - -var aFunction = function (argument) { - return isCallable(argument) ? argument : undefined; -}; - -module.exports = function (namespace, method) { - return arguments.length < 2 ? aFunction(global[namespace]) : global[namespace] && global[namespace][method]; -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/get-iterator-method.js": -/*!*******************************************************************!*\ - !*** ../../node_modules/core-js/internals/get-iterator-method.js ***! - \*******************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var classof = __webpack_require__(/*! ../internals/classof */ "../../node_modules/core-js/internals/classof.js"); -var getMethod = __webpack_require__(/*! ../internals/get-method */ "../../node_modules/core-js/internals/get-method.js"); -var Iterators = __webpack_require__(/*! ../internals/iterators */ "../../node_modules/core-js/internals/iterators.js"); -var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../../node_modules/core-js/internals/well-known-symbol.js"); - -var ITERATOR = wellKnownSymbol('iterator'); - -module.exports = function (it) { - if (it != undefined) return getMethod(it, ITERATOR) - || getMethod(it, '@@iterator') - || Iterators[classof(it)]; -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/get-iterator.js": -/*!************************************************************!*\ - !*** ../../node_modules/core-js/internals/get-iterator.js ***! - \************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); -var call = __webpack_require__(/*! ../internals/function-call */ "../../node_modules/core-js/internals/function-call.js"); -var aCallable = __webpack_require__(/*! ../internals/a-callable */ "../../node_modules/core-js/internals/a-callable.js"); -var anObject = __webpack_require__(/*! ../internals/an-object */ "../../node_modules/core-js/internals/an-object.js"); -var tryToString = __webpack_require__(/*! ../internals/try-to-string */ "../../node_modules/core-js/internals/try-to-string.js"); -var getIteratorMethod = __webpack_require__(/*! ../internals/get-iterator-method */ "../../node_modules/core-js/internals/get-iterator-method.js"); - -var TypeError = global.TypeError; - -module.exports = function (argument, usingIterator) { - var iteratorMethod = arguments.length < 2 ? getIteratorMethod(argument) : usingIterator; - if (aCallable(iteratorMethod)) return anObject(call(iteratorMethod, argument)); - throw TypeError(tryToString(argument) + ' is not iterable'); -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/get-method.js": -/*!**********************************************************!*\ - !*** ../../node_modules/core-js/internals/get-method.js ***! - \**********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var aCallable = __webpack_require__(/*! ../internals/a-callable */ "../../node_modules/core-js/internals/a-callable.js"); - -// `GetMethod` abstract operation -// https://tc39.es/ecma262/#sec-getmethod -module.exports = function (V, P) { - var func = V[P]; - return func == null ? undefined : aCallable(func); -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/global.js": -/*!******************************************************!*\ - !*** ../../node_modules/core-js/internals/global.js ***! - \******************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var check = function (it) { - return it && it.Math == Math && it; -}; - -// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 -module.exports = - // eslint-disable-next-line es/no-global-this -- safe - check(typeof globalThis == 'object' && globalThis) || - check(typeof window == 'object' && window) || - // eslint-disable-next-line no-restricted-globals -- safe - check(typeof self == 'object' && self) || - check(typeof __webpack_require__.g == 'object' && __webpack_require__.g) || - // eslint-disable-next-line no-new-func -- fallback - (function () { return this; })() || Function('return this')(); - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/has-own-property.js": -/*!****************************************************************!*\ - !*** ../../node_modules/core-js/internals/has-own-property.js ***! - \****************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); -var toObject = __webpack_require__(/*! ../internals/to-object */ "../../node_modules/core-js/internals/to-object.js"); - -var hasOwnProperty = uncurryThis({}.hasOwnProperty); - -// `HasOwnProperty` abstract operation -// https://tc39.es/ecma262/#sec-hasownproperty -module.exports = Object.hasOwn || function hasOwn(it, key) { - return hasOwnProperty(toObject(it), key); -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/hidden-keys.js": -/*!***********************************************************!*\ - !*** ../../node_modules/core-js/internals/hidden-keys.js ***! - \***********************************************************/ -/***/ ((module) => { - -module.exports = {}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/host-report-errors.js": -/*!******************************************************************!*\ - !*** ../../node_modules/core-js/internals/host-report-errors.js ***! - \******************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); - -module.exports = function (a, b) { - var console = global.console; - if (console && console.error) { - arguments.length == 1 ? console.error(a) : console.error(a, b); - } -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/html.js": -/*!****************************************************!*\ - !*** ../../node_modules/core-js/internals/html.js ***! - \****************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "../../node_modules/core-js/internals/get-built-in.js"); - -module.exports = getBuiltIn('document', 'documentElement'); - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/ie8-dom-define.js": -/*!**************************************************************!*\ - !*** ../../node_modules/core-js/internals/ie8-dom-define.js ***! - \**************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "../../node_modules/core-js/internals/descriptors.js"); -var fails = __webpack_require__(/*! ../internals/fails */ "../../node_modules/core-js/internals/fails.js"); -var createElement = __webpack_require__(/*! ../internals/document-create-element */ "../../node_modules/core-js/internals/document-create-element.js"); - -// Thank's IE8 for his funny defineProperty -module.exports = !DESCRIPTORS && !fails(function () { - // eslint-disable-next-line es/no-object-defineproperty -- requied for testing - return Object.defineProperty(createElement('div'), 'a', { - get: function () { return 7; } - }).a != 7; -}); - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/indexed-object.js": -/*!**************************************************************!*\ - !*** ../../node_modules/core-js/internals/indexed-object.js ***! - \**************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); -var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); -var fails = __webpack_require__(/*! ../internals/fails */ "../../node_modules/core-js/internals/fails.js"); -var classof = __webpack_require__(/*! ../internals/classof-raw */ "../../node_modules/core-js/internals/classof-raw.js"); - -var Object = global.Object; -var split = uncurryThis(''.split); - -// fallback for non-array-like ES3 and non-enumerable old V8 strings -module.exports = fails(function () { - // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346 - // eslint-disable-next-line no-prototype-builtins -- safe - return !Object('z').propertyIsEnumerable(0); -}) ? function (it) { - return classof(it) == 'String' ? split(it, '') : Object(it); -} : Object; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/inherit-if-required.js": -/*!*******************************************************************!*\ - !*** ../../node_modules/core-js/internals/inherit-if-required.js ***! - \*******************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var isCallable = __webpack_require__(/*! ../internals/is-callable */ "../../node_modules/core-js/internals/is-callable.js"); -var isObject = __webpack_require__(/*! ../internals/is-object */ "../../node_modules/core-js/internals/is-object.js"); -var setPrototypeOf = __webpack_require__(/*! ../internals/object-set-prototype-of */ "../../node_modules/core-js/internals/object-set-prototype-of.js"); - -// makes subclassing work correct for wrapped built-ins -module.exports = function ($this, dummy, Wrapper) { - var NewTarget, NewTargetPrototype; - if ( - // it can work only with native `setPrototypeOf` - setPrototypeOf && - // we haven't completely correct pre-ES6 way for getting `new.target`, so use this - isCallable(NewTarget = dummy.constructor) && - NewTarget !== Wrapper && - isObject(NewTargetPrototype = NewTarget.prototype) && - NewTargetPrototype !== Wrapper.prototype - ) setPrototypeOf($this, NewTargetPrototype); - return $this; -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/inspect-source.js": -/*!**************************************************************!*\ - !*** ../../node_modules/core-js/internals/inspect-source.js ***! - \**************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); -var isCallable = __webpack_require__(/*! ../internals/is-callable */ "../../node_modules/core-js/internals/is-callable.js"); -var store = __webpack_require__(/*! ../internals/shared-store */ "../../node_modules/core-js/internals/shared-store.js"); - -var functionToString = uncurryThis(Function.toString); - -// this helper broken in `core-js@3.4.1-3.4.4`, so we can't use `shared` helper -if (!isCallable(store.inspectSource)) { - store.inspectSource = function (it) { - return functionToString(it); - }; -} - -module.exports = store.inspectSource; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/install-error-cause.js": -/*!*******************************************************************!*\ - !*** ../../node_modules/core-js/internals/install-error-cause.js ***! - \*******************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var isObject = __webpack_require__(/*! ../internals/is-object */ "../../node_modules/core-js/internals/is-object.js"); -var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "../../node_modules/core-js/internals/create-non-enumerable-property.js"); - -// `InstallErrorCause` abstract operation -// https://tc39.es/proposal-error-cause/#sec-errorobjects-install-error-cause -module.exports = function (O, options) { - if (isObject(options) && 'cause' in options) { - createNonEnumerableProperty(O, 'cause', options.cause); - } -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/internal-metadata.js": -/*!*****************************************************************!*\ - !*** ../../node_modules/core-js/internals/internal-metadata.js ***! - \*****************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var $ = __webpack_require__(/*! ../internals/export */ "../../node_modules/core-js/internals/export.js"); -var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); -var hiddenKeys = __webpack_require__(/*! ../internals/hidden-keys */ "../../node_modules/core-js/internals/hidden-keys.js"); -var isObject = __webpack_require__(/*! ../internals/is-object */ "../../node_modules/core-js/internals/is-object.js"); -var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "../../node_modules/core-js/internals/has-own-property.js"); -var defineProperty = (__webpack_require__(/*! ../internals/object-define-property */ "../../node_modules/core-js/internals/object-define-property.js").f); -var getOwnPropertyNamesModule = __webpack_require__(/*! ../internals/object-get-own-property-names */ "../../node_modules/core-js/internals/object-get-own-property-names.js"); -var getOwnPropertyNamesExternalModule = __webpack_require__(/*! ../internals/object-get-own-property-names-external */ "../../node_modules/core-js/internals/object-get-own-property-names-external.js"); -var uid = __webpack_require__(/*! ../internals/uid */ "../../node_modules/core-js/internals/uid.js"); -var FREEZING = __webpack_require__(/*! ../internals/freezing */ "../../node_modules/core-js/internals/freezing.js"); - -var REQUIRED = false; -var METADATA = uid('meta'); -var id = 0; - -// eslint-disable-next-line es/no-object-isextensible -- safe -var isExtensible = Object.isExtensible || function () { - return true; -}; - -var setMetadata = function (it) { - defineProperty(it, METADATA, { value: { - objectID: 'O' + id++, // object ID - weakData: {} // weak collections IDs - } }); -}; - -var fastKey = function (it, create) { - // return a primitive with prefix - if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it; - if (!hasOwn(it, METADATA)) { - // can't set metadata to uncaught frozen object - if (!isExtensible(it)) return 'F'; - // not necessary to add metadata - if (!create) return 'E'; - // add missing metadata - setMetadata(it); - // return object ID - } return it[METADATA].objectID; -}; - -var getWeakData = function (it, create) { - if (!hasOwn(it, METADATA)) { - // can't set metadata to uncaught frozen object - if (!isExtensible(it)) return true; - // not necessary to add metadata - if (!create) return false; - // add missing metadata - setMetadata(it); - // return the store of weak collections IDs - } return it[METADATA].weakData; -}; - -// add metadata on freeze-family methods calling -var onFreeze = function (it) { - if (FREEZING && REQUIRED && isExtensible(it) && !hasOwn(it, METADATA)) setMetadata(it); - return it; -}; - -var enable = function () { - meta.enable = function () { /* empty */ }; - REQUIRED = true; - var getOwnPropertyNames = getOwnPropertyNamesModule.f; - var splice = uncurryThis([].splice); - var test = {}; - test[METADATA] = 1; - - // prevent exposing of metadata key - if (getOwnPropertyNames(test).length) { - getOwnPropertyNamesModule.f = function (it) { - var result = getOwnPropertyNames(it); - for (var i = 0, length = result.length; i < length; i++) { - if (result[i] === METADATA) { - splice(result, i, 1); - break; - } - } return result; - }; - - $({ target: 'Object', stat: true, forced: true }, { - getOwnPropertyNames: getOwnPropertyNamesExternalModule.f - }); - } -}; - -var meta = module.exports = { - enable: enable, - fastKey: fastKey, - getWeakData: getWeakData, - onFreeze: onFreeze -}; - -hiddenKeys[METADATA] = true; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/internal-state.js": -/*!**************************************************************!*\ - !*** ../../node_modules/core-js/internals/internal-state.js ***! - \**************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var NATIVE_WEAK_MAP = __webpack_require__(/*! ../internals/native-weak-map */ "../../node_modules/core-js/internals/native-weak-map.js"); -var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); -var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); -var isObject = __webpack_require__(/*! ../internals/is-object */ "../../node_modules/core-js/internals/is-object.js"); -var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "../../node_modules/core-js/internals/create-non-enumerable-property.js"); -var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "../../node_modules/core-js/internals/has-own-property.js"); -var shared = __webpack_require__(/*! ../internals/shared-store */ "../../node_modules/core-js/internals/shared-store.js"); -var sharedKey = __webpack_require__(/*! ../internals/shared-key */ "../../node_modules/core-js/internals/shared-key.js"); -var hiddenKeys = __webpack_require__(/*! ../internals/hidden-keys */ "../../node_modules/core-js/internals/hidden-keys.js"); - -var OBJECT_ALREADY_INITIALIZED = 'Object already initialized'; -var TypeError = global.TypeError; -var WeakMap = global.WeakMap; -var set, get, has; - -var enforce = function (it) { - return has(it) ? get(it) : set(it, {}); -}; - -var getterFor = function (TYPE) { - return function (it) { - var state; - if (!isObject(it) || (state = get(it)).type !== TYPE) { - throw TypeError('Incompatible receiver, ' + TYPE + ' required'); - } return state; - }; -}; - -if (NATIVE_WEAK_MAP || shared.state) { - var store = shared.state || (shared.state = new WeakMap()); - var wmget = uncurryThis(store.get); - var wmhas = uncurryThis(store.has); - var wmset = uncurryThis(store.set); - set = function (it, metadata) { - if (wmhas(store, it)) throw new TypeError(OBJECT_ALREADY_INITIALIZED); - metadata.facade = it; - wmset(store, it, metadata); - return metadata; - }; - get = function (it) { - return wmget(store, it) || {}; - }; - has = function (it) { - return wmhas(store, it); - }; -} else { - var STATE = sharedKey('state'); - hiddenKeys[STATE] = true; - set = function (it, metadata) { - if (hasOwn(it, STATE)) throw new TypeError(OBJECT_ALREADY_INITIALIZED); - metadata.facade = it; - createNonEnumerableProperty(it, STATE, metadata); - return metadata; - }; - get = function (it) { - return hasOwn(it, STATE) ? it[STATE] : {}; - }; - has = function (it) { - return hasOwn(it, STATE); - }; -} - -module.exports = { - set: set, - get: get, - has: has, - enforce: enforce, - getterFor: getterFor -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/is-array-iterator-method.js": -/*!************************************************************************!*\ - !*** ../../node_modules/core-js/internals/is-array-iterator-method.js ***! - \************************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../../node_modules/core-js/internals/well-known-symbol.js"); -var Iterators = __webpack_require__(/*! ../internals/iterators */ "../../node_modules/core-js/internals/iterators.js"); - -var ITERATOR = wellKnownSymbol('iterator'); -var ArrayPrototype = Array.prototype; - -// check on default Array iterator -module.exports = function (it) { - return it !== undefined && (Iterators.Array === it || ArrayPrototype[ITERATOR] === it); -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/is-array.js": -/*!********************************************************!*\ - !*** ../../node_modules/core-js/internals/is-array.js ***! - \********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var classof = __webpack_require__(/*! ../internals/classof-raw */ "../../node_modules/core-js/internals/classof-raw.js"); - -// `IsArray` abstract operation -// https://tc39.es/ecma262/#sec-isarray -// eslint-disable-next-line es/no-array-isarray -- safe -module.exports = Array.isArray || function isArray(argument) { - return classof(argument) == 'Array'; -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/is-callable.js": -/*!***********************************************************!*\ - !*** ../../node_modules/core-js/internals/is-callable.js ***! - \***********************************************************/ -/***/ ((module) => { - -// `IsCallable` abstract operation -// https://tc39.es/ecma262/#sec-iscallable -module.exports = function (argument) { - return typeof argument == 'function'; -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/is-constructor.js": -/*!**************************************************************!*\ - !*** ../../node_modules/core-js/internals/is-constructor.js ***! - \**************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); -var fails = __webpack_require__(/*! ../internals/fails */ "../../node_modules/core-js/internals/fails.js"); -var isCallable = __webpack_require__(/*! ../internals/is-callable */ "../../node_modules/core-js/internals/is-callable.js"); -var classof = __webpack_require__(/*! ../internals/classof */ "../../node_modules/core-js/internals/classof.js"); -var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "../../node_modules/core-js/internals/get-built-in.js"); -var inspectSource = __webpack_require__(/*! ../internals/inspect-source */ "../../node_modules/core-js/internals/inspect-source.js"); - -var noop = function () { /* empty */ }; -var empty = []; -var construct = getBuiltIn('Reflect', 'construct'); -var constructorRegExp = /^\s*(?:class|function)\b/; -var exec = uncurryThis(constructorRegExp.exec); -var INCORRECT_TO_STRING = !constructorRegExp.exec(noop); - -var isConstructorModern = function (argument) { - if (!isCallable(argument)) return false; - try { - construct(noop, empty, argument); - return true; - } catch (error) { - return false; - } -}; - -var isConstructorLegacy = function (argument) { - if (!isCallable(argument)) return false; - switch (classof(argument)) { - case 'AsyncFunction': - case 'GeneratorFunction': - case 'AsyncGeneratorFunction': return false; - // we can't check .prototype since constructors produced by .bind haven't it - } return INCORRECT_TO_STRING || !!exec(constructorRegExp, inspectSource(argument)); -}; - -// `IsConstructor` abstract operation -// https://tc39.es/ecma262/#sec-isconstructor -module.exports = !construct || fails(function () { - var called; - return isConstructorModern(isConstructorModern.call) - || !isConstructorModern(Object) - || !isConstructorModern(function () { called = true; }) - || called; -}) ? isConstructorLegacy : isConstructorModern; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/is-forced.js": -/*!*********************************************************!*\ - !*** ../../node_modules/core-js/internals/is-forced.js ***! - \*********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var fails = __webpack_require__(/*! ../internals/fails */ "../../node_modules/core-js/internals/fails.js"); -var isCallable = __webpack_require__(/*! ../internals/is-callable */ "../../node_modules/core-js/internals/is-callable.js"); - -var replacement = /#|\.prototype\./; - -var isForced = function (feature, detection) { - var value = data[normalize(feature)]; - return value == POLYFILL ? true - : value == NATIVE ? false - : isCallable(detection) ? fails(detection) - : !!detection; -}; - -var normalize = isForced.normalize = function (string) { - return String(string).replace(replacement, '.').toLowerCase(); -}; - -var data = isForced.data = {}; -var NATIVE = isForced.NATIVE = 'N'; -var POLYFILL = isForced.POLYFILL = 'P'; - -module.exports = isForced; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/is-integral-number.js": -/*!******************************************************************!*\ - !*** ../../node_modules/core-js/internals/is-integral-number.js ***! - \******************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var isObject = __webpack_require__(/*! ../internals/is-object */ "../../node_modules/core-js/internals/is-object.js"); - -var floor = Math.floor; - -// `IsIntegralNumber` abstract operation -// https://tc39.es/ecma262/#sec-isintegralnumber -// eslint-disable-next-line es/no-number-isinteger -- safe -module.exports = Number.isInteger || function isInteger(it) { - return !isObject(it) && isFinite(it) && floor(it) === it; -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/is-object.js": -/*!*********************************************************!*\ - !*** ../../node_modules/core-js/internals/is-object.js ***! - \*********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var isCallable = __webpack_require__(/*! ../internals/is-callable */ "../../node_modules/core-js/internals/is-callable.js"); - -module.exports = function (it) { - return typeof it == 'object' ? it !== null : isCallable(it); -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/is-pure.js": -/*!*******************************************************!*\ - !*** ../../node_modules/core-js/internals/is-pure.js ***! - \*******************************************************/ -/***/ ((module) => { - -module.exports = false; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/is-symbol.js": -/*!*********************************************************!*\ - !*** ../../node_modules/core-js/internals/is-symbol.js ***! - \*********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); -var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "../../node_modules/core-js/internals/get-built-in.js"); -var isCallable = __webpack_require__(/*! ../internals/is-callable */ "../../node_modules/core-js/internals/is-callable.js"); -var isPrototypeOf = __webpack_require__(/*! ../internals/object-is-prototype-of */ "../../node_modules/core-js/internals/object-is-prototype-of.js"); -var USE_SYMBOL_AS_UID = __webpack_require__(/*! ../internals/use-symbol-as-uid */ "../../node_modules/core-js/internals/use-symbol-as-uid.js"); - -var Object = global.Object; - -module.exports = USE_SYMBOL_AS_UID ? function (it) { - return typeof it == 'symbol'; -} : function (it) { - var $Symbol = getBuiltIn('Symbol'); - return isCallable($Symbol) && isPrototypeOf($Symbol.prototype, Object(it)); -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/iterate.js": -/*!*******************************************************!*\ - !*** ../../node_modules/core-js/internals/iterate.js ***! - \*******************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); -var bind = __webpack_require__(/*! ../internals/function-bind-context */ "../../node_modules/core-js/internals/function-bind-context.js"); -var call = __webpack_require__(/*! ../internals/function-call */ "../../node_modules/core-js/internals/function-call.js"); -var anObject = __webpack_require__(/*! ../internals/an-object */ "../../node_modules/core-js/internals/an-object.js"); -var tryToString = __webpack_require__(/*! ../internals/try-to-string */ "../../node_modules/core-js/internals/try-to-string.js"); -var isArrayIteratorMethod = __webpack_require__(/*! ../internals/is-array-iterator-method */ "../../node_modules/core-js/internals/is-array-iterator-method.js"); -var lengthOfArrayLike = __webpack_require__(/*! ../internals/length-of-array-like */ "../../node_modules/core-js/internals/length-of-array-like.js"); -var isPrototypeOf = __webpack_require__(/*! ../internals/object-is-prototype-of */ "../../node_modules/core-js/internals/object-is-prototype-of.js"); -var getIterator = __webpack_require__(/*! ../internals/get-iterator */ "../../node_modules/core-js/internals/get-iterator.js"); -var getIteratorMethod = __webpack_require__(/*! ../internals/get-iterator-method */ "../../node_modules/core-js/internals/get-iterator-method.js"); -var iteratorClose = __webpack_require__(/*! ../internals/iterator-close */ "../../node_modules/core-js/internals/iterator-close.js"); - -var TypeError = global.TypeError; - -var Result = function (stopped, result) { - this.stopped = stopped; - this.result = result; -}; - -var ResultPrototype = Result.prototype; - -module.exports = function (iterable, unboundFunction, options) { - var that = options && options.that; - var AS_ENTRIES = !!(options && options.AS_ENTRIES); - var IS_ITERATOR = !!(options && options.IS_ITERATOR); - var INTERRUPTED = !!(options && options.INTERRUPTED); - var fn = bind(unboundFunction, that); - var iterator, iterFn, index, length, result, next, step; - - var stop = function (condition) { - if (iterator) iteratorClose(iterator, 'normal', condition); - return new Result(true, condition); - }; - - var callFn = function (value) { - if (AS_ENTRIES) { - anObject(value); - return INTERRUPTED ? fn(value[0], value[1], stop) : fn(value[0], value[1]); - } return INTERRUPTED ? fn(value, stop) : fn(value); - }; - - if (IS_ITERATOR) { - iterator = iterable; - } else { - iterFn = getIteratorMethod(iterable); - if (!iterFn) throw TypeError(tryToString(iterable) + ' is not iterable'); - // optimisation for array iterators - if (isArrayIteratorMethod(iterFn)) { - for (index = 0, length = lengthOfArrayLike(iterable); length > index; index++) { - result = callFn(iterable[index]); - if (result && isPrototypeOf(ResultPrototype, result)) return result; - } return new Result(false); - } - iterator = getIterator(iterable, iterFn); - } - - next = iterator.next; - while (!(step = call(next, iterator)).done) { - try { - result = callFn(step.value); - } catch (error) { - iteratorClose(iterator, 'throw', error); - } - if (typeof result == 'object' && result && isPrototypeOf(ResultPrototype, result)) return result; - } return new Result(false); -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/iterator-close.js": -/*!**************************************************************!*\ - !*** ../../node_modules/core-js/internals/iterator-close.js ***! - \**************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var call = __webpack_require__(/*! ../internals/function-call */ "../../node_modules/core-js/internals/function-call.js"); -var anObject = __webpack_require__(/*! ../internals/an-object */ "../../node_modules/core-js/internals/an-object.js"); -var getMethod = __webpack_require__(/*! ../internals/get-method */ "../../node_modules/core-js/internals/get-method.js"); - -module.exports = function (iterator, kind, value) { - var innerResult, innerError; - anObject(iterator); - try { - innerResult = getMethod(iterator, 'return'); - if (!innerResult) { - if (kind === 'throw') throw value; - return value; - } - innerResult = call(innerResult, iterator); - } catch (error) { - innerError = true; - innerResult = error; - } - if (kind === 'throw') throw value; - if (innerError) throw innerResult; - anObject(innerResult); - return value; -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/iterators-core.js": -/*!**************************************************************!*\ - !*** ../../node_modules/core-js/internals/iterators-core.js ***! - \**************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - -var fails = __webpack_require__(/*! ../internals/fails */ "../../node_modules/core-js/internals/fails.js"); -var isCallable = __webpack_require__(/*! ../internals/is-callable */ "../../node_modules/core-js/internals/is-callable.js"); -var create = __webpack_require__(/*! ../internals/object-create */ "../../node_modules/core-js/internals/object-create.js"); -var getPrototypeOf = __webpack_require__(/*! ../internals/object-get-prototype-of */ "../../node_modules/core-js/internals/object-get-prototype-of.js"); -var redefine = __webpack_require__(/*! ../internals/redefine */ "../../node_modules/core-js/internals/redefine.js"); -var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../../node_modules/core-js/internals/well-known-symbol.js"); -var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "../../node_modules/core-js/internals/is-pure.js"); - -var ITERATOR = wellKnownSymbol('iterator'); -var BUGGY_SAFARI_ITERATORS = false; - -// `%IteratorPrototype%` object -// https://tc39.es/ecma262/#sec-%iteratorprototype%-object -var IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator; - -/* eslint-disable es/no-array-prototype-keys -- safe */ -if ([].keys) { - arrayIterator = [].keys(); - // Safari 8 has buggy iterators w/o `next` - if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true; - else { - PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator)); - if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype; - } -} - -var NEW_ITERATOR_PROTOTYPE = IteratorPrototype == undefined || fails(function () { - var test = {}; - // FF44- legacy iterators case - return IteratorPrototype[ITERATOR].call(test) !== test; -}); - -if (NEW_ITERATOR_PROTOTYPE) IteratorPrototype = {}; -else if (IS_PURE) IteratorPrototype = create(IteratorPrototype); - -// `%IteratorPrototype%[@@iterator]()` method -// https://tc39.es/ecma262/#sec-%iteratorprototype%-@@iterator -if (!isCallable(IteratorPrototype[ITERATOR])) { - redefine(IteratorPrototype, ITERATOR, function () { - return this; - }); -} - -module.exports = { - IteratorPrototype: IteratorPrototype, - BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/iterators.js": -/*!*********************************************************!*\ - !*** ../../node_modules/core-js/internals/iterators.js ***! - \*********************************************************/ -/***/ ((module) => { - -module.exports = {}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/length-of-array-like.js": -/*!********************************************************************!*\ - !*** ../../node_modules/core-js/internals/length-of-array-like.js ***! - \********************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var toLength = __webpack_require__(/*! ../internals/to-length */ "../../node_modules/core-js/internals/to-length.js"); - -// `LengthOfArrayLike` abstract operation -// https://tc39.es/ecma262/#sec-lengthofarraylike -module.exports = function (obj) { - return toLength(obj.length); -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/microtask.js": -/*!*********************************************************!*\ - !*** ../../node_modules/core-js/internals/microtask.js ***! - \*********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); -var bind = __webpack_require__(/*! ../internals/function-bind-context */ "../../node_modules/core-js/internals/function-bind-context.js"); -var getOwnPropertyDescriptor = (__webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "../../node_modules/core-js/internals/object-get-own-property-descriptor.js").f); -var macrotask = (__webpack_require__(/*! ../internals/task */ "../../node_modules/core-js/internals/task.js").set); -var IS_IOS = __webpack_require__(/*! ../internals/engine-is-ios */ "../../node_modules/core-js/internals/engine-is-ios.js"); -var IS_IOS_PEBBLE = __webpack_require__(/*! ../internals/engine-is-ios-pebble */ "../../node_modules/core-js/internals/engine-is-ios-pebble.js"); -var IS_WEBOS_WEBKIT = __webpack_require__(/*! ../internals/engine-is-webos-webkit */ "../../node_modules/core-js/internals/engine-is-webos-webkit.js"); -var IS_NODE = __webpack_require__(/*! ../internals/engine-is-node */ "../../node_modules/core-js/internals/engine-is-node.js"); - -var MutationObserver = global.MutationObserver || global.WebKitMutationObserver; -var document = global.document; -var process = global.process; -var Promise = global.Promise; -// Node.js 11 shows ExperimentalWarning on getting `queueMicrotask` -var queueMicrotaskDescriptor = getOwnPropertyDescriptor(global, 'queueMicrotask'); -var queueMicrotask = queueMicrotaskDescriptor && queueMicrotaskDescriptor.value; - -var flush, head, last, notify, toggle, node, promise, then; - -// modern engines have queueMicrotask method -if (!queueMicrotask) { - flush = function () { - var parent, fn; - if (IS_NODE && (parent = process.domain)) parent.exit(); - while (head) { - fn = head.fn; - head = head.next; - try { - fn(); - } catch (error) { - if (head) notify(); - else last = undefined; - throw error; - } - } last = undefined; - if (parent) parent.enter(); - }; - - // browsers with MutationObserver, except iOS - https://github.com/zloirock/core-js/issues/339 - // also except WebOS Webkit https://github.com/zloirock/core-js/issues/898 - if (!IS_IOS && !IS_NODE && !IS_WEBOS_WEBKIT && MutationObserver && document) { - toggle = true; - node = document.createTextNode(''); - new MutationObserver(flush).observe(node, { characterData: true }); - notify = function () { - node.data = toggle = !toggle; - }; - // environments with maybe non-completely correct, but existent Promise - } else if (!IS_IOS_PEBBLE && Promise && Promise.resolve) { - // Promise.resolve without an argument throws an error in LG WebOS 2 - promise = Promise.resolve(undefined); - // workaround of WebKit ~ iOS Safari 10.1 bug - promise.constructor = Promise; - then = bind(promise.then, promise); - notify = function () { - then(flush); - }; - // Node.js without promises - } else if (IS_NODE) { - notify = function () { - process.nextTick(flush); - }; - // for other environments - macrotask based on: - // - setImmediate - // - MessageChannel - // - window.postMessag - // - onreadystatechange - // - setTimeout - } else { - // strange IE + webpack dev server bug - use .bind(global) - macrotask = bind(macrotask, global); - notify = function () { - macrotask(flush); - }; - } -} - -module.exports = queueMicrotask || function (fn) { - var task = { fn: fn, next: undefined }; - if (last) last.next = task; - if (!head) { - head = task; - notify(); - } last = task; -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/native-promise-constructor.js": -/*!**************************************************************************!*\ - !*** ../../node_modules/core-js/internals/native-promise-constructor.js ***! - \**************************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); - -module.exports = global.Promise; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/native-symbol.js": -/*!*************************************************************!*\ - !*** ../../node_modules/core-js/internals/native-symbol.js ***! - \*************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -/* eslint-disable es/no-symbol -- required for testing */ -var V8_VERSION = __webpack_require__(/*! ../internals/engine-v8-version */ "../../node_modules/core-js/internals/engine-v8-version.js"); -var fails = __webpack_require__(/*! ../internals/fails */ "../../node_modules/core-js/internals/fails.js"); - -// eslint-disable-next-line es/no-object-getownpropertysymbols -- required for testing -module.exports = !!Object.getOwnPropertySymbols && !fails(function () { - var symbol = Symbol(); - // Chrome 38 Symbol has incorrect toString conversion - // `get-own-property-symbols` polyfill symbols converted to object are not Symbol instances - return !String(symbol) || !(Object(symbol) instanceof Symbol) || - // Chrome 38-40 symbols are not inherited from DOM collections prototypes to instances - !Symbol.sham && V8_VERSION && V8_VERSION < 41; -}); - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/native-weak-map.js": -/*!***************************************************************!*\ - !*** ../../node_modules/core-js/internals/native-weak-map.js ***! - \***************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); -var isCallable = __webpack_require__(/*! ../internals/is-callable */ "../../node_modules/core-js/internals/is-callable.js"); -var inspectSource = __webpack_require__(/*! ../internals/inspect-source */ "../../node_modules/core-js/internals/inspect-source.js"); - -var WeakMap = global.WeakMap; - -module.exports = isCallable(WeakMap) && /native code/.test(inspectSource(WeakMap)); - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/new-promise-capability.js": -/*!**********************************************************************!*\ - !*** ../../node_modules/core-js/internals/new-promise-capability.js ***! - \**********************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - -var aCallable = __webpack_require__(/*! ../internals/a-callable */ "../../node_modules/core-js/internals/a-callable.js"); - -var PromiseCapability = function (C) { - var resolve, reject; - this.promise = new C(function ($$resolve, $$reject) { - if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor'); - resolve = $$resolve; - reject = $$reject; - }); - this.resolve = aCallable(resolve); - this.reject = aCallable(reject); -}; - -// `NewPromiseCapability` abstract operation -// https://tc39.es/ecma262/#sec-newpromisecapability -module.exports.f = function (C) { - return new PromiseCapability(C); -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/normalize-string-argument.js": -/*!*************************************************************************!*\ - !*** ../../node_modules/core-js/internals/normalize-string-argument.js ***! - \*************************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var toString = __webpack_require__(/*! ../internals/to-string */ "../../node_modules/core-js/internals/to-string.js"); - -module.exports = function (argument, $default) { - return argument === undefined ? arguments.length < 2 ? '' : $default : toString(argument); -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/number-parse-float.js": -/*!******************************************************************!*\ - !*** ../../node_modules/core-js/internals/number-parse-float.js ***! - \******************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); -var fails = __webpack_require__(/*! ../internals/fails */ "../../node_modules/core-js/internals/fails.js"); -var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); -var toString = __webpack_require__(/*! ../internals/to-string */ "../../node_modules/core-js/internals/to-string.js"); -var trim = (__webpack_require__(/*! ../internals/string-trim */ "../../node_modules/core-js/internals/string-trim.js").trim); -var whitespaces = __webpack_require__(/*! ../internals/whitespaces */ "../../node_modules/core-js/internals/whitespaces.js"); - -var charAt = uncurryThis(''.charAt); -var n$ParseFloat = global.parseFloat; -var Symbol = global.Symbol; -var ITERATOR = Symbol && Symbol.iterator; -var FORCED = 1 / n$ParseFloat(whitespaces + '-0') !== -Infinity - // MS Edge 18- broken with boxed symbols - || (ITERATOR && !fails(function () { n$ParseFloat(Object(ITERATOR)); })); - -// `parseFloat` method -// https://tc39.es/ecma262/#sec-parsefloat-string -module.exports = FORCED ? function parseFloat(string) { - var trimmedString = trim(toString(string)); - var result = n$ParseFloat(trimmedString); - return result === 0 && charAt(trimmedString, 0) == '-' ? -0 : result; -} : n$ParseFloat; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/number-parse-int.js": -/*!****************************************************************!*\ - !*** ../../node_modules/core-js/internals/number-parse-int.js ***! - \****************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); -var fails = __webpack_require__(/*! ../internals/fails */ "../../node_modules/core-js/internals/fails.js"); -var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); -var toString = __webpack_require__(/*! ../internals/to-string */ "../../node_modules/core-js/internals/to-string.js"); -var trim = (__webpack_require__(/*! ../internals/string-trim */ "../../node_modules/core-js/internals/string-trim.js").trim); -var whitespaces = __webpack_require__(/*! ../internals/whitespaces */ "../../node_modules/core-js/internals/whitespaces.js"); - -var $parseInt = global.parseInt; -var Symbol = global.Symbol; -var ITERATOR = Symbol && Symbol.iterator; -var hex = /^[+-]?0x/i; -var exec = uncurryThis(hex.exec); -var FORCED = $parseInt(whitespaces + '08') !== 8 || $parseInt(whitespaces + '0x16') !== 22 - // MS Edge 18- broken with boxed symbols - || (ITERATOR && !fails(function () { $parseInt(Object(ITERATOR)); })); - -// `parseInt` method -// https://tc39.es/ecma262/#sec-parseint-string-radix -module.exports = FORCED ? function parseInt(string, radix) { - var S = trim(toString(string)); - return $parseInt(S, (radix >>> 0) || (exec(hex, S) ? 16 : 10)); -} : $parseInt; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/object-assign.js": -/*!*************************************************************!*\ - !*** ../../node_modules/core-js/internals/object-assign.js ***! - \*************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - -var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "../../node_modules/core-js/internals/descriptors.js"); -var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); -var call = __webpack_require__(/*! ../internals/function-call */ "../../node_modules/core-js/internals/function-call.js"); -var fails = __webpack_require__(/*! ../internals/fails */ "../../node_modules/core-js/internals/fails.js"); -var objectKeys = __webpack_require__(/*! ../internals/object-keys */ "../../node_modules/core-js/internals/object-keys.js"); -var getOwnPropertySymbolsModule = __webpack_require__(/*! ../internals/object-get-own-property-symbols */ "../../node_modules/core-js/internals/object-get-own-property-symbols.js"); -var propertyIsEnumerableModule = __webpack_require__(/*! ../internals/object-property-is-enumerable */ "../../node_modules/core-js/internals/object-property-is-enumerable.js"); -var toObject = __webpack_require__(/*! ../internals/to-object */ "../../node_modules/core-js/internals/to-object.js"); -var IndexedObject = __webpack_require__(/*! ../internals/indexed-object */ "../../node_modules/core-js/internals/indexed-object.js"); - -// eslint-disable-next-line es/no-object-assign -- safe -var $assign = Object.assign; -// eslint-disable-next-line es/no-object-defineproperty -- required for testing -var defineProperty = Object.defineProperty; -var concat = uncurryThis([].concat); - -// `Object.assign` method -// https://tc39.es/ecma262/#sec-object.assign -module.exports = !$assign || fails(function () { - // should have correct order of operations (Edge bug) - if (DESCRIPTORS && $assign({ b: 1 }, $assign(defineProperty({}, 'a', { - enumerable: true, - get: function () { - defineProperty(this, 'b', { - value: 3, - enumerable: false - }); - } - }), { b: 2 })).b !== 1) return true; - // should work with symbols and should have deterministic property order (V8 bug) - var A = {}; - var B = {}; - // eslint-disable-next-line es/no-symbol -- safe - var symbol = Symbol(); - var alphabet = 'abcdefghijklmnopqrst'; - A[symbol] = 7; - alphabet.split('').forEach(function (chr) { B[chr] = chr; }); - return $assign({}, A)[symbol] != 7 || objectKeys($assign({}, B)).join('') != alphabet; -}) ? function assign(target, source) { // eslint-disable-line no-unused-vars -- required for `.length` - var T = toObject(target); - var argumentsLength = arguments.length; - var index = 1; - var getOwnPropertySymbols = getOwnPropertySymbolsModule.f; - var propertyIsEnumerable = propertyIsEnumerableModule.f; - while (argumentsLength > index) { - var S = IndexedObject(arguments[index++]); - var keys = getOwnPropertySymbols ? concat(objectKeys(S), getOwnPropertySymbols(S)) : objectKeys(S); - var length = keys.length; - var j = 0; - var key; - while (length > j) { - key = keys[j++]; - if (!DESCRIPTORS || call(propertyIsEnumerable, S, key)) T[key] = S[key]; - } - } return T; -} : $assign; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/object-create.js": -/*!*************************************************************!*\ - !*** ../../node_modules/core-js/internals/object-create.js ***! - \*************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -/* global ActiveXObject -- old IE, WSH */ -var anObject = __webpack_require__(/*! ../internals/an-object */ "../../node_modules/core-js/internals/an-object.js"); -var defineProperties = __webpack_require__(/*! ../internals/object-define-properties */ "../../node_modules/core-js/internals/object-define-properties.js"); -var enumBugKeys = __webpack_require__(/*! ../internals/enum-bug-keys */ "../../node_modules/core-js/internals/enum-bug-keys.js"); -var hiddenKeys = __webpack_require__(/*! ../internals/hidden-keys */ "../../node_modules/core-js/internals/hidden-keys.js"); -var html = __webpack_require__(/*! ../internals/html */ "../../node_modules/core-js/internals/html.js"); -var documentCreateElement = __webpack_require__(/*! ../internals/document-create-element */ "../../node_modules/core-js/internals/document-create-element.js"); -var sharedKey = __webpack_require__(/*! ../internals/shared-key */ "../../node_modules/core-js/internals/shared-key.js"); - -var GT = '>'; -var LT = '<'; -var PROTOTYPE = 'prototype'; -var SCRIPT = 'script'; -var IE_PROTO = sharedKey('IE_PROTO'); - -var EmptyConstructor = function () { /* empty */ }; - -var scriptTag = function (content) { - return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT; -}; - -// Create object with fake `null` prototype: use ActiveX Object with cleared prototype -var NullProtoObjectViaActiveX = function (activeXDocument) { - activeXDocument.write(scriptTag('')); - activeXDocument.close(); - var temp = activeXDocument.parentWindow.Object; - activeXDocument = null; // avoid memory leak - return temp; -}; - -// Create object with fake `null` prototype: use iframe Object with cleared prototype -var NullProtoObjectViaIFrame = function () { - // Thrash, waste and sodomy: IE GC bug - var iframe = documentCreateElement('iframe'); - var JS = 'java' + SCRIPT + ':'; - var iframeDocument; - iframe.style.display = 'none'; - html.appendChild(iframe); - // https://github.com/zloirock/core-js/issues/475 - iframe.src = String(JS); - iframeDocument = iframe.contentWindow.document; - iframeDocument.open(); - iframeDocument.write(scriptTag('document.F=Object')); - iframeDocument.close(); - return iframeDocument.F; -}; - -// Check for document.domain and active x support -// No need to use active x approach when document.domain is not set -// see https://github.com/es-shims/es5-shim/issues/150 -// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346 -// avoid IE GC bug -var activeXDocument; -var NullProtoObject = function () { - try { - activeXDocument = new ActiveXObject('htmlfile'); - } catch (error) { /* ignore */ } - NullProtoObject = typeof document != 'undefined' - ? document.domain && activeXDocument - ? NullProtoObjectViaActiveX(activeXDocument) // old IE - : NullProtoObjectViaIFrame() - : NullProtoObjectViaActiveX(activeXDocument); // WSH - var length = enumBugKeys.length; - while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]]; - return NullProtoObject(); -}; - -hiddenKeys[IE_PROTO] = true; - -// `Object.create` method -// https://tc39.es/ecma262/#sec-object.create -module.exports = Object.create || function create(O, Properties) { - var result; - if (O !== null) { - EmptyConstructor[PROTOTYPE] = anObject(O); - result = new EmptyConstructor(); - EmptyConstructor[PROTOTYPE] = null; - // add "__proto__" for Object.getPrototypeOf polyfill - result[IE_PROTO] = O; - } else result = NullProtoObject(); - return Properties === undefined ? result : defineProperties(result, Properties); -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/object-define-properties.js": -/*!************************************************************************!*\ - !*** ../../node_modules/core-js/internals/object-define-properties.js ***! - \************************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "../../node_modules/core-js/internals/descriptors.js"); -var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "../../node_modules/core-js/internals/object-define-property.js"); -var anObject = __webpack_require__(/*! ../internals/an-object */ "../../node_modules/core-js/internals/an-object.js"); -var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "../../node_modules/core-js/internals/to-indexed-object.js"); -var objectKeys = __webpack_require__(/*! ../internals/object-keys */ "../../node_modules/core-js/internals/object-keys.js"); - -// `Object.defineProperties` method -// https://tc39.es/ecma262/#sec-object.defineproperties -// eslint-disable-next-line es/no-object-defineproperties -- safe -module.exports = DESCRIPTORS ? Object.defineProperties : function defineProperties(O, Properties) { - anObject(O); - var props = toIndexedObject(Properties); - var keys = objectKeys(Properties); - var length = keys.length; - var index = 0; - var key; - while (length > index) definePropertyModule.f(O, key = keys[index++], props[key]); - return O; -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/object-define-property.js": -/*!**********************************************************************!*\ - !*** ../../node_modules/core-js/internals/object-define-property.js ***! - \**********************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); -var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "../../node_modules/core-js/internals/descriptors.js"); -var IE8_DOM_DEFINE = __webpack_require__(/*! ../internals/ie8-dom-define */ "../../node_modules/core-js/internals/ie8-dom-define.js"); -var anObject = __webpack_require__(/*! ../internals/an-object */ "../../node_modules/core-js/internals/an-object.js"); -var toPropertyKey = __webpack_require__(/*! ../internals/to-property-key */ "../../node_modules/core-js/internals/to-property-key.js"); - -var TypeError = global.TypeError; -// eslint-disable-next-line es/no-object-defineproperty -- safe -var $defineProperty = Object.defineProperty; - -// `Object.defineProperty` method -// https://tc39.es/ecma262/#sec-object.defineproperty -exports.f = DESCRIPTORS ? $defineProperty : function defineProperty(O, P, Attributes) { - anObject(O); - P = toPropertyKey(P); - anObject(Attributes); - if (IE8_DOM_DEFINE) try { - return $defineProperty(O, P, Attributes); - } catch (error) { /* empty */ } - if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported'); - if ('value' in Attributes) O[P] = Attributes.value; - return O; -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/object-get-own-property-descriptor.js": -/*!**********************************************************************************!*\ - !*** ../../node_modules/core-js/internals/object-get-own-property-descriptor.js ***! - \**********************************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "../../node_modules/core-js/internals/descriptors.js"); -var call = __webpack_require__(/*! ../internals/function-call */ "../../node_modules/core-js/internals/function-call.js"); -var propertyIsEnumerableModule = __webpack_require__(/*! ../internals/object-property-is-enumerable */ "../../node_modules/core-js/internals/object-property-is-enumerable.js"); -var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "../../node_modules/core-js/internals/create-property-descriptor.js"); -var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "../../node_modules/core-js/internals/to-indexed-object.js"); -var toPropertyKey = __webpack_require__(/*! ../internals/to-property-key */ "../../node_modules/core-js/internals/to-property-key.js"); -var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "../../node_modules/core-js/internals/has-own-property.js"); -var IE8_DOM_DEFINE = __webpack_require__(/*! ../internals/ie8-dom-define */ "../../node_modules/core-js/internals/ie8-dom-define.js"); - -// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe -var $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; - -// `Object.getOwnPropertyDescriptor` method -// https://tc39.es/ecma262/#sec-object.getownpropertydescriptor -exports.f = DESCRIPTORS ? $getOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) { - O = toIndexedObject(O); - P = toPropertyKey(P); - if (IE8_DOM_DEFINE) try { - return $getOwnPropertyDescriptor(O, P); - } catch (error) { /* empty */ } - if (hasOwn(O, P)) return createPropertyDescriptor(!call(propertyIsEnumerableModule.f, O, P), O[P]); -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/object-get-own-property-names-external.js": -/*!**************************************************************************************!*\ - !*** ../../node_modules/core-js/internals/object-get-own-property-names-external.js ***! - \**************************************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -/* eslint-disable es/no-object-getownpropertynames -- safe */ -var classof = __webpack_require__(/*! ../internals/classof-raw */ "../../node_modules/core-js/internals/classof-raw.js"); -var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "../../node_modules/core-js/internals/to-indexed-object.js"); -var $getOwnPropertyNames = (__webpack_require__(/*! ../internals/object-get-own-property-names */ "../../node_modules/core-js/internals/object-get-own-property-names.js").f); -var arraySlice = __webpack_require__(/*! ../internals/array-slice */ "../../node_modules/core-js/internals/array-slice.js"); - -var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames - ? Object.getOwnPropertyNames(window) : []; - -var getWindowNames = function (it) { - try { - return $getOwnPropertyNames(it); - } catch (error) { - return arraySlice(windowNames); - } -}; - -// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window -module.exports.f = function getOwnPropertyNames(it) { - return windowNames && classof(it) == 'Window' - ? getWindowNames(it) - : $getOwnPropertyNames(toIndexedObject(it)); -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/object-get-own-property-names.js": -/*!*****************************************************************************!*\ - !*** ../../node_modules/core-js/internals/object-get-own-property-names.js ***! - \*****************************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -var internalObjectKeys = __webpack_require__(/*! ../internals/object-keys-internal */ "../../node_modules/core-js/internals/object-keys-internal.js"); -var enumBugKeys = __webpack_require__(/*! ../internals/enum-bug-keys */ "../../node_modules/core-js/internals/enum-bug-keys.js"); - -var hiddenKeys = enumBugKeys.concat('length', 'prototype'); - -// `Object.getOwnPropertyNames` method -// https://tc39.es/ecma262/#sec-object.getownpropertynames -// eslint-disable-next-line es/no-object-getownpropertynames -- safe -exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) { - return internalObjectKeys(O, hiddenKeys); -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/object-get-own-property-symbols.js": -/*!*******************************************************************************!*\ - !*** ../../node_modules/core-js/internals/object-get-own-property-symbols.js ***! - \*******************************************************************************/ -/***/ ((__unused_webpack_module, exports) => { - -// eslint-disable-next-line es/no-object-getownpropertysymbols -- safe -exports.f = Object.getOwnPropertySymbols; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/object-get-prototype-of.js": -/*!***********************************************************************!*\ - !*** ../../node_modules/core-js/internals/object-get-prototype-of.js ***! - \***********************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); -var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "../../node_modules/core-js/internals/has-own-property.js"); -var isCallable = __webpack_require__(/*! ../internals/is-callable */ "../../node_modules/core-js/internals/is-callable.js"); -var toObject = __webpack_require__(/*! ../internals/to-object */ "../../node_modules/core-js/internals/to-object.js"); -var sharedKey = __webpack_require__(/*! ../internals/shared-key */ "../../node_modules/core-js/internals/shared-key.js"); -var CORRECT_PROTOTYPE_GETTER = __webpack_require__(/*! ../internals/correct-prototype-getter */ "../../node_modules/core-js/internals/correct-prototype-getter.js"); - -var IE_PROTO = sharedKey('IE_PROTO'); -var Object = global.Object; -var ObjectPrototype = Object.prototype; - -// `Object.getPrototypeOf` method -// https://tc39.es/ecma262/#sec-object.getprototypeof -module.exports = CORRECT_PROTOTYPE_GETTER ? Object.getPrototypeOf : function (O) { - var object = toObject(O); - if (hasOwn(object, IE_PROTO)) return object[IE_PROTO]; - var constructor = object.constructor; - if (isCallable(constructor) && object instanceof constructor) { - return constructor.prototype; - } return object instanceof Object ? ObjectPrototype : null; -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/object-is-prototype-of.js": -/*!**********************************************************************!*\ - !*** ../../node_modules/core-js/internals/object-is-prototype-of.js ***! - \**********************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); - -module.exports = uncurryThis({}.isPrototypeOf); - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/object-keys-internal.js": -/*!********************************************************************!*\ - !*** ../../node_modules/core-js/internals/object-keys-internal.js ***! - \********************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); -var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "../../node_modules/core-js/internals/has-own-property.js"); -var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "../../node_modules/core-js/internals/to-indexed-object.js"); -var indexOf = (__webpack_require__(/*! ../internals/array-includes */ "../../node_modules/core-js/internals/array-includes.js").indexOf); -var hiddenKeys = __webpack_require__(/*! ../internals/hidden-keys */ "../../node_modules/core-js/internals/hidden-keys.js"); - -var push = uncurryThis([].push); - -module.exports = function (object, names) { - var O = toIndexedObject(object); - var i = 0; - var result = []; - var key; - for (key in O) !hasOwn(hiddenKeys, key) && hasOwn(O, key) && push(result, key); - // Don't enum bug & hidden keys - while (names.length > i) if (hasOwn(O, key = names[i++])) { - ~indexOf(result, key) || push(result, key); - } - return result; -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/object-keys.js": -/*!***********************************************************!*\ - !*** ../../node_modules/core-js/internals/object-keys.js ***! - \***********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var internalObjectKeys = __webpack_require__(/*! ../internals/object-keys-internal */ "../../node_modules/core-js/internals/object-keys-internal.js"); -var enumBugKeys = __webpack_require__(/*! ../internals/enum-bug-keys */ "../../node_modules/core-js/internals/enum-bug-keys.js"); - -// `Object.keys` method -// https://tc39.es/ecma262/#sec-object.keys -// eslint-disable-next-line es/no-object-keys -- safe -module.exports = Object.keys || function keys(O) { - return internalObjectKeys(O, enumBugKeys); -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/object-property-is-enumerable.js": -/*!*****************************************************************************!*\ - !*** ../../node_modules/core-js/internals/object-property-is-enumerable.js ***! - \*****************************************************************************/ -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -var $propertyIsEnumerable = {}.propertyIsEnumerable; -// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe -var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; - -// Nashorn ~ JDK8 bug -var NASHORN_BUG = getOwnPropertyDescriptor && !$propertyIsEnumerable.call({ 1: 2 }, 1); - -// `Object.prototype.propertyIsEnumerable` method implementation -// https://tc39.es/ecma262/#sec-object.prototype.propertyisenumerable -exports.f = NASHORN_BUG ? function propertyIsEnumerable(V) { - var descriptor = getOwnPropertyDescriptor(this, V); - return !!descriptor && descriptor.enumerable; -} : $propertyIsEnumerable; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/object-set-prototype-of.js": -/*!***********************************************************************!*\ - !*** ../../node_modules/core-js/internals/object-set-prototype-of.js ***! - \***********************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -/* eslint-disable no-proto -- safe */ -var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); -var anObject = __webpack_require__(/*! ../internals/an-object */ "../../node_modules/core-js/internals/an-object.js"); -var aPossiblePrototype = __webpack_require__(/*! ../internals/a-possible-prototype */ "../../node_modules/core-js/internals/a-possible-prototype.js"); - -// `Object.setPrototypeOf` method -// https://tc39.es/ecma262/#sec-object.setprototypeof -// Works with __proto__ only. Old v8 can't work with null proto objects. -// eslint-disable-next-line es/no-object-setprototypeof -- safe -module.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () { - var CORRECT_SETTER = false; - var test = {}; - var setter; - try { - // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe - setter = uncurryThis(Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set); - setter(test, []); - CORRECT_SETTER = test instanceof Array; - } catch (error) { /* empty */ } - return function setPrototypeOf(O, proto) { - anObject(O); - aPossiblePrototype(proto); - if (CORRECT_SETTER) setter(O, proto); - else O.__proto__ = proto; - return O; - }; -}() : undefined); - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/object-to-array.js": -/*!***************************************************************!*\ - !*** ../../node_modules/core-js/internals/object-to-array.js ***! - \***************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "../../node_modules/core-js/internals/descriptors.js"); -var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); -var objectKeys = __webpack_require__(/*! ../internals/object-keys */ "../../node_modules/core-js/internals/object-keys.js"); -var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "../../node_modules/core-js/internals/to-indexed-object.js"); -var $propertyIsEnumerable = (__webpack_require__(/*! ../internals/object-property-is-enumerable */ "../../node_modules/core-js/internals/object-property-is-enumerable.js").f); - -var propertyIsEnumerable = uncurryThis($propertyIsEnumerable); -var push = uncurryThis([].push); - -// `Object.{ entries, values }` methods implementation -var createMethod = function (TO_ENTRIES) { - return function (it) { - var O = toIndexedObject(it); - var keys = objectKeys(O); - var length = keys.length; - var i = 0; - var result = []; - var key; - while (length > i) { - key = keys[i++]; - if (!DESCRIPTORS || propertyIsEnumerable(O, key)) { - push(result, TO_ENTRIES ? [key, O[key]] : O[key]); - } - } - return result; - }; -}; - -module.exports = { - // `Object.entries` method - // https://tc39.es/ecma262/#sec-object.entries - entries: createMethod(true), - // `Object.values` method - // https://tc39.es/ecma262/#sec-object.values - values: createMethod(false) -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/object-to-string.js": -/*!****************************************************************!*\ - !*** ../../node_modules/core-js/internals/object-to-string.js ***! - \****************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - -var TO_STRING_TAG_SUPPORT = __webpack_require__(/*! ../internals/to-string-tag-support */ "../../node_modules/core-js/internals/to-string-tag-support.js"); -var classof = __webpack_require__(/*! ../internals/classof */ "../../node_modules/core-js/internals/classof.js"); - -// `Object.prototype.toString` method implementation -// https://tc39.es/ecma262/#sec-object.prototype.tostring -module.exports = TO_STRING_TAG_SUPPORT ? {}.toString : function toString() { - return '[object ' + classof(this) + ']'; -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/ordinary-to-primitive.js": -/*!*********************************************************************!*\ - !*** ../../node_modules/core-js/internals/ordinary-to-primitive.js ***! - \*********************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); -var call = __webpack_require__(/*! ../internals/function-call */ "../../node_modules/core-js/internals/function-call.js"); -var isCallable = __webpack_require__(/*! ../internals/is-callable */ "../../node_modules/core-js/internals/is-callable.js"); -var isObject = __webpack_require__(/*! ../internals/is-object */ "../../node_modules/core-js/internals/is-object.js"); - -var TypeError = global.TypeError; - -// `OrdinaryToPrimitive` abstract operation -// https://tc39.es/ecma262/#sec-ordinarytoprimitive -module.exports = function (input, pref) { - var fn, val; - if (pref === 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val; - if (isCallable(fn = input.valueOf) && !isObject(val = call(fn, input))) return val; - if (pref !== 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val; - throw TypeError("Can't convert object to primitive value"); -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/own-keys.js": -/*!********************************************************!*\ - !*** ../../node_modules/core-js/internals/own-keys.js ***! - \********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "../../node_modules/core-js/internals/get-built-in.js"); -var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); -var getOwnPropertyNamesModule = __webpack_require__(/*! ../internals/object-get-own-property-names */ "../../node_modules/core-js/internals/object-get-own-property-names.js"); -var getOwnPropertySymbolsModule = __webpack_require__(/*! ../internals/object-get-own-property-symbols */ "../../node_modules/core-js/internals/object-get-own-property-symbols.js"); -var anObject = __webpack_require__(/*! ../internals/an-object */ "../../node_modules/core-js/internals/an-object.js"); - -var concat = uncurryThis([].concat); - -// all object keys, includes non-enumerable and symbols -module.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) { - var keys = getOwnPropertyNamesModule.f(anObject(it)); - var getOwnPropertySymbols = getOwnPropertySymbolsModule.f; - return getOwnPropertySymbols ? concat(keys, getOwnPropertySymbols(it)) : keys; -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/path.js": -/*!****************************************************!*\ - !*** ../../node_modules/core-js/internals/path.js ***! - \****************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); - -module.exports = global; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/perform.js": -/*!*******************************************************!*\ - !*** ../../node_modules/core-js/internals/perform.js ***! - \*******************************************************/ -/***/ ((module) => { - -module.exports = function (exec) { - try { - return { error: false, value: exec() }; - } catch (error) { - return { error: true, value: error }; - } -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/promise-resolve.js": -/*!***************************************************************!*\ - !*** ../../node_modules/core-js/internals/promise-resolve.js ***! - \***************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var anObject = __webpack_require__(/*! ../internals/an-object */ "../../node_modules/core-js/internals/an-object.js"); -var isObject = __webpack_require__(/*! ../internals/is-object */ "../../node_modules/core-js/internals/is-object.js"); -var newPromiseCapability = __webpack_require__(/*! ../internals/new-promise-capability */ "../../node_modules/core-js/internals/new-promise-capability.js"); - -module.exports = function (C, x) { - anObject(C); - if (isObject(x) && x.constructor === C) return x; - var promiseCapability = newPromiseCapability.f(C); - var resolve = promiseCapability.resolve; - resolve(x); - return promiseCapability.promise; -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/redefine-all.js": -/*!************************************************************!*\ - !*** ../../node_modules/core-js/internals/redefine-all.js ***! - \************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var redefine = __webpack_require__(/*! ../internals/redefine */ "../../node_modules/core-js/internals/redefine.js"); - -module.exports = function (target, src, options) { - for (var key in src) redefine(target, key, src[key], options); - return target; -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/redefine.js": -/*!********************************************************!*\ - !*** ../../node_modules/core-js/internals/redefine.js ***! - \********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); -var isCallable = __webpack_require__(/*! ../internals/is-callable */ "../../node_modules/core-js/internals/is-callable.js"); -var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "../../node_modules/core-js/internals/has-own-property.js"); -var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "../../node_modules/core-js/internals/create-non-enumerable-property.js"); -var setGlobal = __webpack_require__(/*! ../internals/set-global */ "../../node_modules/core-js/internals/set-global.js"); -var inspectSource = __webpack_require__(/*! ../internals/inspect-source */ "../../node_modules/core-js/internals/inspect-source.js"); -var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "../../node_modules/core-js/internals/internal-state.js"); -var CONFIGURABLE_FUNCTION_NAME = (__webpack_require__(/*! ../internals/function-name */ "../../node_modules/core-js/internals/function-name.js").CONFIGURABLE); - -var getInternalState = InternalStateModule.get; -var enforceInternalState = InternalStateModule.enforce; -var TEMPLATE = String(String).split('String'); - -(module.exports = function (O, key, value, options) { - var unsafe = options ? !!options.unsafe : false; - var simple = options ? !!options.enumerable : false; - var noTargetGet = options ? !!options.noTargetGet : false; - var name = options && options.name !== undefined ? options.name : key; - var state; - if (isCallable(value)) { - if (String(name).slice(0, 7) === 'Symbol(') { - name = '[' + String(name).replace(/^Symbol\(([^)]*)\)/, '$1') + ']'; - } - if (!hasOwn(value, 'name') || (CONFIGURABLE_FUNCTION_NAME && value.name !== name)) { - createNonEnumerableProperty(value, 'name', name); - } - state = enforceInternalState(value); - if (!state.source) { - state.source = TEMPLATE.join(typeof name == 'string' ? name : ''); - } - } - if (O === global) { - if (simple) O[key] = value; - else setGlobal(key, value); - return; - } else if (!unsafe) { - delete O[key]; - } else if (!noTargetGet && O[key]) { - simple = true; - } - if (simple) O[key] = value; - else createNonEnumerableProperty(O, key, value); -// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative -})(Function.prototype, 'toString', function toString() { - return isCallable(this) && getInternalState(this).source || inspectSource(this); -}); - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/require-object-coercible.js": -/*!************************************************************************!*\ - !*** ../../node_modules/core-js/internals/require-object-coercible.js ***! - \************************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); - -var TypeError = global.TypeError; - -// `RequireObjectCoercible` abstract operation -// https://tc39.es/ecma262/#sec-requireobjectcoercible -module.exports = function (it) { - if (it == undefined) throw TypeError("Can't call method on " + it); - return it; -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/set-global.js": -/*!**********************************************************!*\ - !*** ../../node_modules/core-js/internals/set-global.js ***! - \**********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); - -// eslint-disable-next-line es/no-object-defineproperty -- safe -var defineProperty = Object.defineProperty; - -module.exports = function (key, value) { - try { - defineProperty(global, key, { value: value, configurable: true, writable: true }); - } catch (error) { - global[key] = value; - } return value; -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/set-species.js": -/*!***********************************************************!*\ - !*** ../../node_modules/core-js/internals/set-species.js ***! - \***********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - -var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "../../node_modules/core-js/internals/get-built-in.js"); -var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "../../node_modules/core-js/internals/object-define-property.js"); -var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../../node_modules/core-js/internals/well-known-symbol.js"); -var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "../../node_modules/core-js/internals/descriptors.js"); - -var SPECIES = wellKnownSymbol('species'); - -module.exports = function (CONSTRUCTOR_NAME) { - var Constructor = getBuiltIn(CONSTRUCTOR_NAME); - var defineProperty = definePropertyModule.f; - - if (DESCRIPTORS && Constructor && !Constructor[SPECIES]) { - defineProperty(Constructor, SPECIES, { - configurable: true, - get: function () { return this; } - }); - } -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/set-to-string-tag.js": -/*!*****************************************************************!*\ - !*** ../../node_modules/core-js/internals/set-to-string-tag.js ***! - \*****************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var defineProperty = (__webpack_require__(/*! ../internals/object-define-property */ "../../node_modules/core-js/internals/object-define-property.js").f); -var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "../../node_modules/core-js/internals/has-own-property.js"); -var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../../node_modules/core-js/internals/well-known-symbol.js"); - -var TO_STRING_TAG = wellKnownSymbol('toStringTag'); - -module.exports = function (it, TAG, STATIC) { - if (it && !hasOwn(it = STATIC ? it : it.prototype, TO_STRING_TAG)) { - defineProperty(it, TO_STRING_TAG, { configurable: true, value: TAG }); - } -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/shared-key.js": -/*!**********************************************************!*\ - !*** ../../node_modules/core-js/internals/shared-key.js ***! - \**********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var shared = __webpack_require__(/*! ../internals/shared */ "../../node_modules/core-js/internals/shared.js"); -var uid = __webpack_require__(/*! ../internals/uid */ "../../node_modules/core-js/internals/uid.js"); - -var keys = shared('keys'); - -module.exports = function (key) { - return keys[key] || (keys[key] = uid(key)); -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/shared-store.js": -/*!************************************************************!*\ - !*** ../../node_modules/core-js/internals/shared-store.js ***! - \************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); -var setGlobal = __webpack_require__(/*! ../internals/set-global */ "../../node_modules/core-js/internals/set-global.js"); - -var SHARED = '__core-js_shared__'; -var store = global[SHARED] || setGlobal(SHARED, {}); - -module.exports = store; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/shared.js": -/*!******************************************************!*\ - !*** ../../node_modules/core-js/internals/shared.js ***! - \******************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "../../node_modules/core-js/internals/is-pure.js"); -var store = __webpack_require__(/*! ../internals/shared-store */ "../../node_modules/core-js/internals/shared-store.js"); - -(module.exports = function (key, value) { - return store[key] || (store[key] = value !== undefined ? value : {}); -})('versions', []).push({ - version: '3.19.0', - mode: IS_PURE ? 'pure' : 'global', - copyright: '© 2021 Denis Pushkarev (zloirock.ru)' -}); - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/species-constructor.js": -/*!*******************************************************************!*\ - !*** ../../node_modules/core-js/internals/species-constructor.js ***! - \*******************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var anObject = __webpack_require__(/*! ../internals/an-object */ "../../node_modules/core-js/internals/an-object.js"); -var aConstructor = __webpack_require__(/*! ../internals/a-constructor */ "../../node_modules/core-js/internals/a-constructor.js"); -var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../../node_modules/core-js/internals/well-known-symbol.js"); - -var SPECIES = wellKnownSymbol('species'); - -// `SpeciesConstructor` abstract operation -// https://tc39.es/ecma262/#sec-speciesconstructor -module.exports = function (O, defaultConstructor) { - var C = anObject(O).constructor; - var S; - return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? defaultConstructor : aConstructor(S); -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/string-multibyte.js": -/*!****************************************************************!*\ - !*** ../../node_modules/core-js/internals/string-multibyte.js ***! - \****************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); -var toIntegerOrInfinity = __webpack_require__(/*! ../internals/to-integer-or-infinity */ "../../node_modules/core-js/internals/to-integer-or-infinity.js"); -var toString = __webpack_require__(/*! ../internals/to-string */ "../../node_modules/core-js/internals/to-string.js"); -var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "../../node_modules/core-js/internals/require-object-coercible.js"); - -var charAt = uncurryThis(''.charAt); -var charCodeAt = uncurryThis(''.charCodeAt); -var stringSlice = uncurryThis(''.slice); - -var createMethod = function (CONVERT_TO_STRING) { - return function ($this, pos) { - var S = toString(requireObjectCoercible($this)); - var position = toIntegerOrInfinity(pos); - var size = S.length; - var first, second; - if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined; - first = charCodeAt(S, position); - return first < 0xD800 || first > 0xDBFF || position + 1 === size - || (second = charCodeAt(S, position + 1)) < 0xDC00 || second > 0xDFFF - ? CONVERT_TO_STRING - ? charAt(S, position) - : first - : CONVERT_TO_STRING - ? stringSlice(S, position, position + 2) - : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000; - }; -}; - -module.exports = { - // `String.prototype.codePointAt` method - // https://tc39.es/ecma262/#sec-string.prototype.codepointat - codeAt: createMethod(false), - // `String.prototype.at` method - // https://github.com/mathiasbynens/String.prototype.at - charAt: createMethod(true) -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/string-trim.js": -/*!***********************************************************!*\ - !*** ../../node_modules/core-js/internals/string-trim.js ***! - \***********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); -var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "../../node_modules/core-js/internals/require-object-coercible.js"); -var toString = __webpack_require__(/*! ../internals/to-string */ "../../node_modules/core-js/internals/to-string.js"); -var whitespaces = __webpack_require__(/*! ../internals/whitespaces */ "../../node_modules/core-js/internals/whitespaces.js"); - -var replace = uncurryThis(''.replace); -var whitespace = '[' + whitespaces + ']'; -var ltrim = RegExp('^' + whitespace + whitespace + '*'); -var rtrim = RegExp(whitespace + whitespace + '*$'); - -// `String.prototype.{ trim, trimStart, trimEnd, trimLeft, trimRight }` methods implementation -var createMethod = function (TYPE) { - return function ($this) { - var string = toString(requireObjectCoercible($this)); - if (TYPE & 1) string = replace(string, ltrim, ''); - if (TYPE & 2) string = replace(string, rtrim, ''); - return string; - }; -}; - -module.exports = { - // `String.prototype.{ trimLeft, trimStart }` methods - // https://tc39.es/ecma262/#sec-string.prototype.trimstart - start: createMethod(1), - // `String.prototype.{ trimRight, trimEnd }` methods - // https://tc39.es/ecma262/#sec-string.prototype.trimend - end: createMethod(2), - // `String.prototype.trim` method - // https://tc39.es/ecma262/#sec-string.prototype.trim - trim: createMethod(3) -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/task.js": -/*!****************************************************!*\ - !*** ../../node_modules/core-js/internals/task.js ***! - \****************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); -var apply = __webpack_require__(/*! ../internals/function-apply */ "../../node_modules/core-js/internals/function-apply.js"); -var bind = __webpack_require__(/*! ../internals/function-bind-context */ "../../node_modules/core-js/internals/function-bind-context.js"); -var isCallable = __webpack_require__(/*! ../internals/is-callable */ "../../node_modules/core-js/internals/is-callable.js"); -var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "../../node_modules/core-js/internals/has-own-property.js"); -var fails = __webpack_require__(/*! ../internals/fails */ "../../node_modules/core-js/internals/fails.js"); -var html = __webpack_require__(/*! ../internals/html */ "../../node_modules/core-js/internals/html.js"); -var arraySlice = __webpack_require__(/*! ../internals/array-slice */ "../../node_modules/core-js/internals/array-slice.js"); -var createElement = __webpack_require__(/*! ../internals/document-create-element */ "../../node_modules/core-js/internals/document-create-element.js"); -var IS_IOS = __webpack_require__(/*! ../internals/engine-is-ios */ "../../node_modules/core-js/internals/engine-is-ios.js"); -var IS_NODE = __webpack_require__(/*! ../internals/engine-is-node */ "../../node_modules/core-js/internals/engine-is-node.js"); - -var set = global.setImmediate; -var clear = global.clearImmediate; -var process = global.process; -var Dispatch = global.Dispatch; -var Function = global.Function; -var MessageChannel = global.MessageChannel; -var String = global.String; -var counter = 0; -var queue = {}; -var ONREADYSTATECHANGE = 'onreadystatechange'; -var location, defer, channel, port; - -try { - // Deno throws a ReferenceError on `location` access without `--location` flag - location = global.location; -} catch (error) { /* empty */ } - -var run = function (id) { - if (hasOwn(queue, id)) { - var fn = queue[id]; - delete queue[id]; - fn(); - } -}; - -var runner = function (id) { - return function () { - run(id); - }; -}; - -var listener = function (event) { - run(event.data); -}; - -var post = function (id) { - // old engines have not location.origin - global.postMessage(String(id), location.protocol + '//' + location.host); -}; - -// Node.js 0.9+ & IE10+ has setImmediate, otherwise: -if (!set || !clear) { - set = function setImmediate(fn) { - var args = arraySlice(arguments, 1); - queue[++counter] = function () { - apply(isCallable(fn) ? fn : Function(fn), undefined, args); - }; - defer(counter); - return counter; - }; - clear = function clearImmediate(id) { - delete queue[id]; - }; - // Node.js 0.8- - if (IS_NODE) { - defer = function (id) { - process.nextTick(runner(id)); - }; - // Sphere (JS game engine) Dispatch API - } else if (Dispatch && Dispatch.now) { - defer = function (id) { - Dispatch.now(runner(id)); - }; - // Browsers with MessageChannel, includes WebWorkers - // except iOS - https://github.com/zloirock/core-js/issues/624 - } else if (MessageChannel && !IS_IOS) { - channel = new MessageChannel(); - port = channel.port2; - channel.port1.onmessage = listener; - defer = bind(port.postMessage, port); - // Browsers with postMessage, skip WebWorkers - // IE8 has postMessage, but it's sync & typeof its postMessage is 'object' - } else if ( - global.addEventListener && - isCallable(global.postMessage) && - !global.importScripts && - location && location.protocol !== 'file:' && - !fails(post) - ) { - defer = post; - global.addEventListener('message', listener, false); - // IE8- - } else if (ONREADYSTATECHANGE in createElement('script')) { - defer = function (id) { - html.appendChild(createElement('script'))[ONREADYSTATECHANGE] = function () { - html.removeChild(this); - run(id); - }; - }; - // Rest old browsers - } else { - defer = function (id) { - setTimeout(runner(id), 0); - }; - } -} - -module.exports = { - set: set, - clear: clear -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/to-absolute-index.js": -/*!*****************************************************************!*\ - !*** ../../node_modules/core-js/internals/to-absolute-index.js ***! - \*****************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var toIntegerOrInfinity = __webpack_require__(/*! ../internals/to-integer-or-infinity */ "../../node_modules/core-js/internals/to-integer-or-infinity.js"); - -var max = Math.max; -var min = Math.min; - -// Helper for a popular repeating case of the spec: -// Let integer be ? ToInteger(index). -// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length). -module.exports = function (index, length) { - var integer = toIntegerOrInfinity(index); - return integer < 0 ? max(integer + length, 0) : min(integer, length); -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/to-indexed-object.js": -/*!*****************************************************************!*\ - !*** ../../node_modules/core-js/internals/to-indexed-object.js ***! - \*****************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -// toObject with fallback for non-array-like ES3 strings -var IndexedObject = __webpack_require__(/*! ../internals/indexed-object */ "../../node_modules/core-js/internals/indexed-object.js"); -var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "../../node_modules/core-js/internals/require-object-coercible.js"); - -module.exports = function (it) { - return IndexedObject(requireObjectCoercible(it)); -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/to-integer-or-infinity.js": -/*!**********************************************************************!*\ - !*** ../../node_modules/core-js/internals/to-integer-or-infinity.js ***! - \**********************************************************************/ -/***/ ((module) => { - -var ceil = Math.ceil; -var floor = Math.floor; - -// `ToIntegerOrInfinity` abstract operation -// https://tc39.es/ecma262/#sec-tointegerorinfinity -module.exports = function (argument) { - var number = +argument; - // eslint-disable-next-line no-self-compare -- safe - return number !== number || number === 0 ? 0 : (number > 0 ? floor : ceil)(number); -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/to-length.js": -/*!*********************************************************!*\ - !*** ../../node_modules/core-js/internals/to-length.js ***! - \*********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var toIntegerOrInfinity = __webpack_require__(/*! ../internals/to-integer-or-infinity */ "../../node_modules/core-js/internals/to-integer-or-infinity.js"); - -var min = Math.min; - -// `ToLength` abstract operation -// https://tc39.es/ecma262/#sec-tolength -module.exports = function (argument) { - return argument > 0 ? min(toIntegerOrInfinity(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991 -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/to-object.js": -/*!*********************************************************!*\ - !*** ../../node_modules/core-js/internals/to-object.js ***! - \*********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); -var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "../../node_modules/core-js/internals/require-object-coercible.js"); - -var Object = global.Object; - -// `ToObject` abstract operation -// https://tc39.es/ecma262/#sec-toobject -module.exports = function (argument) { - return Object(requireObjectCoercible(argument)); -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/to-primitive.js": -/*!************************************************************!*\ - !*** ../../node_modules/core-js/internals/to-primitive.js ***! - \************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); -var call = __webpack_require__(/*! ../internals/function-call */ "../../node_modules/core-js/internals/function-call.js"); -var isObject = __webpack_require__(/*! ../internals/is-object */ "../../node_modules/core-js/internals/is-object.js"); -var isSymbol = __webpack_require__(/*! ../internals/is-symbol */ "../../node_modules/core-js/internals/is-symbol.js"); -var getMethod = __webpack_require__(/*! ../internals/get-method */ "../../node_modules/core-js/internals/get-method.js"); -var ordinaryToPrimitive = __webpack_require__(/*! ../internals/ordinary-to-primitive */ "../../node_modules/core-js/internals/ordinary-to-primitive.js"); -var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../../node_modules/core-js/internals/well-known-symbol.js"); - -var TypeError = global.TypeError; -var TO_PRIMITIVE = wellKnownSymbol('toPrimitive'); - -// `ToPrimitive` abstract operation -// https://tc39.es/ecma262/#sec-toprimitive -module.exports = function (input, pref) { - if (!isObject(input) || isSymbol(input)) return input; - var exoticToPrim = getMethod(input, TO_PRIMITIVE); - var result; - if (exoticToPrim) { - if (pref === undefined) pref = 'default'; - result = call(exoticToPrim, input, pref); - if (!isObject(result) || isSymbol(result)) return result; - throw TypeError("Can't convert object to primitive value"); - } - if (pref === undefined) pref = 'number'; - return ordinaryToPrimitive(input, pref); -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/to-property-key.js": -/*!***************************************************************!*\ - !*** ../../node_modules/core-js/internals/to-property-key.js ***! - \***************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var toPrimitive = __webpack_require__(/*! ../internals/to-primitive */ "../../node_modules/core-js/internals/to-primitive.js"); -var isSymbol = __webpack_require__(/*! ../internals/is-symbol */ "../../node_modules/core-js/internals/is-symbol.js"); - -// `ToPropertyKey` abstract operation -// https://tc39.es/ecma262/#sec-topropertykey -module.exports = function (argument) { - var key = toPrimitive(argument, 'string'); - return isSymbol(key) ? key : key + ''; -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/to-string-tag-support.js": -/*!*********************************************************************!*\ - !*** ../../node_modules/core-js/internals/to-string-tag-support.js ***! - \*********************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../../node_modules/core-js/internals/well-known-symbol.js"); - -var TO_STRING_TAG = wellKnownSymbol('toStringTag'); -var test = {}; - -test[TO_STRING_TAG] = 'z'; - -module.exports = String(test) === '[object z]'; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/to-string.js": -/*!*********************************************************!*\ - !*** ../../node_modules/core-js/internals/to-string.js ***! - \*********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); -var classof = __webpack_require__(/*! ../internals/classof */ "../../node_modules/core-js/internals/classof.js"); - -var String = global.String; - -module.exports = function (argument) { - if (classof(argument) === 'Symbol') throw TypeError('Cannot convert a Symbol value to a string'); - return String(argument); -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/try-to-string.js": -/*!*************************************************************!*\ - !*** ../../node_modules/core-js/internals/try-to-string.js ***! - \*************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); - -var String = global.String; - -module.exports = function (argument) { - try { - return String(argument); - } catch (error) { - return 'Object'; - } -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/uid.js": -/*!***************************************************!*\ - !*** ../../node_modules/core-js/internals/uid.js ***! - \***************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "../../node_modules/core-js/internals/function-uncurry-this.js"); - -var id = 0; -var postfix = Math.random(); -var toString = uncurryThis(1.0.toString); - -module.exports = function (key) { - return 'Symbol(' + (key === undefined ? '' : key) + ')_' + toString(++id + postfix, 36); -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/use-symbol-as-uid.js": -/*!*****************************************************************!*\ - !*** ../../node_modules/core-js/internals/use-symbol-as-uid.js ***! - \*****************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -/* eslint-disable es/no-symbol -- required for testing */ -var NATIVE_SYMBOL = __webpack_require__(/*! ../internals/native-symbol */ "../../node_modules/core-js/internals/native-symbol.js"); - -module.exports = NATIVE_SYMBOL - && !Symbol.sham - && typeof Symbol.iterator == 'symbol'; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/well-known-symbol.js": -/*!*****************************************************************!*\ - !*** ../../node_modules/core-js/internals/well-known-symbol.js ***! - \*****************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); -var shared = __webpack_require__(/*! ../internals/shared */ "../../node_modules/core-js/internals/shared.js"); -var hasOwn = __webpack_require__(/*! ../internals/has-own-property */ "../../node_modules/core-js/internals/has-own-property.js"); -var uid = __webpack_require__(/*! ../internals/uid */ "../../node_modules/core-js/internals/uid.js"); -var NATIVE_SYMBOL = __webpack_require__(/*! ../internals/native-symbol */ "../../node_modules/core-js/internals/native-symbol.js"); -var USE_SYMBOL_AS_UID = __webpack_require__(/*! ../internals/use-symbol-as-uid */ "../../node_modules/core-js/internals/use-symbol-as-uid.js"); - -var WellKnownSymbolsStore = shared('wks'); -var Symbol = global.Symbol; -var symbolFor = Symbol && Symbol['for']; -var createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol : Symbol && Symbol.withoutSetter || uid; - -module.exports = function (name) { - if (!hasOwn(WellKnownSymbolsStore, name) || !(NATIVE_SYMBOL || typeof WellKnownSymbolsStore[name] == 'string')) { - var description = 'Symbol.' + name; - if (NATIVE_SYMBOL && hasOwn(Symbol, name)) { - WellKnownSymbolsStore[name] = Symbol[name]; - } else if (USE_SYMBOL_AS_UID && symbolFor) { - WellKnownSymbolsStore[name] = symbolFor(description); - } else { - WellKnownSymbolsStore[name] = createWellKnownSymbol(description); - } - } return WellKnownSymbolsStore[name]; -}; - - -/***/ }), - -/***/ "../../node_modules/core-js/internals/whitespaces.js": -/*!***********************************************************!*\ - !*** ../../node_modules/core-js/internals/whitespaces.js ***! - \***********************************************************/ -/***/ ((module) => { - -// a string of all valid unicode whitespaces -module.exports = '\u0009\u000A\u000B\u000C\u000D\u0020\u00A0\u1680\u2000\u2001\u2002' + - '\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF'; - - -/***/ }), - -/***/ "../../node_modules/core-js/modules/es.aggregate-error.js": -/*!****************************************************************!*\ - !*** ../../node_modules/core-js/modules/es.aggregate-error.js ***! - \****************************************************************/ -/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - -var $ = __webpack_require__(/*! ../internals/export */ "../../node_modules/core-js/internals/export.js"); -var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); -var isPrototypeOf = __webpack_require__(/*! ../internals/object-is-prototype-of */ "../../node_modules/core-js/internals/object-is-prototype-of.js"); -var getPrototypeOf = __webpack_require__(/*! ../internals/object-get-prototype-of */ "../../node_modules/core-js/internals/object-get-prototype-of.js"); -var setPrototypeOf = __webpack_require__(/*! ../internals/object-set-prototype-of */ "../../node_modules/core-js/internals/object-set-prototype-of.js"); -var copyConstructorProperties = __webpack_require__(/*! ../internals/copy-constructor-properties */ "../../node_modules/core-js/internals/copy-constructor-properties.js"); -var create = __webpack_require__(/*! ../internals/object-create */ "../../node_modules/core-js/internals/object-create.js"); -var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "../../node_modules/core-js/internals/create-non-enumerable-property.js"); -var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "../../node_modules/core-js/internals/create-property-descriptor.js"); -var clearErrorStack = __webpack_require__(/*! ../internals/clear-error-stack */ "../../node_modules/core-js/internals/clear-error-stack.js"); -var installErrorCause = __webpack_require__(/*! ../internals/install-error-cause */ "../../node_modules/core-js/internals/install-error-cause.js"); -var iterate = __webpack_require__(/*! ../internals/iterate */ "../../node_modules/core-js/internals/iterate.js"); -var normalizeStringArgument = __webpack_require__(/*! ../internals/normalize-string-argument */ "../../node_modules/core-js/internals/normalize-string-argument.js"); -var ERROR_STACK_INSTALLABLE = __webpack_require__(/*! ../internals/error-stack-installable */ "../../node_modules/core-js/internals/error-stack-installable.js"); - -var Error = global.Error; -var push = [].push; - -var $AggregateError = function AggregateError(errors, message /* , options */) { - var that = isPrototypeOf(AggregateErrorPrototype, this) ? this : create(AggregateErrorPrototype); - var options = arguments.length > 2 ? arguments[2] : undefined; - if (setPrototypeOf) { - that = setPrototypeOf(new Error(undefined), getPrototypeOf(that)); - } - createNonEnumerableProperty(that, 'message', normalizeStringArgument(message, '')); - if (ERROR_STACK_INSTALLABLE) createNonEnumerableProperty(that, 'stack', clearErrorStack(that.stack, 1)); - installErrorCause(that, options); - var errorsArray = []; - iterate(errors, push, { that: errorsArray }); - createNonEnumerableProperty(that, 'errors', errorsArray); - return that; -}; - -if (setPrototypeOf) setPrototypeOf($AggregateError, Error); -else copyConstructorProperties($AggregateError, Error); - -var AggregateErrorPrototype = $AggregateError.prototype = create(Error.prototype, { - constructor: createPropertyDescriptor(1, $AggregateError), - message: createPropertyDescriptor(1, ''), - name: createPropertyDescriptor(1, 'AggregateError') -}); - -// `AggregateError` constructor -// https://tc39.es/ecma262/#sec-aggregate-error-constructor -$({ global: true }, { - AggregateError: $AggregateError -}); - - -/***/ }), - -/***/ "../../node_modules/core-js/modules/es.array.find.js": -/*!***********************************************************!*\ - !*** ../../node_modules/core-js/modules/es.array.find.js ***! - \***********************************************************/ -/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - -var $ = __webpack_require__(/*! ../internals/export */ "../../node_modules/core-js/internals/export.js"); -var $find = (__webpack_require__(/*! ../internals/array-iteration */ "../../node_modules/core-js/internals/array-iteration.js").find); -var addToUnscopables = __webpack_require__(/*! ../internals/add-to-unscopables */ "../../node_modules/core-js/internals/add-to-unscopables.js"); - -var FIND = 'find'; -var SKIPS_HOLES = true; - -// Shouldn't skip holes -if (FIND in []) Array(1)[FIND](function () { SKIPS_HOLES = false; }); - -// `Array.prototype.find` method -// https://tc39.es/ecma262/#sec-array.prototype.find -$({ target: 'Array', proto: true, forced: SKIPS_HOLES }, { - find: function find(callbackfn /* , that = undefined */) { - return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined); - } -}); - -// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables -addToUnscopables(FIND); - - -/***/ }), - -/***/ "../../node_modules/core-js/modules/es.array.from.js": -/*!***********************************************************!*\ - !*** ../../node_modules/core-js/modules/es.array.from.js ***! - \***********************************************************/ -/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { - -var $ = __webpack_require__(/*! ../internals/export */ "../../node_modules/core-js/internals/export.js"); -var from = __webpack_require__(/*! ../internals/array-from */ "../../node_modules/core-js/internals/array-from.js"); -var checkCorrectnessOfIteration = __webpack_require__(/*! ../internals/check-correctness-of-iteration */ "../../node_modules/core-js/internals/check-correctness-of-iteration.js"); - -var INCORRECT_ITERATION = !checkCorrectnessOfIteration(function (iterable) { - // eslint-disable-next-line es/no-array-from -- required for testing - Array.from(iterable); -}); - -// `Array.from` method -// https://tc39.es/ecma262/#sec-array.from -$({ target: 'Array', stat: true, forced: INCORRECT_ITERATION }, { - from: from -}); - - -/***/ }), - -/***/ "../../node_modules/core-js/modules/es.array.iterator.js": -/*!***************************************************************!*\ - !*** ../../node_modules/core-js/modules/es.array.iterator.js ***! - \***************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - -var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "../../node_modules/core-js/internals/to-indexed-object.js"); -var addToUnscopables = __webpack_require__(/*! ../internals/add-to-unscopables */ "../../node_modules/core-js/internals/add-to-unscopables.js"); -var Iterators = __webpack_require__(/*! ../internals/iterators */ "../../node_modules/core-js/internals/iterators.js"); -var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "../../node_modules/core-js/internals/internal-state.js"); -var defineIterator = __webpack_require__(/*! ../internals/define-iterator */ "../../node_modules/core-js/internals/define-iterator.js"); - -var ARRAY_ITERATOR = 'Array Iterator'; -var setInternalState = InternalStateModule.set; -var getInternalState = InternalStateModule.getterFor(ARRAY_ITERATOR); - -// `Array.prototype.entries` method -// https://tc39.es/ecma262/#sec-array.prototype.entries -// `Array.prototype.keys` method -// https://tc39.es/ecma262/#sec-array.prototype.keys -// `Array.prototype.values` method -// https://tc39.es/ecma262/#sec-array.prototype.values -// `Array.prototype[@@iterator]` method -// https://tc39.es/ecma262/#sec-array.prototype-@@iterator -// `CreateArrayIterator` internal method -// https://tc39.es/ecma262/#sec-createarrayiterator -module.exports = defineIterator(Array, 'Array', function (iterated, kind) { - setInternalState(this, { - type: ARRAY_ITERATOR, - target: toIndexedObject(iterated), // target - index: 0, // next index - kind: kind // kind - }); -// `%ArrayIteratorPrototype%.next` method -// https://tc39.es/ecma262/#sec-%arrayiteratorprototype%.next -}, function () { - var state = getInternalState(this); - var target = state.target; - var kind = state.kind; - var index = state.index++; - if (!target || index >= target.length) { - state.target = undefined; - return { value: undefined, done: true }; - } - if (kind == 'keys') return { value: index, done: false }; - if (kind == 'values') return { value: target[index], done: false }; - return { value: [index, target[index]], done: false }; -}, 'values'); - -// argumentsList[@@iterator] is %ArrayProto_values% -// https://tc39.es/ecma262/#sec-createunmappedargumentsobject -// https://tc39.es/ecma262/#sec-createmappedargumentsobject -Iterators.Arguments = Iterators.Array; - -// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables -addToUnscopables('keys'); -addToUnscopables('values'); -addToUnscopables('entries'); - - -/***/ }), - -/***/ "../../node_modules/core-js/modules/es.map.js": -/*!****************************************************!*\ - !*** ../../node_modules/core-js/modules/es.map.js ***! - \****************************************************/ -/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - -var collection = __webpack_require__(/*! ../internals/collection */ "../../node_modules/core-js/internals/collection.js"); -var collectionStrong = __webpack_require__(/*! ../internals/collection-strong */ "../../node_modules/core-js/internals/collection-strong.js"); - -// `Map` constructor -// https://tc39.es/ecma262/#sec-map-objects -collection('Map', function (init) { - return function Map() { return init(this, arguments.length ? arguments[0] : undefined); }; -}, collectionStrong); - - -/***/ }), - -/***/ "../../node_modules/core-js/modules/es.number.is-integer.js": -/*!******************************************************************!*\ - !*** ../../node_modules/core-js/modules/es.number.is-integer.js ***! - \******************************************************************/ -/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { - -var $ = __webpack_require__(/*! ../internals/export */ "../../node_modules/core-js/internals/export.js"); -var isIntegralNumber = __webpack_require__(/*! ../internals/is-integral-number */ "../../node_modules/core-js/internals/is-integral-number.js"); - -// `Number.isInteger` method -// https://tc39.es/ecma262/#sec-number.isinteger -$({ target: 'Number', stat: true }, { - isInteger: isIntegralNumber -}); - - -/***/ }), - -/***/ "../../node_modules/core-js/modules/es.number.is-nan.js": -/*!**************************************************************!*\ - !*** ../../node_modules/core-js/modules/es.number.is-nan.js ***! - \**************************************************************/ -/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { - -var $ = __webpack_require__(/*! ../internals/export */ "../../node_modules/core-js/internals/export.js"); - -// `Number.isNaN` method -// https://tc39.es/ecma262/#sec-number.isnan -$({ target: 'Number', stat: true }, { - isNaN: function isNaN(number) { - // eslint-disable-next-line no-self-compare -- NaN check - return number != number; - } -}); - - -/***/ }), - -/***/ "../../node_modules/core-js/modules/es.number.parse-float.js": -/*!*******************************************************************!*\ - !*** ../../node_modules/core-js/modules/es.number.parse-float.js ***! - \*******************************************************************/ -/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { - -var $ = __webpack_require__(/*! ../internals/export */ "../../node_modules/core-js/internals/export.js"); -var parseFloat = __webpack_require__(/*! ../internals/number-parse-float */ "../../node_modules/core-js/internals/number-parse-float.js"); - -// `Number.parseFloat` method -// https://tc39.es/ecma262/#sec-number.parseFloat -// eslint-disable-next-line es/no-number-parsefloat -- required for testing -$({ target: 'Number', stat: true, forced: Number.parseFloat != parseFloat }, { - parseFloat: parseFloat -}); - - -/***/ }), - -/***/ "../../node_modules/core-js/modules/es.number.parse-int.js": -/*!*****************************************************************!*\ - !*** ../../node_modules/core-js/modules/es.number.parse-int.js ***! - \*****************************************************************/ -/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { - -var $ = __webpack_require__(/*! ../internals/export */ "../../node_modules/core-js/internals/export.js"); -var parseInt = __webpack_require__(/*! ../internals/number-parse-int */ "../../node_modules/core-js/internals/number-parse-int.js"); - -// `Number.parseInt` method -// https://tc39.es/ecma262/#sec-number.parseint -// eslint-disable-next-line es/no-number-parseint -- required for testing -$({ target: 'Number', stat: true, forced: Number.parseInt != parseInt }, { - parseInt: parseInt -}); - - -/***/ }), - -/***/ "../../node_modules/core-js/modules/es.object.assign.js": -/*!**************************************************************!*\ - !*** ../../node_modules/core-js/modules/es.object.assign.js ***! - \**************************************************************/ -/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { - -var $ = __webpack_require__(/*! ../internals/export */ "../../node_modules/core-js/internals/export.js"); -var assign = __webpack_require__(/*! ../internals/object-assign */ "../../node_modules/core-js/internals/object-assign.js"); - -// `Object.assign` method -// https://tc39.es/ecma262/#sec-object.assign -// eslint-disable-next-line es/no-object-assign -- required for testing -$({ target: 'Object', stat: true, forced: Object.assign !== assign }, { - assign: assign -}); - - -/***/ }), - -/***/ "../../node_modules/core-js/modules/es.object.entries.js": -/*!***************************************************************!*\ - !*** ../../node_modules/core-js/modules/es.object.entries.js ***! - \***************************************************************/ -/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { - -var $ = __webpack_require__(/*! ../internals/export */ "../../node_modules/core-js/internals/export.js"); -var $entries = (__webpack_require__(/*! ../internals/object-to-array */ "../../node_modules/core-js/internals/object-to-array.js").entries); - -// `Object.entries` method -// https://tc39.es/ecma262/#sec-object.entries -$({ target: 'Object', stat: true }, { - entries: function entries(O) { - return $entries(O); - } -}); - - -/***/ }), - -/***/ "../../node_modules/core-js/modules/es.object.set-prototype-of.js": -/*!************************************************************************!*\ - !*** ../../node_modules/core-js/modules/es.object.set-prototype-of.js ***! - \************************************************************************/ -/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { - -var $ = __webpack_require__(/*! ../internals/export */ "../../node_modules/core-js/internals/export.js"); -var setPrototypeOf = __webpack_require__(/*! ../internals/object-set-prototype-of */ "../../node_modules/core-js/internals/object-set-prototype-of.js"); - -// `Object.setPrototypeOf` method -// https://tc39.es/ecma262/#sec-object.setprototypeof -$({ target: 'Object', stat: true }, { - setPrototypeOf: setPrototypeOf -}); - - -/***/ }), - -/***/ "../../node_modules/core-js/modules/es.object.to-string.js": -/*!*****************************************************************!*\ - !*** ../../node_modules/core-js/modules/es.object.to-string.js ***! - \*****************************************************************/ -/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { - -var TO_STRING_TAG_SUPPORT = __webpack_require__(/*! ../internals/to-string-tag-support */ "../../node_modules/core-js/internals/to-string-tag-support.js"); -var redefine = __webpack_require__(/*! ../internals/redefine */ "../../node_modules/core-js/internals/redefine.js"); -var toString = __webpack_require__(/*! ../internals/object-to-string */ "../../node_modules/core-js/internals/object-to-string.js"); - -// `Object.prototype.toString` method -// https://tc39.es/ecma262/#sec-object.prototype.tostring -if (!TO_STRING_TAG_SUPPORT) { - redefine(Object.prototype, 'toString', toString, { unsafe: true }); -} - - -/***/ }), - -/***/ "../../node_modules/core-js/modules/es.promise.all-settled.js": -/*!********************************************************************!*\ - !*** ../../node_modules/core-js/modules/es.promise.all-settled.js ***! - \********************************************************************/ -/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - -var $ = __webpack_require__(/*! ../internals/export */ "../../node_modules/core-js/internals/export.js"); -var call = __webpack_require__(/*! ../internals/function-call */ "../../node_modules/core-js/internals/function-call.js"); -var aCallable = __webpack_require__(/*! ../internals/a-callable */ "../../node_modules/core-js/internals/a-callable.js"); -var newPromiseCapabilityModule = __webpack_require__(/*! ../internals/new-promise-capability */ "../../node_modules/core-js/internals/new-promise-capability.js"); -var perform = __webpack_require__(/*! ../internals/perform */ "../../node_modules/core-js/internals/perform.js"); -var iterate = __webpack_require__(/*! ../internals/iterate */ "../../node_modules/core-js/internals/iterate.js"); - -// `Promise.allSettled` method -// https://tc39.es/ecma262/#sec-promise.allsettled -$({ target: 'Promise', stat: true }, { - allSettled: function allSettled(iterable) { - var C = this; - var capability = newPromiseCapabilityModule.f(C); - var resolve = capability.resolve; - var reject = capability.reject; - var result = perform(function () { - var promiseResolve = aCallable(C.resolve); - var values = []; - var counter = 0; - var remaining = 1; - iterate(iterable, function (promise) { - var index = counter++; - var alreadyCalled = false; - remaining++; - call(promiseResolve, C, promise).then(function (value) { - if (alreadyCalled) return; - alreadyCalled = true; - values[index] = { status: 'fulfilled', value: value }; - --remaining || resolve(values); - }, function (error) { - if (alreadyCalled) return; - alreadyCalled = true; - values[index] = { status: 'rejected', reason: error }; - --remaining || resolve(values); - }); - }); - --remaining || resolve(values); - }); - if (result.error) reject(result.value); - return capability.promise; - } -}); - - -/***/ }), - -/***/ "../../node_modules/core-js/modules/es.promise.any.js": -/*!************************************************************!*\ - !*** ../../node_modules/core-js/modules/es.promise.any.js ***! - \************************************************************/ -/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - -var $ = __webpack_require__(/*! ../internals/export */ "../../node_modules/core-js/internals/export.js"); -var aCallable = __webpack_require__(/*! ../internals/a-callable */ "../../node_modules/core-js/internals/a-callable.js"); -var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "../../node_modules/core-js/internals/get-built-in.js"); -var call = __webpack_require__(/*! ../internals/function-call */ "../../node_modules/core-js/internals/function-call.js"); -var newPromiseCapabilityModule = __webpack_require__(/*! ../internals/new-promise-capability */ "../../node_modules/core-js/internals/new-promise-capability.js"); -var perform = __webpack_require__(/*! ../internals/perform */ "../../node_modules/core-js/internals/perform.js"); -var iterate = __webpack_require__(/*! ../internals/iterate */ "../../node_modules/core-js/internals/iterate.js"); - -var PROMISE_ANY_ERROR = 'No one promise resolved'; - -// `Promise.any` method -// https://tc39.es/ecma262/#sec-promise.any -$({ target: 'Promise', stat: true }, { - any: function any(iterable) { - var C = this; - var AggregateError = getBuiltIn('AggregateError'); - var capability = newPromiseCapabilityModule.f(C); - var resolve = capability.resolve; - var reject = capability.reject; - var result = perform(function () { - var promiseResolve = aCallable(C.resolve); - var errors = []; - var counter = 0; - var remaining = 1; - var alreadyResolved = false; - iterate(iterable, function (promise) { - var index = counter++; - var alreadyRejected = false; - remaining++; - call(promiseResolve, C, promise).then(function (value) { - if (alreadyRejected || alreadyResolved) return; - alreadyResolved = true; - resolve(value); - }, function (error) { - if (alreadyRejected || alreadyResolved) return; - alreadyRejected = true; - errors[index] = error; - --remaining || reject(new AggregateError(errors, PROMISE_ANY_ERROR)); - }); - }); - --remaining || reject(new AggregateError(errors, PROMISE_ANY_ERROR)); - }); - if (result.error) reject(result.value); - return capability.promise; - } -}); - - -/***/ }), - -/***/ "../../node_modules/core-js/modules/es.promise.finally.js": -/*!****************************************************************!*\ - !*** ../../node_modules/core-js/modules/es.promise.finally.js ***! - \****************************************************************/ -/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - -var $ = __webpack_require__(/*! ../internals/export */ "../../node_modules/core-js/internals/export.js"); -var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "../../node_modules/core-js/internals/is-pure.js"); -var NativePromise = __webpack_require__(/*! ../internals/native-promise-constructor */ "../../node_modules/core-js/internals/native-promise-constructor.js"); -var fails = __webpack_require__(/*! ../internals/fails */ "../../node_modules/core-js/internals/fails.js"); -var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "../../node_modules/core-js/internals/get-built-in.js"); -var isCallable = __webpack_require__(/*! ../internals/is-callable */ "../../node_modules/core-js/internals/is-callable.js"); -var speciesConstructor = __webpack_require__(/*! ../internals/species-constructor */ "../../node_modules/core-js/internals/species-constructor.js"); -var promiseResolve = __webpack_require__(/*! ../internals/promise-resolve */ "../../node_modules/core-js/internals/promise-resolve.js"); -var redefine = __webpack_require__(/*! ../internals/redefine */ "../../node_modules/core-js/internals/redefine.js"); - -// Safari bug https://bugs.webkit.org/show_bug.cgi?id=200829 -var NON_GENERIC = !!NativePromise && fails(function () { - NativePromise.prototype['finally'].call({ then: function () { /* empty */ } }, function () { /* empty */ }); -}); - -// `Promise.prototype.finally` method -// https://tc39.es/ecma262/#sec-promise.prototype.finally -$({ target: 'Promise', proto: true, real: true, forced: NON_GENERIC }, { - 'finally': function (onFinally) { - var C = speciesConstructor(this, getBuiltIn('Promise')); - var isFunction = isCallable(onFinally); - return this.then( - isFunction ? function (x) { - return promiseResolve(C, onFinally()).then(function () { return x; }); - } : onFinally, - isFunction ? function (e) { - return promiseResolve(C, onFinally()).then(function () { throw e; }); - } : onFinally - ); - } -}); - -// makes sure that native promise-based APIs `Promise#finally` properly works with patched `Promise#then` -if (!IS_PURE && isCallable(NativePromise)) { - var method = getBuiltIn('Promise').prototype['finally']; - if (NativePromise.prototype['finally'] !== method) { - redefine(NativePromise.prototype, 'finally', method, { unsafe: true }); - } -} - - -/***/ }), - -/***/ "../../node_modules/core-js/modules/es.promise.js": -/*!********************************************************!*\ - !*** ../../node_modules/core-js/modules/es.promise.js ***! - \********************************************************/ -/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - -var $ = __webpack_require__(/*! ../internals/export */ "../../node_modules/core-js/internals/export.js"); -var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "../../node_modules/core-js/internals/is-pure.js"); -var global = __webpack_require__(/*! ../internals/global */ "../../node_modules/core-js/internals/global.js"); -var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "../../node_modules/core-js/internals/get-built-in.js"); -var call = __webpack_require__(/*! ../internals/function-call */ "../../node_modules/core-js/internals/function-call.js"); -var NativePromise = __webpack_require__(/*! ../internals/native-promise-constructor */ "../../node_modules/core-js/internals/native-promise-constructor.js"); -var redefine = __webpack_require__(/*! ../internals/redefine */ "../../node_modules/core-js/internals/redefine.js"); -var redefineAll = __webpack_require__(/*! ../internals/redefine-all */ "../../node_modules/core-js/internals/redefine-all.js"); -var setPrototypeOf = __webpack_require__(/*! ../internals/object-set-prototype-of */ "../../node_modules/core-js/internals/object-set-prototype-of.js"); -var setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ "../../node_modules/core-js/internals/set-to-string-tag.js"); -var setSpecies = __webpack_require__(/*! ../internals/set-species */ "../../node_modules/core-js/internals/set-species.js"); -var aCallable = __webpack_require__(/*! ../internals/a-callable */ "../../node_modules/core-js/internals/a-callable.js"); -var isCallable = __webpack_require__(/*! ../internals/is-callable */ "../../node_modules/core-js/internals/is-callable.js"); -var isObject = __webpack_require__(/*! ../internals/is-object */ "../../node_modules/core-js/internals/is-object.js"); -var anInstance = __webpack_require__(/*! ../internals/an-instance */ "../../node_modules/core-js/internals/an-instance.js"); -var inspectSource = __webpack_require__(/*! ../internals/inspect-source */ "../../node_modules/core-js/internals/inspect-source.js"); -var iterate = __webpack_require__(/*! ../internals/iterate */ "../../node_modules/core-js/internals/iterate.js"); -var checkCorrectnessOfIteration = __webpack_require__(/*! ../internals/check-correctness-of-iteration */ "../../node_modules/core-js/internals/check-correctness-of-iteration.js"); -var speciesConstructor = __webpack_require__(/*! ../internals/species-constructor */ "../../node_modules/core-js/internals/species-constructor.js"); -var task = (__webpack_require__(/*! ../internals/task */ "../../node_modules/core-js/internals/task.js").set); -var microtask = __webpack_require__(/*! ../internals/microtask */ "../../node_modules/core-js/internals/microtask.js"); -var promiseResolve = __webpack_require__(/*! ../internals/promise-resolve */ "../../node_modules/core-js/internals/promise-resolve.js"); -var hostReportErrors = __webpack_require__(/*! ../internals/host-report-errors */ "../../node_modules/core-js/internals/host-report-errors.js"); -var newPromiseCapabilityModule = __webpack_require__(/*! ../internals/new-promise-capability */ "../../node_modules/core-js/internals/new-promise-capability.js"); -var perform = __webpack_require__(/*! ../internals/perform */ "../../node_modules/core-js/internals/perform.js"); -var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "../../node_modules/core-js/internals/internal-state.js"); -var isForced = __webpack_require__(/*! ../internals/is-forced */ "../../node_modules/core-js/internals/is-forced.js"); -var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../../node_modules/core-js/internals/well-known-symbol.js"); -var IS_BROWSER = __webpack_require__(/*! ../internals/engine-is-browser */ "../../node_modules/core-js/internals/engine-is-browser.js"); -var IS_NODE = __webpack_require__(/*! ../internals/engine-is-node */ "../../node_modules/core-js/internals/engine-is-node.js"); -var V8_VERSION = __webpack_require__(/*! ../internals/engine-v8-version */ "../../node_modules/core-js/internals/engine-v8-version.js"); - -var SPECIES = wellKnownSymbol('species'); -var PROMISE = 'Promise'; - -var getInternalState = InternalStateModule.get; -var setInternalState = InternalStateModule.set; -var getInternalPromiseState = InternalStateModule.getterFor(PROMISE); -var NativePromisePrototype = NativePromise && NativePromise.prototype; -var PromiseConstructor = NativePromise; -var PromisePrototype = NativePromisePrototype; -var TypeError = global.TypeError; -var document = global.document; -var process = global.process; -var newPromiseCapability = newPromiseCapabilityModule.f; -var newGenericPromiseCapability = newPromiseCapability; - -var DISPATCH_EVENT = !!(document && document.createEvent && global.dispatchEvent); -var NATIVE_REJECTION_EVENT = isCallable(global.PromiseRejectionEvent); -var UNHANDLED_REJECTION = 'unhandledrejection'; -var REJECTION_HANDLED = 'rejectionhandled'; -var PENDING = 0; -var FULFILLED = 1; -var REJECTED = 2; -var HANDLED = 1; -var UNHANDLED = 2; -var SUBCLASSING = false; - -var Internal, OwnPromiseCapability, PromiseWrapper, nativeThen; - -var FORCED = isForced(PROMISE, function () { - var PROMISE_CONSTRUCTOR_SOURCE = inspectSource(PromiseConstructor); - var GLOBAL_CORE_JS_PROMISE = PROMISE_CONSTRUCTOR_SOURCE !== String(PromiseConstructor); - // V8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables - // https://bugs.chromium.org/p/chromium/issues/detail?id=830565 - // We can't detect it synchronously, so just check versions - if (!GLOBAL_CORE_JS_PROMISE && V8_VERSION === 66) return true; - // We need Promise#finally in the pure version for preventing prototype pollution - if (IS_PURE && !PromisePrototype['finally']) return true; - // We can't use @@species feature detection in V8 since it causes - // deoptimization and performance degradation - // https://github.com/zloirock/core-js/issues/679 - if (V8_VERSION >= 51 && /native code/.test(PROMISE_CONSTRUCTOR_SOURCE)) return false; - // Detect correctness of subclassing with @@species support - var promise = new PromiseConstructor(function (resolve) { resolve(1); }); - var FakePromise = function (exec) { - exec(function () { /* empty */ }, function () { /* empty */ }); - }; - var constructor = promise.constructor = {}; - constructor[SPECIES] = FakePromise; - SUBCLASSING = promise.then(function () { /* empty */ }) instanceof FakePromise; - if (!SUBCLASSING) return true; - // Unhandled rejections tracking support, NodeJS Promise without it fails @@species test - return !GLOBAL_CORE_JS_PROMISE && IS_BROWSER && !NATIVE_REJECTION_EVENT; -}); - -var INCORRECT_ITERATION = FORCED || !checkCorrectnessOfIteration(function (iterable) { - PromiseConstructor.all(iterable)['catch'](function () { /* empty */ }); -}); - -// helpers -var isThenable = function (it) { - var then; - return isObject(it) && isCallable(then = it.then) ? then : false; -}; - -var notify = function (state, isReject) { - if (state.notified) return; - state.notified = true; - var chain = state.reactions; - microtask(function () { - var value = state.value; - var ok = state.state == FULFILLED; - var index = 0; - // variable length - can't use forEach - while (chain.length > index) { - var reaction = chain[index++]; - var handler = ok ? reaction.ok : reaction.fail; - var resolve = reaction.resolve; - var reject = reaction.reject; - var domain = reaction.domain; - var result, then, exited; - try { - if (handler) { - if (!ok) { - if (state.rejection === UNHANDLED) onHandleUnhandled(state); - state.rejection = HANDLED; - } - if (handler === true) result = value; - else { - if (domain) domain.enter(); - result = handler(value); // can throw - if (domain) { - domain.exit(); - exited = true; - } - } - if (result === reaction.promise) { - reject(TypeError('Promise-chain cycle')); - } else if (then = isThenable(result)) { - call(then, result, resolve, reject); - } else resolve(result); - } else reject(value); - } catch (error) { - if (domain && !exited) domain.exit(); - reject(error); - } - } - state.reactions = []; - state.notified = false; - if (isReject && !state.rejection) onUnhandled(state); - }); -}; - -var dispatchEvent = function (name, promise, reason) { - var event, handler; - if (DISPATCH_EVENT) { - event = document.createEvent('Event'); - event.promise = promise; - event.reason = reason; - event.initEvent(name, false, true); - global.dispatchEvent(event); - } else event = { promise: promise, reason: reason }; - if (!NATIVE_REJECTION_EVENT && (handler = global['on' + name])) handler(event); - else if (name === UNHANDLED_REJECTION) hostReportErrors('Unhandled promise rejection', reason); -}; - -var onUnhandled = function (state) { - call(task, global, function () { - var promise = state.facade; - var value = state.value; - var IS_UNHANDLED = isUnhandled(state); - var result; - if (IS_UNHANDLED) { - result = perform(function () { - if (IS_NODE) { - process.emit('unhandledRejection', value, promise); - } else dispatchEvent(UNHANDLED_REJECTION, promise, value); - }); - // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should - state.rejection = IS_NODE || isUnhandled(state) ? UNHANDLED : HANDLED; - if (result.error) throw result.value; - } - }); -}; - -var isUnhandled = function (state) { - return state.rejection !== HANDLED && !state.parent; -}; - -var onHandleUnhandled = function (state) { - call(task, global, function () { - var promise = state.facade; - if (IS_NODE) { - process.emit('rejectionHandled', promise); - } else dispatchEvent(REJECTION_HANDLED, promise, state.value); - }); -}; - -var bind = function (fn, state, unwrap) { - return function (value) { - fn(state, value, unwrap); - }; -}; - -var internalReject = function (state, value, unwrap) { - if (state.done) return; - state.done = true; - if (unwrap) state = unwrap; - state.value = value; - state.state = REJECTED; - notify(state, true); -}; - -var internalResolve = function (state, value, unwrap) { - if (state.done) return; - state.done = true; - if (unwrap) state = unwrap; - try { - if (state.facade === value) throw TypeError("Promise can't be resolved itself"); - var then = isThenable(value); - if (then) { - microtask(function () { - var wrapper = { done: false }; - try { - call(then, value, - bind(internalResolve, wrapper, state), - bind(internalReject, wrapper, state) - ); - } catch (error) { - internalReject(wrapper, error, state); - } - }); - } else { - state.value = value; - state.state = FULFILLED; - notify(state, false); - } - } catch (error) { - internalReject({ done: false }, error, state); - } -}; - -// constructor polyfill -if (FORCED) { - // 25.4.3.1 Promise(executor) - PromiseConstructor = function Promise(executor) { - anInstance(this, PromisePrototype); - aCallable(executor); - call(Internal, this); - var state = getInternalState(this); - try { - executor(bind(internalResolve, state), bind(internalReject, state)); - } catch (error) { - internalReject(state, error); - } - }; - PromisePrototype = PromiseConstructor.prototype; - // eslint-disable-next-line no-unused-vars -- required for `.length` - Internal = function Promise(executor) { - setInternalState(this, { - type: PROMISE, - done: false, - notified: false, - parent: false, - reactions: [], - rejection: false, - state: PENDING, - value: undefined - }); - }; - Internal.prototype = redefineAll(PromisePrototype, { - // `Promise.prototype.then` method - // https://tc39.es/ecma262/#sec-promise.prototype.then - then: function then(onFulfilled, onRejected) { - var state = getInternalPromiseState(this); - var reactions = state.reactions; - var reaction = newPromiseCapability(speciesConstructor(this, PromiseConstructor)); - reaction.ok = isCallable(onFulfilled) ? onFulfilled : true; - reaction.fail = isCallable(onRejected) && onRejected; - reaction.domain = IS_NODE ? process.domain : undefined; - state.parent = true; - reactions[reactions.length] = reaction; - if (state.state != PENDING) notify(state, false); - return reaction.promise; - }, - // `Promise.prototype.catch` method - // https://tc39.es/ecma262/#sec-promise.prototype.catch - 'catch': function (onRejected) { - return this.then(undefined, onRejected); - } - }); - OwnPromiseCapability = function () { - var promise = new Internal(); - var state = getInternalState(promise); - this.promise = promise; - this.resolve = bind(internalResolve, state); - this.reject = bind(internalReject, state); - }; - newPromiseCapabilityModule.f = newPromiseCapability = function (C) { - return C === PromiseConstructor || C === PromiseWrapper - ? new OwnPromiseCapability(C) - : newGenericPromiseCapability(C); - }; - - if (!IS_PURE && isCallable(NativePromise) && NativePromisePrototype !== Object.prototype) { - nativeThen = NativePromisePrototype.then; - - if (!SUBCLASSING) { - // make `Promise#then` return a polyfilled `Promise` for native promise-based APIs - redefine(NativePromisePrototype, 'then', function then(onFulfilled, onRejected) { - var that = this; - return new PromiseConstructor(function (resolve, reject) { - call(nativeThen, that, resolve, reject); - }).then(onFulfilled, onRejected); - // https://github.com/zloirock/core-js/issues/640 - }, { unsafe: true }); - - // makes sure that native promise-based APIs `Promise#catch` properly works with patched `Promise#then` - redefine(NativePromisePrototype, 'catch', PromisePrototype['catch'], { unsafe: true }); - } - - // make `.constructor === Promise` work for native promise-based APIs - try { - delete NativePromisePrototype.constructor; - } catch (error) { /* empty */ } - - // make `instanceof Promise` work for native promise-based APIs - if (setPrototypeOf) { - setPrototypeOf(NativePromisePrototype, PromisePrototype); - } - } -} - -$({ global: true, wrap: true, forced: FORCED }, { - Promise: PromiseConstructor -}); - -setToStringTag(PromiseConstructor, PROMISE, false, true); -setSpecies(PROMISE); - -PromiseWrapper = getBuiltIn(PROMISE); - -// statics -$({ target: PROMISE, stat: true, forced: FORCED }, { - // `Promise.reject` method - // https://tc39.es/ecma262/#sec-promise.reject - reject: function reject(r) { - var capability = newPromiseCapability(this); - call(capability.reject, undefined, r); - return capability.promise; - } -}); - -$({ target: PROMISE, stat: true, forced: IS_PURE || FORCED }, { - // `Promise.resolve` method - // https://tc39.es/ecma262/#sec-promise.resolve - resolve: function resolve(x) { - return promiseResolve(IS_PURE && this === PromiseWrapper ? PromiseConstructor : this, x); - } -}); - -$({ target: PROMISE, stat: true, forced: INCORRECT_ITERATION }, { - // `Promise.all` method - // https://tc39.es/ecma262/#sec-promise.all - all: function all(iterable) { - var C = this; - var capability = newPromiseCapability(C); - var resolve = capability.resolve; - var reject = capability.reject; - var result = perform(function () { - var $promiseResolve = aCallable(C.resolve); - var values = []; - var counter = 0; - var remaining = 1; - iterate(iterable, function (promise) { - var index = counter++; - var alreadyCalled = false; - remaining++; - call($promiseResolve, C, promise).then(function (value) { - if (alreadyCalled) return; - alreadyCalled = true; - values[index] = value; - --remaining || resolve(values); - }, reject); - }); - --remaining || resolve(values); - }); - if (result.error) reject(result.value); - return capability.promise; - }, - // `Promise.race` method - // https://tc39.es/ecma262/#sec-promise.race - race: function race(iterable) { - var C = this; - var capability = newPromiseCapability(C); - var reject = capability.reject; - var result = perform(function () { - var $promiseResolve = aCallable(C.resolve); - iterate(iterable, function (promise) { - call($promiseResolve, C, promise).then(capability.resolve, reject); - }); - }); - if (result.error) reject(result.value); - return capability.promise; - } -}); - - -/***/ }), - -/***/ "../../node_modules/core-js/modules/es.string.iterator.js": -/*!****************************************************************!*\ - !*** ../../node_modules/core-js/modules/es.string.iterator.js ***! - \****************************************************************/ -/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - -var charAt = (__webpack_require__(/*! ../internals/string-multibyte */ "../../node_modules/core-js/internals/string-multibyte.js").charAt); -var toString = __webpack_require__(/*! ../internals/to-string */ "../../node_modules/core-js/internals/to-string.js"); -var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "../../node_modules/core-js/internals/internal-state.js"); -var defineIterator = __webpack_require__(/*! ../internals/define-iterator */ "../../node_modules/core-js/internals/define-iterator.js"); - -var STRING_ITERATOR = 'String Iterator'; -var setInternalState = InternalStateModule.set; -var getInternalState = InternalStateModule.getterFor(STRING_ITERATOR); - -// `String.prototype[@@iterator]` method -// https://tc39.es/ecma262/#sec-string.prototype-@@iterator -defineIterator(String, 'String', function (iterated) { - setInternalState(this, { - type: STRING_ITERATOR, - string: toString(iterated), - index: 0 - }); -// `%StringIteratorPrototype%.next` method -// https://tc39.es/ecma262/#sec-%stringiteratorprototype%.next -}, function next() { - var state = getInternalState(this); - var string = state.string; - var index = state.index; - var point; - if (index >= string.length) return { value: undefined, done: true }; - point = charAt(string, index); - state.index += point.length; - return { value: point, done: false }; -}); - - -/***/ }), - /***/ "../../node_modules/guid/guid.js": /*!***************************************!*\ !*** ../../node_modules/guid/guid.js ***! @@ -5243,42 +78,22 @@ defineIterator(String, 'String', function (iterated) { /*!*********************************************************************!*\ !*** ./lib/src/ExtensionsApi/Events/DashboardLayoutChangedEvent.js ***! \*********************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; -var __extends = (this && this.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); Object.defineProperty(exports, "__esModule", ({ value: true })); -var Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -var TableauEvent_1 = __webpack_require__(/*! ./TableauEvent */ "./lib/src/ExtensionsApi/Events/TableauEvent.js"); -var DashboardLayoutChangedEvent = /** @class */ (function (_super) { - __extends(DashboardLayoutChangedEvent, _super); - function DashboardLayoutChangedEvent(_dashboardLayoutChangeDetails) { - var _this = _super.call(this, Contract.TableauEventType.DashboardLayoutChanged) || this; - _this._dashboardLayoutChangeDetails = _dashboardLayoutChangeDetails; - return _this; - } - Object.defineProperty(DashboardLayoutChangedEvent.prototype, "dashboardLayoutChangeDetails", { - get: function () { - return this._dashboardLayoutChangeDetails; - }, - enumerable: true, - configurable: true - }); - return DashboardLayoutChangedEvent; -}(TableauEvent_1.TableauEvent)); +const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const TableauEvent_1 = __webpack_require__(/*! ./TableauEvent */ "./lib/src/ExtensionsApi/Events/TableauEvent.js"); +class DashboardLayoutChangedEvent extends TableauEvent_1.TableauEvent { + constructor(_dashboardLayoutChangeDetails) { + super(Contract.TableauEventType.DashboardLayoutChanged); + this._dashboardLayoutChangeDetails = _dashboardLayoutChangeDetails; + } + get dashboardLayoutChangeDetails() { + return this._dashboardLayoutChangeDetails; + } +} exports.DashboardLayoutChangedEvent = DashboardLayoutChangedEvent; @@ -5288,66 +103,41 @@ exports.DashboardLayoutChangedEvent = DashboardLayoutChangedEvent; /*!************************************************************!*\ !*** ./lib/src/ExtensionsApi/Events/FilterChangedEvent.js ***! \************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; -var __extends = (this && this.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); Object.defineProperty(exports, "__esModule", ({ value: true })); -var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); -var TableauWorksheetEvent_1 = __webpack_require__(/*! ./TableauWorksheetEvent */ "./lib/src/ExtensionsApi/Events/TableauWorksheetEvent.js"); -var FilterChangedEvent = /** @class */ (function (_super) { - __extends(FilterChangedEvent, _super); - function FilterChangedEvent(worksheet, _fieldName, _fieldId) { - var _this = _super.call(this, api_external_contract_js_1.TableauEventType.FilterChanged, worksheet) || this; - _this._fieldName = _fieldName; - _this._fieldId = _fieldId; - return _this; - } - Object.defineProperty(FilterChangedEvent.prototype, "fieldName", { - get: function () { - return this._fieldName; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(FilterChangedEvent.prototype, "fieldId", { - get: function () { - return this._fieldId; - }, - enumerable: true, - configurable: true - }); - FilterChangedEvent.prototype.getFilterAsync = function () { - var _this = this; - return this._worksheet.getFiltersAsync().then(function (filters) { +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +const TableauWorksheetEvent_1 = __webpack_require__(/*! ./TableauWorksheetEvent */ "./lib/src/ExtensionsApi/Events/TableauWorksheetEvent.js"); +class FilterChangedEvent extends TableauWorksheetEvent_1.TableauWorksheetEvent { + constructor(worksheet, _fieldName, _fieldId) { + super(api_external_contract_js_1.TableauEventType.FilterChanged, worksheet); + this._fieldName = _fieldName; + this._fieldId = _fieldId; + } + get fieldName() { + return this._fieldName; + } + get fieldId() { + return this._fieldId; + } + getFilterAsync() { + return this._worksheet.getFiltersAsync().then((filters) => { // TODO: Filtering of the filters should eventually be done platform side. - var eventedFilter = _this.fieldId - ? filters.find(function (filter) { return filter.fieldId === _this.fieldId; }, _this) - : filters.find(function (filter) { return filter.fieldName === _this.fieldName; }, _this); + const eventedFilter = this.fieldId + ? filters.find((filter) => filter.fieldId === this.fieldId, this) + : filters.find((filter) => filter.fieldName === this.fieldName, this); if (!eventedFilter) { // We shouldn't hit this unless the filter was removed from the worksheet // after the event was raised. - throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.MissingFilter, "cannot find filter: " + _this._fieldName); + throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.MissingFilter, `cannot find filter: ${this._fieldName}`); } return eventedFilter; }); - }; - return FilterChangedEvent; -}(TableauWorksheetEvent_1.TableauWorksheetEvent)); + } +} exports.FilterChangedEvent = FilterChangedEvent; @@ -5357,36 +147,21 @@ exports.FilterChangedEvent = FilterChangedEvent; /*!************************************************************!*\ !*** ./lib/src/ExtensionsApi/Events/MarksSelectedEvent.js ***! \************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; -var __extends = (this && this.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); Object.defineProperty(exports, "__esModule", ({ value: true })); -var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -var TableauWorksheetEvent_1 = __webpack_require__(/*! ./TableauWorksheetEvent */ "./lib/src/ExtensionsApi/Events/TableauWorksheetEvent.js"); -var MarksSelectedEvent = /** @class */ (function (_super) { - __extends(MarksSelectedEvent, _super); - function MarksSelectedEvent(worksheet) { - return _super.call(this, api_external_contract_js_1.TableauEventType.MarkSelectionChanged, worksheet) || this; +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const TableauWorksheetEvent_1 = __webpack_require__(/*! ./TableauWorksheetEvent */ "./lib/src/ExtensionsApi/Events/TableauWorksheetEvent.js"); +class MarksSelectedEvent extends TableauWorksheetEvent_1.TableauWorksheetEvent { + constructor(worksheet) { + super(api_external_contract_js_1.TableauEventType.MarkSelectionChanged, worksheet); } - MarksSelectedEvent.prototype.getMarksAsync = function () { + getMarksAsync() { return this.worksheet.getSelectedMarksAsync(); - }; - return MarksSelectedEvent; -}(TableauWorksheetEvent_1.TableauWorksheetEvent)); + } +} exports.MarksSelectedEvent = MarksSelectedEvent; @@ -5396,49 +171,32 @@ exports.MarksSelectedEvent = MarksSelectedEvent; /*!***************************************************************!*\ !*** ./lib/src/ExtensionsApi/Events/ParameterChangedEvent.js ***! \***************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; -var __extends = (this && this.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); Object.defineProperty(exports, "__esModule", ({ value: true })); -var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); -var Parameter_1 = __webpack_require__(/*! ../Models/Parameter */ "./lib/src/ExtensionsApi/Models/Parameter.js"); -var ServiceRegistryUtil_1 = __webpack_require__(/*! ../Services/ServiceRegistryUtil */ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js"); -var TableauSheetEvent_1 = __webpack_require__(/*! ./TableauSheetEvent */ "./lib/src/ExtensionsApi/Events/TableauSheetEvent.js"); -var ParameterChangedEvent = /** @class */ (function (_super) { - __extends(ParameterChangedEvent, _super); - function ParameterChangedEvent(_globalFieldName, sheet) { - var _this = _super.call(this, api_external_contract_js_1.TableauEventType.ParameterChanged, sheet) || this; - _this._globalFieldName = _globalFieldName; - return _this; - } - ParameterChangedEvent.prototype.getParameterAsync = function () { - var _this = this; +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +const Parameter_1 = __webpack_require__(/*! ../Models/Parameter */ "./lib/src/ExtensionsApi/Models/Parameter.js"); +const ServiceRegistryUtil_1 = __webpack_require__(/*! ../Services/ServiceRegistryUtil */ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js"); +const TableauSheetEvent_1 = __webpack_require__(/*! ./TableauSheetEvent */ "./lib/src/ExtensionsApi/Events/TableauSheetEvent.js"); +class ParameterChangedEvent extends TableauSheetEvent_1.TableauSheetEvent { + constructor(_globalFieldName, sheet) { + super(api_external_contract_js_1.TableauEventType.ParameterChanged, sheet); + this._globalFieldName = _globalFieldName; + } + getParameterAsync() { // Call down to our service to get the parameter back via its field name - var service = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("parameters-service" /* Parameters */); - return service.findParameterByGlobalFieldNameAsync(this._globalFieldName).then(function (parameterImpl) { + const service = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("parameters-service" /* Parameters */); + return service.findParameterByGlobalFieldNameAsync(this._globalFieldName).then((parameterImpl) => { if (parameterImpl === undefined) { - throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.MissingParameter, "Cannot find parameter: " + _this._globalFieldName); + throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.MissingParameter, `Cannot find parameter: ${this._globalFieldName}`); } - return new Parameter_1.Parameter(parameterImpl, _this.sheet); + return new Parameter_1.Parameter(parameterImpl, this.sheet); }); - }; - return ParameterChangedEvent; -}(TableauSheetEvent_1.TableauSheetEvent)); + } +} exports.ParameterChangedEvent = ParameterChangedEvent; @@ -5448,33 +206,18 @@ exports.ParameterChangedEvent = ParameterChangedEvent; /*!*****************************************************************!*\ !*** ./lib/src/ExtensionsApi/Events/SummaryDataChangedEvent.js ***! \*****************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; -var __extends = (this && this.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); Object.defineProperty(exports, "__esModule", ({ value: true })); -var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -var TableauWorksheetEvent_1 = __webpack_require__(/*! ./TableauWorksheetEvent */ "./lib/src/ExtensionsApi/Events/TableauWorksheetEvent.js"); -var SummaryDataChangedEvent = /** @class */ (function (_super) { - __extends(SummaryDataChangedEvent, _super); - function SummaryDataChangedEvent(worksheet) { - return _super.call(this, api_external_contract_js_1.TableauEventType.SummaryDataChanged, worksheet) || this; - } - return SummaryDataChangedEvent; -}(TableauWorksheetEvent_1.TableauWorksheetEvent)); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const TableauWorksheetEvent_1 = __webpack_require__(/*! ./TableauWorksheetEvent */ "./lib/src/ExtensionsApi/Events/TableauWorksheetEvent.js"); +class SummaryDataChangedEvent extends TableauWorksheetEvent_1.TableauWorksheetEvent { + constructor(worksheet) { + super(api_external_contract_js_1.TableauEventType.SummaryDataChanged, worksheet); + } +} exports.SummaryDataChangedEvent = SummaryDataChangedEvent; @@ -5489,19 +232,14 @@ exports.SummaryDataChangedEvent = SummaryDataChangedEvent; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -var TableauEvent = /** @class */ (function () { - function TableauEvent(type) { +class TableauEvent { + constructor(type) { this._type = type; } - Object.defineProperty(TableauEvent.prototype, "type", { - get: function () { - return this._type; - }, - enumerable: true, - configurable: true - }); - return TableauEvent; -}()); + get type() { + return this._type; + } +} exports.TableauEvent = TableauEvent; @@ -5511,41 +249,21 @@ exports.TableauEvent = TableauEvent; /*!***********************************************************!*\ !*** ./lib/src/ExtensionsApi/Events/TableauSheetEvent.js ***! \***********************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; -var __extends = (this && this.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); Object.defineProperty(exports, "__esModule", ({ value: true })); -var TableauEvent_1 = __webpack_require__(/*! ./TableauEvent */ "./lib/src/ExtensionsApi/Events/TableauEvent.js"); -var TableauSheetEvent = /** @class */ (function (_super) { - __extends(TableauSheetEvent, _super); - function TableauSheetEvent(type, sheet) { - var _this = _super.call(this, type) || this; - _this._sheet = sheet; - return _this; - } - Object.defineProperty(TableauSheetEvent.prototype, "sheet", { - get: function () { - return this._sheet; - }, - enumerable: true, - configurable: true - }); - return TableauSheetEvent; -}(TableauEvent_1.TableauEvent)); +const TableauEvent_1 = __webpack_require__(/*! ./TableauEvent */ "./lib/src/ExtensionsApi/Events/TableauEvent.js"); +class TableauSheetEvent extends TableauEvent_1.TableauEvent { + constructor(type, sheet) { + super(type); + this._sheet = sheet; + } + get sheet() { + return this._sheet; + } +} exports.TableauSheetEvent = TableauSheetEvent; @@ -5555,41 +273,21 @@ exports.TableauSheetEvent = TableauSheetEvent; /*!***************************************************************!*\ !*** ./lib/src/ExtensionsApi/Events/TableauWorksheetEvent.js ***! \***************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; -var __extends = (this && this.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); Object.defineProperty(exports, "__esModule", ({ value: true })); -var TableauSheetEvent_1 = __webpack_require__(/*! ./TableauSheetEvent */ "./lib/src/ExtensionsApi/Events/TableauSheetEvent.js"); -var TableauWorksheetEvent = /** @class */ (function (_super) { - __extends(TableauWorksheetEvent, _super); - function TableauWorksheetEvent(type, _worksheet) { - var _this = _super.call(this, type, _worksheet) || this; - _this._worksheet = _worksheet; - return _this; - } - Object.defineProperty(TableauWorksheetEvent.prototype, "worksheet", { - get: function () { - return this._worksheet; - }, - enumerable: true, - configurable: true - }); - return TableauWorksheetEvent; -}(TableauSheetEvent_1.TableauSheetEvent)); +const TableauSheetEvent_1 = __webpack_require__(/*! ./TableauSheetEvent */ "./lib/src/ExtensionsApi/Events/TableauSheetEvent.js"); +class TableauWorksheetEvent extends TableauSheetEvent_1.TableauSheetEvent { + constructor(type, _worksheet) { + super(type, _worksheet); + this._worksheet = _worksheet; + } + get worksheet() { + return this._worksheet; + } +} exports.TableauWorksheetEvent = TableauWorksheetEvent; @@ -5599,42 +297,22 @@ exports.TableauWorksheetEvent = TableauWorksheetEvent; /*!************************************************************************!*\ !*** ./lib/src/ExtensionsApi/Events/WorkbookFormattingChangedEvent.js ***! \************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; -var __extends = (this && this.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); Object.defineProperty(exports, "__esModule", ({ value: true })); -var Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -var TableauEvent_1 = __webpack_require__(/*! ./TableauEvent */ "./lib/src/ExtensionsApi/Events/TableauEvent.js"); -var WorkbookFormattingChangedEvent = /** @class */ (function (_super) { - __extends(WorkbookFormattingChangedEvent, _super); - function WorkbookFormattingChangedEvent(_formatting) { - var _this = _super.call(this, Contract.TableauEventType.WorkbookFormattingChanged) || this; - _this._formatting = _formatting; - return _this; - } - Object.defineProperty(WorkbookFormattingChangedEvent.prototype, "formatting", { - get: function () { - return this._formatting; - }, - enumerable: true, - configurable: true - }); - return WorkbookFormattingChangedEvent; -}(TableauEvent_1.TableauEvent)); +const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const TableauEvent_1 = __webpack_require__(/*! ./TableauEvent */ "./lib/src/ExtensionsApi/Events/TableauEvent.js"); +class WorkbookFormattingChangedEvent extends TableauEvent_1.TableauEvent { + constructor(_formatting) { + super(Contract.TableauEventType.WorkbookFormattingChanged); + this._formatting = _formatting; + } + get formatting() { + return this._formatting; + } +} exports.WorkbookFormattingChangedEvent = WorkbookFormattingChangedEvent; @@ -5644,42 +322,22 @@ exports.WorkbookFormattingChangedEvent = WorkbookFormattingChangedEvent; /*!*************************************************************************!*\ !*** ./lib/src/ExtensionsApi/Events/WorksheetFormattingChangedEvent.js ***! \*************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; -var __extends = (this && this.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); Object.defineProperty(exports, "__esModule", ({ value: true })); -var Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -var TableauWorksheetEvent_1 = __webpack_require__(/*! ./TableauWorksheetEvent */ "./lib/src/ExtensionsApi/Events/TableauWorksheetEvent.js"); -var WorksheetFormattingChangedEvent = /** @class */ (function (_super) { - __extends(WorksheetFormattingChangedEvent, _super); - function WorksheetFormattingChangedEvent(worksheet, _formatting) { - var _this = _super.call(this, Contract.TableauEventType.WorksheetFormattingChanged, worksheet) || this; - _this._formatting = _formatting; - return _this; - } - Object.defineProperty(WorksheetFormattingChangedEvent.prototype, "formatting", { - get: function () { - return this._formatting; - }, - enumerable: true, - configurable: true - }); - return WorksheetFormattingChangedEvent; -}(TableauWorksheetEvent_1.TableauWorksheetEvent)); +const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const TableauWorksheetEvent_1 = __webpack_require__(/*! ./TableauWorksheetEvent */ "./lib/src/ExtensionsApi/Events/TableauWorksheetEvent.js"); +class WorksheetFormattingChangedEvent extends TableauWorksheetEvent_1.TableauWorksheetEvent { + constructor(worksheet, _formatting) { + super(Contract.TableauEventType.WorksheetFormattingChanged, worksheet); + this._formatting = _formatting; + } + get formatting() { + return this._formatting; + } +} exports.WorksheetFormattingChangedEvent = WorksheetFormattingChangedEvent; @@ -5723,43 +381,26 @@ exports.SupportedBentonSansFontFaces = [ "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -var ConnectedServer = /** @class */ (function () { - function ConnectedServer(_userId, _siteId, _siteNamespace, _workbookId) { +class ConnectedServer { + constructor(_userId, _siteId, _siteNamespace, _workbookId) { this._userId = _userId; this._siteId = _siteId; this._siteNamespace = _siteNamespace; this._workbookId = _workbookId; } - Object.defineProperty(ConnectedServer.prototype, "userId", { - get: function () { - return this._userId; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(ConnectedServer.prototype, "siteId", { - get: function () { - return this._siteId; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(ConnectedServer.prototype, "siteNamespace", { - get: function () { - return this._siteNamespace; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(ConnectedServer.prototype, "workbookId", { - get: function () { - return this._workbookId; - }, - enumerable: true, - configurable: true - }); - return ConnectedServer; -}()); + get userId() { + return this._userId; + } + get siteId() { + return this._siteId; + } + get siteNamespace() { + return this._siteNamespace; + } + get workbookId() { + return this._workbookId; + } +} exports.ConnectedServer = ConnectedServer; @@ -5769,52 +410,33 @@ exports.ConnectedServer = ConnectedServer; /*!*************************************************************!*\ !*** ./lib/src/ExtensionsApi/Impl/ExtensionWorkbookImpl.js ***! \*************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; -var __extends = (this && this.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); Object.defineProperty(exports, "__esModule", ({ value: true })); -var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); -var ServiceRegistryUtil_1 = __webpack_require__(/*! ../Services/ServiceRegistryUtil */ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js"); -var ExtensionWorkbookImpl = /** @class */ (function (_super) { - __extends(ExtensionWorkbookImpl, _super); - function ExtensionWorkbookImpl() { - return _super !== null && _super.apply(this, arguments) || this; - } - ExtensionWorkbookImpl.prototype.getAllDataSourcesAsync = function () { - var _this = this; - var service = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("data-source-service" /* DataSourceService */); - return service.getAllDataSourcesAsync().then(function (result) { - var dataSchema = result; - var dataSources = []; +const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +const ServiceRegistryUtil_1 = __webpack_require__(/*! ../Services/ServiceRegistryUtil */ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js"); +class ExtensionWorkbookImpl extends api_shared_js_1.WorkbookImpl { + getAllDataSourcesAsync() { + const service = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("data-source-service" /* DataSourceService */); + return service.getAllDataSourcesAsync().then((result) => { + const dataSchema = result; + const dataSources = []; // Loop through all data sources and add them. - Object.values(dataSchema.dataSources).forEach(function (ds) { - dataSources.push(_this.createDataSourceFromInfo(ds)); + Object.values(dataSchema.dataSources).forEach((ds) => { + dataSources.push(this.createDataSourceFromInfo(ds)); }); return dataSources; }); - }; - ExtensionWorkbookImpl.prototype.createDataSourceFromInfo = function (dataSourceInfo) { - var dataSourceImpl = new api_shared_js_1.DataSourceImpl(dataSourceInfo, ServiceRegistryUtil_1.ExtensionsRegistryId); - var dataSource = new api_shared_js_1.DataSource(dataSourceImpl); + } + createDataSourceFromInfo(dataSourceInfo) { + const dataSourceImpl = new api_shared_js_1.DataSourceImpl(dataSourceInfo, ServiceRegistryUtil_1.ExtensionsRegistryId); + const dataSource = new api_shared_js_1.DataSource(dataSourceImpl); dataSourceImpl.initializeWithPublicInterfaces(dataSource); return dataSource; - }; - return ExtensionWorkbookImpl; -}(api_shared_js_1.WorkbookImpl)); + } +} exports.ExtensionWorkbookImpl = ExtensionWorkbookImpl; @@ -5824,102 +446,91 @@ exports.ExtensionWorkbookImpl = ExtensionWorkbookImpl; /*!******************************************************!*\ !*** ./lib/src/ExtensionsApi/Impl/ExtensionsImpl.js ***! \******************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; -var __spreadArrays = (this && this.__spreadArrays) || function () { - for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; - for (var r = Array(s), k = 0, i = 0; i < il; i++) - for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) - r[k] = a[j]; - return r; -}; Object.defineProperty(exports, "__esModule", ({ value: true })); -var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); -var Dashboard_1 = __webpack_require__(/*! ../Models/Dashboard */ "./lib/src/ExtensionsApi/Models/Dashboard.js"); -var Workbook_1 = __webpack_require__(/*! ../Models/Workbook */ "./lib/src/ExtensionsApi/Models/Workbook.js"); -var Worksheet_1 = __webpack_require__(/*! ../Models/Worksheet */ "./lib/src/ExtensionsApi/Models/Worksheet.js"); -var DashboardContent_1 = __webpack_require__(/*! ../Namespaces/DashboardContent */ "./lib/src/ExtensionsApi/Namespaces/DashboardContent.js"); -var Environment_1 = __webpack_require__(/*! ../Namespaces/Environment */ "./lib/src/ExtensionsApi/Namespaces/Environment.js"); -var Settings_1 = __webpack_require__(/*! ../Namespaces/Settings */ "./lib/src/ExtensionsApi/Namespaces/Settings.js"); -var UI_1 = __webpack_require__(/*! ../Namespaces/UI */ "./lib/src/ExtensionsApi/Namespaces/UI.js"); -var WorkbookFormattingEnvUtil_1 = __webpack_require__(/*! ../Namespaces/WorkbookFormattingEnvUtil */ "./lib/src/ExtensionsApi/Namespaces/WorkbookFormattingEnvUtil.js"); -var WorksheetContent_1 = __webpack_require__(/*! ../Namespaces/WorksheetContent */ "./lib/src/ExtensionsApi/Namespaces/WorksheetContent.js"); -var RegisterAllExtensionsServices_1 = __webpack_require__(/*! ../Services/RegisterAllExtensionsServices */ "./lib/src/ExtensionsApi/Services/RegisterAllExtensionsServices.js"); -var ServiceRegistryUtil_1 = __webpack_require__(/*! ../Services/ServiceRegistryUtil */ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js"); -var BentonSansFontNameConstants_1 = __webpack_require__(/*! ./BentonSansFontNameConstants */ "./lib/src/ExtensionsApi/Impl/BentonSansFontNameConstants.js"); -var ExtensionWorkbookImpl_1 = __webpack_require__(/*! ./ExtensionWorkbookImpl */ "./lib/src/ExtensionsApi/Impl/ExtensionWorkbookImpl.js"); -var LegacyInternalApiDispatcherHolder_1 = __webpack_require__(/*! ./LegacyInternalApiDispatcherHolder */ "./lib/src/ExtensionsApi/Impl/LegacyInternalApiDispatcherHolder.js"); -var SettingsImpl_1 = __webpack_require__(/*! ./SettingsImpl */ "./lib/src/ExtensionsApi/Impl/SettingsImpl.js"); -var TableauBookFontNameConstants_1 = __webpack_require__(/*! ./TableauBookFontNameConstants */ "./lib/src/ExtensionsApi/Impl/TableauBookFontNameConstants.js"); -var UIImpl_1 = __webpack_require__(/*! ./UIImpl */ "./lib/src/ExtensionsApi/Impl/UIImpl.js"); -var ExtensionsImpl = /** @class */ (function () { - function ExtensionsImpl() { - } - ExtensionsImpl.prototype.initializeAsync = function (isExtensionDialog, contextMenuCallbacks) { - var _this = this; +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +const Dashboard_1 = __webpack_require__(/*! ../Models/Dashboard */ "./lib/src/ExtensionsApi/Models/Dashboard.js"); +const Workbook_1 = __webpack_require__(/*! ../Models/Workbook */ "./lib/src/ExtensionsApi/Models/Workbook.js"); +const Worksheet_1 = __webpack_require__(/*! ../Models/Worksheet */ "./lib/src/ExtensionsApi/Models/Worksheet.js"); +const DashboardContent_1 = __webpack_require__(/*! ../Namespaces/DashboardContent */ "./lib/src/ExtensionsApi/Namespaces/DashboardContent.js"); +const Environment_1 = __webpack_require__(/*! ../Namespaces/Environment */ "./lib/src/ExtensionsApi/Namespaces/Environment.js"); +const Settings_1 = __webpack_require__(/*! ../Namespaces/Settings */ "./lib/src/ExtensionsApi/Namespaces/Settings.js"); +const UI_1 = __webpack_require__(/*! ../Namespaces/UI */ "./lib/src/ExtensionsApi/Namespaces/UI.js"); +const WorkbookFormattingEnvUtil_1 = __webpack_require__(/*! ../Namespaces/WorkbookFormattingEnvUtil */ "./lib/src/ExtensionsApi/Namespaces/WorkbookFormattingEnvUtil.js"); +const WorksheetContent_1 = __webpack_require__(/*! ../Namespaces/WorksheetContent */ "./lib/src/ExtensionsApi/Namespaces/WorksheetContent.js"); +const RegisterAllExtensionsServices_1 = __webpack_require__(/*! ../Services/RegisterAllExtensionsServices */ "./lib/src/ExtensionsApi/Services/RegisterAllExtensionsServices.js"); +const ServiceRegistryUtil_1 = __webpack_require__(/*! ../Services/ServiceRegistryUtil */ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js"); +const BentonSansFontNameConstants_1 = __webpack_require__(/*! ./BentonSansFontNameConstants */ "./lib/src/ExtensionsApi/Impl/BentonSansFontNameConstants.js"); +const ExtensionWorkbookImpl_1 = __webpack_require__(/*! ./ExtensionWorkbookImpl */ "./lib/src/ExtensionsApi/Impl/ExtensionWorkbookImpl.js"); +const LegacyInternalApiDispatcherHolder_1 = __webpack_require__(/*! ./LegacyInternalApiDispatcherHolder */ "./lib/src/ExtensionsApi/Impl/LegacyInternalApiDispatcherHolder.js"); +const SettingsImpl_1 = __webpack_require__(/*! ./SettingsImpl */ "./lib/src/ExtensionsApi/Impl/SettingsImpl.js"); +const TableauBookFontNameConstants_1 = __webpack_require__(/*! ./TableauBookFontNameConstants */ "./lib/src/ExtensionsApi/Impl/TableauBookFontNameConstants.js"); +const UIImpl_1 = __webpack_require__(/*! ./UIImpl */ "./lib/src/ExtensionsApi/Impl/UIImpl.js"); +class ExtensionsImpl { + initializeAsync(isExtensionDialog, contextMenuCallbacks) { if (!this._initializationPromise) { - this._initializationPromise = new Promise(function (resolve, reject) { + this._initializationPromise = new Promise((resolve, reject) => { var _a; - var initOptions = { isAlpha: api_shared_js_1.ApiVersion.Instance.isAlpha }; + const initOptions = { isAlpha: api_shared_js_1.ApiVersion.Instance.isAlpha }; // First thing we want to do is check to see if there is a desktop dispatcher already registered for us if (LegacyInternalApiDispatcherHolder_1.LegacyInternalApiDispatcherHolder.hasDesktopApiDispatcherPromise(initOptions)) { // Running in a pre-2019.3 desktop, use our legacy dispatcher promise - var desktopDispatcherPromise = LegacyInternalApiDispatcherHolder_1.LegacyInternalApiDispatcherHolder.getDesktopDispatcherPromise(initOptions); - (_a = desktopDispatcherPromise) === null || _a === void 0 ? void 0 : _a.then(function (dispatcherFactory) { return _this.onDispatcherReceived(dispatcherFactory, isExtensionDialog, contextMenuCallbacks); }).then(function (openPayload) { + const desktopDispatcherPromise = LegacyInternalApiDispatcherHolder_1.LegacyInternalApiDispatcherHolder.getDesktopDispatcherPromise(initOptions); + (_a = desktopDispatcherPromise) === null || _a === void 0 ? void 0 : _a.then((dispatcherFactory) => this.onDispatcherReceived(dispatcherFactory, isExtensionDialog, contextMenuCallbacks)).then((openPayload) => { resolve(openPayload); - }).catch(function (error) { + }).catch((error) => { reject(error); }); } else { // We must be running in server, so we should try to kick of the server dispatcher bootstrapping - var onDispatcherReceivedCallback_1 = _this.onDispatcherReceived.bind(_this); + const onDispatcherReceivedCallback = this.onDispatcherReceived.bind(this); api_shared_js_1.doCrossFrameBootstrap(window, api_internal_contract_js_1.INTERNAL_CONTRACT_VERSION, initOptions) - .then(function (factory) { - return onDispatcherReceivedCallback_1(factory, isExtensionDialog, contextMenuCallbacks); + .then((factory) => { + return onDispatcherReceivedCallback(factory, isExtensionDialog, contextMenuCallbacks); }) - .then(function (openPayload) { + .then((openPayload) => { resolve(openPayload); }) - .catch(function (error) { + .catch((error) => { reject(error); }); } }); } return this._initializationPromise; - }; - ExtensionsImpl.prototype.createVizImageAsync = function (inputSpec) { - var vizService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("viz-service" /* Viz */); + } + createVizImageAsync(inputSpec) { + const vizService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("viz-service" /* Viz */); return vizService.createVizImageAsync(inputSpec); - }; - ExtensionsImpl.prototype.setClickThroughAsync = function (clickThroughEnabled) { - var uiService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("UIService" /* UIService */); + } + setClickThroughAsync(clickThroughEnabled) { + const uiService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("UIService" /* UIService */); return uiService.setClickThroughAsync(clickThroughEnabled, this.extensionZoneId); - }; - ExtensionsImpl.prototype.isDashboardExtensionLocator = function (locator) { - var dashboardExtensionLocator = locator; + } + isDashboardExtensionLocator(locator) { + const dashboardExtensionLocator = locator; if (!dashboardExtensionLocator.dashboardPath) { throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, 'Unexpected error during initialization.'); } return true; - }; - ExtensionsImpl.prototype.onDispatcherReceived = function (dispatcherFactory, isExtensionDialog, contextMenuFunctions) { - var _this = this; - var dispatcher = dispatcherFactory(api_internal_contract_js_1.INTERNAL_CONTRACT_VERSION); + } + onDispatcherReceived(dispatcherFactory, isExtensionDialog, contextMenuFunctions) { + let dispatcher = dispatcherFactory(api_internal_contract_js_1.INTERNAL_CONTRACT_VERSION); // Call to register all the services which will use the newly initialized dispatcher RegisterAllExtensionsServices_1.registerInitializationExtensionsServices(dispatcher); // Get the initialization service and initialize this extension - var initializationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("InitializationService" /* InitializationService */); - var callbackMapKeys = contextMenuFunctions ? Object.keys(contextMenuFunctions) : []; - return initializationService.initializeDashboardExtensionsAsync(isExtensionDialog, callbackMapKeys).then(function (result) { + const initializationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("InitializationService" /* InitializationService */); + const callbackMapKeys = contextMenuFunctions ? Object.keys(contextMenuFunctions) : []; + return initializationService.initializeDashboardExtensionsAsync(isExtensionDialog, callbackMapKeys).then((result) => { // If we receive an invalid plaform version, this means that platform is runnning 1.4 or 2.1 and // doesn't pass the platform version to external. In this case we assume the platform version to be 1.9 - var platformVersion = result.extensionEnvironment.platformVersion + const platformVersion = result.extensionEnvironment.platformVersion ? result.extensionEnvironment.platformVersion : { major: 1, minor: 9, fix: 0 }; // Wrap our existing dispatcher in a dispatcher that can downgrade/upgrade for an older platform. @@ -5930,34 +541,33 @@ var ExtensionsImpl = /** @class */ (function () { // Extensions doesn't need to pass in a registryId. By default, the service registry instance is associated with registryId=0. api_shared_js_1.registerAllSharedServices(dispatcher, ServiceRegistryUtil_1.ExtensionsRegistryId); RegisterAllExtensionsServices_1.registerAllExtensionsServices(dispatcher); - if (result.extensionDashboardInfo && _this.isDashboardExtensionLocator(result.extensionInstance.locator)) { - _this.dashboardContent = _this.initializeDashboardContent(result.extensionDashboardInfo, result.extensionInstance.locator.dashboardPath); - _this.extensionZoneId = result.extensionDashboardInfo.extensionZoneId; + if (result.extensionDashboardInfo && this.isDashboardExtensionLocator(result.extensionInstance.locator)) { + this.dashboardContent = this.initializeDashboardContent(result.extensionDashboardInfo, result.extensionInstance.locator.dashboardPath); + this.extensionZoneId = result.extensionDashboardInfo.extensionZoneId; } if (result.extensionWorksheetInfo) { - _this.worksheetContent = _this.initializeWorksheetContent(result.extensionWorksheetInfo); + this.worksheetContent = this.initializeWorksheetContent(result.extensionWorksheetInfo); } - _this.environment = new Environment_1.Environment(result.extensionEnvironment); - _this.settings = _this.initializeSettings(result.extensionSettingsInfo); - _this.ui = new UI_1.UI(new UIImpl_1.UIImpl()); - _this.workbook = new Workbook_1.Workbook(new ExtensionWorkbookImpl_1.ExtensionWorkbookImpl()); + this.environment = new Environment_1.Environment(result.extensionEnvironment); + this.settings = this.initializeSettings(result.extensionSettingsInfo); + this.ui = new UI_1.UI(new UIImpl_1.UIImpl()); + this.workbook = new Workbook_1.Workbook(new ExtensionWorkbookImpl_1.ExtensionWorkbookImpl()); if (result.extensionEnvironment.workbookFormatting) { - _this.initializeTableauFonts(dispatcher, result.extensionEnvironment.workbookFormatting); - _this.applyAllFormatting(result.extensionEnvironment.workbookFormatting); + this.initializeTableauFonts(dispatcher, result.extensionEnvironment.workbookFormatting); + this.applyAllFormatting(result.extensionEnvironment.workbookFormatting); } // After initialization has completed, setup listeners for the callback functions that // are meant to be triggered whenever a context menu item is clicked. - _this.initializeContextMenuCallbacks(contextMenuFunctions); + this.initializeContextMenuCallbacks(contextMenuFunctions); // Also set up listeners for ExtensionStylesChangedEvent - _this.initializeWorkbookFormattingChangedEventCallback(dispatcher); + this.initializeWorkbookFormattingChangedEventCallback(dispatcher); // In the normal initialization case, this will be an empty string. When returning from initializeAsync to the // developer, we just ingore that string. In the case of initializing from an extension dialog, this string // is an optional payload sent from the parent extension. return result.extensionDialogPayload; }); - }; - ExtensionsImpl.prototype.applyAllFormatting = function (formattingModel) { - var _this = this; + } + applyAllFormatting(formattingModel) { if (!this._styleElement) { this._styleElement = document.createElement('style'); this._styleElement.id = 'Tableau-Extension-Formatting'; @@ -5966,17 +576,17 @@ var ExtensionsImpl = /** @class */ (function () { if (!this._styleElement.sheet || !formattingModel) { return; } - var stylesheet = this._styleElement.sheet; + const stylesheet = this._styleElement.sheet; while (stylesheet.cssRules.length > 0) { stylesheet.deleteRule(stylesheet.cssRules.length - 1); } - formattingModel.formattingSheets.map(function (currentFormattingSheet) { - _this.applyFormattingSheetToStyleSheet(currentFormattingSheet, stylesheet); + formattingModel.formattingSheets.map((currentFormattingSheet) => { + this.applyFormattingSheetToStyleSheet(currentFormattingSheet, stylesheet); }); - }; - ExtensionsImpl.prototype.applyFormattingSheetToStyleSheet = function (currentFormattingSheet, stylesheet) { - var styleInfo = ''; - var cssProperties = currentFormattingSheet.cssProperties; + } + applyFormattingSheetToStyleSheet(currentFormattingSheet, stylesheet) { + let styleInfo = ''; + const cssProperties = currentFormattingSheet.cssProperties; if (cssProperties.fontFamily) { styleInfo += 'font-family: ' + cssProperties.fontFamily.toString() + '; '; } @@ -5995,94 +605,90 @@ var ExtensionsImpl = /** @class */ (function () { if (cssProperties.color) { styleInfo += 'color: ' + cssProperties.color + '; '; } - var selector = '.' + currentFormattingSheet.classNameKey; - var rule = selector + ' { ' + styleInfo + ' }'; + const selector = '.' + currentFormattingSheet.classNameKey; + const rule = selector + ' { ' + styleInfo + ' }'; stylesheet.insertRule(rule, stylesheet.cssRules.length); - }; - ExtensionsImpl.prototype.initializeWorkbookFormattingChangedEventCallback = function (dispatcher) { - var _this = this; - var notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("notification-service" /* Notification */); + } + initializeWorkbookFormattingChangedEventCallback(dispatcher) { + const notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("notification-service" /* Notification */); // Unregister function not used since these notifications should be // observed for the full lifetime of the extension. - notificationService.registerHandler(api_internal_contract_js_1.NotificationId.WorkbookFormattingChanged, function () { return true; }, function (eventFormatting) { + notificationService.registerHandler(api_internal_contract_js_1.NotificationId.WorkbookFormattingChanged, () => true, (eventFormatting) => { if (eventFormatting) { - _this.initializeTableauFonts(dispatcher, eventFormatting); - _this.applyAllFormatting(eventFormatting); + this.initializeTableauFonts(dispatcher, eventFormatting); + this.applyAllFormatting(eventFormatting); } }); - }; - ExtensionsImpl.prototype.initializeTableauFonts = function (dispatcher, workbookFormatting) { - var _a; - var _this = this; - var fontNames = __spreadArrays(BentonSansFontNameConstants_1.SupportedBentonSansFontFaces, TableauBookFontNameConstants_1.SupportedTableauFontFaces); - workbookFormatting.formattingSheets.forEach(function (formattingSheet) { + } + initializeTableauFonts(dispatcher, workbookFormatting) { + const fontNames = [...BentonSansFontNameConstants_1.SupportedBentonSansFontFaces, ...TableauBookFontNameConstants_1.SupportedTableauFontFaces]; + workbookFormatting.formattingSheets.forEach((formattingSheet) => { if (formattingSheet.cssProperties.fontFamily) { fontNames.push(formattingSheet.cssProperties.fontFamily); } }); if (fontNames.length > 0) { - var parameters = (_a = {}, _a[api_internal_contract_js_1.ParameterId.FontNameListItems] = fontNames, _a); + const parameters = { [api_internal_contract_js_1.ParameterId.FontNameListItems]: fontNames }; dispatcher .execute(api_internal_contract_js_1.VerbId.GetFonts, parameters) - .then(function (response) { - _this.loadFonts(response.result); + .then((response) => { + this.loadFonts(response.result); }) .catch(); } - }; - ExtensionsImpl.prototype.loadFonts = function (fonts) { - var _this = this; - fonts.forEach(function (fontNameAndInfo) { + } + loadFonts(fonts) { + fonts.forEach((fontNameAndInfo) => { if (TableauBookFontNameConstants_1.SupportedTableauFontFaces.includes(fontNameAndInfo.fontName)) { - _this.loadTableauFonts(fontNameAndInfo); + this.loadTableauFonts(fontNameAndInfo); } else if (BentonSansFontNameConstants_1.SupportedBentonSansFontFaces.includes(fontNameAndInfo.fontName)) { - _this.loadBentonSansFonts(fontNameAndInfo); + this.loadBentonSansFonts(fontNameAndInfo); } else { document.fonts.add(new FontFace(fontNameAndInfo.fontName, fontNameAndInfo.fontBinaryInfo)); } }); - }; - ExtensionsImpl.prototype.initializeDashboardContent = function (info, sheetPath) { + } + initializeDashboardContent(info, sheetPath) { // sheets are always active for Extensions - var sheetInfoImpl = new api_shared_js_1.SheetInfoImpl(info.name, api_external_contract_js_1.SheetType.Dashboard, { width: info.size.w, height: info.size.h }, undefined, true); - var dashboardImpl = new api_shared_js_1.DashboardImpl(sheetInfoImpl, info.zones, sheetPath, ServiceRegistryUtil_1.ExtensionsRegistryId, null, info.activeDashboardObjectId); - var dashboard = new Dashboard_1.Dashboard(dashboardImpl); + const sheetInfoImpl = new api_shared_js_1.SheetInfoImpl(info.name, api_external_contract_js_1.SheetType.Dashboard, { width: info.size.w, height: info.size.h }, undefined, true); + const dashboardImpl = new api_shared_js_1.DashboardImpl(sheetInfoImpl, info.zones, sheetPath, ServiceRegistryUtil_1.ExtensionsRegistryId, null, info.activeDashboardObjectId); + const dashboard = new Dashboard_1.Dashboard(dashboardImpl); return new DashboardContent_1.DashboardContent(dashboard); - }; - ExtensionsImpl.prototype.initializeWorksheetContent = function (info) { - var sheetInfoImpl = new api_shared_js_1.SheetInfoImpl(info.visualId.worksheet, api_external_contract_js_1.SheetType.Worksheet, { width: info.size.w, height: info.size.h }, undefined, // index property is embedding specific + } + initializeWorksheetContent(info) { + const sheetInfoImpl = new api_shared_js_1.SheetInfoImpl(info.visualId.worksheet, api_external_contract_js_1.SheetType.Worksheet, { width: info.size.w, height: info.size.h }, undefined, // index property is embedding specific true); - var worksheetImpl = new api_shared_js_1.WorksheetImpl(sheetInfoImpl, ServiceRegistryUtil_1.ExtensionsRegistryId, info.visualId, null, // parentDashboard is always null for worksheet in WorksheetContent + const worksheetImpl = new api_shared_js_1.WorksheetImpl(sheetInfoImpl, ServiceRegistryUtil_1.ExtensionsRegistryId, info.visualId, null, // parentDashboard is always null for worksheet in WorksheetContent null, // parentStoryPoint is only used for embedding info.backgroundColor, WorkbookFormattingEnvUtil_1.WorkbookFormattingEnvUtil.convertToWorkbookFormatting(info.formatting)); - var worksheet = new Worksheet_1.Worksheet(worksheetImpl); + const worksheet = new Worksheet_1.Worksheet(worksheetImpl); return new WorksheetContent_1.WorksheetContent(worksheet); - }; - ExtensionsImpl.prototype.initializeSettings = function (settingsInfo) { - var settingsImpl = new SettingsImpl_1.SettingsImpl(settingsInfo); + } + initializeSettings(settingsInfo) { + const settingsImpl = new SettingsImpl_1.SettingsImpl(settingsInfo); return new Settings_1.Settings(settingsImpl); - }; - ExtensionsImpl.prototype.initializeContextMenuCallbacks = function (contextMenuFunctions) { - var notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("notification-service" /* Notification */); + } + initializeContextMenuCallbacks(contextMenuFunctions) { + const notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("notification-service" /* Notification */); // Unregister function not used since these notifications should be // observed for the full lifetime of the extension. - notificationService.registerHandler(api_internal_contract_js_1.NotificationId.ContextMenuClick, function () { + notificationService.registerHandler(api_internal_contract_js_1.NotificationId.ContextMenuClick, () => { // Let through any context menu event, these are already filtered on api-core // based on the extension locator. return true; - }, function (event) { + }, (event) => { // Execute the function associated with this context menu ID if (contextMenuFunctions) { if (!contextMenuFunctions[event.id]) { - throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, "Received unexpected context menu Id from event: " + event.id); + throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, `Received unexpected context menu Id from event: ${event.id}`); } contextMenuFunctions[event.id](); } }); - }; - ExtensionsImpl.prototype.loadTableauFonts = function (fontNameAndInfo) { + } + loadTableauFonts(fontNameAndInfo) { switch (fontNameAndInfo.fontName) { case TableauBookFontNameConstants_1.TableauBookFontFaceName: document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauBookFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'normal', style: 'normal' })); @@ -6109,10 +715,10 @@ var ExtensionsImpl = /** @class */ (function () { document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauBookFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'bold', style: 'normal' })); break; default: - throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, "'attempted to load unsupported font: " + fontNameAndInfo.fontName + ".'"); + throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, `'attempted to load unsupported font: ${fontNameAndInfo.fontName}.'`); } - }; - ExtensionsImpl.prototype.loadBentonSansFonts = function (fontNameAndInfo) { + } + loadBentonSansFonts(fontNameAndInfo) { switch (fontNameAndInfo.fontName) { case BentonSansFontNameConstants_1.BentonSansBookFontFaceName: document.fonts.add(new FontFace(BentonSansFontNameConstants_1.BentonSansFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'normal', style: 'normal' })); @@ -6135,11 +741,10 @@ var ExtensionsImpl = /** @class */ (function () { document.fonts.add(new FontFace(BentonSansFontNameConstants_1.BentonSansLowDPIFontFamilyName, fontNameAndInfo.fontBinaryInfo, { style: 'italic' })); break; default: - throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, "'attempted to load unsupported font: " + fontNameAndInfo.fontName + ".'"); + throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, `'attempted to load unsupported font: ${fontNameAndInfo.fontName}.'`); } - }; - return ExtensionsImpl; -}()); + } +} exports.ExtensionsImpl = ExtensionsImpl; @@ -6154,7 +759,7 @@ exports.ExtensionsImpl = ExtensionsImpl; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); /** * LegacyInternalApiDispatcherHolder has been moved (and renamed) from api-internal-contract. * It supports running a newer external library against a pre 2019.3 desktop. @@ -6180,8 +785,8 @@ var LegacyInternalApiDispatcherHolder; } else if (((_a = options) === null || _a === void 0 ? void 0 : _a.isAlpha) && window.__platformIsOfficialRelease) { window.__tableauDesktopDispatcher - .then(function (dispatcherFactory) { - var dispatcher = dispatcherFactory(api_internal_contract_js_1.INTERNAL_CONTRACT_VERSION); + .then((dispatcherFactory) => { + const dispatcher = dispatcherFactory(api_internal_contract_js_1.INTERNAL_CONTRACT_VERSION); dispatcher.execute(api_internal_contract_js_1.VerbId.BlockExtension, {}).catch(); }) .catch(); @@ -6206,53 +811,33 @@ var LegacyInternalApiDispatcherHolder; /*!****************************************************!*\ !*** ./lib/src/ExtensionsApi/Impl/SettingsImpl.js ***! \****************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; -var __extends = (this && this.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); Object.defineProperty(exports, "__esModule", ({ value: true })); -var Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); -var TableauEvent_1 = __webpack_require__(/*! ../Events/TableauEvent */ "./lib/src/ExtensionsApi/Events/TableauEvent.js"); -var ServiceRegistryUtil_1 = __webpack_require__(/*! ../Services/ServiceRegistryUtil */ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js"); -var SettingsChangedEvent = /** @class */ (function (_super) { - __extends(SettingsChangedEvent, _super); - function SettingsChangedEvent(_newSettings) { - var _this = _super.call(this, Contract.TableauEventType.SettingsChanged) || this; - _this._newSettings = _newSettings; - return _this; - } - Object.defineProperty(SettingsChangedEvent.prototype, "newSettings", { - get: function () { - return this._newSettings; - }, - enumerable: true, - configurable: true - }); - return SettingsChangedEvent; -}(TableauEvent_1.TableauEvent)); -var SettingsImpl = /** @class */ (function () { - function SettingsImpl(settingsInfo) { +const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +const TableauEvent_1 = __webpack_require__(/*! ../Events/TableauEvent */ "./lib/src/ExtensionsApi/Events/TableauEvent.js"); +const ServiceRegistryUtil_1 = __webpack_require__(/*! ../Services/ServiceRegistryUtil */ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js"); +class SettingsChangedEvent extends TableauEvent_1.TableauEvent { + constructor(_newSettings) { + super(Contract.TableauEventType.SettingsChanged); + this._newSettings = _newSettings; + } + get newSettings() { + return this._newSettings; + } +} +class SettingsImpl { + constructor(settingsInfo) { // Since promises can't be introspected for state, keep a variable that // indicates a save is in progress, so that set/erase can't be called during a save. this._saveInProgress = false; this.initializeSettings(settingsInfo); } - SettingsImpl.prototype.erase = function (key) { + erase(key) { api_shared_js_1.ErrorHelpers.verifyParameter(key, 'key'); // Only make a modification if we have the key already if (this._currentSettings[key]) { @@ -6260,24 +845,19 @@ var SettingsImpl = /** @class */ (function () { delete this._currentSettings[key]; this._isModified = true; } - }; - SettingsImpl.prototype.get = function (key) { + } + get(key) { api_shared_js_1.ErrorHelpers.verifyParameter(key, 'key'); return this._currentSettings[key]; - }; - SettingsImpl.prototype.getAll = function () { + } + getAll() { // Returns a mutable copy of the settings return Object.assign({}, this._currentSettings); - }; - Object.defineProperty(SettingsImpl.prototype, "isModified", { - get: function () { - return this._isModified; - }, - enumerable: true, - configurable: true - }); - SettingsImpl.prototype.saveAsync = function () { - var _this = this; + } + get isModified() { + return this._isModified; + } + saveAsync() { this.verifySettingsAreUnlocked(); // Just resolve immediately if settings are unchanged if (!this._isModified) { @@ -6285,38 +865,37 @@ var SettingsImpl = /** @class */ (function () { } this._saveInProgress = true; // Use the settings service to save settings to twb - var settingsService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("SettingsService" /* SettingsService */); - return settingsService.saveSettingsAsync(this._currentSettings).then(function (newSettings) { - _this._saveInProgress = false; - _this._isModified = false; - if (_this._currentSettings === undefined) { - _this._currentSettings = newSettings; + const settingsService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("SettingsService" /* SettingsService */); + return settingsService.saveSettingsAsync(this._currentSettings).then((newSettings) => { + this._saveInProgress = false; + this._isModified = false; + if (this._currentSettings === undefined) { + this._currentSettings = newSettings; } else { - Object.assign(_this._currentSettings, newSettings); + Object.assign(this._currentSettings, newSettings); } return newSettings; - }, function (reason) { - _this._saveInProgress = false; + }, (reason) => { + this._saveInProgress = false; return Promise.reject(reason); }); - }; - SettingsImpl.prototype.set = function (key, value) { + } + set(key, value) { api_shared_js_1.ErrorHelpers.verifyStringParameter(key, 'key'); // Key shouldn't be an empty string. api_shared_js_1.ErrorHelpers.verifyParameter(value, 'value'); // Empty string value is allowed. this.verifySettingsAreUnlocked(); this._currentSettings[key] = value; this._isModified = true; - }; + } /** * Initializes all events relevant to settings object. This is only a settingsUpdate event currently. * * @returns {Array} Collection of event managers to pass to an EventListenerManager. */ - SettingsImpl.prototype.initializeEvents = function () { - var _this = this; - var results = new Array(); - var notificationService; + initializeEvents() { + const results = new Array(); + let notificationService; try { notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("notification-service" /* Notification */); } @@ -6324,34 +903,33 @@ var SettingsImpl = /** @class */ (function () { // If we don't have this service registered, just return return results; } - var settingsChangedEvent = new api_shared_js_1.SingleEventManagerImpl(Contract.TableauEventType.SettingsChanged); - notificationService.registerHandler(api_internal_contract_js_1.NotificationId.SettingsChanged, function () { return true; }, function (event) { - _this._currentSettings = event.newSettings; - settingsChangedEvent.triggerEvent(function () { return new SettingsChangedEvent(event.newSettings); }); + const settingsChangedEvent = new api_shared_js_1.SingleEventManagerImpl(Contract.TableauEventType.SettingsChanged); + notificationService.registerHandler(api_internal_contract_js_1.NotificationId.SettingsChanged, () => true, (event) => { + this._currentSettings = event.newSettings; + settingsChangedEvent.triggerEvent(() => new SettingsChangedEvent(event.newSettings)); }); results.push(settingsChangedEvent); return results; - }; - SettingsImpl.prototype.initializeSettings = function (settingsInfo) { + } + initializeSettings(settingsInfo) { api_shared_js_1.ErrorHelpers.verifyParameter(settingsInfo, 'settingsInfo'); api_shared_js_1.ErrorHelpers.verifyParameter(settingsInfo.settingsValues, 'settingsInfo.SettingsValues'); this._currentSettings = settingsInfo.settingsValues; // Reset the isModified flag this._isModified = false; - }; + } /** * This helper should be called before any local update to this.currentSettings. * Checks if a current save call is still in progress and throws an error if so. */ - SettingsImpl.prototype.verifySettingsAreUnlocked = function () { + verifySettingsAreUnlocked() { if (this._saveInProgress) { throw new api_shared_js_1.TableauError(Contract.ErrorCodes.SettingSaveInProgress, SettingsImpl.ASYNC_SAVE_IN_PROGRESS); } - }; - SettingsImpl.ASYNC_SAVE_IN_PROGRESS = 'Async Save is in progress, updating settings is not allowed.'; - return SettingsImpl; -}()); + } +} exports.SettingsImpl = SettingsImpl; +SettingsImpl.ASYNC_SAVE_IN_PROGRESS = 'Async Save is in progress, updating settings is not allowed.'; /***/ }), @@ -6398,25 +976,32 @@ exports.SupportedTableauFontFaces = [ "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -var Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); -var ServiceRegistryUtil_1 = __webpack_require__(/*! ../Services/ServiceRegistryUtil */ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js"); -var UIImpl = /** @class */ (function () { - function UIImpl() { - } - UIImpl.prototype.displayDialogAsync = function (url, payload, options) { - var uiService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("UIService" /* UIService */); - var notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("notification-service" /* Notification */); - return new Promise(function (resolve, reject) { +const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +const TableauEvent_1 = __webpack_require__(/*! ../Events/TableauEvent */ "./lib/src/ExtensionsApi/Events/TableauEvent.js"); +const ServiceRegistryUtil_1 = __webpack_require__(/*! ../Services/ServiceRegistryUtil */ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js"); +class DialogMessageEvent extends TableauEvent_1.TableauEvent { + constructor(message) { + super(Contract.TableauEventType.DialogMessageReceived); + this.message = message; + } +} +exports.DialogMessageEvent = DialogMessageEvent; +class UIImpl { + constructor() { } + displayDialogAsync(url, payload, options) { + const uiService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("UIService" /* UIService */); + const notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("notification-service" /* Notification */); + return new Promise((resolve, reject) => { uiService .displayDialogAsync(url, payload || '', options) - .then(function () { - var unregisterFn = notificationService.registerHandler(api_internal_contract_js_1.NotificationId.ExtensionDialogUpdate, function () { + .then(() => { + const unregisterFn = notificationService.registerHandler(api_internal_contract_js_1.NotificationId.ExtensionDialogUpdate, () => { // Let through any dialog update event return true; - }, function (event) { + }, (event) => { if (event.isCloseEvent) { if (event.closePayload === undefined) { throw new api_shared_js_1.TableauError(Contract.ErrorCodes.InternalError, 'closePayload is undefined'); @@ -6429,17 +1014,42 @@ var UIImpl = /** @class */ (function () { unregisterFn(); }); }) - .catch(function (error) { + .catch((error) => { reject(error); }); }); - }; - UIImpl.prototype.closeDialog = function (payload) { - var uiService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("UIService" /* UIService */); + } + sendDialogMessageAsync(message, targetDialogUrl) { + const uiService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("UIService" /* UIService */); + uiService.sendDialogMessageAsync(message, targetDialogUrl); + } + closeDialog(payload) { + const uiService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("UIService" /* UIService */); uiService.closeDialog(payload); - }; - return UIImpl; -}()); + } + /** + * Initializes all events relevant to UI object. + * + * @returns {Array} Collection of event managers to pass to an EventListenerManager. + */ + initializeEvents() { + const results = new Array(); + let notificationService; + try { + notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("notification-service" /* Notification */); + } + catch (e) { + // If we don't have this service registered, just return + return results; + } + const dialogMessageEvent = new api_shared_js_1.SingleEventManagerImpl(Contract.TableauEventType.DialogMessageReceived); + notificationService.registerHandler(api_internal_contract_js_1.NotificationId.ExtensionDialogMessage, () => true, (event) => { + dialogMessageEvent.triggerEvent(() => new DialogMessageEvent(event.message)); + }); + results.push(dialogMessageEvent); + return results; + } +} exports.UIImpl = UIImpl; @@ -6449,89 +1059,57 @@ exports.UIImpl = UIImpl; /*!***************************************************!*\ !*** ./lib/src/ExtensionsApi/Models/Dashboard.js ***! \***************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; -var __extends = (this && this.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); Object.defineProperty(exports, "__esModule", ({ value: true })); -var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); -var DashboardLayoutChangedEvent_1 = __webpack_require__(/*! ../Events/DashboardLayoutChangedEvent */ "./lib/src/ExtensionsApi/Events/DashboardLayoutChangedEvent.js"); -var WorkbookFormattingChangedEvent_1 = __webpack_require__(/*! ../Events/WorkbookFormattingChangedEvent */ "./lib/src/ExtensionsApi/Events/WorkbookFormattingChangedEvent.js"); -var ServiceRegistryUtil_1 = __webpack_require__(/*! ../Services/ServiceRegistryUtil */ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js"); -var DashboardObject_1 = __webpack_require__(/*! ./DashboardObject */ "./lib/src/ExtensionsApi/Models/DashboardObject.js"); -var Sheet_1 = __webpack_require__(/*! ./Sheet */ "./lib/src/ExtensionsApi/Models/Sheet.js"); -var Worksheet_1 = __webpack_require__(/*! ./Worksheet */ "./lib/src/ExtensionsApi/Models/Worksheet.js"); -var Dashboard = /** @class */ (function (_super) { - __extends(Dashboard, _super); - function Dashboard(_dashboardImpl) { - var _this = _super.call(this, _dashboardImpl) || this; - _this._dashboardImpl = _dashboardImpl; +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +const DashboardLayoutChangedEvent_1 = __webpack_require__(/*! ../Events/DashboardLayoutChangedEvent */ "./lib/src/ExtensionsApi/Events/DashboardLayoutChangedEvent.js"); +const WorkbookFormattingChangedEvent_1 = __webpack_require__(/*! ../Events/WorkbookFormattingChangedEvent */ "./lib/src/ExtensionsApi/Events/WorkbookFormattingChangedEvent.js"); +const ServiceRegistryUtil_1 = __webpack_require__(/*! ../Services/ServiceRegistryUtil */ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js"); +const DashboardObject_1 = __webpack_require__(/*! ./DashboardObject */ "./lib/src/ExtensionsApi/Models/DashboardObject.js"); +const Sheet_1 = __webpack_require__(/*! ./Sheet */ "./lib/src/ExtensionsApi/Models/Sheet.js"); +const Worksheet_1 = __webpack_require__(/*! ./Worksheet */ "./lib/src/ExtensionsApi/Models/Worksheet.js"); +class Dashboard extends Sheet_1.Sheet { + constructor(_dashboardImpl) { + super(_dashboardImpl); + this._dashboardImpl = _dashboardImpl; _dashboardImpl.initializeWithPublicInterfaces(); - _this.initializeEvents().forEach(function (e) { return _this.addNewEventType(e); }); - return _this; + this.initializeEvents().forEach((e) => this.addNewEventType(e)); } - Object.defineProperty(Dashboard.prototype, "worksheets", { - get: function () { - return this._dashboardImpl.worksheetsImpl.map(function (worksheetImpl) { - return new Worksheet_1.Worksheet(worksheetImpl); - }); - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Dashboard.prototype, "objects", { - get: function () { - return this._dashboardImpl.objects.map(function (dashboardObjectImpl) { - return new DashboardObject_1.DashboardObject(dashboardObjectImpl); - }); - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Dashboard.prototype, "activeDashboardObjectId", { - get: function () { - return this._dashboardImpl.activeDashboardObjectId; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Dashboard.prototype, "activeDashboardName", { - get: function () { - return this._dashboardImpl.activeDashboardName; - }, - enumerable: true, - configurable: true - }); - Dashboard.prototype.setZoneVisibilityAsync = function (zoneVisibilityMap) { + get worksheets() { + return this._dashboardImpl.worksheetsImpl.map((worksheetImpl) => { + return new Worksheet_1.Worksheet(worksheetImpl); + }); + } + get objects() { + return this._dashboardImpl.objects.map((dashboardObjectImpl) => { + return new DashboardObject_1.DashboardObject(dashboardObjectImpl); + }); + } + get activeDashboardObjectId() { + return this._dashboardImpl.activeDashboardObjectId; + } + get activeDashboardName() { + return this._dashboardImpl.activeDashboardName; + } + setZoneVisibilityAsync(zoneVisibilityMap) { return this._dashboardImpl.setDashboardObjectVisibilityAsync(zoneVisibilityMap); - }; - Dashboard.prototype.setDashboardObjectVisibilityAsync = function (dashboardObjectVisibilityMap) { + } + setDashboardObjectVisibilityAsync(dashboardObjectVisibilityMap) { return this._dashboardImpl.setDashboardObjectVisibilityAsync(dashboardObjectVisibilityMap); - }; - Dashboard.prototype.getDashboardObjectById = function (dashboardObjectId) { - var zone = this._dashboardImpl.getDashboardObjectById(dashboardObjectId); + } + getDashboardObjectById(dashboardObjectId) { + const zone = this._dashboardImpl.getDashboardObjectById(dashboardObjectId); return zone && new DashboardObject_1.DashboardObject(zone); - }; - Dashboard.prototype.initializeEvents = function () { - var _this = this; - var results = new Array(); + } + initializeEvents() { + const results = new Array(); // Initializing events and registering notification service - var notificationService; + let notificationService; try { notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("notification-service" /* Notification */); } @@ -6539,33 +1117,32 @@ var Dashboard = /** @class */ (function (_super) { // If we don't have this service registered, just return (allows unit testing without NotificationService mock) return results; } - var dashboardLayoutChangedEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.DashboardLayoutChanged); - notificationService.registerHandler(api_internal_contract_js_1.NotificationId.DashboardLayoutChanged, function () { return true; }, function (event) { - var dashboardObjectChanges = _this._dashboardImpl.updateZones(event.zones, event.activeZoneId, event.activeDashboardName); - dashboardLayoutChangedEvent.triggerEvent(function () { return new DashboardLayoutChangedEvent_1.DashboardLayoutChangedEvent(dashboardObjectChanges); }); + const dashboardLayoutChangedEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.DashboardLayoutChanged); + notificationService.registerHandler(api_internal_contract_js_1.NotificationId.DashboardLayoutChanged, () => true, (event) => { + const dashboardObjectChanges = this._dashboardImpl.updateZones(event.zones, event.activeZoneId, event.activeDashboardName); + dashboardLayoutChangedEvent.triggerEvent(() => new DashboardLayoutChangedEvent_1.DashboardLayoutChangedEvent(dashboardObjectChanges)); }); results.push(dashboardLayoutChangedEvent); - var workbookFormattingChangedEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.WorkbookFormattingChanged); - notificationService.registerHandler(api_internal_contract_js_1.NotificationId.WorkbookFormattingChanged, function () { return true; }, function (eventFormatting) { - workbookFormattingChangedEvent.triggerEvent(function () { return new WorkbookFormattingChangedEvent_1.WorkbookFormattingChangedEvent(eventFormatting); }); + const workbookFormattingChangedEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.WorkbookFormattingChanged); + notificationService.registerHandler(api_internal_contract_js_1.NotificationId.WorkbookFormattingChanged, () => true, (eventFormatting) => { + workbookFormattingChangedEvent.triggerEvent(() => new WorkbookFormattingChangedEvent_1.WorkbookFormattingChangedEvent(eventFormatting)); }); results.push(workbookFormattingChangedEvent); return results; - }; - Dashboard.prototype.moveAndResizeDashboardObjectsAsync = function (dashboardObjectPositionAndSizeUpdateArray) { + } + moveAndResizeDashboardObjectsAsync(dashboardObjectPositionAndSizeUpdateArray) { return this._dashboardImpl.moveAndResizeDashboardObjectsAsync(dashboardObjectPositionAndSizeUpdateArray); - }; - Dashboard.prototype.replayAnimationAsync = function (replaySpeed) { + } + replayAnimationAsync(replaySpeed) { return this._dashboardImpl.replayAnimationAsync(replaySpeed); - }; - Dashboard.prototype.getFiltersAsync = function () { + } + getFiltersAsync() { return this._dashboardImpl.getFiltersAsync(); - }; - Dashboard.prototype.applyFilterAsync = function (fieldName, values, updateType, options) { + } + applyFilterAsync(fieldName, values, updateType, options) { return this._dashboardImpl.applyFilterAsync(fieldName, values, updateType, options); - }; - return Dashboard; -}(Sheet_1.Sheet)); + } +} exports.Dashboard = Dashboard; @@ -6580,90 +1157,49 @@ exports.Dashboard = Dashboard; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -var Dashboard_1 = __webpack_require__(/*! ./Dashboard */ "./lib/src/ExtensionsApi/Models/Dashboard.js"); -var Worksheet_1 = __webpack_require__(/*! ./Worksheet */ "./lib/src/ExtensionsApi/Models/Worksheet.js"); +const Dashboard_1 = __webpack_require__(/*! ./Dashboard */ "./lib/src/ExtensionsApi/Models/Dashboard.js"); +const Worksheet_1 = __webpack_require__(/*! ./Worksheet */ "./lib/src/ExtensionsApi/Models/Worksheet.js"); /** * Implementation of the dashboard objects - the zones in a dashboard. */ -var DashboardObject = /** @class */ (function () { - function DashboardObject(_dashboardObjectImpl) { +class DashboardObject { + constructor(_dashboardObjectImpl) { this._dashboardObjectImpl = _dashboardObjectImpl; } - Object.defineProperty(DashboardObject.prototype, "dashboard", { - get: function () { - return new Dashboard_1.Dashboard(this._dashboardObjectImpl.dashboardImpl); - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DashboardObject.prototype, "type", { - get: function () { - return this._dashboardObjectImpl.type; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DashboardObject.prototype, "position", { - get: function () { - return this._dashboardObjectImpl.position; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DashboardObject.prototype, "size", { - get: function () { - return this._dashboardObjectImpl.size; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DashboardObject.prototype, "worksheet", { - get: function () { - if (this._dashboardObjectImpl.worksheetImpl) { - return new Worksheet_1.Worksheet(this._dashboardObjectImpl.worksheetImpl); - } - return undefined; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DashboardObject.prototype, "name", { - get: function () { - return this._dashboardObjectImpl.name; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DashboardObject.prototype, "isFloating", { - get: function () { - return this._dashboardObjectImpl.isFloating; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DashboardObject.prototype, "isVisible", { - get: function () { - return this._dashboardObjectImpl.isVisible; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DashboardObject.prototype, "id", { - get: function () { - return this._dashboardObjectImpl.id; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DashboardObject.prototype, "fieldId", { - get: function () { - return this._dashboardObjectImpl.fieldId; - }, - enumerable: true, - configurable: true - }); - return DashboardObject; -}()); + get dashboard() { + return new Dashboard_1.Dashboard(this._dashboardObjectImpl.dashboardImpl); + } + get type() { + return this._dashboardObjectImpl.type; + } + get position() { + return this._dashboardObjectImpl.position; + } + get size() { + return this._dashboardObjectImpl.size; + } + get worksheet() { + if (this._dashboardObjectImpl.worksheetImpl) { + return new Worksheet_1.Worksheet(this._dashboardObjectImpl.worksheetImpl); + } + return undefined; + } + get name() { + return this._dashboardObjectImpl.name; + } + get isFloating() { + return this._dashboardObjectImpl.isFloating; + } + get isVisible() { + return this._dashboardObjectImpl.isVisible; + } + get id() { + return this._dashboardObjectImpl.id; + } + get fieldId() { + return this._dashboardObjectImpl.fieldId; + } +} exports.DashboardObject = DashboardObject; @@ -6673,80 +1209,45 @@ exports.DashboardObject = DashboardObject; /*!***************************************************!*\ !*** ./lib/src/ExtensionsApi/Models/Parameter.js ***! \***************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; -var __extends = (this && this.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); Object.defineProperty(exports, "__esModule", ({ value: true })); -var Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); -var ParameterChangedEvent_1 = __webpack_require__(/*! ../Events/ParameterChangedEvent */ "./lib/src/ExtensionsApi/Events/ParameterChangedEvent.js"); -var ServiceRegistryUtil_1 = __webpack_require__(/*! ../Services/ServiceRegistryUtil */ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js"); +const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +const ParameterChangedEvent_1 = __webpack_require__(/*! ../Events/ParameterChangedEvent */ "./lib/src/ExtensionsApi/Events/ParameterChangedEvent.js"); +const ServiceRegistryUtil_1 = __webpack_require__(/*! ../Services/ServiceRegistryUtil */ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js"); /** * Implementation of the Parameter contract. Calls down to the impl * class for almost all of the work it does. */ -var Parameter = /** @class */ (function (_super) { - __extends(Parameter, _super); - function Parameter(parameterImpl, sheet) { - var _this = _super.call(this) || this; - _this.parameterImpl = parameterImpl; +class Parameter extends api_shared_js_1.EventListenerManager { + constructor(parameterImpl, sheet) { + super(); + this.parameterImpl = parameterImpl; // Initialize our event handling for this class - _this.initializeEvents(sheet).forEach(function (e) { return _this.addNewEventType(e); }); - return _this; - } - Object.defineProperty(Parameter.prototype, "name", { - get: function () { - return this.parameterImpl.name; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Parameter.prototype, "currentValue", { - get: function () { - return this.parameterImpl.currentValue; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Parameter.prototype, "dataType", { - get: function () { - return this.parameterImpl.dataType; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Parameter.prototype, "allowableValues", { - get: function () { - return this.parameterImpl.allowableValues; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Parameter.prototype, "id", { - get: function () { - return this.parameterImpl.id; - }, - enumerable: true, - configurable: true - }); - Parameter.prototype.changeValueAsync = function (newValue) { + this.initializeEvents(sheet).forEach((e) => this.addNewEventType(e)); + } + get name() { + return this.parameterImpl.name; + } + get currentValue() { + return this.parameterImpl.currentValue; + } + get dataType() { + return this.parameterImpl.dataType; + } + get allowableValues() { + return this.parameterImpl.allowableValues; + } + get id() { + return this.parameterImpl.id; + } + changeValueAsync(newValue) { return this.parameterImpl.changeValueAsync(newValue); - }; + } /** * Helper method which goes through and registers each event type this impl knows about * with the NotificationService. It returns an array of SingleEventManager objects which @@ -6755,11 +1256,10 @@ var Parameter = /** @class */ (function (_super) { * @param sheet The sheet object which will be included with the event notifications * @returns {Array} Collection of event managers to pass to an EventListenerManager */ - Parameter.prototype.initializeEvents = function (sheet) { - var _this = this; + initializeEvents(sheet) { api_shared_js_1.ErrorHelpers.verifyInternalValue(sheet, 'sheet'); - var results = new Array(); - var notificationService; + const results = new Array(); + let notificationService; try { notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("notification-service" /* Notification */); } @@ -6768,18 +1268,17 @@ var Parameter = /** @class */ (function (_super) { return results; } // Initialize all of the event managers we'll need (one for each event type) - var parameterEvent = new api_shared_js_1.SingleEventManagerImpl(Contract.TableauEventType.ParameterChanged); - notificationService.registerHandler(api_internal_contract_js_1.NotificationId.ParameterChanged, function (model) { - var fieldName = model; - return fieldName === _this.parameterImpl.id; - }, function (fieldName) { - parameterEvent.triggerEvent(function () { return new ParameterChangedEvent_1.ParameterChangedEvent(fieldName, sheet); }); + const parameterEvent = new api_shared_js_1.SingleEventManagerImpl(Contract.TableauEventType.ParameterChanged); + notificationService.registerHandler(api_internal_contract_js_1.NotificationId.ParameterChanged, (model) => { + const fieldName = model; + return fieldName === this.parameterImpl.id; + }, (fieldName) => { + parameterEvent.triggerEvent(() => new ParameterChangedEvent_1.ParameterChangedEvent(fieldName, sheet)); }); results.push(parameterEvent); return results; - }; - return Parameter; -}(api_shared_js_1.EventListenerManager)); + } +} exports.Parameter = Parameter; @@ -6789,86 +1288,56 @@ exports.Parameter = Parameter; /*!***********************************************!*\ !*** ./lib/src/ExtensionsApi/Models/Sheet.js ***! \***********************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; -var __extends = (this && this.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); Object.defineProperty(exports, "__esModule", ({ value: true })); -var Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); -var Parameter_1 = __webpack_require__(/*! ./Parameter */ "./lib/src/ExtensionsApi/Models/Parameter.js"); -var Sheet = /** @class */ (function (_super) { - __extends(Sheet, _super); - function Sheet(_sheetImpl) { - var _this = _super.call(this) || this; - _this._sheetImpl = _sheetImpl; - return _this; - } - Object.defineProperty(Sheet.prototype, "name", { - get: function () { - return this._sheetImpl.name; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Sheet.prototype, "sheetType", { - get: function () { - return this._sheetImpl.sheetType; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Sheet.prototype, "size", { - get: function () { - if (this.isValidSize(this._sheetImpl.size)) { - return this._sheetImpl.size; - } - throw new api_shared_js_1.TableauError(Contract.EmbeddingErrorCodes.ImplementationError, 'Size not implemented'); - }, - enumerable: true, - configurable: true - }); - Sheet.prototype.isValidSize = function (size) { - var testSize = size; +const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +const Parameter_1 = __webpack_require__(/*! ./Parameter */ "./lib/src/ExtensionsApi/Models/Parameter.js"); +class Sheet extends api_shared_js_1.EventListenerManager { + constructor(_sheetImpl) { + super(); + this._sheetImpl = _sheetImpl; + } + get name() { + return this._sheetImpl.name; + } + get sheetType() { + return this._sheetImpl.sheetType; + } + get size() { + if (this.isValidSize(this._sheetImpl.size)) { + return this._sheetImpl.size; + } + throw new api_shared_js_1.TableauError(Contract.EmbeddingErrorCodes.ImplementationError, 'Size not implemented'); + } + isValidSize(size) { + const testSize = size; if (testSize.width !== undefined && testSize.height !== undefined) { return true; } return false; - }; - Sheet.prototype.findParameterAsync = function (parameterName) { - var _this = this; - return this._sheetImpl.findParameterAsync(parameterName).then(function (parameterImpl) { + } + findParameterAsync(parameterName) { + return this._sheetImpl.findParameterAsync(parameterName).then((parameterImpl) => { if (parameterImpl) { - return new Promise(function (resolve) { return resolve(new Parameter_1.Parameter(parameterImpl, _this)); }); + return new Promise((resolve) => resolve(new Parameter_1.Parameter(parameterImpl, this))); } else { - return new Promise(function (resolve) { return resolve(undefined); }); + return new Promise((resolve) => resolve(undefined)); } }); - }; - Sheet.prototype.getParametersAsync = function () { - var _this = this; - return this._sheetImpl.getParametersAsync().then(function (parametersImpl) { - return parametersImpl.map(function (parameterImpl) { - return new Parameter_1.Parameter(parameterImpl, _this); + } + getParametersAsync() { + return this._sheetImpl.getParametersAsync().then((parametersImpl) => { + return parametersImpl.map((parameterImpl) => { + return new Parameter_1.Parameter(parameterImpl, this); }); }); - }; - return Sheet; -}(api_shared_js_1.EventListenerManager)); + } +} exports.Sheet = Sheet; @@ -6883,15 +1352,14 @@ exports.Sheet = Sheet; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -var Workbook = /** @class */ (function () { - function Workbook(_workbookImpl) { +class Workbook { + constructor(_workbookImpl) { this._workbookImpl = _workbookImpl; } - Workbook.prototype.getAllDataSourcesAsync = function () { + getAllDataSourcesAsync() { return this._workbookImpl.getAllDataSourcesAsync(); - }; - return Workbook; -}()); + } +} exports.Workbook = Workbook; @@ -6901,75 +1369,48 @@ exports.Workbook = Workbook; /*!***************************************************!*\ !*** ./lib/src/ExtensionsApi/Models/Worksheet.js ***! \***************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; -var __extends = (this && this.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); Object.defineProperty(exports, "__esModule", ({ value: true })); -var Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); -var FilterChangedEvent_1 = __webpack_require__(/*! ../Events/FilterChangedEvent */ "./lib/src/ExtensionsApi/Events/FilterChangedEvent.js"); -var MarksSelectedEvent_1 = __webpack_require__(/*! ../Events/MarksSelectedEvent */ "./lib/src/ExtensionsApi/Events/MarksSelectedEvent.js"); -var SummaryDataChangedEvent_1 = __webpack_require__(/*! ../Events/SummaryDataChangedEvent */ "./lib/src/ExtensionsApi/Events/SummaryDataChangedEvent.js"); -var WorksheetFormattingChangedEvent_1 = __webpack_require__(/*! ../Events/WorksheetFormattingChangedEvent */ "./lib/src/ExtensionsApi/Events/WorksheetFormattingChangedEvent.js"); -var ServiceRegistryUtil_1 = __webpack_require__(/*! ../Services/ServiceRegistryUtil */ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js"); -var Dashboard_1 = __webpack_require__(/*! ./Dashboard */ "./lib/src/ExtensionsApi/Models/Dashboard.js"); -var Sheet_1 = __webpack_require__(/*! ./Sheet */ "./lib/src/ExtensionsApi/Models/Sheet.js"); -var Worksheet = /** @class */ (function (_super) { - __extends(Worksheet, _super); - function Worksheet(_worksheetImpl) { - var _this = _super.call(this, _worksheetImpl) || this; - _this._worksheetImpl = _worksheetImpl; +const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +const FilterChangedEvent_1 = __webpack_require__(/*! ../Events/FilterChangedEvent */ "./lib/src/ExtensionsApi/Events/FilterChangedEvent.js"); +const MarksSelectedEvent_1 = __webpack_require__(/*! ../Events/MarksSelectedEvent */ "./lib/src/ExtensionsApi/Events/MarksSelectedEvent.js"); +const SummaryDataChangedEvent_1 = __webpack_require__(/*! ../Events/SummaryDataChangedEvent */ "./lib/src/ExtensionsApi/Events/SummaryDataChangedEvent.js"); +const WorksheetFormattingChangedEvent_1 = __webpack_require__(/*! ../Events/WorksheetFormattingChangedEvent */ "./lib/src/ExtensionsApi/Events/WorksheetFormattingChangedEvent.js"); +const ServiceRegistryUtil_1 = __webpack_require__(/*! ../Services/ServiceRegistryUtil */ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js"); +const Dashboard_1 = __webpack_require__(/*! ./Dashboard */ "./lib/src/ExtensionsApi/Models/Dashboard.js"); +const Sheet_1 = __webpack_require__(/*! ./Sheet */ "./lib/src/ExtensionsApi/Models/Sheet.js"); +class Worksheet extends Sheet_1.Sheet { + constructor(_worksheetImpl) { + super(_worksheetImpl); + this._worksheetImpl = _worksheetImpl; // Call to initialize events and then call down to the event listener manager to handle things - _this.initializeEvents().forEach(function (e) { return _this.addNewEventType(e); }); - return _this; - } - Object.defineProperty(Worksheet.prototype, "parentDashboard", { - get: function () { - // This should never happen for Extensions if the DashboardImpls are created correctly - if (this._worksheetImpl.parentDashboard == null) { - throw new api_shared_js_1.TableauError(Contract.SharedErrorCodes.ImplementationError, "Parent dashboard not implemented"); - } - return new Dashboard_1.Dashboard(this._worksheetImpl.parentDashboard); - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Worksheet.prototype, "backgroundColor", { - get: function () { - if (this._worksheetImpl.backgroundColor == null) { - throw new api_shared_js_1.TableauError(Contract.SharedErrorCodes.ImplementationError, "Worksheet background color is not available"); - } - return this._worksheetImpl.backgroundColor; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Worksheet.prototype, "formatting", { - get: function () { - if (this._worksheetImpl.formatting == null) { - throw new api_shared_js_1.TableauError(Contract.SharedErrorCodes.ImplementationError, "Worksheet formatting information is not available"); - } - return this._worksheetImpl.formatting; - }, - enumerable: true, - configurable: true - }); + this.initializeEvents().forEach((e) => this.addNewEventType(e)); + } + get parentDashboard() { + // This should never happen for Extensions if the DashboardImpls are created correctly + if (this._worksheetImpl.parentDashboard == null) { + throw new api_shared_js_1.TableauError(Contract.SharedErrorCodes.ImplementationError, `Parent dashboard not implemented`); + } + return new Dashboard_1.Dashboard(this._worksheetImpl.parentDashboard); + } + get backgroundColor() { + if (this._worksheetImpl.backgroundColor == null) { + throw new api_shared_js_1.TableauError(Contract.SharedErrorCodes.ImplementationError, `Worksheet background color is not available`); + } + return this._worksheetImpl.backgroundColor; + } + get formatting() { + if (this._worksheetImpl.formatting == null) { + throw new api_shared_js_1.TableauError(Contract.SharedErrorCodes.ImplementationError, `Worksheet formatting information is not available`); + } + return this._worksheetImpl.formatting; + } /** * Helper method which goes through and registers each event type this impl knows about * with the NotificationService. It returns an array of SingleEventManager objects which @@ -6978,10 +1419,9 @@ var Worksheet = /** @class */ (function (_super) { * @param {Worksheet} worksheet The worksheet object which will be included with the event notifications * @returns {Array} Collection of event managers to pass to an EventListenerManager */ - Worksheet.prototype.initializeEvents = function () { - var _this = this; - var results = new Array(); - var notificationService; + initializeEvents() { + const results = new Array(); + let notificationService; try { notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("notification-service" /* Notification */); } @@ -6990,148 +1430,145 @@ var Worksheet = /** @class */ (function (_super) { return results; } // Initialize all of the event managers we'll need (one for each event type) - var marksEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.MarkSelectionChanged); - notificationService.registerHandler(api_internal_contract_js_1.NotificationId.SelectedMarksChanged, function (model) { - var visualId = model; - return _this.visualIdsAreEqual(visualId, _this._worksheetImpl.visualId); - }, function () { return marksEvent.triggerEvent(function () { return new MarksSelectedEvent_1.MarksSelectedEvent(_this); }); }); - var filterEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.FilterChanged); - notificationService.registerHandler(api_internal_contract_js_1.NotificationId.FilterChanged, function (model) { - var filterEventResponse = model; - return _this._worksheetImpl.visualId.worksheet === filterEventResponse.visualId.worksheet; - }, function (event) { - filterEvent.triggerEvent(function () { return new FilterChangedEvent_1.FilterChangedEvent(_this, event.fieldName, event.fieldId); }); - }); - var summaryDataEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.SummaryDataChanged); - notificationService.registerHandler(api_internal_contract_js_1.NotificationId.SummaryDataChanged, function (model) { - var summaryDataEventResponse = model; - return _this._worksheetImpl.visualId.worksheet === summaryDataEventResponse.visualId.worksheet; - }, function (event) { - summaryDataEvent.triggerEvent(function () { return new SummaryDataChangedEvent_1.SummaryDataChangedEvent(_this); }); - }); - var worksheetFormattingChangedEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.WorksheetFormattingChanged); - notificationService.registerHandler(api_internal_contract_js_1.NotificationId.WorksheetFormattingChanged, function (model) { - var worksheetFormattingChangedEvent = model; - return _this._worksheetImpl.visualId.worksheet === worksheetFormattingChangedEvent.visualId.worksheet; - }, function (eventFormatting) { - worksheetFormattingChangedEvent.triggerEvent(function () { return new WorksheetFormattingChangedEvent_1.WorksheetFormattingChangedEvent(_this, eventFormatting); }); + const marksEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.MarkSelectionChanged); + notificationService.registerHandler(api_internal_contract_js_1.NotificationId.SelectedMarksChanged, (model) => { + const visualId = model; + return this.visualIdsAreEqual(visualId, this._worksheetImpl.visualId); + }, () => marksEvent.triggerEvent(() => new MarksSelectedEvent_1.MarksSelectedEvent(this))); + const filterEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.FilterChanged); + notificationService.registerHandler(api_internal_contract_js_1.NotificationId.FilterChanged, (model) => { + const filterEventResponse = model; + return this._worksheetImpl.visualId.worksheet === filterEventResponse.visualId.worksheet; + }, (event) => { + filterEvent.triggerEvent(() => new FilterChangedEvent_1.FilterChangedEvent(this, event.fieldName, event.fieldId)); + }); + const summaryDataEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.SummaryDataChanged); + notificationService.registerHandler(api_internal_contract_js_1.NotificationId.SummaryDataChanged, (model) => { + const summaryDataEventResponse = model; + return this._worksheetImpl.visualId.worksheet === summaryDataEventResponse.visualId.worksheet; + }, (event) => { + summaryDataEvent.triggerEvent(() => new SummaryDataChangedEvent_1.SummaryDataChangedEvent(this)); + }); + const worksheetFormattingChangedEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.WorksheetFormattingChanged); + notificationService.registerHandler(api_internal_contract_js_1.NotificationId.WorksheetFormattingChanged, (model) => { + const worksheetFormattingChangedEvent = model; + return this._worksheetImpl.visualId.worksheet === worksheetFormattingChangedEvent.visualId.worksheet; + }, (eventFormatting) => { + worksheetFormattingChangedEvent.triggerEvent(() => new WorksheetFormattingChangedEvent_1.WorksheetFormattingChangedEvent(this, eventFormatting)); }); results.push(marksEvent); results.push(filterEvent); results.push(summaryDataEvent); results.push(worksheetFormattingChangedEvent); return results; - }; - Worksheet.prototype.applyFilterAsync = function (fieldName, values, updateType, options) { + } + applyFilterAsync(fieldName, values, updateType, options) { return this._worksheetImpl.applyFilterAsync(fieldName, values, updateType, options); - }; - Worksheet.prototype.applyRangeFilterAsync = function (fieldName, filterOptions) { + } + applyRangeFilterAsync(fieldName, filterOptions) { return this._worksheetImpl.applyRangeFilterAsync(fieldName, filterOptions); - }; - Worksheet.prototype.applyHierarchicalFilterAsync = function (fieldName, values, updateType, options) { + } + applyHierarchicalFilterAsync(fieldName, values, updateType, options) { return this._worksheetImpl.applyHierarchicalFilterAsync(fieldName, values, updateType, options); - }; - Worksheet.prototype.applyRelativeDateFilterAsync = function (fieldName, options) { + } + applyRelativeDateFilterAsync(fieldName, options) { return this._worksheetImpl.applyRelativeDateFilterAsync(fieldName, options); - }; - Worksheet.prototype.clearFilterAsync = function (fieldName) { + } + clearFilterAsync(fieldName) { return this._worksheetImpl.clearFilterAsync(fieldName); - }; - Worksheet.prototype.getDataSourcesAsync = function () { + } + getDataSourcesAsync() { return this._worksheetImpl.getDataSourcesAsync(); - }; - Worksheet.prototype.getFiltersAsync = function () { + } + getFiltersAsync() { return this._worksheetImpl.getFiltersAsync(); - }; - Worksheet.prototype.getSelectedMarksAsync = function () { + } + getSelectedMarksAsync() { return this._worksheetImpl.getSelectedMarksAsync(); - }; - Worksheet.prototype.getHighlightedMarksAsync = function () { + } + getHighlightedMarksAsync() { return this._worksheetImpl.getHighlightedMarksAsync(); - }; - Worksheet.prototype.getSummaryDataAsync = function (options) { + } + getSummaryDataAsync(options) { return this._worksheetImpl.getSummaryDataAsync(options); - }; - Worksheet.prototype.getSummaryDataReaderAsync = function (pageRowCount, options) { + } + getSummaryDataReaderAsync(pageRowCount, options) { return this._worksheetImpl.getSummaryDataReaderAsync(pageRowCount, options); - }; - Worksheet.prototype.getSummaryColumnsInfoAsync = function () { + } + getSummaryColumnsInfoAsync() { return this._worksheetImpl.getSummaryColumnsInfoAsync(); - }; - Worksheet.prototype.getUnderlyingDataAsync = function (options) { + } + getUnderlyingDataAsync(options) { console.warn('Worksheet.getUnderlyingDataAsync is deprecated. Please use ' + 'Worksheet.getUnderlyingTablesAsync and Worksheet.getUnderlyingTableDataAsync'); return this._worksheetImpl.getUnderlyingDataAsync(options); - }; - Worksheet.prototype.getUnderlyingTablesAsync = function () { + } + getUnderlyingTablesAsync() { return this._worksheetImpl.getUnderlyingTablesAsync(); - }; - Worksheet.prototype.getUnderlyingTableDataAsync = function (logicalTableId, options) { + } + getUnderlyingTableDataAsync(logicalTableId, options) { return this._worksheetImpl.getUnderlyingTableDataAsync(logicalTableId, options); - }; - Worksheet.prototype.getUnderlyingTableDataReaderAsync = function (logicalTableId, pageRowCount, options) { + } + getUnderlyingTableDataReaderAsync(logicalTableId, pageRowCount, options) { return this._worksheetImpl.getUnderlyingTableDataReaderAsync(logicalTableId, pageRowCount, options); - }; - Worksheet.prototype.getVisualSpecificationAsync = function () { + } + getVisualSpecificationAsync() { return this._worksheetImpl.getVisualSpecificationAsync(); - }; - Worksheet.prototype.addMarksCardFieldsAsync = function (marksCardIndex, encodingType, columns, startIndex) { + } + addMarksCardFieldsAsync(marksCardIndex, encodingType, columns, startIndex) { return this._worksheetImpl.addMarksCardFieldsAsync(marksCardIndex, encodingType, columns, startIndex); - }; - Worksheet.prototype.moveMarksCardFieldAsync = function (marksCardIndex, fromIndex, toIndex, fieldCount) { - if (fieldCount === void 0) { fieldCount = 1; } + } + moveMarksCardFieldAsync(marksCardIndex, fromIndex, toIndex, fieldCount = 1) { return this._worksheetImpl.moveMarksCardFieldAsync(marksCardIndex, fromIndex, toIndex, fieldCount); - }; - Worksheet.prototype.spliceMarksCardFieldsAsync = function (marksCardIndex, encodingType, startIndex, deleteCount, columns) { + } + spliceMarksCardFieldsAsync(marksCardIndex, encodingType, startIndex, deleteCount, columns) { return this._worksheetImpl.spliceMarksCardFieldsAsync(marksCardIndex, encodingType, startIndex, deleteCount, columns); - }; - Worksheet.prototype.clearSelectedMarksAsync = function () { + } + clearSelectedMarksAsync() { return this._worksheetImpl.clearSelectedMarksAsync(); - }; - Worksheet.prototype.selectMarksByIDAsync = function (marksInfo, updateType) { + } + selectMarksByIDAsync(marksInfo, updateType) { return this._worksheetImpl.selectMarksByIdAsync(marksInfo, updateType); - }; - Worksheet.prototype.selectMarksByValueAsync = function (selections, selectionUpdateType) { + } + selectMarksByValueAsync(selections, selectionUpdateType) { return this._worksheetImpl.selectMarksByValueAsync(selections, selectionUpdateType); - }; - Worksheet.prototype.selectMarksByIdAsync = function (selections, selectionUpdateType) { + } + selectMarksByIdAsync(selections, selectionUpdateType) { return this._worksheetImpl.selectMarksByIdAsync(selections, selectionUpdateType); - }; - Worksheet.prototype.annotateMarkAsync = function (mark, annotationText) { + } + annotateMarkAsync(mark, annotationText) { return this._worksheetImpl.annotateMarkAsync(mark, annotationText); - }; - Worksheet.prototype.getAnnotationsAsync = function () { + } + getAnnotationsAsync() { return this._worksheetImpl.getAnnotationsAsync(); - }; - Worksheet.prototype.removeAnnotationAsync = function (annotation) { + } + removeAnnotationAsync(annotation) { return this._worksheetImpl.removeAnnotationAsync(annotation); - }; - Worksheet.prototype.hoverTupleAsync = function (hoveredTuple, tooltip, allowHoverActions) { - if (allowHoverActions === void 0) { allowHoverActions = true; } + } + hoverTupleAsync(hoveredTuple, tooltip, allowHoverActions = true) { return this._worksheetImpl.hoverTupleAsync(hoveredTuple, tooltip, allowHoverActions); - }; - Worksheet.prototype.selectTuplesAsync = function (selectedTuples, selectOption, tooltip) { + } + selectTuplesAsync(selectedTuples, selectOption, tooltip) { return this._worksheetImpl.selectTuplesAsync(selectedTuples, selectOption, tooltip); - }; - Worksheet.prototype.getTooltipTextAsync = function (tupleId) { + } + getTooltipTextAsync(tupleId) { return this._worksheetImpl.getTooltipTextAsync(tupleId); - }; - Worksheet.prototype.leaveMarkNavigationAsync = function () { + } + leaveMarkNavigationAsync() { return this._worksheetImpl.leaveMarkNavigationAsync(); - }; - Worksheet.prototype.editAliasesDialogAsync = function (fieldName) { + } + editAliasesDialogAsync(fieldName) { return this._worksheetImpl.editAliasesDialogAsync(fieldName); - }; - Worksheet.prototype.visualIdsAreEqual = function (a, b) { + } + visualIdsAreEqual(a, b) { return (a && b && a.worksheet === b.worksheet && a.dashboard === b.dashboard && a.storyboard === b.storyboard && a.storyPointID === b.storyPointID); - }; - return Worksheet; -}(Sheet_1.Sheet)); + } +} exports.Worksheet = Worksheet; @@ -7151,19 +1588,14 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); * This does not follow the Impl pattern as DashboardContent is * currently just a (single) property bag. */ -var DashboardContent = /** @class */ (function () { - function DashboardContent(_dashboard) { +class DashboardContent { + constructor(_dashboard) { this._dashboard = _dashboard; } - Object.defineProperty(DashboardContent.prototype, "dashboard", { - get: function () { - return this._dashboard; - }, - enumerable: true, - configurable: true - }); - return DashboardContent; -}()); + get dashboard() { + return this._dashboard; + } +} exports.DashboardContent = DashboardContent; @@ -7178,17 +1610,17 @@ exports.DashboardContent = DashboardContent; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); -var ConnectedServer_1 = __webpack_require__(/*! ../Impl/ConnectedServer */ "./lib/src/ExtensionsApi/Impl/ConnectedServer.js"); -var WorkbookFormattingEnvUtil_1 = __webpack_require__(/*! ./WorkbookFormattingEnvUtil */ "./lib/src/ExtensionsApi/Namespaces/WorkbookFormattingEnvUtil.js"); +const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +const ConnectedServer_1 = __webpack_require__(/*! ../Impl/ConnectedServer */ "./lib/src/ExtensionsApi/Impl/ConnectedServer.js"); +const WorkbookFormattingEnvUtil_1 = __webpack_require__(/*! ./WorkbookFormattingEnvUtil */ "./lib/src/ExtensionsApi/Namespaces/WorkbookFormattingEnvUtil.js"); /** * Implementation of the external environment namespace. * Environment does not follow the Impl pattern as it is * just a property bag. * First class extensions can get to ConnectedServer with: environment['connectedServer'] */ -var Environment = /** @class */ (function () { - function Environment(extensionEnvironment) { +class Environment { + constructor(extensionEnvironment) { this._apiVersion = api_shared_js_1.ApiVersion.Instance && api_shared_js_1.ApiVersion.Instance.formattedValue; // maj.min.fix (no build) this._context = api_shared_js_1.InternalToExternalEnumMappings.extensionContext.convert(extensionEnvironment.extensionContext); this._formatting = WorkbookFormattingEnvUtil_1.WorkbookFormattingEnvUtil.convertToWorkbookFormatting(extensionEnvironment.workbookFormatting); @@ -7205,78 +1637,37 @@ var Environment = /** @class */ (function () { this.featureFlags = extensionEnvironment.featureFlags; } } - Object.defineProperty(Environment.prototype, "apiVersion", { - get: function () { - return this._apiVersion; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Environment.prototype, "context", { - get: function () { - return this._context; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Environment.prototype, "workbookFormatting", { - get: function () { - return this._formatting; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Environment.prototype, "language", { - get: function () { - return this._language; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Environment.prototype, "country", { - get: function () { - return this._country; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Environment.prototype, "locale", { - get: function () { - return this._locale; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Environment.prototype, "mode", { - get: function () { - return this._mode; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Environment.prototype, "operatingSystem", { - get: function () { - return this._operatingSystem; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Environment.prototype, "tableauVersion", { - get: function () { - return this._tableauVersion; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Environment.prototype, "uniqueUserId", { - get: function () { - return this._uniqueUserId; - }, - enumerable: true, - configurable: true - }); - return Environment; -}()); + get apiVersion() { + return this._apiVersion; + } + get context() { + return this._context; + } + get workbookFormatting() { + return this._formatting; + } + get language() { + return this._language; + } + get country() { + return this._country; + } + get locale() { + return this._locale; + } + get mode() { + return this._mode; + } + get operatingSystem() { + return this._operatingSystem; + } + get tableauVersion() { + return this._tableauVersion; + } + get uniqueUserId() { + return this._uniqueUserId; + } +} exports.Environment = Environment; @@ -7294,74 +1685,45 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); /** * Implementation of the external Extensions namespace. */ -var Extensions = /** @class */ (function () { - function Extensions(extensionImpl) { +class Extensions { + constructor(extensionImpl) { this.extensionImpl = extensionImpl; this.extensionImpl = extensionImpl; } - Object.defineProperty(Extensions.prototype, "dashboardContent", { - get: function () { - return this.extensionImpl.dashboardContent; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Extensions.prototype, "worksheetContent", { - get: function () { - return this.extensionImpl.worksheetContent; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Extensions.prototype, "environment", { - get: function () { - return this.extensionImpl.environment; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Extensions.prototype, "settings", { - get: function () { - return this.extensionImpl.settings; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Extensions.prototype, "ui", { - get: function () { - return this.extensionImpl.ui; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Extensions.prototype, "workbook", { - get: function () { - return this.extensionImpl.workbook; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Extensions.prototype, "dashboardObjectId", { - get: function () { - return this.extensionImpl.extensionZoneId; - }, - enumerable: true, - configurable: true - }); - Extensions.prototype.initializeAsync = function (contextMenuCallbacks) { + get dashboardContent() { + return this.extensionImpl.dashboardContent; + } + get worksheetContent() { + return this.extensionImpl.worksheetContent; + } + get environment() { + return this.extensionImpl.environment; + } + get settings() { + return this.extensionImpl.settings; + } + get ui() { + return this.extensionImpl.ui; + } + get workbook() { + return this.extensionImpl.workbook; + } + get dashboardObjectId() { + return this.extensionImpl.extensionZoneId; + } + initializeAsync(contextMenuCallbacks) { return this.extensionImpl.initializeAsync(false, contextMenuCallbacks).then(); - }; - Extensions.prototype.initializeDialogAsync = function () { + } + initializeDialogAsync() { return this.extensionImpl.initializeAsync(true); - }; - Extensions.prototype.createVizImageAsync = function (inputSpec) { + } + createVizImageAsync(inputSpec) { return this.extensionImpl.createVizImageAsync(inputSpec); - }; - Extensions.prototype.setClickThroughAsync = function (clickThroughEnabled) { + } + setClickThroughAsync(clickThroughEnabled) { return this.extensionImpl.setClickThroughAsync(clickThroughEnabled); - }; - return Extensions; -}()); + } +} exports.Extensions = Extensions; @@ -7371,61 +1733,41 @@ exports.Extensions = Extensions; /*!******************************************************!*\ !*** ./lib/src/ExtensionsApi/Namespaces/Settings.js ***! \******************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; -var __extends = (this && this.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); Object.defineProperty(exports, "__esModule", ({ value: true })); -var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); /** * Implementation of the external settings namespace. */ -var Settings = /** @class */ (function (_super) { - __extends(Settings, _super); - function Settings(_settingsImpl) { - var _this = _super.call(this) || this; - _this._settingsImpl = _settingsImpl; +class Settings extends api_shared_js_1.EventListenerManager { + constructor(_settingsImpl) { + super(); + this._settingsImpl = _settingsImpl; // Initialize our event handling for this class - _this._settingsImpl.initializeEvents().forEach(function (e) { return _this.addNewEventType(e); }); - return _this; + this._settingsImpl.initializeEvents().forEach((e) => this.addNewEventType(e)); } - Settings.prototype.erase = function (key) { + erase(key) { this._settingsImpl.erase(key); - }; - Settings.prototype.get = function (key) { + } + get(key) { return this._settingsImpl.get(key); - }; - Settings.prototype.getAll = function () { + } + getAll() { return this._settingsImpl.getAll(); - }; - Object.defineProperty(Settings.prototype, "isModified", { - get: function () { - return this._settingsImpl.isModified; - }, - enumerable: true, - configurable: true - }); - Settings.prototype.saveAsync = function () { + } + get isModified() { + return this._settingsImpl.isModified; + } + saveAsync() { return this._settingsImpl.saveAsync(); - }; - Settings.prototype.set = function (key, value) { + } + set(key, value) { this._settingsImpl.set(key, value); - }; - return Settings; -}(api_shared_js_1.EventListenerManager)); + } +} exports.Settings = Settings; @@ -7435,26 +1777,32 @@ exports.Settings = Settings; /*!************************************************!*\ !*** ./lib/src/ExtensionsApi/Namespaces/UI.js ***! \************************************************/ -/***/ ((__unused_webpack_module, exports) => { +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); /** * Implementation of the external UI namespace. */ -var UI = /** @class */ (function () { - function UI(_impl) { +class UI extends api_shared_js_1.EventListenerManager { + constructor(_impl) { + super(); this._impl = _impl; + // Initialize our event handling for this class + this._impl.initializeEvents().forEach((e) => this.addNewEventType(e)); } - UI.prototype.displayDialogAsync = function (url, payload, options) { + displayDialogAsync(url, payload, options) { return this._impl.displayDialogAsync(url, payload, options); - }; - UI.prototype.closeDialog = function (payload) { + } + sendDialogMessageAsync(message, targetDialogUrl) { + return this._impl.sendDialogMessageAsync(message, targetDialogUrl); + } + closeDialog(payload) { this._impl.closeDialog(payload); - }; - return UI; -}()); + } +} exports.UI = UI; @@ -7469,30 +1817,27 @@ exports.UI = UI; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); -var WorkbookFormattingEnvUtil = /** @class */ (function () { - function WorkbookFormattingEnvUtil() { - } - WorkbookFormattingEnvUtil.convertToWorkbookFormatting = function (workbookFormattingModel) { +const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +class WorkbookFormattingEnvUtil { + static convertToWorkbookFormatting(workbookFormattingModel) { if (!workbookFormattingModel) { return undefined; } else { - var formattingMap = workbookFormattingModel.formattingSheets.map(function (currentFormattingSheet) { - var formattingSheet = { + const formattingMap = workbookFormattingModel.formattingSheets.map((currentFormattingSheet) => { + const formattingSheet = { classNameKey: api_shared_js_1.InternalToExternalEnumMappings.classNameKey.convert(currentFormattingSheet.classNameKey), cssProperties: getCssProperties(currentFormattingSheet.classNameKey, currentFormattingSheet.cssProperties), }; return formattingSheet; }); - var result = { + const result = { formattingSheets: formattingMap, }; return result; } - }; - return WorkbookFormattingEnvUtil; -}()); + } +} exports.WorkbookFormattingEnvUtil = WorkbookFormattingEnvUtil; function getCssProperties(classNameKey, cssProperties) { if (classNameKey === "tableau-row-dividers" /* RowDividers */ || classNameKey === "tableau-column-dividers" /* ColumnDividers */) { @@ -7529,19 +1874,14 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); * This does not follow the Impl pattern as WorksheetContent is * currently just a (single) property bag. */ -var WorksheetContent = /** @class */ (function () { - function WorksheetContent(_worksheet) { +class WorksheetContent { + constructor(_worksheet) { this._worksheet = _worksheet; } - Object.defineProperty(WorksheetContent.prototype, "worksheet", { - get: function () { - return this._worksheet; - }, - enumerable: true, - configurable: true - }); - return WorksheetContent; -}()); + get worksheet() { + return this._worksheet; + } +} exports.WorksheetContent = WorksheetContent; @@ -7551,53 +1891,30 @@ exports.WorksheetContent = WorksheetContent; /*!**************************************************************************!*\ !*** ./lib/src/ExtensionsApi/Services/Impl/InitializationServiceImpl.js ***! \**************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; -var __extends = (this && this.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); Object.defineProperty(exports, "__esModule", ({ value: true })); -var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); -var InitializationServiceImpl = /** @class */ (function (_super) { - __extends(InitializationServiceImpl, _super); - function InitializationServiceImpl() { - return _super !== null && _super.apply(this, arguments) || this; - } - Object.defineProperty(InitializationServiceImpl.prototype, "serviceName", { - get: function () { - return "InitializationService" /* InitializationService */; - }, - enumerable: true, - configurable: true - }); - InitializationServiceImpl.prototype.initializeDashboardExtensionsAsync = function (isExtensionDialog, contextMenuIds) { - var _a; - var params = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'initializeDashboardExtensionsAsync', - _a[api_internal_contract_js_1.ParameterId.ExtensionContextMenuIds] = contextMenuIds, - _a[api_internal_contract_js_1.ParameterId.IsExtensionDialog] = isExtensionDialog, - _a); - return this.execute(api_internal_contract_js_1.VerbId.InitializeExtension, params).then(function (response) { +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +class InitializationServiceImpl extends api_shared_js_1.ServiceImplBase { + get serviceName() { + return "InitializationService" /* InitializationService */; + } + initializeDashboardExtensionsAsync(isExtensionDialog, contextMenuIds) { + const params = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'initializeDashboardExtensionsAsync', + [api_internal_contract_js_1.ParameterId.ExtensionContextMenuIds]: contextMenuIds, + [api_internal_contract_js_1.ParameterId.IsExtensionDialog]: isExtensionDialog, + }; + return this.execute(api_internal_contract_js_1.VerbId.InitializeExtension, params).then((response) => { // TODO - Validate return value - var result = response.result; + const result = response.result; return result; }); - }; - return InitializationServiceImpl; -}(api_shared_js_1.ServiceImplBase)); + } +} exports.InitializationServiceImpl = InitializationServiceImpl; @@ -7607,55 +1924,32 @@ exports.InitializationServiceImpl = InitializationServiceImpl; /*!********************************************************************!*\ !*** ./lib/src/ExtensionsApi/Services/Impl/SettingsServiceImpl.js ***! \********************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; -var __extends = (this && this.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); Object.defineProperty(exports, "__esModule", ({ value: true })); -var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); -var SettingsServiceImpl = /** @class */ (function (_super) { - __extends(SettingsServiceImpl, _super); - function SettingsServiceImpl() { - return _super !== null && _super.apply(this, arguments) || this; - } - Object.defineProperty(SettingsServiceImpl.prototype, "serviceName", { - get: function () { - return "SettingsService" /* SettingsService */; - }, - enumerable: true, - configurable: true - }); - SettingsServiceImpl.prototype.saveSettingsAsync = function (settings) { - var _a; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'saveSettingsAsync', - _a[api_internal_contract_js_1.ParameterId.SettingsValues] = settings, - _a); - return this.execute(api_internal_contract_js_1.VerbId.SaveExtensionSettings, parameters).then(function (value) { - var result = value.result; +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +class SettingsServiceImpl extends api_shared_js_1.ServiceImplBase { + get serviceName() { + return "SettingsService" /* SettingsService */; + } + saveSettingsAsync(settings) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'saveSettingsAsync', + [api_internal_contract_js_1.ParameterId.SettingsValues]: settings, + }; + return this.execute(api_internal_contract_js_1.VerbId.SaveExtensionSettings, parameters).then((value) => { + const result = value.result; if (!result || !result.settingsValues) { throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, 'Unexpected error savings settings.'); } return result.settingsValues; }); - }; - return SettingsServiceImpl; -}(api_shared_js_1.ServiceImplBase)); + } +} exports.SettingsServiceImpl = SettingsServiceImpl; @@ -7665,52 +1959,30 @@ exports.SettingsServiceImpl = SettingsServiceImpl; /*!**************************************************************!*\ !*** ./lib/src/ExtensionsApi/Services/Impl/UIServiceImpl.js ***! \**************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; -var __extends = (this && this.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); Object.defineProperty(exports, "__esModule", ({ value: true })); -var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); -var DEFAULT_DIALOG_HEIGHT = 400; // in pixels -var DEFAULT_DIALOG_WIDTH = 600; // in pixels -var DEFAULT_DIALOG_STYLE = api_external_contract_js_1.DialogStyle.Window; -var UIServiceImpl = /** @class */ (function (_super) { - __extends(UIServiceImpl, _super); - function UIServiceImpl() { - return _super !== null && _super.apply(this, arguments) || this; - } - Object.defineProperty(UIServiceImpl.prototype, "serviceName", { - get: function () { - return "UIService" /* UIService */; - }, - enumerable: true, - configurable: true - }); - UIServiceImpl.prototype.displayDialogAsync = function (url, payload, options) { - var _a; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'displayDialogAsync', - _a[api_internal_contract_js_1.ParameterId.ExtensionDialogUrl] = url, - _a[api_internal_contract_js_1.ParameterId.ExtensionDialogPayload] = payload, - _a); - var h = options && options.height ? options.height : DEFAULT_DIALOG_HEIGHT; - var w = options && options.width ? options.width : DEFAULT_DIALOG_WIDTH; - var dialogStyle = options && options.dialogStyle ? options.dialogStyle : DEFAULT_DIALOG_STYLE; +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +const DEFAULT_DIALOG_HEIGHT = 400; // in pixels +const DEFAULT_DIALOG_WIDTH = 600; // in pixels +const DEFAULT_DIALOG_STYLE = api_external_contract_js_1.DialogStyle.Window; +class UIServiceImpl extends api_shared_js_1.ServiceImplBase { + get serviceName() { + return "UIService" /* UIService */; + } + displayDialogAsync(url, payload, options) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'displayDialogAsync', + [api_internal_contract_js_1.ParameterId.ExtensionDialogUrl]: url, + [api_internal_contract_js_1.ParameterId.ExtensionDialogPayload]: payload, + }; + const h = options && options.height ? options.height : DEFAULT_DIALOG_HEIGHT; + const w = options && options.width ? options.width : DEFAULT_DIALOG_WIDTH; + const dialogStyle = options && options.dialogStyle ? options.dialogStyle : DEFAULT_DIALOG_STYLE; // On the platform side, we do something reasonable regardess of whether the passed // height and width are too large or too small. But this likely indicates a developer error, // so we throw an error here to help with debugging. @@ -7721,8 +1993,8 @@ var UIServiceImpl = /** @class */ (function (_super) { parameters[api_internal_contract_js_1.ParameterId.ExtensionDialogW] = w; api_shared_js_1.ErrorHelpers.verifyEnumValue(dialogStyle, api_external_contract_js_1.DialogStyle, 'DialogStyle'); parameters[api_internal_contract_js_1.ParameterId.ExtensionDialogStyle] = api_shared_js_1.ExternalToInternalEnumMappings.dialogStyles.convert(dialogStyle); - return this.execute(api_internal_contract_js_1.VerbId.DisplayDialog, parameters).then(function (response) { - var dialogResult = response.result; + return this.execute(api_internal_contract_js_1.VerbId.DisplayDialog, parameters).then((response) => { + const dialogResult = response.result; switch (dialogResult) { case api_internal_contract_js_1.ExtensionDialogResult.DialogAlreadyOpen: throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.DialogAlreadyOpen, 'There already exists an open dialog for this extension.'); @@ -7733,35 +2005,44 @@ var UIServiceImpl = /** @class */ (function (_super) { return; } }); - }; - UIServiceImpl.prototype.closeDialog = function (payload) { - var _a; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'closeDialog', - _a); + } + closeDialog(payload) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'closeDialog', + }; if (payload) { parameters[api_internal_contract_js_1.ParameterId.ExtensionDialogPayload] = payload; } - return this.execute(api_internal_contract_js_1.VerbId.CloseDialog, parameters).then(function () { + return this.execute(api_internal_contract_js_1.VerbId.CloseDialog, parameters).then(() => { return; }); - }; - UIServiceImpl.prototype.setClickThroughAsync = function (clickThroughEnabled, extensionZoneId) { - var _a; + } + sendDialogMessageAsync(message, targetDialogUrl) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'sendDialogMessage', + [api_internal_contract_js_1.ParameterId.ExtensionDialogMessage]: message, + }; + if (targetDialogUrl) { + parameters[api_internal_contract_js_1.ParameterId.ExtensionDialogUrl] = targetDialogUrl; + } + return this.execute(api_internal_contract_js_1.VerbId.SendDialogMessage, parameters).then(() => { + return; + }); + } + setClickThroughAsync(clickThroughEnabled, extensionZoneId) { api_shared_js_1.ErrorHelpers.verifyParameterType(clickThroughEnabled, 'boolean', 'clickThroughEnabled'); if (extensionZoneId === undefined || extensionZoneId <= 0) { throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, 'Extension Id is invalid.'); } - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.ExtensionZoneId] = extensionZoneId, - _a[api_internal_contract_js_1.ParameterId.ClickThroughEnabled] = clickThroughEnabled, - _a); - return this.execute(api_internal_contract_js_1.VerbId.SetClickThrough, parameters).then(function () { + const parameters = { + [api_internal_contract_js_1.ParameterId.ExtensionZoneId]: extensionZoneId, + [api_internal_contract_js_1.ParameterId.ClickThroughEnabled]: clickThroughEnabled, + }; + return this.execute(api_internal_contract_js_1.VerbId.SetClickThrough, parameters).then(() => { return; }); - }; - return UIServiceImpl; -}(api_shared_js_1.ServiceImplBase)); + } +} exports.UIServiceImpl = UIServiceImpl; @@ -7776,11 +2057,11 @@ exports.UIServiceImpl = UIServiceImpl; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); -var InitializationServiceImpl_1 = __webpack_require__(/*! ./Impl/InitializationServiceImpl */ "./lib/src/ExtensionsApi/Services/Impl/InitializationServiceImpl.js"); -var SettingsServiceImpl_1 = __webpack_require__(/*! ./Impl/SettingsServiceImpl */ "./lib/src/ExtensionsApi/Services/Impl/SettingsServiceImpl.js"); -var UIServiceImpl_1 = __webpack_require__(/*! ./Impl/UIServiceImpl */ "./lib/src/ExtensionsApi/Services/Impl/UIServiceImpl.js"); -var ServiceRegistryUtil_1 = __webpack_require__(/*! ./ServiceRegistryUtil */ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js"); +const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +const InitializationServiceImpl_1 = __webpack_require__(/*! ./Impl/InitializationServiceImpl */ "./lib/src/ExtensionsApi/Services/Impl/InitializationServiceImpl.js"); +const SettingsServiceImpl_1 = __webpack_require__(/*! ./Impl/SettingsServiceImpl */ "./lib/src/ExtensionsApi/Services/Impl/SettingsServiceImpl.js"); +const UIServiceImpl_1 = __webpack_require__(/*! ./Impl/UIServiceImpl */ "./lib/src/ExtensionsApi/Services/Impl/UIServiceImpl.js"); +const ServiceRegistryUtil_1 = __webpack_require__(/*! ./ServiceRegistryUtil */ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js"); function registerAllExtensionsServices(dispatcher) { api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).registerService(new SettingsServiceImpl_1.SettingsServiceImpl(dispatcher, ServiceRegistryUtil_1.ExtensionsRegistryId)); api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).registerService(new UIServiceImpl_1.UIServiceImpl(dispatcher, ServiceRegistryUtil_1.ExtensionsRegistryId)); @@ -8380,6 +2661,12 @@ var TableauEventType; * @category Pulse */ TableauEventType["PulseInsightDiscovered"] = "pulseinsightdiscovered"; + /** + * Fired when the Pulse metric size changes + * + * @category Pulse + */ + TableauEventType["PulseMetricSizeChanged"] = "pulsemetricsizechanged"; /** * Fired when the Pulse metric time dimension changes * @@ -8455,6 +2742,7 @@ var PulseAttributes; PulseAttributes["OnPulseUrlError"] = "onPulseError"; PulseAttributes["OnPulseFiltersChanged"] = "onPulseFiltersChanged"; PulseAttributes["OnPulseInsightDiscovered"] = "onPulseInsightDiscovered"; + PulseAttributes["OnPulseMetricSizeChanged"] = "onPulseMetricSizeChanged"; PulseAttributes["OnPulseTimeDimensionChanged"] = "onPulseTimeDimensionChanged"; PulseAttributes["OnPulseUrlChanged"] = "onPulseUrlChanged"; PulseAttributes["TimeDimension"] = "time-dimension"; @@ -8660,7 +2948,7 @@ var Tableau; /** * All error codes used by the Extensions API. */ - var ErrorCodes; + let ErrorCodes; (function (ErrorCodes) { /** * Thrown when caller attempts to execute command before initialization has completed. @@ -8718,15 +3006,18 @@ var Tableau; /** * The context in which the Extensions is currently running. */ - var ExtensionContext; + let ExtensionContext; (function (ExtensionContext) { ExtensionContext["Desktop"] = "desktop"; ExtensionContext["Server"] = "server"; + ExtensionContext["Cloud"] = "cloud"; + ExtensionContext["PublicWeb"] = "public-web"; + ExtensionContext["PublicDesktop"] = "public-desktop"; })(ExtensionContext = Tableau.ExtensionContext || (Tableau.ExtensionContext = {})); /** * The mode in which the Extensions is currently running. */ - var ExtensionMode; + let ExtensionMode; (function (ExtensionMode) { ExtensionMode["Authoring"] = "authoring"; ExtensionMode["Viewing"] = "viewing"; @@ -8734,8 +3025,12 @@ var Tableau; /** * Represents the type of event that can be listened for. */ - var TableauEventType; + let TableauEventType; (function (TableauEventType) { + /** + * @experimental + * Raised when a message is received that was sent by a dialog or extension via `sendDialogMessageAsync`.*/ + TableauEventType["DialogMessageReceived"] = "dialog-message-received"; /** Raised when any filter has changed state. You can use this event type with [Worksheet](../interfaces/worksheet.html) objects.*/ TableauEventType["FilterChanged"] = "filter-changed"; /** The selected marks on a visualization has changed. @@ -8765,7 +3060,7 @@ var Tableau; * Enum that represents the data type of encodings for createVizImageAsync. * @since 1.6.0 */ - var VizImageEncodingType; + let VizImageEncodingType; (function (VizImageEncodingType) { VizImageEncodingType["Discrete"] = "discrete"; VizImageEncodingType["Continuous"] = "continuous"; @@ -8774,7 +3069,7 @@ var Tableau; * Enum that represents the sort direction for createVizImageAsync. * @since 1.8.0 and Tableau 2021.4 */ - var VizImageSortDirectionType; + let VizImageSortDirectionType; (function (VizImageSortDirectionType) { VizImageSortDirectionType["Ascending"] = "ascending"; VizImageSortDirectionType["Descending"] = "descending"; @@ -8783,7 +3078,7 @@ var Tableau; * Enum that represents the palette type for createVizImageAsync. * @since 1.8.0 and Tableau 2021.4 */ - var VizImagePaletteType; + let VizImagePaletteType; (function (VizImagePaletteType) { VizImagePaletteType["CustomDiverging"] = "custom-diverging"; VizImagePaletteType["CustomSequential"] = "custom-sequential"; @@ -8792,7 +3087,7 @@ var Tableau; * Enum that represents the Size Setting type for createVizImageAsync. * @since 1.8.0 and Tableau 2021.4 */ - var VizImageSizeSettingType; + let VizImageSizeSettingType; (function (VizImageSizeSettingType) { VizImageSizeSettingType["Fixed"] = "fixed"; VizImageSizeSettingType["Manual"] = "manual"; @@ -8801,7 +3096,7 @@ var Tableau; * Enum that represents the Size Setting alignment type for createVizImageAsync. * @since 1.8.0 and Tableau 2021.4 */ - var VizImageSizeSettingAlignmentType; + let VizImageSizeSettingAlignmentType; (function (VizImageSizeSettingAlignmentType) { VizImageSizeSettingAlignmentType["Right"] = "right"; VizImageSizeSettingAlignmentType["Left"] = "left"; @@ -8906,46 +3201,35 @@ var SharedErrorCodes; /*!*****************************************************************************************!*\ !*** ../api-external-contract-js/lib/src/ExternalContract/Shared/Namespaces/Tableau.js ***! \*****************************************************************************************/ -/***/ (function(module) { +/***/ ((module) => { "use strict"; -var __assign = (this && this.__assign) || function () { - __assign = Object.assign || function(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) - t[p] = s[p]; - } - return t; - }; - return __assign.apply(this, arguments); -}; /** * The tableau namespace exists for organization and to avoid polluting * the global namespace. It contains no constructs other than sub-namespaces and the Tableau enumerations. */ var Tableau; (function (Tableau) { - var AnalyticsObjectType; + let AnalyticsObjectType; (function (AnalyticsObjectType) { AnalyticsObjectType["Cluster"] = "cluster"; AnalyticsObjectType["Forecast"] = "forecast"; AnalyticsObjectType["TrendLine"] = "trend-line"; })(AnalyticsObjectType = Tableau.AnalyticsObjectType || (Tableau.AnalyticsObjectType = {})); - var AnnotationType; + let AnnotationType; (function (AnnotationType) { AnnotationType["Mark"] = "mark"; AnnotationType["Point"] = "point"; AnnotationType["Area"] = "area"; })(AnnotationType = Tableau.AnnotationType || (Tableau.AnnotationType = {})); - var ColumnType; + let ColumnType; (function (ColumnType) { ColumnType["Discrete"] = "discrete"; ColumnType["Continuous"] = "continuous"; ColumnType["Unknown"] = "unknown"; })(ColumnType = Tableau.ColumnType || (Tableau.ColumnType = {})); - var ClassNameKey; + let ClassNameKey; (function (ClassNameKey) { ClassNameKey["WorksheetTitle"] = "tableau-worksheet-title"; ClassNameKey["Worksheet"] = "tableau-worksheet"; @@ -8959,7 +3243,7 @@ var Tableau; /** * What the object represents in a dashboard. */ - var DashboardObjectType; + let DashboardObjectType; (function (DashboardObjectType) { DashboardObjectType["Blank"] = "blank"; DashboardObjectType["Worksheet"] = "worksheet"; @@ -8977,7 +3261,7 @@ var Tableau; * Enum that represents the visibility state of a dashboard object. * @since 1.7.0 */ - var DashboardObjectVisibilityType; + let DashboardObjectVisibilityType; (function (DashboardObjectVisibilityType) { /** Used for turning on the visibility of a dashboard object.*/ DashboardObjectVisibilityType["Show"] = "show"; @@ -8987,7 +3271,7 @@ var Tableau; /** * The different types of data a value can have */ - var DataType; + let DataType; (function (DataType) { DataType["String"] = "string"; DataType["Int"] = "int"; @@ -9001,7 +3285,7 @@ var Tableau; /** * Enum that represents the changes that occur to a dashboard object. */ - var DashboardLayoutChange; + let DashboardLayoutChange; (function (DashboardLayoutChange) { /** A dashboard object was added */ DashboardLayoutChange["Added"] = "added"; @@ -9027,7 +3311,7 @@ var Tableau; /** * Valid date ranges for a relative date filter. */ - var DateRangeType; + let DateRangeType; (function (DateRangeType) { DateRangeType["Last"] = "last"; DateRangeType["LastN"] = "last-n"; @@ -9039,13 +3323,13 @@ var Tableau; /** * Enum that represents the types of dialog popup styles. */ - var DialogStyle; + let DialogStyle; (function (DialogStyle) { DialogStyle["Window"] = "window"; DialogStyle["Modal"] = "modal"; DialogStyle["Modeless"] = "modeless"; })(DialogStyle = Tableau.DialogStyle || (Tableau.DialogStyle = {})); - var EncodingType; + let EncodingType; (function (EncodingType) { EncodingType["Column"] = "column"; EncodingType["Row"] = "row"; @@ -9067,7 +3351,7 @@ var Tableau; /** * Type of aggregation on a field. */ - var FieldAggregationType; + let FieldAggregationType; (function (FieldAggregationType) { FieldAggregationType["Sum"] = "sum"; FieldAggregationType["Avg"] = "avg"; @@ -9113,7 +3397,7 @@ var Tableau; /** * Role of a field. */ - var FieldRoleType; + let FieldRoleType; (function (FieldRoleType) { FieldRoleType["Dimension"] = "dimension"; FieldRoleType["Measure"] = "measure"; @@ -9122,7 +3406,7 @@ var Tableau; /** * An enumeration of the valid types of filters that can be applied. */ - var FilterType; + let FilterType; (function (FilterType) { FilterType["Categorical"] = "categorical"; FilterType["Range"] = "range"; @@ -9132,7 +3416,7 @@ var Tableau; /** * The different update types for applying filter */ - var FilterUpdateType; + let FilterUpdateType; (function (FilterUpdateType) { FilterUpdateType["Add"] = "add"; FilterUpdateType["All"] = "all"; @@ -9142,7 +3426,7 @@ var Tableau; /** * The domain type for a filter */ - var FilterDomainType; + let FilterDomainType; (function (FilterDomainType) { /** * The domain values that are relevant to the specified filter @@ -9158,7 +3442,7 @@ var Tableau; * The option for specifying which values to include for filtering * Indicates what to do with null values for a given filter or mark selection call. */ - var FilterNullOption; + let FilterNullOption; (function (FilterNullOption) { FilterNullOption["NullValues"] = "null-values"; FilterNullOption["NonNullValues"] = "non-null-values"; @@ -9172,7 +3456,7 @@ var Tableau; * Please note that all properties not requested will be `undefined` in the DataValue results. * @since 1.5.0 */ - var IncludeDataValuesOption; + let IncludeDataValuesOption; (function (IncludeDataValuesOption) { /** DataValues will include all properties.*/ IncludeDataValuesOption["AllValues"] = "all-values"; @@ -9184,7 +3468,7 @@ var Tableau; /** * Type of mark for a given marks card in a viz. */ - var MarkType; + let MarkType; (function (MarkType) { MarkType["Bar"] = "bar"; MarkType["Line"] = "line"; @@ -9204,7 +3488,7 @@ var Tableau; * An enumeration describing the different types of allowable values. * This is used for restricting the domain of a parameter */ - var ParameterValueType; + let ParameterValueType; (function (ParameterValueType) { ParameterValueType["All"] = "all"; ParameterValueType["List"] = "list"; @@ -9213,7 +3497,7 @@ var Tableau; /** * Date period used in filters and in parameters. */ - var PeriodType; + let PeriodType; (function (PeriodType) { PeriodType["Years"] = "years"; PeriodType["Quarters"] = "quarters"; @@ -9224,7 +3508,7 @@ var Tableau; PeriodType["Minutes"] = "minutes"; PeriodType["Seconds"] = "seconds"; })(PeriodType = Tableau.PeriodType || (Tableau.PeriodType = {})); - var QuickTableCalcType; + let QuickTableCalcType; (function (QuickTableCalcType) { QuickTableCalcType["RunningTotal"] = "running-total"; QuickTableCalcType["Difference"] = "difference"; @@ -9242,7 +3526,7 @@ var Tableau; /** * Enum for specifying the selection type for select marks api. */ - var SelectionUpdateType; + let SelectionUpdateType; (function (SelectionUpdateType) { SelectionUpdateType["Replace"] = "select-replace"; SelectionUpdateType["Add"] = "select-add"; @@ -9251,7 +3535,7 @@ var Tableau; /** * Enum for specifying the select option for the `extensions.Worksheet.selectTuplesAsync` method. */ - var SelectOptions; + let SelectOptions; (function (SelectOptions) { /** * Clears existing selection before selecting the tuples specified @@ -9265,18 +3549,18 @@ var Tableau; /** * The type of sheet a [[Sheet]] object represents */ - var SheetType; + let SheetType; (function (SheetType) { SheetType["Dashboard"] = "dashboard"; SheetType["Story"] = "story"; SheetType["Worksheet"] = "worksheet"; })(SheetType = Tableau.SheetType || (Tableau.SheetType = {})); - var SortDirection; + let SortDirection; (function (SortDirection) { SortDirection["Increasing"] = "increasing"; SortDirection["Decreasing"] = "decreasing"; })(SortDirection = Tableau.SortDirection || (Tableau.SortDirection = {})); - var TrendLineModelType; + let TrendLineModelType; (function (TrendLineModelType) { TrendLineModelType["Linear"] = "linear"; TrendLineModelType["Logarithmic"] = "logarithmic"; @@ -9287,7 +3571,7 @@ var Tableau; * Enum that represents the replay speed of an animation. * @since 1.7.0 */ - var ReplaySpeedType; + let ReplaySpeedType; (function (ReplaySpeedType) { /** Used for setting the replay speed of an animation to 0.5x.*/ ReplaySpeedType["Slow"] = "slow"; @@ -9300,14 +3584,14 @@ var Tableau; * Enum that represents the selection state of a level in a hierarchical filter * @since Extensions 1.10.0 */ - var HierarchicalLevelSelectionState; + let HierarchicalLevelSelectionState; (function (HierarchicalLevelSelectionState) { HierarchicalLevelSelectionState["AllSelected"] = "all-selected"; HierarchicalLevelSelectionState["NoneSelected"] = "none-selected"; HierarchicalLevelSelectionState["SomeSelected"] = "some-selected"; HierarchicalLevelSelectionState["UnknownSelected"] = "unknown-selected"; })(HierarchicalLevelSelectionState = Tableau.HierarchicalLevelSelectionState || (Tableau.HierarchicalLevelSelectionState = {})); - Tableau.ZoneVisibilityType = __assign({}, DashboardObjectVisibilityType); + Tableau.ZoneVisibilityType = Object.assign({}, DashboardObjectVisibilityType); })(Tableau || (Tableau = {})); module.exports = Tableau; @@ -9380,14 +3664,10 @@ function __export(m) { for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; } Object.defineProperty(exports, "__esModule", ({ value: true })); -// The following polyfills are needed for IE11 -__webpack_require__(/*! core-js/es/number/is-integer */ "../../node_modules/core-js/es/number/is-integer.js"); -__webpack_require__(/*! core-js/es/number/is-nan */ "../../node_modules/core-js/es/number/is-nan.js"); -__webpack_require__(/*! core-js/es/object/assign */ "../../node_modules/core-js/es/object/assign.js"); // Export the version of the internal contract to be available at runtime // This file is generated by yarn publish:bump via scripts/publish-check.ts // updateInternalContractRuntimeVersion in the monorepo root. -var internalContractVersion = __webpack_require__(/*! ../internal-contract-version.json */ "../api-internal-contract-js/lib/internal-contract-version.json"); +const internalContractVersion = __webpack_require__(/*! ../internal-contract-version.json */ "../api-internal-contract-js/lib/internal-contract-version.json"); exports.INTERNAL_CONTRACT_VERSION = internalContractVersion; __export(__webpack_require__(/*! ./contract/DataTypeConverter */ "../api-internal-contract-js/lib/src/contract/DataTypeConverter.js")); __export(__webpack_require__(/*! ./contract/Enums */ "../api-internal-contract-js/lib/src/contract/Enums.js")); @@ -9399,9 +3679,9 @@ __export(__webpack_require__(/*! ./interface/PulseInterface */ "../api-internal- __export(__webpack_require__(/*! ./interface/VqlInterface */ "../api-internal-contract-js/lib/src/interface/VqlInterface.js")); __export(__webpack_require__(/*! ./messaging/CrossFrameMessenger */ "../api-internal-contract-js/lib/src/messaging/CrossFrameMessenger.js")); __export(__webpack_require__(/*! ./messaging/interface/MessageTypes */ "../api-internal-contract-js/lib/src/messaging/interface/MessageTypes.js")); -__export(__webpack_require__(/*! ./versioning/VersionConverterFactory */ "../api-internal-contract-js/lib/src/versioning/VersionConverterFactory.js")); __export(__webpack_require__(/*! ./versioning/external/ExternalIdentityVersionConverter */ "../api-internal-contract-js/lib/src/versioning/external/ExternalIdentityVersionConverter.js")); __export(__webpack_require__(/*! ./versioning/external/ExternalVersionConverterFactory */ "../api-internal-contract-js/lib/src/versioning/external/ExternalVersionConverterFactory.js")); +__export(__webpack_require__(/*! ./versioning/VersionConverterFactory */ "../api-internal-contract-js/lib/src/versioning/VersionConverterFactory.js")); // Export the version number of messaging for consumers to use. // Be very careful making any updates to this contract which break version compatibility. exports.MESSAGING_VERSION = { @@ -9422,11 +3702,9 @@ exports.MESSAGING_VERSION = { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -var Enums_1 = __webpack_require__(/*! ./Enums */ "../api-internal-contract-js/lib/src/contract/Enums.js"); -var DataTypeConverter = /** @class */ (function () { - function DataTypeConverter() { - } - DataTypeConverter.isSpecial = function (valueAsString) { +const Enums_1 = __webpack_require__(/*! ./Enums */ "../api-internal-contract-js/lib/src/contract/Enums.js"); +class DataTypeConverter { + static isSpecial(valueAsString) { // Prior to ShowDataTablePresModel, special values come to us as // '%null%', '%all%', '%wildcard%', '%missing%'... // While this function will never return true for ShowDataTablePresModel conversion, @@ -9436,36 +3714,37 @@ var DataTypeConverter = /** @class */ (function () { return true; } return false; - }; + } // tslint:disable-next-line:no-any - DataTypeConverter.parseBoolean = function (booleanString) { + static parseBoolean(booleanString) { // boolean values come to us as 'true'|'false' - var normalizedBoolean = booleanString.toLowerCase(); + const normalizedBoolean = booleanString.toLowerCase(); return normalizedBoolean !== 'true' && normalizedBoolean !== 'false' ? this.specialValueIndicator : normalizedBoolean === 'true'; - }; + } // tslint:disable-next-line:no-any - DataTypeConverter.parseNumber = function (valueAsString) { - var value = Number(valueAsString); + static parseNumber(valueAsString) { + const value = Number(valueAsString); return isNaN(value) ? this.specialValueIndicator : value; - }; - DataTypeConverter.parseDate = function (dateAsString) { + } + static parseDate(dateAsString) { // Note that without a time, the date is assumed to be UTC // Input of 2020-03-25 is printed as: Mar 24 2020 17:00:00 GMT-0700 // This matches style used in existing convertFilterValuePresModel - var value = new Date(dateAsString); + const value = new Date(dateAsString); return Number.isNaN(value.getTime()) ? null : value; - }; - DataTypeConverter.parseDateTime = function (dateAsString) { + } + static parseDateTime(dateAsString) { // With a time, the date is assumed to be UTC. // Our date format is always: yyyy-mm-dd hh:mm:ss // Unfortunately, IE11 can't parse that format so we add a T between the day and time. // We also add a Z so that it is UTC. (Without the Z, some browsers assume local, and others UTC) - var formattedDateString = dateAsString.replace(' ', 'T').concat('Z'); - var value = new Date(formattedDateString); + // Even though we've dropped support for IE11, it's riskier/costlier to make updates here. + const formattedDateString = dateAsString.replace(' ', 'T').concat('Z'); + const value = new Date(formattedDateString); return Number.isNaN(value.getTime()) ? null : value; - }; + } // It would be nice to merge this and the method FilterConverter::convertFilterValuePresModel in api-platform-js - DataTypeConverter.convertValueAsStringToValue = function (valueAsString, type) { + static convertValueAsStringToValue(valueAsString, type) { // This is both DataDictionary and ShowDataTablePresModel compatible. // In the DataDictionary, valueAsString can be '%null%' or '%missing%', while in // ShowDataTablePresModel, we can get 'null' or 'missing', or '%null%' for string special values. @@ -9502,9 +3781,9 @@ var DataTypeConverter = /** @class */ (function () { default: return valueAsString; } - }; + } // tslint:disable-next-line:no-any - DataTypeConverter.convertValueToNativeValue = function (value, type) { + static convertValueToNativeValue(value, type) { // This converts from our 1.2 API that returns strings for specials, and dates as strings. // It takes the special case of '%null%' and returns a null. // For dates, it returns a Date object rather than a string. @@ -9531,16 +3810,15 @@ var DataTypeConverter = /** @class */ (function () { default: return value; } - }; + } // tslint:disable-next-line:no-any - DataTypeConverter.convertStringValueToNativeValue = function (value, type) { + static convertStringValueToNativeValue(value, type) { // This handles the conversion from string directly to native value for all types return this.convertValueToNativeValue(this.convertValueAsStringToValue(value, type), type); - }; - DataTypeConverter.specialValueIndicator = '%null%'; - return DataTypeConverter; -}()); + } +} exports.DataTypeConverter = DataTypeConverter; +DataTypeConverter.specialValueIndicator = '%null%'; /***/ }), @@ -9559,6 +3837,9 @@ var ExtensionContext; ExtensionContext["Desktop"] = "desktop"; ExtensionContext["Server"] = "server"; ExtensionContext["Unknown"] = "unknown"; + ExtensionContext["Cloud"] = "cloud"; + ExtensionContext["PublicWeb"] = "public-web"; + ExtensionContext["PublicDesktop"] = "public-desktop"; })(ExtensionContext = exports.ExtensionContext || (exports.ExtensionContext = {})); var ExtensionMode; (function (ExtensionMode) { @@ -9969,12 +4250,14 @@ var NotificationId; NotificationId["EditButtonClicked"] = "edit-button-clicked"; NotificationId["EditInDesktopButtonClicked"] = "edit-in-desktop-button-clicked"; NotificationId["ExtensionDialogUpdate"] = "extension-dialog-update"; + NotificationId["ExtensionDialogMessage"] = "extension-dialog-message"; NotificationId["FilterChanged"] = "filter-changed"; NotificationId["FirstVizSizeKnown"] = "first-viz-size-known"; NotificationId["FirstPulseMetricSizeKnown"] = "first-pulse-metric-size-known"; NotificationId["ParameterChanged"] = "parameter-changed"; NotificationId["PulseError"] = "pulse-error"; NotificationId["PulseFiltersChanged"] = "pulse-filters-changed"; + NotificationId["PulseMetricSizeChanged"] = "pulse-metric-size-changed"; NotificationId["PulseInsightDiscovered"] = "pulse-insight-discovered"; NotificationId["PulseInteractive"] = "pulse-interactive"; NotificationId["PulseTimeDimensionChanged"] = "pulse-time-dimension-changed"; @@ -10059,6 +4342,7 @@ var ParameterId; ParameterId["ExtensionBootstrapInfo"] = "extension-bootstrap-info"; ParameterId["ExtensionContextMenuIds"] = "extension-context-menu-ids"; ParameterId["ExtensionDialogH"] = "extension-dialog-height"; + ParameterId["ExtensionDialogMessage"] = "extension-dialog-message"; ParameterId["ExtensionDialogPayload"] = "extension-dialog-payload"; ParameterId["ExtensionDialogResult"] = "extension-dialog-result"; ParameterId["ExtensionDialogStyle"] = "extension-dialog-style"; @@ -10096,8 +4380,10 @@ var ParameterId; ParameterId["InvalidFieldCaption"] = "invalid-field-caption"; ParameterId["InvalidFields"] = "invalid-fields"; ParameterId["InvalidValues"] = "invalid-values"; + ParameterId["IsAnalyticsAssistantAvailable"] = "is-analytics-assistant-available"; ParameterId["IsExcludeMode"] = "is-exclude"; ParameterId["IsExtensionDialog"] = "is-extension-dialog"; + ParameterId["IsFromCalcDialog"] = "is-from-calc-dialog"; ParameterId["JoinDescription"] = "join-description"; ParameterId["LogicalTableId"] = "logical-table-id"; ParameterId["LogicalTableInfoList"] = "logical-table-info-list"; @@ -10269,6 +4555,8 @@ var VerbId; VerbId["GetUnderlyingTables"] = "get-underlying-tables"; VerbId["HierarchicalFilter"] = "hierachical-filter"; VerbId["InitializeExtension"] = "initialize-extension"; + VerbId["IsAnalyticsAssistantAvailable"] = "is-analytics-assistant-available"; + VerbId["LaunchAnalyticsAssistant"] = "launch-analytics-assistant"; VerbId["MoveAndResizeZones"] = "move-and-resize-zones"; VerbId["MoveMarksCardField"] = "move-marks-card-field"; VerbId["RaiseLeaveMarkNavNotification"] = "raise-leave-mark-nav-notification"; @@ -10290,6 +4578,7 @@ var VerbId; VerbId["SetActiveCustomViewAsDefault"] = "set-active-custom-view-as-default"; VerbId["SetAutoUpdate"] = "set-auto-update"; VerbId["SetClickThrough"] = "set-click-through"; + VerbId["SendDialogMessage"] = "send-dialog-message"; VerbId["SetVizStateWithDataModel"] = "set-viz-state-with-data-model"; VerbId["SetSheetSize"] = "set-sheet-size"; VerbId["SetZoneVisibility"] = "set-zone-visibility"; @@ -10659,18 +4948,18 @@ var VizOptionNames; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -var guid = __webpack_require__(/*! guid */ "../../node_modules/guid/guid.js"); -var JsApiInternalContract_1 = __webpack_require__(/*! ../JsApiInternalContract */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -var CrossFramePreparedMessage_1 = __webpack_require__(/*! ./CrossFramePreparedMessage */ "../api-internal-contract-js/lib/src/messaging/CrossFramePreparedMessage.js"); -var MessageTypeChecks_1 = __webpack_require__(/*! ./MessageTypeChecks */ "../api-internal-contract-js/lib/src/messaging/MessageTypeChecks.js"); -var MessageTypes_1 = __webpack_require__(/*! ./interface/MessageTypes */ "../api-internal-contract-js/lib/src/messaging/interface/MessageTypes.js"); +const guid = __webpack_require__(/*! guid */ "../../node_modules/guid/guid.js"); +const JsApiInternalContract_1 = __webpack_require__(/*! ../JsApiInternalContract */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const CrossFramePreparedMessage_1 = __webpack_require__(/*! ./CrossFramePreparedMessage */ "../api-internal-contract-js/lib/src/messaging/CrossFramePreparedMessage.js"); +const MessageTypeChecks_1 = __webpack_require__(/*! ./MessageTypeChecks */ "../api-internal-contract-js/lib/src/messaging/MessageTypeChecks.js"); +const MessageTypes_1 = __webpack_require__(/*! ./interface/MessageTypes */ "../api-internal-contract-js/lib/src/messaging/interface/MessageTypes.js"); /** * The CrossFrameMessenger is the primary export from the api-messaging module. An instance of * this class can be instantiated on both sides of a frame boundary to facilitate communication * in both directions between the frames. This class implements both the dispatcher and the listener * portions, but doesn't require callers to care about both. */ -var CrossFrameMessenger = /** @class */ (function () { +class CrossFrameMessenger { /** * Creates an instance of CrossFrameMessenger. If you would like to use the CrossFrameMessenger as a MessageListener, * be sure to call StartListening and register message handlers. @@ -10681,44 +4970,43 @@ var CrossFrameMessenger = /** @class */ (function () { * This value will be sent as the targetOrigin of a postMessage * (https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage) */ - function CrossFrameMessenger(thisWindow, otherWindow, otherWindowOrigin) { + constructor(thisWindow, otherWindow, otherWindowOrigin) { this.thisWindow = thisWindow; this.otherWindow = otherWindow; this.otherWindowOrigin = otherWindowOrigin; // Make sure to call StartListening } ///// MessageListener Implementation - CrossFrameMessenger.prototype.startListening = function () { - var _this = this; + startListening() { // Check if we already are listening, if not, hook up a message listener if (!this.unregisterFunction) { - var boundHandler_1 = this.onMessageReceived.bind(this); - this.thisWindow.addEventListener('message', boundHandler_1, true); - this.unregisterFunction = function () { return _this.thisWindow.removeEventListener('message', boundHandler_1, true); }; + const boundHandler = this.onMessageReceived.bind(this); + this.thisWindow.addEventListener('message', boundHandler, true); + this.unregisterFunction = () => this.thisWindow.removeEventListener('message', boundHandler, true); } - }; - CrossFrameMessenger.prototype.stopListening = function () { + } + stopListening() { // Stop listening if we have started listening if (this.unregisterFunction) { this.unregisterFunction(); this.unregisterFunction = undefined; } - }; - CrossFrameMessenger.prototype.setInitializeMessageHandler = function (handler) { + } + setInitializeMessageHandler(handler) { this.initializeMessageHandler = handler; - }; - CrossFrameMessenger.prototype.setCommandResponseMessageHandler = function (handler) { + } + setCommandResponseMessageHandler(handler) { this.commandResponseMessageHandler = handler; - }; - CrossFrameMessenger.prototype.setCommandMessageHandler = function (handler) { + } + setCommandMessageHandler(handler) { this.commandMessageHandler = handler; - }; - CrossFrameMessenger.prototype.setNotificationMessageHandler = function (handler) { + } + setNotificationMessageHandler(handler) { this.notificationMessageHandler = handler; - }; - CrossFrameMessenger.prototype.setHandshakeMessageHandler = function (handler) { + } + setHandshakeMessageHandler(handler) { this.handshakeMessageHandler = handler; - }; + } ///// MessageDispatcher Implementation /** * @param apiVersion api-internal-contract-js version (exported in JsApiInternalConntract) @@ -10726,8 +5014,8 @@ var CrossFrameMessenger = /** @class */ (function () { * @param options additional options that can be passed at initialization (information about the version of * external being used for example) */ - CrossFrameMessenger.prototype.prepareInitializationMessage = function (apiVersion, crossFrameVersion, options) { - var message = { + prepareInitializationMessage(apiVersion, crossFrameVersion, options) { + const message = { msgGuid: guid.raw(), msgType: MessageTypes_1.MessageType.Initialize, crossFrameVersion: crossFrameVersion, @@ -10735,18 +5023,18 @@ var CrossFrameMessenger = /** @class */ (function () { options: options, }; return this.prepareMessage(message); - }; - CrossFrameMessenger.prototype.prepareCommandMessage = function (verbId, parameters) { - var message = { + } + prepareCommandMessage(verbId, parameters) { + const message = { msgGuid: guid.raw(), msgType: MessageTypes_1.MessageType.Command, verbId: verbId, parameters: parameters, }; return this.prepareMessage(message); - }; - CrossFrameMessenger.prototype.prepareCommandResponseMessage = function (commandGuid, data, error) { - var message = { + } + prepareCommandResponseMessage(commandGuid, data, error) { + const message = { msgGuid: guid.raw(), msgType: MessageTypes_1.MessageType.CommandResponse, commandGuid: commandGuid, @@ -10758,44 +5046,44 @@ var CrossFrameMessenger = /** @class */ (function () { message.error = JSON.parse(JSON.stringify(error)); } return this.prepareMessage(message); - }; - CrossFrameMessenger.prototype.prepareNotificationMessage = function (notificationId, data) { - var message = { + } + prepareNotificationMessage(notificationId, data) { + const message = { msgGuid: guid.raw(), msgType: MessageTypes_1.MessageType.Notification, notificationId: notificationId, data: data, }; return this.prepareMessage(message); - }; - CrossFrameMessenger.prototype.prepareAckMessage = function () { - var message = { + } + prepareAckMessage() { + const message = { msgGuid: guid.raw(), msgType: MessageTypes_1.MessageType.Ack, platformVersion: JsApiInternalContract_1.INTERNAL_CONTRACT_VERSION, }; return this.prepareMessage(message); - }; + } /** * Prepares a pending message for sending and returns the prepared message * * @param msg The message to be sent to this.otherWindow * @returns The prepared message */ - CrossFrameMessenger.prototype.prepareMessage = function (msg) { + prepareMessage(msg) { if (!this.otherWindow || !this.otherWindowOrigin) { throw 'Other window not initialized, cannot dispatch messages'; } - var preparedMessage = new CrossFramePreparedMessage_1.CrossFramePreparedMessage(msg, this.otherWindow, this.otherWindowOrigin); + const preparedMessage = new CrossFramePreparedMessage_1.CrossFramePreparedMessage(msg, this.otherWindow, this.otherWindowOrigin); return preparedMessage; - }; + } /** * Called when a message is received. Does some validation of the message, and then * calls an appropriate message handler if one is defined * * @param event The incoming MessageEvent */ - CrossFrameMessenger.prototype.onMessageReceived = function (event) { + onMessageReceived(event) { // If we have an otherWindow defined, make sure the message is coming from there if (this.otherWindow && event.source !== this.otherWindow) { return; @@ -10804,7 +5092,7 @@ var CrossFrameMessenger = /** @class */ (function () { if (!event.data) { return; } - var message = event.data; + const message = event.data; if (!MessageTypeChecks_1.isMessage(message)) { return; } @@ -10848,15 +5136,14 @@ var CrossFrameMessenger = /** @class */ (function () { default: // Just ignore this since we don't know how to handle the message type } - }; - CrossFrameMessenger.prototype.setOtherWindow = function (otherWindow) { + } + setOtherWindow(otherWindow) { this.otherWindow = otherWindow; - }; - CrossFrameMessenger.prototype.setOtherWindowOrigin = function (origin) { + } + setOtherWindowOrigin(origin) { this.otherWindowOrigin = origin; - }; - return CrossFrameMessenger; -}()); + } +} exports.CrossFrameMessenger = CrossFrameMessenger; @@ -10875,31 +5162,26 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); * Implementation of the PreparedMessage interface used to post messages between * two frames using window.postMessage */ -var CrossFramePreparedMessage = /** @class */ (function () { +class CrossFramePreparedMessage { /** * Creates an instance of CrossFramePreparedMessage. * @param _message The message to be sent * @param _target The target window where the message will be sent * @param _origin The targetOrigin where this message can be received */ - function CrossFramePreparedMessage(_message, _target, _origin) { + constructor(_message, _target, _origin) { this._message = _message; this._target = _target; this._origin = _origin; } - Object.defineProperty(CrossFramePreparedMessage.prototype, "messageGuid", { - get: function () { - return this._message.msgGuid; - }, - enumerable: true, - configurable: true - }); - CrossFramePreparedMessage.prototype.send = function () { + get messageGuid() { + return this._message.msgGuid; + } + send() { this._target.postMessage(this._message, this._origin); return this; - }; - return CrossFramePreparedMessage; -}()); + } +} exports.CrossFramePreparedMessage = CrossFramePreparedMessage; @@ -10914,10 +5196,10 @@ exports.CrossFramePreparedMessage = CrossFramePreparedMessage; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -var guid = __webpack_require__(/*! guid */ "../../node_modules/guid/guid.js"); -var Notifications_1 = __webpack_require__(/*! ../contract/Notifications */ "../api-internal-contract-js/lib/src/contract/Notifications.js"); -var MessageTypes_1 = __webpack_require__(/*! ./interface/MessageTypes */ "../api-internal-contract-js/lib/src/messaging/interface/MessageTypes.js"); -var expectedEmptyNotifications = new Set([ +const guid = __webpack_require__(/*! guid */ "../../node_modules/guid/guid.js"); +const Notifications_1 = __webpack_require__(/*! ../contract/Notifications */ "../api-internal-contract-js/lib/src/contract/Notifications.js"); +const MessageTypes_1 = __webpack_require__(/*! ./interface/MessageTypes */ "../api-internal-contract-js/lib/src/messaging/interface/MessageTypes.js"); +const expectedEmptyNotifications = new Set([ Notifications_1.NotificationId.EditButtonClicked, Notifications_1.NotificationId.EditInDesktopButtonClicked, Notifications_1.NotificationId.WorkbookPublished, @@ -10929,7 +5211,7 @@ function isMessage(data) { if (!data) { return false; } - var message = data; + const message = data; if (!message || !message.msgGuid || !message.msgType) { return false; } @@ -10939,7 +5221,7 @@ function isMessage(data) { if (typeof message.msgType !== 'string') { return false; } - var messageTypes = [ + const messageTypes = [ MessageTypes_1.MessageType.Command, MessageTypes_1.MessageType.CommandResponse, MessageTypes_1.MessageType.Initialize, @@ -10956,7 +5238,7 @@ function isVersion(versionNumber) { if (!versionNumber) { return false; } - var v = versionNumber; + const v = versionNumber; if (typeof v !== 'object') { return false; } @@ -10970,7 +5252,7 @@ function isInitMessage(message) { if (!isMessage(message)) { return false; } - var initMessage = message; + const initMessage = message; if (initMessage.msgType !== MessageTypes_1.MessageType.Initialize) { return false; } @@ -10987,7 +5269,7 @@ function isCommandResponseMessage(message) { if (!isMessage(message)) { return false; } - var crMessage = message; + const crMessage = message; if (crMessage.msgType !== MessageTypes_1.MessageType.CommandResponse) { return false; } @@ -11004,7 +5286,7 @@ function isCommandMessage(message) { if (!isMessage(message)) { return false; } - var commandMessage = message; + const commandMessage = message; if (commandMessage.msgType !== MessageTypes_1.MessageType.Command) { return false; } @@ -11021,7 +5303,7 @@ function isNotificationMessage(message) { if (!isMessage(message)) { return false; } - var notificationMessage = message; + const notificationMessage = message; if (notificationMessage.msgType !== MessageTypes_1.MessageType.Notification) { return false; } @@ -11038,7 +5320,7 @@ function isHandshakeMessage(message) { if (!isMessage(message)) { return false; } - var handshakeMessage = message; + const handshakeMessage = message; if (handshakeMessage.msgType !== MessageTypes_1.MessageType.Handshake) { return false; } @@ -11088,23 +5370,20 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); * This version converter doesn't actually do anything but is useful for testing or when we have * a matching platform and internal version number */ -var IdentityVersionConverter = /** @class */ (function () { - function IdentityVersionConverter() { - } - IdentityVersionConverter.prototype.upgradeExecuteCall = function (verb, parameters) { +class IdentityVersionConverter { + upgradeExecuteCall(verb, parameters) { return { verb: verb, parameters: parameters, }; - }; - IdentityVersionConverter.prototype.downgradeExecuteReturn = function (executeResponse) { + } + downgradeExecuteReturn(executeResponse) { return executeResponse; - }; - IdentityVersionConverter.prototype.downgradeNotification = function (notification) { + } + downgradeNotification(notification) { return notification; - }; - return IdentityVersionConverter; -}()); + } +} exports.IdentityVersionConverter = IdentityVersionConverter; @@ -11128,7 +5407,7 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); * and downgrade the representations on the way out. Similarly for notifications, it can * downgrade those on the way from platform to external. */ -var StackingVersionConverter = /** @class */ (function () { +class StackingVersionConverter { /** * Creates a new instance of the StackingVersionConverter * @@ -11138,14 +5417,14 @@ var StackingVersionConverter = /** @class */ (function () { * @param _downgradeExecuteTranslations Ordered list of downgrade translations to perform after a cmd * @param _downgradeNotificationTranslations Ordered list of downgrade translations to perform on a notification */ - function StackingVersionConverter(_externalMajorVersion, _platformMajorVersion, _upgradeExecuteTranslations, _downgradeExecuteTranslations, _downgradeNotificationTranslations) { + constructor(_externalMajorVersion, _platformMajorVersion, _upgradeExecuteTranslations, _downgradeExecuteTranslations, _downgradeNotificationTranslations) { this._externalMajorVersion = _externalMajorVersion; this._platformMajorVersion = _platformMajorVersion; this._upgradeExecuteTranslations = _upgradeExecuteTranslations; this._downgradeExecuteTranslations = _downgradeExecuteTranslations; this._downgradeNotificationTranslations = _downgradeNotificationTranslations; if (this._externalMajorVersion > this._platformMajorVersion) { - throw new Error("Cannot convert between external version " + this._externalMajorVersion + " and " + this._platformMajorVersion); + throw new Error(`Cannot convert between external version ${this._externalMajorVersion} and ${this._platformMajorVersion}`); } } /** @@ -11157,38 +5436,34 @@ var StackingVersionConverter = /** @class */ (function () { * @param _downgradeExecuteTranslations Ordered list of downgrade translations to perform after a cmd * @param _downgradeNotificationTranslations Ordered list of downgrade translations to perform on a notification */ - StackingVersionConverter.fromData = function (externalVersion, platformVersion, upgradeExecuteTranslations, downgradeExecuteTranslations, downgradeNotificationTranslations) { + static fromData(externalVersion, platformVersion, upgradeExecuteTranslations, downgradeExecuteTranslations, downgradeNotificationTranslations) { return new this(externalVersion.major, platformVersion.major, upgradeExecuteTranslations, downgradeExecuteTranslations, downgradeNotificationTranslations); - }; - StackingVersionConverter.prototype.upgradeExecuteCall = function (verb, parameters) { + } + upgradeExecuteCall(verb, parameters) { // Perform the upgrade of the verb and parameters to the level that platform is using - var upgraded = { verb: verb, parameters: parameters }; - for (var _i = 0, _a = this._upgradeExecuteTranslations; _i < _a.length; _i++) { - var upgradeTranslation = _a[_i]; + let upgraded = { verb: verb, parameters: parameters }; + for (const upgradeTranslation of this._upgradeExecuteTranslations) { upgraded = upgradeTranslation(upgraded.verb, upgraded.parameters); } return upgraded; - }; - StackingVersionConverter.prototype.downgradeExecuteReturn = function (executeResponse) { + } + downgradeExecuteReturn(executeResponse) { // Downgrade the response to what the external module is expecting - var downgraded = executeResponse; - for (var _i = 0, _a = this._downgradeExecuteTranslations; _i < _a.length; _i++) { - var downgradeTranslation = _a[_i]; + let downgraded = executeResponse; + for (const downgradeTranslation of this._downgradeExecuteTranslations) { downgraded = downgradeTranslation(downgraded); } return downgraded; - }; - StackingVersionConverter.prototype.downgradeNotification = function (notification) { + } + downgradeNotification(notification) { // Downgrade the notification to what the external module is expecting - var downgraded = notification; - for (var _i = 0, _a = this._downgradeNotificationTranslations; _i < _a.length; _i++) { - var downgradeTranslation = _a[_i]; + let downgraded = notification; + for (const downgradeTranslation of this._downgradeNotificationTranslations) { downgraded = downgradeTranslation(downgraded); } return downgraded; - }; - return StackingVersionConverter; -}()); + } +} exports.StackingVersionConverter = StackingVersionConverter; @@ -11203,9 +5478,9 @@ exports.StackingVersionConverter = StackingVersionConverter; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -var IdentityVersionConverter_1 = __webpack_require__(/*! ./IdentityVersionConverter */ "../api-internal-contract-js/lib/src/versioning/IdentityVersionConverter.js"); -var StackingVersionConverter_1 = __webpack_require__(/*! ./StackingVersionConverter */ "../api-internal-contract-js/lib/src/versioning/StackingVersionConverter.js"); -var VersionTranslations_1 = __webpack_require__(/*! ./VersionTranslations */ "../api-internal-contract-js/lib/src/versioning/VersionTranslations.js"); +const IdentityVersionConverter_1 = __webpack_require__(/*! ./IdentityVersionConverter */ "../api-internal-contract-js/lib/src/versioning/IdentityVersionConverter.js"); +const StackingVersionConverter_1 = __webpack_require__(/*! ./StackingVersionConverter */ "../api-internal-contract-js/lib/src/versioning/StackingVersionConverter.js"); +const VersionTranslations_1 = __webpack_require__(/*! ./VersionTranslations */ "../api-internal-contract-js/lib/src/versioning/VersionTranslations.js"); /** * @returns true if lhs < rhs (ignoring fix number) * @param lhs @@ -11246,6 +5521,7 @@ exports.ExecuteMinorDowngrades = { 5: [VersionTranslations_1.DowngradeWorksheetNames], 9: [], 175: [VersionTranslations_1.DowngradeWorksheetFomatting175], + 182: [VersionTranslations_1.DowngradeExtensionEnvironmentContext], }, }; exports.NotificationMinorDowngrades = { @@ -11279,20 +5555,21 @@ exports.CreateVersionConverter = CreateVersionConverter; * @param notificationDowngrades MajorMinorTranslators for notification downgrades */ function CreateVersionConverterWithTranslators(externalVersion, platformVersion, upgrades, downgrades, notificationDowngrades) { - var externalMajorVersion = externalVersion.major; - var externalMinorVersion = externalVersion.minor; - var platformMajorVersion = platformVersion.major; + const externalMajorVersion = externalVersion.major; + const externalMinorVersion = externalVersion.minor; + const platformMajorVersion = platformVersion.major; if (externalMajorVersion > platformMajorVersion) { - throw new Error("External version must be less than or equal to platform version.\n externalMajorVersion=" + externalMajorVersion + " platformMajorVersion=" + platformMajorVersion); + throw new Error(`External version must be less than or equal to platform version. + externalMajorVersion=${externalMajorVersion} platformMajorVersion=${platformMajorVersion}`); } // If we are using the exact same versions (major.minor), just use the identity converter if (VersionEqualTo(externalVersion, platformVersion)) { return new IdentityVersionConverter_1.IdentityVersionConverter(); } // Walk the span between the versions we have here and collect the upgrade and downgrades necessary - var neededExecuteUpgrades = GetNeededTranslations(externalMajorVersion, platformMajorVersion, externalMinorVersion, upgrades); - var neededExecuteDowngrades = GetNeededTranslations(externalMajorVersion, platformMajorVersion, externalMinorVersion, downgrades); - var neededNotificationDowngrades = GetNeededTranslations(externalMajorVersion, platformMajorVersion, externalMinorVersion, notificationDowngrades); + const neededExecuteUpgrades = GetNeededTranslations(externalMajorVersion, platformMajorVersion, externalMinorVersion, upgrades); + const neededExecuteDowngrades = GetNeededTranslations(externalMajorVersion, platformMajorVersion, externalMinorVersion, downgrades); + const neededNotificationDowngrades = GetNeededTranslations(externalMajorVersion, platformMajorVersion, externalMinorVersion, notificationDowngrades); // We want to apply the downgrades in reverse order in case of dependencies between them neededExecuteDowngrades.reverse(); neededNotificationDowngrades.reverse(); @@ -11300,14 +5577,14 @@ function CreateVersionConverterWithTranslators(externalVersion, platformVersion, } exports.CreateVersionConverterWithTranslators = CreateVersionConverterWithTranslators; function GetNeededTranslations(externalMajorVersion, platformMajorVersion, externalMinorVersion, majorMinorTranslators) { - var neededTranslations = []; - for (var major = externalMajorVersion; major <= platformMajorVersion; major++) { + const neededTranslations = []; + for (let major = externalMajorVersion; major <= platformMajorVersion; major++) { if (major in majorMinorTranslators) { - var start = major === externalMajorVersion ? externalMinorVersion : 0; - var maximumMinorVersion = GetMaximumMinorIndex(Object.keys(majorMinorTranslators[major])); - for (var minor = start; minor <= maximumMinorVersion; minor++) { + const start = major === externalMajorVersion ? externalMinorVersion : 0; + const maximumMinorVersion = GetMaximumMinorIndex(Object.keys(majorMinorTranslators[major])); + for (let minor = start; minor <= maximumMinorVersion; minor++) { if (minor in majorMinorTranslators[major]) { - neededTranslations.push.apply(neededTranslations, majorMinorTranslators[major][minor]); + neededTranslations.push(...majorMinorTranslators[major][minor]); } } } @@ -11315,7 +5592,7 @@ function GetNeededTranslations(externalMajorVersion, platformMajorVersion, exter return neededTranslations; } function GetMaximumMinorIndex(minorVersions) { - return minorVersions.map(function (a) { return Number(a); }).reduce(function (a, b) { return (a > b ? a : b); }); + return minorVersions.map((a) => Number(a)).reduce((a, b) => (a > b ? a : b)); } exports.GetMaximumMinorIndex = GetMaximumMinorIndex; @@ -11331,7 +5608,8 @@ exports.GetMaximumMinorIndex = GetMaximumMinorIndex; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -var Notifications_1 = __webpack_require__(/*! ../contract/Notifications */ "../api-internal-contract-js/lib/src/contract/Notifications.js"); +const JsApiInternalContract_1 = __webpack_require__(/*! ../JsApiInternalContract */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const Notifications_1 = __webpack_require__(/*! ../contract/Notifications */ "../api-internal-contract-js/lib/src/contract/Notifications.js"); // This is where we will start to define some of these translations. // When modifying existing models, add the requisite conversion functions here, then use them // in the VersionConverterFactory implementation. Import old versions as you would any other module @@ -11345,9 +5623,9 @@ function DowngradeWorksheetNames(executeResponse) { // Fix the dashboard friendly name issue. The structures are compatible, // so we still return the original reply, but we copy the SheetInfo.name // into the DashboardZone.name, where v1 wants to find it. - var bootstrapInfo = executeResponse.result; + const bootstrapInfo = executeResponse.result; if (bootstrapInfo.extensionDashboardInfo !== undefined) { - bootstrapInfo.extensionDashboardInfo.zones.forEach(function (zone) { + bootstrapInfo.extensionDashboardInfo.zones.forEach((zone) => { if (zone.sheetInfo) { zone.name = zone.sheetInfo.name; } @@ -11360,7 +5638,7 @@ function DowngradeFlipboardZoneID(notification) { // Fix the FlipboardZoneId issue. Older external versions still check for flipboardZoneIDs. // When running against a newer server, if flipboardZoneId is absent, set it to default(0). if (notification.notificationId === Notifications_1.NotificationId.SelectedMarksChanged) { - var visualModel = notification.data; + const visualModel = notification.data; if (visualModel.flipboardZoneID === undefined) { visualModel.flipboardZoneID = 0; } @@ -11371,29 +5649,41 @@ exports.DowngradeFlipboardZoneID = DowngradeFlipboardZoneID; // Filter out formatting sheets that are specified in the classNames list function DowngradeWorksheetFormatting(executeResponse, classNames) { var _a, _b; - var bootstrapInfo = executeResponse.result; + const bootstrapInfo = executeResponse.result; if ((_b = (_a = bootstrapInfo) === null || _a === void 0 ? void 0 : _a.extensionWorksheetInfo) === null || _b === void 0 ? void 0 : _b.formatting) bootstrapInfo.extensionWorksheetInfo.formatting.formattingSheets = - bootstrapInfo.extensionWorksheetInfo.formatting.formattingSheets.filter(function (x) { return !classNames.includes(x.classNameKey); }); + bootstrapInfo.extensionWorksheetInfo.formatting.formattingSheets.filter((x) => !classNames.includes(x.classNameKey)); return executeResponse; } // Filter out formatting sheets that are specified in the classNames list // Filter out formatting sheets that are specified in the classNames list function DowngradeWorksheetFormattingNotification(notification, classNames) { if (notification.notificationId === Notifications_1.NotificationId.WorksheetFormattingChanged) { - var formatting = notification.data; - notification.data = formatting.formattingSheets.filter(function (x) { return !classNames.includes(x.classNameKey); }); + const formatting = notification.data; + notification.data = formatting.formattingSheets.filter((x) => !classNames.includes(x.classNameKey)); } return notification; } // We added new enum values for ClassNameKeys enum in 176. Need to filter them out if the client version is <176 -var ClassNameKeysToFilter175 = ["tableau-row-dividers" /* RowDividers */, "tableau-column-dividers" /* ColumnDividers */, "tableau-pane" /* Pane */]; -exports.DowngradeWorksheetFomatting175 = function (response) { - return DowngradeWorksheetFormatting(response, ClassNameKeysToFilter175); -}; -exports.DowngradeWorksheetFomattingNotification175 = function (notification) { - return DowngradeWorksheetFormattingNotification(notification, ClassNameKeysToFilter175); -}; +const ClassNameKeysToFilter175 = ["tableau-row-dividers" /* RowDividers */, "tableau-column-dividers" /* ColumnDividers */, "tableau-pane" /* Pane */]; +exports.DowngradeWorksheetFomatting175 = (response) => DowngradeWorksheetFormatting(response, ClassNameKeysToFilter175); +exports.DowngradeWorksheetFomattingNotification175 = (notification) => DowngradeWorksheetFormattingNotification(notification, ClassNameKeysToFilter175); +function DowngradeExtensionEnvironmentContext(executeResponse) { + // Fix the extension environment context issue. Replaces new enum values that go unrecognized + // by older extensions with their respective older enum values. + const bootstrapInfo = executeResponse.result; + if (bootstrapInfo.extensionEnvironment !== undefined) { + const context = bootstrapInfo.extensionEnvironment.extensionContext; + if (context === JsApiInternalContract_1.ExtensionContext.PublicWeb || context === JsApiInternalContract_1.ExtensionContext.Cloud) { + bootstrapInfo.extensionEnvironment.extensionContext = JsApiInternalContract_1.ExtensionContext.Server; + } + else if (context === JsApiInternalContract_1.ExtensionContext.PublicDesktop) { + bootstrapInfo.extensionEnvironment.extensionContext = JsApiInternalContract_1.ExtensionContext.Desktop; + } + } + return executeResponse; +} +exports.DowngradeExtensionEnvironmentContext = DowngradeExtensionEnvironmentContext; /***/ }), @@ -11412,23 +5702,20 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); * This version converter doesn't actually do anything but is useful for testing or when we have * a matching platform and external version number */ -var ExternalIdentityVersionConverter = /** @class */ (function () { - function ExternalIdentityVersionConverter() { - } - ExternalIdentityVersionConverter.prototype.downgradeExecuteCall = function (verb, parameters) { +class ExternalIdentityVersionConverter { + downgradeExecuteCall(verb, parameters) { return { verb: verb, parameters: parameters, }; - }; - ExternalIdentityVersionConverter.prototype.upgradeExecuteReturn = function (executeResponse, verb, parameters) { + } + upgradeExecuteReturn(executeResponse, verb, parameters) { return executeResponse; - }; - ExternalIdentityVersionConverter.prototype.upgradeNotification = function (notification) { + } + upgradeNotification(notification) { return notification; - }; - return ExternalIdentityVersionConverter; -}()); + } +} exports.ExternalIdentityVersionConverter = ExternalIdentityVersionConverter; @@ -11451,7 +5738,7 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); * commands, it is used to downgrade the external representation to what platform knows on the way in * and upgrade the representations on the way out. */ -var ExternalStackingVersionConverter = /** @class */ (function () { +class ExternalStackingVersionConverter { /** * Creates a new instance of the StackingVersionConverter * @@ -11461,45 +5748,42 @@ var ExternalStackingVersionConverter = /** @class */ (function () { * @param _upgradeExecuteReturnTranslations Ordered list of upgrade translations to perform after a cmd is executed * @param _upgradeNotificationTranslations Ordered list of upgrade notfications to perform on events */ - function ExternalStackingVersionConverter(_externalVersion, _platformVersion, _downgradeExecuteCallTranslations, _upgradeExecuteReturnTranslations, _upgradeNotificationTranslations) { + constructor(_externalVersion, _platformVersion, _downgradeExecuteCallTranslations, _upgradeExecuteReturnTranslations, _upgradeNotificationTranslations) { this._externalVersion = _externalVersion; this._platformVersion = _platformVersion; this._downgradeExecuteCallTranslations = _downgradeExecuteCallTranslations; this._upgradeExecuteReturnTranslations = _upgradeExecuteReturnTranslations; this._upgradeNotificationTranslations = _upgradeNotificationTranslations; if (this._externalVersion.major > this._platformVersion.major) { - throw new Error("Cannot convert between external version " + this._externalVersion.major + "\n and " + this._platformVersion.major); + throw new Error(`Cannot convert between external version ${this._externalVersion.major} + and ${this._platformVersion.major}`); } } - ExternalStackingVersionConverter.prototype.downgradeExecuteCall = function (verb, parameters) { + downgradeExecuteCall(verb, parameters) { // Perform the downgrade of the verb and parameters to the level that platform is using - var downgraded = { verb: verb, parameters: parameters }; - for (var _i = 0, _a = this._downgradeExecuteCallTranslations; _i < _a.length; _i++) { - var downgradeTranslation = _a[_i]; + let downgraded = { verb: verb, parameters: parameters }; + for (const downgradeTranslation of this._downgradeExecuteCallTranslations) { downgraded = downgradeTranslation(downgraded.verb, downgraded.parameters); } return downgraded; - }; - ExternalStackingVersionConverter.prototype.upgradeExecuteReturn = function (executeResponse, verb, parameters) { + } + upgradeExecuteReturn(executeResponse, verb, parameters) { // Perform the upgrade of the response to what the external module is expecting - var upgraded = executeResponse; - for (var _i = 0, _a = this._upgradeExecuteReturnTranslations; _i < _a.length; _i++) { - var upgradeTranslation = _a[_i]; + let upgraded = executeResponse; + for (const upgradeTranslation of this._upgradeExecuteReturnTranslations) { upgraded = upgradeTranslation(upgraded, verb, parameters); } return upgraded; - }; - ExternalStackingVersionConverter.prototype.upgradeNotification = function (notification) { + } + upgradeNotification(notification) { // Perform the upgrade of notification to what the external module is expecting - var upgraded = notification; - for (var _i = 0, _a = this._upgradeNotificationTranslations; _i < _a.length; _i++) { - var upgradeNotification = _a[_i]; + let upgraded = notification; + for (const upgradeNotification of this._upgradeNotificationTranslations) { upgraded = upgradeNotification(upgraded); } return upgraded; - }; - return ExternalStackingVersionConverter; -}()); + } +} exports.ExternalStackingVersionConverter = ExternalStackingVersionConverter; @@ -11514,10 +5798,9 @@ exports.ExternalStackingVersionConverter = ExternalStackingVersionConverter; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -var VersionConverterFactory_1 = __webpack_require__(/*! ../VersionConverterFactory */ "../api-internal-contract-js/lib/src/versioning/VersionConverterFactory.js"); -var ExternalIdentityVersionConverter_1 = __webpack_require__(/*! ./ExternalIdentityVersionConverter */ "../api-internal-contract-js/lib/src/versioning/external/ExternalIdentityVersionConverter.js"); -var ExternalStackingVersionConverter_1 = __webpack_require__(/*! ./ExternalStackingVersionConverter */ "../api-internal-contract-js/lib/src/versioning/external/ExternalStackingVersionConverter.js"); -var ExternalVersionTranslations_1 = __webpack_require__(/*! ./ExternalVersionTranslations */ "../api-internal-contract-js/lib/src/versioning/external/ExternalVersionTranslations.js"); +const VersionConverterFactory_1 = __webpack_require__(/*! ../VersionConverterFactory */ "../api-internal-contract-js/lib/src/versioning/VersionConverterFactory.js"); +const ExternalIdentityVersionConverter_1 = __webpack_require__(/*! ./ExternalIdentityVersionConverter */ "../api-internal-contract-js/lib/src/versioning/external/ExternalIdentityVersionConverter.js"); +const ExternalStackingVersionConverter_1 = __webpack_require__(/*! ./ExternalStackingVersionConverter */ "../api-internal-contract-js/lib/src/versioning/external/ExternalStackingVersionConverter.js"); // A mapping from the current client version of internal-contract to an older platform version of the contract. // Each version bump can have an array of translations to perform in order. // These translations handle downgradeExecuteCall and upgradeExecuteReturn and are meant to be called on the @@ -11531,8 +5814,7 @@ exports.ExecuteMinorDowngradeCallExternal = { }; exports.ExecuteMinorUpgradeReturnExternal = { 1: { - 9: [ExternalVersionTranslations_1.UpgradeDataTableTypes], - 29: [ExternalVersionTranslations_1.UpgradeDataTableRowsAndColumns], + 9: [], }, }; exports.ExecuteMinorUpgradeNotification = { @@ -11563,34 +5845,35 @@ exports.CreateExternalCompatibleVersionConverter = CreateExternalCompatibleVersi * @param downgrades MajorMinorTranslators for execute call downgrades */ function CreateExternalCompatibleVersionConverterWithTranslators(externalVersion, platformVersion, downgrades, upgrades, upgradeNotifications) { - var externalMajorVersion = externalVersion.major; - var platformMajorVersion = platformVersion.major; - var platformMinorVersion = platformVersion.minor; + const externalMajorVersion = externalVersion.major; + const platformMajorVersion = platformVersion.major; + const platformMinorVersion = platformVersion.minor; // This check is present in VersionConverterFactory. We throw the same error here as well. // Hence we only need to check the minor versions for translations. if (externalMajorVersion > platformMajorVersion) { - throw new Error("External version must be less than or equal to platform version.\n externalMajorVersion=" + externalMajorVersion + " platformMajorVersion=" + platformMajorVersion); + throw new Error(`External version must be less than or equal to platform version. + externalMajorVersion=${externalMajorVersion} platformMajorVersion=${platformMajorVersion}`); } if (externalMajorVersion < platformMajorVersion || VersionConverterFactory_1.VersionEqualTo(externalVersion, platformVersion)) { return new ExternalIdentityVersionConverter_1.ExternalIdentityVersionConverter(); } // Walk the span between the versions we have here and collect the upgrade and downgrades necessary - var neededExecuteCallDowngrade = GetNeededExternalTranslations(platformMajorVersion, platformMinorVersion, downgrades); - var neededExecuteReturnUpgrades = GetNeededExternalTranslations(platformMajorVersion, platformMinorVersion, upgrades); - var neededNotificationUpgrades = GetNeededExternalTranslations(platformMajorVersion, platformMinorVersion, upgradeNotifications); + const neededExecuteCallDowngrade = GetNeededExternalTranslations(platformMajorVersion, platformMinorVersion, downgrades); + const neededExecuteReturnUpgrades = GetNeededExternalTranslations(platformMajorVersion, platformMinorVersion, upgrades); + const neededNotificationUpgrades = GetNeededExternalTranslations(platformMajorVersion, platformMinorVersion, upgradeNotifications); // Reverse the downgrade calls, so that we start the downgrade from the external version to the platform version neededExecuteCallDowngrade.reverse(); return new ExternalStackingVersionConverter_1.ExternalStackingVersionConverter(externalVersion, platformVersion, neededExecuteCallDowngrade, neededExecuteReturnUpgrades, neededNotificationUpgrades); } exports.CreateExternalCompatibleVersionConverterWithTranslators = CreateExternalCompatibleVersionConverterWithTranslators; function GetNeededExternalTranslations(platformMajorVersion, platformMinorVersion, majorMinorTranslators) { - var neededTranslations = []; + const neededTranslations = []; if (platformMajorVersion in majorMinorTranslators) { - var start = platformMinorVersion; - var maximumMinorVersion = VersionConverterFactory_1.GetMaximumMinorIndex(Object.keys(majorMinorTranslators[platformMajorVersion])); - for (var minor = start; minor <= maximumMinorVersion; minor++) { + const start = platformMinorVersion; + const maximumMinorVersion = VersionConverterFactory_1.GetMaximumMinorIndex(Object.keys(majorMinorTranslators[platformMajorVersion])); + for (let minor = start; minor <= maximumMinorVersion; minor++) { if (minor in majorMinorTranslators[platformMajorVersion]) { - neededTranslations.push.apply(neededTranslations, majorMinorTranslators[platformMajorVersion][minor]); + neededTranslations.push(...majorMinorTranslators[platformMajorVersion][minor]); } } } @@ -11598,123 +5881,6 @@ function GetNeededExternalTranslations(platformMajorVersion, platformMinorVersio } -/***/ }), - -/***/ "../api-internal-contract-js/lib/src/versioning/external/ExternalVersionTranslations.js": -/*!**********************************************************************************************!*\ - !*** ../api-internal-contract-js/lib/src/versioning/external/ExternalVersionTranslations.js ***! - \**********************************************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -var JsApiInternalContract_1 = __webpack_require__(/*! ../../JsApiInternalContract */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -// 1.2 -> 1.0 Translations -// Uncomment this line to import from the V1 definition of the API -// import * as V1 from '@tableau-api-internal-contract-js_v1'; -/** - * Prior to 2019.2 (internal-contract v1.9), DataValue.value were all strings. - * Go through all DataValue objects. If we have a string, but the type should not be a string, - * convert it to the correct type. The type of DataValue.value is 'any' in the contract, so - * this change doesn't need any updates to classes or types. - */ -function UpgradeDataTableTypes(executeResponse, verb, parameters) { - if (!executeResponse) { - return executeResponse; - } - var oldUnderlyingDataTable = executeResponse.result; - if (oldUnderlyingDataTable.data !== undefined && oldUnderlyingDataTable.isSummary !== undefined) { - convertDataValues(oldUnderlyingDataTable.data); - return executeResponse; - } - var oldSelectedMarksTable = executeResponse.result; - if (oldSelectedMarksTable.data !== undefined && Array.isArray(oldSelectedMarksTable.data)) { - oldSelectedMarksTable.data.forEach(function (marksTable) { - convertDataValues(marksTable); - }); - return executeResponse; - } - return executeResponse; -} -exports.UpgradeDataTableTypes = UpgradeDataTableTypes; -function convertDataValues(table) { - // dataTable is a two-dimensional array of data. First index is the row, second is the column. - if (table === undefined || table.dataTable === undefined || !Array.isArray(table.dataTable)) { - return; - } - table.dataTable.forEach(function (row) { - row.forEach(function (dataValue, columnIndex) { - var value = dataValue.value; - if (value !== null) { - dataValue.value = JsApiInternalContract_1.DataTypeConverter.convertValueAsStringToValue(value, table.headers[columnIndex].dataType); - } - }); - }); -} -/** - * Prior to 2021.2 (internal-contract v1.29 and below), getSummaryDataAsync did not support maxRows, - * and any get...DataAsync did not support columnsToIncludeById. - * Trim result to maxRows if it is included in the parameters for getSummaryDataAsync - * Trim columns to columnsToInclude if included in the parameters for any get...DataAsync - */ -function UpgradeDataTableRowsAndColumns(executeResponse, verb, parameters) { - if (isGetSummaryDataVerb(verb) && parameters[JsApiInternalContract_1.ParameterId.MaxRows]) { - executeResponse = adjustDataRowLength(executeResponse, parameters[JsApiInternalContract_1.ParameterId.MaxRows]); - } - if (isGetTableDataVerb(verb) && parameters[JsApiInternalContract_1.ParameterId.ColumnsToIncludeById]) { - executeResponse = adjustDataColumns(executeResponse, parameters[JsApiInternalContract_1.ParameterId.ColumnsToIncludeById]); - } - return executeResponse; -} -exports.UpgradeDataTableRowsAndColumns = UpgradeDataTableRowsAndColumns; -function isGetSummaryDataVerb(verb) { - return verb === JsApiInternalContract_1.VerbId.GetDataSummaryData; -} -function isGetTableDataVerb(verb) { - return (verb === JsApiInternalContract_1.VerbId.GetDataSummaryData || - verb === JsApiInternalContract_1.VerbId.GetUnderlyingTableData || - verb === JsApiInternalContract_1.VerbId.GetLogicalTableData || - verb === JsApiInternalContract_1.VerbId.GetDataSourceData || - verb === JsApiInternalContract_1.VerbId.GetUnderlyingData); -} -function adjustDataRowLength(executeResponse, maxRows) { - var underlyingDataTable = executeResponse.result; - if (!underlyingDataTable.data || !Array.isArray(underlyingDataTable.data.dataTable)) { - return executeResponse; - } - if (maxRows > 0 && maxRows < underlyingDataTable.data.dataTable.length) { - underlyingDataTable.data.dataTable.length = maxRows; - } - return executeResponse; -} -function adjustDataColumns(executeResponse, columnsToInclude) { - if (columnsToInclude.length === 0) { - return executeResponse; - } - // verify that we have a valid UnderlyingDataTable - var underlyingDataTable = executeResponse.result; - if (!underlyingDataTable.data || !Array.isArray(underlyingDataTable.data.dataTable) || !Array.isArray(underlyingDataTable.data.headers)) { - return executeResponse; - } - // 1. filter the headers to only columnsToInclude - // 2. use the new headers to filter all rows - // 3. update the indices in our new headers - var newHeaders = underlyingDataTable.data.headers.filter(function (header, index) { - return columnsToInclude.find(function (name) { return name === header.fieldName; }); - }); - underlyingDataTable.data.dataTable.forEach(function (row, index) { - underlyingDataTable.data.dataTable[index] = row.filter(function (value, valueIndex) { return newHeaders.findIndex(function (header) { return header.index === valueIndex; }) !== -1; }); - }); - var newIndex = 0; - underlyingDataTable.data.headers = newHeaders.map(function (header) { - header.index = newIndex++; - return header; - }); - return executeResponse; -} - - /***/ }), /***/ "../api-shared-js/lib/src/ApiShared.js": @@ -11815,28 +5981,21 @@ exports.VersionedExternalApiDispatcher = VersionedExternalApiDispatcher_1.Versio "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -var VersionNumber_1 = __webpack_require__(/*! ./VersionNumber */ "../api-shared-js/lib/src/ApiShared/VersionNumber.js"); +const VersionNumber_1 = __webpack_require__(/*! ./VersionNumber */ "../api-shared-js/lib/src/ApiShared/VersionNumber.js"); /** * This is the singleton wrapper of VersionNumber */ -var ApiVersion = /** @class */ (function () { - function ApiVersion() { +class ApiVersion { + /** + * Gets the singleton instance of the version number. + */ + static get Instance() { + return ApiVersion._instance; } - Object.defineProperty(ApiVersion, "Instance", { - /** - * Gets the singleton instance of the version number. - */ - get: function () { - return ApiVersion._instance; - }, - enumerable: true, - configurable: true - }); - ApiVersion.SetVersionNumber = function (numString, isAlpha) { + static SetVersionNumber(numString, isAlpha) { ApiVersion._instance = new VersionNumber_1.VersionNumber(numString, isAlpha); - }; - return ApiVersion; -}()); + } +} exports.ApiVersion = ApiVersion; @@ -11855,40 +6014,23 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); * Implementation of a connection summary. * This does not follow the Impl pattern as it is just a property bag. */ -var ConnectionSummary = /** @class */ (function () { - function ConnectionSummary(_connectionInfo) { +class ConnectionSummary { + constructor(_connectionInfo) { this._connectionInfo = _connectionInfo; } - Object.defineProperty(ConnectionSummary.prototype, "name", { - get: function () { - return this._connectionInfo.name; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(ConnectionSummary.prototype, "id", { - get: function () { - return this._connectionInfo.id; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(ConnectionSummary.prototype, "serverURI", { - get: function () { - return this._connectionInfo.serverURI; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(ConnectionSummary.prototype, "type", { - get: function () { - return this._connectionInfo.type; - }, - enumerable: true, - configurable: true - }); - return ConnectionSummary; -}()); + get name() { + return this._connectionInfo.name; + } + get id() { + return this._connectionInfo.id; + } + get serverURI() { + return this._connectionInfo.serverURI; + } + get type() { + return this._connectionInfo.type; + } +} exports.ConnectionSummary = ConnectionSummary; @@ -11903,8 +6045,8 @@ exports.ConnectionSummary = ConnectionSummary; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -var CrossFrameDispatcher_1 = __webpack_require__(/*! ./CrossFrameDispatcher */ "../api-shared-js/lib/src/ApiShared/CrossFrame/CrossFrameDispatcher.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const CrossFrameDispatcher_1 = __webpack_require__(/*! ./CrossFrameDispatcher */ "../api-shared-js/lib/src/ApiShared/CrossFrame/CrossFrameDispatcher.js"); // Checks to see if we are running in an iframe currently: https://stackoverflow.com/a/326076/8821153 function inIframe(thisWindow) { try { @@ -11922,8 +6064,8 @@ function inIframe(thisWindow) { * @returns A promise which is doing the actual bootstrapping */ function doCrossFrameBootstrap(thisWindow, internalContractVersion, options) { - return new Promise(function (resolve, reject) { - var parent; + return new Promise((resolve, reject) => { + let parent; // Normally, we are running inside an iframe. The exception to this is // when we are running as an extension inside a dialog as part of the UINamespace // functionality. In that case, we want the opener of this window rather than the parent. @@ -11939,9 +6081,9 @@ function doCrossFrameBootstrap(thisWindow, internalContractVersion, options) { // Create the messenger which will do he communication between this window and our parent // Since we don't know where we are running yet, we have to make this initial origin '*'. Once // we have successfully initialized our extension, we will limit where we send messages - var messenger = new api_internal_contract_js_1.CrossFrameMessenger(thisWindow, parent, '*'); + const messenger = new api_internal_contract_js_1.CrossFrameMessenger(thisWindow, parent, '*'); // Prepare to send an initialization message to the parent frame - var initializationMessage = messenger.prepareInitializationMessage(internalContractVersion, api_internal_contract_js_1.MESSAGING_VERSION, options); + const initializationMessage = messenger.prepareInitializationMessage(internalContractVersion, api_internal_contract_js_1.MESSAGING_VERSION, options); // When we receive a response back from the parent, we check to make sure the guids match and then we know // that the parent is aware of us and we can start communicating messenger.setCommandResponseMessageHandler(function (msg) { @@ -11949,7 +6091,7 @@ function doCrossFrameBootstrap(thisWindow, internalContractVersion, options) { if (msg.commandGuid === initializationMessage.messageGuid) { // The versioning of the dispatcher happens on the other side of our frame, and // in a wrapper on this side. This one doesn't have any version knowledge. - var dispatcherFactory = function () { return new CrossFrameDispatcher_1.CrossFrameDispatcher(messenger); }; + const dispatcherFactory = () => new CrossFrameDispatcher_1.CrossFrameDispatcher(messenger); resolve(dispatcherFactory); } }); @@ -11972,18 +6114,18 @@ exports.doCrossFrameBootstrap = doCrossFrameBootstrap; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); /** * This is an implementation of the InternalApiDispatcher interface which functions by passing messages * across a frame boundary. This is usually between the code where our javscript library has been included * by a 3rd party dev and another frame where Tableau server has content. */ -var CrossFrameDispatcher = /** @class */ (function () { +class CrossFrameDispatcher { /** * Creates an instance of CrossFrameDispatcher which will use the given messenger to communicate * @param _messenger an instantiated and listening messenger object */ - function CrossFrameDispatcher(_messenger) { + constructor(_messenger) { this._messenger = _messenger; // Collection of pending promises which are waiting to be resolved. When we receive a response back from the other frame, // these promises can be either resolved or rejected @@ -11998,32 +6140,31 @@ var CrossFrameDispatcher = /** @class */ (function () { this._messenger.setNotificationMessageHandler(this.onNotification.bind(this)); } ////// Start InternalApiDispatcher implementation - CrossFrameDispatcher.prototype.execute = function (verb, parameters) { - var _this = this; + execute(verb, parameters) { // To execute a verb, we first prepare a command message and then define a promise. - var preparedMessage = this._messenger.prepareCommandMessage(verb, parameters); - var promise = new Promise(function (resolve, reject) { + const preparedMessage = this._messenger.prepareCommandMessage(verb, parameters); + const promise = new Promise((resolve, reject) => { // Save off the pending promise by the messageGuid we are about to send. When a response is // received, we'll be able to resolve this promise with the result - _this._pendingPromises[preparedMessage.messageGuid] = { resolve: resolve, reject: reject }; + this._pendingPromises[preparedMessage.messageGuid] = { resolve: resolve, reject: reject }; }); // Actually send the message and return the promise preparedMessage.send(); return promise; - }; - CrossFrameDispatcher.prototype.registerNotificationHandler = function (handler) { + } + registerNotificationHandler(handler) { this._notificationHandlers.push(handler); - }; - CrossFrameDispatcher.prototype.unregisterNotificationHandler = function (handler) { - this._notificationHandlers = this._notificationHandlers.filter(function (h) { return h !== handler; }); - }; + } + unregisterNotificationHandler(handler) { + this._notificationHandlers = this._notificationHandlers.filter((h) => h !== handler); + } ////// End InternalApiDispatcher implementation - CrossFrameDispatcher.prototype.onCommandResponse = function (response) { + onCommandResponse(response) { // We got a command response, look through the pending promises and resolve if (Object.keys(this._pendingPromises).indexOf(response.commandGuid) < 0) { return; // We don't have any reference to this command, just return } - var pendingPromise = this._pendingPromises[response.commandGuid]; + const pendingPromise = this._pendingPromises[response.commandGuid]; // If we have an error defined, reject the promise if (response.error) { pendingPromise.reject(response.error); @@ -12034,11 +6175,10 @@ var CrossFrameDispatcher = /** @class */ (function () { } // Clean up our pending promises object delete this._pendingPromises[response.commandGuid]; - }; - CrossFrameDispatcher.prototype.onNotification = function (notificationMessage) { + } + onNotification(notificationMessage) { // Go through each notification handler we have registered and let them know a notification came in - for (var _i = 0, _a = this._notificationHandlers; _i < _a.length; _i++) { - var handler = _a[_i]; + for (const handler of this._notificationHandlers) { try { handler({ notificationId: notificationMessage.notificationId, data: notificationMessage.data }); } @@ -12050,9 +6190,8 @@ var CrossFrameDispatcher = /** @class */ (function () { // Else Ignore so if one handler errors, the other still get the message. } } - }; - return CrossFrameDispatcher; -}()); + } +} exports.CrossFrameDispatcher = CrossFrameDispatcher; @@ -12067,81 +6206,56 @@ exports.CrossFrameDispatcher = CrossFrameDispatcher; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -var DataSource = /** @class */ (function () { - function DataSource(_dataSourceImpl) { +class DataSource { + constructor(_dataSourceImpl) { this._dataSourceImpl = _dataSourceImpl; } - Object.defineProperty(DataSource.prototype, "name", { - get: function () { - return this._dataSourceImpl.name; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DataSource.prototype, "id", { - get: function () { - return this._dataSourceImpl.id; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DataSource.prototype, "fields", { - get: function () { - return this._dataSourceImpl.fields; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DataSource.prototype, "extractUpdateTime", { - get: function () { - return this._dataSourceImpl.extractUpdateTime; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DataSource.prototype, "isExtract", { - get: function () { - return this._dataSourceImpl.isExtract; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DataSource.prototype, "isPublished", { - get: function () { - return this._dataSourceImpl.isPublished; - }, - enumerable: true, - configurable: true - }); - DataSource.prototype.publishedUrl = function () { + get name() { + return this._dataSourceImpl.name; + } + get id() { + return this._dataSourceImpl.id; + } + get fields() { + return this._dataSourceImpl.fields; + } + get extractUpdateTime() { + return this._dataSourceImpl.extractUpdateTime; + } + get isExtract() { + return this._dataSourceImpl.isExtract; + } + get isPublished() { + return this._dataSourceImpl.isPublished; + } + publishedUrl() { return this._dataSourceImpl.publishedUrl(); - }; - DataSource.prototype.refreshAsync = function () { + } + refreshAsync() { return this._dataSourceImpl.refreshAsync(); - }; - DataSource.prototype.getActiveTablesAsync = function () { + } + getActiveTablesAsync() { console.warn('DataSource.getActiveTablesAsync is deprecated. Please use DataSource.getLogicalTablesAsync.'); return this._dataSourceImpl.getActiveTablesAsync(); - }; - DataSource.prototype.getConnectionSummariesAsync = function () { + } + getConnectionSummariesAsync() { return this._dataSourceImpl.getConnectionSummariesAsync(); - }; - DataSource.prototype.getUnderlyingDataAsync = function (options) { + } + getUnderlyingDataAsync(options) { console.warn('DataSource.getUnderlyingDataAsync is deprecated. Please use ' + 'DataSource.getLogicalTablesAsync and DataSource.getLogicalTableDataAsync.'); return this._dataSourceImpl.getUnderlyingDataAsync(options); - }; - DataSource.prototype.getLogicalTablesAsync = function () { + } + getLogicalTablesAsync() { return this._dataSourceImpl.getLogicalTablesAsync(); - }; - DataSource.prototype.getLogicalTableDataAsync = function (logicalTableId, options) { + } + getLogicalTableDataAsync(logicalTableId, options) { return this._dataSourceImpl.getLogicalTableDataAsync(logicalTableId, options); - }; - DataSource.prototype.getLogicalTableDataReaderAsync = function (logicalTableId, pageRowCount, options) { + } + getLogicalTableDataReaderAsync(logicalTableId, pageRowCount, options) { return this._dataSourceImpl.getLogicalTableDataReaderAsync(logicalTableId, pageRowCount, options); - }; - return DataSource; -}()); + } +} exports.DataSource = DataSource; @@ -12155,81 +6269,77 @@ exports.DataSource = DataSource; "use strict"; -var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k; Object.defineProperty(exports, "__esModule", ({ value: true })); -var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -var EnumConverter_1 = __webpack_require__(/*! ../Utils/EnumConverter */ "../api-shared-js/lib/src/ApiShared/Utils/EnumConverter.js"); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const EnumConverter_1 = __webpack_require__(/*! ../Utils/EnumConverter */ "../api-shared-js/lib/src/ApiShared/Utils/EnumConverter.js"); /* tslint:disable:typedef - Disable this to make declaring these classes a bit easier */ /** * Maps enums used by the external-api-contract to the enums used * in the internal-api-contract, which developers code against. */ -var ExternalToInternalEnumMappings = /** @class */ (function () { - function ExternalToInternalEnumMappings() { - } - ExternalToInternalEnumMappings.filterDomainType = new EnumConverter_1.EnumConverter((_a = {}, - _a[api_external_contract_js_1.FilterDomainType.Relevant] = api_internal_contract_js_1.FilterDomainType.Relevant, - _a[api_external_contract_js_1.FilterDomainType.Database] = api_internal_contract_js_1.FilterDomainType.Database, - _a)); - ExternalToInternalEnumMappings.nullOptions = new EnumConverter_1.EnumConverter((_b = {}, - _b[api_external_contract_js_1.FilterNullOption.AllValues] = api_internal_contract_js_1.FilterNullOption.AllValues, - _b[api_external_contract_js_1.FilterNullOption.NonNullValues] = api_internal_contract_js_1.FilterNullOption.NonNullValues, - _b[api_external_contract_js_1.FilterNullOption.NullValues] = api_internal_contract_js_1.FilterNullOption.NullValues, - _b)); - ExternalToInternalEnumMappings.filterUpdateType = new EnumConverter_1.EnumConverter((_c = {}, - _c[api_external_contract_js_1.FilterUpdateType.Add] = api_internal_contract_js_1.FilterUpdateType.Add, - _c[api_external_contract_js_1.FilterUpdateType.All] = api_internal_contract_js_1.FilterUpdateType.All, - _c[api_external_contract_js_1.FilterUpdateType.Remove] = api_internal_contract_js_1.FilterUpdateType.Remove, - _c[api_external_contract_js_1.FilterUpdateType.Replace] = api_internal_contract_js_1.FilterUpdateType.Replace, - _c)); - ExternalToInternalEnumMappings.setVisibilityType = new EnumConverter_1.EnumConverter((_d = {}, - _d[api_external_contract_js_1.ZoneVisibilityType.Show] = true, - _d[api_external_contract_js_1.ZoneVisibilityType.Hide] = false, - _d)); - ExternalToInternalEnumMappings.setReplaySpeedType = new EnumConverter_1.EnumConverter((_e = {}, - // these numbers are duration multipliers - // 2.0, for example, doubles the duration of the replay, slowing it down to 0.5x speed - _e[api_external_contract_js_1.ReplaySpeedType.Slow] = 2.0, - _e[api_external_contract_js_1.ReplaySpeedType.Normal] = 1.0, - _e[api_external_contract_js_1.ReplaySpeedType.Fast] = 0.5, - _e)); - ExternalToInternalEnumMappings.sheetType = new EnumConverter_1.EnumConverter((_f = {}, - _f[api_external_contract_js_1.SheetType.Dashboard] = api_internal_contract_js_1.SheetType.Dashboard, - _f[api_external_contract_js_1.SheetType.Worksheet] = api_internal_contract_js_1.SheetType.Worksheet, - _f[api_external_contract_js_1.SheetType.Story] = api_internal_contract_js_1.SheetType.Story, - _f)); - ExternalToInternalEnumMappings.showDataTableFormatType = new EnumConverter_1.EnumConverter((_g = {}, - _g[api_external_contract_js_1.IncludeDataValuesOption.AllValues] = api_internal_contract_js_1.ApiShowDataTableFormat.NativeAndFormattedValues, - _g[api_external_contract_js_1.IncludeDataValuesOption.OnlyNativeValues] = api_internal_contract_js_1.ApiShowDataTableFormat.NativeValuesOnly, - _g[api_external_contract_js_1.IncludeDataValuesOption.OnlyFormattedValues] = api_internal_contract_js_1.ApiShowDataTableFormat.FormattedValuesOnly, - _g)); - ExternalToInternalEnumMappings.periodType = new EnumConverter_1.EnumConverter((_h = {}, - _h[api_external_contract_js_1.PeriodType.Years] = api_internal_contract_js_1.DateStepPeriod.Years, - _h[api_external_contract_js_1.PeriodType.Quarters] = api_internal_contract_js_1.DateStepPeriod.Quarters, - _h[api_external_contract_js_1.PeriodType.Months] = api_internal_contract_js_1.DateStepPeriod.Months, - _h[api_external_contract_js_1.PeriodType.Weeks] = api_internal_contract_js_1.DateStepPeriod.Weeks, - _h[api_external_contract_js_1.PeriodType.Days] = api_internal_contract_js_1.DateStepPeriod.Days, - _h[api_external_contract_js_1.PeriodType.Hours] = api_internal_contract_js_1.DateStepPeriod.Hours, - _h[api_external_contract_js_1.PeriodType.Minutes] = api_internal_contract_js_1.DateStepPeriod.Minutes, - _h[api_external_contract_js_1.PeriodType.Seconds] = api_internal_contract_js_1.DateStepPeriod.Seconds, - _h)); - ExternalToInternalEnumMappings.dateRangeType = new EnumConverter_1.EnumConverter((_j = {}, - _j[api_external_contract_js_1.DateRangeType.Last] = api_internal_contract_js_1.DateRangeType.Last, - _j[api_external_contract_js_1.DateRangeType.LastN] = api_internal_contract_js_1.DateRangeType.LastN, - _j[api_external_contract_js_1.DateRangeType.Next] = api_internal_contract_js_1.DateRangeType.Next, - _j[api_external_contract_js_1.DateRangeType.NextN] = api_internal_contract_js_1.DateRangeType.NextN, - _j[api_external_contract_js_1.DateRangeType.Current] = api_internal_contract_js_1.DateRangeType.Current, - _j[api_external_contract_js_1.DateRangeType.ToDate] = api_internal_contract_js_1.DateRangeType.ToDate, - _j)); - ExternalToInternalEnumMappings.dialogStyles = new EnumConverter_1.EnumConverter((_k = {}, - _k[api_external_contract_js_1.DialogStyle.Window] = api_internal_contract_js_1.DialogStyle.Window, - _k[api_external_contract_js_1.DialogStyle.Modal] = api_internal_contract_js_1.DialogStyle.Modal, - _k[api_external_contract_js_1.DialogStyle.Modeless] = api_internal_contract_js_1.DialogStyle.Modeless, - _k)); - return ExternalToInternalEnumMappings; -}()); +class ExternalToInternalEnumMappings { +} exports.ExternalToInternalEnumMappings = ExternalToInternalEnumMappings; +ExternalToInternalEnumMappings.filterDomainType = new EnumConverter_1.EnumConverter({ + [api_external_contract_js_1.FilterDomainType.Relevant]: api_internal_contract_js_1.FilterDomainType.Relevant, + [api_external_contract_js_1.FilterDomainType.Database]: api_internal_contract_js_1.FilterDomainType.Database, +}); +ExternalToInternalEnumMappings.nullOptions = new EnumConverter_1.EnumConverter({ + [api_external_contract_js_1.FilterNullOption.AllValues]: api_internal_contract_js_1.FilterNullOption.AllValues, + [api_external_contract_js_1.FilterNullOption.NonNullValues]: api_internal_contract_js_1.FilterNullOption.NonNullValues, + [api_external_contract_js_1.FilterNullOption.NullValues]: api_internal_contract_js_1.FilterNullOption.NullValues, +}); +ExternalToInternalEnumMappings.filterUpdateType = new EnumConverter_1.EnumConverter({ + [api_external_contract_js_1.FilterUpdateType.Add]: api_internal_contract_js_1.FilterUpdateType.Add, + [api_external_contract_js_1.FilterUpdateType.All]: api_internal_contract_js_1.FilterUpdateType.All, + [api_external_contract_js_1.FilterUpdateType.Remove]: api_internal_contract_js_1.FilterUpdateType.Remove, + [api_external_contract_js_1.FilterUpdateType.Replace]: api_internal_contract_js_1.FilterUpdateType.Replace, +}); +ExternalToInternalEnumMappings.setVisibilityType = new EnumConverter_1.EnumConverter({ + [api_external_contract_js_1.ZoneVisibilityType.Show]: true, + [api_external_contract_js_1.ZoneVisibilityType.Hide]: false, +}); +ExternalToInternalEnumMappings.setReplaySpeedType = new EnumConverter_1.EnumConverter({ + // these numbers are duration multipliers + // 2.0, for example, doubles the duration of the replay, slowing it down to 0.5x speed + [api_external_contract_js_1.ReplaySpeedType.Slow]: 2.0, + [api_external_contract_js_1.ReplaySpeedType.Normal]: 1.0, + [api_external_contract_js_1.ReplaySpeedType.Fast]: 0.5, +}); +ExternalToInternalEnumMappings.sheetType = new EnumConverter_1.EnumConverter({ + [api_external_contract_js_1.SheetType.Dashboard]: api_internal_contract_js_1.SheetType.Dashboard, + [api_external_contract_js_1.SheetType.Worksheet]: api_internal_contract_js_1.SheetType.Worksheet, + [api_external_contract_js_1.SheetType.Story]: api_internal_contract_js_1.SheetType.Story, +}); +ExternalToInternalEnumMappings.showDataTableFormatType = new EnumConverter_1.EnumConverter({ + [api_external_contract_js_1.IncludeDataValuesOption.AllValues]: api_internal_contract_js_1.ApiShowDataTableFormat.NativeAndFormattedValues, + [api_external_contract_js_1.IncludeDataValuesOption.OnlyNativeValues]: api_internal_contract_js_1.ApiShowDataTableFormat.NativeValuesOnly, + [api_external_contract_js_1.IncludeDataValuesOption.OnlyFormattedValues]: api_internal_contract_js_1.ApiShowDataTableFormat.FormattedValuesOnly, +}); +ExternalToInternalEnumMappings.periodType = new EnumConverter_1.EnumConverter({ + [api_external_contract_js_1.PeriodType.Years]: api_internal_contract_js_1.DateStepPeriod.Years, + [api_external_contract_js_1.PeriodType.Quarters]: api_internal_contract_js_1.DateStepPeriod.Quarters, + [api_external_contract_js_1.PeriodType.Months]: api_internal_contract_js_1.DateStepPeriod.Months, + [api_external_contract_js_1.PeriodType.Weeks]: api_internal_contract_js_1.DateStepPeriod.Weeks, + [api_external_contract_js_1.PeriodType.Days]: api_internal_contract_js_1.DateStepPeriod.Days, + [api_external_contract_js_1.PeriodType.Hours]: api_internal_contract_js_1.DateStepPeriod.Hours, + [api_external_contract_js_1.PeriodType.Minutes]: api_internal_contract_js_1.DateStepPeriod.Minutes, + [api_external_contract_js_1.PeriodType.Seconds]: api_internal_contract_js_1.DateStepPeriod.Seconds, +}); +ExternalToInternalEnumMappings.dateRangeType = new EnumConverter_1.EnumConverter({ + [api_external_contract_js_1.DateRangeType.Last]: api_internal_contract_js_1.DateRangeType.Last, + [api_external_contract_js_1.DateRangeType.LastN]: api_internal_contract_js_1.DateRangeType.LastN, + [api_external_contract_js_1.DateRangeType.Next]: api_internal_contract_js_1.DateRangeType.Next, + [api_external_contract_js_1.DateRangeType.NextN]: api_internal_contract_js_1.DateRangeType.NextN, + [api_external_contract_js_1.DateRangeType.Current]: api_internal_contract_js_1.DateRangeType.Current, + [api_external_contract_js_1.DateRangeType.ToDate]: api_internal_contract_js_1.DateRangeType.ToDate, +}); +ExternalToInternalEnumMappings.dialogStyles = new EnumConverter_1.EnumConverter({ + [api_external_contract_js_1.DialogStyle.Window]: api_internal_contract_js_1.DialogStyle.Window, + [api_external_contract_js_1.DialogStyle.Modal]: api_internal_contract_js_1.DialogStyle.Modal, + [api_external_contract_js_1.DialogStyle.Modeless]: api_internal_contract_js_1.DialogStyle.Modeless, +}); /* tslint:enable:typedef */ @@ -12243,199 +6353,198 @@ exports.ExternalToInternalEnumMappings = ExternalToInternalEnumMappings; "use strict"; -var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t; Object.defineProperty(exports, "__esModule", ({ value: true })); -var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -var EnumConverter_1 = __webpack_require__(/*! ../Utils/EnumConverter */ "../api-shared-js/lib/src/ApiShared/Utils/EnumConverter.js"); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const EnumConverter_1 = __webpack_require__(/*! ../Utils/EnumConverter */ "../api-shared-js/lib/src/ApiShared/Utils/EnumConverter.js"); /* tslint:disable:typedef - Disable this to make declaring these classes a bit easier */ /** * Maps enums used by the internal-api-contract to the enums used * in the external-api-contract, which developers code against. */ -var InternalToExternalEnumMappings = /** @class */ (function () { - function InternalToExternalEnumMappings() { - } - InternalToExternalEnumMappings.extensionContext = new EnumConverter_1.EnumConverter((_a = {}, - _a[api_internal_contract_js_1.ExtensionContext.Desktop] = api_external_contract_js_1.ExtensionContext.Desktop, - _a[api_internal_contract_js_1.ExtensionContext.Server] = api_external_contract_js_1.ExtensionContext.Server, - _a)); - InternalToExternalEnumMappings.extensionMode = new EnumConverter_1.EnumConverter((_b = {}, - _b[api_internal_contract_js_1.ExtensionMode.Authoring] = api_external_contract_js_1.ExtensionMode.Authoring, - _b[api_internal_contract_js_1.ExtensionMode.Viewing] = api_external_contract_js_1.ExtensionMode.Viewing, - _b)); - InternalToExternalEnumMappings.columnType = new EnumConverter_1.EnumConverter((_c = {}, - _c[api_internal_contract_js_1.ColumnType.Continuous] = api_external_contract_js_1.ColumnType.Continuous, - _c[api_internal_contract_js_1.ColumnType.Discrete] = api_external_contract_js_1.ColumnType.Discrete, - _c[api_internal_contract_js_1.ColumnType.Unknown] = api_external_contract_js_1.ColumnType.Unknown, - _c)); - InternalToExternalEnumMappings.fieldAggregationType = new EnumConverter_1.EnumConverter((_d = {}, - _d[api_internal_contract_js_1.FieldAggregationType.Attr] = api_external_contract_js_1.FieldAggregationType.Attr, - _d[api_internal_contract_js_1.FieldAggregationType.Avg] = api_external_contract_js_1.FieldAggregationType.Avg, - _d[api_internal_contract_js_1.FieldAggregationType.Collect] = api_external_contract_js_1.FieldAggregationType.Collect, - _d[api_internal_contract_js_1.FieldAggregationType.Count] = api_external_contract_js_1.FieldAggregationType.Count, - _d[api_internal_contract_js_1.FieldAggregationType.Countd] = api_external_contract_js_1.FieldAggregationType.Countd, - _d[api_internal_contract_js_1.FieldAggregationType.Day] = api_external_contract_js_1.FieldAggregationType.Day, - _d[api_internal_contract_js_1.FieldAggregationType.End] = api_external_contract_js_1.FieldAggregationType.End, - _d[api_internal_contract_js_1.FieldAggregationType.Hour] = api_external_contract_js_1.FieldAggregationType.Hour, - _d[api_internal_contract_js_1.FieldAggregationType.InOut] = api_external_contract_js_1.FieldAggregationType.InOut, - _d[api_internal_contract_js_1.FieldAggregationType.Kurtosis] = api_external_contract_js_1.FieldAggregationType.Kurtosis, - _d[api_internal_contract_js_1.FieldAggregationType.Max] = api_external_contract_js_1.FieldAggregationType.Max, - _d[api_internal_contract_js_1.FieldAggregationType.Mdy] = api_external_contract_js_1.FieldAggregationType.Mdy, - _d[api_internal_contract_js_1.FieldAggregationType.Median] = api_external_contract_js_1.FieldAggregationType.Median, - _d[api_internal_contract_js_1.FieldAggregationType.Min] = api_external_contract_js_1.FieldAggregationType.Min, - _d[api_internal_contract_js_1.FieldAggregationType.Minute] = api_external_contract_js_1.FieldAggregationType.Minute, - _d[api_internal_contract_js_1.FieldAggregationType.MonthYear] = api_external_contract_js_1.FieldAggregationType.MonthYear, - _d[api_internal_contract_js_1.FieldAggregationType.None] = api_external_contract_js_1.FieldAggregationType.None, - _d[api_internal_contract_js_1.FieldAggregationType.Qtr] = api_external_contract_js_1.FieldAggregationType.Qtr, - _d[api_internal_contract_js_1.FieldAggregationType.Quart1] = api_external_contract_js_1.FieldAggregationType.Quart1, - _d[api_internal_contract_js_1.FieldAggregationType.Quart3] = api_external_contract_js_1.FieldAggregationType.Quart3, - _d[api_internal_contract_js_1.FieldAggregationType.Second] = api_external_contract_js_1.FieldAggregationType.Second, - _d[api_internal_contract_js_1.FieldAggregationType.Skewness] = api_external_contract_js_1.FieldAggregationType.Skewness, - _d[api_internal_contract_js_1.FieldAggregationType.Stdev] = api_external_contract_js_1.FieldAggregationType.Stdev, - _d[api_internal_contract_js_1.FieldAggregationType.Stdevp] = api_external_contract_js_1.FieldAggregationType.Stdevp, - _d[api_internal_contract_js_1.FieldAggregationType.Sum] = api_external_contract_js_1.FieldAggregationType.Sum, - _d[api_internal_contract_js_1.FieldAggregationType.TruncDay] = api_external_contract_js_1.FieldAggregationType.TruncDay, - _d[api_internal_contract_js_1.FieldAggregationType.TruncHour] = api_external_contract_js_1.FieldAggregationType.TruncHour, - _d[api_internal_contract_js_1.FieldAggregationType.TruncMinute] = api_external_contract_js_1.FieldAggregationType.TruncMinute, - _d[api_internal_contract_js_1.FieldAggregationType.TruncMonth] = api_external_contract_js_1.FieldAggregationType.TruncMonth, - _d[api_internal_contract_js_1.FieldAggregationType.TruncQtr] = api_external_contract_js_1.FieldAggregationType.TruncQtr, - _d[api_internal_contract_js_1.FieldAggregationType.TruncSecond] = api_external_contract_js_1.FieldAggregationType.TruncSecond, - _d[api_internal_contract_js_1.FieldAggregationType.TruncWeek] = api_external_contract_js_1.FieldAggregationType.TruncWeek, - _d[api_internal_contract_js_1.FieldAggregationType.TruncYear] = api_external_contract_js_1.FieldAggregationType.TruncYear, - _d[api_internal_contract_js_1.FieldAggregationType.User] = api_external_contract_js_1.FieldAggregationType.User, - _d[api_internal_contract_js_1.FieldAggregationType.Var] = api_external_contract_js_1.FieldAggregationType.Var, - _d[api_internal_contract_js_1.FieldAggregationType.Varp] = api_external_contract_js_1.FieldAggregationType.Varp, - _d[api_internal_contract_js_1.FieldAggregationType.Week] = api_external_contract_js_1.FieldAggregationType.Week, - _d[api_internal_contract_js_1.FieldAggregationType.Weekday] = api_external_contract_js_1.FieldAggregationType.Weekday, - _d[api_internal_contract_js_1.FieldAggregationType.Year] = api_external_contract_js_1.FieldAggregationType.Year, - _d)); - InternalToExternalEnumMappings.fieldRoleType = new EnumConverter_1.EnumConverter((_e = {}, - _e[api_internal_contract_js_1.FieldRoleType.Dimension] = api_external_contract_js_1.FieldRoleType.Dimension, - _e[api_internal_contract_js_1.FieldRoleType.Measure] = api_external_contract_js_1.FieldRoleType.Measure, - _e[api_internal_contract_js_1.FieldRoleType.Unknown] = api_external_contract_js_1.FieldRoleType.Unknown, - _e)); - InternalToExternalEnumMappings.sheetType = new EnumConverter_1.EnumConverter((_f = {}, - _f[api_internal_contract_js_1.SheetType.Dashboard] = api_external_contract_js_1.SheetType.Dashboard, - _f[api_internal_contract_js_1.SheetType.Story] = api_external_contract_js_1.SheetType.Story, - _f[api_internal_contract_js_1.SheetType.Worksheet] = api_external_contract_js_1.SheetType.Worksheet, - _f)); - InternalToExternalEnumMappings.dashboardObjectType = new EnumConverter_1.EnumConverter((_g = {}, - _g[api_internal_contract_js_1.DashboardObjectType.Extension] = api_external_contract_js_1.DashboardObjectType.Extension, - _g[api_internal_contract_js_1.DashboardObjectType.Blank] = api_external_contract_js_1.DashboardObjectType.Blank, - _g[api_internal_contract_js_1.DashboardObjectType.Image] = api_external_contract_js_1.DashboardObjectType.Image, - _g[api_internal_contract_js_1.DashboardObjectType.Legend] = api_external_contract_js_1.DashboardObjectType.Legend, - _g[api_internal_contract_js_1.DashboardObjectType.PageFilter] = api_external_contract_js_1.DashboardObjectType.PageFilter, - _g[api_internal_contract_js_1.DashboardObjectType.ParameterControl] = api_external_contract_js_1.DashboardObjectType.ParameterControl, - _g[api_internal_contract_js_1.DashboardObjectType.QuickFilter] = api_external_contract_js_1.DashboardObjectType.QuickFilter, - _g[api_internal_contract_js_1.DashboardObjectType.Text] = api_external_contract_js_1.DashboardObjectType.Text, - _g[api_internal_contract_js_1.DashboardObjectType.Title] = api_external_contract_js_1.DashboardObjectType.Title, - _g[api_internal_contract_js_1.DashboardObjectType.WebPage] = api_external_contract_js_1.DashboardObjectType.WebPage, - _g[api_internal_contract_js_1.DashboardObjectType.Worksheet] = api_external_contract_js_1.DashboardObjectType.Worksheet, - _g)); - InternalToExternalEnumMappings.dataType = new EnumConverter_1.EnumConverter((_h = {}, - _h[api_internal_contract_js_1.DataType.Bool] = api_external_contract_js_1.DataType.Bool, - _h[api_internal_contract_js_1.DataType.Date] = api_external_contract_js_1.DataType.Date, - _h[api_internal_contract_js_1.DataType.DateTime] = api_external_contract_js_1.DataType.DateTime, - _h[api_internal_contract_js_1.DataType.Float] = api_external_contract_js_1.DataType.Float, - _h[api_internal_contract_js_1.DataType.Int] = api_external_contract_js_1.DataType.Int, - _h[api_internal_contract_js_1.DataType.Spatial] = api_external_contract_js_1.DataType.Spatial, - _h[api_internal_contract_js_1.DataType.String] = api_external_contract_js_1.DataType.String, - _h)); - InternalToExternalEnumMappings.filterUpdateType = new EnumConverter_1.EnumConverter((_j = {}, - _j[api_internal_contract_js_1.FilterUpdateType.Add] = api_external_contract_js_1.FilterUpdateType.Add, - _j[api_internal_contract_js_1.FilterUpdateType.All] = api_external_contract_js_1.FilterUpdateType.All, - _j[api_internal_contract_js_1.FilterUpdateType.Remove] = api_external_contract_js_1.FilterUpdateType.Remove, - _j[api_internal_contract_js_1.FilterUpdateType.Replace] = api_external_contract_js_1.FilterUpdateType.Replace, - _j)); - InternalToExternalEnumMappings.allowableValues = new EnumConverter_1.EnumConverter((_k = {}, - _k[api_internal_contract_js_1.DomainRestrictionType.All] = api_external_contract_js_1.ParameterValueType.All, - _k[api_internal_contract_js_1.DomainRestrictionType.List] = api_external_contract_js_1.ParameterValueType.List, - _k[api_internal_contract_js_1.DomainRestrictionType.Range] = api_external_contract_js_1.ParameterValueType.Range, - _k)); - InternalToExternalEnumMappings.dateStepPeriod = new EnumConverter_1.EnumConverter((_l = {}, - _l[api_internal_contract_js_1.DateStepPeriod.Years] = api_external_contract_js_1.PeriodType.Years, - _l[api_internal_contract_js_1.DateStepPeriod.Quarters] = api_external_contract_js_1.PeriodType.Quarters, - _l[api_internal_contract_js_1.DateStepPeriod.Months] = api_external_contract_js_1.PeriodType.Months, - _l[api_internal_contract_js_1.DateStepPeriod.Weeks] = api_external_contract_js_1.PeriodType.Weeks, - _l[api_internal_contract_js_1.DateStepPeriod.Days] = api_external_contract_js_1.PeriodType.Days, - _l[api_internal_contract_js_1.DateStepPeriod.Hours] = api_external_contract_js_1.PeriodType.Hours, - _l[api_internal_contract_js_1.DateStepPeriod.Minutes] = api_external_contract_js_1.PeriodType.Minutes, - _l[api_internal_contract_js_1.DateStepPeriod.Seconds] = api_external_contract_js_1.PeriodType.Seconds, - _l)); - InternalToExternalEnumMappings.dateRangeType = new EnumConverter_1.EnumConverter((_m = {}, - _m[api_internal_contract_js_1.DateRangeType.Current] = api_external_contract_js_1.DateRangeType.Current, - _m[api_internal_contract_js_1.DateRangeType.Last] = api_external_contract_js_1.DateRangeType.Last, - _m[api_internal_contract_js_1.DateRangeType.LastN] = api_external_contract_js_1.DateRangeType.LastN, - _m[api_internal_contract_js_1.DateRangeType.Next] = api_external_contract_js_1.DateRangeType.Next, - _m[api_internal_contract_js_1.DateRangeType.NextN] = api_external_contract_js_1.DateRangeType.NextN, - _m[api_internal_contract_js_1.DateRangeType.ToDate] = api_external_contract_js_1.DateRangeType.ToDate, - _m)); - InternalToExternalEnumMappings.errorCode = new EnumConverter_1.EnumConverter((_o = {}, - _o[api_internal_contract_js_1.ErrorCodes.INITIALIZATION_ERROR] = api_external_contract_js_1.ErrorCodes.InternalError, - _o[api_internal_contract_js_1.ErrorCodes.INTERNAL_ERROR] = api_external_contract_js_1.ErrorCodes.InternalError, - _o[api_internal_contract_js_1.ErrorCodes.MISSING_ENUM_MAPPING] = api_external_contract_js_1.ErrorCodes.InternalError, - _o[api_internal_contract_js_1.ErrorCodes.MISSING_PARAMETER] = api_external_contract_js_1.ErrorCodes.InternalError, - _o[api_internal_contract_js_1.ErrorCodes.PERMISSION_DENIED] = api_external_contract_js_1.ErrorCodes.InternalError, - _o[api_internal_contract_js_1.ErrorCodes.PRES_MODEL_PARSING_ERROR] = api_external_contract_js_1.ErrorCodes.InternalError, - _o[api_internal_contract_js_1.ErrorCodes.UNKNOWN_VERB_ID] = api_external_contract_js_1.ErrorCodes.InternalError, - _o[api_internal_contract_js_1.ErrorCodes.VERSION_NOT_CONFIGURED] = api_external_contract_js_1.ErrorCodes.APINotInitialized, - _o[api_internal_contract_js_1.ErrorCodes.VISIBILITY_ERROR] = api_external_contract_js_1.ErrorCodes.VisibilityError, - _o), api_external_contract_js_1.ErrorCodes.InternalError); - InternalToExternalEnumMappings.filterType = new EnumConverter_1.EnumConverter((_p = {}, - _p[api_internal_contract_js_1.FilterType.Categorical] = api_external_contract_js_1.FilterType.Categorical, - _p[api_internal_contract_js_1.FilterType.Range] = api_external_contract_js_1.FilterType.Range, - _p[api_internal_contract_js_1.FilterType.RelativeDate] = api_external_contract_js_1.FilterType.RelativeDate, - _p[api_internal_contract_js_1.FilterType.Hierarchical] = api_external_contract_js_1.FilterType.Hierarchical, - _p)); - InternalToExternalEnumMappings.classNameKey = new EnumConverter_1.EnumConverter((_q = {}, - _q["tableau-dashboard-title" /* DashboardTitle */] = api_external_contract_js_1.ClassNameKey.DashboardTitle, - _q["tableau-story-title" /* StoryTitle */] = api_external_contract_js_1.ClassNameKey.StoryTitle, - _q["tableau-tooltip" /* Tooltip */] = api_external_contract_js_1.ClassNameKey.Tooltip, - _q["tableau-worksheet" /* Worksheet */] = api_external_contract_js_1.ClassNameKey.Worksheet, - _q["tableau-worksheet-title" /* WorksheetTitle */] = api_external_contract_js_1.ClassNameKey.WorksheetTitle, - _q["tableau-pane" /* Pane */] = api_external_contract_js_1.ClassNameKey.Pane, - _q["tableau-row-dividers" /* RowDividers */] = api_external_contract_js_1.ClassNameKey.RowDividers, - _q["tableau-column-dividers" /* ColumnDividers */] = api_external_contract_js_1.ClassNameKey.ColumnDividers, - // Temporary until we fix 1317266 - Platform hasn't been updated currently because near branch is closed - _q['dashboard-title'] = api_external_contract_js_1.ClassNameKey.DashboardTitle, - _q['story-title'] = api_external_contract_js_1.ClassNameKey.StoryTitle, - _q['tooltip'] = api_external_contract_js_1.ClassNameKey.Tooltip, - _q['worksheet'] = api_external_contract_js_1.ClassNameKey.Worksheet, - _q['worksheet-title'] = api_external_contract_js_1.ClassNameKey.WorksheetTitle, - _q['pane'] = api_external_contract_js_1.ClassNameKey.Pane, - _q['row-dividers'] = api_external_contract_js_1.ClassNameKey.RowDividers, - _q['column-dividers'] = api_external_contract_js_1.ClassNameKey.ColumnDividers, - _q)); - InternalToExternalEnumMappings.hierarchicalLevelSelectionState = new EnumConverter_1.EnumConverter((_r = {}, - _r[api_internal_contract_js_1.HierarchicalLevelSelectionState.AllSelected] = api_external_contract_js_1.HierarchicalLevelSelectionState.AllSelected, - _r[api_internal_contract_js_1.HierarchicalLevelSelectionState.NoneSelected] = api_external_contract_js_1.HierarchicalLevelSelectionState.NoneSelected, - _r[api_internal_contract_js_1.HierarchicalLevelSelectionState.SomeSelected] = api_external_contract_js_1.HierarchicalLevelSelectionState.SomeSelected, - _r[api_internal_contract_js_1.HierarchicalLevelSelectionState.UnknownSelected] = api_external_contract_js_1.HierarchicalLevelSelectionState.UnknownSelected, - _r)); - InternalToExternalEnumMappings.annotationType = new EnumConverter_1.EnumConverter((_s = {}, - _s[api_internal_contract_js_1.AnnotateEnum.Area] = api_external_contract_js_1.AnnotationType.Area, - _s[api_internal_contract_js_1.AnnotateEnum.Mark] = api_external_contract_js_1.AnnotationType.Mark, - _s[api_internal_contract_js_1.AnnotateEnum.Point] = api_external_contract_js_1.AnnotationType.Point, - _s)); - InternalToExternalEnumMappings.markType = new EnumConverter_1.EnumConverter((_t = {}, - _t[api_internal_contract_js_1.MarkType.Area] = api_external_contract_js_1.MarkType.Area, - _t[api_internal_contract_js_1.MarkType.Bar] = api_external_contract_js_1.MarkType.Bar, - _t[api_internal_contract_js_1.MarkType.Circle] = api_external_contract_js_1.MarkType.Circle, - _t[api_internal_contract_js_1.MarkType.GanttBar] = api_external_contract_js_1.MarkType.GanttBar, - _t[api_internal_contract_js_1.MarkType.Heatmap] = api_external_contract_js_1.MarkType.Heatmap, - _t[api_internal_contract_js_1.MarkType.Line] = api_external_contract_js_1.MarkType.Line, - _t[api_internal_contract_js_1.MarkType.Map] = api_external_contract_js_1.MarkType.Map, - _t[api_internal_contract_js_1.MarkType.Pie] = api_external_contract_js_1.MarkType.Pie, - _t[api_internal_contract_js_1.MarkType.Polygon] = api_external_contract_js_1.MarkType.Polygon, - _t[api_internal_contract_js_1.MarkType.Shape] = api_external_contract_js_1.MarkType.Shape, - _t[api_internal_contract_js_1.MarkType.Square] = api_external_contract_js_1.MarkType.Square, - _t[api_internal_contract_js_1.MarkType.Text] = api_external_contract_js_1.MarkType.Text, - _t[api_internal_contract_js_1.MarkType.VizExtension] = api_external_contract_js_1.MarkType.VizExtension, - _t)); - return InternalToExternalEnumMappings; -}()); +class InternalToExternalEnumMappings { +} exports.InternalToExternalEnumMappings = InternalToExternalEnumMappings; +InternalToExternalEnumMappings.extensionContext = new EnumConverter_1.EnumConverter({ + [api_internal_contract_js_1.ExtensionContext.Desktop]: api_external_contract_js_1.ExtensionContext.Desktop, + [api_internal_contract_js_1.ExtensionContext.Server]: api_external_contract_js_1.ExtensionContext.Server, + [api_internal_contract_js_1.ExtensionContext.PublicWeb]: api_external_contract_js_1.ExtensionContext.PublicWeb, + [api_internal_contract_js_1.ExtensionContext.PublicDesktop]: api_external_contract_js_1.ExtensionContext.PublicDesktop, + [api_internal_contract_js_1.ExtensionContext.Cloud]: api_external_contract_js_1.ExtensionContext.Cloud, +}); +InternalToExternalEnumMappings.extensionMode = new EnumConverter_1.EnumConverter({ + [api_internal_contract_js_1.ExtensionMode.Authoring]: api_external_contract_js_1.ExtensionMode.Authoring, + [api_internal_contract_js_1.ExtensionMode.Viewing]: api_external_contract_js_1.ExtensionMode.Viewing, +}); +InternalToExternalEnumMappings.columnType = new EnumConverter_1.EnumConverter({ + [api_internal_contract_js_1.ColumnType.Continuous]: api_external_contract_js_1.ColumnType.Continuous, + [api_internal_contract_js_1.ColumnType.Discrete]: api_external_contract_js_1.ColumnType.Discrete, + [api_internal_contract_js_1.ColumnType.Unknown]: api_external_contract_js_1.ColumnType.Unknown, +}); +InternalToExternalEnumMappings.fieldAggregationType = new EnumConverter_1.EnumConverter({ + [api_internal_contract_js_1.FieldAggregationType.Attr]: api_external_contract_js_1.FieldAggregationType.Attr, + [api_internal_contract_js_1.FieldAggregationType.Avg]: api_external_contract_js_1.FieldAggregationType.Avg, + [api_internal_contract_js_1.FieldAggregationType.Collect]: api_external_contract_js_1.FieldAggregationType.Collect, + [api_internal_contract_js_1.FieldAggregationType.Count]: api_external_contract_js_1.FieldAggregationType.Count, + [api_internal_contract_js_1.FieldAggregationType.Countd]: api_external_contract_js_1.FieldAggregationType.Countd, + [api_internal_contract_js_1.FieldAggregationType.Day]: api_external_contract_js_1.FieldAggregationType.Day, + [api_internal_contract_js_1.FieldAggregationType.End]: api_external_contract_js_1.FieldAggregationType.End, + [api_internal_contract_js_1.FieldAggregationType.Hour]: api_external_contract_js_1.FieldAggregationType.Hour, + [api_internal_contract_js_1.FieldAggregationType.InOut]: api_external_contract_js_1.FieldAggregationType.InOut, + [api_internal_contract_js_1.FieldAggregationType.Kurtosis]: api_external_contract_js_1.FieldAggregationType.Kurtosis, + [api_internal_contract_js_1.FieldAggregationType.Max]: api_external_contract_js_1.FieldAggregationType.Max, + [api_internal_contract_js_1.FieldAggregationType.Mdy]: api_external_contract_js_1.FieldAggregationType.Mdy, + [api_internal_contract_js_1.FieldAggregationType.Median]: api_external_contract_js_1.FieldAggregationType.Median, + [api_internal_contract_js_1.FieldAggregationType.Min]: api_external_contract_js_1.FieldAggregationType.Min, + [api_internal_contract_js_1.FieldAggregationType.Minute]: api_external_contract_js_1.FieldAggregationType.Minute, + [api_internal_contract_js_1.FieldAggregationType.MonthYear]: api_external_contract_js_1.FieldAggregationType.MonthYear, + [api_internal_contract_js_1.FieldAggregationType.None]: api_external_contract_js_1.FieldAggregationType.None, + [api_internal_contract_js_1.FieldAggregationType.Qtr]: api_external_contract_js_1.FieldAggregationType.Qtr, + [api_internal_contract_js_1.FieldAggregationType.Quart1]: api_external_contract_js_1.FieldAggregationType.Quart1, + [api_internal_contract_js_1.FieldAggregationType.Quart3]: api_external_contract_js_1.FieldAggregationType.Quart3, + [api_internal_contract_js_1.FieldAggregationType.Second]: api_external_contract_js_1.FieldAggregationType.Second, + [api_internal_contract_js_1.FieldAggregationType.Skewness]: api_external_contract_js_1.FieldAggregationType.Skewness, + [api_internal_contract_js_1.FieldAggregationType.Stdev]: api_external_contract_js_1.FieldAggregationType.Stdev, + [api_internal_contract_js_1.FieldAggregationType.Stdevp]: api_external_contract_js_1.FieldAggregationType.Stdevp, + [api_internal_contract_js_1.FieldAggregationType.Sum]: api_external_contract_js_1.FieldAggregationType.Sum, + [api_internal_contract_js_1.FieldAggregationType.TruncDay]: api_external_contract_js_1.FieldAggregationType.TruncDay, + [api_internal_contract_js_1.FieldAggregationType.TruncHour]: api_external_contract_js_1.FieldAggregationType.TruncHour, + [api_internal_contract_js_1.FieldAggregationType.TruncMinute]: api_external_contract_js_1.FieldAggregationType.TruncMinute, + [api_internal_contract_js_1.FieldAggregationType.TruncMonth]: api_external_contract_js_1.FieldAggregationType.TruncMonth, + [api_internal_contract_js_1.FieldAggregationType.TruncQtr]: api_external_contract_js_1.FieldAggregationType.TruncQtr, + [api_internal_contract_js_1.FieldAggregationType.TruncSecond]: api_external_contract_js_1.FieldAggregationType.TruncSecond, + [api_internal_contract_js_1.FieldAggregationType.TruncWeek]: api_external_contract_js_1.FieldAggregationType.TruncWeek, + [api_internal_contract_js_1.FieldAggregationType.TruncYear]: api_external_contract_js_1.FieldAggregationType.TruncYear, + [api_internal_contract_js_1.FieldAggregationType.User]: api_external_contract_js_1.FieldAggregationType.User, + [api_internal_contract_js_1.FieldAggregationType.Var]: api_external_contract_js_1.FieldAggregationType.Var, + [api_internal_contract_js_1.FieldAggregationType.Varp]: api_external_contract_js_1.FieldAggregationType.Varp, + [api_internal_contract_js_1.FieldAggregationType.Week]: api_external_contract_js_1.FieldAggregationType.Week, + [api_internal_contract_js_1.FieldAggregationType.Weekday]: api_external_contract_js_1.FieldAggregationType.Weekday, + [api_internal_contract_js_1.FieldAggregationType.Year]: api_external_contract_js_1.FieldAggregationType.Year, +}); +InternalToExternalEnumMappings.fieldRoleType = new EnumConverter_1.EnumConverter({ + [api_internal_contract_js_1.FieldRoleType.Dimension]: api_external_contract_js_1.FieldRoleType.Dimension, + [api_internal_contract_js_1.FieldRoleType.Measure]: api_external_contract_js_1.FieldRoleType.Measure, + [api_internal_contract_js_1.FieldRoleType.Unknown]: api_external_contract_js_1.FieldRoleType.Unknown, +}); +InternalToExternalEnumMappings.sheetType = new EnumConverter_1.EnumConverter({ + [api_internal_contract_js_1.SheetType.Dashboard]: api_external_contract_js_1.SheetType.Dashboard, + [api_internal_contract_js_1.SheetType.Story]: api_external_contract_js_1.SheetType.Story, + [api_internal_contract_js_1.SheetType.Worksheet]: api_external_contract_js_1.SheetType.Worksheet, +}); +InternalToExternalEnumMappings.dashboardObjectType = new EnumConverter_1.EnumConverter({ + [api_internal_contract_js_1.DashboardObjectType.Extension]: api_external_contract_js_1.DashboardObjectType.Extension, + [api_internal_contract_js_1.DashboardObjectType.Blank]: api_external_contract_js_1.DashboardObjectType.Blank, + [api_internal_contract_js_1.DashboardObjectType.Image]: api_external_contract_js_1.DashboardObjectType.Image, + [api_internal_contract_js_1.DashboardObjectType.Legend]: api_external_contract_js_1.DashboardObjectType.Legend, + [api_internal_contract_js_1.DashboardObjectType.PageFilter]: api_external_contract_js_1.DashboardObjectType.PageFilter, + [api_internal_contract_js_1.DashboardObjectType.ParameterControl]: api_external_contract_js_1.DashboardObjectType.ParameterControl, + [api_internal_contract_js_1.DashboardObjectType.QuickFilter]: api_external_contract_js_1.DashboardObjectType.QuickFilter, + [api_internal_contract_js_1.DashboardObjectType.Text]: api_external_contract_js_1.DashboardObjectType.Text, + [api_internal_contract_js_1.DashboardObjectType.Title]: api_external_contract_js_1.DashboardObjectType.Title, + [api_internal_contract_js_1.DashboardObjectType.WebPage]: api_external_contract_js_1.DashboardObjectType.WebPage, + [api_internal_contract_js_1.DashboardObjectType.Worksheet]: api_external_contract_js_1.DashboardObjectType.Worksheet, +}); +InternalToExternalEnumMappings.dataType = new EnumConverter_1.EnumConverter({ + [api_internal_contract_js_1.DataType.Bool]: api_external_contract_js_1.DataType.Bool, + [api_internal_contract_js_1.DataType.Date]: api_external_contract_js_1.DataType.Date, + [api_internal_contract_js_1.DataType.DateTime]: api_external_contract_js_1.DataType.DateTime, + [api_internal_contract_js_1.DataType.Float]: api_external_contract_js_1.DataType.Float, + [api_internal_contract_js_1.DataType.Int]: api_external_contract_js_1.DataType.Int, + [api_internal_contract_js_1.DataType.Spatial]: api_external_contract_js_1.DataType.Spatial, + [api_internal_contract_js_1.DataType.String]: api_external_contract_js_1.DataType.String, +}); +InternalToExternalEnumMappings.filterUpdateType = new EnumConverter_1.EnumConverter({ + [api_internal_contract_js_1.FilterUpdateType.Add]: api_external_contract_js_1.FilterUpdateType.Add, + [api_internal_contract_js_1.FilterUpdateType.All]: api_external_contract_js_1.FilterUpdateType.All, + [api_internal_contract_js_1.FilterUpdateType.Remove]: api_external_contract_js_1.FilterUpdateType.Remove, + [api_internal_contract_js_1.FilterUpdateType.Replace]: api_external_contract_js_1.FilterUpdateType.Replace, +}); +InternalToExternalEnumMappings.allowableValues = new EnumConverter_1.EnumConverter({ + [api_internal_contract_js_1.DomainRestrictionType.All]: api_external_contract_js_1.ParameterValueType.All, + [api_internal_contract_js_1.DomainRestrictionType.List]: api_external_contract_js_1.ParameterValueType.List, + [api_internal_contract_js_1.DomainRestrictionType.Range]: api_external_contract_js_1.ParameterValueType.Range, +}); +InternalToExternalEnumMappings.dateStepPeriod = new EnumConverter_1.EnumConverter({ + [api_internal_contract_js_1.DateStepPeriod.Years]: api_external_contract_js_1.PeriodType.Years, + [api_internal_contract_js_1.DateStepPeriod.Quarters]: api_external_contract_js_1.PeriodType.Quarters, + [api_internal_contract_js_1.DateStepPeriod.Months]: api_external_contract_js_1.PeriodType.Months, + [api_internal_contract_js_1.DateStepPeriod.Weeks]: api_external_contract_js_1.PeriodType.Weeks, + [api_internal_contract_js_1.DateStepPeriod.Days]: api_external_contract_js_1.PeriodType.Days, + [api_internal_contract_js_1.DateStepPeriod.Hours]: api_external_contract_js_1.PeriodType.Hours, + [api_internal_contract_js_1.DateStepPeriod.Minutes]: api_external_contract_js_1.PeriodType.Minutes, + [api_internal_contract_js_1.DateStepPeriod.Seconds]: api_external_contract_js_1.PeriodType.Seconds, +}); +InternalToExternalEnumMappings.dateRangeType = new EnumConverter_1.EnumConverter({ + [api_internal_contract_js_1.DateRangeType.Current]: api_external_contract_js_1.DateRangeType.Current, + [api_internal_contract_js_1.DateRangeType.Last]: api_external_contract_js_1.DateRangeType.Last, + [api_internal_contract_js_1.DateRangeType.LastN]: api_external_contract_js_1.DateRangeType.LastN, + [api_internal_contract_js_1.DateRangeType.Next]: api_external_contract_js_1.DateRangeType.Next, + [api_internal_contract_js_1.DateRangeType.NextN]: api_external_contract_js_1.DateRangeType.NextN, + [api_internal_contract_js_1.DateRangeType.ToDate]: api_external_contract_js_1.DateRangeType.ToDate, +}); +InternalToExternalEnumMappings.errorCode = new EnumConverter_1.EnumConverter({ + [api_internal_contract_js_1.ErrorCodes.INITIALIZATION_ERROR]: api_external_contract_js_1.ErrorCodes.InternalError, + [api_internal_contract_js_1.ErrorCodes.INTERNAL_ERROR]: api_external_contract_js_1.ErrorCodes.InternalError, + [api_internal_contract_js_1.ErrorCodes.MISSING_ENUM_MAPPING]: api_external_contract_js_1.ErrorCodes.InternalError, + [api_internal_contract_js_1.ErrorCodes.MISSING_PARAMETER]: api_external_contract_js_1.ErrorCodes.InternalError, + [api_internal_contract_js_1.ErrorCodes.PERMISSION_DENIED]: api_external_contract_js_1.ErrorCodes.InternalError, + [api_internal_contract_js_1.ErrorCodes.PRES_MODEL_PARSING_ERROR]: api_external_contract_js_1.ErrorCodes.InternalError, + [api_internal_contract_js_1.ErrorCodes.UNKNOWN_VERB_ID]: api_external_contract_js_1.ErrorCodes.InternalError, + [api_internal_contract_js_1.ErrorCodes.VERSION_NOT_CONFIGURED]: api_external_contract_js_1.ErrorCodes.APINotInitialized, + [api_internal_contract_js_1.ErrorCodes.VISIBILITY_ERROR]: api_external_contract_js_1.ErrorCodes.VisibilityError, +}, api_external_contract_js_1.ErrorCodes.InternalError); +InternalToExternalEnumMappings.filterType = new EnumConverter_1.EnumConverter({ + [api_internal_contract_js_1.FilterType.Categorical]: api_external_contract_js_1.FilterType.Categorical, + [api_internal_contract_js_1.FilterType.Range]: api_external_contract_js_1.FilterType.Range, + [api_internal_contract_js_1.FilterType.RelativeDate]: api_external_contract_js_1.FilterType.RelativeDate, + [api_internal_contract_js_1.FilterType.Hierarchical]: api_external_contract_js_1.FilterType.Hierarchical, +}); +InternalToExternalEnumMappings.classNameKey = new EnumConverter_1.EnumConverter({ + ["tableau-dashboard-title" /* DashboardTitle */]: api_external_contract_js_1.ClassNameKey.DashboardTitle, + ["tableau-story-title" /* StoryTitle */]: api_external_contract_js_1.ClassNameKey.StoryTitle, + ["tableau-tooltip" /* Tooltip */]: api_external_contract_js_1.ClassNameKey.Tooltip, + ["tableau-worksheet" /* Worksheet */]: api_external_contract_js_1.ClassNameKey.Worksheet, + ["tableau-worksheet-title" /* WorksheetTitle */]: api_external_contract_js_1.ClassNameKey.WorksheetTitle, + ["tableau-pane" /* Pane */]: api_external_contract_js_1.ClassNameKey.Pane, + ["tableau-row-dividers" /* RowDividers */]: api_external_contract_js_1.ClassNameKey.RowDividers, + ["tableau-column-dividers" /* ColumnDividers */]: api_external_contract_js_1.ClassNameKey.ColumnDividers, + // Temporary until we fix 1317266 - Platform hasn't been updated currently because near branch is closed + ['dashboard-title']: api_external_contract_js_1.ClassNameKey.DashboardTitle, + ['story-title']: api_external_contract_js_1.ClassNameKey.StoryTitle, + ['tooltip']: api_external_contract_js_1.ClassNameKey.Tooltip, + ['worksheet']: api_external_contract_js_1.ClassNameKey.Worksheet, + ['worksheet-title']: api_external_contract_js_1.ClassNameKey.WorksheetTitle, + ['pane']: api_external_contract_js_1.ClassNameKey.Pane, + ['row-dividers']: api_external_contract_js_1.ClassNameKey.RowDividers, + ['column-dividers']: api_external_contract_js_1.ClassNameKey.ColumnDividers, +}); +InternalToExternalEnumMappings.hierarchicalLevelSelectionState = new EnumConverter_1.EnumConverter({ + [api_internal_contract_js_1.HierarchicalLevelSelectionState.AllSelected]: api_external_contract_js_1.HierarchicalLevelSelectionState.AllSelected, + [api_internal_contract_js_1.HierarchicalLevelSelectionState.NoneSelected]: api_external_contract_js_1.HierarchicalLevelSelectionState.NoneSelected, + [api_internal_contract_js_1.HierarchicalLevelSelectionState.SomeSelected]: api_external_contract_js_1.HierarchicalLevelSelectionState.SomeSelected, + [api_internal_contract_js_1.HierarchicalLevelSelectionState.UnknownSelected]: api_external_contract_js_1.HierarchicalLevelSelectionState.UnknownSelected, +}); +InternalToExternalEnumMappings.annotationType = new EnumConverter_1.EnumConverter({ + [api_internal_contract_js_1.AnnotateEnum.Area]: api_external_contract_js_1.AnnotationType.Area, + [api_internal_contract_js_1.AnnotateEnum.Mark]: api_external_contract_js_1.AnnotationType.Mark, + [api_internal_contract_js_1.AnnotateEnum.Point]: api_external_contract_js_1.AnnotationType.Point, +}); +InternalToExternalEnumMappings.markType = new EnumConverter_1.EnumConverter({ + [api_internal_contract_js_1.MarkType.Area]: api_external_contract_js_1.MarkType.Area, + [api_internal_contract_js_1.MarkType.Bar]: api_external_contract_js_1.MarkType.Bar, + [api_internal_contract_js_1.MarkType.Circle]: api_external_contract_js_1.MarkType.Circle, + [api_internal_contract_js_1.MarkType.GanttBar]: api_external_contract_js_1.MarkType.GanttBar, + [api_internal_contract_js_1.MarkType.Heatmap]: api_external_contract_js_1.MarkType.Heatmap, + [api_internal_contract_js_1.MarkType.Line]: api_external_contract_js_1.MarkType.Line, + [api_internal_contract_js_1.MarkType.Map]: api_external_contract_js_1.MarkType.Map, + [api_internal_contract_js_1.MarkType.Pie]: api_external_contract_js_1.MarkType.Pie, + [api_internal_contract_js_1.MarkType.Polygon]: api_external_contract_js_1.MarkType.Polygon, + [api_internal_contract_js_1.MarkType.Shape]: api_external_contract_js_1.MarkType.Shape, + [api_internal_contract_js_1.MarkType.Square]: api_external_contract_js_1.MarkType.Square, + [api_internal_contract_js_1.MarkType.Text]: api_external_contract_js_1.MarkType.Text, + [api_internal_contract_js_1.MarkType.VizExtension]: api_external_contract_js_1.MarkType.VizExtension, +}); /* tslint:enable:typedef */ @@ -12450,33 +6559,32 @@ exports.InternalToExternalEnumMappings = InternalToExternalEnumMappings; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -var TableauError_1 = __webpack_require__(/*! ./TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const TableauError_1 = __webpack_require__(/*! ./TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); /** * Class designed to register and unregister handlers from a user. Only those events * which are added via AddNewEventType will be supported by this instance */ -var EventListenerManager = /** @class */ (function () { - function EventListenerManager() { +class EventListenerManager { + constructor() { this._eventListenerManagers = {}; } - EventListenerManager.prototype.addEventListener = function (eventType, handler) { + addEventListener(eventType, handler) { if (!this._eventListenerManagers.hasOwnProperty(eventType)) { - throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.UnsupportedEventName, "Cannot add event, unsupported event type: " + eventType); + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.UnsupportedEventName, `Cannot add event, unsupported event type: ${eventType}`); } return this._eventListenerManagers[eventType].addEventListener(handler); - }; - EventListenerManager.prototype.removeEventListener = function (eventType, handler) { + } + removeEventListener(eventType, handler) { if (!this._eventListenerManagers.hasOwnProperty(eventType)) { - throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.UnsupportedEventName, "Cannot remove event, unsupported event type: " + eventType); + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.UnsupportedEventName, `Cannot remove event, unsupported event type: ${eventType}`); } return this._eventListenerManagers[eventType].removeEventListener(handler); - }; - EventListenerManager.prototype.addNewEventType = function (eventManager) { + } + addNewEventType(eventManager) { this._eventListenerManagers[eventManager.eventType] = eventManager; - }; - return EventListenerManager; -}()); + } +} exports.EventListenerManager = EventListenerManager; @@ -12491,110 +6599,53 @@ exports.EventListenerManager = EventListenerManager; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -var Field = /** @class */ (function () { - function Field(_fieldImpl) { +class Field { + constructor(_fieldImpl) { this._fieldImpl = _fieldImpl; } - Object.defineProperty(Field.prototype, "name", { - get: function () { - return this._fieldImpl.name; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Field.prototype, "id", { - get: function () { - return this._fieldImpl.id; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Field.prototype, "description", { - get: function () { - return this._fieldImpl.description; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Field.prototype, "dataType", { - get: function () { - return this._fieldImpl.dataType; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Field.prototype, "aggregation", { - get: function () { - return this._fieldImpl.aggregation; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Field.prototype, "dataSource", { - get: function () { - return this._fieldImpl.dataSource; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Field.prototype, "role", { - get: function () { - return this._fieldImpl.role; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Field.prototype, "columnType", { - get: function () { - return this._fieldImpl.columnType; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Field.prototype, "isCalculatedField", { - get: function () { - return this._fieldImpl.isCalculatedField; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Field.prototype, "isCombinedField", { - get: function () { - return this._fieldImpl.isCombinedField; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Field.prototype, "isGenerated", { - get: function () { - return this._fieldImpl.isGenerated; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Field.prototype, "isGeospatial", { - get: function () { - return this._fieldImpl.isGeospatial; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Field.prototype, "isHidden", { - get: function () { - return this._fieldImpl.isHidden; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Field.prototype, "isPresentOnPublishedDatasource", { - get: function () { - return this._fieldImpl.isPresentOnPublishedDatasource; - }, - enumerable: true, - configurable: true - }); - return Field; -}()); + get name() { + return this._fieldImpl.name; + } + get id() { + return this._fieldImpl.id; + } + get description() { + return this._fieldImpl.description; + } + get dataType() { + return this._fieldImpl.dataType; + } + get aggregation() { + return this._fieldImpl.aggregation; + } + get dataSource() { + return this._fieldImpl.dataSource; + } + get role() { + return this._fieldImpl.role; + } + get columnType() { + return this._fieldImpl.columnType; + } + get isCalculatedField() { + return this._fieldImpl.isCalculatedField; + } + get isCombinedField() { + return this._fieldImpl.isCombinedField; + } + get isGenerated() { + return this._fieldImpl.isGenerated; + } + get isGeospatial() { + return this._fieldImpl.isGeospatial; + } + get isHidden() { + return this._fieldImpl.isHidden; + } + get isPresentOnPublishedDatasource() { + return this._fieldImpl.isPresentOnPublishedDatasource; + } +} exports.Field = Field; @@ -12609,9 +6660,9 @@ exports.Field = Field; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -var ApiShared_1 = __webpack_require__(/*! ../../ApiShared */ "../api-shared-js/lib/src/ApiShared.js"); -var CustomViewImpl = /** @class */ (function () { - function CustomViewImpl(customViewModel, _registryId) { +const ApiShared_1 = __webpack_require__(/*! ../../ApiShared */ "../api-shared-js/lib/src/ApiShared.js"); +class CustomViewImpl { + constructor(customViewModel, _registryId) { this._registryId = _registryId; this._luid = customViewModel.luid; this._name = customViewModel.name; @@ -12620,63 +6671,38 @@ var CustomViewImpl = /** @class */ (function () { this._ownerName = customViewModel.owner.userFriendlyName; this._url = customViewModel.url; } - Object.defineProperty(CustomViewImpl.prototype, "luid", { - get: function () { - return this._luid; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(CustomViewImpl.prototype, "name", { - get: function () { - return this._name; - }, - set: function (name) { - this._name = name; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(CustomViewImpl.prototype, "shared", { - get: function () { - return this._shared; - }, - set: function (shared) { - this._shared = shared; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(CustomViewImpl.prototype, "isDefault", { - get: function () { - return this._isDefault; - }, - set: function (isDefault) { - this._isDefault = isDefault; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(CustomViewImpl.prototype, "ownerName", { - get: function () { - return this._ownerName; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(CustomViewImpl.prototype, "url", { - get: function () { - return this._url; - }, - enumerable: true, - configurable: true - }); - CustomViewImpl.prototype.saveAsync = function () { - var service = ApiShared_1.ApiServiceRegistry.get(this._registryId).getService("viz-service" /* Viz */); + get luid() { + return this._luid; + } + get name() { + return this._name; + } + set name(name) { + this._name = name; + } + get shared() { + return this._shared; + } + set shared(shared) { + this._shared = shared; + } + get isDefault() { + return this._isDefault; + } + set isDefault(isDefault) { + this._isDefault = isDefault; + } + get ownerName() { + return this._ownerName; + } + get url() { + return this._url; + } + saveAsync() { + const service = ApiShared_1.ApiServiceRegistry.get(this._registryId).getService("viz-service" /* Viz */); return service.saveAsync(this); - }; - return CustomViewImpl; -}()); + } +} exports.CustomViewImpl = CustomViewImpl; @@ -12686,97 +6712,60 @@ exports.CustomViewImpl = CustomViewImpl; /*!****************************************************************!*\ !*** ../api-shared-js/lib/src/ApiShared/Impl/DashboardImpl.js ***! \****************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; -var __extends = (this && this.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); Object.defineProperty(exports, "__esModule", ({ value: true })); -var Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -var InternalToExternalEnumMappings_1 = __webpack_require__(/*! ../EnumMappings/InternalToExternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js"); -var Point_1 = __webpack_require__(/*! ../Point */ "../api-shared-js/lib/src/ApiShared/Point.js"); -var ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); -var TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); -var ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); -var DashboardObjectImpl_1 = __webpack_require__(/*! ./DashboardObjectImpl */ "../api-shared-js/lib/src/ApiShared/Impl/DashboardObjectImpl.js"); -var SheetImpl_1 = __webpack_require__(/*! ./SheetImpl */ "../api-shared-js/lib/src/ApiShared/Impl/SheetImpl.js"); -var SheetInfoImpl_1 = __webpack_require__(/*! ./SheetInfoImpl */ "../api-shared-js/lib/src/ApiShared/Impl/SheetInfoImpl.js"); -var WorksheetImpl_1 = __webpack_require__(/*! ./WorksheetImpl */ "../api-shared-js/lib/src/ApiShared/Impl/WorksheetImpl.js"); -var DashboardImpl = /** @class */ (function (_super) { - __extends(DashboardImpl, _super); - function DashboardImpl(_sheetInfo, _zones, _sheetPath, _registryId, _parentStoryPointImpl, _activeDashboardObjectId) { - if (_activeDashboardObjectId === void 0) { _activeDashboardObjectId = 0; } - var _this = _super.call(this, _sheetInfo, _registryId) || this; - _this._zones = _zones; - _this._sheetPath = _sheetPath; - _this._parentStoryPointImpl = _parentStoryPointImpl; - _this._activeDashboardObjectId = _activeDashboardObjectId; - return _this; - } - Object.defineProperty(DashboardImpl.prototype, "worksheetsImpl", { - get: function () { - return this._worksheetsImpl; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DashboardImpl.prototype, "objects", { - get: function () { - return this._objects; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DashboardImpl.prototype, "parentStoryPoint", { - get: function () { - return this._parentStoryPointImpl; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DashboardImpl.prototype, "activeDashboardObjectId", { - get: function () { - return this._activeDashboardObjectId; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DashboardImpl.prototype, "activeDashboardName", { - get: function () { - return this._sheetPath.sheetName; - }, - enumerable: true, - configurable: true - }); - DashboardImpl.prototype.initializeWithPublicInterfaces = function () { +const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const InternalToExternalEnumMappings_1 = __webpack_require__(/*! ../EnumMappings/InternalToExternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js"); +const Point_1 = __webpack_require__(/*! ../Point */ "../api-shared-js/lib/src/ApiShared/Point.js"); +const ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); +const TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +const ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +const DashboardObjectImpl_1 = __webpack_require__(/*! ./DashboardObjectImpl */ "../api-shared-js/lib/src/ApiShared/Impl/DashboardObjectImpl.js"); +const SheetImpl_1 = __webpack_require__(/*! ./SheetImpl */ "../api-shared-js/lib/src/ApiShared/Impl/SheetImpl.js"); +const SheetInfoImpl_1 = __webpack_require__(/*! ./SheetInfoImpl */ "../api-shared-js/lib/src/ApiShared/Impl/SheetInfoImpl.js"); +const WorksheetImpl_1 = __webpack_require__(/*! ./WorksheetImpl */ "../api-shared-js/lib/src/ApiShared/Impl/WorksheetImpl.js"); +class DashboardImpl extends SheetImpl_1.SheetImpl { + constructor(_sheetInfo, _zones, _sheetPath, _registryId, _parentStoryPointImpl, _activeDashboardObjectId = 0) { + super(_sheetInfo, _registryId); + this._zones = _zones; + this._sheetPath = _sheetPath; + this._parentStoryPointImpl = _parentStoryPointImpl; + this._activeDashboardObjectId = _activeDashboardObjectId; + } + get worksheetsImpl() { + return this._worksheetsImpl; + } + get objects() { + return this._objects; + } + get parentStoryPoint() { + return this._parentStoryPointImpl; + } + get activeDashboardObjectId() { + return this._activeDashboardObjectId; + } + get activeDashboardName() { + return this._sheetPath.sheetName; + } + initializeWithPublicInterfaces() { this._worksheetsImpl = new Array(); this._objects = new Array(); this.zoneMap = new Map(); // Process all the zones which are contained in this dashboard - for (var _i = 0, _a = this._zones; _i < _a.length; _i++) { - var zone = _a[_i]; - var worksheetImpl = undefined; - var zoneSize = { width: zone.width, height: zone.height }; + for (const zone of this._zones) { + let worksheetImpl = undefined; + const zoneSize = { width: zone.width, height: zone.height }; // As the dashboard is active, all other zones in the dashboard are inactive. - var isActive = false; + const isActive = false; if (zone.zoneType === api_internal_contract_js_1.DashboardObjectType.Worksheet || zone.zoneType === api_internal_contract_js_1.DashboardObjectType.QuickFilter) { - var worksheetName = ''; - var worksheetUrl = ''; - var isHidden = false; + let worksheetName = ''; + let worksheetUrl = ''; + let isHidden = false; if (zone.sheetInfo) { // zone.sheetInfo was not initialized prior to internal-contract 1.6.0 worksheetName = zone.sheetInfo.name; @@ -12790,8 +6779,8 @@ var DashboardImpl = /** @class */ (function (_super) { } // Indexes, isActive and some more properties in sheetInfoImpl are embedding specific. // But we init them for both extensions and embedding as the Models will only use what is relevant. - var sheetInfoImpl = new SheetInfoImpl_1.SheetInfoImpl(worksheetName, api_external_contract_js_1.SheetType.Worksheet, zoneSize, this._worksheetsImpl.length, isActive, isHidden, worksheetUrl); - var vizId = { + const sheetInfoImpl = new SheetInfoImpl_1.SheetInfoImpl(worksheetName, api_external_contract_js_1.SheetType.Worksheet, zoneSize, this._worksheetsImpl.length, isActive, isHidden, worksheetUrl); + const vizId = { worksheet: worksheetName, dashboard: this._sheetInfoImpl.name, storyboard: this._sheetPath.storyboard, @@ -12803,30 +6792,27 @@ var DashboardImpl = /** @class */ (function (_super) { this._worksheetsImpl.push(worksheetImpl); } } - var zonePoint = new Point_1.Point(zone.x, zone.y); - var dashboardObjectImpl = new DashboardObjectImpl_1.DashboardObjectImpl(this, InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.dashboardObjectType.convert(zone.zoneType), zonePoint, zoneSize, worksheetImpl, zone.name, zone.isFloating !== undefined ? zone.isFloating : false, // before 1.6.0 we didn't have isFloating, so we assume false + const zonePoint = new Point_1.Point(zone.x, zone.y); + const dashboardObjectImpl = new DashboardObjectImpl_1.DashboardObjectImpl(this, InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.dashboardObjectType.convert(zone.zoneType), zonePoint, zoneSize, worksheetImpl, zone.name, zone.isFloating !== undefined ? zone.isFloating : false, // before 1.6.0 we didn't have isFloating, so we assume false zone.isVisible !== undefined ? zone.isVisible : true, // before 1.6.0 we didn't have isVisible, so we assume true zone.zoneId, zone.fieldId); this._objects.push(dashboardObjectImpl); this.zoneMap.set(zone.zoneId, dashboardObjectImpl); } - }; - DashboardImpl.prototype.setDashboardObjectVisibilityAsync = function (dashboardObjectVisibilityMap) { - var zoneService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("zone-service" /* Zone */); + } + setDashboardObjectVisibilityAsync(dashboardObjectVisibilityMap) { + const zoneService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("zone-service" /* Zone */); return zoneService.setVisibilityAsync(/*Dashboard Name*/ this.name, this.zoneMap, dashboardObjectVisibilityMap); - }; - DashboardImpl.prototype.getDashboardObjectById = function (dashboardObjectId) { + } + getDashboardObjectById(dashboardObjectId) { return this.zoneMap.get(dashboardObjectId); - }; - DashboardImpl.prototype.updateZones = function (newZones, newActiveZoneId, newActiveDashboardName) { - var _this = this; - if (newActiveZoneId === void 0) { newActiveZoneId = 0; } - if (newActiveDashboardName === void 0) { newActiveDashboardName = ''; } + } + updateZones(newZones, newActiveZoneId = 0, newActiveDashboardName = '') { // getting previous dashboard objects, active zone ID and active dashboard name - var oldDashboardObjects = this._objects; - var oldZoneMap = this.zoneMap; - var oldActiveZoneId = this._activeDashboardObjectId; - var oldActiveDashboardName = this._sheetPath.sheetName; + const oldDashboardObjects = this._objects; + const oldZoneMap = this.zoneMap; + const oldActiveZoneId = this._activeDashboardObjectId; + const oldActiveDashboardName = this._sheetPath.sheetName; // updating zones and reinitializing instance variables this._zones = newZones; this._activeDashboardObjectId = newActiveZoneId; @@ -12836,39 +6822,39 @@ var DashboardImpl = /** @class */ (function (_super) { } this.initializeWithPublicInterfaces(); // getting new dashboard objects - var newDashboardObjects = this._objects; - var newZoneMap = this.zoneMap; + const newDashboardObjects = this._objects; + const newZoneMap = this.zoneMap; // initializing map for changes - var zoneChanges = new Map(); + const zoneChanges = new Map(); // comparing old dashboard objects with new ones - oldDashboardObjects.forEach(function (oldObject) { - var oldId = oldObject.id; + oldDashboardObjects.forEach((oldObject) => { + const oldId = oldObject.id; // checking if zone was removed if (!newZoneMap.has(oldId)) { - _this.addChange(oldId, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.Removed); + this.addChange(oldId, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.Removed); return; } - var newObject = newZoneMap.get(oldId); + const newObject = newZoneMap.get(oldId); if (oldObject.isFloating !== newObject.isFloating) { - _this.addChange(oldId, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.IsFloatingChanged); + this.addChange(oldId, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.IsFloatingChanged); } if (oldObject.isVisible !== newObject.isVisible) { - _this.addChange(oldId, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.IsVisibleChanged); + this.addChange(oldId, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.IsVisibleChanged); } if (oldObject.name !== newObject.name) { - _this.addChange(oldId, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.NameChanged); + this.addChange(oldId, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.NameChanged); } if (oldObject.position.x !== newObject.position.x || oldObject.position.y !== newObject.position.y) { - _this.addChange(oldId, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.PositionChanged); + this.addChange(oldId, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.PositionChanged); } if (oldObject.size.width !== newObject.size.width || oldObject.size.height !== newObject.size.height) { - _this.addChange(oldId, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.SizeChanged); + this.addChange(oldId, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.SizeChanged); } }); // Checking for any added zones - newDashboardObjects.forEach(function (newObject) { + newDashboardObjects.forEach((newObject) => { if (!oldZoneMap.has(newObject.id)) { - _this.addChange(newObject.id, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.Added); + this.addChange(newObject.id, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.Added); } }); // Checking if zone selection has changed @@ -12885,60 +6871,58 @@ var DashboardImpl = /** @class */ (function (_super) { this.addChange(0, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.DashboardChanged); } return zoneChanges; - }; - DashboardImpl.prototype.addChange = function (zoneId, zoneChanges, change) { + } + addChange(zoneId, zoneChanges, change) { if (!zoneChanges.has(zoneId)) { zoneChanges.set(zoneId, []); } zoneChanges.get(zoneId).push(change); - }; - DashboardImpl.prototype.moveAndResizeDashboardObjectsAsync = function (dashboardObjectPositionAndSizeUpdateArray) { - var zoneService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("zone-service" /* Zone */); + } + moveAndResizeDashboardObjectsAsync(dashboardObjectPositionAndSizeUpdateArray) { + const zoneService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("zone-service" /* Zone */); return zoneService.moveAndResizeAsync(/*Dashboard Name*/ this.name, this.zoneMap, dashboardObjectPositionAndSizeUpdateArray); - }; - DashboardImpl.prototype.replayAnimationAsync = function (replaySpeed) { - var animationService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("animation-service" /* Animation */); + } + replayAnimationAsync(replaySpeed) { + const animationService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("animation-service" /* Animation */); return animationService.replayAsync(replaySpeed); - }; - DashboardImpl.prototype.getFiltersAsync = function () { + } + getFiltersAsync() { this.verifyActiveSheetOrEmbeddedInActiveStoryPoint(); - var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); return service.getDashboardFiltersAsync(); - }; - DashboardImpl.prototype.applyFilterAsync = function (fieldName, values, updateType, options) { + } + applyFilterAsync(fieldName, values, updateType, options) { ErrorHelpers_1.ErrorHelpers.verifyEnumValue(updateType, Contract.FilterUpdateType, 'FilterUpdateType'); ErrorHelpers_1.ErrorHelpers.verifyStringParameter(fieldName, 'fieldName'); if (!Array.isArray(values)) { throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, 'values parameter for applyDashboardFilterAsync must be an array'); } this.verifyActiveSheetOrEmbeddedInActiveStoryPoint(); - var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); return service.applyDashboardFilterAsync(fieldName, values, updateType, options); - }; + } // @W-12986439: remove once initializeWithPublicInterfaces is moved to the constructor for this class // This method only exists since worksheetsImpl can be undefined, but we need the worksheet names in the Export APIs - DashboardImpl.prototype.getWorksheetNamesFromZones = function () { - var worksheetNames = []; - for (var _i = 0, _a = this._zones; _i < _a.length; _i++) { - var zone = _a[_i]; + getWorksheetNamesFromZones() { + const worksheetNames = []; + for (const zone of this._zones) { if (zone.zoneType !== api_internal_contract_js_1.DashboardObjectType.Worksheet) { continue; } // zone.sheetInfo was not initialized prior to internal-contract 1.6.0 - var worksheetName = zone.sheetInfo ? zone.sheetInfo.name : zone.name; + const worksheetName = zone.sheetInfo ? zone.sheetInfo.name : zone.name; worksheetNames.push(worksheetName); } return worksheetNames; - }; - DashboardImpl.prototype.verifyActiveSheetOrEmbeddedInActiveStoryPoint = function () { - var isRootAndActiveDashboard = this.active; - var isWithinActiveStoryPoint = this.parentStoryPoint != null && this.parentStoryPoint.active; + } + verifyActiveSheetOrEmbeddedInActiveStoryPoint() { + const isRootAndActiveDashboard = this.active; + const isWithinActiveStoryPoint = this.parentStoryPoint != null && this.parentStoryPoint.active; if (!isRootAndActiveDashboard && !isWithinActiveStoryPoint) { throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.NotActiveSheet, 'Operation not allowed on non-active sheet'); } - }; - return DashboardImpl; -}(SheetImpl_1.SheetImpl)); + } +} exports.DashboardImpl = DashboardImpl; @@ -12957,8 +6941,8 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); * Implementation of the dashboard objects - the zones in a dashboard. * This does not follow the Impl pattern as it is just a property bag. */ -var DashboardObjectImpl = /** @class */ (function () { - function DashboardObjectImpl(_dashboardImpl, _type, _position, _size, _worksheetImpl, _name, _isFloating, _isVisible, _id, _fieldId) { +class DashboardObjectImpl { + constructor(_dashboardImpl, _type, _position, _size, _worksheetImpl, _name, _isFloating, _isVisible, _id, _fieldId) { this._dashboardImpl = _dashboardImpl; this._type = _type; this._position = _position; @@ -12970,78 +6954,37 @@ var DashboardObjectImpl = /** @class */ (function () { this._id = _id; this._fieldId = _fieldId; } - Object.defineProperty(DashboardObjectImpl.prototype, "dashboardImpl", { - get: function () { - return this._dashboardImpl; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DashboardObjectImpl.prototype, "type", { - get: function () { - return this._type; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DashboardObjectImpl.prototype, "position", { - get: function () { - return this._position; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DashboardObjectImpl.prototype, "size", { - get: function () { - return this._size; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DashboardObjectImpl.prototype, "worksheetImpl", { - get: function () { - return this._worksheetImpl; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DashboardObjectImpl.prototype, "name", { - get: function () { - return this._name; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DashboardObjectImpl.prototype, "isFloating", { - get: function () { - return this._isFloating; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DashboardObjectImpl.prototype, "isVisible", { - get: function () { - return this._isVisible; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DashboardObjectImpl.prototype, "id", { - get: function () { - return this._id; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DashboardObjectImpl.prototype, "fieldId", { - get: function () { - return this._fieldId; - }, - enumerable: true, - configurable: true - }); - return DashboardObjectImpl; -}()); + get dashboardImpl() { + return this._dashboardImpl; + } + get type() { + return this._type; + } + get position() { + return this._position; + } + get size() { + return this._size; + } + get worksheetImpl() { + return this._worksheetImpl; + } + get name() { + return this._name; + } + get isFloating() { + return this._isFloating; + } + get isVisible() { + return this._isVisible; + } + get id() { + return this._id; + } + get fieldId() { + return this._fieldId; + } +} exports.DashboardObjectImpl = DashboardObjectImpl; @@ -13056,120 +6999,94 @@ exports.DashboardObjectImpl = DashboardObjectImpl; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -var ConnectionSummary_1 = __webpack_require__(/*! ../ConnectionSummary */ "../api-shared-js/lib/src/ApiShared/ConnectionSummary.js"); -var Field_1 = __webpack_require__(/*! ../Field */ "../api-shared-js/lib/src/ApiShared/Field.js"); -var LogicalTable_1 = __webpack_require__(/*! ../LogicalTable */ "../api-shared-js/lib/src/ApiShared/LogicalTable.js"); -var ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); -var TableSummary_1 = __webpack_require__(/*! ../TableSummary */ "../api-shared-js/lib/src/ApiShared/TableSummary.js"); -var ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); -var FieldImpl_1 = __webpack_require__(/*! ./FieldImpl */ "../api-shared-js/lib/src/ApiShared/Impl/FieldImpl.js"); -var DataSourceImpl = /** @class */ (function () { - function DataSourceImpl(_dataSourceInfo, _registryId) { - var _this = this; +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const ConnectionSummary_1 = __webpack_require__(/*! ../ConnectionSummary */ "../api-shared-js/lib/src/ApiShared/ConnectionSummary.js"); +const Field_1 = __webpack_require__(/*! ../Field */ "../api-shared-js/lib/src/ApiShared/Field.js"); +const LogicalTable_1 = __webpack_require__(/*! ../LogicalTable */ "../api-shared-js/lib/src/ApiShared/LogicalTable.js"); +const ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); +const TableSummary_1 = __webpack_require__(/*! ../TableSummary */ "../api-shared-js/lib/src/ApiShared/TableSummary.js"); +const ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +const FieldImpl_1 = __webpack_require__(/*! ./FieldImpl */ "../api-shared-js/lib/src/ApiShared/Impl/FieldImpl.js"); +class DataSourceImpl { + constructor(_dataSourceInfo, _registryId) { this._dataSourceInfo = _dataSourceInfo; this._registryId = _registryId; - this._fields = _dataSourceInfo.fields.map(function (fieldModel) { - var fieldImpl = new FieldImpl_1.FieldImpl(fieldModel, _this); + this._fields = _dataSourceInfo.fields.map((fieldModel) => { + const fieldImpl = new FieldImpl_1.FieldImpl(fieldModel, this); return new Field_1.Field(fieldImpl); }); } - Object.defineProperty(DataSourceImpl.prototype, "name", { - get: function () { - return this._dataSourceInfo.name; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DataSourceImpl.prototype, "id", { - get: function () { - return this._dataSourceInfo.id; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DataSourceImpl.prototype, "extractUpdateTime", { - get: function () { - return this._dataSourceInfo.extractUpdateTime; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DataSourceImpl.prototype, "fields", { - get: function () { - return this._fields; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DataSourceImpl.prototype, "isExtract", { - get: function () { - return this._dataSourceInfo.isExtract; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DataSourceImpl.prototype, "isPublished", { - get: function () { - return this._dataSourceInfo.isPublished; - }, - enumerable: true, - configurable: true - }); - DataSourceImpl.prototype.publishedUrl = function () { + get name() { + return this._dataSourceInfo.name; + } + get id() { + return this._dataSourceInfo.id; + } + get extractUpdateTime() { + return this._dataSourceInfo.extractUpdateTime; + } + get fields() { + return this._fields; + } + get isExtract() { + return this._dataSourceInfo.isExtract; + } + get isPublished() { + return this._dataSourceInfo.isPublished; + } + publishedUrl() { return this._dataSourceInfo.publishedUrl; - }; - DataSourceImpl.prototype.getMaxPageRowLimit = function () { + } + getMaxPageRowLimit() { return 10000; - }; - DataSourceImpl.prototype.refreshAsync = function () { - var dataSourceService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */); + } + refreshAsync() { + const dataSourceService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */); return dataSourceService.refreshAsync(this._dataSourceInfo.id); - }; - DataSourceImpl.prototype.getConnectionSummariesAsync = function () { - var dataSourceService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */); - return dataSourceService.getConnectionSummariesAsync(this._dataSourceInfo.id).then(function (summaries) { - return summaries.map(function (summary) { return new ConnectionSummary_1.ConnectionSummary(summary); }); + } + getConnectionSummariesAsync() { + const dataSourceService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */); + return dataSourceService.getConnectionSummariesAsync(this._dataSourceInfo.id).then((summaries) => { + return summaries.map((summary) => new ConnectionSummary_1.ConnectionSummary(summary)); }); - }; - DataSourceImpl.prototype.getActiveTablesAsync = function () { - var dataSourceService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */); - return dataSourceService.getActiveTablesAsync(this._dataSourceInfo.id).then(function (tableInfos) { - return tableInfos.map(function (tableInfo) { return new TableSummary_1.TableSummary(tableInfo); }); + } + getActiveTablesAsync() { + const dataSourceService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */); + return dataSourceService.getActiveTablesAsync(this._dataSourceInfo.id).then((tableInfos) => { + return tableInfos.map((tableInfo) => new TableSummary_1.TableSummary(tableInfo)); }); - }; - DataSourceImpl.prototype.getUnderlyingDataAsync = function (options) { - var getDataService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + } + getUnderlyingDataAsync(options) { + const getDataService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); options = options || {}; return getDataService.getDataSourceDataAsync(this.id, !!options.ignoreAliases, options.maxRows || 0, // 0 and [] are defaults options.columnsToInclude || [], options.columnsToIncludeById || [], options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues); - }; - DataSourceImpl.prototype.getLogicalTableDataAsync = function (logicalTableId, options) { - var getDataService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + } + getLogicalTableDataAsync(logicalTableId, options) { + const getDataService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); options = options || {}; return getDataService.getLogicalTableDataAsync(this.id, logicalTableId, !!options.ignoreAliases, options.maxRows || 0, // 0 and [] are defaults options.columnsToInclude || [], options.columnsToIncludeById || [], options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues); - }; - DataSourceImpl.prototype.getLogicalTableDataReaderAsync = function (logicalTableId, pageRowCount, options) { - var getDataService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + } + getLogicalTableDataReaderAsync(logicalTableId, pageRowCount, options) { + const getDataService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); options = options || {}; return getDataService.getLogicalTableDataReaderAsync(this.id, logicalTableId, pageRowCount || this.getMaxPageRowLimit(), !!options.ignoreAliases, options.columnsToIncludeById || [], options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues); - }; - DataSourceImpl.prototype.initializeWithPublicInterfaces = function (dataSource) { + } + initializeWithPublicInterfaces(dataSource) { ErrorHelpers_1.ErrorHelpers.verifyInternalValue(dataSource, 'dataSource'); - this._fields = this._dataSourceInfo.fields.map(function (fieldModel) { - var fieldImpl = new FieldImpl_1.FieldImpl(fieldModel, dataSource); + this._fields = this._dataSourceInfo.fields.map((fieldModel) => { + const fieldImpl = new FieldImpl_1.FieldImpl(fieldModel, dataSource); return new Field_1.Field(fieldImpl); }); - }; - DataSourceImpl.prototype.getLogicalTablesAsync = function () { - var dataSourceService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */); - return dataSourceService.getLogicalTablesAsync(this.id).then(function (logicalTableInfos) { - return logicalTableInfos.map(function (logicalTableInfo) { return new LogicalTable_1.LogicalTable(logicalTableInfo); }); + } + getLogicalTablesAsync() { + const dataSourceService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */); + return dataSourceService.getLogicalTablesAsync(this.id).then((logicalTableInfos) => { + return logicalTableInfos.map((logicalTableInfo) => new LogicalTable_1.LogicalTable(logicalTableInfo)); }); - }; - return DataSourceImpl; -}()); + } +} exports.DataSourceImpl = DataSourceImpl; @@ -13184,118 +7101,61 @@ exports.DataSourceImpl = DataSourceImpl; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -var Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -var InternalContract = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -var InternalToExternalEnumMappings_1 = __webpack_require__(/*! ../EnumMappings/InternalToExternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js"); -var FieldImpl = /** @class */ (function () { - function FieldImpl(_fieldInfo, _parentDataSource) { +const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const InternalContract = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const InternalToExternalEnumMappings_1 = __webpack_require__(/*! ../EnumMappings/InternalToExternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js"); +class FieldImpl { + constructor(_fieldInfo, _parentDataSource) { this._fieldInfo = _fieldInfo; this._parentDataSource = _parentDataSource; } - Object.defineProperty(FieldImpl.prototype, "name", { - get: function () { - return this._fieldInfo.name; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(FieldImpl.prototype, "id", { - get: function () { - return this._fieldInfo.id; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(FieldImpl.prototype, "description", { - get: function () { - return this._fieldInfo.description; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(FieldImpl.prototype, "dataType", { - get: function () { - var _a; - return _a = this._fieldInfo.dataType, (_a !== null && _a !== void 0 ? _a : Contract.DataType.Unknown); - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(FieldImpl.prototype, "aggregation", { - get: function () { - return InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.fieldAggregationType.convert(this._fieldInfo.aggregation); - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(FieldImpl.prototype, "dataSource", { - get: function () { - if (!this._parentDataSource) - throw new Error("Data source information is not available for this field. Please use getFieldAsync method to get field's data source information"); - return this._parentDataSource; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(FieldImpl.prototype, "role", { - get: function () { - return InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.fieldRoleType.convert(this._fieldInfo.role); - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(FieldImpl.prototype, "columnType", { - get: function () { - var definedValue = this._fieldInfo.columnType || InternalContract.ColumnType.Unknown; - return InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.columnType.convert(definedValue); - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(FieldImpl.prototype, "isCalculatedField", { - get: function () { - return this._fieldInfo.isCalculatedField; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(FieldImpl.prototype, "isCombinedField", { - get: function () { - return this._fieldInfo.isCombinedField; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(FieldImpl.prototype, "isGenerated", { - get: function () { - return this._fieldInfo.isGenerated; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(FieldImpl.prototype, "isGeospatial", { - get: function () { - return this._fieldInfo.isGeospatial; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(FieldImpl.prototype, "isHidden", { - get: function () { - return this._fieldInfo.isHidden; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(FieldImpl.prototype, "isPresentOnPublishedDatasource", { - get: function () { - return this._fieldInfo.isPresentOnPublishedDatasource; - }, - enumerable: true, - configurable: true - }); - return FieldImpl; -}()); + get name() { + return this._fieldInfo.name; + } + get id() { + return this._fieldInfo.id; + } + get description() { + return this._fieldInfo.description; + } + get dataType() { + var _a; + return _a = this._fieldInfo.dataType, (_a !== null && _a !== void 0 ? _a : Contract.DataType.Unknown); + } + get aggregation() { + return InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.fieldAggregationType.convert(this._fieldInfo.aggregation); + } + get dataSource() { + if (!this._parentDataSource) + throw new Error(`Data source information is not available for this field. Please use getFieldAsync method to get field's data source information`); + return this._parentDataSource; + } + get role() { + return InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.fieldRoleType.convert(this._fieldInfo.role); + } + get columnType() { + let definedValue = this._fieldInfo.columnType || InternalContract.ColumnType.Unknown; + return InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.columnType.convert(definedValue); + } + get isCalculatedField() { + return this._fieldInfo.isCalculatedField; + } + get isCombinedField() { + return this._fieldInfo.isCombinedField; + } + get isGenerated() { + return this._fieldInfo.isGenerated; + } + get isGeospatial() { + return this._fieldInfo.isGeospatial; + } + get isHidden() { + return this._fieldInfo.isHidden; + } + get isPresentOnPublishedDatasource() { + return this._fieldInfo.isPresentOnPublishedDatasource; + } +} exports.FieldImpl = FieldImpl; @@ -13310,74 +7170,53 @@ exports.FieldImpl = FieldImpl; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -var InternalToExternalEnumMappings_1 = __webpack_require__(/*! ../EnumMappings/InternalToExternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js"); -var ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); -var DataValueFactory_1 = __webpack_require__(/*! ../Utils/DataValueFactory */ "../api-shared-js/lib/src/ApiShared/Utils/DataValueFactory.js"); -var ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); -var Param_1 = __webpack_require__(/*! ../Utils/Param */ "../api-shared-js/lib/src/ApiShared/Utils/Param.js"); -var ParameterImpl = /** @class */ (function () { - function ParameterImpl(parameterInfo, _registryId) { +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const InternalToExternalEnumMappings_1 = __webpack_require__(/*! ../EnumMappings/InternalToExternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js"); +const ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); +const DataValueFactory_1 = __webpack_require__(/*! ../Utils/DataValueFactory */ "../api-shared-js/lib/src/ApiShared/Utils/DataValueFactory.js"); +const ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +const Param_1 = __webpack_require__(/*! ../Utils/Param */ "../api-shared-js/lib/src/ApiShared/Utils/Param.js"); +class ParameterImpl { + constructor(parameterInfo, _registryId) { this._registryId = _registryId; this.setParameterInfo(parameterInfo); } - Object.defineProperty(ParameterImpl.prototype, "name", { - get: function () { - return this._parameterInfo.name; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(ParameterImpl.prototype, "currentValue", { - get: function () { - return DataValueFactory_1.DataValueFactory.MakeParameterDataValue(this._parameterInfo.currentValue, this._parameterInfo.dataType); - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(ParameterImpl.prototype, "dataType", { - get: function () { - return InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.dataType.convert(this._parameterInfo.dataType); - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(ParameterImpl.prototype, "id", { - get: function () { - return this._globalFieldName; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(ParameterImpl.prototype, "allowableValues", { - get: function () { - return this._allowableValues; - }, - enumerable: true, - configurable: true - }); - ParameterImpl.prototype.changeValueAsync = function (newValue) { - var _this = this; + get name() { + return this._parameterInfo.name; + } + get currentValue() { + return DataValueFactory_1.DataValueFactory.MakeParameterDataValue(this._parameterInfo.currentValue, this._parameterInfo.dataType); + } + get dataType() { + return InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.dataType.convert(this._parameterInfo.dataType); + } + get id() { + return this._globalFieldName; + } + get allowableValues() { + return this._allowableValues; + } + changeValueAsync(newValue) { ErrorHelpers_1.ErrorHelpers.verifyParameter(newValue, 'newValue'); - var coercedValue = Param_1.Param.serializeParameterValue(newValue); - var parametersService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("parameters-service" /* Parameters */); - return parametersService.changeParameterValueAsync(this._globalFieldName, coercedValue).then(function (parameterInfo) { - _this.setParameterInfo(parameterInfo); - return _this.currentValue; + const coercedValue = Param_1.Param.serializeParameterValue(newValue); + const parametersService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("parameters-service" /* Parameters */); + return parametersService.changeParameterValueAsync(this._globalFieldName, coercedValue).then((parameterInfo) => { + this.setParameterInfo(parameterInfo); + return this.currentValue; }); - }; - ParameterImpl.prototype.setParameterInfo = function (parameterInfo) { + } + setParameterInfo(parameterInfo) { this._parameterInfo = parameterInfo; this._globalFieldName = parameterInfo.fieldName; - var type = InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.allowableValues.convert(parameterInfo.allowableValuesType); - var listValues; - var minValue; - var maxValue; - var stepSize; - var dateStepPeriod; + const type = InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.allowableValues.convert(parameterInfo.allowableValuesType); + let listValues; + let minValue; + let maxValue; + let stepSize; + let dateStepPeriod; if (type === api_external_contract_js_1.ParameterValueType.List) { - var values = parameterInfo.allowableValues || []; - listValues = values.map(function (val) { return DataValueFactory_1.DataValueFactory.MakeParameterDataValue(val, parameterInfo.dataType); }); + const values = parameterInfo.allowableValues || []; + listValues = values.map((val) => DataValueFactory_1.DataValueFactory.MakeParameterDataValue(val, parameterInfo.dataType)); } else if (type === api_external_contract_js_1.ParameterValueType.Range) { minValue = parameterInfo.minValue && DataValueFactory_1.DataValueFactory.MakeParameterDataValue(parameterInfo.minValue, parameterInfo.dataType); @@ -13393,9 +7232,8 @@ var ParameterImpl = /** @class */ (function () { stepSize: stepSize, dateStepPeriod: dateStepPeriod, }; - }; - return ParameterImpl; -}()); + } +} exports.ParameterImpl = ParameterImpl; @@ -13410,113 +7248,80 @@ exports.ParameterImpl = ParameterImpl; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -var Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -var ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); -var TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); -var ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); -var Param_1 = __webpack_require__(/*! ../Utils/Param */ "../api-shared-js/lib/src/ApiShared/Utils/Param.js"); -var SheetUtils_1 = __webpack_require__(/*! ../Utils/SheetUtils */ "../api-shared-js/lib/src/ApiShared/Utils/SheetUtils.js"); -var SheetImpl = /** @class */ (function () { - function SheetImpl(_sheetInfoImpl, _registryId) { +const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); +const TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +const ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +const Param_1 = __webpack_require__(/*! ../Utils/Param */ "../api-shared-js/lib/src/ApiShared/Utils/Param.js"); +const SheetUtils_1 = __webpack_require__(/*! ../Utils/SheetUtils */ "../api-shared-js/lib/src/ApiShared/Utils/SheetUtils.js"); +class SheetImpl { + constructor(_sheetInfoImpl, _registryId) { this._sheetInfoImpl = _sheetInfoImpl; this._registryId = _registryId; } - Object.defineProperty(SheetImpl.prototype, "name", { - get: function () { - return this._sheetInfoImpl.name; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(SheetImpl.prototype, "sheetType", { - get: function () { - return this._sheetInfoImpl.sheetType; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(SheetImpl.prototype, "sheetPath", { - get: function () { - return this._sheetInfoImpl.sheetPath; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(SheetImpl.prototype, "size", { - get: function () { - return this._sheetInfoImpl.sheetSize; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(SheetImpl.prototype, "hidden", { - get: function () { - if (this._sheetInfoImpl.isHidden !== undefined) { - return this._sheetInfoImpl.isHidden; - } - throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.ImplementationError, "isHidden not implemented"); - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(SheetImpl.prototype, "active", { - get: function () { - if (this._sheetInfoImpl.isActive !== undefined) { - return this._sheetInfoImpl.isActive; - } - throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.ImplementationError, "active not implemented"); - }, - set: function (active) { - if (this._sheetInfoImpl.isActive !== undefined) { - this._sheetInfoImpl.active = active; - } - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(SheetImpl.prototype, "index", { - get: function () { - if (this._sheetInfoImpl.index !== undefined) { - return this._sheetInfoImpl.index; - } - throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.ImplementationError, "index not implemented"); - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(SheetImpl.prototype, "url", { - get: function () { - if (this._sheetInfoImpl.url !== undefined) { - return this._sheetInfoImpl.url; - } - throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.ImplementationError, "url not implemented"); - }, - enumerable: true, - configurable: true - }); - SheetImpl.prototype.getSheetSize = function () { + get name() { + return this._sheetInfoImpl.name; + } + get sheetType() { + return this._sheetInfoImpl.sheetType; + } + get sheetPath() { + return this._sheetInfoImpl.sheetPath; + } + get size() { + return this._sheetInfoImpl.sheetSize; + } + get hidden() { + if (this._sheetInfoImpl.isHidden !== undefined) { + return this._sheetInfoImpl.isHidden; + } + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.ImplementationError, `isHidden not implemented`); + } + get active() { + if (this._sheetInfoImpl.isActive !== undefined) { + return this._sheetInfoImpl.isActive; + } + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.ImplementationError, `active not implemented`); + } + set active(active) { + if (this._sheetInfoImpl.isActive !== undefined) { + this._sheetInfoImpl.active = active; + } + } + get index() { + if (this._sheetInfoImpl.index !== undefined) { + return this._sheetInfoImpl.index; + } + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.ImplementationError, `index not implemented`); + } + get url() { + if (this._sheetInfoImpl.url !== undefined) { + return this._sheetInfoImpl.url; + } + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.ImplementationError, `url not implemented`); + } + getSheetSize() { if (!SheetUtils_1.SheetUtils.isValidSheetSize(this.size)) { throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.InternalError, 'size is not of type SheetSize'); } return this.size; - }; - SheetImpl.prototype.findParameterAsync = function (parameterName) { + } + findParameterAsync(parameterName) { ErrorHelpers_1.ErrorHelpers.verifyParameter(parameterName, 'parameterName'); - var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("parameters-service" /* Parameters */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("parameters-service" /* Parameters */); return service.findParameterByNameAsync(parameterName); - }; - SheetImpl.prototype.getParametersAsync = function () { - var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("parameters-service" /* Parameters */); + } + getParametersAsync() { + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("parameters-service" /* Parameters */); return service.getParametersForSheetAsync(this.sheetPath); - }; - SheetImpl.prototype.changeSizeAsync = function (newSize) { - var _this = this; - var invalidSizeError = new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.InvalidSize, 'Invalid sheet size parameter'); + } + changeSizeAsync(newSize) { + const invalidSizeError = new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.InvalidSize, 'Invalid sheet size parameter'); if (!newSize || !newSize.behavior) { throw invalidSizeError; } - var partialSheetSize = this.normalizeSheetSize(newSize); - var isAutomatic = partialSheetSize.behavior === Contract.SheetSizeBehavior.Automatic; + const partialSheetSize = this.normalizeSheetSize(newSize); + const isAutomatic = partialSheetSize.behavior === Contract.SheetSizeBehavior.Automatic; if (!isAutomatic && !partialSheetSize.minSize && !partialSheetSize.maxSize) { throw invalidSizeError; } @@ -13526,67 +7331,67 @@ var SheetImpl = /** @class */ (function () { if (isAutomatic && this.getSheetSize().behavior === partialSheetSize.behavior) { return Promise.resolve(newSize); } - var processedNewSize = this.processNewSize(partialSheetSize); - var sizeService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("size-service" /* Size */); - return sizeService.changeSizeAsync(this.name, processedNewSize).then(function () { - var clientInfoService = ServiceRegistry_1.ApiServiceRegistry.get(_this._registryId).getService("client-info-service" /* ClientInfo */); - return clientInfoService.getClientInfoAsync().then(function (bootstrapInfo) { - var sheet = bootstrapInfo.publishedSheets.find(function (s) { return s.name === _this.name; }); + const processedNewSize = this.processNewSize(partialSheetSize); + const sizeService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("size-service" /* Size */); + return sizeService.changeSizeAsync(this.name, processedNewSize).then(() => { + const clientInfoService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("client-info-service" /* ClientInfo */); + return clientInfoService.getClientInfoAsync().then((bootstrapInfo) => { + const sheet = bootstrapInfo.publishedSheets.find((s) => s.name === this.name); if (!sheet) { - throw new TableauError_1.TableauError(Contract.SharedErrorCodes.InternalError, "Can't find sheet with name " + _this.name); + throw new TableauError_1.TableauError(Contract.SharedErrorCodes.InternalError, `Can't find sheet with name ${this.name}`); } - var sheetSize = SheetUtils_1.SheetUtils.getSheetSizeFromSizeConstraints(sheet.sizeConstraint); - _this._sheetInfoImpl.sheetSize = sheetSize; + const sheetSize = SheetUtils_1.SheetUtils.getSheetSizeFromSizeConstraints(sheet.sizeConstraint); + this._sheetInfoImpl.sheetSize = sheetSize; return sheetSize; }); }); - }; - SheetImpl.prototype.normalizeSheetSize = function (newSize) { - var behavior = newSize.behavior; + } + normalizeSheetSize(newSize) { + const { behavior } = newSize; ErrorHelpers_1.ErrorHelpers.verifyEnumValue(behavior, Contract.SheetSizeBehavior, 'SheetSizeBehavior'); - var minSize = SheetImpl.parseDimensions(newSize.minSize); - var maxSize = SheetImpl.parseDimensions(newSize.maxSize); - return { behavior: behavior, minSize: minSize, maxSize: maxSize }; - }; - SheetImpl.prototype.processNewSize = function (newSize) { + const minSize = SheetImpl.parseDimensions(newSize.minSize); + const maxSize = SheetImpl.parseDimensions(newSize.maxSize); + return { behavior, minSize, maxSize }; + } + processNewSize(newSize) { var _a, _b, _c, _d; - var behavior = newSize.behavior, minSizeMaybe = newSize.minSize, maxSizeMaybe = newSize.maxSize; - var hasMinWidth = !Param_1.Param.isNullOrUndefined((_a = minSizeMaybe) === null || _a === void 0 ? void 0 : _a.width); - var hasMinHeight = !Param_1.Param.isNullOrUndefined((_b = minSizeMaybe) === null || _b === void 0 ? void 0 : _b.height); - var hasMaxWidth = !Param_1.Param.isNullOrUndefined((_c = maxSizeMaybe) === null || _c === void 0 ? void 0 : _c.width); - var hasMaxHeight = !Param_1.Param.isNullOrUndefined((_d = maxSizeMaybe) === null || _d === void 0 ? void 0 : _d.height); - var hasValidMinSize = hasMinWidth && hasMinHeight; - var hasValidMaxSize = hasMaxWidth && hasMaxHeight; + const { behavior, minSize: minSizeMaybe, maxSize: maxSizeMaybe } = newSize; + const hasMinWidth = !Param_1.Param.isNullOrUndefined((_a = minSizeMaybe) === null || _a === void 0 ? void 0 : _a.width); + const hasMinHeight = !Param_1.Param.isNullOrUndefined((_b = minSizeMaybe) === null || _b === void 0 ? void 0 : _b.height); + const hasMaxWidth = !Param_1.Param.isNullOrUndefined((_c = maxSizeMaybe) === null || _c === void 0 ? void 0 : _c.width); + const hasMaxHeight = !Param_1.Param.isNullOrUndefined((_d = maxSizeMaybe) === null || _d === void 0 ? void 0 : _d.height); + const hasValidMinSize = hasMinWidth && hasMinHeight; + const hasValidMaxSize = hasMaxWidth && hasMaxHeight; switch (behavior) { case Contract.SheetSizeBehavior.Automatic: { - return { behavior: behavior }; + return { behavior }; } case Contract.SheetSizeBehavior.AtMost: { if (!maxSizeMaybe || !hasValidMaxSize) { throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.MissingMaxSize, 'Missing maxSize for SheetSizeBehavior.AtMost'); } - var maxSize = { width: maxSizeMaybe.width, height: maxSizeMaybe.height }; + const maxSize = { width: maxSizeMaybe.width, height: maxSizeMaybe.height }; if (maxSize.width < 0 || maxSize.height < 0) { throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.InvalidSize, 'Size value cannot be less than zero'); } - return { behavior: behavior, maxSize: maxSize }; + return { behavior, maxSize }; } case Contract.SheetSizeBehavior.AtLeast: { if (!minSizeMaybe || !hasValidMinSize) { throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.MissingMinSize, 'Missing minSize for SheetSizeBehavior.AtLeast'); } - var minSize = { width: minSizeMaybe.width, height: minSizeMaybe.height }; + const minSize = { width: minSizeMaybe.width, height: minSizeMaybe.height }; if (minSize.width < 0 || minSize.height < 0) { throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.InvalidSize, 'Size value cannot be less than zero'); } - return { behavior: behavior, minSize: minSize }; + return { behavior, minSize }; } case Contract.SheetSizeBehavior.Range: { if (!minSizeMaybe || !maxSizeMaybe || !hasValidMinSize || !hasValidMaxSize) { throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.MissingMinMaxSize, 'Missing minSize or maxSize for SheetSizeBehavior.Range'); } - var minSize = { width: minSizeMaybe.width, height: minSizeMaybe.height }; - var maxSize = { width: maxSizeMaybe.width, height: maxSizeMaybe.height }; + const minSize = { width: minSizeMaybe.width, height: minSizeMaybe.height }; + const maxSize = { width: maxSizeMaybe.width, height: maxSizeMaybe.height }; if (minSize.width < 0 || minSize.height < 0 || maxSize.width < 0 || @@ -13595,55 +7400,54 @@ var SheetImpl = /** @class */ (function () { minSize.height > maxSize.height) { throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.InvalidSize, 'Missing minSize or maxSize for SheetSizeBehavior.Range'); } - return { behavior: behavior, minSize: minSize, maxSize: maxSize }; + return { behavior, minSize, maxSize }; } case Contract.SheetSizeBehavior.Exactly: { if (minSizeMaybe && maxSizeMaybe) { if (hasValidMinSize && hasValidMaxSize) { - var minSize = { width: minSizeMaybe.width, height: minSizeMaybe.height }; - var maxSize = { width: maxSizeMaybe.width, height: maxSizeMaybe.height }; + const minSize = { width: minSizeMaybe.width, height: minSizeMaybe.height }; + const maxSize = { width: maxSizeMaybe.width, height: maxSizeMaybe.height }; if (minSize.width !== maxSize.width || minSize.height !== maxSize.height) { throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.InvalidSize, 'Conflicting size values for SheetSizeBehavior.Exactly'); } - return { behavior: behavior, minSize: minSize, maxSize: maxSize }; + return { behavior, minSize, maxSize }; } if (hasValidMinSize) { - var minSize = { width: minSizeMaybe.width, height: minSizeMaybe.height }; - return { behavior: behavior, minSize: minSize, maxSize: minSize }; + const minSize = { width: minSizeMaybe.width, height: minSizeMaybe.height }; + return { behavior, minSize, maxSize: minSize }; } if (hasValidMaxSize) { - var maxSize = { width: maxSizeMaybe.width, height: maxSizeMaybe.height }; - return { behavior: behavior, minSize: maxSize, maxSize: maxSize }; + const maxSize = { width: maxSizeMaybe.width, height: maxSizeMaybe.height }; + return { behavior, minSize: maxSize, maxSize }; } } throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.InvalidSize, 'Invalid sheet size parameter'); } default: { - throw new TableauError_1.TableauError(Contract.SharedErrorCodes.InternalError, "Unsupported sheet size behavior: " + behavior); + throw new TableauError_1.TableauError(Contract.SharedErrorCodes.InternalError, `Unsupported sheet size behavior: ${behavior}`); } } - }; - SheetImpl.parseDimensions = function (size) { - var empty = { width: undefined, height: undefined }; - if (!size) { - return empty; - } - var _a = Param_1.Param.tryParseNumber(size.width), widthParsed = _a.success, parsedWidth = _a.parsed; - var _b = Param_1.Param.tryParseNumber(size.height), heightParsed = _b.success, parsedHeight = _b.parsed; - if (widthParsed && heightParsed) { - return { width: parsedWidth, height: parsedHeight }; - } - if (widthParsed) { - return { width: parsedWidth }; - } - if (heightParsed) { - return { height: parsedHeight }; - } - return empty; - }; - return SheetImpl; -}()); + } +} exports.SheetImpl = SheetImpl; +SheetImpl.parseDimensions = (size) => { + const empty = { width: undefined, height: undefined }; + if (!size) { + return empty; + } + const { success: widthParsed, parsed: parsedWidth } = Param_1.Param.tryParseNumber(size.width); + const { success: heightParsed, parsed: parsedHeight } = Param_1.Param.tryParseNumber(size.height); + if (widthParsed && heightParsed) { + return { width: parsedWidth, height: parsedHeight }; + } + if (widthParsed) { + return { width: parsedWidth }; + } + if (heightParsed) { + return { height: parsedHeight }; + } + return empty; +}; /***/ }), @@ -13657,9 +7461,9 @@ exports.SheetImpl = SheetImpl; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -var SheetInfoImpl = /** @class */ (function () { - function SheetInfoImpl(_name, _sheetType, _sheetSize, _index, _isActive, _isHidden, _url) { +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +class SheetInfoImpl { + constructor(_name, _sheetType, _sheetSize, _index, _isActive, _isHidden, _url) { this._name = _name; this._sheetType = _sheetType; this._sheetSize = _sheetSize; @@ -13668,80 +7472,43 @@ var SheetInfoImpl = /** @class */ (function () { this._isHidden = _isHidden; this._url = _url; } - Object.defineProperty(SheetInfoImpl.prototype, "name", { - get: function () { - return this._name; - }, - set: function (sheetName) { - this._name = sheetName; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(SheetInfoImpl.prototype, "sheetSize", { - get: function () { - return this._sheetSize; - }, - set: function (value) { - this._sheetSize = value; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(SheetInfoImpl.prototype, "sheetType", { - get: function () { - return this._sheetType; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(SheetInfoImpl.prototype, "sheetPath", { - get: function () { - return { - sheetName: this.name, - isDashboard: this.sheetType === api_external_contract_js_1.SheetType.Dashboard, - }; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(SheetInfoImpl.prototype, "index", { - get: function () { - return this._index; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(SheetInfoImpl.prototype, "isActive", { - get: function () { - return this._isActive; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(SheetInfoImpl.prototype, "active", { - set: function (active) { - this._isActive = active; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(SheetInfoImpl.prototype, "isHidden", { - get: function () { - return this._isHidden; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(SheetInfoImpl.prototype, "url", { - get: function () { - return this._url; - }, - enumerable: true, - configurable: true - }); - return SheetInfoImpl; -}()); + get name() { + return this._name; + } + set name(sheetName) { + this._name = sheetName; + } + get sheetSize() { + return this._sheetSize; + } + set sheetSize(value) { + this._sheetSize = value; + } + get sheetType() { + return this._sheetType; + } + get sheetPath() { + return { + sheetName: this.name, + isDashboard: this.sheetType === api_external_contract_js_1.SheetType.Dashboard, + }; + } + get index() { + return this._index; + } + get isActive() { + return this._isActive; + } + set active(active) { + this._isActive = active; + } + get isHidden() { + return this._isHidden; + } + get url() { + return this._url; + } +} exports.SheetInfoImpl = SheetInfoImpl; @@ -13761,33 +7528,27 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); * * @template TEventType The Tableau event type this class specializes */ -var SingleEventManagerImpl = /** @class */ (function () { - function SingleEventManagerImpl(eventType) { +class SingleEventManagerImpl { + constructor(eventType) { this._eventType = eventType; this._handlers = []; } - Object.defineProperty(SingleEventManagerImpl.prototype, "eventType", { - get: function () { - return this._eventType; - }, - enumerable: true, - configurable: true - }); - SingleEventManagerImpl.prototype.addEventListener = function (handler) { - var _this = this; + get eventType() { + return this._eventType; + } + addEventListener(handler) { this._handlers.push(handler); - return function () { return _this.removeEventListener(handler); }; - }; - SingleEventManagerImpl.prototype.removeEventListener = function (handler) { - var beforeCount = this._handlers.length; - this._handlers = this._handlers.filter(function (h) { return h !== handler; }); + return () => this.removeEventListener(handler); + } + removeEventListener(handler) { + const beforeCount = this._handlers.length; + this._handlers = this._handlers.filter((h) => h !== handler); return beforeCount > this._handlers.length; - }; - SingleEventManagerImpl.prototype.triggerEvent = function (eventGenerator) { - for (var _i = 0, _a = this._handlers; _i < _a.length; _i++) { - var handler = _a[_i]; + } + triggerEvent(eventGenerator) { + for (const handler of this._handlers) { try { - var eventModel = eventGenerator(); + const eventModel = eventGenerator(); handler(eventModel); } catch (e) { @@ -13795,9 +7556,8 @@ var SingleEventManagerImpl = /** @class */ (function () { continue; } } - }; - return SingleEventManagerImpl; -}()); + } +} exports.SingleEventManagerImpl = SingleEventManagerImpl; @@ -13807,76 +7567,59 @@ exports.SingleEventManagerImpl = SingleEventManagerImpl; /*!************************************************************!*\ !*** ../api-shared-js/lib/src/ApiShared/Impl/StoryImpl.js ***! \************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; -var __extends = (this && this.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); Object.defineProperty(exports, "__esModule", ({ value: true })); -var Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -var ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); -var TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); -var ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); -var ShortLivedDeferred_1 = __webpack_require__(/*! ../Utils/ShortLivedDeferred */ "../api-shared-js/lib/src/ApiShared/Utils/ShortLivedDeferred.js"); -var SheetImpl_1 = __webpack_require__(/*! ./SheetImpl */ "../api-shared-js/lib/src/ApiShared/Impl/SheetImpl.js"); -var StoryPointImpl_1 = __webpack_require__(/*! ./StoryPointImpl */ "../api-shared-js/lib/src/ApiShared/Impl/StoryPointImpl.js"); -var StoryPointInfoImpl_1 = __webpack_require__(/*! ./StoryPointInfoImpl */ "../api-shared-js/lib/src/ApiShared/Impl/StoryPointInfoImpl.js"); -var StoryImpl = /** @class */ (function (_super) { - __extends(StoryImpl, _super); - function StoryImpl(_sheetInfoImpl, storyModel, _publishedSheetInfos, _registryId) { - var _this = _super.call(this, _sheetInfoImpl, _registryId) || this; - _this._sheetInfoImpl = _sheetInfoImpl; - _this._publishedSheetInfos = _publishedSheetInfos; - _this._registryId = _registryId; - _this._storyPointInfoImpls = []; - _this._deferred = new ShortLivedDeferred_1.ShortLivedDeferred(); - _this.initializeStory(storyModel); - return _this; - } - StoryImpl.prototype.initializeStory = function (storyModel) { - var _this = this; - storyModel.storyPoints.forEach(function (storyPointModel) { - var isActive = storyPointModel.index === storyModel.activeStoryPointIndex; - var storyPointInfoImpl = new StoryPointInfoImpl_1.StoryPointInfoImpl(storyPointModel.caption, storyPointModel.index, storyPointModel.storyPointId, isActive, storyPointModel.updated, _this); - _this._storyPointInfoImpls.push(storyPointInfoImpl); +const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); +const TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +const ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +const ShortLivedDeferred_1 = __webpack_require__(/*! ../Utils/ShortLivedDeferred */ "../api-shared-js/lib/src/ApiShared/Utils/ShortLivedDeferred.js"); +const SheetImpl_1 = __webpack_require__(/*! ./SheetImpl */ "../api-shared-js/lib/src/ApiShared/Impl/SheetImpl.js"); +const StoryPointImpl_1 = __webpack_require__(/*! ./StoryPointImpl */ "../api-shared-js/lib/src/ApiShared/Impl/StoryPointImpl.js"); +const StoryPointInfoImpl_1 = __webpack_require__(/*! ./StoryPointInfoImpl */ "../api-shared-js/lib/src/ApiShared/Impl/StoryPointInfoImpl.js"); +class StoryImpl extends SheetImpl_1.SheetImpl { + constructor(_sheetInfoImpl, storyModel, _publishedSheetInfos, _registryId) { + super(_sheetInfoImpl, _registryId); + this._sheetInfoImpl = _sheetInfoImpl; + this._publishedSheetInfos = _publishedSheetInfos; + this._registryId = _registryId; + this._storyPointInfoImpls = []; + this._deferred = new ShortLivedDeferred_1.ShortLivedDeferred(); + this.initializeStory(storyModel); + } + initializeStory(storyModel) { + storyModel.storyPoints.forEach((storyPointModel) => { + const isActive = storyPointModel.index === storyModel.activeStoryPointIndex; + const storyPointInfoImpl = new StoryPointInfoImpl_1.StoryPointInfoImpl(storyPointModel.caption, storyPointModel.index, storyPointModel.storyPointId, isActive, storyPointModel.updated, this); + this._storyPointInfoImpls.push(storyPointInfoImpl); if (isActive) { - _this._activeStoryPointImpl = new StoryPointImpl_1.StoryPointImpl(storyPointInfoImpl, _this._publishedSheetInfos, _this._registryId, storyPointModel.containedSheetInfo); + this._activeStoryPointImpl = new StoryPointImpl_1.StoryPointImpl(storyPointInfoImpl, this._publishedSheetInfos, this._registryId, storyPointModel.containedSheetInfo); } }); - }; - StoryImpl.prototype.updateStoryInfo = function (index, storyPointModel) { + } + updateStoryInfo(index, storyPointModel) { if (!this._storyPointInfoImpls) { return; } - var storyInfoImpl = this._storyPointInfoImpls[index]; + let storyInfoImpl = this._storyPointInfoImpls[index]; if (storyInfoImpl.storyPointId !== storyPointModel.storyPointId) { - throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.StoryPointIdMismatch, "We should not be updating a story point when the IDs don't match. Existing storyPointID=" + storyInfoImpl.storyPointId + ", newStoryPointID=" + storyPointModel.storyPointId); + throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.StoryPointIdMismatch, `We should not be updating a story point when the IDs don't match. Existing storyPointID=${storyInfoImpl.storyPointId}, newStoryPointID=${storyPointModel.storyPointId}`); } storyInfoImpl.caption = storyPointModel.caption; storyInfoImpl.updated = storyPointModel.updated; if (this._activeStoryPointImpl.storyPointId === storyPointModel.storyPointId) { this._activeStoryPointImpl.updated = storyInfoImpl.updated; } - }; - StoryImpl.prototype.updateStory = function (storyPointModel) { - var _this = this; + } + updateStory(storyPointModel) { if (!this._storyPointInfoImpls) { return; } - this._storyPointInfoImpls.forEach(function (storyPointInfoImpl) { - var isActive = storyPointInfoImpl.storyPointId === storyPointModel.storyPointId; + this._storyPointInfoImpls.forEach((storyPointInfoImpl) => { + const isActive = storyPointInfoImpl.storyPointId === storyPointModel.storyPointId; if (isActive) { // update the state storyPointInfoImpl.caption = storyPointModel.caption; @@ -13884,7 +7627,7 @@ var StoryImpl = /** @class */ (function (_super) { storyPointInfoImpl.active = true; storyPointInfoImpl.updated = storyPointModel.updated; // re-initialize activeStoryPointImpl - _this._activeStoryPointImpl = new StoryPointImpl_1.StoryPointImpl(storyPointInfoImpl, _this._publishedSheetInfos, _this._registryId, storyPointModel.containedSheetInfo); + this._activeStoryPointImpl = new StoryPointImpl_1.StoryPointImpl(storyPointInfoImpl, this._publishedSheetInfos, this._registryId, storyPointModel.containedSheetInfo); } else { // set old ones to false @@ -13894,54 +7637,38 @@ var StoryImpl = /** @class */ (function (_super) { if (this.activeStoryPoint) { this._deferred.resolve(this.activeStoryPoint); } - }; - Object.defineProperty(StoryImpl.prototype, "activeStoryPoint", { - get: function () { - return this._activeStoryPointImpl; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(StoryImpl.prototype, "storyPointsInfo", { - get: function () { - return this._storyPointInfoImpls; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(StoryImpl.prototype, "isActive", { - get: function () { - return this._sheetInfoImpl.active; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(StoryImpl.prototype, "isHidden", { - get: function () { - return !!this._sheetInfoImpl.isHidden; - }, - enumerable: true, - configurable: true - }); - StoryImpl.prototype.activateNextStoryPointAsync = function () { + } + get activeStoryPoint() { + return this._activeStoryPointImpl; + } + get storyPointsInfo() { + return this._storyPointInfoImpls; + } + get isActive() { + return this._sheetInfoImpl.active; + } + get isHidden() { + return !!this._sheetInfoImpl.isHidden; + } + activateNextStoryPointAsync() { if (this._activeStoryPointImpl.index === this._storyPointInfoImpls.length - 1) { return Promise.resolve(this._activeStoryPointImpl); } - var promise = this._deferred.getNewPromiseOrThrowIfBusy(); - var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("story-activation-service" /* StoryActivation */); + let promise = this._deferred.getNewPromiseOrThrowIfBusy(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("story-activation-service" /* StoryActivation */); service.activateNextStoryPointAsync(); return promise; - }; - StoryImpl.prototype.activatePreviousStoryPointAsync = function () { + } + activatePreviousStoryPointAsync() { if (this._activeStoryPointImpl.index === 0) { return Promise.resolve(this._activeStoryPointImpl); } - var promise = this._deferred.getNewPromiseOrThrowIfBusy(); - var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("story-activation-service" /* StoryActivation */); + let promise = this._deferred.getNewPromiseOrThrowIfBusy(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("story-activation-service" /* StoryActivation */); service.activatePreviousStoryPointAsync(); return promise; - }; - StoryImpl.prototype.activateStoryPointAsync = function (index) { + } + activateStoryPointAsync(index) { ErrorHelpers_1.ErrorHelpers.verifyParameter(index, 'index'); ErrorHelpers_1.ErrorHelpers.verifyParameterType(index, 'number', 'index'); if (index < 0 || index >= this._storyPointInfoImpls.length) { @@ -13950,32 +7677,30 @@ var StoryImpl = /** @class */ (function (_super) { if (index === this._activeStoryPointImpl.index) { return Promise.resolve(this._activeStoryPointImpl); } - var promise = this._deferred.getNewPromiseOrThrowIfBusy(); - var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("story-activation-service" /* StoryActivation */); + let promise = this._deferred.getNewPromiseOrThrowIfBusy(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("story-activation-service" /* StoryActivation */); service.activateStoryPointAsync(index); return promise; - }; - StoryImpl.prototype.revertStoryPointAsync = function (index) { - var _this = this; + } + revertStoryPointAsync(index) { ErrorHelpers_1.ErrorHelpers.verifyParameter(index, 'index'); ErrorHelpers_1.ErrorHelpers.verifyParameterType(index, 'number', 'index'); if (index < 0 || index >= this._storyPointInfoImpls.length) { throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.IndexOutOfRange, 'The index passed to this command is out of range.'); } - var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("story-activation-service" /* StoryActivation */); - return service.revertStoryPointAsync(index).then(function (response) { - _this.updateStoryInfo(response.index, response); - var storyPointInfoImpl = new StoryPointInfoImpl_1.StoryPointInfoImpl(response.caption, response.index, response.storyPointId, false, response.updated, _this); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("story-activation-service" /* StoryActivation */); + return service.revertStoryPointAsync(index).then((response) => { + this.updateStoryInfo(response.index, response); + const storyPointInfoImpl = new StoryPointInfoImpl_1.StoryPointInfoImpl(response.caption, response.index, response.storyPointId, false, response.updated, this); return storyPointInfoImpl; }); - }; - StoryImpl.prototype.clearPendingPromises = function () { + } + clearPendingPromises() { if (this._deferred) { this._deferred.reject('All pending promises cleared'); } - }; - return StoryImpl; -}(SheetImpl_1.SheetImpl)); + } +} exports.StoryImpl = StoryImpl; @@ -13990,91 +7715,63 @@ exports.StoryImpl = StoryImpl; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -var Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -var TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); -var SheetUtils_1 = __webpack_require__(/*! ../Utils/SheetUtils */ "../api-shared-js/lib/src/ApiShared/Utils/SheetUtils.js"); -var DashboardImpl_1 = __webpack_require__(/*! ./DashboardImpl */ "../api-shared-js/lib/src/ApiShared/Impl/DashboardImpl.js"); -var SheetInfoImpl_1 = __webpack_require__(/*! ./SheetInfoImpl */ "../api-shared-js/lib/src/ApiShared/Impl/SheetInfoImpl.js"); -var WorksheetImpl_1 = __webpack_require__(/*! ./WorksheetImpl */ "../api-shared-js/lib/src/ApiShared/Impl/WorksheetImpl.js"); -var StoryPointImpl = /** @class */ (function () { - function StoryPointImpl(_storyPointInfoImpl, sheetInfos, registryId, containedSheetInfo) { +const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +const SheetUtils_1 = __webpack_require__(/*! ../Utils/SheetUtils */ "../api-shared-js/lib/src/ApiShared/Utils/SheetUtils.js"); +const DashboardImpl_1 = __webpack_require__(/*! ./DashboardImpl */ "../api-shared-js/lib/src/ApiShared/Impl/DashboardImpl.js"); +const SheetInfoImpl_1 = __webpack_require__(/*! ./SheetInfoImpl */ "../api-shared-js/lib/src/ApiShared/Impl/SheetInfoImpl.js"); +const WorksheetImpl_1 = __webpack_require__(/*! ./WorksheetImpl */ "../api-shared-js/lib/src/ApiShared/Impl/WorksheetImpl.js"); +class StoryPointImpl { + constructor(_storyPointInfoImpl, sheetInfos, registryId, containedSheetInfo) { this._storyPointInfoImpl = _storyPointInfoImpl; if (containedSheetInfo) { this._containedSheetImpl = this.createContainedSheet(containedSheetInfo, sheetInfos, registryId); } } - Object.defineProperty(StoryPointImpl.prototype, "index", { - get: function () { - return this._storyPointInfoImpl.index; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(StoryPointImpl.prototype, "caption", { - get: function () { - return this._storyPointInfoImpl.caption; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(StoryPointImpl.prototype, "active", { - get: function () { - return this._storyPointInfoImpl.active; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(StoryPointImpl.prototype, "updated", { - get: function () { - return this._storyPointInfoImpl.updated; - }, - set: function (updated) { - this._storyPointInfoImpl.updated = updated; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(StoryPointImpl.prototype, "parentStory", { - get: function () { - return this._storyPointInfoImpl.parentStory; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(StoryPointImpl.prototype, "containedSheet", { - get: function () { - return this._containedSheetImpl; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(StoryPointImpl.prototype, "storyPointId", { - get: function () { - return this._storyPointInfoImpl.storyPointId; - }, - enumerable: true, - configurable: true - }); - StoryPointImpl.prototype.createContainedSheet = function (containedSheetInfo, sheetInfos, registryId) { - var containedSheetIdx = -1; - var publishedSheetInfo = SheetUtils_1.SheetUtils.getPublishedSheetInfoByName(containedSheetInfo.name, sheetInfos); - var containedSheetSize = SheetUtils_1.SheetUtils.createAutomaticSize(); - var isContainedSheetHidden = publishedSheetInfo === undefined; - var containedSheetUrl = publishedSheetInfo ? publishedSheetInfo.url : ''; + get index() { + return this._storyPointInfoImpl.index; + } + get caption() { + return this._storyPointInfoImpl.caption; + } + get active() { + return this._storyPointInfoImpl.active; + } + get updated() { + return this._storyPointInfoImpl.updated; + } + set updated(updated) { + this._storyPointInfoImpl.updated = updated; + } + get parentStory() { + return this._storyPointInfoImpl.parentStory; + } + get containedSheet() { + return this._containedSheetImpl; + } + get storyPointId() { + return this._storyPointInfoImpl.storyPointId; + } + createContainedSheet(containedSheetInfo, sheetInfos, registryId) { + const containedSheetIdx = -1; + const publishedSheetInfo = SheetUtils_1.SheetUtils.getPublishedSheetInfoByName(containedSheetInfo.name, sheetInfos); + const containedSheetSize = SheetUtils_1.SheetUtils.createAutomaticSize(); + const isContainedSheetHidden = publishedSheetInfo === undefined; + const containedSheetUrl = publishedSheetInfo ? publishedSheetInfo.url : ''; // Contained sheets aren't active - the containing sheet is active. - var containedSheetActive = false; - var containedSheetInfoImpl = new SheetInfoImpl_1.SheetInfoImpl(containedSheetInfo.name, SheetUtils_1.SheetUtils.getSheetTypeEnum(containedSheetInfo.sheetType), containedSheetSize, containedSheetIdx, containedSheetActive, isContainedSheetHidden, containedSheetUrl); - var sheetImpl; + const containedSheetActive = false; + const containedSheetInfoImpl = new SheetInfoImpl_1.SheetInfoImpl(containedSheetInfo.name, SheetUtils_1.SheetUtils.getSheetTypeEnum(containedSheetInfo.sheetType), containedSheetSize, containedSheetIdx, containedSheetActive, isContainedSheetHidden, containedSheetUrl); + let sheetImpl; switch (containedSheetInfoImpl.sheetType) { case Contract.SheetType.Worksheet: { - var vizId = { + const vizId = { worksheet: containedSheetInfoImpl.name, }; sheetImpl = new WorksheetImpl_1.WorksheetImpl(containedSheetInfoImpl, registryId, vizId, null, this); break; } case Contract.SheetType.Dashboard: { - var sheetPath = { + const sheetPath = { sheetName: containedSheetInfoImpl.name, isDashboard: true, }; @@ -14086,9 +7783,8 @@ var StoryPointImpl = /** @class */ (function () { } } return sheetImpl; - }; - return StoryPointImpl; -}()); + } +} exports.StoryPointImpl = StoryPointImpl; @@ -14103,8 +7799,8 @@ exports.StoryPointImpl = StoryPointImpl; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -var StoryPointInfoImpl = /** @class */ (function () { - function StoryPointInfoImpl(_caption, _index, _storyPointId, _active, _updated, _parentStoryImpl) { +class StoryPointInfoImpl { + constructor(_caption, _index, _storyPointId, _active, _updated, _parentStoryImpl) { this._caption = _caption; this._index = _index; this._storyPointId = _storyPointId; @@ -14112,62 +7808,37 @@ var StoryPointInfoImpl = /** @class */ (function () { this._updated = _updated; this._parentStoryImpl = _parentStoryImpl; } - Object.defineProperty(StoryPointInfoImpl.prototype, "caption", { - get: function () { - return this._caption; - }, - set: function (caption) { - this._caption = caption; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(StoryPointInfoImpl.prototype, "index", { - get: function () { - return this._index; - }, - set: function (index) { - this._index = index; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(StoryPointInfoImpl.prototype, "storyPointId", { - get: function () { - return this._storyPointId; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(StoryPointInfoImpl.prototype, "active", { - get: function () { - return this._active; - }, - set: function (isActive) { - this._active = isActive; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(StoryPointInfoImpl.prototype, "updated", { - get: function () { - return this._updated; - }, - set: function (isUpdated) { - this._updated = isUpdated; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(StoryPointInfoImpl.prototype, "parentStory", { - get: function () { - return this._parentStoryImpl; - }, - enumerable: true, - configurable: true - }); - return StoryPointInfoImpl; -}()); + get caption() { + return this._caption; + } + set caption(caption) { + this._caption = caption; + } + get index() { + return this._index; + } + set index(index) { + this._index = index; + } + get storyPointId() { + return this._storyPointId; + } + get active() { + return this._active; + } + set active(isActive) { + this._active = isActive; + } + get updated() { + return this._updated; + } + set updated(isUpdated) { + this._updated = isUpdated; + } + get parentStory() { + return this._parentStoryImpl; + } +} exports.StoryPointInfoImpl = StoryPointInfoImpl; @@ -14182,11 +7853,8 @@ exports.StoryPointInfoImpl = StoryPointInfoImpl; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -var WorkbookImpl = /** @class */ (function () { - function WorkbookImpl() { - } - return WorkbookImpl; -}()); +class WorkbookImpl { +} exports.WorkbookImpl = WorkbookImpl; @@ -14196,92 +7864,55 @@ exports.WorkbookImpl = WorkbookImpl; /*!****************************************************************!*\ !*** ../api-shared-js/lib/src/ApiShared/Impl/WorksheetImpl.js ***! \****************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; - -var __extends = (this && this.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); + Object.defineProperty(exports, "__esModule", ({ value: true })); -var Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -var DataSource_1 = __webpack_require__(/*! ../DataSource */ "../api-shared-js/lib/src/ApiShared/DataSource.js"); -var LogicalTable_1 = __webpack_require__(/*! ../LogicalTable */ "../api-shared-js/lib/src/ApiShared/LogicalTable.js"); -var GetDataService_1 = __webpack_require__(/*! ../Services/GetDataService */ "../api-shared-js/lib/src/ApiShared/Services/GetDataService.js"); -var ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); -var TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); -var ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); -var DataSourceImpl_1 = __webpack_require__(/*! ./DataSourceImpl */ "../api-shared-js/lib/src/ApiShared/Impl/DataSourceImpl.js"); -var SheetImpl_1 = __webpack_require__(/*! ./SheetImpl */ "../api-shared-js/lib/src/ApiShared/Impl/SheetImpl.js"); -var WorksheetImpl = /** @class */ (function (_super) { - __extends(WorksheetImpl, _super); - function WorksheetImpl(sheetInfoImpl, _registryId, _visualId, _parentDashboardImpl, _parentStoryPointImpl, _backgroundColor, _formatting) { - if (_backgroundColor === void 0) { _backgroundColor = null; } - if (_formatting === void 0) { _formatting = null; } - var _this = _super.call(this, sheetInfoImpl, _registryId) || this; - _this._visualId = _visualId; - _this._parentDashboardImpl = _parentDashboardImpl; - _this._parentStoryPointImpl = _parentStoryPointImpl; - _this._backgroundColor = _backgroundColor; - _this._formatting = _formatting; - return _this; - } - Object.defineProperty(WorksheetImpl.prototype, "parentDashboard", { - get: function () { - return this._parentDashboardImpl; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(WorksheetImpl.prototype, "parentStoryPoint", { - get: function () { - return this._parentStoryPointImpl; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(WorksheetImpl.prototype, "visualId", { - get: function () { - return this._visualId; - }, - enumerable: true, - configurable: true - }); - WorksheetImpl.prototype.getMaxPageRowLimit = function () { +const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const DataSource_1 = __webpack_require__(/*! ../DataSource */ "../api-shared-js/lib/src/ApiShared/DataSource.js"); +const LogicalTable_1 = __webpack_require__(/*! ../LogicalTable */ "../api-shared-js/lib/src/ApiShared/LogicalTable.js"); +const GetDataService_1 = __webpack_require__(/*! ../Services/GetDataService */ "../api-shared-js/lib/src/ApiShared/Services/GetDataService.js"); +const ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); +const TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +const ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +const DataSourceImpl_1 = __webpack_require__(/*! ./DataSourceImpl */ "../api-shared-js/lib/src/ApiShared/Impl/DataSourceImpl.js"); +const SheetImpl_1 = __webpack_require__(/*! ./SheetImpl */ "../api-shared-js/lib/src/ApiShared/Impl/SheetImpl.js"); +class WorksheetImpl extends SheetImpl_1.SheetImpl { + constructor(sheetInfoImpl, _registryId, _visualId, _parentDashboardImpl, _parentStoryPointImpl, _backgroundColor = null, _formatting = null) { + super(sheetInfoImpl, _registryId); + this._visualId = _visualId; + this._parentDashboardImpl = _parentDashboardImpl; + this._parentStoryPointImpl = _parentStoryPointImpl; + this._backgroundColor = _backgroundColor; + this._formatting = _formatting; + } + get parentDashboard() { + return this._parentDashboardImpl; + } + get parentStoryPoint() { + return this._parentStoryPointImpl; + } + get visualId() { + return this._visualId; + } + getMaxPageRowLimit() { return 10000; - }; - Object.defineProperty(WorksheetImpl.prototype, "backgroundColor", { - get: function () { - return this._backgroundColor; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(WorksheetImpl.prototype, "formatting", { - get: function () { - return this._formatting; - }, - enumerable: true, - configurable: true - }); - WorksheetImpl.prototype.applyFilterAsync = function (fieldName, values, updateType, options) { + } + get backgroundColor() { + return this._backgroundColor; + } + get formatting() { + return this._formatting; + } + applyFilterAsync(fieldName, values, updateType, options) { ErrorHelpers_1.ErrorHelpers.verifyEnumValue(updateType, Contract.FilterUpdateType, 'Contract.FilterUpdateType'); this.verifyActiveSheet(); - var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); return service.applyFilterAsync(this.visualId, fieldName, values, updateType, options); - }; - WorksheetImpl.prototype.applyRangeFilterAsync = function (fieldName, filterOptions) { + } + applyRangeFilterAsync(fieldName, filterOptions) { ErrorHelpers_1.ErrorHelpers.verifyParameter(fieldName, 'fieldName'); ErrorHelpers_1.ErrorHelpers.verifyParameter(filterOptions, 'filterOptions'); if (filterOptions.nullOption) { @@ -14291,10 +7922,10 @@ var WorksheetImpl = /** @class */ (function (_super) { ErrorHelpers_1.ErrorHelpers.verifyRangeParamType(filterOptions.min, filterOptions.max); } this.verifyActiveSheet(); - var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); return service.applyRangeFilterAsync(this.visualId, fieldName, filterOptions); - }; - WorksheetImpl.prototype.applyHierarchicalFilterAsync = function (fieldName, values, updateType, options) { + } + applyHierarchicalFilterAsync(fieldName, values, updateType, options) { ErrorHelpers_1.ErrorHelpers.verifyParameter(fieldName, 'fieldName'); ErrorHelpers_1.ErrorHelpers.verifyParameter(values, 'values'); ErrorHelpers_1.ErrorHelpers.verifyEnumValue(updateType, Contract.FilterUpdateType, 'Contract.FilterUpdateType'); @@ -14302,241 +7933,238 @@ var WorksheetImpl = /** @class */ (function (_super) { throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, 'values parameter for applyHierarchicalFilterAsync must be an array or contain a levels key'); } this.verifyActiveSheet(); - var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); return service.applyHierarchicalFilterAsync(this.visualId, fieldName, values, updateType, options); - }; - WorksheetImpl.prototype.clearFilterAsync = function (fieldName) { + } + clearFilterAsync(fieldName) { ErrorHelpers_1.ErrorHelpers.verifyParameter(fieldName, 'fieldName'); this.verifyActiveSheet(); - var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); return service.clearFilterAsync(this.visualId, fieldName); - }; - WorksheetImpl.prototype.applyRelativeDateFilterAsync = function (fieldName, options) { + } + applyRelativeDateFilterAsync(fieldName, options) { ErrorHelpers_1.ErrorHelpers.verifyStringParameter(fieldName, 'fieldName'); ErrorHelpers_1.ErrorHelpers.verifyParameter(options, 'options'); ErrorHelpers_1.ErrorHelpers.verifyEnumValue(options.periodType, api_external_contract_js_1.PeriodType, 'PeriodType'); ErrorHelpers_1.ErrorHelpers.verifyEnumValue(options.rangeType, api_external_contract_js_1.DateRangeType, 'DateRangeType'); this.verifyActiveSheet(); - var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); return service.applyRelativeDateFilterAsync(this.visualId, fieldName, options); - }; - WorksheetImpl.prototype.getDataSourcesAsync = function () { - var _this = this; + } + getDataSourcesAsync() { this.verifyActiveSheet(); - var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */); - return service.getDataSourcesAsync(this.visualId).then(function (result) { - var dataSchema = result; - var worksheetDataSourceInfo = dataSchema.worksheetDataSchemaMap[_this.name]; - var dataSources = []; + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */); + return service.getDataSourcesAsync(this.visualId).then((result) => { + const dataSchema = result; + const worksheetDataSourceInfo = dataSchema.worksheetDataSchemaMap[this.name]; + const dataSources = []; // First, add the primary datasource. By convention, it comes first in the returned array. - var primaryId = worksheetDataSourceInfo.primaryDataSource; - dataSources.push(_this.createDataSourceFromInfo(dataSchema.dataSources[primaryId])); + const primaryId = worksheetDataSourceInfo.primaryDataSource; + dataSources.push(this.createDataSourceFromInfo(dataSchema.dataSources[primaryId])); // Then, loop through any secondary data sources and add them. - for (var _i = 0, _a = worksheetDataSourceInfo.referencedDataSourceList; _i < _a.length; _i++) { - var secondaryId = _a[_i]; + for (const secondaryId of worksheetDataSourceInfo.referencedDataSourceList) { if (secondaryId !== primaryId) { - dataSources.push(_this.createDataSourceFromInfo(dataSchema.dataSources[secondaryId])); + dataSources.push(this.createDataSourceFromInfo(dataSchema.dataSources[secondaryId])); } } return dataSources; }); - }; - WorksheetImpl.prototype.getFiltersAsync = function () { + } + getFiltersAsync() { this.verifyActiveSheet(); - var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); return service.getFiltersAsync(this.visualId); - }; - WorksheetImpl.prototype.getSelectedMarksAsync = function () { + } + getSelectedMarksAsync() { this.verifyActiveSheet(); - var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); return service.getSelectedMarksAsync(this.visualId); - }; - WorksheetImpl.prototype.getHighlightedMarksAsync = function () { + } + getHighlightedMarksAsync() { this.verifyActiveSheet(); - var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); return service.getHighlightedMarksAsync(this.visualId); - }; - WorksheetImpl.prototype.getSummaryDataAsync = function (options) { + } + getSummaryDataAsync(options) { var _a; this.verifyActiveSheet(); - var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); options = options || {}; return service.getUnderlyingDataAsync(this.visualId, GetDataService_1.GetDataType.Summary, !!options.ignoreAliases, !!options.ignoreSelection, true, options.columnsToIncludeById || [], options.maxRows || 0, options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues, (_a = options.applyWorksheetFormatting, (_a !== null && _a !== void 0 ? _a : false))); - }; - WorksheetImpl.prototype.getSummaryDataReaderAsync = function (pageRowCount, options) { + } + getSummaryDataReaderAsync(pageRowCount, options) { var _a; this.verifyActiveSheet(); - var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); options = options || {}; return service.getSummaryDataReaderAsync(this.visualId, pageRowCount || this.getMaxPageRowLimit(), !!options.ignoreAliases, !!options.ignoreSelection, true, // includeAllColumns (can be overridden by columnsToIncludeById) options.columnsToIncludeById || [], options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues, (_a = options.applyWorksheetFormatting, (_a !== null && _a !== void 0 ? _a : false))); - }; - WorksheetImpl.prototype.getVisualSpecificationAsync = function () { + } + getVisualSpecificationAsync() { this.verifyActiveSheet(); - var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("visual-model-service" /* VisualModel */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("visual-model-service" /* VisualModel */); return service.getVisualSpecificationAsync(this.visualId); - }; - WorksheetImpl.prototype.addMarksCardFieldsAsync = function (marksCardIndex, encodingType, columns, startIndex) { + } + addMarksCardFieldsAsync(marksCardIndex, encodingType, columns, startIndex) { this.verifyActiveSheet(); - var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("visual-model-service" /* VisualModel */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("visual-model-service" /* VisualModel */); return service.addMarksCardFieldsAsync(this.visualId, marksCardIndex, encodingType, columns, startIndex); - }; - WorksheetImpl.prototype.moveMarksCardFieldAsync = function (marksCardIndex, fromIndex, toIndex, fieldCount) { + } + moveMarksCardFieldAsync(marksCardIndex, fromIndex, toIndex, fieldCount) { this.verifyActiveSheet(); - var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("visual-model-service" /* VisualModel */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("visual-model-service" /* VisualModel */); return service.moveMarksCardFieldAsync(this.visualId, marksCardIndex, fromIndex, toIndex, fieldCount); - }; - WorksheetImpl.prototype.spliceMarksCardFieldsAsync = function (marksCardIndex, encodingType, startIndex, deleteCount, columns) { + } + spliceMarksCardFieldsAsync(marksCardIndex, encodingType, startIndex, deleteCount, columns) { this.verifyActiveSheet(); - var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("visual-model-service" /* VisualModel */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("visual-model-service" /* VisualModel */); return service.spliceMarksCardFieldsAsync(this.visualId, marksCardIndex, encodingType, startIndex, deleteCount, columns); - }; - WorksheetImpl.prototype.getSummaryColumnsInfoAsync = function () { + } + getSummaryColumnsInfoAsync() { this.verifyActiveSheet(); - var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); return service.getSummaryColumnsInfoAsync(this.visualId); - }; - WorksheetImpl.prototype.getUnderlyingDataAsync = function (options) { + } + getUnderlyingDataAsync(options) { var _a; this.verifyActiveSheet(); - var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); options = options || {}; return service.getUnderlyingDataAsync(this.visualId, GetDataService_1.GetDataType.Underlying, !!options.ignoreAliases, !!options.ignoreSelection, !!options.includeAllColumns, options.columnsToIncludeById || [], options.maxRows || 0, options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues, (_a = options.applyWorksheetFormatting, (_a !== null && _a !== void 0 ? _a : false))); - }; - WorksheetImpl.prototype.getUnderlyingTablesAsync = function () { + } + getUnderlyingTablesAsync() { this.verifyActiveSheet(); - var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */); - return service.getUnderlyingTablesAsync(this.visualId).then(function (logicalTableInfos) { - return logicalTableInfos.map(function (logicalTableInfo) { return new LogicalTable_1.LogicalTable(logicalTableInfo); }); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */); + return service.getUnderlyingTablesAsync(this.visualId).then((logicalTableInfos) => { + return logicalTableInfos.map((logicalTableInfo) => new LogicalTable_1.LogicalTable(logicalTableInfo)); }); - }; - WorksheetImpl.prototype.getUnderlyingTableDataAsync = function (logicalTableId, options) { + } + getUnderlyingTableDataAsync(logicalTableId, options) { var _a; this.verifyActiveSheet(); - var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); options = options || {}; return service.getUnderlyingTableDataAsync(this.visualId, logicalTableId, !!options.ignoreAliases, !!options.ignoreSelection, !!options.includeAllColumns, options.columnsToIncludeById || [], options.maxRows || 0, options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues, (_a = options.applyWorksheetFormatting, (_a !== null && _a !== void 0 ? _a : false))); - }; - WorksheetImpl.prototype.getUnderlyingTableDataReaderAsync = function (logicalTableId, pageRowCount, options) { + } + getUnderlyingTableDataReaderAsync(logicalTableId, pageRowCount, options) { var _a; this.verifyActiveSheet(); - var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); options = options || {}; return service.getUnderlyingTableDataReaderAsync(this.visualId, logicalTableId, pageRowCount || this.getMaxPageRowLimit(), !!options.ignoreAliases, !!options.ignoreSelection, !!options.includeAllColumns, options.columnsToIncludeById || [], options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues, (_a = options.applyWorksheetFormatting, (_a !== null && _a !== void 0 ? _a : false))); - }; - WorksheetImpl.prototype.clearSelectedMarksAsync = function () { + } + clearSelectedMarksAsync() { this.verifyActiveSheet(); - var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("selection-service" /* Selection */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("selection-service" /* Selection */); return service.clearSelectedMarksAsync(this.visualId); - }; - WorksheetImpl.prototype.selectMarksByValueAsync = function (selections, selectionUpdateType) { + } + selectMarksByValueAsync(selections, selectionUpdateType) { ErrorHelpers_1.ErrorHelpers.verifyParameter(selections, 'fieldName'); ErrorHelpers_1.ErrorHelpers.verifyEnumValue(selectionUpdateType, api_external_contract_js_1.SelectionUpdateType, 'SelectionUpdateType'); this.verifyActiveSheet(); - var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("selection-service" /* Selection */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("selection-service" /* Selection */); return service.selectMarksByValueAsync(this.visualId, selections, selectionUpdateType); - }; - WorksheetImpl.prototype.selectMarksByIdAsync = function (selections, selectionUpdateType) { + } + selectMarksByIdAsync(selections, selectionUpdateType) { ErrorHelpers_1.ErrorHelpers.verifyParameter(selections, 'fieldName'); ErrorHelpers_1.ErrorHelpers.verifyEnumValue(selectionUpdateType, api_external_contract_js_1.SelectionUpdateType, 'SelectionUpdateType'); this.verifyActiveSheet(); - var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("selection-service" /* Selection */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("selection-service" /* Selection */); return service.selectMarksByIdAsync(this.visualId, selections, selectionUpdateType); - }; - WorksheetImpl.prototype.annotateMarkAsync = function (mark, annotationText) { + } + annotateMarkAsync(mark, annotationText) { ErrorHelpers_1.ErrorHelpers.verifyParameter(mark, 'mark'); this.verifyActiveSheet(); - var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("annotation-service" /* Annotation */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("annotation-service" /* Annotation */); return service.annotateMarkAsync(this.visualId, mark, annotationText); - }; - WorksheetImpl.prototype.getAnnotationsAsync = function () { + } + getAnnotationsAsync() { this.verifyActiveSheet(); - var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("annotation-service" /* Annotation */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("annotation-service" /* Annotation */); return service.getAnnotationsAsync(this.visualId); - }; - WorksheetImpl.prototype.removeAnnotationAsync = function (annotation) { + } + removeAnnotationAsync(annotation) { ErrorHelpers_1.ErrorHelpers.verifyParameter(annotation, 'annotation'); this.verifyActiveSheet(); - var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("annotation-service" /* Annotation */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("annotation-service" /* Annotation */); return service.removeAnnotationAsync(this.visualId, annotation); - }; - WorksheetImpl.prototype.appendContextMenuAsync = function (targetMenu, config) { + } + appendContextMenuAsync(targetMenu, config) { this.verifyActiveSheet(); - var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("external-context-menu-service" /* ExternalContextMenu */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("external-context-menu-service" /* ExternalContextMenu */); return service.appendContextMenuAsync(this.visualId.worksheet, targetMenu, config); - }; - WorksheetImpl.prototype.removeContextMenuAsync = function (targetMenu, menuItemId) { + } + removeContextMenuAsync(targetMenu, menuItemId) { this.verifyActiveSheet(); - var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("external-context-menu-service" /* ExternalContextMenu */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("external-context-menu-service" /* ExternalContextMenu */); return service.removeContextMenuAsync(this.visualId.worksheet, targetMenu, menuItemId); - }; - WorksheetImpl.prototype.executeContextMenuAsync = function (targetMenu, menuItemId) { + } + executeContextMenuAsync(targetMenu, menuItemId) { this.verifyActiveSheet(); - var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("external-context-menu-service" /* ExternalContextMenu */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("external-context-menu-service" /* ExternalContextMenu */); return service.executeContextMenuAsync(this.visualId.worksheet, targetMenu, menuItemId); - }; - WorksheetImpl.prototype.renameContextMenuAsync = function (targetMenu, menuHeader, menuDescription) { + } + renameContextMenuAsync(targetMenu, menuHeader, menuDescription) { this.verifyActiveSheet(); - var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("external-context-menu-service" /* ExternalContextMenu */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("external-context-menu-service" /* ExternalContextMenu */); return service.renameContextMenuAsync(this.visualId.worksheet, targetMenu, menuHeader, menuDescription); - }; - WorksheetImpl.prototype.hoverTupleAsync = function (hoveredTuple, tooltip, allowHoverActions) { + } + hoverTupleAsync(hoveredTuple, tooltip, allowHoverActions) { if (this.isInsideDashboardExtension()) { - return Promise.reject(new TableauError_1.TableauError(Contract.SharedErrorCodes.ImplementationError, "hoverTupleAsync is not supported in dashboard extensions")); + return Promise.reject(new TableauError_1.TableauError(Contract.SharedErrorCodes.ImplementationError, `hoverTupleAsync is not supported in dashboard extensions`)); } - var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("selection-service" /* Selection */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("selection-service" /* Selection */); return service.hoverTupleAsync(this.visualId, hoveredTuple, tooltip, allowHoverActions); - }; - WorksheetImpl.prototype.selectTuplesAsync = function (selectedTuples, selectOption, tooltip) { + } + selectTuplesAsync(selectedTuples, selectOption, tooltip) { if (this.isInsideDashboardExtension()) { - return Promise.reject(new TableauError_1.TableauError(Contract.SharedErrorCodes.ImplementationError, "selectTuplesAsync is not supported in dashboard extensions")); + return Promise.reject(new TableauError_1.TableauError(Contract.SharedErrorCodes.ImplementationError, `selectTuplesAsync is not supported in dashboard extensions`)); } - var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("selection-service" /* Selection */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("selection-service" /* Selection */); return service.selectTuplesAsync(this.visualId, selectedTuples, selectOption, tooltip); - }; - WorksheetImpl.prototype.getTooltipTextAsync = function (tupleId) { + } + getTooltipTextAsync(tupleId) { if (this.isInsideDashboardExtension()) { - return Promise.reject(new TableauError_1.TableauError(Contract.SharedErrorCodes.ImplementationError, "getTooltipTextAsync is not supported in dashboard extensions")); + return Promise.reject(new TableauError_1.TableauError(Contract.SharedErrorCodes.ImplementationError, `getTooltipTextAsync is not supported in dashboard extensions`)); } - var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("accessibility" /* Accessibility */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("accessibility" /* Accessibility */); return service.getTooltipTextAsync(this.visualId, tupleId); - }; - WorksheetImpl.prototype.leaveMarkNavigationAsync = function () { + } + leaveMarkNavigationAsync() { if (this.isInsideDashboardExtension()) { - return Promise.reject(new TableauError_1.TableauError(Contract.SharedErrorCodes.ImplementationError, "leaveMarkNavigationAsync is not supported in dashboard extensions")); + return Promise.reject(new TableauError_1.TableauError(Contract.SharedErrorCodes.ImplementationError, `leaveMarkNavigationAsync is not supported in dashboard extensions`)); } - var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("accessibility" /* Accessibility */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("accessibility" /* Accessibility */); return service.leaveMarkNavigationAsync(this.visualId); - }; - WorksheetImpl.prototype.editAliasesDialogAsync = function (fieldName) { - var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("visual-model-service" /* VisualModel */); + } + editAliasesDialogAsync(fieldName) { + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("visual-model-service" /* VisualModel */); return service.editAliasesDialogAsync(fieldName); - }; - WorksheetImpl.prototype.createDataSourceFromInfo = function (dataSourceInfo) { - var dataSourceImpl = new DataSourceImpl_1.DataSourceImpl(dataSourceInfo, this._registryId); - var dataSource = new DataSource_1.DataSource(dataSourceImpl); + } + createDataSourceFromInfo(dataSourceInfo) { + const dataSourceImpl = new DataSourceImpl_1.DataSourceImpl(dataSourceInfo, this._registryId); + const dataSource = new DataSource_1.DataSource(dataSourceImpl); dataSourceImpl.initializeWithPublicInterfaces(dataSource); return dataSource; - }; - WorksheetImpl.prototype.verifyActiveSheet = function () { - var isRootAndActiveWorksheet = this.active; - var isInsideActiveDashboard = this.isInsideActiveDashboard(); - var isInsideActiveStoryPoint = this.isInsideActiveStoryPoint(); + } + verifyActiveSheet() { + const isRootAndActiveWorksheet = this.active; + const isInsideActiveDashboard = this.isInsideActiveDashboard(); + const isInsideActiveStoryPoint = this.isInsideActiveStoryPoint(); if (!isRootAndActiveWorksheet && !isInsideActiveDashboard && !isInsideActiveStoryPoint) { throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.NotActiveSheet, 'Operation not allowed on non-active sheet'); } - }; - WorksheetImpl.prototype.isInsideActiveStoryPoint = function () { + } + isInsideActiveStoryPoint() { return this._parentStoryPointImpl && this._parentStoryPointImpl.active; - }; - WorksheetImpl.prototype.isInsideActiveDashboard = function () { + } + isInsideActiveDashboard() { return this._parentDashboardImpl && this._parentDashboardImpl.active; - }; - WorksheetImpl.prototype.isInsideDashboardExtension = function () { + } + isInsideDashboardExtension() { return this._parentDashboardImpl !== null; - }; - return WorksheetImpl; -}(SheetImpl_1.SheetImpl)); + } +} exports.WorksheetImpl = WorksheetImpl; @@ -14555,26 +8183,17 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); * Implementation of a logical table. * This does not follow the Impl pattern as it is just a property bag. */ -var LogicalTable = /** @class */ (function () { - function LogicalTable(_logicalTable) { +class LogicalTable { + constructor(_logicalTable) { this._logicalTable = _logicalTable; } - Object.defineProperty(LogicalTable.prototype, "id", { - get: function () { - return this._logicalTable.id; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(LogicalTable.prototype, "caption", { - get: function () { - return this._logicalTable.caption; - }, - enumerable: true, - configurable: true - }); - return LogicalTable; -}()); + get id() { + return this._logicalTable.id; + } + get caption() { + return this._logicalTable.caption; + } +} exports.LogicalTable = LogicalTable; @@ -14589,13 +8208,12 @@ exports.LogicalTable = LogicalTable; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -var TooltipTextRequestModel = /** @class */ (function () { - function TooltipTextRequestModel(visualIdPresModel, tupleId) { +class TooltipTextRequestModel { + constructor(visualIdPresModel, tupleId) { this.visualIdPresModel = visualIdPresModel; this.tupleId = tupleId; } - return TooltipTextRequestModel; -}()); +} exports.TooltipTextRequestModel = TooltipTextRequestModel; @@ -14605,366 +8223,216 @@ exports.TooltipTextRequestModel = TooltipTextRequestModel; /*!*****************************************************************!*\ !*** ../api-shared-js/lib/src/ApiShared/Models/FilterModels.js ***! \*****************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; -var __extends = (this && this.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); Object.defineProperty(exports, "__esModule", ({ value: true })); -var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -var ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); -var ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); -var Filter = /** @class */ (function () { - function Filter(_worksheetName, _fieldName, _filterType, _fieldId, _registryId) { +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); +const ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +class Filter { + constructor(_worksheetName, _fieldName, _filterType, _fieldId, _registryId) { this._worksheetName = _worksheetName; this._fieldName = _fieldName; this._filterType = _filterType; this._fieldId = _fieldId; this._registryId = _registryId; } - Object.defineProperty(Filter.prototype, "worksheetName", { - get: function () { - return this._worksheetName; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Filter.prototype, "fieldName", { - get: function () { - return this._fieldName; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Filter.prototype, "fieldId", { - get: function () { - return this._fieldId; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Filter.prototype, "filterType", { - get: function () { - return this._filterType; - }, - enumerable: true, - configurable: true - }); - Filter.prototype.getFieldAsync = function () { - var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */); + get worksheetName() { + return this._worksheetName; + } + get fieldName() { + return this._fieldName; + } + get fieldId() { + return this._fieldId; + } + get filterType() { + return this._filterType; + } + getFieldAsync() { + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */); return service.getFieldAsync(this._fieldId); - }; - Filter.prototype.getAppliedWorksheetsAsync = function () { - var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + } + getAppliedWorksheetsAsync() { + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); return service.getAppliedWorksheetsAsync(this._worksheetName, this._fieldId); - }; - Filter.prototype.setAppliedWorksheetsAsync = function (applyToWorksheets) { + } + setAppliedWorksheetsAsync(applyToWorksheets) { ErrorHelpers_1.ErrorHelpers.verifyParameter(applyToWorksheets, 'applyToWorksheets'); - var uniqueWorksheets = new Set(applyToWorksheets); - var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + const uniqueWorksheets = new Set(applyToWorksheets); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); return service.setAppliedWorksheetsAsync(this._worksheetName, this._fieldName, this._fieldId, Array.from(uniqueWorksheets)); - }; - return Filter; -}()); + } +} exports.Filter = Filter; -var CategoricalFilter = /** @class */ (function (_super) { - __extends(CategoricalFilter, _super); - function CategoricalFilter(worksheetName, fieldName, fieldId, filterType, registryId, _appliedValues, _isExcludeMode, _isAllSelected) { - var _this = _super.call(this, worksheetName, fieldName, filterType, fieldId, registryId) || this; - _this._appliedValues = _appliedValues; - _this._isExcludeMode = _isExcludeMode; - _this._isAllSelected = _isAllSelected; - return _this; - } - Object.defineProperty(CategoricalFilter.prototype, "isAllSelected", { - get: function () { - return this._isAllSelected; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(CategoricalFilter.prototype, "appliedValues", { - get: function () { - return this._appliedValues; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(CategoricalFilter.prototype, "isExcludeMode", { - get: function () { - return this._isExcludeMode; - }, - enumerable: true, - configurable: true - }); - CategoricalFilter.prototype.getDomainAsync = function (domainType) { +class CategoricalFilter extends Filter { + constructor(worksheetName, fieldName, fieldId, filterType, registryId, _appliedValues, _isExcludeMode, _isAllSelected) { + super(worksheetName, fieldName, filterType, fieldId, registryId); + this._appliedValues = _appliedValues; + this._isExcludeMode = _isExcludeMode; + this._isAllSelected = _isAllSelected; + } + get isAllSelected() { + return this._isAllSelected; + } + get appliedValues() { + return this._appliedValues; + } + get isExcludeMode() { + return this._isExcludeMode; + } + getDomainAsync(domainType) { if (!domainType) { domainType = api_external_contract_js_1.FilterDomainType.Relevant; } ErrorHelpers_1.ErrorHelpers.verifyEnumValue(domainType, api_external_contract_js_1.FilterDomainType, 'FilterDomainType'); - var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); return service.getCategoricalDomainAsync(this._worksheetName, this._fieldId, domainType); - }; - return CategoricalFilter; -}(Filter)); + } +} exports.CategoricalFilter = CategoricalFilter; -var HierarchicalDataValue = /** @class */ (function () { - function HierarchicalDataValue(_value, _hierarchicalPath, _level) { +class HierarchicalDataValue { + constructor(_value, _hierarchicalPath, _level) { this._value = _value; this._hierarchicalPath = _hierarchicalPath; this._level = _level; } - Object.defineProperty(HierarchicalDataValue.prototype, "value", { - get: function () { - return this._value; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(HierarchicalDataValue.prototype, "hierarchicalPath", { - get: function () { - return this._hierarchicalPath; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(HierarchicalDataValue.prototype, "level", { - get: function () { - return this._level; - }, - enumerable: true, - configurable: true - }); - return HierarchicalDataValue; -}()); + get value() { + return this._value; + } + get hierarchicalPath() { + return this._hierarchicalPath; + } + get level() { + return this._level; + } +} exports.HierarchicalDataValue = HierarchicalDataValue; -var HierarchicalLevelDetail = /** @class */ (function () { - function HierarchicalLevelDetail(_name, _levelSelectionState) { +class HierarchicalLevelDetail { + constructor(_name, _levelSelectionState) { this._name = _name; this._levelSelectionState = _levelSelectionState; } - Object.defineProperty(HierarchicalLevelDetail.prototype, "name", { - get: function () { - return this._name; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(HierarchicalLevelDetail.prototype, "levelSelectionState", { - get: function () { - return this._levelSelectionState; - }, - enumerable: true, - configurable: true - }); - return HierarchicalLevelDetail; -}()); + get name() { + return this._name; + } + get levelSelectionState() { + return this._levelSelectionState; + } +} exports.HierarchicalLevelDetail = HierarchicalLevelDetail; -var HierarchicalFilter = /** @class */ (function (_super) { - __extends(HierarchicalFilter, _super); - function HierarchicalFilter(worksheetName, fieldName, fieldId, filterType, registryId, _dimensionName, _hierarchyCaption, _numberOfLevels, _levelDetails, _appliedValues, _isAllSelected) { - var _this = _super.call(this, worksheetName, fieldName, filterType, fieldId, registryId) || this; - _this._dimensionName = _dimensionName; - _this._hierarchyCaption = _hierarchyCaption; - _this._numberOfLevels = _numberOfLevels; - _this._levelDetails = _levelDetails; - _this._appliedValues = _appliedValues; - _this._isAllSelected = _isAllSelected; - return _this; - } - HierarchicalFilter.prototype.getDomainAsync = function (domainType) { +class HierarchicalFilter extends Filter { + constructor(worksheetName, fieldName, fieldId, filterType, registryId, _dimensionName, _hierarchyCaption, _numberOfLevels, _levelDetails, _appliedValues, _isAllSelected) { + super(worksheetName, fieldName, filterType, fieldId, registryId); + this._dimensionName = _dimensionName; + this._hierarchyCaption = _hierarchyCaption; + this._numberOfLevels = _numberOfLevels; + this._levelDetails = _levelDetails; + this._appliedValues = _appliedValues; + this._isAllSelected = _isAllSelected; + } + getDomainAsync(domainType) { throw new Error('Method not implemented.'); - }; - Object.defineProperty(HierarchicalFilter.prototype, "dimensionName", { - get: function () { - return this._dimensionName; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(HierarchicalFilter.prototype, "hierarchyCaption", { - get: function () { - return this._hierarchyCaption; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(HierarchicalFilter.prototype, "numberOfLevels", { - get: function () { - return this._numberOfLevels; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(HierarchicalFilter.prototype, "levelDetails", { - get: function () { - return this._levelDetails; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(HierarchicalFilter.prototype, "isAllSelected", { - get: function () { - return this._isAllSelected; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(HierarchicalFilter.prototype, "appliedValues", { - get: function () { - return this._appliedValues; - }, - enumerable: true, - configurable: true - }); - return HierarchicalFilter; -}(Filter)); + } + get dimensionName() { + return this._dimensionName; + } + get hierarchyCaption() { + return this._hierarchyCaption; + } + get numberOfLevels() { + return this._numberOfLevels; + } + get levelDetails() { + return this._levelDetails; + } + get isAllSelected() { + return this._isAllSelected; + } + get appliedValues() { + return this._appliedValues; + } +} exports.HierarchicalFilter = HierarchicalFilter; -var RangeFilter = /** @class */ (function (_super) { - __extends(RangeFilter, _super); - function RangeFilter(worksheetName, fieldName, fieldId, filterType, registryId, _min, _max, _includeNullValues) { - var _this = _super.call(this, worksheetName, fieldName, filterType, fieldId, registryId) || this; - _this._min = _min; - _this._max = _max; - _this._includeNullValues = _includeNullValues; - return _this; - } - Object.defineProperty(RangeFilter.prototype, "minValue", { - get: function () { - return this._min; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(RangeFilter.prototype, "maxValue", { - get: function () { - return this._max; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(RangeFilter.prototype, "includeNullValues", { - get: function () { - return this._includeNullValues; - }, - enumerable: true, - configurable: true - }); - RangeFilter.prototype.getDomainAsync = function (domainType) { - var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); +class RangeFilter extends Filter { + constructor(worksheetName, fieldName, fieldId, filterType, registryId, _min, _max, _includeNullValues) { + super(worksheetName, fieldName, filterType, fieldId, registryId); + this._min = _min; + this._max = _max; + this._includeNullValues = _includeNullValues; + } + get minValue() { + return this._min; + } + get maxValue() { + return this._max; + } + get includeNullValues() { + return this._includeNullValues; + } + getDomainAsync(domainType) { + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); if (!domainType) { domainType = api_external_contract_js_1.FilterDomainType.Relevant; } ErrorHelpers_1.ErrorHelpers.verifyEnumValue(domainType, api_external_contract_js_1.FilterDomainType, 'FilterDomainType'); return service.getRangeDomainAsync(this._worksheetName, this._fieldId, domainType); - }; - return RangeFilter; -}(Filter)); + } +} exports.RangeFilter = RangeFilter; -var RelativeDateFilter = /** @class */ (function (_super) { - __extends(RelativeDateFilter, _super); - function RelativeDateFilter(worksheetName, fieldName, fieldId, filterType, registryId, _anchorDate, _periodType, _rangeType, _rangeN) { - var _this = _super.call(this, worksheetName, fieldName, filterType, fieldId, registryId) || this; - _this._anchorDate = _anchorDate; - _this._periodType = _periodType; - _this._rangeType = _rangeType; - _this._rangeN = _rangeN; - return _this; - } - Object.defineProperty(RelativeDateFilter.prototype, "anchorDate", { - get: function () { - return this._anchorDate; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(RelativeDateFilter.prototype, "periodType", { - get: function () { - return this._periodType; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(RelativeDateFilter.prototype, "rangeType", { - get: function () { - return this._rangeType; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(RelativeDateFilter.prototype, "rangeN", { - get: function () { - return this._rangeN; - }, - enumerable: true, - configurable: true - }); - return RelativeDateFilter; -}(Filter)); +class RelativeDateFilter extends Filter { + constructor(worksheetName, fieldName, fieldId, filterType, registryId, _anchorDate, _periodType, _rangeType, _rangeN) { + super(worksheetName, fieldName, filterType, fieldId, registryId); + this._anchorDate = _anchorDate; + this._periodType = _periodType; + this._rangeType = _rangeType; + this._rangeN = _rangeN; + } + get anchorDate() { + return this._anchorDate; + } + get periodType() { + return this._periodType; + } + get rangeType() { + return this._rangeType; + } + get rangeN() { + return this._rangeN; + } +} exports.RelativeDateFilter = RelativeDateFilter; -var CategoricalDomain = /** @class */ (function () { - function CategoricalDomain(_values, _domainType) { +class CategoricalDomain { + constructor(_values, _domainType) { this._values = _values; this._domainType = _domainType; } - Object.defineProperty(CategoricalDomain.prototype, "values", { - get: function () { - return this._values; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(CategoricalDomain.prototype, "type", { - get: function () { - return this._domainType; - }, - enumerable: true, - configurable: true - }); - return CategoricalDomain; -}()); + get values() { + return this._values; + } + get type() { + return this._domainType; + } +} exports.CategoricalDomain = CategoricalDomain; -var RangeDomain = /** @class */ (function () { - function RangeDomain(_min, _max, _domainType) { +class RangeDomain { + constructor(_min, _max, _domainType) { this._min = _min; this._max = _max; this._domainType = _domainType; } - Object.defineProperty(RangeDomain.prototype, "type", { - get: function () { - return this._domainType; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(RangeDomain.prototype, "min", { - get: function () { - return this._min; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(RangeDomain.prototype, "max", { - get: function () { - return this._max; - }, - enumerable: true, - configurable: true - }); - return RangeDomain; -}()); + get type() { + return this._domainType; + } + get min() { + return this._min; + } + get max() { + return this._max; + } +} exports.RangeDomain = RangeDomain; @@ -14979,8 +8447,8 @@ exports.RangeDomain = RangeDomain; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -var DataTable = /** @class */ (function () { - function DataTable(_data, _columns, _totalRowCount, _isTotalRowCountLimited, _isSummaryData, _marksInfo) { +class DataTable { + constructor(_data, _columns, _totalRowCount, _isTotalRowCountLimited, _isSummaryData, _marksInfo) { this._data = _data; this._columns = _columns; this._totalRowCount = _totalRowCount; @@ -14989,180 +8457,96 @@ var DataTable = /** @class */ (function () { this._marksInfo = _marksInfo; this._name = _isSummaryData ? 'Summary Data Table' : 'Underlying Data Table'; } - Object.defineProperty(DataTable.prototype, "name", { - get: function () { - return this._name; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DataTable.prototype, "data", { - get: function () { - return this._data; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DataTable.prototype, "columns", { - get: function () { - return this._columns; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DataTable.prototype, "marksInfo", { - get: function () { - return this._marksInfo; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DataTable.prototype, "totalRowCount", { - get: function () { - return this._totalRowCount; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DataTable.prototype, "isTotalRowCountLimited", { - get: function () { - return this._isTotalRowCountLimited; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DataTable.prototype, "isSummaryData", { - get: function () { - return this._isSummaryData; - }, - enumerable: true, - configurable: true - }); - return DataTable; -}()); + get name() { + return this._name; + } + get data() { + return this._data; + } + get columns() { + return this._columns; + } + get marksInfo() { + return this._marksInfo; + } + get totalRowCount() { + return this._totalRowCount; + } + get isTotalRowCountLimited() { + return this._isTotalRowCountLimited; + } + get isSummaryData() { + return this._isSummaryData; + } +} exports.DataTable = DataTable; -var MarkInfo = /** @class */ (function () { - function MarkInfo(_type, _color, _tupleId) { +class MarkInfo { + constructor(_type, _color, _tupleId) { this._type = _type; this._color = _color; this._tupleId = _tupleId; } - Object.defineProperty(MarkInfo.prototype, "type", { - get: function () { - return this._type; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(MarkInfo.prototype, "color", { - get: function () { - return this._color; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(MarkInfo.prototype, "tupleId", { - get: function () { - return this._tupleId; - }, - enumerable: true, - configurable: true - }); - return MarkInfo; -}()); + get type() { + return this._type; + } + get color() { + return this._color; + } + get tupleId() { + return this._tupleId; + } +} exports.MarkInfo = MarkInfo; -var Column = /** @class */ (function () { - function Column(_fieldName, _fieldId, _dataType, _isReferenced, _index) { +class Column { + constructor(_fieldName, _fieldId, _dataType, _isReferenced, _index) { this._fieldName = _fieldName; this._fieldId = _fieldId; this._dataType = _dataType; this._isReferenced = _isReferenced; this._index = _index; } - Object.defineProperty(Column.prototype, "fieldName", { - get: function () { - return this._fieldName; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Column.prototype, "fieldId", { - get: function () { - return this._fieldId; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Column.prototype, "dataType", { - get: function () { - return this._dataType; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Column.prototype, "isReferenced", { - get: function () { - return this._isReferenced; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Column.prototype, "index", { - get: function () { - return this._index; - }, - enumerable: true, - configurable: true - }); - return Column; -}()); + get fieldName() { + return this._fieldName; + } + get fieldId() { + return this._fieldId; + } + get dataType() { + return this._dataType; + } + get isReferenced() { + return this._isReferenced; + } + get index() { + return this._index; + } +} exports.Column = Column; -var DataValue = /** @class */ (function () { +class DataValue { /* tslint:disable:no-any */ - function DataValue(_value, _nativeValue, _formattedValue, _aliasValue, _hasAlias) { + constructor(_value, _nativeValue, _formattedValue, _aliasValue, _hasAlias) { this._value = _value; this._nativeValue = _nativeValue; this._formattedValue = _formattedValue; this._aliasValue = _aliasValue; this._hasAlias = _hasAlias; } - Object.defineProperty(DataValue.prototype, "value", { - get: function () { - return this._value; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DataValue.prototype, "nativeValue", { - get: function () { - return this._nativeValue; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DataValue.prototype, "formattedValue", { - get: function () { - return this._formattedValue; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DataValue.prototype, "aliasValue", { - get: function () { - return this._aliasValue; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DataValue.prototype, "hasAlias", { - get: function () { - return this._hasAlias; - }, - enumerable: true, - configurable: true - }); - return DataValue; -}()); + get value() { + return this._value; + } + get nativeValue() { + return this._nativeValue; + } + get formattedValue() { + return this._formattedValue; + } + get aliasValue() { + return this._aliasValue; + } + get hasAlias() { + return this._hasAlias; + } +} exports.DataValue = DataValue; @@ -15185,112 +8569,60 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; -var __generator = (this && this.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -}; Object.defineProperty(exports, "__esModule", ({ value: true })); -var ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); -var ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); -var DataTableReader = /** @class */ (function () { - function DataTableReader(_id, _totalRowCount, _pageRowCount, _registryId) { +const ServiceRegistry_1 = __webpack_require__(/*! ../Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); +const ErrorHelpers_1 = __webpack_require__(/*! ../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +class DataTableReader { + constructor(_id, _totalRowCount, _pageRowCount, _registryId) { this._id = _id; this._totalRowCount = _totalRowCount; this._pageRowCount = _pageRowCount; this._registryId = _registryId; this._pageCount = Math.ceil(_totalRowCount / _pageRowCount); } - Object.defineProperty(DataTableReader.prototype, "totalRowCount", { - get: function () { - return this._totalRowCount; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(DataTableReader.prototype, "pageCount", { - get: function () { - return this._pageCount; - }, - enumerable: true, - configurable: true - }); - DataTableReader.prototype.getPageAsync = function (pageNumber) { + get totalRowCount() { + return this._totalRowCount; + } + get pageCount() { + return this._pageCount; + } + getPageAsync(pageNumber) { ErrorHelpers_1.ErrorHelpers.verifyRange(pageNumber, 0, this._pageCount); - var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); return service.getPageAsync(this._id, pageNumber, this._pageRowCount); - }; - DataTableReader.prototype.getAllPagesAsync = function (maxRows) { - return __awaiter(this, void 0, void 0, function () { - var firstPage, rowsRequested, pagesRequested, pagesToFetch, isDataLimited, remainingData, i, page, fullData; - var _a; - return __generator(this, function (_b) { - switch (_b.label) { - case 0: return [4 /*yield*/, this.getPageAsync(0)]; - case 1: - firstPage = _b.sent(); - maxRows = maxRows || this.totalRowCount; - rowsRequested = Math.min(maxRows, this.totalRowCount); - pagesRequested = Math.ceil(rowsRequested / this._pageRowCount); - pagesToFetch = Math.min(pagesRequested, 400); - isDataLimited = pagesToFetch < pagesRequested; - remainingData = []; - i = 1; - _b.label = 2; - case 2: - if (!(i < pagesToFetch)) return [3 /*break*/, 5]; - return [4 /*yield*/, this.getPageAsync(i)]; - case 3: - page = _b.sent(); - remainingData.push(page.data); - _b.label = 4; - case 4: - i++; - return [3 /*break*/, 2]; - case 5: - fullData = (_a = firstPage.data).concat.apply(_a, remainingData); - // This slices the array only if maxRows has been set and is less than totalRowCount - fullData.length = rowsRequested; - return [2 /*return*/, { - name: firstPage.name, - data: fullData, - columns: firstPage.columns, - totalRowCount: isDataLimited ? pagesToFetch * this._pageRowCount : rowsRequested, - isTotalRowCountLimited: isDataLimited, - isSummaryData: firstPage.isSummaryData, - }]; - } - }); + } + getAllPagesAsync(maxRows) { + return __awaiter(this, void 0, void 0, function* () { + const firstPage = yield this.getPageAsync(0); + maxRows = maxRows || this.totalRowCount; + const rowsRequested = Math.min(maxRows, this.totalRowCount); + const pagesRequested = Math.ceil(rowsRequested / this._pageRowCount); + // Fetch up to 400 pages, with a default of 10,000 pageRowCount that gives us 4,000,000 rows + const pagesToFetch = Math.min(pagesRequested, 400); + const isDataLimited = pagesToFetch < pagesRequested; + let remainingData = []; + for (let i = 1; i < pagesToFetch; i++) { + const page = yield this.getPageAsync(i); + remainingData.push(page.data); + } + let fullData = firstPage.data.concat(...remainingData); + // This slices the array only if maxRows has been set and is less than totalRowCount + fullData.length = rowsRequested; + return { + name: firstPage.name, + data: fullData, + columns: firstPage.columns, + totalRowCount: isDataLimited ? pagesToFetch * this._pageRowCount : rowsRequested, + isTotalRowCountLimited: isDataLimited, + isSummaryData: firstPage.isSummaryData, + }; }); - }; - DataTableReader.prototype.releaseAsync = function () { - var service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + } + releaseAsync() { + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); return service.releaseAsync(this._id); - }; - return DataTableReader; -}()); + } +} exports.DataTableReader = DataTableReader; @@ -15300,121 +8632,82 @@ exports.DataTableReader = DataTableReader; /*!********************************************************************!*\ !*** ../api-shared-js/lib/src/ApiShared/Models/SelectionModels.js ***! \********************************************************************/ -/***/ (function(__unused_webpack_module, exports) { +/***/ ((__unused_webpack_module, exports) => { "use strict"; -var __extends = (this && this.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); Object.defineProperty(exports, "__esModule", ({ value: true })); /** * Selection Model. */ -var SelectionModel = /** @class */ (function () { - function SelectionModel() { - } - return SelectionModel; -}()); +class SelectionModel { +} exports.SelectionModel = SelectionModel; /** * Value based selection model. Meant for hierarchical, range and categorical selections. */ -var ValueSelectionModel = /** @class */ (function (_super) { - __extends(ValueSelectionModel, _super); - function ValueSelectionModel() { - var _this = _super !== null && _super.apply(this, arguments) || this; - _this.selectValues = []; - return _this; - } - return ValueSelectionModel; -}(SelectionModel)); +class ValueSelectionModel extends SelectionModel { + constructor() { + super(...arguments); + this.selectValues = []; + } +} exports.ValueSelectionModel = ValueSelectionModel; /** * Hierarchical value selection model */ -var HierarchicalSelectionModel = /** @class */ (function (_super) { - __extends(HierarchicalSelectionModel, _super); - function HierarchicalSelectionModel() { - return _super !== null && _super.apply(this, arguments) || this; - } - return HierarchicalSelectionModel; -}(ValueSelectionModel)); +class HierarchicalSelectionModel extends ValueSelectionModel { +} exports.HierarchicalSelectionModel = HierarchicalSelectionModel; /** * Range based value selection model */ -var RangeSelectionModel = /** @class */ (function (_super) { - __extends(RangeSelectionModel, _super); - function RangeSelectionModel() { - return _super !== null && _super.apply(this, arguments) || this; - } - return RangeSelectionModel; -}(SelectionModel)); +class RangeSelectionModel extends SelectionModel { +} exports.RangeSelectionModel = RangeSelectionModel; /** * Dimension value selection model */ -var DimensionSelectionModel = /** @class */ (function (_super) { - __extends(DimensionSelectionModel, _super); - function DimensionSelectionModel() { - return _super !== null && _super.apply(this, arguments) || this; - } - return DimensionSelectionModel; -}(ValueSelectionModel)); +class DimensionSelectionModel extends ValueSelectionModel { +} exports.DimensionSelectionModel = DimensionSelectionModel; /** * Tuple based selection model */ -var TupleSelectionModel = /** @class */ (function () { - function TupleSelectionModel() { +class TupleSelectionModel { + constructor() { this.objectIds = []; } - return TupleSelectionModel; -}()); +} exports.TupleSelectionModel = TupleSelectionModel; /** * Container class to populate all the selection models when parsing input */ -var SelectionModelsContainer = /** @class */ (function () { - function SelectionModelsContainer() { +class SelectionModelsContainer { + constructor() { this.hierModelArr = []; this.dimModelArr = []; this.quantModelArr = []; } - return SelectionModelsContainer; -}()); +} exports.SelectionModelsContainer = SelectionModelsContainer; -var SelectTuplesInteractionModel = /** @class */ (function () { - function SelectTuplesInteractionModel(visualIdPresModel, tupleIds, selectOptions, tooltipContext) { - if (tupleIds === void 0) { tupleIds = []; } +class SelectTuplesInteractionModel { + constructor(visualIdPresModel, tupleIds = [], selectOptions, tooltipContext) { this.visualIdPresModel = visualIdPresModel; this.tupleIds = tupleIds; this.selectOptions = selectOptions; this.tooltipContext = tooltipContext; } - return SelectTuplesInteractionModel; -}()); +} exports.SelectTuplesInteractionModel = SelectTuplesInteractionModel; -var HoverTupleInteractionModel = /** @class */ (function () { - function HoverTupleInteractionModel(visualIdPresModel, tupleId, tooltipContext, allowHoverActions) { +class HoverTupleInteractionModel { + constructor(visualIdPresModel, tupleId, tooltipContext, allowHoverActions) { this.visualIdPresModel = visualIdPresModel; this.tupleId = tupleId; this.tooltipContext = tooltipContext; this.allowHoverActions = allowHoverActions; } - return HoverTupleInteractionModel; -}()); +} exports.HoverTupleInteractionModel = HoverTupleInteractionModel; @@ -15429,27 +8722,18 @@ exports.HoverTupleInteractionModel = HoverTupleInteractionModel; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -var Point = /** @class */ (function () { - function Point(_x, _y) { +class Point { + constructor(_x, _y) { this._x = _x; this._y = _y; } - Object.defineProperty(Point.prototype, "x", { - get: function () { - return this._x; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Point.prototype, "y", { - get: function () { - return this._y; - }, - enumerable: true, - configurable: true - }); - return Point; -}()); + get x() { + return this._x; + } + get y() { + return this._y; + } +} exports.Point = Point; @@ -15485,22 +8769,22 @@ var GetDataType; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -var ServiceRegistry_1 = __webpack_require__(/*! ./ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); -var AccessibilityServiceImpl_1 = __webpack_require__(/*! ./impl/AccessibilityServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/AccessibilityServiceImpl.js"); -var AnimationServiceImpl_1 = __webpack_require__(/*! ./impl/AnimationServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/AnimationServiceImpl.js"); -var AnnotationServiceImpl_1 = __webpack_require__(/*! ./impl/AnnotationServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/AnnotationServiceImpl.js"); -var DataSourceServiceImpl_1 = __webpack_require__(/*! ./impl/DataSourceServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/DataSourceServiceImpl.js"); -var ExportServiceImpl_1 = __webpack_require__(/*! ./impl/ExportServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/ExportServiceImpl.js"); -var ExternalContextMenuServiceImpl_1 = __webpack_require__(/*! ./impl/ExternalContextMenuServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/ExternalContextMenuServiceImpl.js"); -var FilterServiceImpl_1 = __webpack_require__(/*! ./impl/FilterServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/FilterServiceImpl.js"); -var GetDataServiceImpl_1 = __webpack_require__(/*! ./impl/GetDataServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/GetDataServiceImpl.js"); -var NotificationServiceImpl_1 = __webpack_require__(/*! ./impl/NotificationServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImpl.js"); -var ParametersServiceImpl_1 = __webpack_require__(/*! ./impl/ParametersServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/ParametersServiceImpl.js"); -var SelectionServiceImpl_1 = __webpack_require__(/*! ./impl/SelectionServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/SelectionServiceImpl.js"); -var SizeServiceImpl_1 = __webpack_require__(/*! ./impl/SizeServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/SizeServiceImpl.js"); -var VisualModelServiceImpl_1 = __webpack_require__(/*! ./impl/VisualModelServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/VisualModelServiceImpl.js"); -var VizServiceImpl_1 = __webpack_require__(/*! ./impl/VizServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/VizServiceImpl.js"); -var ZoneServiceImpl_1 = __webpack_require__(/*! ./impl/ZoneServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/ZoneServiceImpl.js"); +const ServiceRegistry_1 = __webpack_require__(/*! ./ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"); +const AccessibilityServiceImpl_1 = __webpack_require__(/*! ./impl/AccessibilityServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/AccessibilityServiceImpl.js"); +const AnimationServiceImpl_1 = __webpack_require__(/*! ./impl/AnimationServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/AnimationServiceImpl.js"); +const AnnotationServiceImpl_1 = __webpack_require__(/*! ./impl/AnnotationServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/AnnotationServiceImpl.js"); +const DataSourceServiceImpl_1 = __webpack_require__(/*! ./impl/DataSourceServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/DataSourceServiceImpl.js"); +const ExportServiceImpl_1 = __webpack_require__(/*! ./impl/ExportServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/ExportServiceImpl.js"); +const ExternalContextMenuServiceImpl_1 = __webpack_require__(/*! ./impl/ExternalContextMenuServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/ExternalContextMenuServiceImpl.js"); +const FilterServiceImpl_1 = __webpack_require__(/*! ./impl/FilterServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/FilterServiceImpl.js"); +const GetDataServiceImpl_1 = __webpack_require__(/*! ./impl/GetDataServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/GetDataServiceImpl.js"); +const NotificationServiceImpl_1 = __webpack_require__(/*! ./impl/NotificationServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImpl.js"); +const ParametersServiceImpl_1 = __webpack_require__(/*! ./impl/ParametersServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/ParametersServiceImpl.js"); +const SelectionServiceImpl_1 = __webpack_require__(/*! ./impl/SelectionServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/SelectionServiceImpl.js"); +const SizeServiceImpl_1 = __webpack_require__(/*! ./impl/SizeServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/SizeServiceImpl.js"); +const VisualModelServiceImpl_1 = __webpack_require__(/*! ./impl/VisualModelServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/VisualModelServiceImpl.js"); +const VizServiceImpl_1 = __webpack_require__(/*! ./impl/VizServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/VizServiceImpl.js"); +const ZoneServiceImpl_1 = __webpack_require__(/*! ./impl/ZoneServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/ZoneServiceImpl.js"); function registerAllSharedServices(dispatcher, registryId) { ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new AnimationServiceImpl_1.AnimationServiceImpl(dispatcher, registryId)); ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new DataSourceServiceImpl_1.DataSourceServiceImpl(dispatcher, registryId)); @@ -15532,26 +8816,25 @@ exports.registerAllSharedServices = registerAllSharedServices; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -var TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); if (typeof window !== 'undefined') { window.__tableauApiServiceRegistry = window.__tableauApiServiceRegistry || {}; } -var ServiceRegistryImpl = /** @class */ (function () { - function ServiceRegistryImpl() { +class ServiceRegistryImpl { + constructor() { this._services = {}; } - ServiceRegistryImpl.prototype.registerService = function (service) { + registerService(service) { this._services[service.serviceName] = service; - }; - ServiceRegistryImpl.prototype.getService = function (serviceName) { + } + getService(serviceName) { if (!this._services.hasOwnProperty(serviceName)) { - throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, "Service not registered: " + serviceName); + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, `Service not registered: ${serviceName}`); } return this._services[serviceName]; - }; - return ServiceRegistryImpl; -}()); + } +} /** * Static class used for getting access to the single instance * of the ApiServiceRegistry associated with the registryId. @@ -15563,14 +8846,11 @@ var ServiceRegistryImpl = /** @class */ (function () { * An example of how window.__tableauApiServiceRegistry will look when there are two vizzes: { 0 : ServiceRegistry, 1 : ServiceRegistry} * where registry ID of 0 & 1 refers to viz's internal identifier (which is generated by VizManager). */ -var ApiServiceRegistry = /** @class */ (function () { - // Private to avoid anyone constructing this - function ApiServiceRegistry() { - } +class ApiServiceRegistry { /** * Gets the singleton instance of the ServiceRegistry */ - ApiServiceRegistry.get = function (registryId) { + static get(registryId) { if (!window.__tableauApiServiceRegistry || !window.__tableauApiServiceRegistry[registryId]) { ApiServiceRegistry.setInstance(registryId, new ServiceRegistryImpl()); } @@ -15578,26 +8858,27 @@ var ApiServiceRegistry = /** @class */ (function () { throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, 'Service registry failed'); } return window.__tableauApiServiceRegistry[registryId]; - }; + } /** * Helper method that sets the service registry instance for the corresponding registryId. Can be used by unit tests * * @param {ServiceRegistry} serviceRegistry The new registry */ - ApiServiceRegistry.setInstance = function (registryId, serviceRegistry) { + static setInstance(registryId, serviceRegistry) { if (!window.__tableauApiServiceRegistry) { window.__tableauApiServiceRegistry = {}; } window.__tableauApiServiceRegistry[registryId] = serviceRegistry; - }; + } /** * Only used by unit tests */ - ApiServiceRegistry.clearRegistry = function () { + static clearRegistry() { window.__tableauApiServiceRegistry = {}; - }; - return ApiServiceRegistry; -}()); + } + // Private to avoid anyone constructing this + constructor() { } +} exports.ApiServiceRegistry = ApiServiceRegistry; @@ -15607,62 +8888,38 @@ exports.ApiServiceRegistry = ApiServiceRegistry; /*!************************************************************************************!*\ !*** ../api-shared-js/lib/src/ApiShared/Services/impl/AccessibilityServiceImpl.js ***! \************************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; -var __extends = (this && this.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); Object.defineProperty(exports, "__esModule", ({ value: true })); -var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -var AccessibilityModels_1 = __webpack_require__(/*! ../../Models/AccessibilityModels */ "../api-shared-js/lib/src/ApiShared/Models/AccessibilityModels.js"); -var ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); -var AccessibilityServiceImpl = /** @class */ (function (_super) { - __extends(AccessibilityServiceImpl, _super); - function AccessibilityServiceImpl() { - return _super !== null && _super.apply(this, arguments) || this; - } - Object.defineProperty(AccessibilityServiceImpl.prototype, "serviceName", { - get: function () { - return "accessibility" /* Accessibility */; - }, - enumerable: true, - configurable: true - }); - AccessibilityServiceImpl.prototype.getTooltipTextAsync = function (visualId, tupleId) { - var _a; - var tooltipTextRequest = new AccessibilityModels_1.TooltipTextRequestModel(visualId, tupleId); - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getTooltipTextAsync', - _a[api_internal_contract_js_1.ParameterId.TooltipTextRequest] = tooltipTextRequest, - _a); - return this.execute(api_internal_contract_js_1.VerbId.GetTooltipText, parameters).then(function (response) { +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const AccessibilityModels_1 = __webpack_require__(/*! ../../Models/AccessibilityModels */ "../api-shared-js/lib/src/ApiShared/Models/AccessibilityModels.js"); +const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +class AccessibilityServiceImpl extends ServiceImplBase_1.ServiceImplBase { + get serviceName() { + return "accessibility" /* Accessibility */; + } + getTooltipTextAsync(visualId, tupleId) { + let tooltipTextRequest = new AccessibilityModels_1.TooltipTextRequestModel(visualId, tupleId); + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getTooltipTextAsync', + [api_internal_contract_js_1.ParameterId.TooltipTextRequest]: tooltipTextRequest, + }; + return this.execute(api_internal_contract_js_1.VerbId.GetTooltipText, parameters).then((response) => { return response.result; }); - }; - AccessibilityServiceImpl.prototype.leaveMarkNavigationAsync = function (visualId) { - var _a; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'leaveMarkNavigationAsync', - _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId, - _a); - return this.execute(api_internal_contract_js_1.VerbId.RaiseLeaveMarkNavNotification, parameters).then(function (response) { + } + leaveMarkNavigationAsync(visualId) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'leaveMarkNavigationAsync', + [api_internal_contract_js_1.ParameterId.VisualId]: visualId, + }; + return this.execute(api_internal_contract_js_1.VerbId.RaiseLeaveMarkNavNotification, parameters).then((response) => { return; }); - }; - return AccessibilityServiceImpl; -}(ServiceImplBase_1.ServiceImplBase)); + } +} exports.AccessibilityServiceImpl = AccessibilityServiceImpl; @@ -15672,54 +8929,31 @@ exports.AccessibilityServiceImpl = AccessibilityServiceImpl; /*!********************************************************************************!*\ !*** ../api-shared-js/lib/src/ApiShared/Services/impl/AnimationServiceImpl.js ***! \********************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; -var __extends = (this && this.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); Object.defineProperty(exports, "__esModule", ({ value: true })); -var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -var ExternalToInternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/ExternalToInternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/ExternalToInternalEnumMappings.js"); -var ErrorHelpers_1 = __webpack_require__(/*! ../../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); -var ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); -var AnimationServiceImpl = /** @class */ (function (_super) { - __extends(AnimationServiceImpl, _super); - function AnimationServiceImpl() { - return _super !== null && _super.apply(this, arguments) || this; - } - Object.defineProperty(AnimationServiceImpl.prototype, "serviceName", { - get: function () { - return "animation-service" /* Animation */; - }, - enumerable: true, - configurable: true - }); - AnimationServiceImpl.prototype.replayAsync = function (replaySpeed) { - var _a; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.ReplaySpeed] = 1.0, - _a); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const ExternalToInternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/ExternalToInternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/ExternalToInternalEnumMappings.js"); +const ErrorHelpers_1 = __webpack_require__(/*! ../../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +class AnimationServiceImpl extends ServiceImplBase_1.ServiceImplBase { + get serviceName() { + return "animation-service" /* Animation */; + } + replayAsync(replaySpeed) { + const parameters = { + [api_internal_contract_js_1.ParameterId.ReplaySpeed]: 1.0, + }; ErrorHelpers_1.ErrorHelpers.verifyEnumValue(replaySpeed, api_external_contract_js_1.ReplaySpeedType, 'ReplaySpeedType'); parameters[api_internal_contract_js_1.ParameterId.ReplaySpeed] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.setReplaySpeedType.convert(replaySpeed); - return this.execute(api_internal_contract_js_1.VerbId.ReplayAnimation, parameters).then(function (response) { + return this.execute(api_internal_contract_js_1.VerbId.ReplayAnimation, parameters).then((response) => { return; }); - }; - return AnimationServiceImpl; -}(ServiceImplBase_1.ServiceImplBase)); + } +} exports.AnimationServiceImpl = AnimationServiceImpl; @@ -15729,42 +8963,21 @@ exports.AnimationServiceImpl = AnimationServiceImpl; /*!*********************************************************************************!*\ !*** ../api-shared-js/lib/src/ApiShared/Services/impl/AnnotationServiceImpl.js ***! \*********************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; -var __extends = (this && this.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); Object.defineProperty(exports, "__esModule", ({ value: true })); -var Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -var InternalToExternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/InternalToExternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js"); -var SelectionModels_1 = __webpack_require__(/*! ../../Models/SelectionModels */ "../api-shared-js/lib/src/ApiShared/Models/SelectionModels.js"); -var TableauError_1 = __webpack_require__(/*! ../../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); -var ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); -var AnnotationServiceImpl = /** @class */ (function (_super) { - __extends(AnnotationServiceImpl, _super); - function AnnotationServiceImpl() { - return _super !== null && _super.apply(this, arguments) || this; - } - Object.defineProperty(AnnotationServiceImpl.prototype, "serviceName", { - get: function () { - return "annotation-service" /* Annotation */; - }, - enumerable: true, - configurable: true - }); +const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const InternalToExternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/InternalToExternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js"); +const SelectionModels_1 = __webpack_require__(/*! ../../Models/SelectionModels */ "../api-shared-js/lib/src/ApiShared/Models/SelectionModels.js"); +const TableauError_1 = __webpack_require__(/*! ../../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +class AnnotationServiceImpl extends ServiceImplBase_1.ServiceImplBase { + get serviceName() { + return "annotation-service" /* Annotation */; + } /** * Method to annotate a mark on the given worksheet. * @@ -15772,70 +8985,66 @@ var AnnotationServiceImpl = /** @class */ (function (_super) { * @param mark * @param annotationText */ - AnnotationServiceImpl.prototype.annotateMarkAsync = function (visualId, mark, annotationText) { - var _a; - var selectionModelContainer = this.parseMarkSelectionIds([mark]); - var dummyTargetPoint = { x: 0, y: 0 }; - var formattedText = "" + annotationText + ""; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'annotateMarkAsync', - _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId, - _a[api_internal_contract_js_1.ParameterId.AnnotateEnum] = api_internal_contract_js_1.AnnotateEnum.Mark, - _a[api_internal_contract_js_1.ParameterId.TargetPoint] = dummyTargetPoint, - _a[api_internal_contract_js_1.ParameterId.SelectionList] = [selectionModelContainer.selection], - _a[api_internal_contract_js_1.ParameterId.FormattedText] = formattedText, - _a); - return this.execute(api_internal_contract_js_1.VerbId.CreateAnnotation, parameters).then(function (response) { + annotateMarkAsync(visualId, mark, annotationText) { + const selectionModelContainer = this.parseMarkSelectionIds([mark]); + const dummyTargetPoint = { x: 0, y: 0 }; + const formattedText = `${annotationText}`; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'annotateMarkAsync', + [api_internal_contract_js_1.ParameterId.VisualId]: visualId, + [api_internal_contract_js_1.ParameterId.AnnotateEnum]: api_internal_contract_js_1.AnnotateEnum.Mark, + [api_internal_contract_js_1.ParameterId.TargetPoint]: dummyTargetPoint, + [api_internal_contract_js_1.ParameterId.SelectionList]: [selectionModelContainer.selection], + [api_internal_contract_js_1.ParameterId.FormattedText]: formattedText, + }; + return this.execute(api_internal_contract_js_1.VerbId.CreateAnnotation, parameters).then((response) => { // Expecting an empty model and hence the void response. return; }); - }; + } /** * Method to retrieve annotations for the given worksheet. * * @param visualId * @returns {Promise>} */ - AnnotationServiceImpl.prototype.getAnnotationsAsync = function (visualId) { - var _a; - var _this = this; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getAnnotationsAsync', - _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId, - _a); - return this.execute(api_internal_contract_js_1.VerbId.GetAnnotations, parameters).then(function (response) { - var annotationsList = response.result; - return _this.annotationFilterMap(annotationsList); + getAnnotationsAsync(visualId) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getAnnotationsAsync', + [api_internal_contract_js_1.ParameterId.VisualId]: visualId, + }; + return this.execute(api_internal_contract_js_1.VerbId.GetAnnotations, parameters).then((response) => { + const annotationsList = response.result; + return this.annotationFilterMap(annotationsList); }); - }; + } /** * Method to remove an annotation from a given worksheet. * * @param visualId * @param annotation */ - AnnotationServiceImpl.prototype.removeAnnotationAsync = function (visualId, annotation) { - var _a; - var selectionModelContainer = this.parseAnnotationSelectionIds([annotation]); - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'removeAnnotationAsync', - _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId, - _a[api_internal_contract_js_1.ParameterId.SelectionList] = [selectionModelContainer.selection], - _a); - return this.execute(api_internal_contract_js_1.VerbId.RemoveAnnotation, parameters).then(function (response) { + removeAnnotationAsync(visualId, annotation) { + const selectionModelContainer = this.parseAnnotationSelectionIds([annotation]); + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'removeAnnotationAsync', + [api_internal_contract_js_1.ParameterId.VisualId]: visualId, + [api_internal_contract_js_1.ParameterId.SelectionList]: [selectionModelContainer.selection], + }; + return this.execute(api_internal_contract_js_1.VerbId.RemoveAnnotation, parameters).then((response) => { // Expecting an empty model and hence the void response. return; }); - }; + } /** * Method to prepare the pres models for selection by MarksInfo * @param marks */ - AnnotationServiceImpl.prototype.parseMarkSelectionIds = function (marks) { - var ids = []; - var selectionModelContainer = new SelectionModels_1.SelectionModelsContainer(); - marks.forEach(function (mark) { - var tupleId = mark.tupleId; + parseMarkSelectionIds(marks) { + const ids = []; + const selectionModelContainer = new SelectionModels_1.SelectionModelsContainer(); + marks.forEach((mark) => { + const tupleId = mark.tupleId; if (tupleId !== undefined && tupleId !== null && tupleId > 0) { ids.push(tupleId.toString()); // collect the tuple ids } @@ -15845,22 +9054,22 @@ var AnnotationServiceImpl = /** @class */ (function (_super) { }); if (ids.length !== 0) { // tuple ids based selection - var tupleSelectionModel = new SelectionModels_1.TupleSelectionModel(); + const tupleSelectionModel = new SelectionModels_1.TupleSelectionModel(); tupleSelectionModel.selectionType = 'tuples'; tupleSelectionModel.objectIds = ids; selectionModelContainer.selection = tupleSelectionModel; } return selectionModelContainer; - }; + } /** * Method to prepare the pres models for selection by MarkAnnotationInfo * @param marks */ - AnnotationServiceImpl.prototype.parseAnnotationSelectionIds = function (annotations) { - var ids = []; - var selectionModelContainer = new SelectionModels_1.SelectionModelsContainer(); - annotations.forEach(function (annotation) { - var annotationId = annotation.annotationId; + parseAnnotationSelectionIds(annotations) { + const ids = []; + const selectionModelContainer = new SelectionModels_1.SelectionModelsContainer(); + annotations.forEach((annotation) => { + const annotationId = annotation.annotationId; if (annotationId !== undefined && annotationId !== null && annotationId >= 0) { ids.push(annotationId.toString()); // collect the annotation ids } @@ -15870,19 +9079,19 @@ var AnnotationServiceImpl = /** @class */ (function (_super) { }); if (ids.length !== 0) { // annotation ids based selection - var tupleSelectionModel = new SelectionModels_1.TupleSelectionModel(); + const tupleSelectionModel = new SelectionModels_1.TupleSelectionModel(); tupleSelectionModel.selectionType = 'annotations'; tupleSelectionModel.objectIds = ids; selectionModelContainer.selection = tupleSelectionModel; } return selectionModelContainer; - }; + } /** * Method to map Annotation to MarkAnnotationInfo * @param annotation * @returns {Annotation} */ - AnnotationServiceImpl.prototype.mapAnnotation = function (annotation) { + mapAnnotation(annotation) { return { annotationHTML: annotation.annotationText, annotationId: annotation.annotationId, @@ -15890,19 +9099,17 @@ var AnnotationServiceImpl = /** @class */ (function (_super) { annotationType: InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.annotationType.convert(annotation.annotateEnum), tupleId: annotation.tupleId, }; - }; + } /** * Filter the Annotations to Mark Annotations, and map them to MarkAnnotationInfo * @param annotations * @returns {Array} */ - AnnotationServiceImpl.prototype.annotationFilterMap = function (annotations) { - var _this = this; - var annotationInfos = annotations.map(function (annotation) { return _this.mapAnnotation(annotation); }); + annotationFilterMap(annotations) { + const annotationInfos = annotations.map((annotation) => this.mapAnnotation(annotation)); return annotationInfos; - }; - return AnnotationServiceImpl; -}(ServiceImplBase_1.ServiceImplBase)); + } +} exports.AnnotationServiceImpl = AnnotationServiceImpl; @@ -15912,51 +9119,28 @@ exports.AnnotationServiceImpl = AnnotationServiceImpl; /*!*********************************************************************************!*\ !*** ../api-shared-js/lib/src/ApiShared/Services/impl/ClientInfoServiceImpl.js ***! \*********************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; -var __extends = (this && this.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); Object.defineProperty(exports, "__esModule", ({ value: true })); -var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -var ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); -var ClientInfoServiceImpl = /** @class */ (function (_super) { - __extends(ClientInfoServiceImpl, _super); - function ClientInfoServiceImpl() { - return _super !== null && _super.apply(this, arguments) || this; - } - Object.defineProperty(ClientInfoServiceImpl.prototype, "serviceName", { - get: function () { - return "client-info-service" /* ClientInfo */; - }, - enumerable: true, - configurable: true - }); - ClientInfoServiceImpl.prototype.getClientInfoAsync = function () { - var _a; - var verb = api_internal_contract_js_1.VerbId.GetEmbeddingClientInfo; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getClientInfoAsync', - _a); - return this.execute(verb, parameters).then(function (response) { - var clientInfo = response.result; +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +class ClientInfoServiceImpl extends ServiceImplBase_1.ServiceImplBase { + get serviceName() { + return "client-info-service" /* ClientInfo */; + } + getClientInfoAsync() { + const verb = api_internal_contract_js_1.VerbId.GetEmbeddingClientInfo; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getClientInfoAsync', + }; + return this.execute(verb, parameters).then((response) => { + const clientInfo = response.result; return clientInfo; }); - }; - return ClientInfoServiceImpl; -}(ServiceImplBase_1.ServiceImplBase)); + } +} exports.ClientInfoServiceImpl = ClientInfoServiceImpl; @@ -15966,155 +9150,127 @@ exports.ClientInfoServiceImpl = ClientInfoServiceImpl; /*!*********************************************************************************!*\ !*** ../api-shared-js/lib/src/ApiShared/Services/impl/DataSourceServiceImpl.js ***! \*********************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; -var __extends = (this && this.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); Object.defineProperty(exports, "__esModule", ({ value: true })); -var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -var DataSource_1 = __webpack_require__(/*! ../../DataSource */ "../api-shared-js/lib/src/ApiShared/DataSource.js"); -var Field_1 = __webpack_require__(/*! ../../Field */ "../api-shared-js/lib/src/ApiShared/Field.js"); -var DataSourceImpl_1 = __webpack_require__(/*! ../../Impl/DataSourceImpl */ "../api-shared-js/lib/src/ApiShared/Impl/DataSourceImpl.js"); -var FieldImpl_1 = __webpack_require__(/*! ../../Impl/FieldImpl */ "../api-shared-js/lib/src/ApiShared/Impl/FieldImpl.js"); -var TableauError_1 = __webpack_require__(/*! ../../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); -var ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); -var DataSourceServiceImpl = /** @class */ (function (_super) { - __extends(DataSourceServiceImpl, _super); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const DataSource_1 = __webpack_require__(/*! ../../DataSource */ "../api-shared-js/lib/src/ApiShared/DataSource.js"); +const Field_1 = __webpack_require__(/*! ../../Field */ "../api-shared-js/lib/src/ApiShared/Field.js"); +const DataSourceImpl_1 = __webpack_require__(/*! ../../Impl/DataSourceImpl */ "../api-shared-js/lib/src/ApiShared/Impl/DataSourceImpl.js"); +const FieldImpl_1 = __webpack_require__(/*! ../../Impl/FieldImpl */ "../api-shared-js/lib/src/ApiShared/Impl/FieldImpl.js"); +const TableauError_1 = __webpack_require__(/*! ../../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +class DataSourceServiceImpl extends ServiceImplBase_1.ServiceImplBase { // Since Object Model is supported since Tableau 2020.2, DataSourceServiceImpl can be initialized with the // platform version when OM was supported. Once we drop support for Tableau versions <= 2020.1, all additional // code in here for Object Model can be removed. - function DataSourceServiceImpl(dispatcher, registryId) { - return _super.call(this, dispatcher, registryId) || this; - } - Object.defineProperty(DataSourceServiceImpl.prototype, "serviceName", { - get: function () { - return "data-source-service" /* DataSourceService */; - }, - enumerable: true, - configurable: true - }); - DataSourceServiceImpl.prototype.refreshAsync = function (dataSourceId) { - var _a; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'refreshAsync', - _a[api_internal_contract_js_1.ParameterId.DeltaTimeMs] = 0, - _a[api_internal_contract_js_1.ParameterId.ShouldRefreshDS] = true, - _a); + constructor(dispatcher, registryId) { + super(dispatcher, registryId); + } + get serviceName() { + return "data-source-service" /* DataSourceService */; + } + refreshAsync(dataSourceId) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'refreshAsync', + [api_internal_contract_js_1.ParameterId.DeltaTimeMs]: 0, + [api_internal_contract_js_1.ParameterId.ShouldRefreshDS]: true, + }; // On server: Not passing the datasource id will refresh all datasources. if (dataSourceId) { parameters[api_internal_contract_js_1.ParameterId.DataSourceId] = dataSourceId; } - return this.execute(api_internal_contract_js_1.VerbId.RefreshDataSource, parameters).then(function (response) { + return this.execute(api_internal_contract_js_1.VerbId.RefreshDataSource, parameters).then((response) => { return; }); - }; - DataSourceServiceImpl.prototype.getActiveTablesAsync = function (dataSourceId) { - var _a; - var joinParameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getActiveTablesAsync', - _a[api_internal_contract_js_1.ParameterId.DataSourceId] = dataSourceId, - _a); + } + getActiveTablesAsync(dataSourceId) { + const joinParameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getActiveTablesAsync', + [api_internal_contract_js_1.ParameterId.DataSourceId]: dataSourceId, + }; // Get the description of the tables used by this connection - return this.execute(api_internal_contract_js_1.VerbId.GetActiveTables, joinParameters).then(function (joinResponse) { - var tableInfos = joinResponse.result; + return this.execute(api_internal_contract_js_1.VerbId.GetActiveTables, joinParameters).then((joinResponse) => { + const tableInfos = joinResponse.result; // getActiveTables is unsupported for cubes and GA. We do not have a connection type property // available from the platform (intentionally, to reduce code churn as new connections are added). // Instead,just check if any tables are returned. This array will be empty for any non-table based datasource. if (tableInfos.tables.length === 0) { - throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.UnsupportedMethodForDataSourceType, "getActiveTables is not supported for: " + dataSourceId); + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.UnsupportedMethodForDataSourceType, `getActiveTables is not supported for: ${dataSourceId}`); } return tableInfos.tables; }); - }; - DataSourceServiceImpl.prototype.getDataSourcesAsync = function (visualId) { - var _a; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getDataSourcesAsync', - _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId, - _a); - return this.execute(api_internal_contract_js_1.VerbId.GetDataSources, parameters).then(function (response) { - var dataSchema = response.result; + } + getDataSourcesAsync(visualId) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getDataSourcesAsync', + [api_internal_contract_js_1.ParameterId.VisualId]: visualId, + }; + return this.execute(api_internal_contract_js_1.VerbId.GetDataSources, parameters).then((response) => { + const dataSchema = response.result; return dataSchema; }); - }; - DataSourceServiceImpl.prototype.getAllDataSourcesAsync = function () { - var _a; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getAllDataSourcesAsync', - _a); - return this.execute(api_internal_contract_js_1.VerbId.GetAllDataSources, parameters).then(function (response) { - var dataSchema = response.result; + } + getAllDataSourcesAsync() { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getAllDataSourcesAsync', + }; + return this.execute(api_internal_contract_js_1.VerbId.GetAllDataSources, parameters).then((response) => { + const dataSchema = response.result; return dataSchema; }); - }; - DataSourceServiceImpl.prototype.getConnectionSummariesAsync = function (dataSourceId) { - var _a; - var params = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getConnectionSummariesAsync', - _a[api_internal_contract_js_1.ParameterId.DataSourceId] = dataSourceId, - _a); + } + getConnectionSummariesAsync(dataSourceId) { + const params = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getConnectionSummariesAsync', + [api_internal_contract_js_1.ParameterId.DataSourceId]: dataSourceId, + }; // Get the description of the tables used by this connection - return this.execute(api_internal_contract_js_1.VerbId.GetConnectionDescriptionSummaries, params).then(function (response) { - var descriptionSummaries = response.result; + return this.execute(api_internal_contract_js_1.VerbId.GetConnectionDescriptionSummaries, params).then((response) => { + const descriptionSummaries = response.result; return descriptionSummaries; }); - }; - DataSourceServiceImpl.prototype.getFieldAsync = function (globalfieldName) { - var _a; - var _this = this; - var verb = api_internal_contract_js_1.VerbId.GetFieldAndDataSource; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getFieldAsync', - _a[api_internal_contract_js_1.ParameterId.FieldId] = globalfieldName, - _a); - return this.execute(verb, parameters).then(function (response) { - var dataSource = response.result[api_internal_contract_js_1.ParameterId.DataSource]; - var field = response.result[api_internal_contract_js_1.ParameterId.Field]; - return _this.convertField(field, _this.convertDataSource(dataSource)); + } + getFieldAsync(globalfieldName) { + const verb = api_internal_contract_js_1.VerbId.GetFieldAndDataSource; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getFieldAsync', + [api_internal_contract_js_1.ParameterId.FieldId]: globalfieldName, + }; + return this.execute(verb, parameters).then((response) => { + const dataSource = response.result[api_internal_contract_js_1.ParameterId.DataSource]; + const field = response.result[api_internal_contract_js_1.ParameterId.Field]; + return this.convertField(field, this.convertDataSource(dataSource)); }); - }; - DataSourceServiceImpl.prototype.getLogicalTablesAsync = function (dataSourceId) { - var _a; - var params = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getLogicalTablesAsync', - _a[api_internal_contract_js_1.ParameterId.DataSourceId] = dataSourceId, - _a); - return this.execute(api_internal_contract_js_1.VerbId.GetLogicalTables, params).then(function (response) { + } + getLogicalTablesAsync(dataSourceId) { + const params = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getLogicalTablesAsync', + [api_internal_contract_js_1.ParameterId.DataSourceId]: dataSourceId, + }; + return this.execute(api_internal_contract_js_1.VerbId.GetLogicalTables, params).then((response) => { return response.result; }); - }; - DataSourceServiceImpl.prototype.getUnderlyingTablesAsync = function (visualId) { - var _a; - var params = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getUnderlyingTablesAsync', - _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId, - _a); - return this.execute(api_internal_contract_js_1.VerbId.GetUnderlyingTables, params).then(function (response) { + } + getUnderlyingTablesAsync(visualId) { + const params = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getUnderlyingTablesAsync', + [api_internal_contract_js_1.ParameterId.VisualId]: visualId, + }; + return this.execute(api_internal_contract_js_1.VerbId.GetUnderlyingTables, params).then((response) => { return response.result; }); - }; - DataSourceServiceImpl.prototype.convertField = function (field, dataSource) { + } + convertField(field, dataSource) { return new Field_1.Field(new FieldImpl_1.FieldImpl(field, dataSource)); - }; - DataSourceServiceImpl.prototype.convertDataSource = function (dataSource) { + } + convertDataSource(dataSource) { return new DataSource_1.DataSource(new DataSourceImpl_1.DataSourceImpl(dataSource, this._registryId)); - }; - return DataSourceServiceImpl; -}(ServiceImplBase_1.ServiceImplBase)); + } +} exports.DataSourceServiceImpl = DataSourceServiceImpl; @@ -16128,19 +9284,6 @@ exports.DataSourceServiceImpl = DataSourceServiceImpl; "use strict"; -var __extends = (this && this.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { @@ -16150,193 +9293,141 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; -var __generator = (this && this.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -}; Object.defineProperty(exports, "__esModule", ({ value: true })); -var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -var ExternalToInternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/ExternalToInternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/ExternalToInternalEnumMappings.js"); -var ExportHelpers_1 = __webpack_require__(/*! ../../Utils/ExportHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ExportHelpers.js"); -var ErrorHelpers_1 = __webpack_require__(/*! ../../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); -var TableauError_1 = __webpack_require__(/*! ../../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); -var ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); -var ExportServiceImpl = /** @class */ (function (_super) { - __extends(ExportServiceImpl, _super); - function ExportServiceImpl() { - return _super !== null && _super.apply(this, arguments) || this; - } - Object.defineProperty(ExportServiceImpl.prototype, "serviceName", { - get: function () { - return "export-service" /* Export */; - }, - enumerable: true, - configurable: true - }); - ExportServiceImpl.prototype.getExportCrosstabSheetMapAsync = function (currentSheetType) { - var _a; - var verb = api_internal_contract_js_1.VerbId.GetExportCrosstabSheetMap; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getExportCrosstabSheetMapAsync', - _a[api_internal_contract_js_1.ParameterId.CurrentSheetType] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.sheetType.convert(currentSheetType), - _a); - return this.execute(verb, parameters).then(function (response) { - var result = response.result; +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const ExternalToInternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/ExternalToInternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/ExternalToInternalEnumMappings.js"); +const ExportHelpers_1 = __webpack_require__(/*! ../../Utils/ExportHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ExportHelpers.js"); +const ErrorHelpers_1 = __webpack_require__(/*! ../../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +const TableauError_1 = __webpack_require__(/*! ../../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +class ExportServiceImpl extends ServiceImplBase_1.ServiceImplBase { + get serviceName() { + return "export-service" /* Export */; + } + getExportCrosstabSheetMapAsync(currentSheetType) { + const verb = api_internal_contract_js_1.VerbId.GetExportCrosstabSheetMap; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getExportCrosstabSheetMapAsync', + [api_internal_contract_js_1.ParameterId.CurrentSheetType]: ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.sheetType.convert(currentSheetType), + }; + return this.execute(verb, parameters).then((response) => { + const result = response.result; return result; }); - }; - ExportServiceImpl.prototype.exportCrosstabAsync = function (sheetName, format, exportableWorksheetNames, currentSheetType) { - return __awaiter(this, void 0, void 0, function () { - var sheetNameToIdMap, parameters, verb; - var _a; - return __generator(this, function (_b) { - switch (_b.label) { - case 0: - ErrorHelpers_1.ErrorHelpers.verifySheetName(exportableWorksheetNames, sheetName); - ErrorHelpers_1.ErrorHelpers.verifyEnumValue(format, api_external_contract_js_1.CrosstabFileFormat, 'CrosstabFileFormat'); - return [4 /*yield*/, this.getExportCrosstabSheetMapAsync(currentSheetType)]; - case 1: - sheetNameToIdMap = _b.sent(); - if (!sheetNameToIdMap[sheetName]) { - throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, 'missing sheet doc id from sheetMap'); - } - parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'exportCrosstabAsync', - _a[api_internal_contract_js_1.ParameterId.SheetIdentifier] = sheetNameToIdMap[sheetName], - _a[api_internal_contract_js_1.ParameterId.SendNotifications] = true, - _a); - switch (format) { - case api_external_contract_js_1.CrosstabFileFormat.CSV: - verb = api_internal_contract_js_1.VerbId.ExportCrosstabCsvDownload; - // CSV only parameter: see browser-clients/export-crosstab-options-dialog repo - parameters[api_internal_contract_js_1.ParameterId.UseTabDelimiters] = true; - break; - case api_external_contract_js_1.CrosstabFileFormat.Excel: - verb = api_internal_contract_js_1.VerbId.ExportCrosstabExcelDownload; - break; - default: - throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, 'unsupported Crosstab file format.'); - } - return [2 /*return*/, this.execute(verb, parameters) - .then(function (response) { - var result = response.result; - return result; - }) - .catch(function () { - throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.CrosstabCreationError, 'An unexpected error occurred while generating the document.'); - })]; - } + } + exportCrosstabAsync(sheetName, format, exportableWorksheetNames, currentSheetType) { + return __awaiter(this, void 0, void 0, function* () { + ErrorHelpers_1.ErrorHelpers.verifySheetName(exportableWorksheetNames, sheetName); + ErrorHelpers_1.ErrorHelpers.verifyEnumValue(format, api_external_contract_js_1.CrosstabFileFormat, 'CrosstabFileFormat'); + // The pres layer command for exporting Crosstab uses SimpleSheetIdentifiers instead of sheet names. + // The extensions-and-embedding-api current does not store references to the SimpleSheetIdentifiers of its sheets + // so we call a pres layer command that gives us the SimpleSheetIdentifier for each sheet name that appears in the + // export Crosstab dialog popup. + const sheetNameToIdMap = yield this.getExportCrosstabSheetMapAsync(currentSheetType); + if (!sheetNameToIdMap[sheetName]) { + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, 'missing sheet doc id from sheetMap'); + } + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'exportCrosstabAsync', + [api_internal_contract_js_1.ParameterId.SheetIdentifier]: sheetNameToIdMap[sheetName], + [api_internal_contract_js_1.ParameterId.SendNotifications]: true, + }; + // pres layer command invoked depends on the crosstab file format + let verb; + switch (format) { + case api_external_contract_js_1.CrosstabFileFormat.CSV: + verb = api_internal_contract_js_1.VerbId.ExportCrosstabCsvDownload; + // CSV only parameter: see browser-clients/export-crosstab-options-dialog repo + parameters[api_internal_contract_js_1.ParameterId.UseTabDelimiters] = true; + break; + case api_external_contract_js_1.CrosstabFileFormat.Excel: + verb = api_internal_contract_js_1.VerbId.ExportCrosstabExcelDownload; + break; + default: + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, 'unsupported Crosstab file format.'); + } + return this.execute(verb, parameters) + .then((response) => { + const result = response.result; + return result; + }) + .catch(() => { + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.CrosstabCreationError, 'An unexpected error occurred while generating the document.'); }); }); - }; - ExportServiceImpl.prototype.exportDataAsync = function (visualId, options) { + } + exportDataAsync(visualId, options) { var _a; - var _b; ErrorHelpers_1.ErrorHelpers.verifyExportDataOptions(options); // Remove any duplicates from the input array - var columnsAsSet = new Set(options.columnsToIncludeById); - var columnsToIncludeById = Array.from(columnsAsSet); - var verb = api_internal_contract_js_1.VerbId.ExportDataDownload; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'exportDataAsync', - _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId, - _a[api_internal_contract_js_1.ParameterId.IgnoreAliases] = (_b = options.ignoreAliases, (_b !== null && _b !== void 0 ? _b : false)), - _a[api_internal_contract_js_1.ParameterId.ColumnsToIncludeById] = columnsToIncludeById, - _a); + const columnsAsSet = new Set(options.columnsToIncludeById); + const columnsToIncludeById = Array.from(columnsAsSet); + const verb = api_internal_contract_js_1.VerbId.ExportDataDownload; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'exportDataAsync', + [api_internal_contract_js_1.ParameterId.VisualId]: visualId, + [api_internal_contract_js_1.ParameterId.IgnoreAliases]: (_a = options.ignoreAliases, (_a !== null && _a !== void 0 ? _a : false)), + [api_internal_contract_js_1.ParameterId.ColumnsToIncludeById]: columnsToIncludeById, + }; return this.execute(verb, parameters) - .then(function () { }) - .catch(function () { + .then(() => { }) + .catch(() => { throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.DataCreationError, 'An unexpected error occurred while generating the document.'); }); - }; - ExportServiceImpl.prototype.exportPowerPointAsync = function (sheetNames, exportScenarios) { - var _a; + } + exportPowerPointAsync(sheetNames, exportScenarios) { ErrorHelpers_1.ErrorHelpers.verifySheetNamesForPDFAndPPT(sheetNames, exportScenarios); // Note: the ExportOriginUrl param is listed as optional for the pres layer command we are invoking; however, // recent changes were made that enforced the use of the empty string when invoking this command with no ExportOriginUrl. // see browser-clients/export-powerpoint-options-dialog repo. - var verb = api_internal_contract_js_1.VerbId.ExportPowerpointDownload; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'exportPowerPointAsync', - _a[api_internal_contract_js_1.ParameterId.ExportOriginUrl] = '', - _a[api_internal_contract_js_1.ParameterId.SelectedSheetNames] = sheetNames, - _a); + const verb = api_internal_contract_js_1.VerbId.ExportPowerpointDownload; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'exportPowerPointAsync', + [api_internal_contract_js_1.ParameterId.ExportOriginUrl]: '', + [api_internal_contract_js_1.ParameterId.SelectedSheetNames]: sheetNames, + }; return this.execute(verb, parameters) - .then(function (response) { - var result = response.result; + .then((response) => { + const result = response.result; return result; }) - .catch(function () { + .catch(() => { throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.PowerPointCreationError, 'An error occured while attempting to generate the PowerPoint file.'); }); - }; - ExportServiceImpl.prototype.exportPDFAsync = function (sheetNames, externalExportPdfOptions, exportScenarios) { - return __awaiter(this, void 0, void 0, function () { - var internalExportPdfOptions, verb, parameters; - var _a; - return __generator(this, function (_b) { - switch (_b.label) { - case 0: - ErrorHelpers_1.ErrorHelpers.verifyExportPDFOptions(externalExportPdfOptions); - ErrorHelpers_1.ErrorHelpers.verifySheetNamesForPDFAndPPT(sheetNames, exportScenarios); - return [4 /*yield*/, this.getExportPDFOptionsAsync()]; - case 1: - internalExportPdfOptions = _b.sent(); - ExportHelpers_1.ExportHelpers.updateInternalExportPDFOptions(internalExportPdfOptions, externalExportPdfOptions, sheetNames); - verb = api_internal_contract_js_1.VerbId.ExportPdfDownload; - parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'exportPDFAsync', - _a[api_internal_contract_js_1.ParameterId.ExportPdfOptions] = internalExportPdfOptions, - _a); - return [2 /*return*/, this.execute(verb, parameters) - .then(function (response) { - var result = response.result; - return result; - }) - .catch(function () { - throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.PDFCreationError, 'Unable to create PDF because something went wrong. Try again.'); - })]; - } + } + exportPDFAsync(sheetNames, externalExportPdfOptions, exportScenarios) { + return __awaiter(this, void 0, void 0, function* () { + ErrorHelpers_1.ErrorHelpers.verifyExportPDFOptions(externalExportPdfOptions); + ErrorHelpers_1.ErrorHelpers.verifySheetNamesForPDFAndPPT(sheetNames, exportScenarios); + const internalExportPdfOptions = yield this.getExportPDFOptionsAsync(); + ExportHelpers_1.ExportHelpers.updateInternalExportPDFOptions(internalExportPdfOptions, externalExportPdfOptions, sheetNames); + const verb = api_internal_contract_js_1.VerbId.ExportPdfDownload; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'exportPDFAsync', + [api_internal_contract_js_1.ParameterId.ExportPdfOptions]: internalExportPdfOptions, + }; + return this.execute(verb, parameters) + .then((response) => { + const result = response.result; + return result; + }) + .catch(() => { + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.PDFCreationError, 'Unable to create PDF because something went wrong. Try again.'); }); }); - }; - ExportServiceImpl.prototype.getExportPDFOptionsAsync = function () { - var _a; - var verb = api_internal_contract_js_1.VerbId.GetExportPdfOptions; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getExportPdfOptionsAsync', - _a); - return this.execute(verb, parameters).then(function (response) { - var result = response.result; + } + getExportPDFOptionsAsync() { + const verb = api_internal_contract_js_1.VerbId.GetExportPdfOptions; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getExportPdfOptionsAsync', + }; + return this.execute(verb, parameters).then((response) => { + const result = response.result; return result; }); - }; - return ExportServiceImpl; -}(ServiceImplBase_1.ServiceImplBase)); + } +} exports.ExportServiceImpl = ExportServiceImpl; @@ -16346,90 +9437,64 @@ exports.ExportServiceImpl = ExportServiceImpl; /*!******************************************************************************************!*\ !*** ../api-shared-js/lib/src/ApiShared/Services/impl/ExternalContextMenuServiceImpl.js ***! \******************************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; -var __extends = (this && this.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); Object.defineProperty(exports, "__esModule", ({ value: true })); -var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -var ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); -var ExternalContextMenuServiceImpl = /** @class */ (function (_super) { - __extends(ExternalContextMenuServiceImpl, _super); - function ExternalContextMenuServiceImpl() { - return _super !== null && _super.apply(this, arguments) || this; - } - Object.defineProperty(ExternalContextMenuServiceImpl.prototype, "serviceName", { - get: function () { - return "external-context-menu-service" /* ExternalContextMenu */; - }, - enumerable: true, - configurable: true - }); - ExternalContextMenuServiceImpl.prototype.appendContextMenuAsync = function (sheetName, targetMenu, config) { - var _a; - var verb = api_internal_contract_js_1.VerbId.AppendExternalMenuItem; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'appendContextMenuAsync', - _a[api_internal_contract_js_1.ParameterId.WorksheetName] = sheetName, - _a[api_internal_contract_js_1.ParameterId.ExternalMenuItemDisplayName] = config.displayName, - _a); - return this.execute(verb, parameters).then(function (response) { - var newMenuItemId = response.result; +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +class ExternalContextMenuServiceImpl extends ServiceImplBase_1.ServiceImplBase { + get serviceName() { + return "external-context-menu-service" /* ExternalContextMenu */; + } + appendContextMenuAsync(sheetName, targetMenu, config) { + const verb = api_internal_contract_js_1.VerbId.AppendExternalMenuItem; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'appendContextMenuAsync', + [api_internal_contract_js_1.ParameterId.WorksheetName]: sheetName, + [api_internal_contract_js_1.ParameterId.ExternalMenuItemDisplayName]: config.displayName, + }; + return this.execute(verb, parameters).then((response) => { + const newMenuItemId = response.result; return newMenuItemId; }); - }; - ExternalContextMenuServiceImpl.prototype.removeContextMenuAsync = function (sheetName, targetMenu, menuItemId) { - var _a; - var verb = api_internal_contract_js_1.VerbId.RemoveExternalMenuItem; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'removeContextMenuAsync', - _a[api_internal_contract_js_1.ParameterId.WorksheetName] = sheetName, - _a[api_internal_contract_js_1.ParameterId.ExternalMenuItemId] = menuItemId, - _a); - return this.execute(verb, parameters).then(function (response) { + } + removeContextMenuAsync(sheetName, targetMenu, menuItemId) { + const verb = api_internal_contract_js_1.VerbId.RemoveExternalMenuItem; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'removeContextMenuAsync', + [api_internal_contract_js_1.ParameterId.WorksheetName]: sheetName, + [api_internal_contract_js_1.ParameterId.ExternalMenuItemId]: menuItemId, + }; + return this.execute(verb, parameters).then((response) => { return; }); - }; - ExternalContextMenuServiceImpl.prototype.executeContextMenuAsync = function (sheetName, targetMenu, menuItemId) { - var _a; - var verb = api_internal_contract_js_1.VerbId.ExecuteExternalMenuItem; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'executeContextMenuAsync', - _a[api_internal_contract_js_1.ParameterId.WorksheetName] = sheetName, - _a[api_internal_contract_js_1.ParameterId.ExternalMenuItemId] = menuItemId, - _a); - return this.execute(verb, parameters).then(function (response) { + } + executeContextMenuAsync(sheetName, targetMenu, menuItemId) { + const verb = api_internal_contract_js_1.VerbId.ExecuteExternalMenuItem; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'executeContextMenuAsync', + [api_internal_contract_js_1.ParameterId.WorksheetName]: sheetName, + [api_internal_contract_js_1.ParameterId.ExternalMenuItemId]: menuItemId, + }; + return this.execute(verb, parameters).then((response) => { return; }); - }; - ExternalContextMenuServiceImpl.prototype.renameContextMenuAsync = function (sheetName, targetMenu, menuHeader, menuDescription) { - var _a; - var verb = api_internal_contract_js_1.VerbId.RenameExternalMenu; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'renameContextMenuAsync', - _a[api_internal_contract_js_1.ParameterId.WorksheetName] = sheetName, - _a[api_internal_contract_js_1.ParameterId.ExternalMenuHeader] = menuHeader, - _a[api_internal_contract_js_1.ParameterId.ExternalMenuDescription] = menuDescription, - _a); - return this.execute(verb, parameters).then(function (response) { + } + renameContextMenuAsync(sheetName, targetMenu, menuHeader, menuDescription) { + const verb = api_internal_contract_js_1.VerbId.RenameExternalMenu; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'renameContextMenuAsync', + [api_internal_contract_js_1.ParameterId.WorksheetName]: sheetName, + [api_internal_contract_js_1.ParameterId.ExternalMenuHeader]: menuHeader, + [api_internal_contract_js_1.ParameterId.ExternalMenuDescription]: menuDescription, + }; + return this.execute(verb, parameters).then((response) => { return; }); - }; - return ExternalContextMenuServiceImpl; -}(ServiceImplBase_1.ServiceImplBase)); + } +} exports.ExternalContextMenuServiceImpl = ExternalContextMenuServiceImpl; @@ -16443,19 +9508,6 @@ exports.ExternalContextMenuServiceImpl = ExternalContextMenuServiceImpl; "use strict"; -var __extends = (this && this.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { @@ -16465,62 +9517,26 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; -var __generator = (this && this.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -}; Object.defineProperty(exports, "__esModule", ({ value: true })); -var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -var InternalContract = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -var ApiShared_1 = __webpack_require__(/*! ../../../ApiShared */ "../api-shared-js/lib/src/ApiShared.js"); -var ExternalToInternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/ExternalToInternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/ExternalToInternalEnumMappings.js"); -var InternalToExternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/InternalToExternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js"); -var FilterModels_1 = __webpack_require__(/*! ../../Models/FilterModels */ "../api-shared-js/lib/src/ApiShared/Models/FilterModels.js"); -var DataValueFactory_1 = __webpack_require__(/*! ../../Utils/DataValueFactory */ "../api-shared-js/lib/src/ApiShared/Utils/DataValueFactory.js"); -var Param_1 = __webpack_require__(/*! ../../Utils/Param */ "../api-shared-js/lib/src/ApiShared/Utils/Param.js"); -var ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); -var FilterServiceImpl = /** @class */ (function (_super) { - __extends(FilterServiceImpl, _super); - function FilterServiceImpl() { - return _super !== null && _super.apply(this, arguments) || this; - } - Object.defineProperty(FilterServiceImpl.prototype, "serviceName", { - get: function () { - return "filter-service" /* Filter */; - }, - enumerable: true, - configurable: true - }); - FilterServiceImpl.prototype.applyFilterAsync = function (visualId, fieldName, values, updateType, filterOptions) { - var _a; - var verb = api_internal_contract_js_1.VerbId.ApplyCategoricalFilter; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'applyFilterAsync', - _a); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const InternalContract = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const ApiShared_1 = __webpack_require__(/*! ../../../ApiShared */ "../api-shared-js/lib/src/ApiShared.js"); +const ExternalToInternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/ExternalToInternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/ExternalToInternalEnumMappings.js"); +const InternalToExternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/InternalToExternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js"); +const FilterModels_1 = __webpack_require__(/*! ../../Models/FilterModels */ "../api-shared-js/lib/src/ApiShared/Models/FilterModels.js"); +const DataValueFactory_1 = __webpack_require__(/*! ../../Utils/DataValueFactory */ "../api-shared-js/lib/src/ApiShared/Utils/DataValueFactory.js"); +const Param_1 = __webpack_require__(/*! ../../Utils/Param */ "../api-shared-js/lib/src/ApiShared/Utils/Param.js"); +const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +class FilterServiceImpl extends ServiceImplBase_1.ServiceImplBase { + get serviceName() { + return "filter-service" /* Filter */; + } + applyFilterAsync(visualId, fieldName, values, updateType, filterOptions) { + const verb = api_internal_contract_js_1.VerbId.ApplyCategoricalFilter; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'applyFilterAsync', + }; parameters[api_internal_contract_js_1.ParameterId.VisualId] = visualId; parameters[api_internal_contract_js_1.ParameterId.FieldName] = fieldName; if (!Array.isArray(values)) { @@ -16530,19 +9546,17 @@ var FilterServiceImpl = /** @class */ (function (_super) { parameters[api_internal_contract_js_1.ParameterId.FilterUpdateType] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.filterUpdateType.convert(updateType); parameters[api_internal_contract_js_1.ParameterId.IsExcludeMode] = filterOptions === undefined || filterOptions.isExcludeMode === undefined ? false : filterOptions.isExcludeMode; - return this.execute(verb, parameters).then(function (response) { + return this.execute(verb, parameters).then((response) => { return fieldName; }); - }; - FilterServiceImpl.prototype.applyRangeFilterAsync = function (visualId, fieldName, filterOptions) { - var _a; - var _this = this; - var verb = api_internal_contract_js_1.VerbId.ApplyRangeFilter; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'applyRangeFilterAsync', - _a); + } + applyRangeFilterAsync(visualId, fieldName, filterOptions) { + const verb = api_internal_contract_js_1.VerbId.ApplyRangeFilter; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'applyRangeFilterAsync', + }; if (filterOptions.min !== undefined && filterOptions.min !== null) { - var min = void 0; + let min; if (filterOptions.min instanceof Date) { min = Param_1.Param.serializeDateForPlatform(filterOptions.min); } @@ -16552,7 +9566,7 @@ var FilterServiceImpl = /** @class */ (function (_super) { parameters[api_internal_contract_js_1.ParameterId.FilterRangeMin] = min; } if (filterOptions.max !== undefined && filterOptions.max !== null) { - var max = void 0; + let max; if (filterOptions.max instanceof Date) { max = Param_1.Param.serializeDateForPlatform(filterOptions.max); } @@ -16567,20 +9581,19 @@ var FilterServiceImpl = /** @class */ (function (_super) { } parameters[api_internal_contract_js_1.ParameterId.FieldName] = fieldName; parameters[api_internal_contract_js_1.ParameterId.VisualId] = visualId; - return this.execute(verb, parameters).then(function (response) { - _this.apiFilterHandlerCheckForCommandError(response.result); + return this.execute(verb, parameters).then((response) => { + this.apiFilterHandlerCheckForCommandError(response.result); return fieldName; }); - }; - FilterServiceImpl.prototype.applyHierarchicalFilterAsync = function (visualId, fieldName, values, updateType, filterOptions) { - var _a; - var verb = api_internal_contract_js_1.VerbId.HierarchicalFilter; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'applyHierarchicalFilterAsync', - _a); + } + applyHierarchicalFilterAsync(visualId, fieldName, values, updateType, filterOptions) { + const verb = api_internal_contract_js_1.VerbId.HierarchicalFilter; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'applyHierarchicalFilterAsync', + }; parameters[api_internal_contract_js_1.ParameterId.VisualId] = visualId; parameters[api_internal_contract_js_1.ParameterId.FieldName] = fieldName; - var hierarchicalLevels = values.levels; + const hierarchicalLevels = values.levels; if (Array.isArray(hierarchicalLevels) && hierarchicalLevels.length > 0) { parameters[api_internal_contract_js_1.ParameterId.FilterLevels] = hierarchicalLevels; } @@ -16594,28 +9607,26 @@ var FilterServiceImpl = /** @class */ (function (_super) { } parameters[api_internal_contract_js_1.ParameterId.FilterUpdateType] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.filterUpdateType.convert(updateType); parameters[api_internal_contract_js_1.ParameterId.IsExcludeMode] = filterOptions && !!filterOptions.isExcludeMode; - return this.execute(verb, parameters).then(function (response) { + return this.execute(verb, parameters).then((response) => { return fieldName; }); - }; - FilterServiceImpl.prototype.clearFilterAsync = function (visualId, fieldName) { - var _a; - var verb = api_internal_contract_js_1.VerbId.ClearFilter; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'clearFilterAsync', - _a); + } + clearFilterAsync(visualId, fieldName) { + const verb = api_internal_contract_js_1.VerbId.ClearFilter; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'clearFilterAsync', + }; parameters[api_internal_contract_js_1.ParameterId.VisualId] = visualId; parameters[api_internal_contract_js_1.ParameterId.FieldName] = fieldName; - return this.execute(verb, parameters).then(function (resposne) { + return this.execute(verb, parameters).then((resposne) => { return fieldName; }); - }; - FilterServiceImpl.prototype.applyRelativeDateFilterAsync = function (visualId, fieldName, options) { - var _a; - var verb = api_internal_contract_js_1.VerbId.ApplyRelativeDateFilter; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'applyRelativeDateFilterAsync', - _a); + } + applyRelativeDateFilterAsync(visualId, fieldName, options) { + const verb = api_internal_contract_js_1.VerbId.ApplyRelativeDateFilter; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'applyRelativeDateFilterAsync', + }; parameters[api_internal_contract_js_1.ParameterId.VisualId] = visualId; parameters[api_internal_contract_js_1.ParameterId.FieldName] = fieldName; parameters[api_internal_contract_js_1.ParameterId.PeriodType] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.periodType.convert(options.periodType); @@ -16629,176 +9640,152 @@ var FilterServiceImpl = /** @class */ (function (_super) { if (options.anchorDate !== undefined && options.anchorDate !== null) { parameters[api_internal_contract_js_1.ParameterId.AnchorDate] = this.convertAnchorDate(options.anchorDate); } - return this.execute(verb, parameters).then(function (response) { + return this.execute(verb, parameters).then((response) => { return response.result; }); - }; - FilterServiceImpl.prototype.getFiltersAsync = function (visualId) { - var _a; - var _this = this; - var verb = api_internal_contract_js_1.VerbId.GetFilters; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getFiltersAsync', - _a); + } + getFiltersAsync(visualId) { + const verb = api_internal_contract_js_1.VerbId.GetFilters; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getFiltersAsync', + }; parameters[api_internal_contract_js_1.ParameterId.VisualId] = visualId; - return this.execute(verb, parameters).then(function (response) { - var filters = response.result; - return _this.convertDomainFilters(filters); + return this.execute(verb, parameters).then((response) => { + const filters = response.result; + return this.convertDomainFilters(filters); }); - }; - FilterServiceImpl.prototype.getCategoricalDomainAsync = function (worksheetName, fieldId, domainType) { - var _a; - var _this = this; - var verb = api_internal_contract_js_1.VerbId.GetCategoricalDomain; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getCategoricalDomainAsync', - _a); + } + getCategoricalDomainAsync(worksheetName, fieldId, domainType) { + const verb = api_internal_contract_js_1.VerbId.GetCategoricalDomain; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getCategoricalDomainAsync', + }; parameters[api_internal_contract_js_1.ParameterId.VisualId] = { worksheet: worksheetName, }; parameters[api_internal_contract_js_1.ParameterId.FieldId] = fieldId; parameters[api_internal_contract_js_1.ParameterId.DomainType] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.filterDomainType.convert(domainType); - return this.execute(verb, parameters).then(function (response) { - var domain = response.result; - return _this.convertCategoricalDomain(domain, domainType); + return this.execute(verb, parameters).then((response) => { + const domain = response.result; + return this.convertCategoricalDomain(domain, domainType); }); - }; - FilterServiceImpl.prototype.getRangeDomainAsync = function (worksheetName, fieldId, domainType) { - var _a; - var _this = this; - var verb = api_internal_contract_js_1.VerbId.GetRangeDomain; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getRangeDomainAsync', - _a); + } + getRangeDomainAsync(worksheetName, fieldId, domainType) { + const verb = api_internal_contract_js_1.VerbId.GetRangeDomain; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getRangeDomainAsync', + }; parameters[api_internal_contract_js_1.ParameterId.VisualId] = { worksheet: worksheetName, }; parameters[api_internal_contract_js_1.ParameterId.FieldId] = fieldId; parameters[api_internal_contract_js_1.ParameterId.DomainType] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.filterDomainType.convert(domainType); - return this.execute(verb, parameters).then(function (response) { - var domain = response.result; - return _this.convertRangeDomain(domain, domainType); + return this.execute(verb, parameters).then((response) => { + const domain = response.result; + return this.convertRangeDomain(domain, domainType); }); - }; - FilterServiceImpl.prototype.getDashboardFiltersAsync = function () { - var _a; - var _this = this; - var verb = api_internal_contract_js_1.VerbId.GetDashboardFilters; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getDashboardFiltersAsync', - _a); - return this.execute(verb, parameters).then(function (response) { - var filters = response.result; - return _this.convertDomainFilters(filters); + } + getDashboardFiltersAsync() { + const verb = api_internal_contract_js_1.VerbId.GetDashboardFilters; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getDashboardFiltersAsync', + }; + return this.execute(verb, parameters).then((response) => { + const filters = response.result; + return this.convertDomainFilters(filters); }); - }; - FilterServiceImpl.prototype.applyDashboardFilterAsync = function (fieldName, values, updateType, filterOptions) { - var _a; - var verb = api_internal_contract_js_1.VerbId.DashboardCategoricalFilter; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'applyDashboardFilterAsync', - _a); + } + applyDashboardFilterAsync(fieldName, values, updateType, filterOptions) { + const verb = api_internal_contract_js_1.VerbId.DashboardCategoricalFilter; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'applyDashboardFilterAsync', + }; parameters[api_internal_contract_js_1.ParameterId.FieldName] = fieldName; parameters[api_internal_contract_js_1.ParameterId.FilterValues] = values; parameters[api_internal_contract_js_1.ParameterId.FilterUpdateType] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.filterUpdateType.convert(updateType); parameters[api_internal_contract_js_1.ParameterId.IsExcludeMode] = filterOptions && !!filterOptions.isExcludeMode; - return this.execute(verb, parameters).then(function (response) { + return this.execute(verb, parameters).then((response) => { return response.result; }); - }; - FilterServiceImpl.prototype.getAppliedWorksheetsAsync = function (worksheetName, fieldId) { + } + getAppliedWorksheetsAsync(worksheetName, fieldId) { var _a; - return __awaiter(this, void 0, void 0, function () { - var sharedFilterModel, worksheetNames; - return __generator(this, function (_b) { - switch (_b.label) { - case 0: return [4 /*yield*/, this.executeGetAppliedWorksheets(worksheetName, fieldId, 'getAppliedWorksheetsAsync')]; - case 1: - sharedFilterModel = _b.sent(); - worksheetNames = []; - (_a = sharedFilterModel.worksheets) === null || _a === void 0 ? void 0 : _a.map(function (worksheetInfo) { - if (worksheetInfo.isSelected) { - worksheetNames.push(worksheetInfo.worksheetName); - } - }); - return [2 /*return*/, worksheetNames]; + return __awaiter(this, void 0, void 0, function* () { + const sharedFilterModel = yield this.executeGetAppliedWorksheets(worksheetName, fieldId, 'getAppliedWorksheetsAsync'); + const worksheetNames = []; + (_a = sharedFilterModel.worksheets) === null || _a === void 0 ? void 0 : _a.map((worksheetInfo) => { + if (worksheetInfo.isSelected) { + worksheetNames.push(worksheetInfo.worksheetName); } }); + return worksheetNames; }); - }; - FilterServiceImpl.prototype.setAppliedWorksheetsAsync = function (worksheetName, fieldName, fieldId, applyToWorksheets) { - return __awaiter(this, void 0, void 0, function () { - var sharedFilterModel, allowedWorksheets, activeWorksheet, verb, parameters; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: return [4 /*yield*/, this.executeGetAppliedWorksheets(worksheetName, fieldId, 'getAppliedWorksheetsAsyncInternal')]; - case 1: - sharedFilterModel = _a.sent(); - if (!sharedFilterModel || !sharedFilterModel.worksheets) { - throw new ApiShared_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, 'This filter does not apply to multiple worksheets'); - } - allowedWorksheets = []; - activeWorksheet = ''; - sharedFilterModel.worksheets.forEach(function (worksheet) { - // Get active worksheet - if (worksheet.isActive) { - activeWorksheet = worksheet.worksheetName; - } - // Populate allowed worksheets - if (worksheet.isSelected || worksheet.isEnabled) { - allowedWorksheets.push(worksheet.worksheetName); - } - }); - if (activeWorksheet === '') { - throw new ApiShared_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, 'No active worksheet'); - } - if (!applyToWorksheets.includes(activeWorksheet)) { - throw new ApiShared_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, activeWorksheet + " must be included in the applied worksheets"); - } - applyToWorksheets.forEach(function (sheet) { - // check if it's present within compatible sheets - if (!allowedWorksheets.includes(sheet)) { - throw new ApiShared_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, "The field " + fieldName + " isn't applicable to the worksheet " + sheet); - } - }); - verb = api_internal_contract_js_1.VerbId.ChangeSharedFilter; - parameters = {}; - parameters[api_internal_contract_js_1.ParameterId.FunctionName] = 'setAppliedWorksheetsAsync'; - parameters[api_internal_contract_js_1.ParameterId.VisualId] = { - worksheet: worksheetName, - }; - parameters[api_internal_contract_js_1.ParameterId.FieldId] = fieldId; - parameters[api_internal_contract_js_1.ParameterId.SharedFilterSheets] = applyToWorksheets; - return [2 /*return*/, this.execute(verb, parameters).then(function (response) { - return applyToWorksheets; - })]; + } + setAppliedWorksheetsAsync(worksheetName, fieldName, fieldId, applyToWorksheets) { + return __awaiter(this, void 0, void 0, function* () { + const sharedFilterModel = yield this.executeGetAppliedWorksheets(worksheetName, fieldId, 'getAppliedWorksheetsAsyncInternal'); + if (!sharedFilterModel || !sharedFilterModel.worksheets) { + throw new ApiShared_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, 'This filter does not apply to multiple worksheets'); + } + const allowedWorksheets = []; + let activeWorksheet = ''; + sharedFilterModel.worksheets.forEach((worksheet) => { + // Get active worksheet + if (worksheet.isActive) { + activeWorksheet = worksheet.worksheetName; + } + // Populate allowed worksheets + if (worksheet.isSelected || worksheet.isEnabled) { + allowedWorksheets.push(worksheet.worksheetName); + } + }); + if (activeWorksheet === '') { + throw new ApiShared_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, 'No active worksheet'); + } + if (!applyToWorksheets.includes(activeWorksheet)) { + throw new ApiShared_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, `${activeWorksheet} must be included in the applied worksheets`); + } + applyToWorksheets.forEach((sheet) => { + // check if it's present within compatible sheets + if (!allowedWorksheets.includes(sheet)) { + throw new ApiShared_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, `The field ${fieldName} isn't applicable to the worksheet ${sheet}`); } }); + const verb = api_internal_contract_js_1.VerbId.ChangeSharedFilter; + const parameters = {}; + parameters[api_internal_contract_js_1.ParameterId.FunctionName] = 'setAppliedWorksheetsAsync'; + parameters[api_internal_contract_js_1.ParameterId.VisualId] = { + worksheet: worksheetName, + }; + parameters[api_internal_contract_js_1.ParameterId.FieldId] = fieldId; + parameters[api_internal_contract_js_1.ParameterId.SharedFilterSheets] = applyToWorksheets; + return this.execute(verb, parameters).then((response) => { + return applyToWorksheets; + }); }); - }; + } // Helper Methods - FilterServiceImpl.prototype.executeGetAppliedWorksheets = function (worksheetName, fieldId, telemetryFunctionName) { - var verb = api_internal_contract_js_1.VerbId.GetSharedFilter; - var parameters = {}; + executeGetAppliedWorksheets(worksheetName, fieldId, telemetryFunctionName) { + const verb = api_internal_contract_js_1.VerbId.GetSharedFilter; + const parameters = {}; parameters[api_internal_contract_js_1.ParameterId.FunctionName] = telemetryFunctionName; parameters[api_internal_contract_js_1.ParameterId.VisualId] = { worksheet: worksheetName, }; parameters[api_internal_contract_js_1.ParameterId.FieldId] = fieldId; - return this.execute(verb, parameters).then(function (response) { - var sharedFilterModel = response.result; + return this.execute(verb, parameters).then((response) => { + const sharedFilterModel = response.result; return sharedFilterModel; }); - }; - FilterServiceImpl.prototype.convertDomainFilters = function (domainFilters) { - var _this = this; - var filters = []; - domainFilters.forEach(function (domainFilter) { + } + convertDomainFilters(domainFilters) { + const filters = []; + domainFilters.forEach((domainFilter) => { switch (domainFilter.filterType) { case api_internal_contract_js_1.FilterType.Categorical: { - var filter = domainFilter; + const filter = domainFilter; if (filter) { - filters.push(_this.convertCategoricalFilter(filter)); + filters.push(this.convertCategoricalFilter(filter)); } else { throw new Error('Invalid Categorical Filter'); @@ -16806,9 +9793,9 @@ var FilterServiceImpl = /** @class */ (function (_super) { break; } case api_internal_contract_js_1.FilterType.Hierarchical: { - var filter = domainFilter; + const filter = domainFilter; if (filter) { - filters.push(_this.convertHierarchicalFilter(filter)); + filters.push(this.convertHierarchicalFilter(filter)); } else { throw new Error('Invalid Hierarchical Filter'); @@ -16816,9 +9803,9 @@ var FilterServiceImpl = /** @class */ (function (_super) { break; } case api_internal_contract_js_1.FilterType.Range: { - var filter = domainFilter; + const filter = domainFilter; if (filter) { - filters.push(_this.convertRangeFilter(filter)); + filters.push(this.convertRangeFilter(filter)); } else { throw new Error('Invalid Range Filter'); @@ -16826,9 +9813,9 @@ var FilterServiceImpl = /** @class */ (function (_super) { break; } case api_internal_contract_js_1.FilterType.RelativeDate: { - var filter = domainFilter; + const filter = domainFilter; if (filter) { - filters.push(_this.convertRelativeDateFilter(filter)); + filters.push(this.convertRelativeDateFilter(filter)); } else { throw new Error('Invalid Relative Date Filter'); @@ -16841,58 +9828,58 @@ var FilterServiceImpl = /** @class */ (function (_super) { } }); return filters; - }; - FilterServiceImpl.prototype.convertCategoricalFilter = function (domainFilter) { - var appliedValues = domainFilter.values.map(function (dv) { + } + convertCategoricalFilter(domainFilter) { + const appliedValues = domainFilter.values.map((dv) => { return DataValueFactory_1.DataValueFactory.MakeFilterDataValue(dv); }); return new FilterModels_1.CategoricalFilter(domainFilter.visualId.worksheet, domainFilter.fieldCaption, domainFilter.fieldName, api_internal_contract_js_1.FilterType.Categorical, this._registryId, appliedValues, domainFilter.isExclude, domainFilter.isAllSelected); - }; - FilterServiceImpl.prototype.convertHierarchicalFilter = function (domainFilter) { - var appliedValues = domainFilter.values.map(function (hierarchicalDataValue) { + } + convertHierarchicalFilter(domainFilter) { + const appliedValues = domainFilter.values.map((hierarchicalDataValue) => { return new FilterModels_1.HierarchicalDataValue(DataValueFactory_1.DataValueFactory.MakeFilterDataValue(hierarchicalDataValue.value), hierarchicalDataValue.hierarchicalPath, hierarchicalDataValue.level); }); - var levelDetails = domainFilter.levelInfo.map(function (aLevel) { + const levelDetails = domainFilter.levelInfo.map((aLevel) => { return new FilterModels_1.HierarchicalLevelDetail(aLevel.name, InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.hierarchicalLevelSelectionState.convert(aLevel.levelSelectionState)); }); return new FilterModels_1.HierarchicalFilter(domainFilter.visualId.worksheet, domainFilter.fieldCaption, domainFilter.fieldName, api_internal_contract_js_1.FilterType.Hierarchical, this._registryId, domainFilter.dimensionName, domainFilter.hierarchyCaption, domainFilter.levels, levelDetails, appliedValues, domainFilter.isAllSelected); - }; - FilterServiceImpl.prototype.convertRangeFilter = function (domainFilter) { - var minValue = DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domainFilter.min); - var maxValue = DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domainFilter.max); + } + convertRangeFilter(domainFilter) { + const minValue = DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domainFilter.min); + const maxValue = DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domainFilter.max); return new FilterModels_1.RangeFilter(domainFilter.visualId.worksheet, domainFilter.fieldCaption, domainFilter.fieldName, api_internal_contract_js_1.FilterType.Range, this._registryId, minValue, maxValue, domainFilter.includeNullValues); - }; - FilterServiceImpl.prototype.convertRelativeDateFilter = function (domainFilter) { - var anchorDateValue = DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domainFilter.anchorDate); + } + convertRelativeDateFilter(domainFilter) { + const anchorDateValue = DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domainFilter.anchorDate); return new FilterModels_1.RelativeDateFilter(domainFilter.visualId.worksheet, domainFilter.fieldCaption, domainFilter.fieldName, api_external_contract_js_1.FilterType.RelativeDate, this._registryId, anchorDateValue, InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.dateStepPeriod.convert(domainFilter.periodType), InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.dateRangeType.convert(domainFilter.rangeType), domainFilter.rangeN); - }; - FilterServiceImpl.prototype.convertCategoricalDomain = function (domain, domainType) { - var values = domain.values.map(function (domainDv) { + } + convertCategoricalDomain(domain, domainType) { + const values = domain.values.map((domainDv) => { return DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domainDv); }); return new FilterModels_1.CategoricalDomain(values, domainType); - }; - FilterServiceImpl.prototype.convertRangeDomain = function (domain, domainType) { - var min = DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domain.min); - var max = DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domain.max); + } + convertRangeDomain(domain, domainType) { + const min = DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domain.min); + const max = DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domain.max); return new FilterModels_1.RangeDomain(min, max, domainType); - }; - FilterServiceImpl.prototype.convertAnchorDate = function (anchorDate) { + } + convertAnchorDate(anchorDate) { // Converts a Date object into a string format that the server expects for date/time values. // If anchorDate doesn't represent a valid Date object, any of these would be NaN. - var year = anchorDate.getUTCFullYear(); - var month = anchorDate.getUTCMonth() + 1; - var day = anchorDate.getUTCDate(); - var hh = anchorDate.getUTCHours(); - var mm = anchorDate.getUTCMinutes(); - var sec = anchorDate.getUTCSeconds(); + const year = anchorDate.getUTCFullYear(); + const month = anchorDate.getUTCMonth() + 1; + const day = anchorDate.getUTCDate(); + const hh = anchorDate.getUTCHours(); + const mm = anchorDate.getUTCMinutes(); + const sec = anchorDate.getUTCSeconds(); if (isNaN(year) || isNaN(month) || isNaN(day) || isNaN(hh) || isNaN(mm) || isNaN(sec)) { throw new ApiShared_1.TableauError(api_external_contract_js_1.EmbeddingErrorCodes.InvalidDateParameter, 'Invalid date parameter: anchorDate'); } - var result = year + "-" + month + "-" + day + " " + hh + ":" + mm + ":" + sec; + const result = `${year}-${month}-${day} ${hh}:${mm}:${sec}`; return result; - }; - FilterServiceImpl.prototype.apiFilterHandlerCheckForCommandError = function (serverPm) { + } + apiFilterHandlerCheckForCommandError(serverPm) { if (!serverPm[InternalContract.ParameterId.ParameterError]) { return; } @@ -16906,9 +9893,8 @@ var FilterServiceImpl = /** @class */ (function (_super) { throw new ApiShared_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidAggregationFieldName, serverPm[InternalContract.ParameterId.InvalidAggFieldName]); } throw new ApiShared_1.TableauError(api_external_contract_js_1.SharedErrorCodes.ServerError, 'Server Error'); - }; - return FilterServiceImpl; -}(ServiceImplBase_1.ServiceImplBase)); + } +} exports.FilterServiceImpl = FilterServiceImpl; @@ -16918,69 +9904,48 @@ exports.FilterServiceImpl = FilterServiceImpl; /*!******************************************************************************!*\ !*** ../api-shared-js/lib/src/ApiShared/Services/impl/GetDataServiceImpl.js ***! \******************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; -var __extends = (this && this.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); Object.defineProperty(exports, "__esModule", ({ value: true })); -var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -var uuid_1 = __webpack_require__(/*! uuid */ "../api-shared-js/node_modules/uuid/dist/esm-browser/index.js"); -var ApiShared_1 = __webpack_require__(/*! ../../../ApiShared */ "../api-shared-js/lib/src/ApiShared.js"); -var ExternalToInternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/ExternalToInternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/ExternalToInternalEnumMappings.js"); -var GetDataModels_1 = __webpack_require__(/*! ../../Models/GetDataModels */ "../api-shared-js/lib/src/ApiShared/Models/GetDataModels.js"); -var GetDataTableReaderModels_1 = __webpack_require__(/*! ../../Models/GetDataTableReaderModels */ "../api-shared-js/lib/src/ApiShared/Models/GetDataTableReaderModels.js"); -var DataValueFactory_1 = __webpack_require__(/*! ../../Utils/DataValueFactory */ "../api-shared-js/lib/src/ApiShared/Utils/DataValueFactory.js"); -var GetDataService_1 = __webpack_require__(/*! ../GetDataService */ "../api-shared-js/lib/src/ApiShared/Services/GetDataService.js"); -var ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); -var GetDataServiceImpl = /** @class */ (function (_super) { - __extends(GetDataServiceImpl, _super); - function GetDataServiceImpl() { - var _this = _super !== null && _super.apply(this, arguments) || this; +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const uuid_1 = __webpack_require__(/*! uuid */ "../api-shared-js/node_modules/uuid/dist/esm-browser/index.js"); +const ApiShared_1 = __webpack_require__(/*! ../../../ApiShared */ "../api-shared-js/lib/src/ApiShared.js"); +const ExternalToInternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/ExternalToInternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/ExternalToInternalEnumMappings.js"); +const GetDataModels_1 = __webpack_require__(/*! ../../Models/GetDataModels */ "../api-shared-js/lib/src/ApiShared/Models/GetDataModels.js"); +const GetDataTableReaderModels_1 = __webpack_require__(/*! ../../Models/GetDataTableReaderModels */ "../api-shared-js/lib/src/ApiShared/Models/GetDataTableReaderModels.js"); +const DataValueFactory_1 = __webpack_require__(/*! ../../Utils/DataValueFactory */ "../api-shared-js/lib/src/ApiShared/Utils/DataValueFactory.js"); +const GetDataService_1 = __webpack_require__(/*! ../GetDataService */ "../api-shared-js/lib/src/ApiShared/Services/GetDataService.js"); +const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +class GetDataServiceImpl extends ServiceImplBase_1.ServiceImplBase { + constructor() { + super(...arguments); // The extension/embedding instance uses the same cache for all DataTableReaders. - _this.viewDataTableCacheId = uuid_1.v4(); - return _this; - } - Object.defineProperty(GetDataServiceImpl.prototype, "serviceName", { - get: function () { - return "get-data-service" /* GetData */; - }, - enumerable: true, - configurable: true - }); - GetDataServiceImpl.prototype.getMaxRowLimit = function () { + this.viewDataTableCacheId = uuid_1.v4(); + } + get serviceName() { + return "get-data-service" /* GetData */; + } + getMaxRowLimit() { return 10000; - }; - GetDataServiceImpl.prototype.getViewDataTableCacheId = function () { + } + getViewDataTableCacheId() { return this.viewDataTableCacheId; - }; - GetDataServiceImpl.prototype.getLimitedMaxRows = function (requestedRows, rowCountLimit) { + } + getLimitedMaxRows(requestedRows, rowCountLimit) { return requestedRows > 0 && requestedRows < rowCountLimit ? requestedRows : rowCountLimit; - }; - GetDataServiceImpl.prototype.getUnderlyingDataAsync = function (visualId, getType, ignoreAliases, ignoreSelection, includeAllColumns, columnsToIncludeById, maxRows, includeDataValuesOption, applyWorksheetFormatting) { - var _a; - var _this = this; + } + getUnderlyingDataAsync(visualId, getType, ignoreAliases, ignoreSelection, includeAllColumns, columnsToIncludeById, maxRows, includeDataValuesOption, applyWorksheetFormatting) { // Create all of our parameters - var summaryData = getType === GetDataService_1.GetDataType.Summary; - var functionName = summaryData ? 'getSummaryDataAsync' : 'getUnderlyingDataAsync'; - var verb = summaryData ? api_internal_contract_js_1.VerbId.GetDataSummaryData : api_internal_contract_js_1.VerbId.GetUnderlyingData; - var requestMaxRows = verb === api_internal_contract_js_1.VerbId.GetUnderlyingData ? this.getLimitedMaxRows(maxRows, this.getMaxRowLimit() + 1) : maxRows; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = functionName, - _a); + const summaryData = getType === GetDataService_1.GetDataType.Summary; + const functionName = summaryData ? 'getSummaryDataAsync' : 'getUnderlyingDataAsync'; + const verb = summaryData ? api_internal_contract_js_1.VerbId.GetDataSummaryData : api_internal_contract_js_1.VerbId.GetUnderlyingData; + const requestMaxRows = verb === api_internal_contract_js_1.VerbId.GetUnderlyingData ? this.getLimitedMaxRows(maxRows, this.getMaxRowLimit() + 1) : maxRows; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: functionName, + }; parameters[api_internal_contract_js_1.ParameterId.VisualId] = visualId; parameters[api_internal_contract_js_1.ParameterId.IgnoreAliases] = ignoreAliases; parameters[api_internal_contract_js_1.ParameterId.IgnoreSelection] = ignoreSelection; @@ -16989,225 +9954,205 @@ var GetDataServiceImpl = /** @class */ (function (_super) { parameters[api_internal_contract_js_1.ParameterId.MaxRows] = requestMaxRows; parameters[api_internal_contract_js_1.ParameterId.ShowDataTableFormat] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption); parameters[api_internal_contract_js_1.ParameterId.ApplyWorksheetFormatting] = applyWorksheetFormatting; - return this.execute(verb, parameters).then(function (response) { - var responseData = response.result; - return _this.processResultsTable(responseData.data, responseData.isSummary); - }); - }; - GetDataServiceImpl.prototype.getSummaryDataReaderAsync = function (visualId, pageRowCount, ignoreAliases, ignoreSelection, includeAllColumns, columnsToIncludeById, includeDataValuesOption, applyWorksheetFormatting) { - var _a; - var _this = this; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getSummaryDataReaderAsync', - _a[api_internal_contract_js_1.ParameterId.ViewDataTableCacheId] = this.getViewDataTableCacheId(), - _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId, - _a[api_internal_contract_js_1.ParameterId.PageRowCount] = pageRowCount, - _a[api_internal_contract_js_1.ParameterId.IgnoreAliases] = ignoreAliases, - _a[api_internal_contract_js_1.ParameterId.IgnoreSelection] = ignoreSelection, - _a[api_internal_contract_js_1.ParameterId.IncludeAllColumns] = includeAllColumns, - _a[api_internal_contract_js_1.ParameterId.ColumnsToIncludeById] = this.verifyIncludeColumnArray(columnsToIncludeById), - _a[api_internal_contract_js_1.ParameterId.ShowDataTableFormat] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption), - _a[api_internal_contract_js_1.ParameterId.ApplyWorksheetFormatting] = applyWorksheetFormatting, - _a); - return this.execute(api_internal_contract_js_1.VerbId.GetDataSummaryDataReader, parameters).then(function (response) { - var responseData = response.result; - return new GetDataTableReaderModels_1.DataTableReader(responseData.id, responseData.totalRowCount, pageRowCount, _this._registryId); + return this.execute(verb, parameters).then((response) => { + const responseData = response.result; + return this.processResultsTable(responseData.data, responseData.isSummary); + }); + } + getSummaryDataReaderAsync(visualId, pageRowCount, ignoreAliases, ignoreSelection, includeAllColumns, columnsToIncludeById, includeDataValuesOption, applyWorksheetFormatting) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getSummaryDataReaderAsync', + [api_internal_contract_js_1.ParameterId.ViewDataTableCacheId]: this.getViewDataTableCacheId(), + [api_internal_contract_js_1.ParameterId.VisualId]: visualId, + [api_internal_contract_js_1.ParameterId.PageRowCount]: pageRowCount, + [api_internal_contract_js_1.ParameterId.IgnoreAliases]: ignoreAliases, + [api_internal_contract_js_1.ParameterId.IgnoreSelection]: ignoreSelection, + [api_internal_contract_js_1.ParameterId.IncludeAllColumns]: includeAllColumns, + [api_internal_contract_js_1.ParameterId.ColumnsToIncludeById]: this.verifyIncludeColumnArray(columnsToIncludeById), + [api_internal_contract_js_1.ParameterId.ShowDataTableFormat]: ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption), + [api_internal_contract_js_1.ParameterId.ApplyWorksheetFormatting]: applyWorksheetFormatting, + }; + return this.execute(api_internal_contract_js_1.VerbId.GetDataSummaryDataReader, parameters).then((response) => { + const responseData = response.result; + return new GetDataTableReaderModels_1.DataTableReader(responseData.id, responseData.totalRowCount, pageRowCount, this._registryId); }); - }; - GetDataServiceImpl.prototype.getSummaryColumnsInfoAsync = function (visualId) { - var _a; + } + getSummaryColumnsInfoAsync(visualId) { // Create all the parameters for GetDataType of Summary with 1 row, and only native values // Then return just the columns - var verb = api_internal_contract_js_1.VerbId.GetDataSummaryData; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getSummaryColumnsInfoAsync', - _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId, - _a[api_internal_contract_js_1.ParameterId.IgnoreAliases] = true, - _a[api_internal_contract_js_1.ParameterId.IgnoreSelection] = true, - _a[api_internal_contract_js_1.ParameterId.IncludeAllColumns] = true, - _a[api_internal_contract_js_1.ParameterId.MaxRows] = 1, - _a[api_internal_contract_js_1.ParameterId.ShowDataTableFormat] = api_internal_contract_js_1.ApiShowDataTableFormat.NativeValuesOnly, - _a); - return this.execute(verb, parameters).then(function (response) { - var underlyingDataTable = response.result; - var dataTable = underlyingDataTable.data; - var columns = dataTable.headers.map(function (h) { return new GetDataModels_1.Column(h.fieldCaption, h.fieldName, h.dataType, h.isReferenced, h.index); }); + const verb = api_internal_contract_js_1.VerbId.GetDataSummaryData; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getSummaryColumnsInfoAsync', + [api_internal_contract_js_1.ParameterId.VisualId]: visualId, + [api_internal_contract_js_1.ParameterId.IgnoreAliases]: true, + [api_internal_contract_js_1.ParameterId.IgnoreSelection]: true, + [api_internal_contract_js_1.ParameterId.IncludeAllColumns]: true, + [api_internal_contract_js_1.ParameterId.MaxRows]: 1, + [api_internal_contract_js_1.ParameterId.ShowDataTableFormat]: api_internal_contract_js_1.ApiShowDataTableFormat.NativeValuesOnly, + }; + return this.execute(verb, parameters).then((response) => { + const underlyingDataTable = response.result; + const dataTable = underlyingDataTable.data; + const columns = dataTable.headers.map((h) => new GetDataModels_1.Column(h.fieldCaption, h.fieldName, h.dataType, h.isReferenced, h.index)); return columns; }); - }; - GetDataServiceImpl.prototype.getSelectedMarksAsync = function (visualId) { - var _a; - var _this = this; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getSelectedMarksAsync', - _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId, - _a); - return this.execute(api_internal_contract_js_1.VerbId.GetSelectedMarks, parameters).then(function (response) { - var responseData = response.result; + } + getSelectedMarksAsync(visualId) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getSelectedMarksAsync', + [api_internal_contract_js_1.ParameterId.VisualId]: visualId, + }; + return this.execute(api_internal_contract_js_1.VerbId.GetSelectedMarks, parameters).then((response) => { + const responseData = response.result; return { - data: responseData.data.map(function (table) { return _this.processResultsTable(table, true); }), + data: responseData.data.map((table) => this.processResultsTable(table, true)), }; }); - }; - GetDataServiceImpl.prototype.getHighlightedMarksAsync = function (visualId) { - var _a; - var _this = this; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getHighlightedMarksAsync', - _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId, - _a); - return this.execute(api_internal_contract_js_1.VerbId.GetHighlightedMarks, parameters).then(function (response) { - var responseData = response.result; + } + getHighlightedMarksAsync(visualId) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getHighlightedMarksAsync', + [api_internal_contract_js_1.ParameterId.VisualId]: visualId, + }; + return this.execute(api_internal_contract_js_1.VerbId.GetHighlightedMarks, parameters).then((response) => { + const responseData = response.result; return { - data: responseData.data.map(function (table) { return _this.processResultsTable(table, true); }), + data: responseData.data.map((table) => this.processResultsTable(table, true)), }; }); - }; - GetDataServiceImpl.prototype.getDataSourceDataAsync = function (dataSourceId, ignoreAliases, maxRows, columnsToInclude, columnsToIncludeById, includeDataValuesOption) { - var _a; - var _this = this; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getDataSourceDataAsync', - _a[api_internal_contract_js_1.ParameterId.DataSourceId] = dataSourceId, - _a[api_internal_contract_js_1.ParameterId.IgnoreAliases] = ignoreAliases, - _a[api_internal_contract_js_1.ParameterId.MaxRows] = this.getLimitedMaxRows(maxRows, this.getMaxRowLimit() + 1), - _a[api_internal_contract_js_1.ParameterId.ColumnsToInclude] = this.verifyIncludeColumnArray(columnsToInclude), - _a[api_internal_contract_js_1.ParameterId.ColumnsToIncludeById] = this.verifyIncludeColumnArray(columnsToIncludeById), - _a[api_internal_contract_js_1.ParameterId.ShowDataTableFormat] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption), - _a); - return this.execute(api_internal_contract_js_1.VerbId.GetDataSourceData, parameters).then(function (response) { - var responseData = response.result; - return _this.processResultsTable(responseData.data, false); - }); - }; - GetDataServiceImpl.prototype.getLogicalTableDataAsync = function (datasourceId, logicalTableId, ignoreAliases, maxRows, columnsToInclude, columnsToIncludeById, includeDataValuesOption) { - var _a; - var _this = this; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getLogicalTableDataAsync', - _a[api_internal_contract_js_1.ParameterId.ColumnsToInclude] = columnsToInclude, - _a[api_internal_contract_js_1.ParameterId.ColumnsToIncludeById] = this.verifyIncludeColumnArray(columnsToIncludeById), - _a[api_internal_contract_js_1.ParameterId.DataSourceId] = datasourceId, - _a[api_internal_contract_js_1.ParameterId.IgnoreAliases] = ignoreAliases, - _a[api_internal_contract_js_1.ParameterId.LogicalTableId] = logicalTableId, - _a[api_internal_contract_js_1.ParameterId.MaxRows] = this.getLimitedMaxRows(maxRows, this.getMaxRowLimit() + 1), - _a[api_internal_contract_js_1.ParameterId.ShowDataTableFormat] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption), - _a); - return this.execute(api_internal_contract_js_1.VerbId.GetLogicalTableData, parameters).then(function (response) { - var responseData = response.result; - return _this.processResultsTable(responseData.data, false); + } + getDataSourceDataAsync(dataSourceId, ignoreAliases, maxRows, columnsToInclude, columnsToIncludeById, includeDataValuesOption) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getDataSourceDataAsync', + [api_internal_contract_js_1.ParameterId.DataSourceId]: dataSourceId, + [api_internal_contract_js_1.ParameterId.IgnoreAliases]: ignoreAliases, + [api_internal_contract_js_1.ParameterId.MaxRows]: this.getLimitedMaxRows(maxRows, this.getMaxRowLimit() + 1), + [api_internal_contract_js_1.ParameterId.ColumnsToInclude]: this.verifyIncludeColumnArray(columnsToInclude), + [api_internal_contract_js_1.ParameterId.ColumnsToIncludeById]: this.verifyIncludeColumnArray(columnsToIncludeById), + [api_internal_contract_js_1.ParameterId.ShowDataTableFormat]: ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption), + }; + return this.execute(api_internal_contract_js_1.VerbId.GetDataSourceData, parameters).then((response) => { + const responseData = response.result; + return this.processResultsTable(responseData.data, false); + }); + } + getLogicalTableDataAsync(datasourceId, logicalTableId, ignoreAliases, maxRows, columnsToInclude, columnsToIncludeById, includeDataValuesOption) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getLogicalTableDataAsync', + [api_internal_contract_js_1.ParameterId.ColumnsToInclude]: columnsToInclude, + [api_internal_contract_js_1.ParameterId.ColumnsToIncludeById]: this.verifyIncludeColumnArray(columnsToIncludeById), + [api_internal_contract_js_1.ParameterId.DataSourceId]: datasourceId, + [api_internal_contract_js_1.ParameterId.IgnoreAliases]: ignoreAliases, + [api_internal_contract_js_1.ParameterId.LogicalTableId]: logicalTableId, + [api_internal_contract_js_1.ParameterId.MaxRows]: this.getLimitedMaxRows(maxRows, this.getMaxRowLimit() + 1), + [api_internal_contract_js_1.ParameterId.ShowDataTableFormat]: ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption), + }; + return this.execute(api_internal_contract_js_1.VerbId.GetLogicalTableData, parameters).then((response) => { + const responseData = response.result; + return this.processResultsTable(responseData.data, false); }); - }; - GetDataServiceImpl.prototype.getLogicalTableDataReaderAsync = function (datasourceId, logicalTableId, pageRowCount, ignoreAliases, columnsToIncludeById, includeDataValuesOption) { - var _a; - var _this = this; + } + getLogicalTableDataReaderAsync(datasourceId, logicalTableId, pageRowCount, ignoreAliases, columnsToIncludeById, includeDataValuesOption) { pageRowCount = this.getLimitedMaxRows(pageRowCount, this.getMaxRowLimit()); - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getLogicalTableDataReaderAsync', - _a[api_internal_contract_js_1.ParameterId.ViewDataTableCacheId] = this.getViewDataTableCacheId(), - _a[api_internal_contract_js_1.ParameterId.DataSourceId] = datasourceId, - _a[api_internal_contract_js_1.ParameterId.LogicalTableId] = logicalTableId, - _a[api_internal_contract_js_1.ParameterId.PageRowCount] = pageRowCount, - _a[api_internal_contract_js_1.ParameterId.IgnoreAliases] = ignoreAliases, - _a[api_internal_contract_js_1.ParameterId.ColumnsToIncludeById] = this.verifyIncludeColumnArray(columnsToIncludeById), - _a[api_internal_contract_js_1.ParameterId.ShowDataTableFormat] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption), - _a); - return this.execute(api_internal_contract_js_1.VerbId.GetLogicalTableDataReader, parameters).then(function (response) { - var responseData = response.result; - return new GetDataTableReaderModels_1.DataTableReader(responseData.id, responseData.totalRowCount, pageRowCount, _this._registryId); - }); - }; - GetDataServiceImpl.prototype.getUnderlyingTableDataAsync = function (visualId, logicalTableId, ignoreAliases, ignoreSelection, includeAllColumns, columnsToIncludeById, maxRows, includeDataValuesOption, applyWorksheetFormatting) { - var _a; - var _this = this; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getUnderlyingTableDataAsync', - _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId, - _a[api_internal_contract_js_1.ParameterId.LogicalTableId] = logicalTableId, - _a[api_internal_contract_js_1.ParameterId.IgnoreAliases] = ignoreAliases, - _a[api_internal_contract_js_1.ParameterId.IgnoreSelection] = ignoreSelection, - _a[api_internal_contract_js_1.ParameterId.IncludeAllColumns] = includeAllColumns, - _a[api_internal_contract_js_1.ParameterId.ColumnsToIncludeById] = this.verifyIncludeColumnArray(columnsToIncludeById), - _a[api_internal_contract_js_1.ParameterId.MaxRows] = this.getLimitedMaxRows(maxRows, this.getMaxRowLimit() + 1), - _a[api_internal_contract_js_1.ParameterId.ShowDataTableFormat] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption), - _a[api_internal_contract_js_1.ParameterId.ApplyWorksheetFormatting] = applyWorksheetFormatting, - _a); - return this.execute(api_internal_contract_js_1.VerbId.GetUnderlyingTableData, parameters).then(function (response) { - var responseData = response.result; - return _this.processResultsTable(responseData.data, false); + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getLogicalTableDataReaderAsync', + [api_internal_contract_js_1.ParameterId.ViewDataTableCacheId]: this.getViewDataTableCacheId(), + [api_internal_contract_js_1.ParameterId.DataSourceId]: datasourceId, + [api_internal_contract_js_1.ParameterId.LogicalTableId]: logicalTableId, + [api_internal_contract_js_1.ParameterId.PageRowCount]: pageRowCount, + [api_internal_contract_js_1.ParameterId.IgnoreAliases]: ignoreAliases, + [api_internal_contract_js_1.ParameterId.ColumnsToIncludeById]: this.verifyIncludeColumnArray(columnsToIncludeById), + [api_internal_contract_js_1.ParameterId.ShowDataTableFormat]: ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption), + }; + return this.execute(api_internal_contract_js_1.VerbId.GetLogicalTableDataReader, parameters).then((response) => { + const responseData = response.result; + return new GetDataTableReaderModels_1.DataTableReader(responseData.id, responseData.totalRowCount, pageRowCount, this._registryId); + }); + } + getUnderlyingTableDataAsync(visualId, logicalTableId, ignoreAliases, ignoreSelection, includeAllColumns, columnsToIncludeById, maxRows, includeDataValuesOption, applyWorksheetFormatting) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getUnderlyingTableDataAsync', + [api_internal_contract_js_1.ParameterId.VisualId]: visualId, + [api_internal_contract_js_1.ParameterId.LogicalTableId]: logicalTableId, + [api_internal_contract_js_1.ParameterId.IgnoreAliases]: ignoreAliases, + [api_internal_contract_js_1.ParameterId.IgnoreSelection]: ignoreSelection, + [api_internal_contract_js_1.ParameterId.IncludeAllColumns]: includeAllColumns, + [api_internal_contract_js_1.ParameterId.ColumnsToIncludeById]: this.verifyIncludeColumnArray(columnsToIncludeById), + [api_internal_contract_js_1.ParameterId.MaxRows]: this.getLimitedMaxRows(maxRows, this.getMaxRowLimit() + 1), + [api_internal_contract_js_1.ParameterId.ShowDataTableFormat]: ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption), + [api_internal_contract_js_1.ParameterId.ApplyWorksheetFormatting]: applyWorksheetFormatting, + }; + return this.execute(api_internal_contract_js_1.VerbId.GetUnderlyingTableData, parameters).then((response) => { + const responseData = response.result; + return this.processResultsTable(responseData.data, false); }); - }; - GetDataServiceImpl.prototype.getUnderlyingTableDataReaderAsync = function (visualId, logicalTableId, pageRowCount, ignoreAliases, ignoreSelection, includeAllColumns, columnsToIncludeById, includeDataValuesOption, applyWorksheetFormatting) { - var _a; - var _this = this; + } + getUnderlyingTableDataReaderAsync(visualId, logicalTableId, pageRowCount, ignoreAliases, ignoreSelection, includeAllColumns, columnsToIncludeById, includeDataValuesOption, applyWorksheetFormatting) { pageRowCount = this.getLimitedMaxRows(pageRowCount, this.getMaxRowLimit()); - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getUnderlyingTableDataReaderAsync', - _a[api_internal_contract_js_1.ParameterId.ViewDataTableCacheId] = this.getViewDataTableCacheId(), - _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId, - _a[api_internal_contract_js_1.ParameterId.LogicalTableId] = logicalTableId, - _a[api_internal_contract_js_1.ParameterId.IgnoreAliases] = ignoreAliases, - _a[api_internal_contract_js_1.ParameterId.IgnoreSelection] = ignoreSelection, - _a[api_internal_contract_js_1.ParameterId.IncludeAllColumns] = includeAllColumns, - _a[api_internal_contract_js_1.ParameterId.ColumnsToIncludeById] = this.verifyIncludeColumnArray(columnsToIncludeById), - _a[api_internal_contract_js_1.ParameterId.ShowDataTableFormat] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption), - _a[api_internal_contract_js_1.ParameterId.PageRowCount] = pageRowCount, - _a[api_internal_contract_js_1.ParameterId.ApplyWorksheetFormatting] = applyWorksheetFormatting, - _a); - return this.execute(api_internal_contract_js_1.VerbId.GetUnderlyingTableDataReader, parameters).then(function (response) { - var responseData = response.result; - return new GetDataTableReaderModels_1.DataTableReader(responseData.id, responseData.totalRowCount, pageRowCount, _this._registryId); + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getUnderlyingTableDataReaderAsync', + [api_internal_contract_js_1.ParameterId.ViewDataTableCacheId]: this.getViewDataTableCacheId(), + [api_internal_contract_js_1.ParameterId.VisualId]: visualId, + [api_internal_contract_js_1.ParameterId.LogicalTableId]: logicalTableId, + [api_internal_contract_js_1.ParameterId.IgnoreAliases]: ignoreAliases, + [api_internal_contract_js_1.ParameterId.IgnoreSelection]: ignoreSelection, + [api_internal_contract_js_1.ParameterId.IncludeAllColumns]: includeAllColumns, + [api_internal_contract_js_1.ParameterId.ColumnsToIncludeById]: this.verifyIncludeColumnArray(columnsToIncludeById), + [api_internal_contract_js_1.ParameterId.ShowDataTableFormat]: ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption), + [api_internal_contract_js_1.ParameterId.PageRowCount]: pageRowCount, + [api_internal_contract_js_1.ParameterId.ApplyWorksheetFormatting]: applyWorksheetFormatting, + }; + return this.execute(api_internal_contract_js_1.VerbId.GetUnderlyingTableDataReader, parameters).then((response) => { + const responseData = response.result; + return new GetDataTableReaderModels_1.DataTableReader(responseData.id, responseData.totalRowCount, pageRowCount, this._registryId); }); - }; - GetDataServiceImpl.prototype.getPageAsync = function (tableId, pageNumber, pageSize) { - var _a; - var _this = this; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getPageAsync', - _a[api_internal_contract_js_1.ParameterId.ViewDataTableCacheId] = this.getViewDataTableCacheId(), - _a[api_internal_contract_js_1.ParameterId.ViewDataTableId] = tableId, - _a[api_internal_contract_js_1.ParameterId.DataRowIndex] = pageNumber * pageSize, - _a); - return this.execute(api_internal_contract_js_1.VerbId.GetDataTableReaderPage, parameters).then(function (response) { - var responseData = response.result; - return _this.processResultsPage(responseData, tableId === GetDataServiceImpl.summaryTableId ? true : false); + } + getPageAsync(tableId, pageNumber, pageSize) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getPageAsync', + [api_internal_contract_js_1.ParameterId.ViewDataTableCacheId]: this.getViewDataTableCacheId(), + [api_internal_contract_js_1.ParameterId.ViewDataTableId]: tableId, + [api_internal_contract_js_1.ParameterId.DataRowIndex]: pageNumber * pageSize, + }; + return this.execute(api_internal_contract_js_1.VerbId.GetDataTableReaderPage, parameters).then((response) => { + const responseData = response.result; + return this.processResultsPage(responseData, tableId === GetDataServiceImpl.summaryTableId ? true : false); }); - }; - GetDataServiceImpl.prototype.releaseAsync = function (tableId) { - var _a; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'release', - _a[api_internal_contract_js_1.ParameterId.ViewDataTableCacheId] = this.getViewDataTableCacheId(), - _a[api_internal_contract_js_1.ParameterId.ViewDataTableId] = tableId, - _a); - return this.execute(api_internal_contract_js_1.VerbId.ReleaseDataTableReader, parameters).then(function (response) { + } + releaseAsync(tableId) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'release', + [api_internal_contract_js_1.ParameterId.ViewDataTableCacheId]: this.getViewDataTableCacheId(), + [api_internal_contract_js_1.ParameterId.ViewDataTableId]: tableId, + }; + return this.execute(api_internal_contract_js_1.VerbId.ReleaseDataTableReader, parameters).then((response) => { return; }); - }; - GetDataServiceImpl.prototype.verifyIncludeColumnArray = function (columns) { + } + verifyIncludeColumnArray(columns) { // columns must be a valid array if (!Array.isArray(columns)) { throw new ApiShared_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, 'columnsToInclude and columnsToIncludeById must be valid arrays'); } // Remove any duplicates from the input array - var columnsAsSet = new Set(columns); + const columnsAsSet = new Set(columns); return Array.from(columnsAsSet); - }; - GetDataServiceImpl.prototype.processResultsTable = function (responseData, isSummary) { - var headers = responseData.headers.map(function (h) { return new GetDataModels_1.Column(h.fieldCaption, h.fieldName, h.dataType, h.isReferenced, h.index); }); + } + processResultsTable(responseData, isSummary) { + const headers = responseData.headers.map((h) => new GetDataModels_1.Column(h.fieldCaption, h.fieldName, h.dataType, h.isReferenced, h.index)); // TODO This should be controlled by a flag indicating whether this api will respond marks info or not - var marks; + let marks; if (responseData.marks) { - marks = responseData.marks.map(function (h) { return new GetDataModels_1.MarkInfo(h.type, h.color, h.tupleId); }); + marks = responseData.marks.map((h) => new GetDataModels_1.MarkInfo(h.type, h.color, h.tupleId)); } // Limit+1 is our sentinal that underlying data contains more rows than user is allowed to fetch. // Remove the last element so we always return MaxRowLimit - var isTotalRowCountLimited = isSummary === false && responseData.dataTable.length === this.getMaxRowLimit() + 1; + const isTotalRowCountLimited = isSummary === false && responseData.dataTable.length === this.getMaxRowLimit() + 1; if (isTotalRowCountLimited) { responseData.dataTable.length -= 1; } - var table = responseData.dataTable.map(function (row) { - return row.map(function (cell, index) { + const table = responseData.dataTable.map((row) => { + return row.map((cell, index) => { return DataValueFactory_1.DataValueFactory.MakeTableDataValue(cell, headers[index].dataType); }); }); @@ -17215,15 +10160,15 @@ var GetDataServiceImpl = /** @class */ (function (_super) { return new GetDataModels_1.DataTable(table, headers, table.length, isTotalRowCountLimited, isSummary, marks); } return new GetDataModels_1.DataTable(table, headers, table.length, isTotalRowCountLimited, isSummary); - }; - GetDataServiceImpl.prototype.processResultsPage = function (responseData, isSummary) { - var headers = responseData.headers.map(function (h) { return new GetDataModels_1.Column(h.fieldCaption, h.fieldName, h.dataType, h.isReferenced, h.index); }); - var marks; + } + processResultsPage(responseData, isSummary) { + const headers = responseData.headers.map((h) => new GetDataModels_1.Column(h.fieldCaption, h.fieldName, h.dataType, h.isReferenced, h.index)); + let marks; if (responseData.marks) { - marks = responseData.marks.map(function (h) { return new GetDataModels_1.MarkInfo(h.type, h.color, h.tupleId); }); + marks = responseData.marks.map((h) => new GetDataModels_1.MarkInfo(h.type, h.color, h.tupleId)); } - var table = responseData.dataTable.map(function (row) { - return row.map(function (cell, index) { + const table = responseData.dataTable.map((row) => { + return row.map((cell, index) => { return DataValueFactory_1.DataValueFactory.MakeTableDataValue(cell, headers[index].dataType); }); }); @@ -17231,11 +10176,10 @@ var GetDataServiceImpl = /** @class */ (function (_super) { return new GetDataModels_1.DataTable(table, headers, table.length, false, isSummary, marks); } return new GetDataModels_1.DataTable(table, headers, table.length, false, isSummary); - }; - GetDataServiceImpl.summaryTableId = ''; - return GetDataServiceImpl; -}(ServiceImplBase_1.ServiceImplBase)); + } +} exports.GetDataServiceImpl = GetDataServiceImpl; +GetDataServiceImpl.summaryTableId = ''; /***/ }), @@ -17244,39 +10188,17 @@ exports.GetDataServiceImpl = GetDataServiceImpl; /*!***********************************************************************************!*\ !*** ../api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImpl.js ***! \***********************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; -var __extends = (this && this.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); Object.defineProperty(exports, "__esModule", ({ value: true })); -var NotificationServiceImplBase_1 = __webpack_require__(/*! ./NotificationServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImplBase.js"); -var NotificationServiceImpl = /** @class */ (function (_super) { - __extends(NotificationServiceImpl, _super); - function NotificationServiceImpl() { - return _super !== null && _super.apply(this, arguments) || this; - } - Object.defineProperty(NotificationServiceImpl.prototype, "serviceName", { - get: function () { - return "notification-service" /* Notification */; - }, - enumerable: true, - configurable: true - }); - return NotificationServiceImpl; -}(NotificationServiceImplBase_1.NotificationServiceImplBase)); +const NotificationServiceImplBase_1 = __webpack_require__(/*! ./NotificationServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImplBase.js"); +class NotificationServiceImpl extends NotificationServiceImplBase_1.NotificationServiceImplBase { + get serviceName() { + return "notification-service" /* Notification */; + } +} exports.NotificationServiceImpl = NotificationServiceImpl; @@ -17291,53 +10213,50 @@ exports.NotificationServiceImpl = NotificationServiceImpl; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -var Registration = /** @class */ (function () { - function Registration(_filterFn, _callbackFn) { +class Registration { + constructor(_filterFn, _callbackFn) { this._filterFn = _filterFn; this._callbackFn = _callbackFn; // Nothing Here } - Registration.prototype.onNotification = function (notificationModel) { + onNotification(notificationModel) { if (this._filterFn(notificationModel)) { this._callbackFn(notificationModel); } - }; - return Registration; -}()); + } +} exports.Registration = Registration; -var NotificationServiceImplBase = /** @class */ (function () { - function NotificationServiceImplBase(dispatcher) { +class NotificationServiceImplBase { + constructor(dispatcher) { this.dispatcher = dispatcher; this._handlers = {}; this.dispatcher.registerNotificationHandler(this.onNotification.bind(this)); } - NotificationServiceImplBase.prototype.registerHandler = function (id, filterFn, handler) { - var _this = this; - var handlers = this._handlers[id] || new Array(); - var registration = new Registration(filterFn, handler); + registerHandler(id, filterFn, handler) { + const handlers = this._handlers[id] || new Array(); + const registration = new Registration(filterFn, handler); handlers.push(registration); this._handlers[id] = handlers; - return function () { return _this.removeRegistration(id, registration); }; - }; - NotificationServiceImplBase.prototype.hasHandlersForNotificationType = function (id) { + return () => this.removeRegistration(id, registration); + } + hasHandlersForNotificationType(id) { // eslint-disable-next-line no-prototype-builtins return this._handlers.hasOwnProperty(id); - }; - NotificationServiceImplBase.prototype.onNotification = function (notification) { + } + onNotification(notification) { if (!this.hasHandlersForNotificationType(notification.notificationId)) { return; } // Go through and check for all the handlers of this particular notification - this._handlers[notification.notificationId].forEach(function (h) { return h.onNotification(notification.data); }); - }; - NotificationServiceImplBase.prototype.removeRegistration = function (id, registration) { + this._handlers[notification.notificationId].forEach((h) => h.onNotification(notification.data)); + } + removeRegistration(id, registration) { if (!this.hasHandlersForNotificationType(id)) { return; } - this._handlers[id] = this._handlers[id].filter(function (reg) { return reg !== registration; }); - }; - return NotificationServiceImplBase; -}()); + this._handlers[id] = this._handlers[id].filter((reg) => reg !== registration); + } +} exports.NotificationServiceImplBase = NotificationServiceImplBase; @@ -17347,89 +10266,62 @@ exports.NotificationServiceImplBase = NotificationServiceImplBase; /*!*********************************************************************************!*\ !*** ../api-shared-js/lib/src/ApiShared/Services/impl/ParametersServiceImpl.js ***! \*********************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; -var __extends = (this && this.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); Object.defineProperty(exports, "__esModule", ({ value: true })); -var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -var ParameterImpl_1 = __webpack_require__(/*! ../../Impl/ParameterImpl */ "../api-shared-js/lib/src/ApiShared/Impl/ParameterImpl.js"); -var TableauError_1 = __webpack_require__(/*! ../../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); -var ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); -var ParametersServiceImpl = /** @class */ (function (_super) { - __extends(ParametersServiceImpl, _super); - function ParametersServiceImpl() { - return _super !== null && _super.apply(this, arguments) || this; - } - Object.defineProperty(ParametersServiceImpl.prototype, "serviceName", { - get: function () { - return "parameters-service" /* Parameters */; - }, - enumerable: true, - configurable: true - }); - ParametersServiceImpl.prototype.getParametersForSheetAsync = function (sheetPath) { - var _a; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getParametersForSheetAsync', - _a[api_internal_contract_js_1.ParameterId.SheetPath] = sheetPath, - _a); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const ParameterImpl_1 = __webpack_require__(/*! ../../Impl/ParameterImpl */ "../api-shared-js/lib/src/ApiShared/Impl/ParameterImpl.js"); +const TableauError_1 = __webpack_require__(/*! ../../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +class ParametersServiceImpl extends ServiceImplBase_1.ServiceImplBase { + get serviceName() { + return "parameters-service" /* Parameters */; + } + getParametersForSheetAsync(sheetPath) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getParametersForSheetAsync', + [api_internal_contract_js_1.ParameterId.SheetPath]: sheetPath, + }; return this.getParametersAsync(parameters); - }; - ParametersServiceImpl.prototype.getAllParametersAsync = function () { - var _a; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getParametersForSheetAsync', - _a); + } + getAllParametersAsync() { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getParametersForSheetAsync', + }; return this.getParametersAsync(parameters); - }; - ParametersServiceImpl.prototype.getParametersAsync = function (inputParameters) { - var _this = this; - return this.execute(api_internal_contract_js_1.VerbId.GetParametersForSheet, inputParameters).then(function (response) { - var result = response.result; - return result.map(function (parameterInfo) { - return new ParameterImpl_1.ParameterImpl(parameterInfo, _this._registryId); + } + getParametersAsync(inputParameters) { + return this.execute(api_internal_contract_js_1.VerbId.GetParametersForSheet, inputParameters).then((response) => { + const result = response.result; + return result.map((parameterInfo) => { + return new ParameterImpl_1.ParameterImpl(parameterInfo, this._registryId); }); }); - }; - ParametersServiceImpl.prototype.changeParameterValueAsync = function (fieldName, newValue) { - var _a; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'changeParameterValueAsync', - _a[api_internal_contract_js_1.ParameterId.ParameterFieldName] = fieldName, - _a[api_internal_contract_js_1.ParameterId.ParameterValue] = newValue, - _a); - return this.execute(api_internal_contract_js_1.VerbId.ChangeParameterValue, parameters).then(function (response) { - var result = response.result; + } + changeParameterValueAsync(fieldName, newValue) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'changeParameterValueAsync', + [api_internal_contract_js_1.ParameterId.ParameterFieldName]: fieldName, + [api_internal_contract_js_1.ParameterId.ParameterValue]: newValue, + }; + return this.execute(api_internal_contract_js_1.VerbId.ChangeParameterValue, parameters).then((response) => { + const result = response.result; return result; }); - }; - ParametersServiceImpl.prototype.findParameterByNameAsync = function (name) { + } + findParameterByNameAsync(name) { return this.findParameterAsync(name, undefined); - }; - ParametersServiceImpl.prototype.findParameterByGlobalFieldNameAsync = function (fieldName) { + } + findParameterByGlobalFieldNameAsync(fieldName) { return this.findParameterAsync(undefined, fieldName); - }; - ParametersServiceImpl.prototype.findParameterAsync = function (name, fieldName) { - var _a; - var _this = this; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'findParameterAsync', - _a); + } + findParameterAsync(name, fieldName) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'findParameterAsync', + }; if (name !== undefined) { parameters[api_internal_contract_js_1.ParameterId.ParameterCaption] = name; } @@ -17439,22 +10331,21 @@ var ParametersServiceImpl = /** @class */ (function (_super) { else { throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, 'name or fieldName must be provided to find parameter'); } - return this.execute(api_internal_contract_js_1.VerbId.FindParameter, parameters).then(function (response) { - var instanceOfParameterInfo = function (object) { + return this.execute(api_internal_contract_js_1.VerbId.FindParameter, parameters).then((response) => { + const instanceOfParameterInfo = (object) => { return 'fieldName' in object; }; // We need to check to see if we got a valid response back again if (instanceOfParameterInfo(response.result)) { - var result = response.result; - return new ParameterImpl_1.ParameterImpl(result, _this._registryId); + const result = response.result; + return new ParameterImpl_1.ParameterImpl(result, this._registryId); } else { return undefined; } }); - }; - return ParametersServiceImpl; -}(ServiceImplBase_1.ServiceImplBase)); + } +} exports.ParametersServiceImpl = ParametersServiceImpl; @@ -17464,57 +10355,35 @@ exports.ParametersServiceImpl = ParametersServiceImpl; /*!********************************************************************************!*\ !*** ../api-shared-js/lib/src/ApiShared/Services/impl/SelectionServiceImpl.js ***! \********************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; -var __extends = (this && this.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); Object.defineProperty(exports, "__esModule", ({ value: true })); -var Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -var SelectionModels_1 = __webpack_require__(/*! ../../Models/SelectionModels */ "../api-shared-js/lib/src/ApiShared/Models/SelectionModels.js"); -var TableauError_1 = __webpack_require__(/*! ../../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); -var Param_1 = __webpack_require__(/*! ../../Utils/Param */ "../api-shared-js/lib/src/ApiShared/Utils/Param.js"); -var ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); -var SelectionServiceImpl = /** @class */ (function (_super) { - __extends(SelectionServiceImpl, _super); - function SelectionServiceImpl() { - return _super !== null && _super.apply(this, arguments) || this; - } - Object.defineProperty(SelectionServiceImpl.prototype, "serviceName", { - get: function () { - return "selection-service" /* Selection */; - }, - enumerable: true, - configurable: true - }); +const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const SelectionModels_1 = __webpack_require__(/*! ../../Models/SelectionModels */ "../api-shared-js/lib/src/ApiShared/Models/SelectionModels.js"); +const TableauError_1 = __webpack_require__(/*! ../../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +const Param_1 = __webpack_require__(/*! ../../Utils/Param */ "../api-shared-js/lib/src/ApiShared/Utils/Param.js"); +const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +class SelectionServiceImpl extends ServiceImplBase_1.ServiceImplBase { + get serviceName() { + return "selection-service" /* Selection */; + } /** * Method to clear all the selected marks for the given worksheet. * * @param visualId */ - SelectionServiceImpl.prototype.clearSelectedMarksAsync = function (visualId) { - var _a; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'clearSelectedMarksAsync', - _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId, - _a); - return this.execute(api_internal_contract_js_1.VerbId.ClearSelectedMarks, parameters).then(function (response) { + clearSelectedMarksAsync(visualId) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'clearSelectedMarksAsync', + [api_internal_contract_js_1.ParameterId.VisualId]: visualId, + }; + return this.execute(api_internal_contract_js_1.VerbId.ClearSelectedMarks, parameters).then((response) => { return; // Expecting an empty model and hence the void response. }); - }; + } /** * Method to select marks for the given worksheet. * @@ -17522,19 +10391,17 @@ var SelectionServiceImpl = /** @class */ (function (_super) { * @param selectionCriteria * @param selectionUpdateType */ - SelectionServiceImpl.prototype.selectMarksByValueAsync = function (visualId, selectionCriterias, selectionUpdateType) { - var _a; - var _this = this; + selectMarksByValueAsync(visualId, selectionCriterias, selectionUpdateType) { if (selectionCriterias.length === 0) { throw new TableauError_1.TableauError(Contract.ErrorCodes.InvalidParameter, 'Selection criteria missing for selecting marks by value'); } - var selectionType = this.validateSelectionUpdateType(selectionUpdateType); - var selectionModelContainer = this.parseSelectionMarks(selectionCriterias); - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'selectMarksByValueAsync', - _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId, - _a[api_internal_contract_js_1.ParameterId.SelectionUpdateType] = selectionType, - _a); + const selectionType = this.validateSelectionUpdateType(selectionUpdateType); + const selectionModelContainer = this.parseSelectionMarks(selectionCriterias); + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'selectMarksByValueAsync', + [api_internal_contract_js_1.ParameterId.VisualId]: visualId, + [api_internal_contract_js_1.ParameterId.SelectionUpdateType]: selectionType, + }; if (selectionModelContainer.hierModelArr && selectionModelContainer.hierModelArr.length) { parameters[api_internal_contract_js_1.ParameterId.HierValSelectionModels] = selectionModelContainer.hierModelArr; } @@ -17544,11 +10411,11 @@ var SelectionServiceImpl = /** @class */ (function (_super) { if (selectionModelContainer.dimModelArr && selectionModelContainer.dimModelArr.length) { parameters[api_internal_contract_js_1.ParameterId.DimValSelectionModels] = selectionModelContainer.dimModelArr; } - return this.execute(api_internal_contract_js_1.VerbId.SelectByValue, parameters).then(function (response) { - _this.apiFilterHandlerCheckForCommandError(response.result); + return this.execute(api_internal_contract_js_1.VerbId.SelectByValue, parameters).then((response) => { + this.apiFilterHandlerCheckForCommandError(response.result); return; }); - }; + } /** * Method to execute hover actions and render tooltip for a given tuple representing a mark in the visualization. * If the tooltip parameter is included it will show the tooltip on hover. If not, no tooltip is shown. @@ -17558,17 +10425,16 @@ var SelectionServiceImpl = /** @class */ (function (_super) { * @param tooltip * @returns empty promise that resolves when the extension host has successfully been informed of the request and rejects on error */ - SelectionServiceImpl.prototype.hoverTupleAsync = function (visualId, hoveredTuple, tooltip, allowHoverActions) { - var _a; - var interactionModel = new SelectionModels_1.HoverTupleInteractionModel(visualId, this.ensureTupleIDIsNonNegative(hoveredTuple), tooltip, allowHoverActions); - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'hoverTupleAsync', - _a[api_internal_contract_js_1.ParameterId.HoverTupleInteraction] = interactionModel, - _a); - return this.execute(api_internal_contract_js_1.VerbId.RaiseHoverTupleNotification, parameters).then(function (response) { + hoverTupleAsync(visualId, hoveredTuple, tooltip, allowHoverActions) { + let interactionModel = new SelectionModels_1.HoverTupleInteractionModel(visualId, this.ensureTupleIDIsNonNegative(hoveredTuple), tooltip, allowHoverActions); + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'hoverTupleAsync', + [api_internal_contract_js_1.ParameterId.HoverTupleInteraction]: interactionModel, + }; + return this.execute(api_internal_contract_js_1.VerbId.RaiseHoverTupleNotification, parameters).then((response) => { return; }); - }; + } /** * Method to modify selection, execute select actions and render tooltip for a given list of tuples representing a mark or marks in the visualization. * If the tooltip parameter is included it will show the tooltip on select. If not, no tooltip is shown. @@ -17579,18 +10445,17 @@ var SelectionServiceImpl = /** @class */ (function (_super) { * @param tooltip * @returns empty promise that resolves when the extension host has successfully been informed of the request and rejects on error */ - SelectionServiceImpl.prototype.selectTuplesAsync = function (visualId, selectedTuples, selectOption, tooltip) { - var _a; - var interactionModel = new SelectionModels_1.SelectTuplesInteractionModel(visualId, selectedTuples, selectOption, tooltip); - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'selectTuplesAsync', - _a[api_internal_contract_js_1.ParameterId.SelectTuplesInteraction] = interactionModel, - _a); - return this.execute(api_internal_contract_js_1.VerbId.RaiseSelectTuplesNotification, parameters).then(function (response) { + selectTuplesAsync(visualId, selectedTuples, selectOption, tooltip) { + let interactionModel = new SelectionModels_1.SelectTuplesInteractionModel(visualId, selectedTuples, selectOption, tooltip); + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'selectTuplesAsync', + [api_internal_contract_js_1.ParameterId.SelectTuplesInteraction]: interactionModel, + }; + return this.execute(api_internal_contract_js_1.VerbId.RaiseSelectTuplesNotification, parameters).then((response) => { return; }); - }; - SelectionServiceImpl.prototype.apiFilterHandlerCheckForCommandError = function (serverPm) { + } + apiFilterHandlerCheckForCommandError(serverPm) { if (!serverPm[api_internal_contract_js_1.ParameterId.ParameterError]) { return; } @@ -17603,7 +10468,7 @@ var SelectionServiceImpl = /** @class */ (function (_super) { if (serverPm[api_internal_contract_js_1.ParameterId.InvalidDates]) { throw new TableauError_1.TableauError(Contract.SharedErrorCodes.InvalidSelectionDate, serverPm[api_internal_contract_js_1.ParameterId.InvalidDates]); } - }; + } /** * Method to select marks for the given worksheet. * @@ -17611,34 +10476,33 @@ var SelectionServiceImpl = /** @class */ (function (_super) { * @param MarkInfo * @param selectionUpdateType */ - SelectionServiceImpl.prototype.selectMarksByIdAsync = function (visualId, marks, selectionUpdateType) { - var _a; + selectMarksByIdAsync(visualId, marks, selectionUpdateType) { if (marks.length === 0) { throw new TableauError_1.TableauError(Contract.ErrorCodes.InvalidParameter, 'Marks info missing for selecting marks by Id'); } - var selectionType = this.validateSelectionUpdateType(selectionUpdateType); - var selectionModelContainer = this.parseSelectionIds(marks); - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'selectMarksByIdAsync', - _a[api_internal_contract_js_1.ParameterId.VisualId] = visualId, - _a[api_internal_contract_js_1.ParameterId.SelectionUpdateType] = selectionType, - _a[api_internal_contract_js_1.ParameterId.Selection] = selectionModelContainer.selection, - _a); - return this.execute(api_internal_contract_js_1.VerbId.SelectByValue, parameters).then(function (response) { + const selectionType = this.validateSelectionUpdateType(selectionUpdateType); + const selectionModelContainer = this.parseSelectionIds(marks); + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'selectMarksByIdAsync', + [api_internal_contract_js_1.ParameterId.VisualId]: visualId, + [api_internal_contract_js_1.ParameterId.SelectionUpdateType]: selectionType, + [api_internal_contract_js_1.ParameterId.Selection]: selectionModelContainer.selection, + }; + return this.execute(api_internal_contract_js_1.VerbId.SelectByValue, parameters).then((response) => { // Expecting an empty model and hence the void response. return; // TODO Investigate the error response with multiple output params and throw error accordingly. }); - }; + } /** * Method to prepare the pres models for selection by MarksInfo * @param marks */ - SelectionServiceImpl.prototype.parseSelectionIds = function (marks) { - var ids = []; - var selectionModelContainer = new SelectionModels_1.SelectionModelsContainer(); - for (var i = 0; i < marks.length; i++) { - var tupleId = marks[i].tupleId; + parseSelectionIds(marks) { + const ids = []; + const selectionModelContainer = new SelectionModels_1.SelectionModelsContainer(); + for (let i = 0; i < marks.length; i++) { + const tupleId = marks[i].tupleId; if (tupleId !== undefined && tupleId !== null) { // If tuple id is provided use that instead of pair ids.push(tupleId.toString()); // collect the tuple ids @@ -17649,13 +10513,13 @@ var SelectionServiceImpl = /** @class */ (function (_super) { } if (ids.length !== 0) { // tuple ids based selection - var tupleSelectionModel = new SelectionModels_1.TupleSelectionModel(); + const tupleSelectionModel = new SelectionModels_1.TupleSelectionModel(); tupleSelectionModel.selectionType = 'tuples'; tupleSelectionModel.objectIds = ids; selectionModelContainer.selection = tupleSelectionModel; } return selectionModelContainer; - }; + } /** * Method to prepare the pres models for selection by values. * @@ -17666,33 +10530,33 @@ var SelectionServiceImpl = /** @class */ (function (_super) { * * @param marks */ - SelectionServiceImpl.prototype.parseSelectionMarks = function (selectionCriterias) { - var selectionModelContainer = new SelectionModels_1.SelectionModelsContainer(); - for (var i = 0; i < selectionCriterias.length; i++) { - var st = selectionCriterias[i]; + parseSelectionMarks(selectionCriterias) { + const selectionModelContainer = new SelectionModels_1.SelectionModelsContainer(); + for (let i = 0; i < selectionCriterias.length; i++) { + const st = selectionCriterias[i]; if (!(st.fieldName && st.value !== undefined && st.value !== null)) { throw new TableauError_1.TableauError(Contract.ErrorCodes.InternalError, 'Selection Criteria parsing error'); } - var catRegex = new RegExp('([[A-Za-z0-9]+]).*', 'g'); - var rangeOption = st.value; + const catRegex = new RegExp('([[A-Za-z0-9]+]).*', 'g'); + const rangeOption = st.value; if (catRegex.test(st.fieldName)) { // Hierarchical value selection - var hierModel = this.addToParamsList(st.fieldName, st.value); + const hierModel = this.addToParamsList(st.fieldName, st.value); selectionModelContainer.hierModelArr.push(hierModel); } else if (rangeOption.min !== undefined && rangeOption.max !== undefined) { // Range value selection - var quantModel = this.addToRangeParamsList(st.fieldName, rangeOption); + const quantModel = this.addToRangeParamsList(st.fieldName, rangeOption); selectionModelContainer.quantModelArr.push(quantModel); } else { // Dimension value selection - var dimModel = this.addToParamsList(st.fieldName, st.value); + const dimModel = this.addToParamsList(st.fieldName, st.value); selectionModelContainer.dimModelArr.push(dimModel); } } return selectionModelContainer; - }; + } /** * Method to transform the key value pair into value based pres model object. * @@ -17700,12 +10564,12 @@ var SelectionServiceImpl = /** @class */ (function (_super) { * @param fieldName * @param value */ - SelectionServiceImpl.prototype.addToParamsList = function (fieldName, value) { - var valueSelectionModel = new SelectionModels_1.ValueSelectionModel(); - var markValues = []; + addToParamsList(fieldName, value) { + const valueSelectionModel = new SelectionModels_1.ValueSelectionModel(); + const markValues = []; if (value instanceof Array) { - var valueArr = value; - for (var i = 0; i < valueArr.length; i++) { + const valueArr = value; + for (let i = 0; i < valueArr.length; i++) { markValues.push(Param_1.Param.serializeParameterValue(valueArr[i])); } } @@ -17715,7 +10579,7 @@ var SelectionServiceImpl = /** @class */ (function (_super) { valueSelectionModel.qualifiedFieldCaption = fieldName; valueSelectionModel.selectValues = markValues; return valueSelectionModel; - }; + } /** * Method to transform the key value pair into range based selection pres model. * @@ -17725,8 +10589,8 @@ var SelectionServiceImpl = /** @class */ (function (_super) { * @param fieldName * @param value */ - SelectionServiceImpl.prototype.addToRangeParamsList = function (fieldName, value) { - var rangeSelectionModel = new SelectionModels_1.RangeSelectionModel(); + addToRangeParamsList(fieldName, value) { + const rangeSelectionModel = new SelectionModels_1.RangeSelectionModel(); rangeSelectionModel.qualifiedFieldCaption = fieldName; if (value.max !== undefined && value.max !== null) { rangeSelectionModel.maxValue = Param_1.Param.serializeParameterValue(value.max); @@ -17736,13 +10600,13 @@ var SelectionServiceImpl = /** @class */ (function (_super) { } rangeSelectionModel.included = this.validateNullOptionType(value.nullOption); return rangeSelectionModel; - }; + } /** * Method to validate the selection update type. * * @param selectionUpdateType */ - SelectionServiceImpl.prototype.validateSelectionUpdateType = function (selectionUpdateType) { + validateSelectionUpdateType(selectionUpdateType) { if (selectionUpdateType === Contract.SelectionUpdateType.Replace) { return api_internal_contract_js_1.SelectionUpdateType.Replace; } @@ -17753,13 +10617,13 @@ var SelectionServiceImpl = /** @class */ (function (_super) { return api_internal_contract_js_1.SelectionUpdateType.Remove; } return api_internal_contract_js_1.SelectionUpdateType.Replace; - }; + } /** * Method to validate the include type for range selection. * * @param nullOption */ - SelectionServiceImpl.prototype.validateNullOptionType = function (nullOption) { + validateNullOptionType(nullOption) { if (nullOption) { if (nullOption === Contract.FilterNullOption.NullValues) { return api_internal_contract_js_1.QuantitativeIncludedValues.IncludeNull; @@ -17772,17 +10636,16 @@ var SelectionServiceImpl = /** @class */ (function (_super) { } } return api_internal_contract_js_1.QuantitativeIncludedValues.IncludeAll; - }; - SelectionServiceImpl.prototype.ensureTupleIDIsNonNegative = function (tupleId) { + } + ensureTupleIDIsNonNegative(tupleId) { if (tupleId && tupleId > 0) { return tupleId; } // 0 will not refer to a valid tuple (since tuple ids are 1-based), // but can be used for clearing the current hover or selection return 0; - }; - return SelectionServiceImpl; -}(ServiceImplBase_1.ServiceImplBase)); + } +} exports.SelectionServiceImpl = SelectionServiceImpl; @@ -17797,30 +10660,29 @@ exports.SelectionServiceImpl = SelectionServiceImpl; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -var InternalToExternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/InternalToExternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js"); -var TableauError_1 = __webpack_require__(/*! ../../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); -var EnumConverter_1 = __webpack_require__(/*! ../../Utils/EnumConverter */ "../api-shared-js/lib/src/ApiShared/Utils/EnumConverter.js"); +const InternalToExternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/InternalToExternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js"); +const TableauError_1 = __webpack_require__(/*! ../../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +const EnumConverter_1 = __webpack_require__(/*! ../../Utils/EnumConverter */ "../api-shared-js/lib/src/ApiShared/Utils/EnumConverter.js"); /** * Each ServceImpl should extend this base class for the sake of * proper error handling. This base handles the conversion * from internal errors to external errors that we throw to developers */ -var ServiceImplBase = /** @class */ (function () { - function ServiceImplBase(_dispatcher, _registryId) { +class ServiceImplBase { + constructor(_dispatcher, _registryId) { this._dispatcher = _dispatcher; this._registryId = _registryId; } - ServiceImplBase.prototype.execute = function (verb, params) { - return this._dispatcher.execute(verb, params).catch(function (error) { + execute(verb, params) { + return this._dispatcher.execute(verb, params).catch((error) => { // Any internal error that comes from the dispatcher should be converted // to an external error using the enum mapper for error codes. - var internalError = error; - var externalErrorCode = InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.errorCode.convert(internalError.errorCode, EnumConverter_1.ShouldThrow.No); + const internalError = error; + const externalErrorCode = InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.errorCode.convert(internalError.errorCode, EnumConverter_1.ShouldThrow.No); throw new TableauError_1.TableauError(externalErrorCode, internalError.message); }); - }; - return ServiceImplBase; -}()); + } +} exports.ServiceImplBase = ServiceImplBase; @@ -17830,55 +10692,32 @@ exports.ServiceImplBase = ServiceImplBase; /*!***************************************************************************!*\ !*** ../api-shared-js/lib/src/ApiShared/Services/impl/SizeServiceImpl.js ***! \***************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; -var __extends = (this && this.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); Object.defineProperty(exports, "__esModule", ({ value: true })); -var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -var ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); -var SizeServiceImpl = /** @class */ (function (_super) { - __extends(SizeServiceImpl, _super); - function SizeServiceImpl() { - return _super !== null && _super.apply(this, arguments) || this; - } - Object.defineProperty(SizeServiceImpl.prototype, "serviceName", { - get: function () { - return "size-service" /* Size */; - }, - enumerable: true, - configurable: true - }); - SizeServiceImpl.prototype.changeSizeAsync = function (name, newSize) { - var _a; - var _b, _c, _d, _e; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'changeSizeAsync', - _a[api_internal_contract_js_1.ParameterId.SheetName] = name, - _a[api_internal_contract_js_1.ParameterId.MinHeight] = ((_b = newSize.minSize) === null || _b === void 0 ? void 0 : _b.height) || 0, - _a[api_internal_contract_js_1.ParameterId.MinWidth] = ((_c = newSize.minSize) === null || _c === void 0 ? void 0 : _c.width) || 0, - _a[api_internal_contract_js_1.ParameterId.MaxHeight] = ((_d = newSize.maxSize) === null || _d === void 0 ? void 0 : _d.height) || 0, - _a[api_internal_contract_js_1.ParameterId.MaxWidth] = ((_e = newSize.maxSize) === null || _e === void 0 ? void 0 : _e.width) || 0, - _a); - return this.execute(api_internal_contract_js_1.VerbId.SetSheetSize, parameters).then(function (_response) { +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +class SizeServiceImpl extends ServiceImplBase_1.ServiceImplBase { + get serviceName() { + return "size-service" /* Size */; + } + changeSizeAsync(name, newSize) { + var _a, _b, _c, _d; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'changeSizeAsync', + [api_internal_contract_js_1.ParameterId.SheetName]: name, + [api_internal_contract_js_1.ParameterId.MinHeight]: ((_a = newSize.minSize) === null || _a === void 0 ? void 0 : _a.height) || 0, + [api_internal_contract_js_1.ParameterId.MinWidth]: ((_b = newSize.minSize) === null || _b === void 0 ? void 0 : _b.width) || 0, + [api_internal_contract_js_1.ParameterId.MaxHeight]: ((_c = newSize.maxSize) === null || _c === void 0 ? void 0 : _c.height) || 0, + [api_internal_contract_js_1.ParameterId.MaxWidth]: ((_d = newSize.maxSize) === null || _d === void 0 ? void 0 : _d.width) || 0, + }; + return this.execute(api_internal_contract_js_1.VerbId.SetSheetSize, parameters).then((_response) => { return; }); - }; - return SizeServiceImpl; -}(ServiceImplBase_1.ServiceImplBase)); + } +} exports.SizeServiceImpl = SizeServiceImpl; @@ -17888,82 +10727,56 @@ exports.SizeServiceImpl = SizeServiceImpl; /*!**************************************************************************************!*\ !*** ../api-shared-js/lib/src/ApiShared/Services/impl/StoryActivationServiceImpl.js ***! \**************************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; -var __extends = (this && this.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); Object.defineProperty(exports, "__esModule", ({ value: true })); -var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -var ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); -var StoryActivationServiceImpl = /** @class */ (function (_super) { - __extends(StoryActivationServiceImpl, _super); - function StoryActivationServiceImpl() { - return _super !== null && _super.apply(this, arguments) || this; - } - Object.defineProperty(StoryActivationServiceImpl.prototype, "serviceName", { - get: function () { - return "story-activation-service" /* StoryActivation */; - }, - enumerable: true, - configurable: true - }); - StoryActivationServiceImpl.prototype.activateNextStoryPointAsync = function () { - var _a; - var verb = api_internal_contract_js_1.VerbId.ActivateNextStoryPoint; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'activateNextStoryPointAsync', - _a); - return this.execute(verb, parameters).then(function (response) { +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +class StoryActivationServiceImpl extends ServiceImplBase_1.ServiceImplBase { + get serviceName() { + return "story-activation-service" /* StoryActivation */; + } + activateNextStoryPointAsync() { + const verb = api_internal_contract_js_1.VerbId.ActivateNextStoryPoint; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'activateNextStoryPointAsync', + }; + return this.execute(verb, parameters).then((response) => { return; }); - }; - StoryActivationServiceImpl.prototype.activatePreviousStoryPointAsync = function () { - var _a; - var verb = api_internal_contract_js_1.VerbId.ActivatePreviousStoryPoint; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'activatePreviousStoryPointAsync', - _a); - return this.execute(verb, parameters).then(function (response) { + } + activatePreviousStoryPointAsync() { + const verb = api_internal_contract_js_1.VerbId.ActivatePreviousStoryPoint; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'activatePreviousStoryPointAsync', + }; + return this.execute(verb, parameters).then((response) => { return; }); - }; - StoryActivationServiceImpl.prototype.activateStoryPointAsync = function (index) { - var _a; - var verb = api_internal_contract_js_1.VerbId.ActivateStoryPoint; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'activateStoryPointAsync', - _a); + } + activateStoryPointAsync(index) { + const verb = api_internal_contract_js_1.VerbId.ActivateStoryPoint; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'activateStoryPointAsync', + }; parameters[api_internal_contract_js_1.ParameterId.StoryPointIndex] = index; - return this.execute(verb, parameters).then(function (response) { + return this.execute(verb, parameters).then((response) => { return; }); - }; - StoryActivationServiceImpl.prototype.revertStoryPointAsync = function (index) { - var _a; - var verb = api_internal_contract_js_1.VerbId.RevertStoryPoint; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'revertStoryPointAsync', - _a); + } + revertStoryPointAsync(index) { + const verb = api_internal_contract_js_1.VerbId.RevertStoryPoint; + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'revertStoryPointAsync', + }; parameters[api_internal_contract_js_1.ParameterId.StoryPointIndex] = index; - return this.execute(verb, parameters).then(function (response) { + return this.execute(verb, parameters).then((response) => { return response.result; }); - }; - return StoryActivationServiceImpl; -}(ServiceImplBase_1.ServiceImplBase)); + } +} exports.StoryActivationServiceImpl = StoryActivationServiceImpl; @@ -17973,105 +10786,77 @@ exports.StoryActivationServiceImpl = StoryActivationServiceImpl; /*!**********************************************************************************!*\ !*** ../api-shared-js/lib/src/ApiShared/Services/impl/VisualModelServiceImpl.js ***! \**********************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; -var __extends = (this && this.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); Object.defineProperty(exports, "__esModule", ({ value: true })); -var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -var ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); -var VisualModelServiceImpl = /** @class */ (function (_super) { - __extends(VisualModelServiceImpl, _super); - function VisualModelServiceImpl() { - return _super !== null && _super.apply(this, arguments) || this; - } - Object.defineProperty(VisualModelServiceImpl.prototype, "serviceName", { - get: function () { - return "visual-model-service" /* VisualModel */; - }, - enumerable: true, - configurable: true - }); - VisualModelServiceImpl.prototype.getVisualSpecificationAsync = function (visualId) { - var _a; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getVisualSpecificationAsync', - _a[api_internal_contract_js_1.ParameterId.WorksheetName] = visualId.worksheet, - _a); - return this.execute(api_internal_contract_js_1.VerbId.GetVisualSpecification, parameters).then(function (response) { - var result = response.result; +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +class VisualModelServiceImpl extends ServiceImplBase_1.ServiceImplBase { + get serviceName() { + return "visual-model-service" /* VisualModel */; + } + getVisualSpecificationAsync(visualId) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getVisualSpecificationAsync', + [api_internal_contract_js_1.ParameterId.WorksheetName]: visualId.worksheet, + }; + return this.execute(api_internal_contract_js_1.VerbId.GetVisualSpecification, parameters).then((response) => { + const result = response.result; return result; }); - }; - VisualModelServiceImpl.prototype.addMarksCardFieldsAsync = function (visualId, marksCardIndex, encodingType, columns, startIndex) { - var _a; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'addMarksCardFieldsAsync', - _a[api_internal_contract_js_1.ParameterId.WorksheetName] = visualId.worksheet, - _a[api_internal_contract_js_1.ParameterId.MarksCardIndex] = marksCardIndex, - _a[api_internal_contract_js_1.ParameterId.EncodingType] = encodingType, - _a[api_internal_contract_js_1.ParameterId.Columns] = columns, - _a[api_internal_contract_js_1.ParameterId.StartIndex] = startIndex, - _a); - return this.execute(api_internal_contract_js_1.VerbId.AddMarksCardFields, parameters).then(function () { + } + addMarksCardFieldsAsync(visualId, marksCardIndex, encodingType, columns, startIndex) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'addMarksCardFieldsAsync', + [api_internal_contract_js_1.ParameterId.WorksheetName]: visualId.worksheet, + [api_internal_contract_js_1.ParameterId.MarksCardIndex]: marksCardIndex, + [api_internal_contract_js_1.ParameterId.EncodingType]: encodingType, + [api_internal_contract_js_1.ParameterId.Columns]: columns, + [api_internal_contract_js_1.ParameterId.StartIndex]: startIndex, + }; + return this.execute(api_internal_contract_js_1.VerbId.AddMarksCardFields, parameters).then(() => { return; }); - }; - VisualModelServiceImpl.prototype.moveMarksCardFieldAsync = function (visualId, marksCardIndex, fromIndex, toIndex, fieldCount) { - var _a; - if (fieldCount === void 0) { fieldCount = 1; } - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'addMarksCardFieldsAsync', - _a[api_internal_contract_js_1.ParameterId.WorksheetName] = visualId.worksheet, - _a[api_internal_contract_js_1.ParameterId.MarksCardIndex] = marksCardIndex, - _a[api_internal_contract_js_1.ParameterId.FromIndex] = fromIndex, - _a[api_internal_contract_js_1.ParameterId.ToIndex] = toIndex, - _a[api_internal_contract_js_1.ParameterId.FieldCount] = fieldCount, - _a); - return this.execute(api_internal_contract_js_1.VerbId.MoveMarksCardField, parameters).then(function () { + } + moveMarksCardFieldAsync(visualId, marksCardIndex, fromIndex, toIndex, fieldCount = 1) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'addMarksCardFieldsAsync', + [api_internal_contract_js_1.ParameterId.WorksheetName]: visualId.worksheet, + [api_internal_contract_js_1.ParameterId.MarksCardIndex]: marksCardIndex, + [api_internal_contract_js_1.ParameterId.FromIndex]: fromIndex, + [api_internal_contract_js_1.ParameterId.ToIndex]: toIndex, + [api_internal_contract_js_1.ParameterId.FieldCount]: fieldCount, + }; + return this.execute(api_internal_contract_js_1.VerbId.MoveMarksCardField, parameters).then(() => { return; }); - }; - VisualModelServiceImpl.prototype.spliceMarksCardFieldsAsync = function (visualId, marksCardIndex, encodingType, startIndex, deleteCount, columns) { - var _a; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'spliceMarksCardFieldsAsync', - _a[api_internal_contract_js_1.ParameterId.WorksheetName] = visualId.worksheet, - _a[api_internal_contract_js_1.ParameterId.MarksCardIndex] = marksCardIndex, - _a[api_internal_contract_js_1.ParameterId.EncodingType] = encodingType, - _a[api_internal_contract_js_1.ParameterId.StartIndex] = startIndex, - _a[api_internal_contract_js_1.ParameterId.DeleteCount] = deleteCount, - _a[api_internal_contract_js_1.ParameterId.Columns] = columns, - _a); - return this.execute(api_internal_contract_js_1.VerbId.SpliceMarksCardFields, parameters).then(function () { + } + spliceMarksCardFieldsAsync(visualId, marksCardIndex, encodingType, startIndex, deleteCount, columns) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'spliceMarksCardFieldsAsync', + [api_internal_contract_js_1.ParameterId.WorksheetName]: visualId.worksheet, + [api_internal_contract_js_1.ParameterId.MarksCardIndex]: marksCardIndex, + [api_internal_contract_js_1.ParameterId.EncodingType]: encodingType, + [api_internal_contract_js_1.ParameterId.StartIndex]: startIndex, + [api_internal_contract_js_1.ParameterId.DeleteCount]: deleteCount, + [api_internal_contract_js_1.ParameterId.Columns]: columns, + }; + return this.execute(api_internal_contract_js_1.VerbId.SpliceMarksCardFields, parameters).then(() => { return; }); - }; - VisualModelServiceImpl.prototype.editAliasesDialogAsync = function (fieldName) { - var _a; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'editAliasesDialogAsync', - _a[api_internal_contract_js_1.ParameterId.FieldId] = fieldName, - _a); - return this.execute(api_internal_contract_js_1.VerbId.EditAliasesDialog, parameters).then(function () { + } + editAliasesDialogAsync(fieldName) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'editAliasesDialogAsync', + [api_internal_contract_js_1.ParameterId.FieldId]: fieldName, + }; + return this.execute(api_internal_contract_js_1.VerbId.EditAliasesDialog, parameters).then(() => { return; }); - }; - return VisualModelServiceImpl; -}(ServiceImplBase_1.ServiceImplBase)); + } +} exports.VisualModelServiceImpl = VisualModelServiceImpl; @@ -18081,146 +10866,110 @@ exports.VisualModelServiceImpl = VisualModelServiceImpl; /*!**************************************************************************!*\ !*** ../api-shared-js/lib/src/ApiShared/Services/impl/VizServiceImpl.js ***! \**************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; -var __extends = (this && this.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); Object.defineProperty(exports, "__esModule", ({ value: true })); -var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -var CustomViewImpl_1 = __webpack_require__(/*! ../../Impl/CustomViewImpl */ "../api-shared-js/lib/src/ApiShared/Impl/CustomViewImpl.js"); -var ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); -var VizServiceImpl = /** @class */ (function (_super) { - __extends(VizServiceImpl, _super); - function VizServiceImpl() { - return _super !== null && _super.apply(this, arguments) || this; - } - Object.defineProperty(VizServiceImpl.prototype, "serviceName", { - get: function () { - return "viz-service" /* Viz */; - }, - enumerable: true, - configurable: true - }); - VizServiceImpl.prototype.createVizImageAsync = function (inputSpec) { - var _a; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'createVizImageAsync', - _a[api_internal_contract_js_1.ParameterId.VizAPIInputJson] = JSON.stringify(inputSpec), - _a); - return this.execute(api_internal_contract_js_1.VerbId.VizAPI, parameters).then(function (response) { - var result = response.result; +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const CustomViewImpl_1 = __webpack_require__(/*! ../../Impl/CustomViewImpl */ "../api-shared-js/lib/src/ApiShared/Impl/CustomViewImpl.js"); +const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +class VizServiceImpl extends ServiceImplBase_1.ServiceImplBase { + get serviceName() { + return "viz-service" /* Viz */; + } + createVizImageAsync(inputSpec) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'createVizImageAsync', + [api_internal_contract_js_1.ParameterId.VizAPIInputJson]: JSON.stringify(inputSpec), + }; + return this.execute(api_internal_contract_js_1.VerbId.VizAPI, parameters).then((response) => { + const result = response.result; return result; }); - }; - VizServiceImpl.prototype.activateSheetAsync = function (name) { - var _a; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'activateSheetAsync', - _a[api_internal_contract_js_1.ParameterId.SwitchToSheetName] = name, - _a); - return this.execute(api_internal_contract_js_1.VerbId.ActivateSheet, parameters).then(function () { + } + activateSheetAsync(name) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'activateSheetAsync', + [api_internal_contract_js_1.ParameterId.SwitchToSheetName]: name, + }; + return this.execute(api_internal_contract_js_1.VerbId.ActivateSheet, parameters).then(() => { return; }); - }; - VizServiceImpl.prototype.getCustomViewsAsync = function () { - var _a; - var _this = this; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getCustomViewsAsync', - _a); - return this.execute(api_internal_contract_js_1.VerbId.GetCustomViews, parameters).then(function (response) { - var customViews = response.result; - return customViews.map(function (customView) { - return new CustomViewImpl_1.CustomViewImpl(customView, _this._registryId); + } + getCustomViewsAsync() { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getCustomViewsAsync', + }; + return this.execute(api_internal_contract_js_1.VerbId.GetCustomViews, parameters).then((response) => { + const customViews = response.result; + return customViews.map((customView) => { + return new CustomViewImpl_1.CustomViewImpl(customView, this._registryId); }); }); - }; - VizServiceImpl.prototype.showCustomViewAsync = function (customViewName) { - var _a; - var _this = this; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'showCustomViewAsync', - _a[api_internal_contract_js_1.ParameterId.CustomViewName] = customViewName || '', - _a); - return this.execute(api_internal_contract_js_1.VerbId.ShowCustomView, parameters).then(function (response) { + } + showCustomViewAsync(customViewName) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'showCustomViewAsync', + [api_internal_contract_js_1.ParameterId.CustomViewName]: customViewName || '', + }; + return this.execute(api_internal_contract_js_1.VerbId.ShowCustomView, parameters).then((response) => { var _a; - var customView = response.result; - return ((_a = customView) === null || _a === void 0 ? void 0 : _a.luid) ? new CustomViewImpl_1.CustomViewImpl(customView, _this._registryId) : undefined; + const customView = response.result; + return ((_a = customView) === null || _a === void 0 ? void 0 : _a.luid) ? new CustomViewImpl_1.CustomViewImpl(customView, this._registryId) : undefined; }); - }; - VizServiceImpl.prototype.removeCustomViewAsync = function (customViewName) { - var _a; - var _this = this; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'removeCustomViewAsync', - _a[api_internal_contract_js_1.ParameterId.CustomViewName] = customViewName, - _a); - return this.execute(api_internal_contract_js_1.VerbId.RemoveCustomView, parameters).then(function (response) { - var customView = response.result; - return new CustomViewImpl_1.CustomViewImpl(customView, _this._registryId); + } + removeCustomViewAsync(customViewName) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'removeCustomViewAsync', + [api_internal_contract_js_1.ParameterId.CustomViewName]: customViewName, + }; + return this.execute(api_internal_contract_js_1.VerbId.RemoveCustomView, parameters).then((response) => { + const customView = response.result; + return new CustomViewImpl_1.CustomViewImpl(customView, this._registryId); }); - }; - VizServiceImpl.prototype.saveCustomViewAsync = function (customViewName) { - var _a; - var _this = this; + } + saveCustomViewAsync(customViewName) { // CustomViewIsDefault is a required parameter, but our API has not been updated to allow it to be specified yet. // We should add a 'default' parameter to the interface. - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'saveCustomViewAsync', - _a[api_internal_contract_js_1.ParameterId.CustomViewName] = customViewName, - _a[api_internal_contract_js_1.ParameterId.CustomViewIsDefault] = false, - _a); - return this.execute(api_internal_contract_js_1.VerbId.SaveWorkbookAsCustomView, parameters).then(function (response) { - var customView = response.result; - return new CustomViewImpl_1.CustomViewImpl(customView, _this._registryId); + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'saveCustomViewAsync', + [api_internal_contract_js_1.ParameterId.CustomViewName]: customViewName, + [api_internal_contract_js_1.ParameterId.CustomViewIsDefault]: false, + }; + return this.execute(api_internal_contract_js_1.VerbId.SaveWorkbookAsCustomView, parameters).then((response) => { + const customView = response.result; + return new CustomViewImpl_1.CustomViewImpl(customView, this._registryId); }); - }; - VizServiceImpl.prototype.setActiveCustomViewAsDefaultAsync = function () { - var _a; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'setActiveCustomViewAsDefaultAsync', - _a); - return this.execute(api_internal_contract_js_1.VerbId.SetActiveCustomViewAsDefault, parameters).then(function () { + } + setActiveCustomViewAsDefaultAsync() { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'setActiveCustomViewAsDefaultAsync', + }; + return this.execute(api_internal_contract_js_1.VerbId.SetActiveCustomViewAsDefault, parameters).then(() => { return; }); - }; - VizServiceImpl.prototype.saveAsync = function (customView) { - var _a; - var _this = this; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'saveAsync', - _a[api_internal_contract_js_1.ParameterId.CustomViewLuid] = customView.luid, - _a[api_internal_contract_js_1.ParameterId.CustomViewName] = customView.name, - _a[api_internal_contract_js_1.ParameterId.CustomViewIsDefault] = customView.isDefault, - _a[api_internal_contract_js_1.ParameterId.CustomViewIsPublic] = customView.shared, - _a); - return this.execute(api_internal_contract_js_1.VerbId.UpdateCustomView, parameters).then(function (response) { - var customView = response.result; - return new CustomViewImpl_1.CustomViewImpl(customView, _this._registryId); + } + saveAsync(customView) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'saveAsync', + [api_internal_contract_js_1.ParameterId.CustomViewLuid]: customView.luid, + [api_internal_contract_js_1.ParameterId.CustomViewName]: customView.name, + [api_internal_contract_js_1.ParameterId.CustomViewIsDefault]: customView.isDefault, + [api_internal_contract_js_1.ParameterId.CustomViewIsPublic]: customView.shared, + }; + return this.execute(api_internal_contract_js_1.VerbId.UpdateCustomView, parameters).then((response) => { + const customView = response.result; + return new CustomViewImpl_1.CustomViewImpl(customView, this._registryId); }); - }; - VizServiceImpl.prototype.getCurrentSrcAsync = function () { - var _a; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'getCurrentSrcAsync', - _a); - return this.execute(api_internal_contract_js_1.VerbId.GetCurrentSrc, parameters).then(function (response) { return response.result; }); - }; - return VizServiceImpl; -}(ServiceImplBase_1.ServiceImplBase)); + } + getCurrentSrcAsync() { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getCurrentSrcAsync', + }; + return this.execute(api_internal_contract_js_1.VerbId.GetCurrentSrc, parameters).then((response) => response.result); + } +} exports.VizServiceImpl = VizServiceImpl; @@ -18230,76 +10979,52 @@ exports.VizServiceImpl = VizServiceImpl; /*!***************************************************************************!*\ !*** ../api-shared-js/lib/src/ApiShared/Services/impl/ZoneServiceImpl.js ***! \***************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; -var __extends = (this && this.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); Object.defineProperty(exports, "__esModule", ({ value: true })); -var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -var ExternalToInternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/ExternalToInternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/ExternalToInternalEnumMappings.js"); -var ErrorHelpers_1 = __webpack_require__(/*! ../../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); -var Param_1 = __webpack_require__(/*! ../../Utils/Param */ "../api-shared-js/lib/src/ApiShared/Utils/Param.js"); -var ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); -var ZoneServiceImpl = /** @class */ (function (_super) { - __extends(ZoneServiceImpl, _super); - function ZoneServiceImpl() { - return _super !== null && _super.apply(this, arguments) || this; - } - Object.defineProperty(ZoneServiceImpl.prototype, "serviceName", { - get: function () { - return "zone-service" /* Zone */; - }, - enumerable: true, - configurable: true - }); - ZoneServiceImpl.prototype.setVisibilityAsync = function (dashboard, dashboardZoneMap, zoneVisibilityMap) { - var _a; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.FunctionName] = 'setVisibilityAsync', - _a[api_internal_contract_js_1.ParameterId.Dashboard] = dashboard, - _a[api_internal_contract_js_1.ParameterId.ZoneIdsVisibilityMap] = {}, - _a); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const ExternalToInternalEnumMappings_1 = __webpack_require__(/*! ../../EnumMappings/ExternalToInternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/ExternalToInternalEnumMappings.js"); +const ErrorHelpers_1 = __webpack_require__(/*! ../../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +const Param_1 = __webpack_require__(/*! ../../Utils/Param */ "../api-shared-js/lib/src/ApiShared/Utils/Param.js"); +const ServiceImplBase_1 = __webpack_require__(/*! ./ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +class ZoneServiceImpl extends ServiceImplBase_1.ServiceImplBase { + get serviceName() { + return "zone-service" /* Zone */; + } + setVisibilityAsync(dashboard, dashboardZoneMap, zoneVisibilityMap) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'setVisibilityAsync', + [api_internal_contract_js_1.ParameterId.Dashboard]: dashboard, + [api_internal_contract_js_1.ParameterId.ZoneIdsVisibilityMap]: {}, + }; // zoneVisibilityMap can be either an object or a Map - convert it to a Map - var parameterAsMap = Param_1.Param.convertParameterToMap(zoneVisibilityMap, 'zoneVisibilityMap'); - parameterAsMap.forEach(function (value, key) { + const parameterAsMap = Param_1.Param.convertParameterToMap(zoneVisibilityMap, 'zoneVisibilityMap'); + parameterAsMap.forEach((value, key) => { ErrorHelpers_1.ErrorHelpers.verifyZoneIsValid(dashboardZoneMap, Number.parseInt(key, 10)); ErrorHelpers_1.ErrorHelpers.verifyEnumValue(value, api_external_contract_js_1.DashboardObjectVisibilityType, 'DashboardObjectVisibilityType'); parameters[api_internal_contract_js_1.ParameterId.ZoneIdsVisibilityMap][key] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.setVisibilityType.convert(value); }); - return this.execute(api_internal_contract_js_1.VerbId.SetZoneVisibility, parameters).then(function (response) { + return this.execute(api_internal_contract_js_1.VerbId.SetZoneVisibility, parameters).then((response) => { return; }); - }; - ZoneServiceImpl.prototype.moveAndResizeAsync = function (dashboard, dashboardZoneMap, dashboardObjectPositionAndSizeUpdateArray) { - var _a; - var parameters = (_a = {}, - _a[api_internal_contract_js_1.ParameterId.Dashboard] = dashboard, - _a[api_internal_contract_js_1.ParameterId.DashboardObjectPositionAndSizeUpdateList] = dashboardObjectPositionAndSizeUpdateArray, - _a); - dashboardObjectPositionAndSizeUpdateArray.forEach(function (dashboardObject) { + } + moveAndResizeAsync(dashboard, dashboardZoneMap, dashboardObjectPositionAndSizeUpdateArray) { + const parameters = { + [api_internal_contract_js_1.ParameterId.Dashboard]: dashboard, + [api_internal_contract_js_1.ParameterId.DashboardObjectPositionAndSizeUpdateList]: dashboardObjectPositionAndSizeUpdateArray, + }; + dashboardObjectPositionAndSizeUpdateArray.forEach((dashboardObject) => { ErrorHelpers_1.ErrorHelpers.verifyZoneIsValidAndFloating(dashboardZoneMap, dashboardObject.dashboardObjectID); ErrorHelpers_1.ErrorHelpers.verifyWidthAndHeightOfDashboardObjectPositionAndSizeUpdate(dashboardObject); }); - return this.execute(api_internal_contract_js_1.VerbId.MoveAndResizeZones, parameters).then(function (response) { + return this.execute(api_internal_contract_js_1.VerbId.MoveAndResizeZones, parameters).then((response) => { return; }); - }; - return ZoneServiceImpl; -}(ServiceImplBase_1.ServiceImplBase)); + } +} exports.ZoneServiceImpl = ZoneServiceImpl; @@ -18318,40 +11043,23 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); * Implementation of a table summary. * This does not follow the Impl pattern as it is just a property bag. */ -var TableSummary = /** @class */ (function () { - function TableSummary(_tableInfo) { +class TableSummary { + constructor(_tableInfo) { this._tableInfo = _tableInfo; } - Object.defineProperty(TableSummary.prototype, "name", { - get: function () { - return this._tableInfo.name; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(TableSummary.prototype, "id", { - get: function () { - return this._tableInfo.id; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(TableSummary.prototype, "connectionId", { - get: function () { - return this._tableInfo.connectionId; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(TableSummary.prototype, "customSQL", { - get: function () { - return this._tableInfo.customSQL; - }, - enumerable: true, - configurable: true - }); - return TableSummary; -}()); + get name() { + return this._tableInfo.name; + } + get id() { + return this._tableInfo.id; + } + get connectionId() { + return this._tableInfo.connectionId; + } + get customSQL() { + return this._tableInfo.customSQL; + } +} exports.TableSummary = TableSummary; @@ -18361,23 +11069,10 @@ exports.TableSummary = TableSummary; /*!**********************************************************!*\ !*** ../api-shared-js/lib/src/ApiShared/TableauError.js ***! \**********************************************************/ -/***/ (function(__unused_webpack_module, exports) { +/***/ ((__unused_webpack_module, exports) => { "use strict"; -var __extends = (this && this.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); Object.defineProperty(exports, "__esModule", ({ value: true })); /** * Custom error class that extends the default JavaScript Error object. @@ -18385,27 +11080,20 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); * so that developers can more easily programmatically respond * to error scenarios. */ -var TableauError = /** @class */ (function (_super) { - __extends(TableauError, _super); - function TableauError(_errorCode, message) { - var _this = _super.call(this, _errorCode + ": " + message) || this; - _this._errorCode = _errorCode; +class TableauError extends Error { + constructor(_errorCode, message) { + super(`${_errorCode}: ${message}`); + this._errorCode = _errorCode; /*tslint:disable-next-line */ // https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work // Error inheritance does not work propertly when compiling to ES5, this is a workaround to force // the proto chain to be built correctly. See the github link above for details. - Object.setPrototypeOf(_this, TableauError.prototype); - return _this; - } - Object.defineProperty(TableauError.prototype, "errorCode", { - get: function () { - return this._errorCode; - }, - enumerable: true, - configurable: true - }); - return TableauError; -}(Error)); + Object.setPrototypeOf(this, TableauError.prototype); + } + get errorCode() { + return this._errorCode; + } +} exports.TableauError = TableauError; @@ -18420,24 +11108,22 @@ exports.TableauError = TableauError; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -var InternalContract = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -var GetDataModels_1 = __webpack_require__(/*! ../Models/GetDataModels */ "../api-shared-js/lib/src/ApiShared/Models/GetDataModels.js"); +const InternalContract = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const GetDataModels_1 = __webpack_require__(/*! ../Models/GetDataModels */ "../api-shared-js/lib/src/ApiShared/Models/GetDataModels.js"); /** * In version 2 of the interface, we should collapse value into nativeValue, and do all this work over * in the platform. */ -var DataValueFactory = /** @class */ (function () { - function DataValueFactory() { - } - DataValueFactory.MakeParameterDataValue = function (internalDataValue, dataType) { +class DataValueFactory { + static MakeParameterDataValue(internalDataValue, dataType) { // Parameter values are all strings, convert from string to value return new GetDataModels_1.DataValue(internalDataValue.value, InternalContract.DataTypeConverter.convertStringValueToNativeValue(internalDataValue.value, dataType), internalDataValue.formattedValue, internalDataValue.aliasedValue, internalDataValue.hasAlias); - }; - DataValueFactory.MakeFilterDataValue = function (internalDataValue) { + } + static MakeFilterDataValue(internalDataValue) { // Filters already have native type in value, just use that for nativeValue also return new GetDataModels_1.DataValue(internalDataValue.value, internalDataValue.value, internalDataValue.formattedValue); - }; - DataValueFactory.MakeTableDataValue = function (internalDataValue, dataType) { + } + static MakeTableDataValue(internalDataValue, dataType) { // DataTables contain boolean | number | string | date as string | '%null% // convertValueToNativeValue converts dates as string to dates, and any special to null // (boolean, numbers, strings are passed through) @@ -18445,9 +11131,8 @@ var DataValueFactory = /** @class */ (function () { return new GetDataModels_1.DataValue(internalDataValue.value, internalDataValue.value !== undefined ? InternalContract.DataTypeConverter.convertValueToNativeValue(internalDataValue.value, dataType) : undefined, internalDataValue.formattedValue); - }; - return DataValueFactory; -}()); + } +} exports.DataValueFactory = DataValueFactory; @@ -18471,56 +11156,50 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); * @template TReject The type used to reject the promise. Defaults to any. * @link https://stackoverflow.com/a/34637436 */ -var Deferred = /** @class */ (function () { +class Deferred { /** * Creates an instance of Deferred. */ - function Deferred() { - var _this = this; - this._promise = new Promise(function (resolve, reject) { - _this._resolve = resolve; - _this._reject = reject; + constructor() { + this._promise = new Promise((resolve, reject) => { + this._resolve = resolve; + this._reject = reject; }); } - Object.defineProperty(Deferred.prototype, "promise", { - /** - * Gets the Promise. - * - * @readonly - * @type {Promise} - */ - get: function () { - return this._promise; - }, - enumerable: true, - configurable: true - }); + /** + * Gets the Promise. + * + * @readonly + * @type {Promise} + */ + get promise() { + return this._promise; + } /** * Resolves the wrapped Promise. * * @param {(TResolve | PromiseLike)} response The argument to be resolved by the Promise. * @returns {*} {void} */ - Deferred.prototype.resolve = function (response) { + resolve(response) { if (!this._resolve) { return; } this._resolve(response); - }; + } /** * * * @param {TReject} [reason] The reason why the Promise rejected. * @returns {*} {void} */ - Deferred.prototype.reject = function (reason) { + reject(reason) { if (!this._reject) { return; } this._reject(reason); - }; - return Deferred; -}()); + } +} exports.Deferred = Deferred; exports.UnregisterTimeoutInMilliseconds = 30000; @@ -18536,8 +11215,8 @@ exports.UnregisterTimeoutInMilliseconds = 30000; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -var TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); /** * This class converts from a source enum value to destination enum * value given a mapping from source to destination when constructed. @@ -18548,23 +11227,21 @@ var TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-j * and api-shared but has no other dependecies, a utiltity project might be merited, * and this class could be moved. */ -var EnumConverter = /** @class */ (function () { - function EnumConverter(_mappings, _defaultVal) { +class EnumConverter { + constructor(_mappings, _defaultVal) { this._mappings = _mappings; this._defaultVal = _defaultVal; } - EnumConverter.prototype.convert = function (enumVal, throwIfMissing) { - if (throwIfMissing === void 0) { throwIfMissing = ShouldThrow.Yes; } + convert(enumVal, throwIfMissing = ShouldThrow.Yes) { if (this._mappings.hasOwnProperty(enumVal)) { return this._mappings[enumVal]; } if (this._defaultVal !== undefined && throwIfMissing !== ShouldThrow.Yes) { return this._defaultVal; } - throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, "Enum Mapping not found for: " + enumVal); - }; - return EnumConverter; -}()); + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, `Enum Mapping not found for: ${enumVal}`); + } +} exports.EnumConverter = EnumConverter; var ShouldThrow; (function (ShouldThrow) { @@ -18584,26 +11261,24 @@ var ShouldThrow; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -var TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); -var Param_1 = __webpack_require__(/*! ./Param */ "../api-shared-js/lib/src/ApiShared/Utils/Param.js"); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +const Param_1 = __webpack_require__(/*! ./Param */ "../api-shared-js/lib/src/ApiShared/Utils/Param.js"); /** * This class is used to construct common errors throughout the external * projects (api-shared, extensions-api, etc.). It has some duplication with * the ErrorHelpers class in api-core, but is separate due to the need to throw * an external TableauError vs. an InternalTableauError. */ -var ErrorHelpers = /** @class */ (function () { - function ErrorHelpers() { - } +class ErrorHelpers { /** * Throws with code InternalError. * * @param apiName name of api that was called. */ - ErrorHelpers.apiNotImplemented = function (apiName) { - return new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, apiName + " API not yet implemented."); - }; + static apiNotImplemented(apiName) { + return new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, `${apiName} API not yet implemented.`); + } /** * Throws an internal error if argument is null or undefined. * @@ -18611,11 +11286,11 @@ var ErrorHelpers = /** @class */ (function () { * @param argumentName name of argument to verify */ /*tslint:disable-next-line */ - ErrorHelpers.verifyInternalValue = function (argumentValue, argumentName) { + static verifyInternalValue(argumentValue, argumentName) { if (argumentValue === null || argumentValue === undefined) { - throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, argumentValue + " is invalid value for: " + argumentName); + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, `${argumentValue} is invalid value for: ${argumentName}`); } - }; + } /** * Throws an InvalidParameter error if argument is null or undefined. * @@ -18623,11 +11298,11 @@ var ErrorHelpers = /** @class */ (function () { * @param argumentName name of argument to verify */ /*tslint:disable-next-line */ - ErrorHelpers.verifyParameter = function (argumentValue, argumentName) { + static verifyParameter(argumentValue, argumentName) { if (argumentValue === null || argumentValue === undefined) { - throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, argumentValue + " is invalid value for parameter: " + argumentName); + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, `${argumentValue} is invalid value for parameter: ${argumentName}`); } - }; + } /** * Throws an InvalidParameter error if argument is not the specified type. * For objects, it just tests that it is an object @@ -18637,11 +11312,11 @@ var ErrorHelpers = /** @class */ (function () { * @param argumentName name of argument to verify */ /*tslint:disable-next-line */ - ErrorHelpers.verifyParameterType = function (argumentValue, expectedType, argumentName) { + static verifyParameterType(argumentValue, expectedType, argumentName) { if (typeof argumentValue !== expectedType) { - throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, argumentValue + " has invalid type for parameter: " + argumentName + "."); + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, `${argumentValue} has invalid type for parameter: ${argumentName}.`); } - }; + } /** * Throws an InvalidParameter error if argument is empty string, null or undefined. * @@ -18649,11 +11324,11 @@ var ErrorHelpers = /** @class */ (function () { * @param argumentName name of argument to verify */ /*tslint:disable-next-line */ - ErrorHelpers.verifyStringParameter = function (argumentValue, argumentName) { + static verifyStringParameter(argumentValue, argumentName) { if (argumentValue === null || argumentValue === undefined || argumentValue === '') { - throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, argumentValue + " is invalid value for paramter: " + argumentName); + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, `${argumentValue} is invalid value for paramter: ${argumentName}`); } - }; + } /** * Verifies passed value is a valid value for that enum. * @@ -18664,15 +11339,15 @@ var ErrorHelpers = /** @class */ (function () { * @param enumType enum to verify against */ /*tslint:disable-next-line */ - ErrorHelpers.isValidEnumValue = function (enumValue, enumType) { - var isValid = false; - Object.keys(enumType).forEach(function (enumKey) { + static isValidEnumValue(enumValue, enumType) { + let isValid = false; + Object.keys(enumType).forEach((enumKey) => { if (enumType[enumKey] === enumValue.toString()) { isValid = true; } }); return isValid; - }; + } /** * Verifies passed value is a valid value for that enum. * Throws an InvalidParameter error if the enum value is not valid. @@ -18685,11 +11360,11 @@ var ErrorHelpers = /** @class */ (function () { * @param enumName enum name for clear error message */ /*tslint:disable-next-line */ - ErrorHelpers.verifyEnumValue = function (enumValue, enumType, enumName) { + static verifyEnumValue(enumValue, enumType, enumName) { if (!ErrorHelpers.isValidEnumValue(enumValue, enumType)) { - throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, enumValue + " is invalid value for enum: " + enumName + "."); + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, `${enumValue} is invalid value for enum: ${enumName}.`); } - }; + } /** * Verifies passed value is between [min, max) ... min <= value < max * Throws an InvalidParameter error if the value is not valid. @@ -18699,12 +11374,12 @@ var ErrorHelpers = /** @class */ (function () { * @param min value must be >= min * @param max value must be < max */ - ErrorHelpers.verifyRange = function (value, min, max) { - var isValid = min <= value && value < max; + static verifyRange(value, min, max) { + let isValid = min <= value && value < max; if (!isValid) { - throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, value + " is invalid value for range: [" + min + ".." + max + ")"); + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, `${value} is invalid value for range: [${min}..${max})`); } - }; + } /** * Verifies the params min and max for applying range filter. * Throws with error code InvalidParameter if range is invalid. @@ -18712,9 +11387,9 @@ var ErrorHelpers = /** @class */ (function () { * @param min range min * @param max range max */ - ErrorHelpers.verifyRangeParamType = function (min, max) { - var isMinDefined = min !== undefined; - var isMaxDefined = max !== undefined; + static verifyRangeParamType(min, max) { + const isMinDefined = min !== undefined; + const isMaxDefined = max !== undefined; if (!isMinDefined && !isMaxDefined) { throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, 'Unexpected invalid param value, at least one of min or max is required.'); } @@ -18727,7 +11402,7 @@ var ErrorHelpers = /** @class */ (function () { if (isMinDefined && isMaxDefined && typeof min !== typeof max) { throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, 'Unexpected invalid param value, parameters min and max should be of the same type.'); } - }; + } /** * Verifies that the zoneId is present in the current dashboard. * Throws with error code InvalidParameter if either condition is false. @@ -18735,12 +11410,12 @@ var ErrorHelpers = /** @class */ (function () { * @param dashboardZoneMap A map of zoneId's to the corresponding dashboard object. * @param zoneID ZoneId to be validated */ - ErrorHelpers.verifyZoneIsValid = function (dashboardZoneMap, zoneID) { + static verifyZoneIsValid(dashboardZoneMap, zoneID) { if (dashboardZoneMap.has(zoneID)) { return; } - throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, "Unexpected invalid param value, Dashboard Object Id: " + zoneID + " is not present in dashboard."); - }; + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, `Unexpected invalid param value, Dashboard Object Id: ${zoneID} is not present in dashboard.`); + } /** * Verifies that the zone is present and floating in the current dashboard. * Throws with error code InvalidParameter if either condition is false. @@ -18748,24 +11423,24 @@ var ErrorHelpers = /** @class */ (function () { * @param dashboardZoneMap A map of zoneId's to the corresponding dashboard object. * @param zoneID ZoneId to be validated */ - ErrorHelpers.verifyZoneIsValidAndFloating = function (dashboardZoneMap, zoneID) { + static verifyZoneIsValidAndFloating(dashboardZoneMap, zoneID) { if (dashboardZoneMap.has(zoneID) && dashboardZoneMap.get(zoneID).isFloating) { return; } - throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, "Unexpected invalid param value, Dashboard Object Id: " + zoneID + " is not present or is a fixed zone in the dashboard."); - }; + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, `Unexpected invalid param value, Dashboard Object Id: ${zoneID} is not present or is a fixed zone in the dashboard.`); + } /** * Verifies that width and height are > 0 for each DashboardObjectPositionAndSizeUpdate object. * Throws with error code InvalidParameter if either condition is false. * * @param dashboardObjectPositionAndSizeUpdate DashboardObjectPositionAndSizeUpdate object for which width and height will be validated */ - ErrorHelpers.verifyWidthAndHeightOfDashboardObjectPositionAndSizeUpdate = function (dashboardObjectPositionAndSizeUpdate) { + static verifyWidthAndHeightOfDashboardObjectPositionAndSizeUpdate(dashboardObjectPositionAndSizeUpdate) { if (dashboardObjectPositionAndSizeUpdate.width < 0 || dashboardObjectPositionAndSizeUpdate.height < 0) { - throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, "Unexpected invalid param value for dashboard object ID " + dashboardObjectPositionAndSizeUpdate.dashboardObjectID + ":" + - " negative widths and heights are not allowed."); + throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, `Unexpected invalid param value for dashboard object ID ${dashboardObjectPositionAndSizeUpdate.dashboardObjectID}:` + + ` negative widths and heights are not allowed.`); } - }; + } /** * Verifies is the given sheet name is in the list of sheets names allowed for exporting. * Throws with error code InvalidParameter if the condition above is false. @@ -18773,22 +11448,22 @@ var ErrorHelpers = /** @class */ (function () { * @param exportableSheetNames A list of sheet names allowed for exporting * @param sheetName the name of the sheet selected for export */ - ErrorHelpers.verifySheetName = function (exportableSheetNames, sheetName) { + static verifySheetName(exportableSheetNames, sheetName) { if (!exportableSheetNames.includes(sheetName)) { throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidSelectionSheet, 'sheetName parameter must belong to a worksheet within the current view'); } - }; + } /** * Verifies the ExportDataOptions object * Throws with error code InvalidParameter if the parameter is not of ExportDataOptions type. * * @param options The ExportDataOptions object used to configure the output CSV file for exportDataAsync. */ - ErrorHelpers.verifyExportDataOptions = function (options) { + static verifyExportDataOptions(options) { if ((!Param_1.Param.isNullOrUndefined(options.ignoreAliases) && !Param_1.Param.isTypeBool(options.ignoreAliases)) || (!Param_1.Param.isNullOrUndefined(options.columnsToIncludeById) && !Array.isArray(options.columnsToIncludeById))) throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, 'options paramater must be of type ExportDataOptions'); - }; + } /** * Verifies if the sheet names are included in any of the export scenarios. * Throws with error code InvalidParameter if the parameter is not an array. @@ -18797,38 +11472,34 @@ var ErrorHelpers = /** @class */ (function () { * @param sheetNames List of sheet names selected for exporting. * @param exportScenarios an object containing the current sheet name, exportable sheets from the dashboard, and exportable sheets from the workbook. */ - ErrorHelpers.verifySheetNamesForPDFAndPPT = function (sheetNames, exportScenarios) { + static verifySheetNamesForPDFAndPPT(sheetNames, exportScenarios) { if (!Array.isArray(sheetNames)) throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, 'sheetNames parameter must be an array'); if (sheetNames.length === 0) throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, 'sheetNames should not be empty'); - var isIncludedInDashboard = sheetNames.every(function (sheetName) { - return exportScenarios.exportableSheetNamesFromDashboard.includes(sheetName); - }); + const isIncludedInDashboard = sheetNames.every((sheetName) => exportScenarios.exportableSheetNamesFromDashboard.includes(sheetName)); if (isIncludedInDashboard) { return; } - var isIncludedInWorkbook = sheetNames.every(function (sheetName) { - return exportScenarios.exportableSheetNamesFromWorkbook.includes(sheetName); - }); + const isIncludedInWorkbook = sheetNames.every((sheetName) => exportScenarios.exportableSheetNamesFromWorkbook.includes(sheetName)); if (isIncludedInWorkbook) { return; } - var isCurrentSheet = sheetNames.length === 1 && sheetNames[0] === exportScenarios.currentSheetName; + const isCurrentSheet = sheetNames.length === 1 && sheetNames[0] === exportScenarios.currentSheetName; if (isCurrentSheet) { return; } // Export requirement: all sheet names must be included in the list of exportable sheets in the dashboard or // all sheet names must be included in the list of exportable sheets in the workbook, or the sheet name is the current sheet throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidSelectionSheet, 'sheetNames parameter must have all its entries be exportable sheet names from the dashboard or all its entries be exportable sheet names from the workbook'); - }; + } /** * Verifies the external ExportPDFOptions object's properties. * Throws with error code InvalidParameter if the parameter is not of external ExportPDFOptions type. * * @param options The external user-facing ExportPDFOptions object used to configure the output PDF file for exportPDFAsync. */ - ErrorHelpers.verifyExportPDFOptions = function (options) { + static verifyExportPDFOptions(options) { try { this.verifyEnumValue(options.orientation, api_external_contract_js_1.PrintOrientation, 'PrintOrientation'); this.verifyEnumValue(options.pageSize, api_external_contract_js_1.PrintPageSize, 'PrintPageSize'); @@ -18837,9 +11508,8 @@ var ErrorHelpers = /** @class */ (function () { catch (_a) { throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, 'options parameter must be of type ExportPDFOptions'); } - }; - return ErrorHelpers; -}()); + } +} exports.ErrorHelpers = ErrorHelpers; @@ -18854,17 +11524,15 @@ exports.ErrorHelpers = ErrorHelpers; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -var TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); /** * Helper methods for Export APIs. * * @class ExportHelpers */ -var ExportHelpers = /** @class */ (function () { - function ExportHelpers() { - } +class ExportHelpers { /** * Modifies the internal ExportPDFOptions' properties based on the given PDF export configuration. * This method will construct the internal ExportPDFOptions identically to how the 'Export PDF' dialog constructs the ExportPdfOptionsPresModel. @@ -18874,11 +11542,11 @@ var ExportHelpers = /** @class */ (function () { * @param externalExportPdfOptions The external ExportPDFOptions user-facing object passed to exportPDFAsync. * @param sheetNames The list of sheets selected for export. */ - ExportHelpers.updateInternalExportPDFOptions = function (internalExportPdfOptions, externalExportPdfOptions, sheetNames) { + static updateInternalExportPDFOptions(internalExportPdfOptions, externalExportPdfOptions, sheetNames) { internalExportPdfOptions.currentSheet = sheetNames[0]; this.updateExportLayoutOptions(internalExportPdfOptions, externalExportPdfOptions); this.updateSheetOptions(internalExportPdfOptions, sheetNames); - }; + } /** * Helper method for updateInternalExportPDFOptions. * Modifies the exportLayoutOptions property of the internal ExportPDFOptions based on the external ExportPDFOptions. @@ -18887,8 +11555,8 @@ var ExportHelpers = /** @class */ (function () { * @param internalExportPdfOptions The internal ExportPDFOptions pres model used to configure the output PDF file. * @param externalExportPdfOptions The external ExportPDFOptions user-facing object passed to exportPDFAsync. */ - ExportHelpers.updateExportLayoutOptions = function (internalExportPdfOptions, externalExportPdfOptions) { - var exportLayoutOptions = internalExportPdfOptions.exportLayoutOptions; + static updateExportLayoutOptions(internalExportPdfOptions, externalExportPdfOptions) { + const exportLayoutOptions = internalExportPdfOptions.exportLayoutOptions; // setting the image height and width properties to their default values exportLayoutOptions.imageHeight = this.DefaultLayoutOptions.imageHeight; exportLayoutOptions.imageWidth = this.DefaultLayoutOptions.imageWidth; @@ -19000,7 +11668,7 @@ var ExportHelpers = /** @class */ (function () { default: throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, 'invalid scaling for ExportPDFOption'); } - }; + } /** * Helper method for updateInternalExportPDFOptions. * Modifies the sheetOptions property of the internal ExportPDFOptions based on the sheets selected for export. @@ -19009,15 +11677,14 @@ var ExportHelpers = /** @class */ (function () { * @param internalExportPdfOptions The internal ExportPDFOptions pres model used to configure the output PDF file. * @param sheetNames The list of sheets selected for export. */ - ExportHelpers.updateSheetOptions = function (internalExportPdfOptions, sheetNames) { - var exportLayoutOptions = internalExportPdfOptions.exportLayoutOptions, sheetOptions = internalExportPdfOptions.sheetOptions; + static updateSheetOptions(internalExportPdfOptions, sheetNames) { + const { exportLayoutOptions, sheetOptions } = internalExportPdfOptions; // updating the export layouts options for each sheet and selecting sheet for export if included in list - for (var _i = 0, sheetOptions_1 = sheetOptions; _i < sheetOptions_1.length; _i++) { - var sheetOption = sheetOptions_1[_i]; + for (const sheetOption of sheetOptions) { sheetOption.exportLayoutOptions = exportLayoutOptions; sheetOption.isSelected = sheetNames.includes(sheetOption.sheet); } - }; + } /** * Helper method for updateExportLayoutOptons. * This method is a spoof of the getFitAndScaleValues method used in @browser-clients/export-pdf-options to set the exportLayoutOptions' scaling properties. @@ -19026,17 +11693,16 @@ var ExportHelpers = /** @class */ (function () { * @param scalingSelection string used for setting the exportLayoutOptions based on the PrintScaling property from the ExternalExportPDFOptions. * @param exportLayoutOptions the ExportLayoutOptions used by the internal ExportPDFOptions pres model. */ - ExportHelpers.setFitAndScaleValues = function (exportLayoutOptions, scalingSelection) { - var _a; - var _b = this.DefaultLayoutOptions, pageFitHorizontal = _b.pageFitHorizontal, pageFitVertical = _b.pageFitVertical, pageScaleMode = _b.pageScaleMode, pageScalePercent = _b.pageScalePercent; - var fitMatch = this.fitRegex.exec(scalingSelection); - var percentMatch = this.pctRegex.exec(scalingSelection); + static setFitAndScaleValues(exportLayoutOptions, scalingSelection) { + let { pageFitHorizontal, pageFitVertical, pageScaleMode, pageScalePercent } = this.DefaultLayoutOptions; + const fitMatch = this.fitRegex.exec(scalingSelection); + const percentMatch = this.pctRegex.exec(scalingSelection); if (fitMatch) { - _a = fitMatch.slice(1).map(function (value) { return Number(value); }), pageFitHorizontal = _a[0], pageFitVertical = _a[1]; + [pageFitHorizontal, pageFitVertical] = fitMatch.slice(1).map((value) => Number(value)); pageScaleMode = api_internal_contract_js_1.ScaleMode.ScaleFitPages; } else if (percentMatch) { - pageScalePercent = percentMatch.slice(1).map(function (value) { return Number(value); })[0]; + [pageScalePercent] = percentMatch.slice(1).map((value) => Number(value)); pageScaleMode = api_internal_contract_js_1.ScaleMode.ScalePercentage; } // getFitAndScaleValues returns the properties below, but instead this method will set them. @@ -19044,31 +11710,30 @@ var ExportHelpers = /** @class */ (function () { exportLayoutOptions.pageFitVertical = pageFitVertical; exportLayoutOptions.pageScaleMode = pageScaleMode; exportLayoutOptions.pageScalePercent = pageScalePercent; - }; - ExportHelpers.DefaultDataOptions = { - ignoreAliases: false, - columnsToIncludeById: [], - }; - ExportHelpers.DefaultPDFOptions = { - scaling: api_external_contract_js_1.PrintScaling.Automatic, - pageSize: api_external_contract_js_1.PrintPageSize.Letter, - orientation: api_external_contract_js_1.PrintOrientation.Portrait, - }; - ExportHelpers.DefaultLayoutOptions = { - imageHeight: 0, - imageWidth: 0, - pageFitHorizontal: 1, - pageFitVertical: 1, - pageOrientationOption: api_internal_contract_js_1.PageOrientation.Portrait, - pageScaleMode: api_internal_contract_js_1.ScaleMode.ScaleAuto, - pageScalePercent: 100, - pageSizeOption: api_internal_contract_js_1.PageSizeOption.Letter, - }; - ExportHelpers.fitRegex = new RegExp('fit([0-9]+)x([0-9]+)'); - ExportHelpers.pctRegex = new RegExp('pct([0-9]+)'); - return ExportHelpers; -}()); + } +} exports.ExportHelpers = ExportHelpers; +ExportHelpers.DefaultDataOptions = { + ignoreAliases: false, + columnsToIncludeById: [], +}; +ExportHelpers.DefaultPDFOptions = { + scaling: api_external_contract_js_1.PrintScaling.Automatic, + pageSize: api_external_contract_js_1.PrintPageSize.Letter, + orientation: api_external_contract_js_1.PrintOrientation.Portrait, +}; +ExportHelpers.DefaultLayoutOptions = { + imageHeight: 0, + imageWidth: 0, + pageFitHorizontal: 1, + pageFitVertical: 1, + pageOrientationOption: api_internal_contract_js_1.PageOrientation.Portrait, + pageScaleMode: api_internal_contract_js_1.ScaleMode.ScaleAuto, + pageScalePercent: 100, + pageSizeOption: api_internal_contract_js_1.PageSizeOption.Letter, +}; +ExportHelpers.fitRegex = new RegExp('fit([0-9]+)x([0-9]+)'); +ExportHelpers.pctRegex = new RegExp('pct([0-9]+)'); /***/ }), @@ -19082,62 +11747,60 @@ exports.ExportHelpers = ExportHelpers; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -var TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); -var ErrorHelpers_1 = __webpack_require__(/*! ./ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); -var Param = /** @class */ (function () { - function Param() { - } +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +const ErrorHelpers_1 = __webpack_require__(/*! ./ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +class Param { /** * serializes the date into the format that the server expects. * @param date the date to serialize */ - Param.serializeDateForPlatform = function (date) { - var year = date.getUTCFullYear(); - var month = date.getUTCMonth() + 1; - var day = date.getUTCDate(); - var hh = date.getUTCHours(); - var mm = date.getUTCMinutes(); - var sec = date.getUTCSeconds(); - return year + "-" + month + "-" + day + " " + hh + ":" + mm + ":" + sec; - }; - Param.serializeBooleanForPlatform = function (bool) { + static serializeDateForPlatform(date) { + const year = date.getUTCFullYear(); + const month = date.getUTCMonth() + 1; + const day = date.getUTCDate(); + const hh = date.getUTCHours(); + const mm = date.getUTCMinutes(); + const sec = date.getUTCSeconds(); + return `${year}-${month}-${day} ${hh}:${mm}:${sec}`; + } + static serializeBooleanForPlatform(bool) { return bool ? 'true' : 'false'; - }; - Param.serializeNumberForPlatform = function (num) { + } + static serializeNumberForPlatform(num) { return num.toString(10); - }; + } /** * Verifies the input is a number */ /* tslint:disable-next-line:no-any */ - Param.isTypeNumber = function (input) { + static isTypeNumber(input) { return typeof input === 'number' || input instanceof Number; - }; + } /** * Verifies the input is a Date */ /* tslint:disable-next-line:no-any */ - Param.isTypeDate = function (input) { + static isTypeDate(input) { return input instanceof Date; - }; + } /* tslint:disable-next-line:no-any */ - Param.isTypeString = function (input) { + static isTypeString(input) { return typeof input === 'string' || input instanceof String; - }; + } /* tslint:disable-next-line:no-any */ - Param.isTypeBool = function (input) { + static isTypeBool(input) { return typeof input === 'boolean' || input instanceof Boolean; - }; + } /** * Determines if the input is null or undefined */ /* tslint:disable-next-line:no-any */ - Param.isNullOrUndefined = function (input) { + static isNullOrUndefined(input) { return input === null || input === undefined; - }; + } /* tslint:disable-next-line:no-any */ - Param.serializeParameterValue = function (value) { + static serializeParameterValue(value) { if (Param.isTypeNumber(value)) { return Param.serializeNumberForPlatform(value); } @@ -19151,43 +11814,42 @@ var Param = /** @class */ (function () { return value; } else { - throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, "Unexpected invalid value for: " + value); + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, `Unexpected invalid value for: ${value}`); } - }; + } /** * Verifies that the parameter is already a Map, or converts an object to a Map. * If the parameter is an object, we convert it to a Map using Object.entries. * @throws if the parameter is not an object or Map */ // tslint:disable-next-line:no-any - Param.convertParameterToMap = function (param, paramName) { + static convertParameterToMap(param, paramName) { ErrorHelpers_1.ErrorHelpers.verifyParameterType(param, 'object', paramName); if (Array.isArray(param)) { - throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, "Expecting object or Map for: " + paramName + "."); + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, `Expecting object or Map for: ${paramName}.`); } return param instanceof Map ? param : new Map(Object.entries(param)); - }; + } /* tslint:disable-next-line:no-any */ - Param.tryParseNumber = function (value) { + static tryParseNumber(value) { if (Param.isNullOrUndefined(value)) { return { success: false }; } if (Param.isTypeNumber(value)) { return { parsed: value, success: true }; } - var valueString = value.toString(); + const valueString = value.toString(); if (valueString === 'NaN') { // 'NaN' parses as NaN which is indistinguishable from a failed parse. return { parsed: NaN, success: true }; } - var parsed = parseFloat(valueString); + const parsed = parseFloat(valueString); if (isNaN(parsed)) { return { success: false }; } - return { parsed: parsed, success: true }; - }; - return Param; -}()); + return { parsed, success: true }; + } +} exports.Param = Param; @@ -19202,15 +11864,13 @@ exports.Param = Param; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -var Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); -var TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); -var SheetUtils = /** @class */ (function () { - function SheetUtils() { - } +const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +class SheetUtils { // This is a direct port from SheetSize.cs - SheetSizeFactory - SheetUtils.getSheetSizeFromSizeConstraints = function (sizeConstraint) { - var minWidth = sizeConstraint.minWidth, minHeight = sizeConstraint.minHeight, maxWidth = sizeConstraint.maxWidth, maxHeight = sizeConstraint.maxHeight; + static getSheetSizeFromSizeConstraints(sizeConstraint) { + const { minWidth, minHeight, maxWidth, maxHeight } = sizeConstraint; if (minHeight === 0 && minWidth === 0) { if (maxHeight === 0 && maxWidth === 0) { return { @@ -19236,25 +11896,25 @@ var SheetUtils = /** @class */ (function () { }; } // 'Fit Width' for a DSD layout - var isDsdLayout = minWidth === 0 && maxWidth === 0; + const isDsdLayout = minWidth === 0 && maxWidth === 0; return { behavior: Contract.SheetSizeBehavior.Range, minSize: { width: minWidth, height: minHeight }, maxSize: { width: isDsdLayout ? 2147483647 : maxWidth, height: maxHeight }, }; - }; - SheetUtils.createAutomaticSize = function () { - var behavior = Contract.SheetSizeBehavior.Automatic; - var minSize = { width: 0, height: 0 }; - var maxSize = { width: 0, height: 0 }; - return { behavior: behavior, minSize: minSize, maxSize: maxSize }; - }; - SheetUtils.getPublishedSheetInfoByName = function (name, sheetInfos) { - var sheetInfo = sheetInfos.find(function (sheet) { return sheet.name === name; }); + } + static createAutomaticSize() { + let behavior = Contract.SheetSizeBehavior.Automatic; + let minSize = { width: 0, height: 0 }; + let maxSize = { width: 0, height: 0 }; + return { behavior, minSize, maxSize }; + } + static getPublishedSheetInfoByName(name, sheetInfos) { + const sheetInfo = sheetInfos.find((sheet) => sheet.name === name); return sheetInfo; - }; - SheetUtils.getSheetTypeEnum = function (internalSheetType) { - var sheetType; + } + static getSheetTypeEnum(internalSheetType) { + let sheetType; switch (internalSheetType) { case api_internal_contract_js_1.SheetType.Worksheet: { sheetType = Contract.SheetType.Worksheet; @@ -19273,12 +11933,11 @@ var SheetUtils = /** @class */ (function () { } } return sheetType; - }; - SheetUtils.isValidSheetSize = function (sizeObject) { + } + static isValidSheetSize(sizeObject) { return sizeObject.behavior !== undefined; - }; - return SheetUtils; -}()); + } +} exports.SheetUtils = SheetUtils; @@ -19293,9 +11952,9 @@ exports.SheetUtils = SheetUtils; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -var Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -var TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); -var Deferred_1 = __webpack_require__(/*! ./Deferred */ "../api-shared-js/lib/src/ApiShared/Utils/Deferred.js"); +const Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const TableauError_1 = __webpack_require__(/*! ../TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +const Deferred_1 = __webpack_require__(/*! ./Deferred */ "../api-shared-js/lib/src/ApiShared/Utils/Deferred.js"); /** * A Deferred wrapper class adding functionality to reject unresponsive promises after timeout * @@ -19310,39 +11969,36 @@ var Deferred_1 = __webpack_require__(/*! ./Deferred */ "../api-shared-js/lib/src * @template TReject The type used to reject the promise. Defaults to any. * */ -var ShortLivedDeferred = /** @class */ (function () { - function ShortLivedDeferred(_timeoutInMilliseconds) { - if (_timeoutInMilliseconds === void 0) { _timeoutInMilliseconds = Deferred_1.UnregisterTimeoutInMilliseconds; } +class ShortLivedDeferred { + constructor(_timeoutInMilliseconds = Deferred_1.UnregisterTimeoutInMilliseconds) { this._timeoutInMilliseconds = _timeoutInMilliseconds; } - ShortLivedDeferred.prototype.getNewPromiseOrThrowIfBusy = function () { - var _this = this; + getNewPromiseOrThrowIfBusy() { if (this._deferred) { throw new TableauError_1.TableauError(Contract.SharedErrorCodes.ApiExecutionError, 'This api cannot be executed till previous call is resolved.'); } this._deferred = new Deferred_1.Deferred(); - this._timeoutId = setTimeout(function () { - var error = new TableauError_1.TableauError(Contract.SharedErrorCodes.Timeout, "Api failed to complete in " + _this._timeoutInMilliseconds / 1000 + " seconds"); - _this.reject(error); + this._timeoutId = setTimeout(() => { + const error = new TableauError_1.TableauError(Contract.SharedErrorCodes.Timeout, `Api failed to complete in ${this._timeoutInMilliseconds / 1000} seconds`); + this.reject(error); }, this._timeoutInMilliseconds); return this._deferred.promise; - }; - ShortLivedDeferred.prototype.resolve = function (response) { + } + resolve(response) { if (this._deferred) { clearTimeout(this._timeoutId); this._deferred.resolve(response); this._deferred = undefined; } - }; - ShortLivedDeferred.prototype.reject = function (error) { + } + reject(error) { if (this._deferred) { clearTimeout(this._timeoutId); this._deferred.reject(error); this._deferred = undefined; } - }; - return ShortLivedDeferred; -}()); + } +} exports.ShortLivedDeferred = ShortLivedDeferred; @@ -19357,53 +12013,44 @@ exports.ShortLivedDeferred = ShortLivedDeferred; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -var api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); -var TableauError_1 = __webpack_require__(/*! ./TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +const api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +const TableauError_1 = __webpack_require__(/*! ./TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); /** * Represents the current version of the extensions, embedding * and extensions-api-types library */ -var VersionNumber = /** @class */ (function () { +class VersionNumber { // private constructor so everyone uses the singleton instance // build numbers have this form: M.m.f-pre.N - function VersionNumber(versionString, isAlpha) { - var partStr = versionString.split('-'); + constructor(versionString, isAlpha) { + const partStr = versionString.split('-'); this.build = this.getBuildNumber(partStr[1]); versionString = partStr[0]; - var parts = versionString.split('.').map(function (p) { return parseInt(p, 10); }); + const parts = versionString.split('.').map((p) => parseInt(p, 10)); if (parts.length !== 3) { - throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, "Invalid version number: " + versionString); + throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, `Invalid version number: ${versionString}`); } this.major = parts[0]; this.minor = parts[1]; this.fix = parts[2]; this.isAlpha = isAlpha; } - VersionNumber.prototype.getBuildNumber = function (preReleaseString) { - var noBuildNumber = -1; + getBuildNumber(preReleaseString) { + const noBuildNumber = -1; if (!preReleaseString) { return noBuildNumber; } // The preRelease string has this form: pre.N, but we don't depend on the actual string being 'pre' - var partStr = preReleaseString.split('.'); + const partStr = preReleaseString.split('.'); return partStr[1] ? parseInt(partStr[1], 10) : noBuildNumber; - }; - Object.defineProperty(VersionNumber.prototype, "formattedValue", { - get: function () { - return this.major + "." + this.minor + "." + this.fix; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(VersionNumber.prototype, "fullFormattedValue", { - get: function () { - return this.major + "." + this.minor + "." + this.fix + "-pre." + this.build; - }, - enumerable: true, - configurable: true - }); - return VersionNumber; -}()); + } + get formattedValue() { + return `${this.major}.${this.minor}.${this.fix}`; + } + get fullFormattedValue() { + return `${this.major}.${this.minor}.${this.fix}-pre.${this.build}`; + } +} exports.VersionNumber = VersionNumber; @@ -19418,7 +12065,7 @@ exports.VersionNumber = VersionNumber; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); /** * Implementation of the InternalApiDispatcher which supports upgrading and downgrading the input * internal contract to the version that this module is built against @@ -19426,7 +12073,7 @@ var api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-c * @class VersionedExternalApiDispatcher * @implements {InternalApiDispatcher} */ -var VersionedExternalApiDispatcher = /** @class */ (function () { +class VersionedExternalApiDispatcher { /** * Creates a new instance of the VersionedExternalApiDispatcher * We have multiple version converting dispatchers that work together. @@ -19440,46 +12087,43 @@ var VersionedExternalApiDispatcher = /** @class */ (function () { * @param platformVersionNumber The version of the internal contract which the platform module is using. * This number will be used to figure out how to downgrade incoming commands and upgrade the results */ - function VersionedExternalApiDispatcher(_apiDelegateDispatcher, platformVersionNumber) { - var _this = this; + constructor(_apiDelegateDispatcher, platformVersionNumber) { this._apiDelegateDispatcher = _apiDelegateDispatcher; this._versionConverter = api_internal_contract_js_1.CreateExternalCompatibleVersionConverter(api_internal_contract_js_1.INTERNAL_CONTRACT_VERSION, platformVersionNumber); this._notificationHandlers = []; - _apiDelegateDispatcher.registerNotificationHandler(function (notification) { - if (_this._notificationHandlers.length === 0) { + _apiDelegateDispatcher.registerNotificationHandler((notification) => { + if (this._notificationHandlers.length === 0) { return; } - var upgradedNotification = _this._versionConverter.upgradeNotification(notification); - _this._notificationHandlers.forEach(function (handler) { + const upgradedNotification = this._versionConverter.upgradeNotification(notification); + this._notificationHandlers.forEach((handler) => { handler(upgradedNotification); }); }); } - VersionedExternalApiDispatcher.needsVersionConverter = function (platformVersion) { + static needsVersionConverter(platformVersion) { // If our platform is less than external library version, then we need a converter return api_internal_contract_js_1.VersionLessThan(platformVersion, api_internal_contract_js_1.INTERNAL_CONTRACT_VERSION); - }; - VersionedExternalApiDispatcher.prototype.execute = function (verb, parameters) { - var _this = this; + } + execute(verb, parameters) { try { - var downgradeParameters = this._versionConverter.downgradeExecuteCall(verb, parameters); - return this._apiDelegateDispatcher.execute(downgradeParameters.verb, downgradeParameters.parameters).then(function (response) { - var upgradeResponse = _this._versionConverter.upgradeExecuteReturn(response, verb, parameters); + const downgradeParameters = this._versionConverter.downgradeExecuteCall(verb, parameters); + return this._apiDelegateDispatcher.execute(downgradeParameters.verb, downgradeParameters.parameters).then((response) => { + const upgradeResponse = this._versionConverter.upgradeExecuteReturn(response, verb, parameters); return upgradeResponse; }); } catch (e) { return Promise.reject(e); } - }; - VersionedExternalApiDispatcher.prototype.registerNotificationHandler = function (handler) { + } + registerNotificationHandler(handler) { this._notificationHandlers.push(handler); - }; - VersionedExternalApiDispatcher.prototype.unregisterNotificationHandler = function (handler) { - this._notificationHandlers = this._notificationHandlers.filter(function (h) { return h !== handler; }); - }; - return VersionedExternalApiDispatcher; -}()); + } + unregisterNotificationHandler(handler) { + this._notificationHandlers = this._notificationHandlers.filter((h) => h !== handler); + } +} exports.VersionedExternalApiDispatcher = VersionedExternalApiDispatcher; @@ -20350,7 +12994,7 @@ function version(uuid) { /***/ ((module) => { "use strict"; -module.exports = /*#__PURE__*/JSON.parse('{"major":1,"minor":179,"fix":0}'); +module.exports = /*#__PURE__*/JSON.parse('{"major":1,"minor":188,"fix":0}'); /***/ }) @@ -20393,18 +13037,6 @@ module.exports = /*#__PURE__*/JSON.parse('{"major":1,"minor":179,"fix":0}'); /******/ }; /******/ })(); /******/ -/******/ /* webpack/runtime/global */ -/******/ (() => { -/******/ __webpack_require__.g = (function() { -/******/ if (typeof globalThis === 'object') return globalThis; -/******/ try { -/******/ return this || new Function('return this')(); -/******/ } catch (e) { -/******/ if (typeof window === 'object') return window; -/******/ } -/******/ })(); -/******/ })(); -/******/ /******/ /* webpack/runtime/hasOwnProperty shorthand */ /******/ (() => { /******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) @@ -20437,27 +13069,15 @@ var exports = __webpack_exports__; * The build enforces that the file has the same name as the global variable that is exported. */ Object.defineProperty(exports, "__esModule", ({ value: true })); -// The following polyfills are needed for IE11 -var api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); -__webpack_require__(/*! core-js/es/array/find */ "../../node_modules/core-js/es/array/find.js"); -__webpack_require__(/*! core-js/es/array/from */ "../../node_modules/core-js/es/array/from.js"); -__webpack_require__(/*! core-js/es/map */ "../../node_modules/core-js/es/map/index.js"); -__webpack_require__(/*! core-js/es/number/is-integer */ "../../node_modules/core-js/es/number/is-integer.js"); -__webpack_require__(/*! core-js/es/number/is-nan */ "../../node_modules/core-js/es/number/is-nan.js"); -__webpack_require__(/*! core-js/es/number/parse-float */ "../../node_modules/core-js/es/number/parse-float.js"); -__webpack_require__(/*! core-js/es/number/parse-int */ "../../node_modules/core-js/es/number/parse-int.js"); -__webpack_require__(/*! core-js/es/object/assign */ "../../node_modules/core-js/es/object/assign.js"); -__webpack_require__(/*! core-js/es/object/entries */ "../../node_modules/core-js/es/object/entries.js"); -__webpack_require__(/*! core-js/es/object/set-prototype-of */ "../../node_modules/core-js/es/object/set-prototype-of.js"); -__webpack_require__(/*! core-js/es/promise */ "../../node_modules/core-js/es/promise/index.js"); +const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); // Due to the way we configured webpack, we should be exporting things which will be under // a global variable called "tableau". Export everything we want to be visible under tableau // from this file. -var ExtensionsImpl_1 = __webpack_require__(/*! ./ExtensionsApi/Impl/ExtensionsImpl */ "./lib/src/ExtensionsApi/Impl/ExtensionsImpl.js"); -var Extensions_1 = __webpack_require__(/*! ./ExtensionsApi/Namespaces/Extensions */ "./lib/src/ExtensionsApi/Namespaces/Extensions.js"); -var isAlpha = typeof VERSION_IS_ALPHA !== 'undefined' ? VERSION_IS_ALPHA : false; -api_shared_js_1.ApiVersion.SetVersionNumber( true ? "1.14.0-pre.9" : 0, isAlpha); -var extensionImpl = new ExtensionsImpl_1.ExtensionsImpl(); +const ExtensionsImpl_1 = __webpack_require__(/*! ./ExtensionsApi/Impl/ExtensionsImpl */ "./lib/src/ExtensionsApi/Impl/ExtensionsImpl.js"); +const Extensions_1 = __webpack_require__(/*! ./ExtensionsApi/Namespaces/Extensions */ "./lib/src/ExtensionsApi/Namespaces/Extensions.js"); +const isAlpha = typeof VERSION_IS_ALPHA !== 'undefined' ? VERSION_IS_ALPHA : false; +api_shared_js_1.ApiVersion.SetVersionNumber( true ? "1.15.0-pre.15" : 0, isAlpha); +const extensionImpl = new ExtensionsImpl_1.ExtensionsImpl(); exports.extensions = new Extensions_1.Extensions(extensionImpl); // Export Enums // These show up under the tableau object. I.e. tableau.ExtensionContext.Server @@ -20489,8 +13109,8 @@ exports.ParameterValueType = api_external_contract_js_1.ParameterValueType; exports.PeriodType = api_external_contract_js_1.PeriodType; exports.QuickTableCalcType = api_external_contract_js_1.QuickTableCalcType; exports.ReplaySpeedType = api_external_contract_js_1.ReplaySpeedType; -exports.SelectOptions = api_external_contract_js_1.SelectOptions; exports.SelectionUpdateType = api_external_contract_js_1.SelectionUpdateType; +exports.SelectOptions = api_external_contract_js_1.SelectOptions; exports.SheetType = api_external_contract_js_1.SheetType; exports.SortDirection = api_external_contract_js_1.SortDirection; exports.TableauEventType = api_external_contract_js_1.TableauEventType; @@ -20507,4 +13127,4 @@ exports.ZoneVisibilityType = api_external_contract_js_1.ZoneVisibilityType; window.tableau = __webpack_exports__; /******/ })() ; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGVhdS5leHRlbnNpb25zLjEuMTQuMC1wcmUuOS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxtQkFBTyxDQUFDLHdGQUE2QjtBQUNyQyxrQkFBa0IsbUJBQU8sQ0FBQywwRkFBOEI7O0FBRXhEOzs7Ozs7Ozs7OztBQ0hBLG1CQUFPLENBQUMsa0dBQWtDO0FBQzFDLG1CQUFPLENBQUMsd0ZBQTZCO0FBQ3JDLFdBQVcsbUJBQU8sQ0FBQywwRUFBc0I7O0FBRXpDOzs7Ozs7Ozs7OztBQ0pBLG1CQUFPLENBQUMsZ0dBQWlDO0FBQ3pDLG1CQUFPLENBQUMsMEVBQXNCO0FBQzlCLG1CQUFPLENBQUMsb0dBQW1DO0FBQzNDLG1CQUFPLENBQUMsa0dBQWtDO0FBQzFDLFdBQVcsbUJBQU8sQ0FBQywwRUFBc0I7O0FBRXpDOzs7Ozs7Ozs7OztBQ05BLG1CQUFPLENBQUMsc0dBQW9DO0FBQzVDLFdBQVcsbUJBQU8sQ0FBQywwRUFBc0I7O0FBRXpDOzs7Ozs7Ozs7OztBQ0hBLG1CQUFPLENBQUMsOEZBQWdDO0FBQ3hDLFdBQVcsbUJBQU8sQ0FBQywwRUFBc0I7O0FBRXpDOzs7Ozs7Ozs7OztBQ0hBLG1CQUFPLENBQUMsd0dBQXFDO0FBQzdDLFdBQVcsbUJBQU8sQ0FBQywwRUFBc0I7O0FBRXpDOzs7Ozs7Ozs7OztBQ0hBLG1CQUFPLENBQUMsb0dBQW1DO0FBQzNDLFdBQVcsbUJBQU8sQ0FBQywwRUFBc0I7O0FBRXpDOzs7Ozs7Ozs7OztBQ0hBLG1CQUFPLENBQUMsOEZBQWdDO0FBQ3hDLFdBQVcsbUJBQU8sQ0FBQywwRUFBc0I7O0FBRXpDOzs7Ozs7Ozs7OztBQ0hBLG1CQUFPLENBQUMsZ0dBQWlDO0FBQ3pDLFdBQVcsbUJBQU8sQ0FBQywwRUFBc0I7O0FBRXpDOzs7Ozs7Ozs7OztBQ0hBLG1CQUFPLENBQUMsa0hBQTBDO0FBQ2xELFdBQVcsbUJBQU8sQ0FBQywwRUFBc0I7O0FBRXpDOzs7Ozs7Ozs7OztBQ0hBLG1CQUFPLENBQUMsa0dBQWtDO0FBQzFDLG1CQUFP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QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsT0FBTztBQUNQLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSixxQkFBcUIsYUFBYTtBQUNsQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxPQUFPLElBQUksY0FBYzs7QUFFekI7QUFDQSw2RUFBNkUsY0FBYztBQUMzRjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLGdCQUFnQjs7QUFFdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLElBQUksMENBQTBDO0FBQzlDO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBOztBQUVBOztBQUVBO0FBQ0EsSUFBSSw2Q0FBNkM7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVELElBQUksd0RBQXdEO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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O0FBQ1YsZ0ZBQXFCO0FBQ3JCLDRFQUFtQjtBQUNuQixnR0FBNkI7QUFDN0Isc0RBQVE7QUFDUixnRUFBYTtBQUNiLDREQUFXO0FBQ1gsOERBQVk7QUFDWiwwREFBVTtBQUNWLHNFQUFnQjtBQUNoQixnRUFBYTtBQUNiLDhFQUFvQjtBQUNwQixnRUFBYTtBQUNiLHNFQUFnQjtBQUNoQixzRUFBZ0I7QUFDaEIsMERBQVU7QUFDVixzRUFBZ0I7QUFDaEIsb0dBQStCO0FBQy9CLG9GQUF1QjtBQUN2QixzREFBUTtBQUNSLDBFQUFrQjtBQUNsQiwwREFBVTtBQUNWLDBFQUFrQjtBQUVsQixvRUFBZTtBQUNmLGdFQUFhO0FBQ2IsNEVBQW1CO0FBQ25CLHdEQUFTO0FBQ1QsZ0VBQWE7QUFDYixzRUFBZ0I7QUFDaEIsMEVBQWtCO0FBQ2xCLDhFQUFvQjtBQUNwQiw0RUFBbUI7QUFDbkIsc0dBQWdDO0FBQ2hDLG9GQUF1QjtBQUN2Qix3RkFBeUI7QUFDekIsMEVBQWtCIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9hcnJheS9maW5kLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvZXMvYXJyYXkvZnJvbS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL21hcC9pbmRleC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL251bWJlci9pcy1pbnRlZ2VyLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvZXMvbnVtYmVyL2lzLW5hbi5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL251bWJlci9wYXJzZS1mbG9hdC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL251bWJlci9wYXJzZS1pbnQuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9vYmplY3QvYXNzaWduLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvZXMvb2JqZWN0L2VudHJpZXMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9vYmplY3Qvc2V0LXByb3RvdHlwZS1vZi5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL3Byb21pc2UvaW5kZXguanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1jYWxsYWJsZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWNvbnN0cnVjdG9yLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtcG9zc2libGUtcHJvdG90eXBlLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FkZC10by11bnNjb3BhYmxlcy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1pbnN0YW5jZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktZnJvbS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1pbmNsdWRlcy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24uanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktc2xpY2UuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktc3BlY2llcy1jb25zdHJ1Y3Rvci5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1zcGVjaWVzLWNyZWF0ZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jYWxsLXdpdGgtc2FmZS1pdGVyYXRpb24tY2xvc2luZy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jaGVjay1jb3JyZWN0bmVzcy1vZi1pdGVyYXRpb24uanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi1yYXcuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jbGVhci1lcnJvci1zdGFjay5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb2xsZWN0aW9uLXN0cm9uZy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb2xsZWN0aW9uLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvcHktY29uc3RydWN0b3ItcHJvcGVydGllcy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb3JyZWN0LXByb3RvdHlwZS1nZXR0ZXIuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLWl0ZXJhdG9yLWNvbnN0cnVjdG9yLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvci5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWl0ZXJhdG9yLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Rlc2NyaXB0b3JzLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RvY3VtZW50LWNyZWF0ZS1lbGVtZW50LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS1pcy1icm93c2VyLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS1pcy1pb3MtcGViYmxlLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS1pcy1pb3MuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLWlzLW5vZGUuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLWlzLXdlYm9zLXdlYmtpdC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtdXNlci1hZ2VudC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtdjgtdmVyc2lvbi5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbnRyeS11bmJpbmQuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW51bS1idWcta2V5cy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lcnJvci1zdGFjay1pbnN0YWxsYWJsZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnJlZXppbmcuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tYXBwbHkuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tbmFtZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1pdGVyYXRvci1tZXRob2QuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1tZXRob2QuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGlkZGVuLWtleXMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaG9zdC1yZXBvcnQtZXJyb3JzLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2h0bWwuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaWU4LWRvbS1kZWZpbmUuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5oZXJpdC1pZi1yZXF1aXJlZC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbnNwZWN0LXNvdXJjZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbnN0YWxsLWVycm9yLWNhdXNlLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLW1ldGFkYXRhLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWFycmF5LWl0ZXJhdG9yLW1ldGhvZC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1hcnJheS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1jYWxsYWJsZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1jb25zdHJ1Y3Rvci5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1mb3JjZWQuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtaW50ZWdyYWwtbnVtYmVyLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW9iamVjdC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXN5bWJvbC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRlLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9yLWNsb3NlLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9ycy1jb3JlLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9ycy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9taWNyb3Rhc2suanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmF0aXZlLXByb21pc2UtY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmF0aXZlLXN5bWJvbC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9uYXRpdmUtd2Vhay1tYXAuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9ub3JtYWxpemUtc3RyaW5nLWFyZ3VtZW50LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL251bWJlci1wYXJzZS1mbG9hdC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9udW1iZXItcGFyc2UtaW50LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1hc3NpZ24uanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnRpZXMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzLWV4dGVybmFsLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZi5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qta2V5cy1pbnRlcm5hbC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qta2V5cy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtcHJvcGVydHktaXMtZW51bWVyYWJsZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZi5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtdG8tYXJyYXkuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXRvLXN0cmluZy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vcmRpbmFyeS10by1wcmltaXRpdmUuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb3duLWtleXMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcGF0aC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wZXJmb3JtLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Byb21pc2UtcmVzb2x2ZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWRlZmluZS1hbGwuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVkZWZpbmUuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC1nbG9iYWwuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2V0LXNwZWNpZXMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLWtleS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zaGFyZWQtc3RvcmUuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLW11bHRpYnl0ZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctdHJpbS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90YXNrLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWFic29sdXRlLWluZGV4LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWludGVnZXItb3ItaW5maW5pdHkuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tbGVuZ3RoLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLW9iamVjdC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1wcmltaXRpdmUuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tcHJvcGVydHkta2V5LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXN0cmluZy10YWctc3VwcG9ydC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1zdHJpbmcuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdHJ5LXRvLXN0cmluZy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy91aWQuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdXNlLXN5bWJvbC1hcy11aWQuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2hpdGVzcGFjZXMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFnZ3JlZ2F0ZS1lcnJvci5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZmluZC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZnJvbS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm1hcC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLmlzLWludGVnZXIuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm51bWJlci5pcy1uYW4uanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm51bWJlci5wYXJzZS1mbG9hdC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLnBhcnNlLWludC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmFzc2lnbi5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmVudHJpZXMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5zZXQtcHJvdG90eXBlLW9mLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QudG8tc3RyaW5nLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmFsbC1zZXR0bGVkLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmFueS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZS5maW5hbGx5LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvZ3VpZC9ndWlkLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9FdmVudHMvRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZEV2ZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9FdmVudHMvRmlsdGVyQ2hhbmdlZEV2ZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9FdmVudHMvTWFya3NTZWxlY3RlZEV2ZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9FdmVudHMvUGFyYW1ldGVyQ2hhbmdlZEV2ZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9FdmVudHMvU3VtbWFyeURhdGFDaGFuZ2VkRXZlbnQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0V2ZW50cy9UYWJsZWF1RXZlbnQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0V2ZW50cy9UYWJsZWF1U2hlZXRFdmVudC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvRXZlbnRzL1RhYmxlYXVXb3Jrc2hlZXRFdmVudC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvRXZlbnRzL1dvcmtib29rRm9ybWF0dGluZ0NoYW5nZWRFdmVudC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvRXZlbnRzL1dvcmtzaGVldEZvcm1hdHRpbmdDaGFuZ2VkRXZlbnQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0ltcGwvQmVudG9uU2Fuc0ZvbnROYW1lQ29uc3RhbnRzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9JbXBsL0Nvbm5lY3RlZFNlcnZlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvSW1wbC9FeHRlbnNpb25Xb3JrYm9va0ltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0ltcGwvRXh0ZW5zaW9uc0ltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0ltcGwvTGVnYWN5SW50ZXJuYWxBcGlEaXNwYXRjaGVySG9sZGVyLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9JbXBsL1NldHRpbmdzSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvSW1wbC9UYWJsZWF1Qm9va0ZvbnROYW1lQ29uc3RhbnRzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9JbXBsL1VJSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvTW9kZWxzL0Rhc2hib2FyZC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvTW9kZWxzL0Rhc2hib2FyZE9iamVjdC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvTW9kZWxzL1BhcmFtZXRlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvTW9kZWxzL1NoZWV0LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9Nb2RlbHMvV29ya2Jvb2sudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL01vZGVscy9Xb3Jrc2hlZXQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL05hbWVzcGFjZXMvRGFzaGJvYXJkQ29udGVudC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvTmFtZXNwYWNlcy9FbnZpcm9ubWVudC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvTmFtZXNwYWNlcy9FeHRlbnNpb25zLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9OYW1lc3BhY2VzL1NldHRpbmdzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9OYW1lc3BhY2VzL1VJLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9OYW1lc3BhY2VzL1dvcmtib29rRm9ybWF0dGluZ0VudlV0aWwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL05hbWVzcGFjZXMvV29ya3NoZWV0Q29udGVudC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvU2VydmljZXMvSW1wbC9Jbml0aWFsaXphdGlvblNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9TZXJ2aWNlcy9JbXBsL1NldHRpbmdzU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL1NlcnZpY2VzL0ltcGwvVUlTZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvU2VydmljZXMvUmVnaXN0ZXJBbGxFeHRlbnNpb25zU2VydmljZXMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeVV0aWwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL0VtYmVkZGluZ0FwaUV4dGVybmFsQ29udHJhY3QudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL0V4dGVuc2lvbnNBcGlFeHRlcm5hbENvbnRyYWN0LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9FeHRlcm5hbENvbnRyYWN0LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9FeHRlcm5hbENvbnRyYWN0L0VtYmVkZGluZy9Bc2tEYXRhSW50ZXJmYWNlcy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1leHRlcm5hbC1jb250cmFjdC1qcy9zcmMvRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvRW51bXMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1B1bHNlSW50ZXJmYWNlcy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1leHRlcm5hbC1jb250cmFjdC1qcy9zcmMvRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvVml6SW50ZXJmYWNlcy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1leHRlcm5hbC1jb250cmFjdC1qcy9zcmMvRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvV2ViQ29tcG9uZW50SW50ZXJmYWNlcy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1leHRlcm5hbC1jb250cmFjdC1qcy9zcmMvRXh0ZXJuYWxDb250cmFjdC9FeHRlbnNpb25zL05hbWVzcGFjZXMvVGFibGVhdS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1leHRlcm5hbC1jb250cmFjdC1qcy9zcmMvRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvRW51bXMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL0V4dGVybmFsQ29udHJhY3QvU2hhcmVkL05hbWVzcGFjZXMvVGFibGVhdS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1leHRlcm5hbC1jb250cmFjdC1qcy9zcmMvU2hhcmVkQXBpRXh0ZXJuYWxDb250cmFjdC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvSnNBcGlJbnRlcm5hbENvbnRyYWN0LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy9jb250cmFjdC9EYXRhVHlwZUNvbnZlcnRlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvY29udHJhY3QvRW51bXMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL2NvbnRyYWN0L05vdGlmaWNhdGlvbnMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL2NvbnRyYWN0L1BhcmFtZXRlcnMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL2NvbnRyYWN0L1ZlcmJzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy9pbnRlcmZhY2UvQXNrRGF0YUludGVyZmFjZS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvaW50ZXJmYWNlL1B1bHNlSW50ZXJmYWNlLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy9pbnRlcmZhY2UvVnFsSW50ZXJmYWNlLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy9tZXNzYWdpbmcvQ3Jvc3NGcmFtZU1lc3Nlbmdlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvbWVzc2FnaW5nL0Nyb3NzRnJhbWVQcmVwYXJlZE1lc3NhZ2UudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL21lc3NhZ2luZy9NZXNzYWdlVHlwZUNoZWNrcy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvbWVzc2FnaW5nL2ludGVyZmFjZS9NZXNzYWdlVHlwZXMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL3ZlcnNpb25pbmcvSWRlbnRpdHlWZXJzaW9uQ29udmVydGVyLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy92ZXJzaW9uaW5nL1N0YWNraW5nVmVyc2lvbkNvbnZlcnRlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvdmVyc2lvbmluZy9WZXJzaW9uQ29udmVydGVyRmFjdG9yeS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvdmVyc2lvbmluZy9WZXJzaW9uVHJhbnNsYXRpb25zLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy92ZXJzaW9uaW5nL2V4dGVybmFsL0V4dGVybmFsSWRlbnRpdHlWZXJzaW9uQ29udmVydGVyLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy92ZXJzaW9uaW5nL2V4dGVybmFsL0V4dGVybmFsU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy92ZXJzaW9uaW5nL2V4dGVybmFsL0V4dGVybmFsVmVyc2lvbkNvbnZlcnRlckZhY3RvcnkudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL3ZlcnNpb25pbmcvZXh0ZXJuYWwvRXh0ZXJuYWxWZXJzaW9uVHJhbnNsYXRpb25zLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0FwaVZlcnNpb24udHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvQ29ubmVjdGlvblN1bW1hcnkudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvQ3Jvc3NGcmFtZS9Dcm9zc0ZyYW1lQm9vdHN0cmFwLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0Nyb3NzRnJhbWUvQ3Jvc3NGcmFtZURpc3BhdGNoZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvRGF0YVNvdXJjZS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9FbnVtTWFwcGluZ3MvRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0VudW1NYXBwaW5ncy9JbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvRXZlbnRMaXN0ZW5lck1hbmFnZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvRmllbGQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9DdXN0b21WaWV3SW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9JbXBsL0Rhc2hib2FyZEltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9EYXNoYm9hcmRPYmplY3RJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0ltcGwvRGF0YVNvdXJjZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9GaWVsZEltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9QYXJhbWV0ZXJJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0ltcGwvU2hlZXRJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0ltcGwvU2hlZXRJbmZvSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9JbXBsL1NpbmdsZUV2ZW50TWFuYWdlckltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9TdG9yeUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9TdG9yeVBvaW50SW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9JbXBsL1N0b3J5UG9pbnRJbmZvSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9JbXBsL1dvcmtib29rSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9JbXBsL1dvcmtzaGVldEltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvTG9naWNhbFRhYmxlLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL01vZGVscy9BY2Nlc3NpYmlsaXR5TW9kZWxzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL01vZGVscy9GaWx0ZXJNb2RlbHMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvTW9kZWxzL0dldERhdGFNb2RlbHMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvTW9kZWxzL0dldERhdGFUYWJsZVJlYWRlck1vZGVscy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9Nb2RlbHMvU2VsZWN0aW9uTW9kZWxzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1BvaW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL0dldERhdGFTZXJ2aWNlLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL1JlZ2lzdGVyQWxsU2hhcmVkU2VydmljZXMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvQWNjZXNzaWJpbGl0eVNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvQW5pbWF0aW9uU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9Bbm5vdGF0aW9uU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9DbGllbnRJbmZvU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9EYXRhU291cmNlU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9FeHBvcnRTZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL0V4dGVybmFsQ29udGV4dE1lbnVTZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL0ZpbHRlclNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvR2V0RGF0YVNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvTm90aWZpY2F0aW9uU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9Ob3RpZmljYXRpb25TZXJ2aWNlSW1wbEJhc2UudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9QYXJhbWV0ZXJzU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9TZWxlY3Rpb25TZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1NlcnZpY2VJbXBsQmFzZS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1NpemVTZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1N0b3J5QWN0aXZhdGlvblNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvVmlzdWFsTW9kZWxTZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1ZpelNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvWm9uZVNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1RhYmxlU3VtbWFyeS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9UYWJsZWF1RXJyb3IudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvVXRpbHMvRGF0YVZhbHVlRmFjdG9yeS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9VdGlscy9EZWZlcnJlZC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9VdGlscy9FbnVtQ29udmVydGVyLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1V0aWxzL0Vycm9ySGVscGVycy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9VdGlscy9FeHBvcnRIZWxwZXJzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1V0aWxzL1BhcmFtLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1V0aWxzL1NoZWV0VXRpbHMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvVXRpbHMvU2hvcnRMaXZlZERlZmVycmVkLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1ZlcnNpb25OdW1iZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9WZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvbWQ1LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL25pbC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9wYXJzZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9yZWdleC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9ybmcuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvc2hhMS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9zdHJpbmdpZnkuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdjEuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdjMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdjM1LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3Y0LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3Y1LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3ZhbGlkYXRlLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3ZlcnNpb24uanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly90YWJsZWF1L3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly90YWJsZWF1L3dlYnBhY2svcnVudGltZS9nbG9iYWwiLCJ3ZWJwYWNrOi8vdGFibGVhdS93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL3RhYmxlYXUvd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkudHMiXSwic291cmNlc0NvbnRlbnQiOlsicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5hcnJheS5maW5kJyk7XG52YXIgZW50cnlVbmJpbmQgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvZW50cnktdW5iaW5kJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZW50cnlVbmJpbmQoJ0FycmF5JywgJ2ZpbmQnKTtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3RyaW5nLml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLmFycmF5LmZyb20nKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLkFycmF5LmZyb207XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLmFycmF5Lml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm1hcCcpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5vYmplY3QudG8tc3RyaW5nJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN0cmluZy5pdGVyYXRvcicpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguTWFwO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5udW1iZXIuaXMtaW50ZWdlcicpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguTnVtYmVyLmlzSW50ZWdlcjtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMubnVtYmVyLmlzLW5hbicpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguTnVtYmVyLmlzTmFOO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5udW1iZXIucGFyc2UtZmxvYXQnKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLk51bWJlci5wYXJzZUZsb2F0O1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5udW1iZXIucGFyc2UtaW50Jyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5OdW1iZXIucGFyc2VJbnQ7XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm9iamVjdC5hc3NpZ24nKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLk9iamVjdC5hc3NpZ247XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm9iamVjdC5lbnRyaWVzJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5PYmplY3QuZW50cmllcztcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMub2JqZWN0LnNldC1wcm90b3R5cGUtb2YnKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLk9iamVjdC5zZXRQcm90b3R5cGVPZjtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuYWdncmVnYXRlLWVycm9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLmFycmF5Lml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm9iamVjdC50by1zdHJpbmcnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMucHJvbWlzZScpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5wcm9taXNlLmFsbC1zZXR0bGVkJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnByb21pc2UuYW55Jyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnByb21pc2UuZmluYWxseScpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3InKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLlByb21pc2U7XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciB0cnlUb1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90cnktdG8tc3RyaW5nJyk7XG5cbnZhciBUeXBlRXJyb3IgPSBnbG9iYWwuVHlwZUVycm9yO1xuXG4vLyBgQXNzZXJ0OiBJc0NhbGxhYmxlKGFyZ3VtZW50KSBpcyB0cnVlYFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgaWYgKGlzQ2FsbGFibGUoYXJndW1lbnQpKSByZXR1cm4gYXJndW1lbnQ7XG4gIHRocm93IFR5cGVFcnJvcih0cnlUb1N0cmluZyhhcmd1bWVudCkgKyAnIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBpc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNvbnN0cnVjdG9yJyk7XG52YXIgdHJ5VG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdHJ5LXRvLXN0cmluZycpO1xuXG52YXIgVHlwZUVycm9yID0gZ2xvYmFsLlR5cGVFcnJvcjtcblxuLy8gYEFzc2VydDogSXNDb25zdHJ1Y3Rvcihhcmd1bWVudCkgaXMgdHJ1ZWBcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIGlmIChpc0NvbnN0cnVjdG9yKGFyZ3VtZW50KSkgcmV0dXJuIGFyZ3VtZW50O1xuICB0aHJvdyBUeXBlRXJyb3IodHJ5VG9TdHJpbmcoYXJndW1lbnQpICsgJyBpcyBub3QgYSBjb25zdHJ1Y3RvcicpO1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xuXG52YXIgU3RyaW5nID0gZ2xvYmFsLlN0cmluZztcbnZhciBUeXBlRXJyb3IgPSBnbG9iYWwuVHlwZUVycm9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICBpZiAodHlwZW9mIGFyZ3VtZW50ID09ICdvYmplY3QnIHx8IGlzQ2FsbGFibGUoYXJndW1lbnQpKSByZXR1cm4gYXJndW1lbnQ7XG4gIHRocm93IFR5cGVFcnJvcihcIkNhbid0IHNldCBcIiArIFN0cmluZyhhcmd1bWVudCkgKyAnIGFzIGEgcHJvdG90eXBlJyk7XG59O1xuIiwidmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtY3JlYXRlJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xuXG52YXIgVU5TQ09QQUJMRVMgPSB3ZWxsS25vd25TeW1ib2woJ3Vuc2NvcGFibGVzJyk7XG52YXIgQXJyYXlQcm90b3R5cGUgPSBBcnJheS5wcm90b3R5cGU7XG5cbi8vIEFycmF5LnByb3RvdHlwZVtAQHVuc2NvcGFibGVzXVxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUtQEB1bnNjb3BhYmxlc1xuaWYgKEFycmF5UHJvdG90eXBlW1VOU0NPUEFCTEVTXSA9PSB1bmRlZmluZWQpIHtcbiAgZGVmaW5lUHJvcGVydHlNb2R1bGUuZihBcnJheVByb3RvdHlwZSwgVU5TQ09QQUJMRVMsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgdmFsdWU6IGNyZWF0ZShudWxsKVxuICB9KTtcbn1cblxuLy8gYWRkIGEga2V5IHRvIEFycmF5LnByb3RvdHlwZVtAQHVuc2NvcGFibGVzXVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIEFycmF5UHJvdG90eXBlW1VOU0NPUEFCTEVTXVtrZXldID0gdHJ1ZTtcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGlzUHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZicpO1xuXG52YXIgVHlwZUVycm9yID0gZ2xvYmFsLlR5cGVFcnJvcjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIFByb3RvdHlwZSkge1xuICBpZiAoaXNQcm90b3R5cGVPZihQcm90b3R5cGUsIGl0KSkgcmV0dXJuIGl0O1xuICB0aHJvdyBUeXBlRXJyb3IoJ0luY29ycmVjdCBpbnZvY2F0aW9uJyk7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcblxudmFyIFN0cmluZyA9IGdsb2JhbC5TdHJpbmc7XG52YXIgVHlwZUVycm9yID0gZ2xvYmFsLlR5cGVFcnJvcjtcblxuLy8gYEFzc2VydDogVHlwZShhcmd1bWVudCkgaXMgT2JqZWN0YFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgaWYgKGlzT2JqZWN0KGFyZ3VtZW50KSkgcmV0dXJuIGFyZ3VtZW50O1xuICB0aHJvdyBUeXBlRXJyb3IoU3RyaW5nKGFyZ3VtZW50KSArICcgaXMgbm90IGFuIG9iamVjdCcpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgYmluZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQnKTtcbnZhciBjYWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1vYmplY3QnKTtcbnZhciBjYWxsV2l0aFNhZmVJdGVyYXRpb25DbG9zaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NhbGwtd2l0aC1zYWZlLWl0ZXJhdGlvbi1jbG9zaW5nJyk7XG52YXIgaXNBcnJheUl0ZXJhdG9yTWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWFycmF5LWl0ZXJhdG9yLW1ldGhvZCcpO1xudmFyIGlzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY29uc3RydWN0b3InKTtcbnZhciBsZW5ndGhPZkFycmF5TGlrZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZScpO1xudmFyIGNyZWF0ZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eScpO1xudmFyIGdldEl0ZXJhdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1pdGVyYXRvcicpO1xudmFyIGdldEl0ZXJhdG9yTWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1pdGVyYXRvci1tZXRob2QnKTtcblxudmFyIEFycmF5ID0gZ2xvYmFsLkFycmF5O1xuXG4vLyBgQXJyYXkuZnJvbWAgbWV0aG9kIGltcGxlbWVudGF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LmZyb21cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZnJvbShhcnJheUxpa2UgLyogLCBtYXBmbiA9IHVuZGVmaW5lZCwgdGhpc0FyZyA9IHVuZGVmaW5lZCAqLykge1xuICB2YXIgTyA9IHRvT2JqZWN0KGFycmF5TGlrZSk7XG4gIHZhciBJU19DT05TVFJVQ1RPUiA9IGlzQ29uc3RydWN0b3IodGhpcyk7XG4gIHZhciBhcmd1bWVudHNMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICB2YXIgbWFwZm4gPSBhcmd1bWVudHNMZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkO1xuICB2YXIgbWFwcGluZyA9IG1hcGZuICE9PSB1bmRlZmluZWQ7XG4gIGlmIChtYXBwaW5nKSBtYXBmbiA9IGJpbmQobWFwZm4sIGFyZ3VtZW50c0xlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQpO1xuICB2YXIgaXRlcmF0b3JNZXRob2QgPSBnZXRJdGVyYXRvck1ldGhvZChPKTtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGxlbmd0aCwgcmVzdWx0LCBzdGVwLCBpdGVyYXRvciwgbmV4dCwgdmFsdWU7XG4gIC8vIGlmIHRoZSB0YXJnZXQgaXMgbm90IGl0ZXJhYmxlIG9yIGl0J3MgYW4gYXJyYXkgd2l0aCB0aGUgZGVmYXVsdCBpdGVyYXRvciAtIHVzZSBhIHNpbXBsZSBjYXNlXG4gIGlmIChpdGVyYXRvck1ldGhvZCAmJiAhKHRoaXMgPT0gQXJyYXkgJiYgaXNBcnJheUl0ZXJhdG9yTWV0aG9kKGl0ZXJhdG9yTWV0aG9kKSkpIHtcbiAgICBpdGVyYXRvciA9IGdldEl0ZXJhdG9yKE8sIGl0ZXJhdG9yTWV0aG9kKTtcbiAgICBuZXh0ID0gaXRlcmF0b3IubmV4dDtcbiAgICByZXN1bHQgPSBJU19DT05TVFJVQ1RPUiA/IG5ldyB0aGlzKCkgOiBbXTtcbiAgICBmb3IgKDshKHN0ZXAgPSBjYWxsKG5leHQsIGl0ZXJhdG9yKSkuZG9uZTsgaW5kZXgrKykge1xuICAgICAgdmFsdWUgPSBtYXBwaW5nID8gY2FsbFdpdGhTYWZlSXRlcmF0aW9uQ2xvc2luZyhpdGVyYXRvciwgbWFwZm4sIFtzdGVwLnZhbHVlLCBpbmRleF0sIHRydWUpIDogc3RlcC52YWx1ZTtcbiAgICAgIGNyZWF0ZVByb3BlcnR5KHJlc3VsdCwgaW5kZXgsIHZhbHVlKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGVuZ3RoID0gbGVuZ3RoT2ZBcnJheUxpa2UoTyk7XG4gICAgcmVzdWx0ID0gSVNfQ09OU1RSVUNUT1IgPyBuZXcgdGhpcyhsZW5ndGgpIDogQXJyYXkobGVuZ3RoKTtcbiAgICBmb3IgKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKykge1xuICAgICAgdmFsdWUgPSBtYXBwaW5nID8gbWFwZm4oT1tpbmRleF0sIGluZGV4KSA6IE9baW5kZXhdO1xuICAgICAgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBpbmRleCwgdmFsdWUpO1xuICAgIH1cbiAgfVxuICByZXN1bHQubGVuZ3RoID0gaW5kZXg7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwidmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIHRvQWJzb2x1dGVJbmRleCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleCcpO1xudmFyIGxlbmd0aE9mQXJyYXlMaWtlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlJyk7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUueyBpbmRleE9mLCBpbmNsdWRlcyB9YCBtZXRob2RzIGltcGxlbWVudGF0aW9uXG52YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKElTX0lOQ0xVREVTKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIGVsLCBmcm9tSW5kZXgpIHtcbiAgICB2YXIgTyA9IHRvSW5kZXhlZE9iamVjdCgkdGhpcyk7XG4gICAgdmFyIGxlbmd0aCA9IGxlbmd0aE9mQXJyYXlMaWtlKE8pO1xuICAgIHZhciBpbmRleCA9IHRvQWJzb2x1dGVJbmRleChmcm9tSW5kZXgsIGxlbmd0aCk7XG4gICAgdmFyIHZhbHVlO1xuICAgIC8vIEFycmF5I2luY2x1ZGVzIHVzZXMgU2FtZVZhbHVlWmVybyBlcXVhbGl0eSBhbGdvcml0aG1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlIC0tIE5hTiBjaGVja1xuICAgIGlmIChJU19JTkNMVURFUyAmJiBlbCAhPSBlbCkgd2hpbGUgKGxlbmd0aCA+IGluZGV4KSB7XG4gICAgICB2YWx1ZSA9IE9baW5kZXgrK107XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlIC0tIE5hTiBjaGVja1xuICAgICAgaWYgKHZhbHVlICE9IHZhbHVlKSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBBcnJheSNpbmRleE9mIGlnbm9yZXMgaG9sZXMsIEFycmF5I2luY2x1ZGVzIC0gbm90XG4gICAgfSBlbHNlIGZvciAoO2xlbmd0aCA+IGluZGV4OyBpbmRleCsrKSB7XG4gICAgICBpZiAoKElTX0lOQ0xVREVTIHx8IGluZGV4IGluIE8pICYmIE9baW5kZXhdID09PSBlbCkgcmV0dXJuIElTX0lOQ0xVREVTIHx8IGluZGV4IHx8IDA7XG4gICAgfSByZXR1cm4gIUlTX0lOQ0xVREVTICYmIC0xO1xuICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIC8vIGBBcnJheS5wcm90b3R5cGUuaW5jbHVkZXNgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5pbmNsdWRlc1xuICBpbmNsdWRlczogY3JlYXRlTWV0aG9kKHRydWUpLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLmluZGV4T2ZgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5pbmRleG9mXG4gIGluZGV4T2Y6IGNyZWF0ZU1ldGhvZChmYWxzZSlcbn07XG4iLCJ2YXIgYmluZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQnKTtcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBJbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luZGV4ZWQtb2JqZWN0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgbGVuZ3RoT2ZBcnJheUxpa2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UnKTtcbnZhciBhcnJheVNwZWNpZXNDcmVhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktc3BlY2llcy1jcmVhdGUnKTtcblxudmFyIHB1c2ggPSB1bmN1cnJ5VGhpcyhbXS5wdXNoKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS57IGZvckVhY2gsIG1hcCwgZmlsdGVyLCBzb21lLCBldmVyeSwgZmluZCwgZmluZEluZGV4LCBmaWx0ZXJSZWplY3QgfWAgbWV0aG9kcyBpbXBsZW1lbnRhdGlvblxudmFyIGNyZWF0ZU1ldGhvZCA9IGZ1bmN0aW9uIChUWVBFKSB7XG4gIHZhciBJU19NQVAgPSBUWVBFID09IDE7XG4gIHZhciBJU19GSUxURVIgPSBUWVBFID09IDI7XG4gIHZhciBJU19TT01FID0gVFlQRSA9PSAzO1xuICB2YXIgSVNfRVZFUlkgPSBUWVBFID09IDQ7XG4gIHZhciBJU19GSU5EX0lOREVYID0gVFlQRSA9PSA2O1xuICB2YXIgSVNfRklMVEVSX1JFSkVDVCA9IFRZUEUgPT0gNztcbiAgdmFyIE5PX0hPTEVTID0gVFlQRSA9PSA1IHx8IElTX0ZJTkRfSU5ERVg7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIGNhbGxiYWNrZm4sIHRoYXQsIHNwZWNpZmljQ3JlYXRlKSB7XG4gICAgdmFyIE8gPSB0b09iamVjdCgkdGhpcyk7XG4gICAgdmFyIHNlbGYgPSBJbmRleGVkT2JqZWN0KE8pO1xuICAgIHZhciBib3VuZEZ1bmN0aW9uID0gYmluZChjYWxsYmFja2ZuLCB0aGF0KTtcbiAgICB2YXIgbGVuZ3RoID0gbGVuZ3RoT2ZBcnJheUxpa2Uoc2VsZik7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB2YXIgY3JlYXRlID0gc3BlY2lmaWNDcmVhdGUgfHwgYXJyYXlTcGVjaWVzQ3JlYXRlO1xuICAgIHZhciB0YXJnZXQgPSBJU19NQVAgPyBjcmVhdGUoJHRoaXMsIGxlbmd0aCkgOiBJU19GSUxURVIgfHwgSVNfRklMVEVSX1JFSkVDVCA/IGNyZWF0ZSgkdGhpcywgMCkgOiB1bmRlZmluZWQ7XG4gICAgdmFyIHZhbHVlLCByZXN1bHQ7XG4gICAgZm9yICg7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIGlmIChOT19IT0xFUyB8fCBpbmRleCBpbiBzZWxmKSB7XG4gICAgICB2YWx1ZSA9IHNlbGZbaW5kZXhdO1xuICAgICAgcmVzdWx0ID0gYm91bmRGdW5jdGlvbih2YWx1ZSwgaW5kZXgsIE8pO1xuICAgICAgaWYgKFRZUEUpIHtcbiAgICAgICAgaWYgKElTX01BUCkgdGFyZ2V0W2luZGV4XSA9IHJlc3VsdDsgLy8gbWFwXG4gICAgICAgIGVsc2UgaWYgKHJlc3VsdCkgc3dpdGNoIChUWVBFKSB7XG4gICAgICAgICAgY2FzZSAzOiByZXR1cm4gdHJ1ZTsgICAgICAgICAgICAgIC8vIHNvbWVcbiAgICAgICAgICBjYXNlIDU6IHJldHVybiB2YWx1ZTsgICAgICAgICAgICAgLy8gZmluZFxuICAgICAgICAgIGNhc2UgNjogcmV0dXJuIGluZGV4OyAgICAgICAgICAgICAvLyBmaW5kSW5kZXhcbiAgICAgICAgICBjYXNlIDI6IHB1c2godGFyZ2V0LCB2YWx1ZSk7ICAgICAgLy8gZmlsdGVyXG4gICAgICAgIH0gZWxzZSBzd2l0Y2ggKFRZUEUpIHtcbiAgICAgICAgICBjYXNlIDQ6IHJldHVybiBmYWxzZTsgICAgICAgICAgICAgLy8gZXZlcnlcbiAgICAgICAgICBjYXNlIDc6IHB1c2godGFyZ2V0LCB2YWx1ZSk7ICAgICAgLy8gZmlsdGVyUmVqZWN0XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIElTX0ZJTkRfSU5ERVggPyAtMSA6IElTX1NPTUUgfHwgSVNfRVZFUlkgPyBJU19FVkVSWSA6IHRhcmdldDtcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvLyBgQXJyYXkucHJvdG90eXBlLmZvckVhY2hgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5mb3JlYWNoXG4gIGZvckVhY2g6IGNyZWF0ZU1ldGhvZCgwKSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5tYXBgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5tYXBcbiAgbWFwOiBjcmVhdGVNZXRob2QoMSksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUuZmlsdGVyYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZmlsdGVyXG4gIGZpbHRlcjogY3JlYXRlTWV0aG9kKDIpLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLnNvbWVgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5zb21lXG4gIHNvbWU6IGNyZWF0ZU1ldGhvZCgzKSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5ldmVyeWAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmV2ZXJ5XG4gIGV2ZXJ5OiBjcmVhdGVNZXRob2QoNCksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUuZmluZGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZpbmRcbiAgZmluZDogY3JlYXRlTWV0aG9kKDUpLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLmZpbmRJbmRleGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZpbmRJbmRleFxuICBmaW5kSW5kZXg6IGNyZWF0ZU1ldGhvZCg2KSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5maWx0ZXJSZWplY3RgIG1ldGhvZFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1hcnJheS1maWx0ZXJpbmdcbiAgZmlsdGVyUmVqZWN0OiBjcmVhdGVNZXRob2QoNylcbn07XG4iLCJ2YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gdW5jdXJyeVRoaXMoW10uc2xpY2UpO1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWFycmF5Jyk7XG52YXIgaXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jb25zdHJ1Y3RvcicpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgU1BFQ0lFUyA9IHdlbGxLbm93blN5bWJvbCgnc3BlY2llcycpO1xudmFyIEFycmF5ID0gZ2xvYmFsLkFycmF5O1xuXG4vLyBhIHBhcnQgb2YgYEFycmF5U3BlY2llc0NyZWF0ZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5c3BlY2llc2NyZWF0ZVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3JpZ2luYWxBcnJheSkge1xuICB2YXIgQztcbiAgaWYgKGlzQXJyYXkob3JpZ2luYWxBcnJheSkpIHtcbiAgICBDID0gb3JpZ2luYWxBcnJheS5jb25zdHJ1Y3RvcjtcbiAgICAvLyBjcm9zcy1yZWFsbSBmYWxsYmFja1xuICAgIGlmIChpc0NvbnN0cnVjdG9yKEMpICYmIChDID09PSBBcnJheSB8fCBpc0FycmF5KEMucHJvdG90eXBlKSkpIEMgPSB1bmRlZmluZWQ7XG4gICAgZWxzZSBpZiAoaXNPYmplY3QoQykpIHtcbiAgICAgIEMgPSBDW1NQRUNJRVNdO1xuICAgICAgaWYgKEMgPT09IG51bGwpIEMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9IHJldHVybiBDID09PSB1bmRlZmluZWQgPyBBcnJheSA6IEM7XG59O1xuIiwidmFyIGFycmF5U3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LXNwZWNpZXMtY29uc3RydWN0b3InKTtcblxuLy8gYEFycmF5U3BlY2llc0NyZWF0ZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5c3BlY2llc2NyZWF0ZVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3JpZ2luYWxBcnJheSwgbGVuZ3RoKSB7XG4gIHJldHVybiBuZXcgKGFycmF5U3BlY2llc0NvbnN0cnVjdG9yKG9yaWdpbmFsQXJyYXkpKShsZW5ndGggPT09IDAgPyAwIDogbGVuZ3RoKTtcbn07XG4iLCJ2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgaXRlcmF0b3JDbG9zZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvci1jbG9zZScpO1xuXG4vLyBjYWxsIHNvbWV0aGluZyBvbiBpdGVyYXRvciBzdGVwIHdpdGggc2FmZSBjbG9zaW5nIG9uIGVycm9yXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVyYXRvciwgZm4sIHZhbHVlLCBFTlRSSUVTKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEVOVFJJRVMgPyBmbihhbk9iamVjdCh2YWx1ZSlbMF0sIHZhbHVlWzFdKSA6IGZuKHZhbHVlKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpdGVyYXRvckNsb3NlKGl0ZXJhdG9yLCAndGhyb3cnLCBlcnJvcik7XG4gIH1cbn07XG4iLCJ2YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcbnZhciBTQUZFX0NMT1NJTkcgPSBmYWxzZTtcblxudHJ5IHtcbiAgdmFyIGNhbGxlZCA9IDA7XG4gIHZhciBpdGVyYXRvcldpdGhSZXR1cm4gPSB7XG4gICAgbmV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHsgZG9uZTogISFjYWxsZWQrKyB9O1xuICAgIH0sXG4gICAgJ3JldHVybic6IGZ1bmN0aW9uICgpIHtcbiAgICAgIFNBRkVfQ0xPU0lORyA9IHRydWU7XG4gICAgfVxuICB9O1xuICBpdGVyYXRvcldpdGhSZXR1cm5bSVRFUkFUT1JdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tYXJyYXktZnJvbSwgbm8tdGhyb3ctbGl0ZXJhbCAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICBBcnJheS5mcm9tKGl0ZXJhdG9yV2l0aFJldHVybiwgZnVuY3Rpb24gKCkgeyB0aHJvdyAyOyB9KTtcbn0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYywgU0tJUF9DTE9TSU5HKSB7XG4gIGlmICghU0tJUF9DTE9TSU5HICYmICFTQUZFX0NMT1NJTkcpIHJldHVybiBmYWxzZTtcbiAgdmFyIElURVJBVElPTl9TVVBQT1JUID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgdmFyIG9iamVjdCA9IHt9O1xuICAgIG9iamVjdFtJVEVSQVRPUl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIHsgZG9uZTogSVRFUkFUSU9OX1NVUFBPUlQgPSB0cnVlIH07XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfTtcbiAgICBleGVjKG9iamVjdCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgcmV0dXJuIElURVJBVElPTl9TVVBQT1JUO1xufTtcbiIsInZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcblxudmFyIHRvU3RyaW5nID0gdW5jdXJyeVRoaXMoe30udG9TdHJpbmcpO1xudmFyIHN0cmluZ1NsaWNlID0gdW5jdXJyeVRoaXMoJycuc2xpY2UpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gc3RyaW5nU2xpY2UodG9TdHJpbmcoaXQpLCA4LCAtMSk7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBUT19TVFJJTkdfVEFHX1NVUFBPUlQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tc3RyaW5nLXRhZy1zdXBwb3J0Jyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIGNsYXNzb2ZSYXcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIFRPX1NUUklOR19UQUcgPSB3ZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7XG52YXIgT2JqZWN0ID0gZ2xvYmFsLk9iamVjdDtcblxuLy8gRVMzIHdyb25nIGhlcmVcbnZhciBDT1JSRUNUX0FSR1VNRU5UUyA9IGNsYXNzb2ZSYXcoZnVuY3Rpb24gKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpID09ICdBcmd1bWVudHMnO1xuXG4vLyBmYWxsYmFjayBmb3IgSUUxMSBTY3JpcHQgQWNjZXNzIERlbmllZCBlcnJvclxudmFyIHRyeUdldCA9IGZ1bmN0aW9uIChpdCwga2V5KSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGl0W2tleV07XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbn07XG5cbi8vIGdldHRpbmcgdGFnIGZyb20gRVM2KyBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2Bcbm1vZHVsZS5leHBvcnRzID0gVE9fU1RSSU5HX1RBR19TVVBQT1JUID8gY2xhc3NvZlJhdyA6IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgTywgdGFnLCByZXN1bHQ7XG4gIHJldHVybiBpdCA9PT0gdW5kZWZpbmVkID8gJ1VuZGVmaW5lZCcgOiBpdCA9PT0gbnVsbCA/ICdOdWxsJ1xuICAgIC8vIEBAdG9TdHJpbmdUYWcgY2FzZVxuICAgIDogdHlwZW9mICh0YWcgPSB0cnlHZXQoTyA9IE9iamVjdChpdCksIFRPX1NUUklOR19UQUcpKSA9PSAnc3RyaW5nJyA/IHRhZ1xuICAgIC8vIGJ1aWx0aW5UYWcgY2FzZVxuICAgIDogQ09SUkVDVF9BUkdVTUVOVFMgPyBjbGFzc29mUmF3KE8pXG4gICAgLy8gRVMzIGFyZ3VtZW50cyBmYWxsYmFja1xuICAgIDogKHJlc3VsdCA9IGNsYXNzb2ZSYXcoTykpID09ICdPYmplY3QnICYmIGlzQ2FsbGFibGUoTy5jYWxsZWUpID8gJ0FyZ3VtZW50cycgOiByZXN1bHQ7XG59O1xuIiwidmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIGFycmF5U2xpY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktc2xpY2UnKTtcblxudmFyIHJlcGxhY2UgPSB1bmN1cnJ5VGhpcygnJy5yZXBsYWNlKTtcbnZhciBzcGxpdCA9IHVuY3VycnlUaGlzKCcnLnNwbGl0KTtcbnZhciBqb2luID0gdW5jdXJyeVRoaXMoW10uam9pbik7XG5cbnZhciBURVNUID0gKGZ1bmN0aW9uIChhcmcpIHsgcmV0dXJuIFN0cmluZyhFcnJvcihhcmcpLnN0YWNrKTsgfSkoJ3p4Y2FzZCcpO1xudmFyIFY4X09SX0NIQUtSQV9TVEFDS19FTlRSWSA9IC9cXG5cXHMqYXQgW146XSo6W15cXG5dKi87XG52YXIgSVNfVjhfT1JfQ0hBS1JBX1NUQUNLID0gVjhfT1JfQ0hBS1JBX1NUQUNLX0VOVFJZLnRlc3QoVEVTVCk7XG52YXIgSVNfRklSRUZPWF9PUl9TQUZBUklfU1RBQ0sgPSAvQFteXFxuXSpcXG4vLnRlc3QoVEVTVCkgJiYgIS96eGNhc2QvLnRlc3QoVEVTVCk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHN0YWNrLCBkcm9wRW50cmllcykge1xuICBpZiAodHlwZW9mIHN0YWNrICE9ICdzdHJpbmcnKSByZXR1cm4gc3RhY2s7XG4gIGlmIChJU19WOF9PUl9DSEFLUkFfU1RBQ0spIHtcbiAgICB3aGlsZSAoZHJvcEVudHJpZXMtLSkgc3RhY2sgPSByZXBsYWNlKHN0YWNrLCBWOF9PUl9DSEFLUkFfU1RBQ0tfRU5UUlksICcnKTtcbiAgfSBlbHNlIGlmIChJU19GSVJFRk9YX09SX1NBRkFSSV9TVEFDSykge1xuICAgIHJldHVybiBqb2luKGFycmF5U2xpY2Uoc3BsaXQoc3RhY2ssICdcXG4nKSwgZHJvcEVudHJpZXMpLCAnXFxuJyk7XG4gIH0gcmV0dXJuIHN0YWNrO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5JykuZjtcbnZhciBjcmVhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZScpO1xudmFyIHJlZGVmaW5lQWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lLWFsbCcpO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0Jyk7XG52YXIgYW5JbnN0YW5jZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1pbnN0YW5jZScpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xudmFyIGRlZmluZUl0ZXJhdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS1pdGVyYXRvcicpO1xudmFyIHNldFNwZWNpZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXNwZWNpZXMnKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGZhc3RLZXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtbWV0YWRhdGEnKS5mYXN0S2V5O1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKTtcblxudmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDtcbnZhciBpbnRlcm5hbFN0YXRlR2V0dGVyRm9yID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXR0ZXJGb3I7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBnZXRDb25zdHJ1Y3RvcjogZnVuY3Rpb24gKHdyYXBwZXIsIENPTlNUUlVDVE9SX05BTUUsIElTX01BUCwgQURERVIpIHtcbiAgICB2YXIgQ29uc3RydWN0b3IgPSB3cmFwcGVyKGZ1bmN0aW9uICh0aGF0LCBpdGVyYWJsZSkge1xuICAgICAgYW5JbnN0YW5jZSh0aGF0LCBQcm90b3R5cGUpO1xuICAgICAgc2V0SW50ZXJuYWxTdGF0ZSh0aGF0LCB7XG4gICAgICAgIHR5cGU6IENPTlNUUlVDVE9SX05BTUUsXG4gICAgICAgIGluZGV4OiBjcmVhdGUobnVsbCksXG4gICAgICAgIGZpcnN0OiB1bmRlZmluZWQsXG4gICAgICAgIGxhc3Q6IHVuZGVmaW5lZCxcbiAgICAgICAgc2l6ZTogMFxuICAgICAgfSk7XG4gICAgICBpZiAoIURFU0NSSVBUT1JTKSB0aGF0LnNpemUgPSAwO1xuICAgICAgaWYgKGl0ZXJhYmxlICE9IHVuZGVmaW5lZCkgaXRlcmF0ZShpdGVyYWJsZSwgdGhhdFtBRERFUl0sIHsgdGhhdDogdGhhdCwgQVNfRU5UUklFUzogSVNfTUFQIH0pO1xuICAgIH0pO1xuXG4gICAgdmFyIFByb3RvdHlwZSA9IENvbnN0cnVjdG9yLnByb3RvdHlwZTtcblxuICAgIHZhciBnZXRJbnRlcm5hbFN0YXRlID0gaW50ZXJuYWxTdGF0ZUdldHRlckZvcihDT05TVFJVQ1RPUl9OQU1FKTtcblxuICAgIHZhciBkZWZpbmUgPSBmdW5jdGlvbiAodGhhdCwga2V5LCB2YWx1ZSkge1xuICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGF0KTtcbiAgICAgIHZhciBlbnRyeSA9IGdldEVudHJ5KHRoYXQsIGtleSk7XG4gICAgICB2YXIgcHJldmlvdXMsIGluZGV4O1xuICAgICAgLy8gY2hhbmdlIGV4aXN0aW5nIGVudHJ5XG4gICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgZW50cnkudmFsdWUgPSB2YWx1ZTtcbiAgICAgIC8vIGNyZWF0ZSBuZXcgZW50cnlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXRlLmxhc3QgPSBlbnRyeSA9IHtcbiAgICAgICAgICBpbmRleDogaW5kZXggPSBmYXN0S2V5KGtleSwgdHJ1ZSksXG4gICAgICAgICAga2V5OiBrZXksXG4gICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgIHByZXZpb3VzOiBwcmV2aW91cyA9IHN0YXRlLmxhc3QsXG4gICAgICAgICAgbmV4dDogdW5kZWZpbmVkLFxuICAgICAgICAgIHJlbW92ZWQ6IGZhbHNlXG4gICAgICAgIH07XG4gICAgICAgIGlmICghc3RhdGUuZmlyc3QpIHN0YXRlLmZpcnN0ID0gZW50cnk7XG4gICAgICAgIGlmIChwcmV2aW91cykgcHJldmlvdXMubmV4dCA9IGVudHJ5O1xuICAgICAgICBpZiAoREVTQ1JJUFRPUlMpIHN0YXRlLnNpemUrKztcbiAgICAgICAgZWxzZSB0aGF0LnNpemUrKztcbiAgICAgICAgLy8gYWRkIHRvIGluZGV4XG4gICAgICAgIGlmIChpbmRleCAhPT0gJ0YnKSBzdGF0ZS5pbmRleFtpbmRleF0gPSBlbnRyeTtcbiAgICAgIH0gcmV0dXJuIHRoYXQ7XG4gICAgfTtcblxuICAgIHZhciBnZXRFbnRyeSA9IGZ1bmN0aW9uICh0aGF0LCBrZXkpIHtcbiAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhhdCk7XG4gICAgICAvLyBmYXN0IGNhc2VcbiAgICAgIHZhciBpbmRleCA9IGZhc3RLZXkoa2V5KTtcbiAgICAgIHZhciBlbnRyeTtcbiAgICAgIGlmIChpbmRleCAhPT0gJ0YnKSByZXR1cm4gc3RhdGUuaW5kZXhbaW5kZXhdO1xuICAgICAgLy8gZnJvemVuIG9iamVjdCBjYXNlXG4gICAgICBmb3IgKGVudHJ5ID0gc3RhdGUuZmlyc3Q7IGVudHJ5OyBlbnRyeSA9IGVudHJ5Lm5leHQpIHtcbiAgICAgICAgaWYgKGVudHJ5LmtleSA9PSBrZXkpIHJldHVybiBlbnRyeTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmVkZWZpbmVBbGwoUHJvdG90eXBlLCB7XG4gICAgICAvLyBgeyBNYXAsIFNldCB9LnByb3RvdHlwZS5jbGVhcigpYCBtZXRob2RzXG4gICAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW1hcC5wcm90b3R5cGUuY2xlYXJcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc2V0LnByb3RvdHlwZS5jbGVhclxuICAgICAgY2xlYXI6IGZ1bmN0aW9uIGNsZWFyKCkge1xuICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhhdCk7XG4gICAgICAgIHZhciBkYXRhID0gc3RhdGUuaW5kZXg7XG4gICAgICAgIHZhciBlbnRyeSA9IHN0YXRlLmZpcnN0O1xuICAgICAgICB3aGlsZSAoZW50cnkpIHtcbiAgICAgICAgICBlbnRyeS5yZW1vdmVkID0gdHJ1ZTtcbiAgICAgICAgICBpZiAoZW50cnkucHJldmlvdXMpIGVudHJ5LnByZXZpb3VzID0gZW50cnkucHJldmlvdXMubmV4dCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBkZWxldGUgZGF0YVtlbnRyeS5pbmRleF07XG4gICAgICAgICAgZW50cnkgPSBlbnRyeS5uZXh0O1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLmZpcnN0ID0gc3RhdGUubGFzdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKERFU0NSSVBUT1JTKSBzdGF0ZS5zaXplID0gMDtcbiAgICAgICAgZWxzZSB0aGF0LnNpemUgPSAwO1xuICAgICAgfSxcbiAgICAgIC8vIGB7IE1hcCwgU2V0IH0ucHJvdG90eXBlLmRlbGV0ZShrZXkpYCBtZXRob2RzXG4gICAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW1hcC5wcm90b3R5cGUuZGVsZXRlXG4gICAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXNldC5wcm90b3R5cGUuZGVsZXRlXG4gICAgICAnZGVsZXRlJzogZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhhdCk7XG4gICAgICAgIHZhciBlbnRyeSA9IGdldEVudHJ5KHRoYXQsIGtleSk7XG4gICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgIHZhciBuZXh0ID0gZW50cnkubmV4dDtcbiAgICAgICAgICB2YXIgcHJldiA9IGVudHJ5LnByZXZpb3VzO1xuICAgICAgICAgIGRlbGV0ZSBzdGF0ZS5pbmRleFtlbnRyeS5pbmRleF07XG4gICAgICAgICAgZW50cnkucmVtb3ZlZCA9IHRydWU7XG4gICAgICAgICAgaWYgKHByZXYpIHByZXYubmV4dCA9IG5leHQ7XG4gICAgICAgICAgaWYgKG5leHQpIG5leHQucHJldmlvdXMgPSBwcmV2O1xuICAgICAgICAgIGlmIChzdGF0ZS5maXJzdCA9PSBlbnRyeSkgc3RhdGUuZmlyc3QgPSBuZXh0O1xuICAgICAgICAgIGlmIChzdGF0ZS5sYXN0ID09IGVudHJ5KSBzdGF0ZS5sYXN0ID0gcHJldjtcbiAgICAgICAgICBpZiAoREVTQ1JJUFRPUlMpIHN0YXRlLnNpemUtLTtcbiAgICAgICAgICBlbHNlIHRoYXQuc2l6ZS0tO1xuICAgICAgICB9IHJldHVybiAhIWVudHJ5O1xuICAgICAgfSxcbiAgICAgIC8vIGB7IE1hcCwgU2V0IH0ucHJvdG90eXBlLmZvckVhY2goY2FsbGJhY2tmbiwgdGhpc0FyZyA9IHVuZGVmaW5lZClgIG1ldGhvZHNcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbWFwLnByb3RvdHlwZS5mb3JlYWNoXG4gICAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXNldC5wcm90b3R5cGUuZm9yZWFjaFxuICAgICAgZm9yRWFjaDogZnVuY3Rpb24gZm9yRWFjaChjYWxsYmFja2ZuIC8qICwgdGhhdCA9IHVuZGVmaW5lZCAqLykge1xuICAgICAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICAgICAgICB2YXIgYm91bmRGdW5jdGlvbiA9IGJpbmQoY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICAgICAgICB2YXIgZW50cnk7XG4gICAgICAgIHdoaWxlIChlbnRyeSA9IGVudHJ5ID8gZW50cnkubmV4dCA6IHN0YXRlLmZpcnN0KSB7XG4gICAgICAgICAgYm91bmRGdW5jdGlvbihlbnRyeS52YWx1ZSwgZW50cnkua2V5LCB0aGlzKTtcbiAgICAgICAgICAvLyByZXZlcnQgdG8gdGhlIGxhc3QgZXhpc3RpbmcgZW50cnlcbiAgICAgICAgICB3aGlsZSAoZW50cnkgJiYgZW50cnkucmVtb3ZlZCkgZW50cnkgPSBlbnRyeS5wcmV2aW91cztcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vIGB7IE1hcCwgU2V0fS5wcm90b3R5cGUuaGFzKGtleSlgIG1ldGhvZHNcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbWFwLnByb3RvdHlwZS5oYXNcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc2V0LnByb3RvdHlwZS5oYXNcbiAgICAgIGhhczogZnVuY3Rpb24gaGFzKGtleSkge1xuICAgICAgICByZXR1cm4gISFnZXRFbnRyeSh0aGlzLCBrZXkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmVkZWZpbmVBbGwoUHJvdG90eXBlLCBJU19NQVAgPyB7XG4gICAgICAvLyBgTWFwLnByb3RvdHlwZS5nZXQoa2V5KWAgbWV0aG9kXG4gICAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW1hcC5wcm90b3R5cGUuZ2V0XG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldChrZXkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gZ2V0RW50cnkodGhpcywga2V5KTtcbiAgICAgICAgcmV0dXJuIGVudHJ5ICYmIGVudHJ5LnZhbHVlO1xuICAgICAgfSxcbiAgICAgIC8vIGBNYXAucHJvdG90eXBlLnNldChrZXksIHZhbHVlKWAgbWV0aG9kXG4gICAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW1hcC5wcm90b3R5cGUuc2V0XG4gICAgICBzZXQ6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmUodGhpcywga2V5ID09PSAwID8gMCA6IGtleSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH0gOiB7XG4gICAgICAvLyBgU2V0LnByb3RvdHlwZS5hZGQodmFsdWUpYCBtZXRob2RcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc2V0LnByb3RvdHlwZS5hZGRcbiAgICAgIGFkZDogZnVuY3Rpb24gYWRkKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmUodGhpcywgdmFsdWUgPSB2YWx1ZSA9PT0gMCA/IDAgOiB2YWx1ZSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChERVNDUklQVE9SUykgZGVmaW5lUHJvcGVydHkoUHJvdG90eXBlLCAnc2l6ZScsIHtcbiAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKS5zaXplO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBDb25zdHJ1Y3RvcjtcbiAgfSxcbiAgc2V0U3Ryb25nOiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIENPTlNUUlVDVE9SX05BTUUsIElTX01BUCkge1xuICAgIHZhciBJVEVSQVRPUl9OQU1FID0gQ09OU1RSVUNUT1JfTkFNRSArICcgSXRlcmF0b3InO1xuICAgIHZhciBnZXRJbnRlcm5hbENvbGxlY3Rpb25TdGF0ZSA9IGludGVybmFsU3RhdGVHZXR0ZXJGb3IoQ09OU1RSVUNUT1JfTkFNRSk7XG4gICAgdmFyIGdldEludGVybmFsSXRlcmF0b3JTdGF0ZSA9IGludGVybmFsU3RhdGVHZXR0ZXJGb3IoSVRFUkFUT1JfTkFNRSk7XG4gICAgLy8gYHsgTWFwLCBTZXQgfS5wcm90b3R5cGUueyBrZXlzLCB2YWx1ZXMsIGVudHJpZXMsIEBAaXRlcmF0b3IgfSgpYCBtZXRob2RzXG4gICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1tYXAucHJvdG90eXBlLmVudHJpZXNcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW1hcC5wcm90b3R5cGUua2V5c1xuICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbWFwLnByb3RvdHlwZS52YWx1ZXNcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW1hcC5wcm90b3R5cGUtQEBpdGVyYXRvclxuICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc2V0LnByb3RvdHlwZS5lbnRyaWVzXG4gICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zZXQucHJvdG90eXBlLmtleXNcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXNldC5wcm90b3R5cGUudmFsdWVzXG4gICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zZXQucHJvdG90eXBlLUBAaXRlcmF0b3JcbiAgICBkZWZpbmVJdGVyYXRvcihDb25zdHJ1Y3RvciwgQ09OU1RSVUNUT1JfTkFNRSwgZnVuY3Rpb24gKGl0ZXJhdGVkLCBraW5kKSB7XG4gICAgICBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHtcbiAgICAgICAgdHlwZTogSVRFUkFUT1JfTkFNRSxcbiAgICAgICAgdGFyZ2V0OiBpdGVyYXRlZCxcbiAgICAgICAgc3RhdGU6IGdldEludGVybmFsQ29sbGVjdGlvblN0YXRlKGl0ZXJhdGVkKSxcbiAgICAgICAga2luZDoga2luZCxcbiAgICAgICAgbGFzdDogdW5kZWZpbmVkXG4gICAgICB9KTtcbiAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbEl0ZXJhdG9yU3RhdGUodGhpcyk7XG4gICAgICB2YXIga2luZCA9IHN0YXRlLmtpbmQ7XG4gICAgICB2YXIgZW50cnkgPSBzdGF0ZS5sYXN0O1xuICAgICAgLy8gcmV2ZXJ0IHRvIHRoZSBsYXN0IGV4aXN0aW5nIGVudHJ5XG4gICAgICB3aGlsZSAoZW50cnkgJiYgZW50cnkucmVtb3ZlZCkgZW50cnkgPSBlbnRyeS5wcmV2aW91cztcbiAgICAgIC8vIGdldCBuZXh0IGVudHJ5XG4gICAgICBpZiAoIXN0YXRlLnRhcmdldCB8fCAhKHN0YXRlLmxhc3QgPSBlbnRyeSA9IGVudHJ5ID8gZW50cnkubmV4dCA6IHN0YXRlLnN0YXRlLmZpcnN0KSkge1xuICAgICAgICAvLyBvciBmaW5pc2ggdGhlIGl0ZXJhdGlvblxuICAgICAgICBzdGF0ZS50YXJnZXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICAgIH1cbiAgICAgIC8vIHJldHVybiBzdGVwIGJ5IGtpbmRcbiAgICAgIGlmIChraW5kID09ICdrZXlzJykgcmV0dXJuIHsgdmFsdWU6IGVudHJ5LmtleSwgZG9uZTogZmFsc2UgfTtcbiAgICAgIGlmIChraW5kID09ICd2YWx1ZXMnKSByZXR1cm4geyB2YWx1ZTogZW50cnkudmFsdWUsIGRvbmU6IGZhbHNlIH07XG4gICAgICByZXR1cm4geyB2YWx1ZTogW2VudHJ5LmtleSwgZW50cnkudmFsdWVdLCBkb25lOiBmYWxzZSB9O1xuICAgIH0sIElTX01BUCA/ICdlbnRyaWVzJyA6ICd2YWx1ZXMnLCAhSVNfTUFQLCB0cnVlKTtcblxuICAgIC8vIGB7IE1hcCwgU2V0IH0ucHJvdG90eXBlW0BAc3BlY2llc11gIGFjY2Vzc29yc1xuICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtZ2V0LW1hcC1AQHNwZWNpZXNcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWdldC1zZXQtQEBzcGVjaWVzXG4gICAgc2V0U3BlY2llcyhDT05TVFJVQ1RPUl9OQU1FKTtcbiAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBpc0ZvcmNlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1mb3JjZWQnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZScpO1xudmFyIEludGVybmFsTWV0YWRhdGFNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtbWV0YWRhdGEnKTtcbnZhciBpdGVyYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUnKTtcbnZhciBhbkluc3RhbmNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLWluc3RhbmNlJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbicpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgaW5oZXJpdElmUmVxdWlyZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5oZXJpdC1pZi1yZXF1aXJlZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDT05TVFJVQ1RPUl9OQU1FLCB3cmFwcGVyLCBjb21tb24pIHtcbiAgdmFyIElTX01BUCA9IENPTlNUUlVDVE9SX05BTUUuaW5kZXhPZignTWFwJykgIT09IC0xO1xuICB2YXIgSVNfV0VBSyA9IENPTlNUUlVDVE9SX05BTUUuaW5kZXhPZignV2VhaycpICE9PSAtMTtcbiAgdmFyIEFEREVSID0gSVNfTUFQID8gJ3NldCcgOiAnYWRkJztcbiAgdmFyIE5hdGl2ZUNvbnN0cnVjdG9yID0gZ2xvYmFsW0NPTlNUUlVDVE9SX05BTUVdO1xuICB2YXIgTmF0aXZlUHJvdG90eXBlID0gTmF0aXZlQ29uc3RydWN0b3IgJiYgTmF0aXZlQ29uc3RydWN0b3IucHJvdG90eXBlO1xuICB2YXIgQ29uc3RydWN0b3IgPSBOYXRpdmVDb25zdHJ1Y3RvcjtcbiAgdmFyIGV4cG9ydGVkID0ge307XG5cbiAgdmFyIGZpeE1ldGhvZCA9IGZ1bmN0aW9uIChLRVkpIHtcbiAgICB2YXIgdW5jdXJyaWVkTmF0aXZlTWV0aG9kID0gdW5jdXJyeVRoaXMoTmF0aXZlUHJvdG90eXBlW0tFWV0pO1xuICAgIHJlZGVmaW5lKE5hdGl2ZVByb3RvdHlwZSwgS0VZLFxuICAgICAgS0VZID09ICdhZGQnID8gZnVuY3Rpb24gYWRkKHZhbHVlKSB7XG4gICAgICAgIHVuY3VycmllZE5hdGl2ZU1ldGhvZCh0aGlzLCB2YWx1ZSA9PT0gMCA/IDAgOiB2YWx1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSA6IEtFWSA9PSAnZGVsZXRlJyA/IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgcmV0dXJuIElTX1dFQUsgJiYgIWlzT2JqZWN0KGtleSkgPyBmYWxzZSA6IHVuY3VycmllZE5hdGl2ZU1ldGhvZCh0aGlzLCBrZXkgPT09IDAgPyAwIDoga2V5KTtcbiAgICAgIH0gOiBLRVkgPT0gJ2dldCcgPyBmdW5jdGlvbiBnZXQoa2V5KSB7XG4gICAgICAgIHJldHVybiBJU19XRUFLICYmICFpc09iamVjdChrZXkpID8gdW5kZWZpbmVkIDogdW5jdXJyaWVkTmF0aXZlTWV0aG9kKHRoaXMsIGtleSA9PT0gMCA/IDAgOiBrZXkpO1xuICAgICAgfSA6IEtFWSA9PSAnaGFzJyA/IGZ1bmN0aW9uIGhhcyhrZXkpIHtcbiAgICAgICAgcmV0dXJuIElTX1dFQUsgJiYgIWlzT2JqZWN0KGtleSkgPyBmYWxzZSA6IHVuY3VycmllZE5hdGl2ZU1ldGhvZCh0aGlzLCBrZXkgPT09IDAgPyAwIDoga2V5KTtcbiAgICAgIH0gOiBmdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgICB1bmN1cnJpZWROYXRpdmVNZXRob2QodGhpcywga2V5ID09PSAwID8gMCA6IGtleSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICApO1xuICB9O1xuXG4gIHZhciBSRVBMQUNFID0gaXNGb3JjZWQoXG4gICAgQ09OU1RSVUNUT1JfTkFNRSxcbiAgICAhaXNDYWxsYWJsZShOYXRpdmVDb25zdHJ1Y3RvcikgfHwgIShJU19XRUFLIHx8IE5hdGl2ZVByb3RvdHlwZS5mb3JFYWNoICYmICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgICBuZXcgTmF0aXZlQ29uc3RydWN0b3IoKS5lbnRyaWVzKCkubmV4dCgpO1xuICAgIH0pKVxuICApO1xuXG4gIGlmIChSRVBMQUNFKSB7XG4gICAgLy8gY3JlYXRlIGNvbGxlY3Rpb24gY29uc3RydWN0b3JcbiAgICBDb25zdHJ1Y3RvciA9IGNvbW1vbi5nZXRDb25zdHJ1Y3Rvcih3cmFwcGVyLCBDT05TVFJVQ1RPUl9OQU1FLCBJU19NQVAsIEFEREVSKTtcbiAgICBJbnRlcm5hbE1ldGFkYXRhTW9kdWxlLmVuYWJsZSgpO1xuICB9IGVsc2UgaWYgKGlzRm9yY2VkKENPTlNUUlVDVE9SX05BTUUsIHRydWUpKSB7XG4gICAgdmFyIGluc3RhbmNlID0gbmV3IENvbnN0cnVjdG9yKCk7XG4gICAgLy8gZWFybHkgaW1wbGVtZW50YXRpb25zIG5vdCBzdXBwb3J0cyBjaGFpbmluZ1xuICAgIHZhciBIQVNOVF9DSEFJTklORyA9IGluc3RhbmNlW0FEREVSXShJU19XRUFLID8ge30gOiAtMCwgMSkgIT0gaW5zdGFuY2U7XG4gICAgLy8gVjggfiBDaHJvbWl1bSA0MC0gd2Vhay1jb2xsZWN0aW9ucyB0aHJvd3Mgb24gcHJpbWl0aXZlcywgYnV0IHNob3VsZCByZXR1cm4gZmFsc2VcbiAgICB2YXIgVEhST1dTX09OX1BSSU1JVElWRVMgPSBmYWlscyhmdW5jdGlvbiAoKSB7IGluc3RhbmNlLmhhcygxKTsgfSk7XG4gICAgLy8gbW9zdCBlYXJseSBpbXBsZW1lbnRhdGlvbnMgZG9lc24ndCBzdXBwb3J0cyBpdGVyYWJsZXMsIG1vc3QgbW9kZXJuIC0gbm90IGNsb3NlIGl0IGNvcnJlY3RseVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXcgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiAgICB2YXIgQUNDRVBUX0lURVJBQkxFUyA9IGNoZWNrQ29ycmVjdG5lc3NPZkl0ZXJhdGlvbihmdW5jdGlvbiAoaXRlcmFibGUpIHsgbmV3IE5hdGl2ZUNvbnN0cnVjdG9yKGl0ZXJhYmxlKTsgfSk7XG4gICAgLy8gZm9yIGVhcmx5IGltcGxlbWVudGF0aW9ucyAtMCBhbmQgKzAgbm90IHRoZSBzYW1lXG4gICAgdmFyIEJVR0dZX1pFUk8gPSAhSVNfV0VBSyAmJiBmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBWOCB+IENocm9taXVtIDQyLSBmYWlscyBvbmx5IHdpdGggNSsgZWxlbWVudHNcbiAgICAgIHZhciAkaW5zdGFuY2UgPSBuZXcgTmF0aXZlQ29uc3RydWN0b3IoKTtcbiAgICAgIHZhciBpbmRleCA9IDU7XG4gICAgICB3aGlsZSAoaW5kZXgtLSkgJGluc3RhbmNlW0FEREVSXShpbmRleCwgaW5kZXgpO1xuICAgICAgcmV0dXJuICEkaW5zdGFuY2UuaGFzKC0wKTtcbiAgICB9KTtcblxuICAgIGlmICghQUNDRVBUX0lURVJBQkxFUykge1xuICAgICAgQ29uc3RydWN0b3IgPSB3cmFwcGVyKGZ1bmN0aW9uIChkdW1teSwgaXRlcmFibGUpIHtcbiAgICAgICAgYW5JbnN0YW5jZShkdW1teSwgTmF0aXZlUHJvdG90eXBlKTtcbiAgICAgICAgdmFyIHRoYXQgPSBpbmhlcml0SWZSZXF1aXJlZChuZXcgTmF0aXZlQ29uc3RydWN0b3IoKSwgZHVtbXksIENvbnN0cnVjdG9yKTtcbiAgICAgICAgaWYgKGl0ZXJhYmxlICE9IHVuZGVmaW5lZCkgaXRlcmF0ZShpdGVyYWJsZSwgdGhhdFtBRERFUl0sIHsgdGhhdDogdGhhdCwgQVNfRU5UUklFUzogSVNfTUFQIH0pO1xuICAgICAgICByZXR1cm4gdGhhdDtcbiAgICAgIH0pO1xuICAgICAgQ29uc3RydWN0b3IucHJvdG90eXBlID0gTmF0aXZlUHJvdG90eXBlO1xuICAgICAgTmF0aXZlUHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ29uc3RydWN0b3I7XG4gICAgfVxuXG4gICAgaWYgKFRIUk9XU19PTl9QUklNSVRJVkVTIHx8IEJVR0dZX1pFUk8pIHtcbiAgICAgIGZpeE1ldGhvZCgnZGVsZXRlJyk7XG4gICAgICBmaXhNZXRob2QoJ2hhcycpO1xuICAgICAgSVNfTUFQICYmIGZpeE1ldGhvZCgnZ2V0Jyk7XG4gICAgfVxuXG4gICAgaWYgKEJVR0dZX1pFUk8gfHwgSEFTTlRfQ0hBSU5JTkcpIGZpeE1ldGhvZChBRERFUik7XG5cbiAgICAvLyB3ZWFrIGNvbGxlY3Rpb25zIHNob3VsZCBub3QgY29udGFpbnMgLmNsZWFyIG1ldGhvZFxuICAgIGlmIChJU19XRUFLICYmIE5hdGl2ZVByb3RvdHlwZS5jbGVhcikgZGVsZXRlIE5hdGl2ZVByb3RvdHlwZS5jbGVhcjtcbiAgfVxuXG4gIGV4cG9ydGVkW0NPTlNUUlVDVE9SX05BTUVdID0gQ29uc3RydWN0b3I7XG4gICQoeyBnbG9iYWw6IHRydWUsIGZvcmNlZDogQ29uc3RydWN0b3IgIT0gTmF0aXZlQ29uc3RydWN0b3IgfSwgZXhwb3J0ZWQpO1xuXG4gIHNldFRvU3RyaW5nVGFnKENvbnN0cnVjdG9yLCBDT05TVFJVQ1RPUl9OQU1FKTtcblxuICBpZiAoIUlTX1dFQUspIGNvbW1vbi5zZXRTdHJvbmcoQ29uc3RydWN0b3IsIENPTlNUUlVDVE9SX05BTUUsIElTX01BUCk7XG5cbiAgcmV0dXJuIENvbnN0cnVjdG9yO1xufTtcbiIsInZhciBoYXNPd24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eScpO1xudmFyIG93bktleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb3duLWtleXMnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcicpO1xudmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodGFyZ2V0LCBzb3VyY2UpIHtcbiAgdmFyIGtleXMgPSBvd25LZXlzKHNvdXJjZSk7XG4gIHZhciBkZWZpbmVQcm9wZXJ0eSA9IGRlZmluZVByb3BlcnR5TW9kdWxlLmY7XG4gIHZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JNb2R1bGUuZjtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgaWYgKCFoYXNPd24odGFyZ2V0LCBrZXkpKSBkZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7XG4gIH1cbn07XG4iLCJ2YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBGKCkgeyAvKiBlbXB0eSAqLyB9XG4gIEYucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gbnVsbDtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRwcm90b3R5cGVvZiAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICByZXR1cm4gT2JqZWN0LmdldFByb3RvdHlwZU9mKG5ldyBGKCkpICE9PSBGLnByb3RvdHlwZTtcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIEl0ZXJhdG9yUHJvdG90eXBlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycy1jb3JlJykuSXRlcmF0b3JQcm90b3R5cGU7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUnKTtcbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMnKTtcblxudmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChJdGVyYXRvckNvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KSB7XG4gIHZhciBUT19TVFJJTkdfVEFHID0gTkFNRSArICcgSXRlcmF0b3InO1xuICBJdGVyYXRvckNvbnN0cnVjdG9yLnByb3RvdHlwZSA9IGNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSwgeyBuZXh0OiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgbmV4dCkgfSk7XG4gIHNldFRvU3RyaW5nVGFnKEl0ZXJhdG9yQ29uc3RydWN0b3IsIFRPX1NUUklOR19UQUcsIGZhbHNlLCB0cnVlKTtcbiAgSXRlcmF0b3JzW1RPX1NUUklOR19UQUddID0gcmV0dXJuVGhpcztcbiAgcmV0dXJuIEl0ZXJhdG9yQ29uc3RydWN0b3I7XG59O1xuIiwidmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERFU0NSSVBUT1JTID8gZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICByZXR1cm4gZGVmaW5lUHJvcGVydHlNb2R1bGUuZihvYmplY3QsIGtleSwgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDEsIHZhbHVlKSk7XG59IDogZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqZWN0O1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGJpdG1hcCwgdmFsdWUpIHtcbiAgcmV0dXJuIHtcbiAgICBlbnVtZXJhYmxlOiAhKGJpdG1hcCAmIDEpLFxuICAgIGNvbmZpZ3VyYWJsZTogIShiaXRtYXAgJiAyKSxcbiAgICB3cml0YWJsZTogIShiaXRtYXAgJiA0KSxcbiAgICB2YWx1ZTogdmFsdWVcbiAgfTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdG9Qcm9wZXJ0eUtleSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1wcm9wZXJ0eS1rZXknKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICB2YXIgcHJvcGVydHlLZXkgPSB0b1Byb3BlcnR5S2V5KGtleSk7XG4gIGlmIChwcm9wZXJ0eUtleSBpbiBvYmplY3QpIGRlZmluZVByb3BlcnR5TW9kdWxlLmYob2JqZWN0LCBwcm9wZXJ0eUtleSwgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDAsIHZhbHVlKSk7XG4gIGVsc2Ugb2JqZWN0W3Byb3BlcnR5S2V5XSA9IHZhbHVlO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCcpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xudmFyIEZ1bmN0aW9uTmFtZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1uYW1lJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIGNyZWF0ZUl0ZXJhdG9yQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLWl0ZXJhdG9yLWNvbnN0cnVjdG9yJyk7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YnKTtcbnZhciBzZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZicpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eScpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycycpO1xudmFyIEl0ZXJhdG9yc0NvcmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzLWNvcmUnKTtcblxudmFyIFBST1BFUl9GVU5DVElPTl9OQU1FID0gRnVuY3Rpb25OYW1lLlBST1BFUjtcbnZhciBDT05GSUdVUkFCTEVfRlVOQ1RJT05fTkFNRSA9IEZ1bmN0aW9uTmFtZS5DT05GSUdVUkFCTEU7XG52YXIgSXRlcmF0b3JQcm90b3R5cGUgPSBJdGVyYXRvcnNDb3JlLkl0ZXJhdG9yUHJvdG90eXBlO1xudmFyIEJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgPSBJdGVyYXRvcnNDb3JlLkJVR0dZX1NBRkFSSV9JVEVSQVRPUlM7XG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG52YXIgS0VZUyA9ICdrZXlzJztcbnZhciBWQUxVRVMgPSAndmFsdWVzJztcbnZhciBFTlRSSUVTID0gJ2VudHJpZXMnO1xuXG52YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEl0ZXJhYmxlLCBOQU1FLCBJdGVyYXRvckNvbnN0cnVjdG9yLCBuZXh0LCBERUZBVUxULCBJU19TRVQsIEZPUkNFRCkge1xuICBjcmVhdGVJdGVyYXRvckNvbnN0cnVjdG9yKEl0ZXJhdG9yQ29uc3RydWN0b3IsIE5BTUUsIG5leHQpO1xuXG4gIHZhciBnZXRJdGVyYXRpb25NZXRob2QgPSBmdW5jdGlvbiAoS0lORCkge1xuICAgIGlmIChLSU5EID09PSBERUZBVUxUICYmIGRlZmF1bHRJdGVyYXRvcikgcmV0dXJuIGRlZmF1bHRJdGVyYXRvcjtcbiAgICBpZiAoIUJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgJiYgS0lORCBpbiBJdGVyYWJsZVByb3RvdHlwZSkgcmV0dXJuIEl0ZXJhYmxlUHJvdG90eXBlW0tJTkRdO1xuICAgIHN3aXRjaCAoS0lORCkge1xuICAgICAgY2FzZSBLRVlTOiByZXR1cm4gZnVuY3Rpb24ga2V5cygpIHsgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMsIEtJTkQpOyB9O1xuICAgICAgY2FzZSBWQUxVRVM6IHJldHVybiBmdW5jdGlvbiB2YWx1ZXMoKSB7IHJldHVybiBuZXcgSXRlcmF0b3JDb25zdHJ1Y3Rvcih0aGlzLCBLSU5EKTsgfTtcbiAgICAgIGNhc2UgRU5UUklFUzogcmV0dXJuIGZ1bmN0aW9uIGVudHJpZXMoKSB7IHJldHVybiBuZXcgSXRlcmF0b3JDb25zdHJ1Y3Rvcih0aGlzLCBLSU5EKTsgfTtcbiAgICB9IHJldHVybiBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgSXRlcmF0b3JDb25zdHJ1Y3Rvcih0aGlzKTsgfTtcbiAgfTtcblxuICB2YXIgVE9fU1RSSU5HX1RBRyA9IE5BTUUgKyAnIEl0ZXJhdG9yJztcbiAgdmFyIElOQ09SUkVDVF9WQUxVRVNfTkFNRSA9IGZhbHNlO1xuICB2YXIgSXRlcmFibGVQcm90b3R5cGUgPSBJdGVyYWJsZS5wcm90b3R5cGU7XG4gIHZhciBuYXRpdmVJdGVyYXRvciA9IEl0ZXJhYmxlUHJvdG90eXBlW0lURVJBVE9SXVxuICAgIHx8IEl0ZXJhYmxlUHJvdG90eXBlWydAQGl0ZXJhdG9yJ11cbiAgICB8fCBERUZBVUxUICYmIEl0ZXJhYmxlUHJvdG90eXBlW0RFRkFVTFRdO1xuICB2YXIgZGVmYXVsdEl0ZXJhdG9yID0gIUJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgJiYgbmF0aXZlSXRlcmF0b3IgfHwgZ2V0SXRlcmF0aW9uTWV0aG9kKERFRkFVTFQpO1xuICB2YXIgYW55TmF0aXZlSXRlcmF0b3IgPSBOQU1FID09ICdBcnJheScgPyBJdGVyYWJsZVByb3RvdHlwZS5lbnRyaWVzIHx8IG5hdGl2ZUl0ZXJhdG9yIDogbmF0aXZlSXRlcmF0b3I7XG4gIHZhciBDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUsIG1ldGhvZHMsIEtFWTtcblxuICAvLyBmaXggbmF0aXZlXG4gIGlmIChhbnlOYXRpdmVJdGVyYXRvcikge1xuICAgIEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKGFueU5hdGl2ZUl0ZXJhdG9yLmNhbGwobmV3IEl0ZXJhYmxlKCkpKTtcbiAgICBpZiAoQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlICYmIEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZS5uZXh0KSB7XG4gICAgICBpZiAoIUlTX1BVUkUgJiYgZ2V0UHJvdG90eXBlT2YoQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlKSAhPT0gSXRlcmF0b3JQcm90b3R5cGUpIHtcbiAgICAgICAgaWYgKHNldFByb3RvdHlwZU9mKSB7XG4gICAgICAgICAgc2V0UHJvdG90eXBlT2YoQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlLCBJdGVyYXRvclByb3RvdHlwZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoIWlzQ2FsbGFibGUoQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlW0lURVJBVE9SXSkpIHtcbiAgICAgICAgICByZWRlZmluZShDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SLCByZXR1cm5UaGlzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gU2V0IEBAdG9TdHJpbmdUYWcgdG8gbmF0aXZlIGl0ZXJhdG9yc1xuICAgICAgc2V0VG9TdHJpbmdUYWcoQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlLCBUT19TVFJJTkdfVEFHLCB0cnVlLCB0cnVlKTtcbiAgICAgIGlmIChJU19QVVJFKSBJdGVyYXRvcnNbVE9fU1RSSU5HX1RBR10gPSByZXR1cm5UaGlzO1xuICAgIH1cbiAgfVxuXG4gIC8vIGZpeCBBcnJheS5wcm90b3R5cGUueyB2YWx1ZXMsIEBAaXRlcmF0b3IgfS5uYW1lIGluIFY4IC8gRkZcbiAgaWYgKFBST1BFUl9GVU5DVElPTl9OQU1FICYmIERFRkFVTFQgPT0gVkFMVUVTICYmIG5hdGl2ZUl0ZXJhdG9yICYmIG5hdGl2ZUl0ZXJhdG9yLm5hbWUgIT09IFZBTFVFUykge1xuICAgIGlmICghSVNfUFVSRSAmJiBDT05GSUdVUkFCTEVfRlVOQ1RJT05fTkFNRSkge1xuICAgICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KEl0ZXJhYmxlUHJvdG90eXBlLCAnbmFtZScsIFZBTFVFUyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIElOQ09SUkVDVF9WQUxVRVNfTkFNRSA9IHRydWU7XG4gICAgICBkZWZhdWx0SXRlcmF0b3IgPSBmdW5jdGlvbiB2YWx1ZXMoKSB7IHJldHVybiBjYWxsKG5hdGl2ZUl0ZXJhdG9yLCB0aGlzKTsgfTtcbiAgICB9XG4gIH1cblxuICAvLyBleHBvcnQgYWRkaXRpb25hbCBtZXRob2RzXG4gIGlmIChERUZBVUxUKSB7XG4gICAgbWV0aG9kcyA9IHtcbiAgICAgIHZhbHVlczogZ2V0SXRlcmF0aW9uTWV0aG9kKFZBTFVFUyksXG4gICAgICBrZXlzOiBJU19TRVQgPyBkZWZhdWx0SXRlcmF0b3IgOiBnZXRJdGVyYXRpb25NZXRob2QoS0VZUyksXG4gICAgICBlbnRyaWVzOiBnZXRJdGVyYXRpb25NZXRob2QoRU5UUklFUylcbiAgICB9O1xuICAgIGlmIChGT1JDRUQpIGZvciAoS0VZIGluIG1ldGhvZHMpIHtcbiAgICAgIGlmIChCVUdHWV9TQUZBUklfSVRFUkFUT1JTIHx8IElOQ09SUkVDVF9WQUxVRVNfTkFNRSB8fCAhKEtFWSBpbiBJdGVyYWJsZVByb3RvdHlwZSkpIHtcbiAgICAgICAgcmVkZWZpbmUoSXRlcmFibGVQcm90b3R5cGUsIEtFWSwgbWV0aG9kc1tLRVldKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgJCh7IHRhcmdldDogTkFNRSwgcHJvdG86IHRydWUsIGZvcmNlZDogQlVHR1lfU0FGQVJJX0lURVJBVE9SUyB8fCBJTkNPUlJFQ1RfVkFMVUVTX05BTUUgfSwgbWV0aG9kcyk7XG4gIH1cblxuICAvLyBkZWZpbmUgaXRlcmF0b3JcbiAgaWYgKCghSVNfUFVSRSB8fCBGT1JDRUQpICYmIEl0ZXJhYmxlUHJvdG90eXBlW0lURVJBVE9SXSAhPT0gZGVmYXVsdEl0ZXJhdG9yKSB7XG4gICAgcmVkZWZpbmUoSXRlcmFibGVQcm90b3R5cGUsIElURVJBVE9SLCBkZWZhdWx0SXRlcmF0b3IsIHsgbmFtZTogREVGQVVMVCB9KTtcbiAgfVxuICBJdGVyYXRvcnNbTkFNRV0gPSBkZWZhdWx0SXRlcmF0b3I7XG5cbiAgcmV0dXJuIG1ldGhvZHM7XG59O1xuIiwidmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbi8vIERldGVjdCBJRTgncyBpbmNvbXBsZXRlIGRlZmluZVByb3BlcnR5IGltcGxlbWVudGF0aW9uXG5tb2R1bGUuZXhwb3J0cyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgMSwgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH0gfSlbMV0gIT0gNztcbn0pO1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcblxudmFyIGRvY3VtZW50ID0gZ2xvYmFsLmRvY3VtZW50O1xuLy8gdHlwZW9mIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgaXMgJ29iamVjdCcgaW4gb2xkIElFXG52YXIgRVhJU1RTID0gaXNPYmplY3QoZG9jdW1lbnQpICYmIGlzT2JqZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gRVhJU1RTID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChpdCkgOiB7fTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiB3aW5kb3cgPT0gJ29iamVjdCc7XG4iLCJ2YXIgdXNlckFnZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS11c2VyLWFnZW50Jyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IC9pcGFkfGlwaG9uZXxpcG9kL2kudGVzdCh1c2VyQWdlbnQpICYmIGdsb2JhbC5QZWJibGUgIT09IHVuZGVmaW5lZDtcbiIsInZhciB1c2VyQWdlbnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLXVzZXItYWdlbnQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSAvKD86aXBhZHxpcGhvbmV8aXBvZCkuKmFwcGxld2Via2l0L2kudGVzdCh1c2VyQWdlbnQpO1xuIiwidmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gY2xhc3NvZihnbG9iYWwucHJvY2VzcykgPT0gJ3Byb2Nlc3MnO1xuIiwidmFyIHVzZXJBZ2VudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtdXNlci1hZ2VudCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IC93ZWIwcyg/IS4qY2hyb21lKS9pLnRlc3QodXNlckFnZW50KTtcbiIsInZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW4oJ25hdmlnYXRvcicsICd1c2VyQWdlbnQnKSB8fCAnJztcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgdXNlckFnZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS11c2VyLWFnZW50Jyk7XG5cbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7XG52YXIgRGVubyA9IGdsb2JhbC5EZW5vO1xudmFyIHZlcnNpb25zID0gcHJvY2VzcyAmJiBwcm9jZXNzLnZlcnNpb25zIHx8IERlbm8gJiYgRGVuby52ZXJzaW9uO1xudmFyIHY4ID0gdmVyc2lvbnMgJiYgdmVyc2lvbnMudjg7XG52YXIgbWF0Y2gsIHZlcnNpb247XG5cbmlmICh2OCkge1xuICBtYXRjaCA9IHY4LnNwbGl0KCcuJyk7XG4gIC8vIGluIG9sZCBDaHJvbWUsIHZlcnNpb25zIG9mIFY4IGlzbid0IFY4ID0gQ2hyb21lIC8gMTBcbiAgLy8gYnV0IHRoZWlyIGNvcnJlY3QgdmVyc2lvbnMgYXJlIG5vdCBpbnRlcmVzdGluZyBmb3IgdXNcbiAgdmVyc2lvbiA9IG1hdGNoWzBdID4gMCAmJiBtYXRjaFswXSA8IDQgPyAxIDogKyhtYXRjaFswXSArIG1hdGNoWzFdKTtcbn1cblxuLy8gQnJvd3NlckZTIE5vZGVKUyBgcHJvY2Vzc2AgcG9seWZpbGwgaW5jb3JyZWN0bHkgc2V0IGAudjhgIHRvIGAwLjBgXG4vLyBzbyBjaGVjayBgdXNlckFnZW50YCBldmVuIGlmIGAudjhgIGV4aXN0cywgYnV0IDBcbmlmICghdmVyc2lvbiAmJiB1c2VyQWdlbnQpIHtcbiAgbWF0Y2ggPSB1c2VyQWdlbnQubWF0Y2goL0VkZ2VcXC8oXFxkKykvKTtcbiAgaWYgKCFtYXRjaCB8fCBtYXRjaFsxXSA+PSA3NCkge1xuICAgIG1hdGNoID0gdXNlckFnZW50Lm1hdGNoKC9DaHJvbWVcXC8oXFxkKykvKTtcbiAgICBpZiAobWF0Y2gpIHZlcnNpb24gPSArbWF0Y2hbMV07XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB2ZXJzaW9uO1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQ09OU1RSVUNUT1IsIE1FVEhPRCkge1xuICByZXR1cm4gdW5jdXJyeVRoaXMoZ2xvYmFsW0NPTlNUUlVDVE9SXS5wcm90b3R5cGVbTUVUSE9EXSk7XG59O1xuIiwiLy8gSUU4LSBkb24ndCBlbnVtIGJ1ZyBrZXlzXG5tb2R1bGUuZXhwb3J0cyA9IFtcbiAgJ2NvbnN0cnVjdG9yJyxcbiAgJ2hhc093blByb3BlcnR5JyxcbiAgJ2lzUHJvdG90eXBlT2YnLFxuICAncHJvcGVydHlJc0VudW1lcmFibGUnLFxuICAndG9Mb2NhbGVTdHJpbmcnLFxuICAndG9TdHJpbmcnLFxuICAndmFsdWVPZidcbl07XG4iLCJ2YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICB2YXIgZXJyb3IgPSBFcnJvcignYScpO1xuICBpZiAoISgnc3RhY2snIGluIGVycm9yKSkgcmV0dXJuIHRydWU7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gc2FmZVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXJyb3IsICdzdGFjaycsIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigxLCA3KSk7XG4gIHJldHVybiBlcnJvci5zdGFjayAhPT0gNztcbn0pO1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcicpLmY7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eScpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lJyk7XG52YXIgc2V0R2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1nbG9iYWwnKTtcbnZhciBjb3B5Q29uc3RydWN0b3JQcm9wZXJ0aWVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvcHktY29uc3RydWN0b3ItcHJvcGVydGllcycpO1xudmFyIGlzRm9yY2VkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWZvcmNlZCcpO1xuXG4vKlxuICBvcHRpb25zLnRhcmdldCAgICAgIC0gbmFtZSBvZiB0aGUgdGFyZ2V0IG9iamVjdFxuICBvcHRpb25zLmdsb2JhbCAgICAgIC0gdGFyZ2V0IGlzIHRoZSBnbG9iYWwgb2JqZWN0XG4gIG9wdGlvbnMuc3RhdCAgICAgICAgLSBleHBvcnQgYXMgc3RhdGljIG1ldGhvZHMgb2YgdGFyZ2V0XG4gIG9wdGlvbnMucHJvdG8gICAgICAgLSBleHBvcnQgYXMgcHJvdG90eXBlIG1ldGhvZHMgb2YgdGFyZ2V0XG4gIG9wdGlvbnMucmVhbCAgICAgICAgLSByZWFsIHByb3RvdHlwZSBtZXRob2QgZm9yIHRoZSBgcHVyZWAgdmVyc2lvblxuICBvcHRpb25zLmZvcmNlZCAgICAgIC0gZXhwb3J0IGV2ZW4gaWYgdGhlIG5hdGl2ZSBmZWF0dXJlIGlzIGF2YWlsYWJsZVxuICBvcHRpb25zLmJpbmQgICAgICAgIC0gYmluZCBtZXRob2RzIHRvIHRoZSB0YXJnZXQsIHJlcXVpcmVkIGZvciB0aGUgYHB1cmVgIHZlcnNpb25cbiAgb3B0aW9ucy53cmFwICAgICAgICAtIHdyYXAgY29uc3RydWN0b3JzIHRvIHByZXZlbnRpbmcgZ2xvYmFsIHBvbGx1dGlvbiwgcmVxdWlyZWQgZm9yIHRoZSBgcHVyZWAgdmVyc2lvblxuICBvcHRpb25zLnVuc2FmZSAgICAgIC0gdXNlIHRoZSBzaW1wbGUgYXNzaWdubWVudCBvZiBwcm9wZXJ0eSBpbnN0ZWFkIG9mIGRlbGV0ZSArIGRlZmluZVByb3BlcnR5XG4gIG9wdGlvbnMuc2hhbSAgICAgICAgLSBhZGQgYSBmbGFnIHRvIG5vdCBjb21wbGV0ZWx5IGZ1bGwgcG9seWZpbGxzXG4gIG9wdGlvbnMuZW51bWVyYWJsZSAgLSBleHBvcnQgYXMgZW51bWVyYWJsZSBwcm9wZXJ0eVxuICBvcHRpb25zLm5vVGFyZ2V0R2V0IC0gcHJldmVudCBjYWxsaW5nIGEgZ2V0dGVyIG9uIHRhcmdldFxuICBvcHRpb25zLm5hbWUgICAgICAgIC0gdGhlIC5uYW1lIG9mIHRoZSBmdW5jdGlvbiBpZiBpdCBkb2VzIG5vdCBtYXRjaCB0aGUga2V5XG4qL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3B0aW9ucywgc291cmNlKSB7XG4gIHZhciBUQVJHRVQgPSBvcHRpb25zLnRhcmdldDtcbiAgdmFyIEdMT0JBTCA9IG9wdGlvbnMuZ2xvYmFsO1xuICB2YXIgU1RBVElDID0gb3B0aW9ucy5zdGF0O1xuICB2YXIgRk9SQ0VELCB0YXJnZXQsIGtleSwgdGFyZ2V0UHJvcGVydHksIHNvdXJjZVByb3BlcnR5LCBkZXNjcmlwdG9yO1xuICBpZiAoR0xPQkFMKSB7XG4gICAgdGFyZ2V0ID0gZ2xvYmFsO1xuICB9IGVsc2UgaWYgKFNUQVRJQykge1xuICAgIHRhcmdldCA9IGdsb2JhbFtUQVJHRVRdIHx8IHNldEdsb2JhbChUQVJHRVQsIHt9KTtcbiAgfSBlbHNlIHtcbiAgICB0YXJnZXQgPSAoZ2xvYmFsW1RBUkdFVF0gfHwge30pLnByb3RvdHlwZTtcbiAgfVxuICBpZiAodGFyZ2V0KSBmb3IgKGtleSBpbiBzb3VyY2UpIHtcbiAgICBzb3VyY2VQcm9wZXJ0eSA9IHNvdXJjZVtrZXldO1xuICAgIGlmIChvcHRpb25zLm5vVGFyZ2V0R2V0KSB7XG4gICAgICBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KTtcbiAgICAgIHRhcmdldFByb3BlcnR5ID0gZGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yLnZhbHVlO1xuICAgIH0gZWxzZSB0YXJnZXRQcm9wZXJ0eSA9IHRhcmdldFtrZXldO1xuICAgIEZPUkNFRCA9IGlzRm9yY2VkKEdMT0JBTCA/IGtleSA6IFRBUkdFVCArIChTVEFUSUMgPyAnLicgOiAnIycpICsga2V5LCBvcHRpb25zLmZvcmNlZCk7XG4gICAgLy8gY29udGFpbmVkIGluIHRhcmdldFxuICAgIGlmICghRk9SQ0VEICYmIHRhcmdldFByb3BlcnR5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0eXBlb2Ygc291cmNlUHJvcGVydHkgPT0gdHlwZW9mIHRhcmdldFByb3BlcnR5KSBjb250aW51ZTtcbiAgICAgIGNvcHlDb25zdHJ1Y3RvclByb3BlcnRpZXMoc291cmNlUHJvcGVydHksIHRhcmdldFByb3BlcnR5KTtcbiAgICB9XG4gICAgLy8gYWRkIGEgZmxhZyB0byBub3QgY29tcGxldGVseSBmdWxsIHBvbHlmaWxsc1xuICAgIGlmIChvcHRpb25zLnNoYW0gfHwgKHRhcmdldFByb3BlcnR5ICYmIHRhcmdldFByb3BlcnR5LnNoYW0pKSB7XG4gICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoc291cmNlUHJvcGVydHksICdzaGFtJywgdHJ1ZSk7XG4gICAgfVxuICAgIC8vIGV4dGVuZCBnbG9iYWxcbiAgICByZWRlZmluZSh0YXJnZXQsIGtleSwgc291cmNlUHJvcGVydHksIG9wdGlvbnMpO1xuICB9XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYykge1xuICB0cnkge1xuICAgIHJldHVybiAhIWV4ZWMoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTtcbiIsInZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtaXNleHRlbnNpYmxlLCBlcy9uby1vYmplY3QtcHJldmVudGV4dGVuc2lvbnMgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiAgcmV0dXJuIE9iamVjdC5pc0V4dGVuc2libGUoT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKHt9KSk7XG59KTtcbiIsInZhciBGdW5jdGlvblByb3RvdHlwZSA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcbnZhciBhcHBseSA9IEZ1bmN0aW9uUHJvdG90eXBlLmFwcGx5O1xudmFyIGJpbmQgPSBGdW5jdGlvblByb3RvdHlwZS5iaW5kO1xudmFyIGNhbGwgPSBGdW5jdGlvblByb3RvdHlwZS5jYWxsO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tcmVmbGVjdCAtLSBzYWZlXG5tb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiBSZWZsZWN0ID09ICdvYmplY3QnICYmIFJlZmxlY3QuYXBwbHkgfHwgKGJpbmQgPyBjYWxsLmJpbmQoYXBwbHkpIDogZnVuY3Rpb24gKCkge1xuICByZXR1cm4gY2FsbC5hcHBseShhcHBseSwgYXJndW1lbnRzKTtcbn0pO1xuIiwidmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIGFDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWNhbGxhYmxlJyk7XG5cbnZhciBiaW5kID0gdW5jdXJyeVRoaXModW5jdXJyeVRoaXMuYmluZCk7XG5cbi8vIG9wdGlvbmFsIC8gc2ltcGxlIGNvbnRleHQgYmluZGluZ1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZm4sIHRoYXQpIHtcbiAgYUNhbGxhYmxlKGZuKTtcbiAgcmV0dXJuIHRoYXQgPT09IHVuZGVmaW5lZCA/IGZuIDogYmluZCA/IGJpbmQoZm4sIHRoYXQpIDogZnVuY3Rpb24gKC8qIC4uLmFyZ3MgKi8pIHtcbiAgICByZXR1cm4gZm4uYXBwbHkodGhhdCwgYXJndW1lbnRzKTtcbiAgfTtcbn07XG4iLCJ2YXIgY2FsbCA9IEZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNhbGwuYmluZCA/IGNhbGwuYmluZChjYWxsKSA6IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGNhbGwuYXBwbHkoY2FsbCwgYXJndW1lbnRzKTtcbn07XG4iLCJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBoYXNPd24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eScpO1xuXG52YXIgRnVuY3Rpb25Qcm90b3R5cGUgPSBGdW5jdGlvbi5wcm90b3R5cGU7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldG93bnByb3BlcnR5ZGVzY3JpcHRvciAtLSBzYWZlXG52YXIgZ2V0RGVzY3JpcHRvciA9IERFU0NSSVBUT1JTICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbnZhciBFWElTVFMgPSBoYXNPd24oRnVuY3Rpb25Qcm90b3R5cGUsICduYW1lJyk7XG4vLyBhZGRpdGlvbmFsIHByb3RlY3Rpb24gZnJvbSBtaW5pZmllZCAvIG1hbmdsZWQgLyBkcm9wcGVkIGZ1bmN0aW9uIG5hbWVzXG52YXIgUFJPUEVSID0gRVhJU1RTICYmIChmdW5jdGlvbiBzb21ldGhpbmcoKSB7IC8qIGVtcHR5ICovIH0pLm5hbWUgPT09ICdzb21ldGhpbmcnO1xudmFyIENPTkZJR1VSQUJMRSA9IEVYSVNUUyAmJiAoIURFU0NSSVBUT1JTIHx8IChERVNDUklQVE9SUyAmJiBnZXREZXNjcmlwdG9yKEZ1bmN0aW9uUHJvdG90eXBlLCAnbmFtZScpLmNvbmZpZ3VyYWJsZSkpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgRVhJU1RTOiBFWElTVFMsXG4gIFBST1BFUjogUFJPUEVSLFxuICBDT05GSUdVUkFCTEU6IENPTkZJR1VSQUJMRVxufTtcbiIsInZhciBGdW5jdGlvblByb3RvdHlwZSA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcbnZhciBiaW5kID0gRnVuY3Rpb25Qcm90b3R5cGUuYmluZDtcbnZhciBjYWxsID0gRnVuY3Rpb25Qcm90b3R5cGUuY2FsbDtcbnZhciBjYWxsQmluZCA9IGJpbmQgJiYgYmluZC5iaW5kKGNhbGwpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGJpbmQgPyBmdW5jdGlvbiAoZm4pIHtcbiAgcmV0dXJuIGZuICYmIGNhbGxCaW5kKGNhbGwsIGZuKTtcbn0gOiBmdW5jdGlvbiAoZm4pIHtcbiAgcmV0dXJuIGZuICYmIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gY2FsbC5hcHBseShmbiwgYXJndW1lbnRzKTtcbiAgfTtcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcblxudmFyIGFGdW5jdGlvbiA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICByZXR1cm4gaXNDYWxsYWJsZShhcmd1bWVudCkgPyBhcmd1bWVudCA6IHVuZGVmaW5lZDtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5hbWVzcGFjZSwgbWV0aG9kKSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoIDwgMiA/IGFGdW5jdGlvbihnbG9iYWxbbmFtZXNwYWNlXSkgOiBnbG9iYWxbbmFtZXNwYWNlXSAmJiBnbG9iYWxbbmFtZXNwYWNlXVttZXRob2RdO1xufTtcbiIsInZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YnKTtcbnZhciBnZXRNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LW1ldGhvZCcpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXQgIT0gdW5kZWZpbmVkKSByZXR1cm4gZ2V0TWV0aG9kKGl0LCBJVEVSQVRPUilcbiAgICB8fCBnZXRNZXRob2QoaXQsICdAQGl0ZXJhdG9yJylcbiAgICB8fCBJdGVyYXRvcnNbY2xhc3NvZihpdCldO1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgYUNhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtY2FsbGFibGUnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciB0cnlUb1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90cnktdG8tc3RyaW5nJyk7XG52YXIgZ2V0SXRlcmF0b3JNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZCcpO1xuXG52YXIgVHlwZUVycm9yID0gZ2xvYmFsLlR5cGVFcnJvcjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQsIHVzaW5nSXRlcmF0b3IpIHtcbiAgdmFyIGl0ZXJhdG9yTWV0aG9kID0gYXJndW1lbnRzLmxlbmd0aCA8IDIgPyBnZXRJdGVyYXRvck1ldGhvZChhcmd1bWVudCkgOiB1c2luZ0l0ZXJhdG9yO1xuICBpZiAoYUNhbGxhYmxlKGl0ZXJhdG9yTWV0aG9kKSkgcmV0dXJuIGFuT2JqZWN0KGNhbGwoaXRlcmF0b3JNZXRob2QsIGFyZ3VtZW50KSk7XG4gIHRocm93IFR5cGVFcnJvcih0cnlUb1N0cmluZyhhcmd1bWVudCkgKyAnIGlzIG5vdCBpdGVyYWJsZScpO1xufTtcbiIsInZhciBhQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1jYWxsYWJsZScpO1xuXG4vLyBgR2V0TWV0aG9kYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtZ2V0bWV0aG9kXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChWLCBQKSB7XG4gIHZhciBmdW5jID0gVltQXTtcbiAgcmV0dXJuIGZ1bmMgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IGFDYWxsYWJsZShmdW5jKTtcbn07XG4iLCJ2YXIgY2hlY2sgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ICYmIGl0Lk1hdGggPT0gTWF0aCAmJiBpdDtcbn07XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy84NiNpc3N1ZWNvbW1lbnQtMTE1NzU5MDI4XG5tb2R1bGUuZXhwb3J0cyA9XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1nbG9iYWwtdGhpcyAtLSBzYWZlXG4gIGNoZWNrKHR5cGVvZiBnbG9iYWxUaGlzID09ICdvYmplY3QnICYmIGdsb2JhbFRoaXMpIHx8XG4gIGNoZWNrKHR5cGVvZiB3aW5kb3cgPT0gJ29iamVjdCcgJiYgd2luZG93KSB8fFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzIC0tIHNhZmVcbiAgY2hlY2sodHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgJiYgc2VsZikgfHxcbiAgY2hlY2sodHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWwpIHx8XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuYyAtLSBmYWxsYmFja1xuICAoZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSkoKSB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuIiwidmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xuXG52YXIgaGFzT3duUHJvcGVydHkgPSB1bmN1cnJ5VGhpcyh7fS5oYXNPd25Qcm9wZXJ0eSk7XG5cbi8vIGBIYXNPd25Qcm9wZXJ0eWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWhhc293bnByb3BlcnR5XG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5oYXNPd24gfHwgZnVuY3Rpb24gaGFzT3duKGl0LCBrZXkpIHtcbiAgcmV0dXJuIGhhc093blByb3BlcnR5KHRvT2JqZWN0KGl0KSwga2V5KTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHt9O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYSwgYikge1xuICB2YXIgY29uc29sZSA9IGdsb2JhbC5jb25zb2xlO1xuICBpZiAoY29uc29sZSAmJiBjb25zb2xlLmVycm9yKSB7XG4gICAgYXJndW1lbnRzLmxlbmd0aCA9PSAxID8gY29uc29sZS5lcnJvcihhKSA6IGNvbnNvbGUuZXJyb3IoYSwgYik7XG4gIH1cbn07XG4iLCJ2YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBnZXRCdWlsdEluKCdkb2N1bWVudCcsICdkb2N1bWVudEVsZW1lbnQnKTtcbiIsInZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgY3JlYXRlRWxlbWVudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudCcpO1xuXG4vLyBUaGFuaydzIElFOCBmb3IgaGlzIGZ1bm55IGRlZmluZVByb3BlcnR5XG5tb2R1bGUuZXhwb3J0cyA9ICFERVNDUklQVE9SUyAmJiAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnR5IC0tIHJlcXVpZWQgZm9yIHRlc3RpbmdcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjcmVhdGVFbGVtZW50KCdkaXYnKSwgJ2EnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiA3OyB9XG4gIH0pLmEgIT0gNztcbn0pO1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTtcblxudmFyIE9iamVjdCA9IGdsb2JhbC5PYmplY3Q7XG52YXIgc3BsaXQgPSB1bmN1cnJ5VGhpcygnJy5zcGxpdCk7XG5cbi8vIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgYW5kIG5vbi1lbnVtZXJhYmxlIG9sZCBWOCBzdHJpbmdzXG5tb2R1bGUuZXhwb3J0cyA9IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gdGhyb3dzIGFuIGVycm9yIGluIHJoaW5vLCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL21vemlsbGEvcmhpbm8vaXNzdWVzLzM0NlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zIC0tIHNhZmVcbiAgcmV0dXJuICFPYmplY3QoJ3onKS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgwKTtcbn0pID8gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBjbGFzc29mKGl0KSA9PSAnU3RyaW5nJyA/IHNwbGl0KGl0LCAnJykgOiBPYmplY3QoaXQpO1xufSA6IE9iamVjdDtcbiIsInZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YnKTtcblxuLy8gbWFrZXMgc3ViY2xhc3Npbmcgd29yayBjb3JyZWN0IGZvciB3cmFwcGVkIGJ1aWx0LWluc1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoJHRoaXMsIGR1bW15LCBXcmFwcGVyKSB7XG4gIHZhciBOZXdUYXJnZXQsIE5ld1RhcmdldFByb3RvdHlwZTtcbiAgaWYgKFxuICAgIC8vIGl0IGNhbiB3b3JrIG9ubHkgd2l0aCBuYXRpdmUgYHNldFByb3RvdHlwZU9mYFxuICAgIHNldFByb3RvdHlwZU9mICYmXG4gICAgLy8gd2UgaGF2ZW4ndCBjb21wbGV0ZWx5IGNvcnJlY3QgcHJlLUVTNiB3YXkgZm9yIGdldHRpbmcgYG5ldy50YXJnZXRgLCBzbyB1c2UgdGhpc1xuICAgIGlzQ2FsbGFibGUoTmV3VGFyZ2V0ID0gZHVtbXkuY29uc3RydWN0b3IpICYmXG4gICAgTmV3VGFyZ2V0ICE9PSBXcmFwcGVyICYmXG4gICAgaXNPYmplY3QoTmV3VGFyZ2V0UHJvdG90eXBlID0gTmV3VGFyZ2V0LnByb3RvdHlwZSkgJiZcbiAgICBOZXdUYXJnZXRQcm90b3R5cGUgIT09IFdyYXBwZXIucHJvdG90eXBlXG4gICkgc2V0UHJvdG90eXBlT2YoJHRoaXMsIE5ld1RhcmdldFByb3RvdHlwZSk7XG4gIHJldHVybiAkdGhpcztcbn07XG4iLCJ2YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIHN0b3JlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZC1zdG9yZScpO1xuXG52YXIgZnVuY3Rpb25Ub1N0cmluZyA9IHVuY3VycnlUaGlzKEZ1bmN0aW9uLnRvU3RyaW5nKTtcblxuLy8gdGhpcyBoZWxwZXIgYnJva2VuIGluIGBjb3JlLWpzQDMuNC4xLTMuNC40YCwgc28gd2UgY2FuJ3QgdXNlIGBzaGFyZWRgIGhlbHBlclxuaWYgKCFpc0NhbGxhYmxlKHN0b3JlLmluc3BlY3RTb3VyY2UpKSB7XG4gIHN0b3JlLmluc3BlY3RTb3VyY2UgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb25Ub1N0cmluZyhpdCk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3RvcmUuaW5zcGVjdFNvdXJjZTtcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7XG5cbi8vIGBJbnN0YWxsRXJyb3JDYXVzZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvcHJvcG9zYWwtZXJyb3ItY2F1c2UvI3NlYy1lcnJvcm9iamVjdHMtaW5zdGFsbC1lcnJvci1jYXVzZVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTywgb3B0aW9ucykge1xuICBpZiAoaXNPYmplY3Qob3B0aW9ucykgJiYgJ2NhdXNlJyBpbiBvcHRpb25zKSB7XG4gICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KE8sICdjYXVzZScsIG9wdGlvbnMuY2F1c2UpO1xuICB9XG59O1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgaGlkZGVuS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRkZW4ta2V5cycpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG52YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpLmY7XG52YXIgZ2V0T3duUHJvcGVydHlOYW1lc01vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcycpO1xudmFyIGdldE93blByb3BlcnR5TmFtZXNFeHRlcm5hbE1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcy1leHRlcm5hbCcpO1xudmFyIHVpZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy91aWQnKTtcbnZhciBGUkVFWklORyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mcmVlemluZycpO1xuXG52YXIgUkVRVUlSRUQgPSBmYWxzZTtcbnZhciBNRVRBREFUQSA9IHVpZCgnbWV0YScpO1xudmFyIGlkID0gMDtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1pc2V4dGVuc2libGUgLS0gc2FmZVxudmFyIGlzRXh0ZW5zaWJsZSA9IE9iamVjdC5pc0V4dGVuc2libGUgfHwgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdHJ1ZTtcbn07XG5cbnZhciBzZXRNZXRhZGF0YSA9IGZ1bmN0aW9uIChpdCkge1xuICBkZWZpbmVQcm9wZXJ0eShpdCwgTUVUQURBVEEsIHsgdmFsdWU6IHtcbiAgICBvYmplY3RJRDogJ08nICsgaWQrKywgLy8gb2JqZWN0IElEXG4gICAgd2Vha0RhdGE6IHt9ICAgICAgICAgIC8vIHdlYWsgY29sbGVjdGlvbnMgSURzXG4gIH0gfSk7XG59O1xuXG52YXIgZmFzdEtleSA9IGZ1bmN0aW9uIChpdCwgY3JlYXRlKSB7XG4gIC8vIHJldHVybiBhIHByaW1pdGl2ZSB3aXRoIHByZWZpeFxuICBpZiAoIWlzT2JqZWN0KGl0KSkgcmV0dXJuIHR5cGVvZiBpdCA9PSAnc3ltYm9sJyA/IGl0IDogKHR5cGVvZiBpdCA9PSAnc3RyaW5nJyA/ICdTJyA6ICdQJykgKyBpdDtcbiAgaWYgKCFoYXNPd24oaXQsIE1FVEFEQVRBKSkge1xuICAgIC8vIGNhbid0IHNldCBtZXRhZGF0YSB0byB1bmNhdWdodCBmcm96ZW4gb2JqZWN0XG4gICAgaWYgKCFpc0V4dGVuc2libGUoaXQpKSByZXR1cm4gJ0YnO1xuICAgIC8vIG5vdCBuZWNlc3NhcnkgdG8gYWRkIG1ldGFkYXRhXG4gICAgaWYgKCFjcmVhdGUpIHJldHVybiAnRSc7XG4gICAgLy8gYWRkIG1pc3NpbmcgbWV0YWRhdGFcbiAgICBzZXRNZXRhZGF0YShpdCk7XG4gIC8vIHJldHVybiBvYmplY3QgSURcbiAgfSByZXR1cm4gaXRbTUVUQURBVEFdLm9iamVjdElEO1xufTtcblxudmFyIGdldFdlYWtEYXRhID0gZnVuY3Rpb24gKGl0LCBjcmVhdGUpIHtcbiAgaWYgKCFoYXNPd24oaXQsIE1FVEFEQVRBKSkge1xuICAgIC8vIGNhbid0IHNldCBtZXRhZGF0YSB0byB1bmNhdWdodCBmcm96ZW4gb2JqZWN0XG4gICAgaWYgKCFpc0V4dGVuc2libGUoaXQpKSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBub3QgbmVjZXNzYXJ5IHRvIGFkZCBtZXRhZGF0YVxuICAgIGlmICghY3JlYXRlKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gYWRkIG1pc3NpbmcgbWV0YWRhdGFcbiAgICBzZXRNZXRhZGF0YShpdCk7XG4gIC8vIHJldHVybiB0aGUgc3RvcmUgb2Ygd2VhayBjb2xsZWN0aW9ucyBJRHNcbiAgfSByZXR1cm4gaXRbTUVUQURBVEFdLndlYWtEYXRhO1xufTtcblxuLy8gYWRkIG1ldGFkYXRhIG9uIGZyZWV6ZS1mYW1pbHkgbWV0aG9kcyBjYWxsaW5nXG52YXIgb25GcmVlemUgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKEZSRUVaSU5HICYmIFJFUVVJUkVEICYmIGlzRXh0ZW5zaWJsZShpdCkgJiYgIWhhc093bihpdCwgTUVUQURBVEEpKSBzZXRNZXRhZGF0YShpdCk7XG4gIHJldHVybiBpdDtcbn07XG5cbnZhciBlbmFibGUgPSBmdW5jdGlvbiAoKSB7XG4gIG1ldGEuZW5hYmxlID0gZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9O1xuICBSRVFVSVJFRCA9IHRydWU7XG4gIHZhciBnZXRPd25Qcm9wZXJ0eU5hbWVzID0gZ2V0T3duUHJvcGVydHlOYW1lc01vZHVsZS5mO1xuICB2YXIgc3BsaWNlID0gdW5jdXJyeVRoaXMoW10uc3BsaWNlKTtcbiAgdmFyIHRlc3QgPSB7fTtcbiAgdGVzdFtNRVRBREFUQV0gPSAxO1xuXG4gIC8vIHByZXZlbnQgZXhwb3Npbmcgb2YgbWV0YWRhdGEga2V5XG4gIGlmIChnZXRPd25Qcm9wZXJ0eU5hbWVzKHRlc3QpLmxlbmd0aCkge1xuICAgIGdldE93blByb3BlcnR5TmFtZXNNb2R1bGUuZiA9IGZ1bmN0aW9uIChpdCkge1xuICAgICAgdmFyIHJlc3VsdCA9IGdldE93blByb3BlcnR5TmFtZXMoaXQpO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IHJlc3VsdC5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAocmVzdWx0W2ldID09PSBNRVRBREFUQSkge1xuICAgICAgICAgIHNwbGljZShyZXN1bHQsIGksIDEpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9IHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgICQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IHRydWUgfSwge1xuICAgICAgZ2V0T3duUHJvcGVydHlOYW1lczogZ2V0T3duUHJvcGVydHlOYW1lc0V4dGVybmFsTW9kdWxlLmZcbiAgICB9KTtcbiAgfVxufTtcblxudmFyIG1ldGEgPSBtb2R1bGUuZXhwb3J0cyA9IHtcbiAgZW5hYmxlOiBlbmFibGUsXG4gIGZhc3RLZXk6IGZhc3RLZXksXG4gIGdldFdlYWtEYXRhOiBnZXRXZWFrRGF0YSxcbiAgb25GcmVlemU6IG9uRnJlZXplXG59O1xuXG5oaWRkZW5LZXlzW01FVEFEQVRBXSA9IHRydWU7XG4iLCJ2YXIgTkFUSVZFX1dFQUtfTUFQID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25hdGl2ZS13ZWFrLW1hcCcpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHknKTtcbnZhciBzaGFyZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLXN0b3JlJyk7XG52YXIgc2hhcmVkS2V5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZC1rZXknKTtcbnZhciBoaWRkZW5LZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGRlbi1rZXlzJyk7XG5cbnZhciBPQkpFQ1RfQUxSRUFEWV9JTklUSUFMSVpFRCA9ICdPYmplY3QgYWxyZWFkeSBpbml0aWFsaXplZCc7XG52YXIgVHlwZUVycm9yID0gZ2xvYmFsLlR5cGVFcnJvcjtcbnZhciBXZWFrTWFwID0gZ2xvYmFsLldlYWtNYXA7XG52YXIgc2V0LCBnZXQsIGhhcztcblxudmFyIGVuZm9yY2UgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGhhcyhpdCkgPyBnZXQoaXQpIDogc2V0KGl0LCB7fSk7XG59O1xuXG52YXIgZ2V0dGVyRm9yID0gZnVuY3Rpb24gKFRZUEUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChpdCkge1xuICAgIHZhciBzdGF0ZTtcbiAgICBpZiAoIWlzT2JqZWN0KGl0KSB8fCAoc3RhdGUgPSBnZXQoaXQpKS50eXBlICE9PSBUWVBFKSB7XG4gICAgICB0aHJvdyBUeXBlRXJyb3IoJ0luY29tcGF0aWJsZSByZWNlaXZlciwgJyArIFRZUEUgKyAnIHJlcXVpcmVkJyk7XG4gICAgfSByZXR1cm4gc3RhdGU7XG4gIH07XG59O1xuXG5pZiAoTkFUSVZFX1dFQUtfTUFQIHx8IHNoYXJlZC5zdGF0ZSkge1xuICB2YXIgc3RvcmUgPSBzaGFyZWQuc3RhdGUgfHwgKHNoYXJlZC5zdGF0ZSA9IG5ldyBXZWFrTWFwKCkpO1xuICB2YXIgd21nZXQgPSB1bmN1cnJ5VGhpcyhzdG9yZS5nZXQpO1xuICB2YXIgd21oYXMgPSB1bmN1cnJ5VGhpcyhzdG9yZS5oYXMpO1xuICB2YXIgd21zZXQgPSB1bmN1cnJ5VGhpcyhzdG9yZS5zZXQpO1xuICBzZXQgPSBmdW5jdGlvbiAoaXQsIG1ldGFkYXRhKSB7XG4gICAgaWYgKHdtaGFzKHN0b3JlLCBpdCkpIHRocm93IG5ldyBUeXBlRXJyb3IoT0JKRUNUX0FMUkVBRFlfSU5JVElBTElaRUQpO1xuICAgIG1ldGFkYXRhLmZhY2FkZSA9IGl0O1xuICAgIHdtc2V0KHN0b3JlLCBpdCwgbWV0YWRhdGEpO1xuICAgIHJldHVybiBtZXRhZGF0YTtcbiAgfTtcbiAgZ2V0ID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIHdtZ2V0KHN0b3JlLCBpdCkgfHwge307XG4gIH07XG4gIGhhcyA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiB3bWhhcyhzdG9yZSwgaXQpO1xuICB9O1xufSBlbHNlIHtcbiAgdmFyIFNUQVRFID0gc2hhcmVkS2V5KCdzdGF0ZScpO1xuICBoaWRkZW5LZXlzW1NUQVRFXSA9IHRydWU7XG4gIHNldCA9IGZ1bmN0aW9uIChpdCwgbWV0YWRhdGEpIHtcbiAgICBpZiAoaGFzT3duKGl0LCBTVEFURSkpIHRocm93IG5ldyBUeXBlRXJyb3IoT0JKRUNUX0FMUkVBRFlfSU5JVElBTElaRUQpO1xuICAgIG1ldGFkYXRhLmZhY2FkZSA9IGl0O1xuICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShpdCwgU1RBVEUsIG1ldGFkYXRhKTtcbiAgICByZXR1cm4gbWV0YWRhdGE7XG4gIH07XG4gIGdldCA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiBoYXNPd24oaXQsIFNUQVRFKSA/IGl0W1NUQVRFXSA6IHt9O1xuICB9O1xuICBoYXMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gaGFzT3duKGl0LCBTVEFURSk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzZXQ6IHNldCxcbiAgZ2V0OiBnZXQsXG4gIGhhczogaGFzLFxuICBlbmZvcmNlOiBlbmZvcmNlLFxuICBnZXR0ZXJGb3I6IGdldHRlckZvclxufTtcbiIsInZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzJyk7XG5cbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcbnZhciBBcnJheVByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZTtcblxuLy8gY2hlY2sgb24gZGVmYXVsdCBBcnJheSBpdGVyYXRvclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ICE9PSB1bmRlZmluZWQgJiYgKEl0ZXJhdG9ycy5BcnJheSA9PT0gaXQgfHwgQXJyYXlQcm90b3R5cGVbSVRFUkFUT1JdID09PSBpdCk7XG59O1xuIiwidmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTtcblxuLy8gYElzQXJyYXlgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1pc2FycmF5XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tYXJyYXktaXNhcnJheSAtLSBzYWZlXG5tb2R1bGUuZXhwb3J0cyA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gaXNBcnJheShhcmd1bWVudCkge1xuICByZXR1cm4gY2xhc3NvZihhcmd1bWVudCkgPT0gJ0FycmF5Jztcbn07XG4iLCIvLyBgSXNDYWxsYWJsZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWlzY2FsbGFibGVcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIHJldHVybiB0eXBlb2YgYXJndW1lbnQgPT0gJ2Z1bmN0aW9uJztcbn07XG4iLCJ2YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mJyk7XG52YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciBpbnNwZWN0U291cmNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luc3BlY3Qtc291cmNlJyk7XG5cbnZhciBub29wID0gZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9O1xudmFyIGVtcHR5ID0gW107XG52YXIgY29uc3RydWN0ID0gZ2V0QnVpbHRJbignUmVmbGVjdCcsICdjb25zdHJ1Y3QnKTtcbnZhciBjb25zdHJ1Y3RvclJlZ0V4cCA9IC9eXFxzKig/OmNsYXNzfGZ1bmN0aW9uKVxcYi87XG52YXIgZXhlYyA9IHVuY3VycnlUaGlzKGNvbnN0cnVjdG9yUmVnRXhwLmV4ZWMpO1xudmFyIElOQ09SUkVDVF9UT19TVFJJTkcgPSAhY29uc3RydWN0b3JSZWdFeHAuZXhlYyhub29wKTtcblxudmFyIGlzQ29uc3RydWN0b3JNb2Rlcm4gPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgaWYgKCFpc0NhbGxhYmxlKGFyZ3VtZW50KSkgcmV0dXJuIGZhbHNlO1xuICB0cnkge1xuICAgIGNvbnN0cnVjdChub29wLCBlbXB0eSwgYXJndW1lbnQpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxudmFyIGlzQ29uc3RydWN0b3JMZWdhY3kgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgaWYgKCFpc0NhbGxhYmxlKGFyZ3VtZW50KSkgcmV0dXJuIGZhbHNlO1xuICBzd2l0Y2ggKGNsYXNzb2YoYXJndW1lbnQpKSB7XG4gICAgY2FzZSAnQXN5bmNGdW5jdGlvbic6XG4gICAgY2FzZSAnR2VuZXJhdG9yRnVuY3Rpb24nOlxuICAgIGNhc2UgJ0FzeW5jR2VuZXJhdG9yRnVuY3Rpb24nOiByZXR1cm4gZmFsc2U7XG4gICAgLy8gd2UgY2FuJ3QgY2hlY2sgLnByb3RvdHlwZSBzaW5jZSBjb25zdHJ1Y3RvcnMgcHJvZHVjZWQgYnkgLmJpbmQgaGF2ZW4ndCBpdFxuICB9IHJldHVybiBJTkNPUlJFQ1RfVE9fU1RSSU5HIHx8ICEhZXhlYyhjb25zdHJ1Y3RvclJlZ0V4cCwgaW5zcGVjdFNvdXJjZShhcmd1bWVudCkpO1xufTtcblxuLy8gYElzQ29uc3RydWN0b3JgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1pc2NvbnN0cnVjdG9yXG5tb2R1bGUuZXhwb3J0cyA9ICFjb25zdHJ1Y3QgfHwgZmFpbHMoZnVuY3Rpb24gKCkge1xuICB2YXIgY2FsbGVkO1xuICByZXR1cm4gaXNDb25zdHJ1Y3Rvck1vZGVybihpc0NvbnN0cnVjdG9yTW9kZXJuLmNhbGwpXG4gICAgfHwgIWlzQ29uc3RydWN0b3JNb2Rlcm4oT2JqZWN0KVxuICAgIHx8ICFpc0NvbnN0cnVjdG9yTW9kZXJuKGZ1bmN0aW9uICgpIHsgY2FsbGVkID0gdHJ1ZTsgfSlcbiAgICB8fCBjYWxsZWQ7XG59KSA/IGlzQ29uc3RydWN0b3JMZWdhY3kgOiBpc0NvbnN0cnVjdG9yTW9kZXJuO1xuIiwidmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xuXG52YXIgcmVwbGFjZW1lbnQgPSAvI3xcXC5wcm90b3R5cGVcXC4vO1xuXG52YXIgaXNGb3JjZWQgPSBmdW5jdGlvbiAoZmVhdHVyZSwgZGV0ZWN0aW9uKSB7XG4gIHZhciB2YWx1ZSA9IGRhdGFbbm9ybWFsaXplKGZlYXR1cmUpXTtcbiAgcmV0dXJuIHZhbHVlID09IFBPTFlGSUxMID8gdHJ1ZVxuICAgIDogdmFsdWUgPT0gTkFUSVZFID8gZmFsc2VcbiAgICA6IGlzQ2FsbGFibGUoZGV0ZWN0aW9uKSA/IGZhaWxzKGRldGVjdGlvbilcbiAgICA6ICEhZGV0ZWN0aW9uO1xufTtcblxudmFyIG5vcm1hbGl6ZSA9IGlzRm9yY2VkLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgcmV0dXJuIFN0cmluZyhzdHJpbmcpLnJlcGxhY2UocmVwbGFjZW1lbnQsICcuJykudG9Mb3dlckNhc2UoKTtcbn07XG5cbnZhciBkYXRhID0gaXNGb3JjZWQuZGF0YSA9IHt9O1xudmFyIE5BVElWRSA9IGlzRm9yY2VkLk5BVElWRSA9ICdOJztcbnZhciBQT0xZRklMTCA9IGlzRm9yY2VkLlBPTFlGSUxMID0gJ1AnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzRm9yY2VkO1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xuXG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xuXG4vLyBgSXNJbnRlZ3JhbE51bWJlcmAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWlzaW50ZWdyYWxudW1iZXJcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1udW1iZXItaXNpbnRlZ2VyIC0tIHNhZmVcbm1vZHVsZS5leHBvcnRzID0gTnVtYmVyLmlzSW50ZWdlciB8fCBmdW5jdGlvbiBpc0ludGVnZXIoaXQpIHtcbiAgcmV0dXJuICFpc09iamVjdChpdCkgJiYgaXNGaW5pdGUoaXQpICYmIGZsb29yKGl0KSA9PT0gaXQ7XG59O1xuIiwidmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHR5cGVvZiBpdCA9PSAnb2JqZWN0JyA/IGl0ICE9PSBudWxsIDogaXNDYWxsYWJsZShpdCk7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmYWxzZTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG52YXIgaXNQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mJyk7XG52YXIgVVNFX1NZTUJPTF9BU19VSUQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdXNlLXN5bWJvbC1hcy11aWQnKTtcblxudmFyIE9iamVjdCA9IGdsb2JhbC5PYmplY3Q7XG5cbm1vZHVsZS5leHBvcnRzID0gVVNFX1NZTUJPTF9BU19VSUQgPyBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHR5cGVvZiBpdCA9PSAnc3ltYm9sJztcbn0gOiBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyICRTeW1ib2wgPSBnZXRCdWlsdEluKCdTeW1ib2wnKTtcbiAgcmV0dXJuIGlzQ2FsbGFibGUoJFN5bWJvbCkgJiYgaXNQcm90b3R5cGVPZigkU3ltYm9sLnByb3RvdHlwZSwgT2JqZWN0KGl0KSk7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBiaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtY29udGV4dCcpO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCcpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIHRyeVRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RyeS10by1zdHJpbmcnKTtcbnZhciBpc0FycmF5SXRlcmF0b3JNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtYXJyYXktaXRlcmF0b3ItbWV0aG9kJyk7XG52YXIgbGVuZ3RoT2ZBcnJheUxpa2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UnKTtcbnZhciBpc1Byb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YnKTtcbnZhciBnZXRJdGVyYXRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtaXRlcmF0b3InKTtcbnZhciBnZXRJdGVyYXRvck1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG52YXIgaXRlcmF0b3JDbG9zZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvci1jbG9zZScpO1xuXG52YXIgVHlwZUVycm9yID0gZ2xvYmFsLlR5cGVFcnJvcjtcblxudmFyIFJlc3VsdCA9IGZ1bmN0aW9uIChzdG9wcGVkLCByZXN1bHQpIHtcbiAgdGhpcy5zdG9wcGVkID0gc3RvcHBlZDtcbiAgdGhpcy5yZXN1bHQgPSByZXN1bHQ7XG59O1xuXG52YXIgUmVzdWx0UHJvdG90eXBlID0gUmVzdWx0LnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlcmFibGUsIHVuYm91bmRGdW5jdGlvbiwgb3B0aW9ucykge1xuICB2YXIgdGhhdCA9IG9wdGlvbnMgJiYgb3B0aW9ucy50aGF0O1xuICB2YXIgQVNfRU5UUklFUyA9ICEhKG9wdGlvbnMgJiYgb3B0aW9ucy5BU19FTlRSSUVTKTtcbiAgdmFyIElTX0lURVJBVE9SID0gISEob3B0aW9ucyAmJiBvcHRpb25zLklTX0lURVJBVE9SKTtcbiAgdmFyIElOVEVSUlVQVEVEID0gISEob3B0aW9ucyAmJiBvcHRpb25zLklOVEVSUlVQVEVEKTtcbiAgdmFyIGZuID0gYmluZCh1bmJvdW5kRnVuY3Rpb24sIHRoYXQpO1xuICB2YXIgaXRlcmF0b3IsIGl0ZXJGbiwgaW5kZXgsIGxlbmd0aCwgcmVzdWx0LCBuZXh0LCBzdGVwO1xuXG4gIHZhciBzdG9wID0gZnVuY3Rpb24gKGNvbmRpdGlvbikge1xuICAgIGlmIChpdGVyYXRvcikgaXRlcmF0b3JDbG9zZShpdGVyYXRvciwgJ25vcm1hbCcsIGNvbmRpdGlvbik7XG4gICAgcmV0dXJuIG5ldyBSZXN1bHQodHJ1ZSwgY29uZGl0aW9uKTtcbiAgfTtcblxuICB2YXIgY2FsbEZuID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgaWYgKEFTX0VOVFJJRVMpIHtcbiAgICAgIGFuT2JqZWN0KHZhbHVlKTtcbiAgICAgIHJldHVybiBJTlRFUlJVUFRFRCA/IGZuKHZhbHVlWzBdLCB2YWx1ZVsxXSwgc3RvcCkgOiBmbih2YWx1ZVswXSwgdmFsdWVbMV0pO1xuICAgIH0gcmV0dXJuIElOVEVSUlVQVEVEID8gZm4odmFsdWUsIHN0b3ApIDogZm4odmFsdWUpO1xuICB9O1xuXG4gIGlmIChJU19JVEVSQVRPUikge1xuICAgIGl0ZXJhdG9yID0gaXRlcmFibGU7XG4gIH0gZWxzZSB7XG4gICAgaXRlckZuID0gZ2V0SXRlcmF0b3JNZXRob2QoaXRlcmFibGUpO1xuICAgIGlmICghaXRlckZuKSB0aHJvdyBUeXBlRXJyb3IodHJ5VG9TdHJpbmcoaXRlcmFibGUpICsgJyBpcyBub3QgaXRlcmFibGUnKTtcbiAgICAvLyBvcHRpbWlzYXRpb24gZm9yIGFycmF5IGl0ZXJhdG9yc1xuICAgIGlmIChpc0FycmF5SXRlcmF0b3JNZXRob2QoaXRlckZuKSkge1xuICAgICAgZm9yIChpbmRleCA9IDAsIGxlbmd0aCA9IGxlbmd0aE9mQXJyYXlMaWtlKGl0ZXJhYmxlKTsgbGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIHtcbiAgICAgICAgcmVzdWx0ID0gY2FsbEZuKGl0ZXJhYmxlW2luZGV4XSk7XG4gICAgICAgIGlmIChyZXN1bHQgJiYgaXNQcm90b3R5cGVPZihSZXN1bHRQcm90b3R5cGUsIHJlc3VsdCkpIHJldHVybiByZXN1bHQ7XG4gICAgICB9IHJldHVybiBuZXcgUmVzdWx0KGZhbHNlKTtcbiAgICB9XG4gICAgaXRlcmF0b3IgPSBnZXRJdGVyYXRvcihpdGVyYWJsZSwgaXRlckZuKTtcbiAgfVxuXG4gIG5leHQgPSBpdGVyYXRvci5uZXh0O1xuICB3aGlsZSAoIShzdGVwID0gY2FsbChuZXh0LCBpdGVyYXRvcikpLmRvbmUpIHtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gY2FsbEZuKHN0ZXAudmFsdWUpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpdGVyYXRvckNsb3NlKGl0ZXJhdG9yLCAndGhyb3cnLCBlcnJvcik7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcmVzdWx0ID09ICdvYmplY3QnICYmIHJlc3VsdCAmJiBpc1Byb3RvdHlwZU9mKFJlc3VsdFByb3RvdHlwZSwgcmVzdWx0KSkgcmV0dXJuIHJlc3VsdDtcbiAgfSByZXR1cm4gbmV3IFJlc3VsdChmYWxzZSk7XG59O1xuIiwidmFyIGNhbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCcpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGdldE1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtbWV0aG9kJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZXJhdG9yLCBraW5kLCB2YWx1ZSkge1xuICB2YXIgaW5uZXJSZXN1bHQsIGlubmVyRXJyb3I7XG4gIGFuT2JqZWN0KGl0ZXJhdG9yKTtcbiAgdHJ5IHtcbiAgICBpbm5lclJlc3VsdCA9IGdldE1ldGhvZChpdGVyYXRvciwgJ3JldHVybicpO1xuICAgIGlmICghaW5uZXJSZXN1bHQpIHtcbiAgICAgIGlmIChraW5kID09PSAndGhyb3cnKSB0aHJvdyB2YWx1ZTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgaW5uZXJSZXN1bHQgPSBjYWxsKGlubmVyUmVzdWx0LCBpdGVyYXRvcik7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaW5uZXJFcnJvciA9IHRydWU7XG4gICAgaW5uZXJSZXN1bHQgPSBlcnJvcjtcbiAgfVxuICBpZiAoa2luZCA9PT0gJ3Rocm93JykgdGhyb3cgdmFsdWU7XG4gIGlmIChpbm5lckVycm9yKSB0aHJvdyBpbm5lclJlc3VsdDtcbiAgYW5PYmplY3QoaW5uZXJSZXN1bHQpO1xuICByZXR1cm4gdmFsdWU7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtY3JlYXRlJyk7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZScpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xuXG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG52YXIgQlVHR1lfU0FGQVJJX0lURVJBVE9SUyA9IGZhbHNlO1xuXG4vLyBgJUl0ZXJhdG9yUHJvdG90eXBlJWAgb2JqZWN0XG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLSVpdGVyYXRvcnByb3RvdHlwZSUtb2JqZWN0XG52YXIgSXRlcmF0b3JQcm90b3R5cGUsIFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZSwgYXJyYXlJdGVyYXRvcjtcblxuLyogZXNsaW50LWRpc2FibGUgZXMvbm8tYXJyYXktcHJvdG90eXBlLWtleXMgLS0gc2FmZSAqL1xuaWYgKFtdLmtleXMpIHtcbiAgYXJyYXlJdGVyYXRvciA9IFtdLmtleXMoKTtcbiAgLy8gU2FmYXJpIDggaGFzIGJ1Z2d5IGl0ZXJhdG9ycyB3L28gYG5leHRgXG4gIGlmICghKCduZXh0JyBpbiBhcnJheUl0ZXJhdG9yKSkgQlVHR1lfU0FGQVJJX0lURVJBVE9SUyA9IHRydWU7XG4gIGVsc2Uge1xuICAgIFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKGdldFByb3RvdHlwZU9mKGFycmF5SXRlcmF0b3IpKTtcbiAgICBpZiAoUHJvdG90eXBlT2ZBcnJheUl0ZXJhdG9yUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlKSBJdGVyYXRvclByb3RvdHlwZSA9IFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZTtcbiAgfVxufVxuXG52YXIgTkVXX0lURVJBVE9SX1BST1RPVFlQRSA9IEl0ZXJhdG9yUHJvdG90eXBlID09IHVuZGVmaW5lZCB8fCBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHZhciB0ZXN0ID0ge307XG4gIC8vIEZGNDQtIGxlZ2FjeSBpdGVyYXRvcnMgY2FzZVxuICByZXR1cm4gSXRlcmF0b3JQcm90b3R5cGVbSVRFUkFUT1JdLmNhbGwodGVzdCkgIT09IHRlc3Q7XG59KTtcblxuaWYgKE5FV19JVEVSQVRPUl9QUk9UT1RZUEUpIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG5lbHNlIGlmIChJU19QVVJFKSBJdGVyYXRvclByb3RvdHlwZSA9IGNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSk7XG5cbi8vIGAlSXRlcmF0b3JQcm90b3R5cGUlW0BAaXRlcmF0b3JdKClgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy0laXRlcmF0b3Jwcm90b3R5cGUlLUBAaXRlcmF0b3JcbmlmICghaXNDYWxsYWJsZShJdGVyYXRvclByb3RvdHlwZVtJVEVSQVRPUl0pKSB7XG4gIHJlZGVmaW5lKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIEl0ZXJhdG9yUHJvdG90eXBlOiBJdGVyYXRvclByb3RvdHlwZSxcbiAgQlVHR1lfU0FGQVJJX0lURVJBVE9SUzogQlVHR1lfU0FGQVJJX0lURVJBVE9SU1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0ge307XG4iLCJ2YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoJyk7XG5cbi8vIGBMZW5ndGhPZkFycmF5TGlrZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWxlbmd0aG9mYXJyYXlsaWtlXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIHRvTGVuZ3RoKG9iai5sZW5ndGgpO1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgYmluZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcicpLmY7XG52YXIgbWFjcm90YXNrID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3Rhc2snKS5zZXQ7XG52YXIgSVNfSU9TID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS1pcy1pb3MnKTtcbnZhciBJU19JT1NfUEVCQkxFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS1pcy1pb3MtcGViYmxlJyk7XG52YXIgSVNfV0VCT1NfV0VCS0lUID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS1pcy13ZWJvcy13ZWJraXQnKTtcbnZhciBJU19OT0RFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS1pcy1ub2RlJyk7XG5cbnZhciBNdXRhdGlvbk9ic2VydmVyID0gZ2xvYmFsLk11dGF0aW9uT2JzZXJ2ZXIgfHwgZ2xvYmFsLldlYktpdE11dGF0aW9uT2JzZXJ2ZXI7XG52YXIgZG9jdW1lbnQgPSBnbG9iYWwuZG9jdW1lbnQ7XG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyIFByb21pc2UgPSBnbG9iYWwuUHJvbWlzZTtcbi8vIE5vZGUuanMgMTEgc2hvd3MgRXhwZXJpbWVudGFsV2FybmluZyBvbiBnZXR0aW5nIGBxdWV1ZU1pY3JvdGFza2BcbnZhciBxdWV1ZU1pY3JvdGFza0Rlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZ2xvYmFsLCAncXVldWVNaWNyb3Rhc2snKTtcbnZhciBxdWV1ZU1pY3JvdGFzayA9IHF1ZXVlTWljcm90YXNrRGVzY3JpcHRvciAmJiBxdWV1ZU1pY3JvdGFza0Rlc2NyaXB0b3IudmFsdWU7XG5cbnZhciBmbHVzaCwgaGVhZCwgbGFzdCwgbm90aWZ5LCB0b2dnbGUsIG5vZGUsIHByb21pc2UsIHRoZW47XG5cbi8vIG1vZGVybiBlbmdpbmVzIGhhdmUgcXVldWVNaWNyb3Rhc2sgbWV0aG9kXG5pZiAoIXF1ZXVlTWljcm90YXNrKSB7XG4gIGZsdXNoID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBwYXJlbnQsIGZuO1xuICAgIGlmIChJU19OT0RFICYmIChwYXJlbnQgPSBwcm9jZXNzLmRvbWFpbikpIHBhcmVudC5leGl0KCk7XG4gICAgd2hpbGUgKGhlYWQpIHtcbiAgICAgIGZuID0gaGVhZC5mbjtcbiAgICAgIGhlYWQgPSBoZWFkLm5leHQ7XG4gICAgICB0cnkge1xuICAgICAgICBmbigpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGhlYWQpIG5vdGlmeSgpO1xuICAgICAgICBlbHNlIGxhc3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH0gbGFzdCA9IHVuZGVmaW5lZDtcbiAgICBpZiAocGFyZW50KSBwYXJlbnQuZW50ZXIoKTtcbiAgfTtcblxuICAvLyBicm93c2VycyB3aXRoIE11dGF0aW9uT2JzZXJ2ZXIsIGV4Y2VwdCBpT1MgLSBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvMzM5XG4gIC8vIGFsc28gZXhjZXB0IFdlYk9TIFdlYmtpdCBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvODk4XG4gIGlmICghSVNfSU9TICYmICFJU19OT0RFICYmICFJU19XRUJPU19XRUJLSVQgJiYgTXV0YXRpb25PYnNlcnZlciAmJiBkb2N1bWVudCkge1xuICAgIHRvZ2dsZSA9IHRydWU7XG4gICAgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKTtcbiAgICBuZXcgTXV0YXRpb25PYnNlcnZlcihmbHVzaCkub2JzZXJ2ZShub2RlLCB7IGNoYXJhY3RlckRhdGE6IHRydWUgfSk7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgbm9kZS5kYXRhID0gdG9nZ2xlID0gIXRvZ2dsZTtcbiAgICB9O1xuICAvLyBlbnZpcm9ubWVudHMgd2l0aCBtYXliZSBub24tY29tcGxldGVseSBjb3JyZWN0LCBidXQgZXhpc3RlbnQgUHJvbWlzZVxuICB9IGVsc2UgaWYgKCFJU19JT1NfUEVCQkxFICYmIFByb21pc2UgJiYgUHJvbWlzZS5yZXNvbHZlKSB7XG4gICAgLy8gUHJvbWlzZS5yZXNvbHZlIHdpdGhvdXQgYW4gYXJndW1lbnQgdGhyb3dzIGFuIGVycm9yIGluIExHIFdlYk9TIDJcbiAgICBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgLy8gd29ya2Fyb3VuZCBvZiBXZWJLaXQgfiBpT1MgU2FmYXJpIDEwLjEgYnVnXG4gICAgcHJvbWlzZS5jb25zdHJ1Y3RvciA9IFByb21pc2U7XG4gICAgdGhlbiA9IGJpbmQocHJvbWlzZS50aGVuLCBwcm9taXNlKTtcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGVuKGZsdXNoKTtcbiAgICB9O1xuICAvLyBOb2RlLmpzIHdpdGhvdXQgcHJvbWlzZXNcbiAgfSBlbHNlIGlmIChJU19OT0RFKSB7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhmbHVzaCk7XG4gICAgfTtcbiAgLy8gZm9yIG90aGVyIGVudmlyb25tZW50cyAtIG1hY3JvdGFzayBiYXNlZCBvbjpcbiAgLy8gLSBzZXRJbW1lZGlhdGVcbiAgLy8gLSBNZXNzYWdlQ2hhbm5lbFxuICAvLyAtIHdpbmRvdy5wb3N0TWVzc2FnXG4gIC8vIC0gb25yZWFkeXN0YXRlY2hhbmdlXG4gIC8vIC0gc2V0VGltZW91dFxuICB9IGVsc2Uge1xuICAgIC8vIHN0cmFuZ2UgSUUgKyB3ZWJwYWNrIGRldiBzZXJ2ZXIgYnVnIC0gdXNlIC5iaW5kKGdsb2JhbClcbiAgICBtYWNyb3Rhc2sgPSBiaW5kKG1hY3JvdGFzaywgZ2xvYmFsKTtcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBtYWNyb3Rhc2soZmx1c2gpO1xuICAgIH07XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBxdWV1ZU1pY3JvdGFzayB8fCBmdW5jdGlvbiAoZm4pIHtcbiAgdmFyIHRhc2sgPSB7IGZuOiBmbiwgbmV4dDogdW5kZWZpbmVkIH07XG4gIGlmIChsYXN0KSBsYXN0Lm5leHQgPSB0YXNrO1xuICBpZiAoIWhlYWQpIHtcbiAgICBoZWFkID0gdGFzaztcbiAgICBub3RpZnkoKTtcbiAgfSBsYXN0ID0gdGFzaztcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdsb2JhbC5Qcm9taXNlO1xuIiwiLyogZXNsaW50LWRpc2FibGUgZXMvbm8tc3ltYm9sIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nICovXG52YXIgVjhfVkVSU0lPTiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtdjgtdmVyc2lvbicpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlzeW1ib2xzIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG5tb2R1bGUuZXhwb3J0cyA9ICEhT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyAmJiAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICB2YXIgc3ltYm9sID0gU3ltYm9sKCk7XG4gIC8vIENocm9tZSAzOCBTeW1ib2wgaGFzIGluY29ycmVjdCB0b1N0cmluZyBjb252ZXJzaW9uXG4gIC8vIGBnZXQtb3duLXByb3BlcnR5LXN5bWJvbHNgIHBvbHlmaWxsIHN5bWJvbHMgY29udmVydGVkIHRvIG9iamVjdCBhcmUgbm90IFN5bWJvbCBpbnN0YW5jZXNcbiAgcmV0dXJuICFTdHJpbmcoc3ltYm9sKSB8fCAhKE9iamVjdChzeW1ib2wpIGluc3RhbmNlb2YgU3ltYm9sKSB8fFxuICAgIC8vIENocm9tZSAzOC00MCBzeW1ib2xzIGFyZSBub3QgaW5oZXJpdGVkIGZyb20gRE9NIGNvbGxlY3Rpb25zIHByb3RvdHlwZXMgdG8gaW5zdGFuY2VzXG4gICAgIVN5bWJvbC5zaGFtICYmIFY4X1ZFUlNJT04gJiYgVjhfVkVSU0lPTiA8IDQxO1xufSk7XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciBpbnNwZWN0U291cmNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luc3BlY3Qtc291cmNlJyk7XG5cbnZhciBXZWFrTWFwID0gZ2xvYmFsLldlYWtNYXA7XG5cbm1vZHVsZS5leHBvcnRzID0gaXNDYWxsYWJsZShXZWFrTWFwKSAmJiAvbmF0aXZlIGNvZGUvLnRlc3QoaW5zcGVjdFNvdXJjZShXZWFrTWFwKSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgYUNhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtY2FsbGFibGUnKTtcblxudmFyIFByb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKEMpIHtcbiAgdmFyIHJlc29sdmUsIHJlamVjdDtcbiAgdGhpcy5wcm9taXNlID0gbmV3IEMoZnVuY3Rpb24gKCQkcmVzb2x2ZSwgJCRyZWplY3QpIHtcbiAgICBpZiAocmVzb2x2ZSAhPT0gdW5kZWZpbmVkIHx8IHJlamVjdCAhPT0gdW5kZWZpbmVkKSB0aHJvdyBUeXBlRXJyb3IoJ0JhZCBQcm9taXNlIGNvbnN0cnVjdG9yJyk7XG4gICAgcmVzb2x2ZSA9ICQkcmVzb2x2ZTtcbiAgICByZWplY3QgPSAkJHJlamVjdDtcbiAgfSk7XG4gIHRoaXMucmVzb2x2ZSA9IGFDYWxsYWJsZShyZXNvbHZlKTtcbiAgdGhpcy5yZWplY3QgPSBhQ2FsbGFibGUocmVqZWN0KTtcbn07XG5cbi8vIGBOZXdQcm9taXNlQ2FwYWJpbGl0eWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW5ld3Byb21pc2VjYXBhYmlsaXR5XG5tb2R1bGUuZXhwb3J0cy5mID0gZnVuY3Rpb24gKEMpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlQ2FwYWJpbGl0eShDKTtcbn07XG4iLCJ2YXIgdG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tc3RyaW5nJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50LCAkZGVmYXVsdCkge1xuICByZXR1cm4gYXJndW1lbnQgPT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50cy5sZW5ndGggPCAyID8gJycgOiAkZGVmYXVsdCA6IHRvU3RyaW5nKGFyZ3VtZW50KTtcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgdG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tc3RyaW5nJyk7XG52YXIgdHJpbSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zdHJpbmctdHJpbScpLnRyaW07XG52YXIgd2hpdGVzcGFjZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2hpdGVzcGFjZXMnKTtcblxudmFyIGNoYXJBdCA9IHVuY3VycnlUaGlzKCcnLmNoYXJBdCk7XG52YXIgbiRQYXJzZUZsb2F0ID0gZ2xvYmFsLnBhcnNlRmxvYXQ7XG52YXIgU3ltYm9sID0gZ2xvYmFsLlN5bWJvbDtcbnZhciBJVEVSQVRPUiA9IFN5bWJvbCAmJiBTeW1ib2wuaXRlcmF0b3I7XG52YXIgRk9SQ0VEID0gMSAvIG4kUGFyc2VGbG9hdCh3aGl0ZXNwYWNlcyArICctMCcpICE9PSAtSW5maW5pdHlcbiAgLy8gTVMgRWRnZSAxOC0gYnJva2VuIHdpdGggYm94ZWQgc3ltYm9sc1xuICB8fCAoSVRFUkFUT1IgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHsgbiRQYXJzZUZsb2F0KE9iamVjdChJVEVSQVRPUikpOyB9KSk7XG5cbi8vIGBwYXJzZUZsb2F0YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcGFyc2VmbG9hdC1zdHJpbmdcbm1vZHVsZS5leHBvcnRzID0gRk9SQ0VEID8gZnVuY3Rpb24gcGFyc2VGbG9hdChzdHJpbmcpIHtcbiAgdmFyIHRyaW1tZWRTdHJpbmcgPSB0cmltKHRvU3RyaW5nKHN0cmluZykpO1xuICB2YXIgcmVzdWx0ID0gbiRQYXJzZUZsb2F0KHRyaW1tZWRTdHJpbmcpO1xuICByZXR1cm4gcmVzdWx0ID09PSAwICYmIGNoYXJBdCh0cmltbWVkU3RyaW5nLCAwKSA9PSAnLScgPyAtMCA6IHJlc3VsdDtcbn0gOiBuJFBhcnNlRmxvYXQ7XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgdG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tc3RyaW5nJyk7XG52YXIgdHJpbSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zdHJpbmctdHJpbScpLnRyaW07XG52YXIgd2hpdGVzcGFjZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2hpdGVzcGFjZXMnKTtcblxudmFyICRwYXJzZUludCA9IGdsb2JhbC5wYXJzZUludDtcbnZhciBTeW1ib2wgPSBnbG9iYWwuU3ltYm9sO1xudmFyIElURVJBVE9SID0gU3ltYm9sICYmIFN5bWJvbC5pdGVyYXRvcjtcbnZhciBoZXggPSAvXlsrLV0/MHgvaTtcbnZhciBleGVjID0gdW5jdXJyeVRoaXMoaGV4LmV4ZWMpO1xudmFyIEZPUkNFRCA9ICRwYXJzZUludCh3aGl0ZXNwYWNlcyArICcwOCcpICE9PSA4IHx8ICRwYXJzZUludCh3aGl0ZXNwYWNlcyArICcweDE2JykgIT09IDIyXG4gIC8vIE1TIEVkZ2UgMTgtIGJyb2tlbiB3aXRoIGJveGVkIHN5bWJvbHNcbiAgfHwgKElURVJBVE9SICYmICFmYWlscyhmdW5jdGlvbiAoKSB7ICRwYXJzZUludChPYmplY3QoSVRFUkFUT1IpKTsgfSkpO1xuXG4vLyBgcGFyc2VJbnRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wYXJzZWludC1zdHJpbmctcmFkaXhcbm1vZHVsZS5leHBvcnRzID0gRk9SQ0VEID8gZnVuY3Rpb24gcGFyc2VJbnQoc3RyaW5nLCByYWRpeCkge1xuICB2YXIgUyA9IHRyaW0odG9TdHJpbmcoc3RyaW5nKSk7XG4gIHJldHVybiAkcGFyc2VJbnQoUywgKHJhZGl4ID4+PiAwKSB8fCAoZXhlYyhoZXgsIFMpID8gMTYgOiAxMCkpO1xufSA6ICRwYXJzZUludDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCcpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgb2JqZWN0S2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qta2V5cycpO1xudmFyIGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1zeW1ib2xzJyk7XG52YXIgcHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXByb3BlcnR5LWlzLWVudW1lcmFibGUnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1vYmplY3QnKTtcbnZhciBJbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luZGV4ZWQtb2JqZWN0Jyk7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtYXNzaWduIC0tIHNhZmVcbnZhciAkYXNzaWduID0gT2JqZWN0LmFzc2lnbjtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbnZhciBjb25jYXQgPSB1bmN1cnJ5VGhpcyhbXS5jb25jYXQpO1xuXG4vLyBgT2JqZWN0LmFzc2lnbmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5hc3NpZ25cbm1vZHVsZS5leHBvcnRzID0gISRhc3NpZ24gfHwgZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBzaG91bGQgaGF2ZSBjb3JyZWN0IG9yZGVyIG9mIG9wZXJhdGlvbnMgKEVkZ2UgYnVnKVxuICBpZiAoREVTQ1JJUFRPUlMgJiYgJGFzc2lnbih7IGI6IDEgfSwgJGFzc2lnbihkZWZpbmVQcm9wZXJ0eSh7fSwgJ2EnLCB7XG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGRlZmluZVByb3BlcnR5KHRoaXMsICdiJywge1xuICAgICAgICB2YWx1ZTogMyxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2VcbiAgICAgIH0pO1xuICAgIH1cbiAgfSksIHsgYjogMiB9KSkuYiAhPT0gMSkgcmV0dXJuIHRydWU7XG4gIC8vIHNob3VsZCB3b3JrIHdpdGggc3ltYm9scyBhbmQgc2hvdWxkIGhhdmUgZGV0ZXJtaW5pc3RpYyBwcm9wZXJ0eSBvcmRlciAoVjggYnVnKVxuICB2YXIgQSA9IHt9O1xuICB2YXIgQiA9IHt9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tc3ltYm9sIC0tIHNhZmVcbiAgdmFyIHN5bWJvbCA9IFN5bWJvbCgpO1xuICB2YXIgYWxwaGFiZXQgPSAnYWJjZGVmZ2hpamtsbW5vcHFyc3QnO1xuICBBW3N5bWJvbF0gPSA3O1xuICBhbHBoYWJldC5zcGxpdCgnJykuZm9yRWFjaChmdW5jdGlvbiAoY2hyKSB7IEJbY2hyXSA9IGNocjsgfSk7XG4gIHJldHVybiAkYXNzaWduKHt9LCBBKVtzeW1ib2xdICE9IDcgfHwgb2JqZWN0S2V5cygkYXNzaWduKHt9LCBCKSkuam9pbignJykgIT0gYWxwaGFiZXQ7XG59KSA/IGZ1bmN0aW9uIGFzc2lnbih0YXJnZXQsIHNvdXJjZSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzIC0tIHJlcXVpcmVkIGZvciBgLmxlbmd0aGBcbiAgdmFyIFQgPSB0b09iamVjdCh0YXJnZXQpO1xuICB2YXIgYXJndW1lbnRzTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgdmFyIGluZGV4ID0gMTtcbiAgdmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZS5mO1xuICB2YXIgcHJvcGVydHlJc0VudW1lcmFibGUgPSBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZS5mO1xuICB3aGlsZSAoYXJndW1lbnRzTGVuZ3RoID4gaW5kZXgpIHtcbiAgICB2YXIgUyA9IEluZGV4ZWRPYmplY3QoYXJndW1lbnRzW2luZGV4KytdKTtcbiAgICB2YXIga2V5cyA9IGdldE93blByb3BlcnR5U3ltYm9scyA/IGNvbmNhdChvYmplY3RLZXlzKFMpLCBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoUykpIDogb2JqZWN0S2V5cyhTKTtcbiAgICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gICAgdmFyIGogPSAwO1xuICAgIHZhciBrZXk7XG4gICAgd2hpbGUgKGxlbmd0aCA+IGopIHtcbiAgICAgIGtleSA9IGtleXNbaisrXTtcbiAgICAgIGlmICghREVTQ1JJUFRPUlMgfHwgY2FsbChwcm9wZXJ0eUlzRW51bWVyYWJsZSwgUywga2V5KSkgVFtrZXldID0gU1trZXldO1xuICAgIH1cbiAgfSByZXR1cm4gVDtcbn0gOiAkYXNzaWduO1xuIiwiLyogZ2xvYmFsIEFjdGl2ZVhPYmplY3QgLS0gb2xkIElFLCBXU0ggKi9cbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBkZWZpbmVQcm9wZXJ0aWVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydGllcycpO1xudmFyIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VudW0tYnVnLWtleXMnKTtcbnZhciBoaWRkZW5LZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGRlbi1rZXlzJyk7XG52YXIgaHRtbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9odG1sJyk7XG52YXIgZG9jdW1lbnRDcmVhdGVFbGVtZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RvY3VtZW50LWNyZWF0ZS1lbGVtZW50Jyk7XG52YXIgc2hhcmVkS2V5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZC1rZXknKTtcblxudmFyIEdUID0gJz4nO1xudmFyIExUID0gJzwnO1xudmFyIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnO1xudmFyIFNDUklQVCA9ICdzY3JpcHQnO1xudmFyIElFX1BST1RPID0gc2hhcmVkS2V5KCdJRV9QUk9UTycpO1xuXG52YXIgRW1wdHlDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfTtcblxudmFyIHNjcmlwdFRhZyA9IGZ1bmN0aW9uIChjb250ZW50KSB7XG4gIHJldHVybiBMVCArIFNDUklQVCArIEdUICsgY29udGVudCArIExUICsgJy8nICsgU0NSSVBUICsgR1Q7XG59O1xuXG4vLyBDcmVhdGUgb2JqZWN0IHdpdGggZmFrZSBgbnVsbGAgcHJvdG90eXBlOiB1c2UgQWN0aXZlWCBPYmplY3Qgd2l0aCBjbGVhcmVkIHByb3RvdHlwZVxudmFyIE51bGxQcm90b09iamVjdFZpYUFjdGl2ZVggPSBmdW5jdGlvbiAoYWN0aXZlWERvY3VtZW50KSB7XG4gIGFjdGl2ZVhEb2N1bWVudC53cml0ZShzY3JpcHRUYWcoJycpKTtcbiAgYWN0aXZlWERvY3VtZW50LmNsb3NlKCk7XG4gIHZhciB0ZW1wID0gYWN0aXZlWERvY3VtZW50LnBhcmVudFdpbmRvdy5PYmplY3Q7XG4gIGFjdGl2ZVhEb2N1bWVudCA9IG51bGw7IC8vIGF2b2lkIG1lbW9yeSBsZWFrXG4gIHJldHVybiB0ZW1wO1xufTtcblxuLy8gQ3JlYXRlIG9iamVjdCB3aXRoIGZha2UgYG51bGxgIHByb3RvdHlwZTogdXNlIGlmcmFtZSBPYmplY3Qgd2l0aCBjbGVhcmVkIHByb3RvdHlwZVxudmFyIE51bGxQcm90b09iamVjdFZpYUlGcmFtZSA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gVGhyYXNoLCB3YXN0ZSBhbmQgc29kb215OiBJRSBHQyBidWdcbiAgdmFyIGlmcmFtZSA9IGRvY3VtZW50Q3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7XG4gIHZhciBKUyA9ICdqYXZhJyArIFNDUklQVCArICc6JztcbiAgdmFyIGlmcmFtZURvY3VtZW50O1xuICBpZnJhbWUuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgaHRtbC5hcHBlbmRDaGlsZChpZnJhbWUpO1xuICAvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvNDc1XG4gIGlmcmFtZS5zcmMgPSBTdHJpbmcoSlMpO1xuICBpZnJhbWVEb2N1bWVudCA9IGlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50O1xuICBpZnJhbWVEb2N1bWVudC5vcGVuKCk7XG4gIGlmcmFtZURvY3VtZW50LndyaXRlKHNjcmlwdFRhZygnZG9jdW1lbnQuRj1PYmplY3QnKSk7XG4gIGlmcmFtZURvY3VtZW50LmNsb3NlKCk7XG4gIHJldHVybiBpZnJhbWVEb2N1bWVudC5GO1xufTtcblxuLy8gQ2hlY2sgZm9yIGRvY3VtZW50LmRvbWFpbiBhbmQgYWN0aXZlIHggc3VwcG9ydFxuLy8gTm8gbmVlZCB0byB1c2UgYWN0aXZlIHggYXBwcm9hY2ggd2hlbiBkb2N1bWVudC5kb21haW4gaXMgbm90IHNldFxuLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lcy1zaGltcy9lczUtc2hpbS9pc3N1ZXMvMTUwXG4vLyB2YXJpYXRpb24gb2YgaHR0cHM6Ly9naXRodWIuY29tL2tpdGNhbWJyaWRnZS9lczUtc2hpbS9jb21taXQvNGY3MzhhYzA2NjM0NlxuLy8gYXZvaWQgSUUgR0MgYnVnXG52YXIgYWN0aXZlWERvY3VtZW50O1xudmFyIE51bGxQcm90b09iamVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgdHJ5IHtcbiAgICBhY3RpdmVYRG9jdW1lbnQgPSBuZXcgQWN0aXZlWE9iamVjdCgnaHRtbGZpbGUnKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogaWdub3JlICovIH1cbiAgTnVsbFByb3RvT2JqZWN0ID0gdHlwZW9mIGRvY3VtZW50ICE9ICd1bmRlZmluZWQnXG4gICAgPyBkb2N1bWVudC5kb21haW4gJiYgYWN0aXZlWERvY3VtZW50XG4gICAgICA/IE51bGxQcm90b09iamVjdFZpYUFjdGl2ZVgoYWN0aXZlWERvY3VtZW50KSAvLyBvbGQgSUVcbiAgICAgIDogTnVsbFByb3RvT2JqZWN0VmlhSUZyYW1lKClcbiAgICA6IE51bGxQcm90b09iamVjdFZpYUFjdGl2ZVgoYWN0aXZlWERvY3VtZW50KTsgLy8gV1NIXG4gIHZhciBsZW5ndGggPSBlbnVtQnVnS2V5cy5sZW5ndGg7XG4gIHdoaWxlIChsZW5ndGgtLSkgZGVsZXRlIE51bGxQcm90b09iamVjdFtQUk9UT1RZUEVdW2VudW1CdWdLZXlzW2xlbmd0aF1dO1xuICByZXR1cm4gTnVsbFByb3RvT2JqZWN0KCk7XG59O1xuXG5oaWRkZW5LZXlzW0lFX1BST1RPXSA9IHRydWU7XG5cbi8vIGBPYmplY3QuY3JlYXRlYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmNyZWF0ZVxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuY3JlYXRlIHx8IGZ1bmN0aW9uIGNyZWF0ZShPLCBQcm9wZXJ0aWVzKSB7XG4gIHZhciByZXN1bHQ7XG4gIGlmIChPICE9PSBudWxsKSB7XG4gICAgRW1wdHlDb25zdHJ1Y3RvcltQUk9UT1RZUEVdID0gYW5PYmplY3QoTyk7XG4gICAgcmVzdWx0ID0gbmV3IEVtcHR5Q29uc3RydWN0b3IoKTtcbiAgICBFbXB0eUNvbnN0cnVjdG9yW1BST1RPVFlQRV0gPSBudWxsO1xuICAgIC8vIGFkZCBcIl9fcHJvdG9fX1wiIGZvciBPYmplY3QuZ2V0UHJvdG90eXBlT2YgcG9seWZpbGxcbiAgICByZXN1bHRbSUVfUFJPVE9dID0gTztcbiAgfSBlbHNlIHJlc3VsdCA9IE51bGxQcm90b09iamVjdCgpO1xuICByZXR1cm4gUHJvcGVydGllcyA9PT0gdW5kZWZpbmVkID8gcmVzdWx0IDogZGVmaW5lUHJvcGVydGllcyhyZXN1bHQsIFByb3BlcnRpZXMpO1xufTtcbiIsInZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciB0b0luZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QnKTtcbnZhciBvYmplY3RLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1rZXlzJyk7XG5cbi8vIGBPYmplY3QuZGVmaW5lUHJvcGVydGllc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5kZWZpbmVwcm9wZXJ0aWVzXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnRpZXMgLS0gc2FmZVxubW9kdWxlLmV4cG9ydHMgPSBERVNDUklQVE9SUyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzIDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyhPLCBQcm9wZXJ0aWVzKSB7XG4gIGFuT2JqZWN0KE8pO1xuICB2YXIgcHJvcHMgPSB0b0luZGV4ZWRPYmplY3QoUHJvcGVydGllcyk7XG4gIHZhciBrZXlzID0gb2JqZWN0S2V5cyhQcm9wZXJ0aWVzKTtcbiAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIga2V5O1xuICB3aGlsZSAobGVuZ3RoID4gaW5kZXgpIGRlZmluZVByb3BlcnR5TW9kdWxlLmYoTywga2V5ID0ga2V5c1tpbmRleCsrXSwgcHJvcHNba2V5XSk7XG4gIHJldHVybiBPO1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBJRThfRE9NX0RFRklORSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pZTgtZG9tLWRlZmluZScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIHRvUHJvcGVydHlLZXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tcHJvcGVydHkta2V5Jyk7XG5cbnZhciBUeXBlRXJyb3IgPSBnbG9iYWwuVHlwZUVycm9yO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSBzYWZlXG52YXIgJGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuXG4vLyBgT2JqZWN0LmRlZmluZVByb3BlcnR5YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmRlZmluZXByb3BlcnR5XG5leHBvcnRzLmYgPSBERVNDUklQVE9SUyA/ICRkZWZpbmVQcm9wZXJ0eSA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpIHtcbiAgYW5PYmplY3QoTyk7XG4gIFAgPSB0b1Byb3BlcnR5S2V5KFApO1xuICBhbk9iamVjdChBdHRyaWJ1dGVzKTtcbiAgaWYgKElFOF9ET01fREVGSU5FKSB0cnkge1xuICAgIHJldHVybiAkZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgaWYgKCdnZXQnIGluIEF0dHJpYnV0ZXMgfHwgJ3NldCcgaW4gQXR0cmlidXRlcykgdGhyb3cgVHlwZUVycm9yKCdBY2Nlc3NvcnMgbm90IHN1cHBvcnRlZCcpO1xuICBpZiAoJ3ZhbHVlJyBpbiBBdHRyaWJ1dGVzKSBPW1BdID0gQXR0cmlidXRlcy52YWx1ZTtcbiAgcmV0dXJuIE87XG59O1xuIiwidmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgcHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXByb3BlcnR5LWlzLWVudW1lcmFibGUnKTtcbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnZhciB0b0luZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QnKTtcbnZhciB0b1Byb3BlcnR5S2V5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXByb3BlcnR5LWtleScpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG52YXIgSUU4X0RPTV9ERUZJTkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaWU4LWRvbS1kZWZpbmUnKTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3IgLS0gc2FmZVxudmFyICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG4vLyBgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3JcbmV4cG9ydHMuZiA9IERFU0NSSVBUT1JTID8gJGdldE93blByb3BlcnR5RGVzY3JpcHRvciA6IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKSB7XG4gIE8gPSB0b0luZGV4ZWRPYmplY3QoTyk7XG4gIFAgPSB0b1Byb3BlcnR5S2V5KFApO1xuICBpZiAoSUU4X0RPTV9ERUZJTkUpIHRyeSB7XG4gICAgcmV0dXJuICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgaWYgKGhhc093bihPLCBQKSkgcmV0dXJuIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcighY2FsbChwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZS5mLCBPLCBQKSwgT1tQXSk7XG59O1xuIiwiLyogZXNsaW50LWRpc2FibGUgZXMvbm8tb2JqZWN0LWdldG93bnByb3BlcnR5bmFtZXMgLS0gc2FmZSAqL1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTtcbnZhciB0b0luZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QnKTtcbnZhciAkZ2V0T3duUHJvcGVydHlOYW1lcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcycpLmY7XG52YXIgYXJyYXlTbGljZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1zbGljZScpO1xuXG52YXIgd2luZG93TmFtZXMgPSB0eXBlb2Ygd2luZG93ID09ICdvYmplY3QnICYmIHdpbmRvdyAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lc1xuICA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHdpbmRvdykgOiBbXTtcblxudmFyIGdldFdpbmRvd05hbWVzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuICRnZXRPd25Qcm9wZXJ0eU5hbWVzKGl0KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gYXJyYXlTbGljZSh3aW5kb3dOYW1lcyk7XG4gIH1cbn07XG5cbi8vIGZhbGxiYWNrIGZvciBJRTExIGJ1Z2d5IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIHdpdGggaWZyYW1lIGFuZCB3aW5kb3dcbm1vZHVsZS5leHBvcnRzLmYgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKGl0KSB7XG4gIHJldHVybiB3aW5kb3dOYW1lcyAmJiBjbGFzc29mKGl0KSA9PSAnV2luZG93J1xuICAgID8gZ2V0V2luZG93TmFtZXMoaXQpXG4gICAgOiAkZ2V0T3duUHJvcGVydHlOYW1lcyh0b0luZGV4ZWRPYmplY3QoaXQpKTtcbn07XG4iLCJ2YXIgaW50ZXJuYWxPYmplY3RLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1rZXlzLWludGVybmFsJyk7XG52YXIgZW51bUJ1Z0tleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW51bS1idWcta2V5cycpO1xuXG52YXIgaGlkZGVuS2V5cyA9IGVudW1CdWdLZXlzLmNvbmNhdCgnbGVuZ3RoJywgJ3Byb3RvdHlwZScpO1xuXG4vLyBgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuZ2V0b3ducHJvcGVydHluYW1lc1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eW5hbWVzIC0tIHNhZmVcbmV4cG9ydHMuZiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIHx8IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoTykge1xuICByZXR1cm4gaW50ZXJuYWxPYmplY3RLZXlzKE8sIGhpZGRlbktleXMpO1xufTtcbiIsIi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlzeW1ib2xzIC0tIHNhZmVcbmV4cG9ydHMuZiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xudmFyIHNoYXJlZEtleSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQta2V5Jyk7XG52YXIgQ09SUkVDVF9QUk9UT1RZUEVfR0VUVEVSID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvcnJlY3QtcHJvdG90eXBlLWdldHRlcicpO1xuXG52YXIgSUVfUFJPVE8gPSBzaGFyZWRLZXkoJ0lFX1BST1RPJyk7XG52YXIgT2JqZWN0ID0gZ2xvYmFsLk9iamVjdDtcbnZhciBPYmplY3RQcm90b3R5cGUgPSBPYmplY3QucHJvdG90eXBlO1xuXG4vLyBgT2JqZWN0LmdldFByb3RvdHlwZU9mYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmdldHByb3RvdHlwZW9mXG5tb2R1bGUuZXhwb3J0cyA9IENPUlJFQ1RfUFJPVE9UWVBFX0dFVFRFUiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIChPKSB7XG4gIHZhciBvYmplY3QgPSB0b09iamVjdChPKTtcbiAgaWYgKGhhc093bihvYmplY3QsIElFX1BST1RPKSkgcmV0dXJuIG9iamVjdFtJRV9QUk9UT107XG4gIHZhciBjb25zdHJ1Y3RvciA9IG9iamVjdC5jb25zdHJ1Y3RvcjtcbiAgaWYgKGlzQ2FsbGFibGUoY29uc3RydWN0b3IpICYmIG9iamVjdCBpbnN0YW5jZW9mIGNvbnN0cnVjdG9yKSB7XG4gICAgcmV0dXJuIGNvbnN0cnVjdG9yLnByb3RvdHlwZTtcbiAgfSByZXR1cm4gb2JqZWN0IGluc3RhbmNlb2YgT2JqZWN0ID8gT2JqZWN0UHJvdG90eXBlIDogbnVsbDtcbn07XG4iLCJ2YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gdW5jdXJyeVRoaXMoe30uaXNQcm90b3R5cGVPZik7XG4iLCJ2YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHknKTtcbnZhciB0b0luZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QnKTtcbnZhciBpbmRleE9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWluY2x1ZGVzJykuaW5kZXhPZjtcbnZhciBoaWRkZW5LZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGRlbi1rZXlzJyk7XG5cbnZhciBwdXNoID0gdW5jdXJyeVRoaXMoW10ucHVzaCk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iamVjdCwgbmFtZXMpIHtcbiAgdmFyIE8gPSB0b0luZGV4ZWRPYmplY3Qob2JqZWN0KTtcbiAgdmFyIGkgPSAwO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBrZXk7XG4gIGZvciAoa2V5IGluIE8pICFoYXNPd24oaGlkZGVuS2V5cywga2V5KSAmJiBoYXNPd24oTywga2V5KSAmJiBwdXNoKHJlc3VsdCwga2V5KTtcbiAgLy8gRG9uJ3QgZW51bSBidWcgJiBoaWRkZW4ga2V5c1xuICB3aGlsZSAobmFtZXMubGVuZ3RoID4gaSkgaWYgKGhhc093bihPLCBrZXkgPSBuYW1lc1tpKytdKSkge1xuICAgIH5pbmRleE9mKHJlc3VsdCwga2V5KSB8fCBwdXNoKHJlc3VsdCwga2V5KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcbiIsInZhciBpbnRlcm5hbE9iamVjdEtleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMtaW50ZXJuYWwnKTtcbnZhciBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnVtLWJ1Zy1rZXlzJyk7XG5cbi8vIGBPYmplY3Qua2V5c2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5rZXlzXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWtleXMgLS0gc2FmZVxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiBrZXlzKE8pIHtcbiAgcmV0dXJuIGludGVybmFsT2JqZWN0S2V5cyhPLCBlbnVtQnVnS2V5cyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IHt9LnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3IgLS0gc2FmZVxudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbi8vIE5hc2hvcm4gfiBKREs4IGJ1Z1xudmFyIE5BU0hPUk5fQlVHID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yICYmICEkcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh7IDE6IDIgfSwgMSk7XG5cbi8vIGBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlYCBtZXRob2QgaW1wbGVtZW50YXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eWlzZW51bWVyYWJsZVxuZXhwb3J0cy5mID0gTkFTSE9STl9CVUcgPyBmdW5jdGlvbiBwcm9wZXJ0eUlzRW51bWVyYWJsZShWKSB7XG4gIHZhciBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRoaXMsIFYpO1xuICByZXR1cm4gISFkZXNjcmlwdG9yICYmIGRlc2NyaXB0b3IuZW51bWVyYWJsZTtcbn0gOiAkcHJvcGVydHlJc0VudW1lcmFibGU7XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAtLSBzYWZlICovXG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgYVBvc3NpYmxlUHJvdG90eXBlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtcG9zc2libGUtcHJvdG90eXBlJyk7XG5cbi8vIGBPYmplY3Quc2V0UHJvdG90eXBlT2ZgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3Quc2V0cHJvdG90eXBlb2Zcbi8vIFdvcmtzIHdpdGggX19wcm90b19fIG9ubHkuIE9sZCB2OCBjYW4ndCB3b3JrIHdpdGggbnVsbCBwcm90byBvYmplY3RzLlxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1zZXRwcm90b3R5cGVvZiAtLSBzYWZlXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCAoJ19fcHJvdG9fXycgaW4ge30gPyBmdW5jdGlvbiAoKSB7XG4gIHZhciBDT1JSRUNUX1NFVFRFUiA9IGZhbHNlO1xuICB2YXIgdGVzdCA9IHt9O1xuICB2YXIgc2V0dGVyO1xuICB0cnkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yIC0tIHNhZmVcbiAgICBzZXR0ZXIgPSB1bmN1cnJ5VGhpcyhPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdC5wcm90b3R5cGUsICdfX3Byb3RvX18nKS5zZXQpO1xuICAgIHNldHRlcih0ZXN0LCBbXSk7XG4gICAgQ09SUkVDVF9TRVRURVIgPSB0ZXN0IGluc3RhbmNlb2YgQXJyYXk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgcmV0dXJuIGZ1bmN0aW9uIHNldFByb3RvdHlwZU9mKE8sIHByb3RvKSB7XG4gICAgYW5PYmplY3QoTyk7XG4gICAgYVBvc3NpYmxlUHJvdG90eXBlKHByb3RvKTtcbiAgICBpZiAoQ09SUkVDVF9TRVRURVIpIHNldHRlcihPLCBwcm90byk7XG4gICAgZWxzZSBPLl9fcHJvdG9fXyA9IHByb3RvO1xuICAgIHJldHVybiBPO1xuICB9O1xufSgpIDogdW5kZWZpbmVkKTtcbiIsInZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIG9iamVjdEtleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMnKTtcbnZhciB0b0luZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QnKTtcbnZhciAkcHJvcGVydHlJc0VudW1lcmFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXByb3BlcnR5LWlzLWVudW1lcmFibGUnKS5mO1xuXG52YXIgcHJvcGVydHlJc0VudW1lcmFibGUgPSB1bmN1cnJ5VGhpcygkcHJvcGVydHlJc0VudW1lcmFibGUpO1xudmFyIHB1c2ggPSB1bmN1cnJ5VGhpcyhbXS5wdXNoKTtcblxuLy8gYE9iamVjdC57IGVudHJpZXMsIHZhbHVlcyB9YCBtZXRob2RzIGltcGxlbWVudGF0aW9uXG52YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKFRPX0VOVFJJRVMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChpdCkge1xuICAgIHZhciBPID0gdG9JbmRleGVkT2JqZWN0KGl0KTtcbiAgICB2YXIga2V5cyA9IG9iamVjdEtleXMoTyk7XG4gICAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgdmFyIGtleTtcbiAgICB3aGlsZSAobGVuZ3RoID4gaSkge1xuICAgICAga2V5ID0ga2V5c1tpKytdO1xuICAgICAgaWYgKCFERVNDUklQVE9SUyB8fCBwcm9wZXJ0eUlzRW51bWVyYWJsZShPLCBrZXkpKSB7XG4gICAgICAgIHB1c2gocmVzdWx0LCBUT19FTlRSSUVTID8gW2tleSwgT1trZXldXSA6IE9ba2V5XSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLy8gYE9iamVjdC5lbnRyaWVzYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuZW50cmllc1xuICBlbnRyaWVzOiBjcmVhdGVNZXRob2QodHJ1ZSksXG4gIC8vIGBPYmplY3QudmFsdWVzYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QudmFsdWVzXG4gIHZhbHVlczogY3JlYXRlTWV0aG9kKGZhbHNlKVxufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBUT19TVFJJTkdfVEFHX1NVUFBPUlQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tc3RyaW5nLXRhZy1zdXBwb3J0Jyk7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mJyk7XG5cbi8vIGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYCBtZXRob2QgaW1wbGVtZW50YXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZ1xubW9kdWxlLmV4cG9ydHMgPSBUT19TVFJJTkdfVEFHX1NVUFBPUlQgPyB7fS50b1N0cmluZyA6IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICByZXR1cm4gJ1tvYmplY3QgJyArIGNsYXNzb2YodGhpcykgKyAnXSc7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBjYWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwnKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG5cbnZhciBUeXBlRXJyb3IgPSBnbG9iYWwuVHlwZUVycm9yO1xuXG4vLyBgT3JkaW5hcnlUb1ByaW1pdGl2ZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9yZGluYXJ5dG9wcmltaXRpdmVcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGlucHV0LCBwcmVmKSB7XG4gIHZhciBmbiwgdmFsO1xuICBpZiAocHJlZiA9PT0gJ3N0cmluZycgJiYgaXNDYWxsYWJsZShmbiA9IGlucHV0LnRvU3RyaW5nKSAmJiAhaXNPYmplY3QodmFsID0gY2FsbChmbiwgaW5wdXQpKSkgcmV0dXJuIHZhbDtcbiAgaWYgKGlzQ2FsbGFibGUoZm4gPSBpbnB1dC52YWx1ZU9mKSAmJiAhaXNPYmplY3QodmFsID0gY2FsbChmbiwgaW5wdXQpKSkgcmV0dXJuIHZhbDtcbiAgaWYgKHByZWYgIT09ICdzdHJpbmcnICYmIGlzQ2FsbGFibGUoZm4gPSBpbnB1dC50b1N0cmluZykgJiYgIWlzT2JqZWN0KHZhbCA9IGNhbGwoZm4sIGlucHV0KSkpIHJldHVybiB2YWw7XG4gIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZVwiKTtcbn07XG4iLCJ2YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eU5hbWVzTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzJyk7XG52YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcblxudmFyIGNvbmNhdCA9IHVuY3VycnlUaGlzKFtdLmNvbmNhdCk7XG5cbi8vIGFsbCBvYmplY3Qga2V5cywgaW5jbHVkZXMgbm9uLWVudW1lcmFibGUgYW5kIHN5bWJvbHNcbm1vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJbignUmVmbGVjdCcsICdvd25LZXlzJykgfHwgZnVuY3Rpb24gb3duS2V5cyhpdCkge1xuICB2YXIga2V5cyA9IGdldE93blByb3BlcnR5TmFtZXNNb2R1bGUuZihhbk9iamVjdChpdCkpO1xuICB2YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlLmY7XG4gIHJldHVybiBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPyBjb25jYXQoa2V5cywgZ2V0T3duUHJvcGVydHlTeW1ib2xzKGl0KSkgOiBrZXlzO1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2xvYmFsO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYykge1xuICB0cnkge1xuICAgIHJldHVybiB7IGVycm9yOiBmYWxzZSwgdmFsdWU6IGV4ZWMoKSB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiB7IGVycm9yOiB0cnVlLCB2YWx1ZTogZXJyb3IgfTtcbiAgfVxufTtcbiIsInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uZXctcHJvbWlzZS1jYXBhYmlsaXR5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEMsIHgpIHtcbiAgYW5PYmplY3QoQyk7XG4gIGlmIChpc09iamVjdCh4KSAmJiB4LmNvbnN0cnVjdG9yID09PSBDKSByZXR1cm4geDtcbiAgdmFyIHByb21pc2VDYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkuZihDKTtcbiAgdmFyIHJlc29sdmUgPSBwcm9taXNlQ2FwYWJpbGl0eS5yZXNvbHZlO1xuICByZXNvbHZlKHgpO1xuICByZXR1cm4gcHJvbWlzZUNhcGFiaWxpdHkucHJvbWlzZTtcbn07XG4iLCJ2YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodGFyZ2V0LCBzcmMsIG9wdGlvbnMpIHtcbiAgZm9yICh2YXIga2V5IGluIHNyYykgcmVkZWZpbmUodGFyZ2V0LCBrZXksIHNyY1trZXldLCBvcHRpb25zKTtcbiAgcmV0dXJuIHRhcmdldDtcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciBoYXNPd24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eScpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHknKTtcbnZhciBzZXRHbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWdsb2JhbCcpO1xudmFyIGluc3BlY3RTb3VyY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5zcGVjdC1zb3VyY2UnKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlJyk7XG52YXIgQ09ORklHVVJBQkxFX0ZVTkNUSU9OX05BTUUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tbmFtZScpLkNPTkZJR1VSQUJMRTtcblxudmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldDtcbnZhciBlbmZvcmNlSW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZW5mb3JjZTtcbnZhciBURU1QTEFURSA9IFN0cmluZyhTdHJpbmcpLnNwbGl0KCdTdHJpbmcnKTtcblxuKG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE8sIGtleSwgdmFsdWUsIG9wdGlvbnMpIHtcbiAgdmFyIHVuc2FmZSA9IG9wdGlvbnMgPyAhIW9wdGlvbnMudW5zYWZlIDogZmFsc2U7XG4gIHZhciBzaW1wbGUgPSBvcHRpb25zID8gISFvcHRpb25zLmVudW1lcmFibGUgOiBmYWxzZTtcbiAgdmFyIG5vVGFyZ2V0R2V0ID0gb3B0aW9ucyA/ICEhb3B0aW9ucy5ub1RhcmdldEdldCA6IGZhbHNlO1xuICB2YXIgbmFtZSA9IG9wdGlvbnMgJiYgb3B0aW9ucy5uYW1lICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLm5hbWUgOiBrZXk7XG4gIHZhciBzdGF0ZTtcbiAgaWYgKGlzQ2FsbGFibGUodmFsdWUpKSB7XG4gICAgaWYgKFN0cmluZyhuYW1lKS5zbGljZSgwLCA3KSA9PT0gJ1N5bWJvbCgnKSB7XG4gICAgICBuYW1lID0gJ1snICsgU3RyaW5nKG5hbWUpLnJlcGxhY2UoL15TeW1ib2xcXCgoW14pXSopXFwpLywgJyQxJykgKyAnXSc7XG4gICAgfVxuICAgIGlmICghaGFzT3duKHZhbHVlLCAnbmFtZScpIHx8IChDT05GSUdVUkFCTEVfRlVOQ1RJT05fTkFNRSAmJiB2YWx1ZS5uYW1lICE9PSBuYW1lKSkge1xuICAgICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KHZhbHVlLCAnbmFtZScsIG5hbWUpO1xuICAgIH1cbiAgICBzdGF0ZSA9IGVuZm9yY2VJbnRlcm5hbFN0YXRlKHZhbHVlKTtcbiAgICBpZiAoIXN0YXRlLnNvdXJjZSkge1xuICAgICAgc3RhdGUuc291cmNlID0gVEVNUExBVEUuam9pbih0eXBlb2YgbmFtZSA9PSAnc3RyaW5nJyA/IG5hbWUgOiAnJyk7XG4gICAgfVxuICB9XG4gIGlmIChPID09PSBnbG9iYWwpIHtcbiAgICBpZiAoc2ltcGxlKSBPW2tleV0gPSB2YWx1ZTtcbiAgICBlbHNlIHNldEdsb2JhbChrZXksIHZhbHVlKTtcbiAgICByZXR1cm47XG4gIH0gZWxzZSBpZiAoIXVuc2FmZSkge1xuICAgIGRlbGV0ZSBPW2tleV07XG4gIH0gZWxzZSBpZiAoIW5vVGFyZ2V0R2V0ICYmIE9ba2V5XSkge1xuICAgIHNpbXBsZSA9IHRydWU7XG4gIH1cbiAgaWYgKHNpbXBsZSkgT1trZXldID0gdmFsdWU7XG4gIGVsc2UgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KE8sIGtleSwgdmFsdWUpO1xuLy8gYWRkIGZha2UgRnVuY3Rpb24jdG9TdHJpbmcgZm9yIGNvcnJlY3Qgd29yayB3cmFwcGVkIG1ldGhvZHMgLyBjb25zdHJ1Y3RvcnMgd2l0aCBtZXRob2RzIGxpa2UgTG9EYXNoIGlzTmF0aXZlXG59KShGdW5jdGlvbi5wcm90b3R5cGUsICd0b1N0cmluZycsIGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICByZXR1cm4gaXNDYWxsYWJsZSh0aGlzKSAmJiBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpLnNvdXJjZSB8fCBpbnNwZWN0U291cmNlKHRoaXMpO1xufSk7XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xuXG52YXIgVHlwZUVycm9yID0gZ2xvYmFsLlR5cGVFcnJvcjtcblxuLy8gYFJlcXVpcmVPYmplY3RDb2VyY2libGVgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1yZXF1aXJlb2JqZWN0Y29lcmNpYmxlXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXQgPT0gdW5kZWZpbmVkKSB0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjYWxsIG1ldGhvZCBvbiBcIiArIGl0KTtcbiAgcmV0dXJuIGl0O1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gc2FmZVxudmFyIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gIHRyeSB7XG4gICAgZGVmaW5lUHJvcGVydHkoZ2xvYmFsLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGdsb2JhbFtrZXldID0gdmFsdWU7XG4gIH0gcmV0dXJuIHZhbHVlO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xuXG52YXIgU1BFQ0lFUyA9IHdlbGxLbm93blN5bWJvbCgnc3BlY2llcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDT05TVFJVQ1RPUl9OQU1FKSB7XG4gIHZhciBDb25zdHJ1Y3RvciA9IGdldEJ1aWx0SW4oQ09OU1RSVUNUT1JfTkFNRSk7XG4gIHZhciBkZWZpbmVQcm9wZXJ0eSA9IGRlZmluZVByb3BlcnR5TW9kdWxlLmY7XG5cbiAgaWYgKERFU0NSSVBUT1JTICYmIENvbnN0cnVjdG9yICYmICFDb25zdHJ1Y3RvcltTUEVDSUVTXSkge1xuICAgIGRlZmluZVByb3BlcnR5KENvbnN0cnVjdG9yLCBTUEVDSUVTLCB7XG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH1cbiAgICB9KTtcbiAgfVxufTtcbiIsInZhciBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5JykuZjtcbnZhciBoYXNPd24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eScpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgVE9fU1RSSU5HX1RBRyA9IHdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIFRBRywgU1RBVElDKSB7XG4gIGlmIChpdCAmJiAhaGFzT3duKGl0ID0gU1RBVElDID8gaXQgOiBpdC5wcm90b3R5cGUsIFRPX1NUUklOR19UQUcpKSB7XG4gICAgZGVmaW5lUHJvcGVydHkoaXQsIFRPX1NUUklOR19UQUcsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogVEFHIH0pO1xuICB9XG59O1xuIiwidmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQnKTtcbnZhciB1aWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdWlkJyk7XG5cbnZhciBrZXlzID0gc2hhcmVkKCdrZXlzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuICByZXR1cm4ga2V5c1trZXldIHx8IChrZXlzW2tleV0gPSB1aWQoa2V5KSk7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBzZXRHbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWdsb2JhbCcpO1xuXG52YXIgU0hBUkVEID0gJ19fY29yZS1qc19zaGFyZWRfXyc7XG52YXIgc3RvcmUgPSBnbG9iYWxbU0hBUkVEXSB8fCBzZXRHbG9iYWwoU0hBUkVELCB7fSk7XG5cbm1vZHVsZS5leHBvcnRzID0gc3RvcmU7XG4iLCJ2YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG52YXIgc3RvcmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLXN0b3JlJyk7XG5cbihtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gIHJldHVybiBzdG9yZVtrZXldIHx8IChzdG9yZVtrZXldID0gdmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDoge30pO1xufSkoJ3ZlcnNpb25zJywgW10pLnB1c2goe1xuICB2ZXJzaW9uOiAnMy4xOS4wJyxcbiAgbW9kZTogSVNfUFVSRSA/ICdwdXJlJyA6ICdnbG9iYWwnLFxuICBjb3B5cmlnaHQ6ICfCqSAyMDIxIERlbmlzIFB1c2hrYXJldiAoemxvaXJvY2sucnUpJ1xufSk7XG4iLCJ2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgYUNvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtY29uc3RydWN0b3InKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIFNQRUNJRVMgPSB3ZWxsS25vd25TeW1ib2woJ3NwZWNpZXMnKTtcblxuLy8gYFNwZWNpZXNDb25zdHJ1Y3RvcmAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXNwZWNpZXNjb25zdHJ1Y3RvclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTywgZGVmYXVsdENvbnN0cnVjdG9yKSB7XG4gIHZhciBDID0gYW5PYmplY3QoTykuY29uc3RydWN0b3I7XG4gIHZhciBTO1xuICByZXR1cm4gQyA9PT0gdW5kZWZpbmVkIHx8IChTID0gYW5PYmplY3QoQylbU1BFQ0lFU10pID09IHVuZGVmaW5lZCA/IGRlZmF1bHRDb25zdHJ1Y3RvciA6IGFDb25zdHJ1Y3RvcihTKTtcbn07XG4iLCJ2YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgdG9JbnRlZ2VyT3JJbmZpbml0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5Jyk7XG52YXIgdG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tc3RyaW5nJyk7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcblxudmFyIGNoYXJBdCA9IHVuY3VycnlUaGlzKCcnLmNoYXJBdCk7XG52YXIgY2hhckNvZGVBdCA9IHVuY3VycnlUaGlzKCcnLmNoYXJDb2RlQXQpO1xudmFyIHN0cmluZ1NsaWNlID0gdW5jdXJyeVRoaXMoJycuc2xpY2UpO1xuXG52YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKENPTlZFUlRfVE9fU1RSSU5HKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIHBvcykge1xuICAgIHZhciBTID0gdG9TdHJpbmcocmVxdWlyZU9iamVjdENvZXJjaWJsZSgkdGhpcykpO1xuICAgIHZhciBwb3NpdGlvbiA9IHRvSW50ZWdlck9ySW5maW5pdHkocG9zKTtcbiAgICB2YXIgc2l6ZSA9IFMubGVuZ3RoO1xuICAgIHZhciBmaXJzdCwgc2Vjb25kO1xuICAgIGlmIChwb3NpdGlvbiA8IDAgfHwgcG9zaXRpb24gPj0gc2l6ZSkgcmV0dXJuIENPTlZFUlRfVE9fU1RSSU5HID8gJycgOiB1bmRlZmluZWQ7XG4gICAgZmlyc3QgPSBjaGFyQ29kZUF0KFMsIHBvc2l0aW9uKTtcbiAgICByZXR1cm4gZmlyc3QgPCAweEQ4MDAgfHwgZmlyc3QgPiAweERCRkYgfHwgcG9zaXRpb24gKyAxID09PSBzaXplXG4gICAgICB8fCAoc2Vjb25kID0gY2hhckNvZGVBdChTLCBwb3NpdGlvbiArIDEpKSA8IDB4REMwMCB8fCBzZWNvbmQgPiAweERGRkZcbiAgICAgICAgPyBDT05WRVJUX1RPX1NUUklOR1xuICAgICAgICAgID8gY2hhckF0KFMsIHBvc2l0aW9uKVxuICAgICAgICAgIDogZmlyc3RcbiAgICAgICAgOiBDT05WRVJUX1RPX1NUUklOR1xuICAgICAgICAgID8gc3RyaW5nU2xpY2UoUywgcG9zaXRpb24sIHBvc2l0aW9uICsgMilcbiAgICAgICAgICA6IChmaXJzdCAtIDB4RDgwMCA8PCAxMCkgKyAoc2Vjb25kIC0gMHhEQzAwKSArIDB4MTAwMDA7XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLy8gYFN0cmluZy5wcm90b3R5cGUuY29kZVBvaW50QXRgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuY29kZXBvaW50YXRcbiAgY29kZUF0OiBjcmVhdGVNZXRob2QoZmFsc2UpLFxuICAvLyBgU3RyaW5nLnByb3RvdHlwZS5hdGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXRoaWFzYnluZW5zL1N0cmluZy5wcm90b3R5cGUuYXRcbiAgY2hhckF0OiBjcmVhdGVNZXRob2QodHJ1ZSlcbn07XG4iLCJ2YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcbnZhciB0b1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmcnKTtcbnZhciB3aGl0ZXNwYWNlcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93aGl0ZXNwYWNlcycpO1xuXG52YXIgcmVwbGFjZSA9IHVuY3VycnlUaGlzKCcnLnJlcGxhY2UpO1xudmFyIHdoaXRlc3BhY2UgPSAnWycgKyB3aGl0ZXNwYWNlcyArICddJztcbnZhciBsdHJpbSA9IFJlZ0V4cCgnXicgKyB3aGl0ZXNwYWNlICsgd2hpdGVzcGFjZSArICcqJyk7XG52YXIgcnRyaW0gPSBSZWdFeHAod2hpdGVzcGFjZSArIHdoaXRlc3BhY2UgKyAnKiQnKTtcblxuLy8gYFN0cmluZy5wcm90b3R5cGUueyB0cmltLCB0cmltU3RhcnQsIHRyaW1FbmQsIHRyaW1MZWZ0LCB0cmltUmlnaHQgfWAgbWV0aG9kcyBpbXBsZW1lbnRhdGlvblxudmFyIGNyZWF0ZU1ldGhvZCA9IGZ1bmN0aW9uIChUWVBFKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMpIHtcbiAgICB2YXIgc3RyaW5nID0gdG9TdHJpbmcocmVxdWlyZU9iamVjdENvZXJjaWJsZSgkdGhpcykpO1xuICAgIGlmIChUWVBFICYgMSkgc3RyaW5nID0gcmVwbGFjZShzdHJpbmcsIGx0cmltLCAnJyk7XG4gICAgaWYgKFRZUEUgJiAyKSBzdHJpbmcgPSByZXBsYWNlKHN0cmluZywgcnRyaW0sICcnKTtcbiAgICByZXR1cm4gc3RyaW5nO1xuICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIC8vIGBTdHJpbmcucHJvdG90eXBlLnsgdHJpbUxlZnQsIHRyaW1TdGFydCB9YCBtZXRob2RzXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS50cmltc3RhcnRcbiAgc3RhcnQ6IGNyZWF0ZU1ldGhvZCgxKSxcbiAgLy8gYFN0cmluZy5wcm90b3R5cGUueyB0cmltUmlnaHQsIHRyaW1FbmQgfWAgbWV0aG9kc1xuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUudHJpbWVuZFxuICBlbmQ6IGNyZWF0ZU1ldGhvZCgyKSxcbiAgLy8gYFN0cmluZy5wcm90b3R5cGUudHJpbWAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS50cmltXG4gIHRyaW06IGNyZWF0ZU1ldGhvZCgzKVxufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgYXBwbHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYXBwbHknKTtcbnZhciBiaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtY29udGV4dCcpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciBoYXNPd24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eScpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgaHRtbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9odG1sJyk7XG52YXIgYXJyYXlTbGljZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1zbGljZScpO1xudmFyIGNyZWF0ZUVsZW1lbnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZG9jdW1lbnQtY3JlYXRlLWVsZW1lbnQnKTtcbnZhciBJU19JT1MgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLWlzLWlvcycpO1xudmFyIElTX05PREUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLWlzLW5vZGUnKTtcblxudmFyIHNldCA9IGdsb2JhbC5zZXRJbW1lZGlhdGU7XG52YXIgY2xlYXIgPSBnbG9iYWwuY2xlYXJJbW1lZGlhdGU7XG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyIERpc3BhdGNoID0gZ2xvYmFsLkRpc3BhdGNoO1xudmFyIEZ1bmN0aW9uID0gZ2xvYmFsLkZ1bmN0aW9uO1xudmFyIE1lc3NhZ2VDaGFubmVsID0gZ2xvYmFsLk1lc3NhZ2VDaGFubmVsO1xudmFyIFN0cmluZyA9IGdsb2JhbC5TdHJpbmc7XG52YXIgY291bnRlciA9IDA7XG52YXIgcXVldWUgPSB7fTtcbnZhciBPTlJFQURZU1RBVEVDSEFOR0UgPSAnb25yZWFkeXN0YXRlY2hhbmdlJztcbnZhciBsb2NhdGlvbiwgZGVmZXIsIGNoYW5uZWwsIHBvcnQ7XG5cbnRyeSB7XG4gIC8vIERlbm8gdGhyb3dzIGEgUmVmZXJlbmNlRXJyb3Igb24gYGxvY2F0aW9uYCBhY2Nlc3Mgd2l0aG91dCBgLS1sb2NhdGlvbmAgZmxhZ1xuICBsb2NhdGlvbiA9IGdsb2JhbC5sb2NhdGlvbjtcbn0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cblxudmFyIHJ1biA9IGZ1bmN0aW9uIChpZCkge1xuICBpZiAoaGFzT3duKHF1ZXVlLCBpZCkpIHtcbiAgICB2YXIgZm4gPSBxdWV1ZVtpZF07XG4gICAgZGVsZXRlIHF1ZXVlW2lkXTtcbiAgICBmbigpO1xuICB9XG59O1xuXG52YXIgcnVubmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcnVuKGlkKTtcbiAgfTtcbn07XG5cbnZhciBsaXN0ZW5lciA9IGZ1bmN0aW9uIChldmVudCkge1xuICBydW4oZXZlbnQuZGF0YSk7XG59O1xuXG52YXIgcG9zdCA9IGZ1bmN0aW9uIChpZCkge1xuICAvLyBvbGQgZW5naW5lcyBoYXZlIG5vdCBsb2NhdGlvbi5vcmlnaW5cbiAgZ2xvYmFsLnBvc3RNZXNzYWdlKFN0cmluZyhpZCksIGxvY2F0aW9uLnByb3RvY29sICsgJy8vJyArIGxvY2F0aW9uLmhvc3QpO1xufTtcblxuLy8gTm9kZS5qcyAwLjkrICYgSUUxMCsgaGFzIHNldEltbWVkaWF0ZSwgb3RoZXJ3aXNlOlxuaWYgKCFzZXQgfHwgIWNsZWFyKSB7XG4gIHNldCA9IGZ1bmN0aW9uIHNldEltbWVkaWF0ZShmbikge1xuICAgIHZhciBhcmdzID0gYXJyYXlTbGljZShhcmd1bWVudHMsIDEpO1xuICAgIHF1ZXVlWysrY291bnRlcl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICBhcHBseShpc0NhbGxhYmxlKGZuKSA/IGZuIDogRnVuY3Rpb24oZm4pLCB1bmRlZmluZWQsIGFyZ3MpO1xuICAgIH07XG4gICAgZGVmZXIoY291bnRlcik7XG4gICAgcmV0dXJuIGNvdW50ZXI7XG4gIH07XG4gIGNsZWFyID0gZnVuY3Rpb24gY2xlYXJJbW1lZGlhdGUoaWQpIHtcbiAgICBkZWxldGUgcXVldWVbaWRdO1xuICB9O1xuICAvLyBOb2RlLmpzIDAuOC1cbiAgaWYgKElTX05PREUpIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhydW5uZXIoaWQpKTtcbiAgICB9O1xuICAvLyBTcGhlcmUgKEpTIGdhbWUgZW5naW5lKSBEaXNwYXRjaCBBUElcbiAgfSBlbHNlIGlmIChEaXNwYXRjaCAmJiBEaXNwYXRjaC5ub3cpIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgRGlzcGF0Y2gubm93KHJ1bm5lcihpZCkpO1xuICAgIH07XG4gIC8vIEJyb3dzZXJzIHdpdGggTWVzc2FnZUNoYW5uZWwsIGluY2x1ZGVzIFdlYldvcmtlcnNcbiAgLy8gZXhjZXB0IGlPUyAtIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy82MjRcbiAgfSBlbHNlIGlmIChNZXNzYWdlQ2hhbm5lbCAmJiAhSVNfSU9TKSB7XG4gICAgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuICAgIHBvcnQgPSBjaGFubmVsLnBvcnQyO1xuICAgIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gbGlzdGVuZXI7XG4gICAgZGVmZXIgPSBiaW5kKHBvcnQucG9zdE1lc3NhZ2UsIHBvcnQpO1xuICAvLyBCcm93c2VycyB3aXRoIHBvc3RNZXNzYWdlLCBza2lwIFdlYldvcmtlcnNcbiAgLy8gSUU4IGhhcyBwb3N0TWVzc2FnZSwgYnV0IGl0J3Mgc3luYyAmIHR5cGVvZiBpdHMgcG9zdE1lc3NhZ2UgaXMgJ29iamVjdCdcbiAgfSBlbHNlIGlmIChcbiAgICBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lciAmJlxuICAgIGlzQ2FsbGFibGUoZ2xvYmFsLnBvc3RNZXNzYWdlKSAmJlxuICAgICFnbG9iYWwuaW1wb3J0U2NyaXB0cyAmJlxuICAgIGxvY2F0aW9uICYmIGxvY2F0aW9uLnByb3RvY29sICE9PSAnZmlsZTonICYmXG4gICAgIWZhaWxzKHBvc3QpXG4gICkge1xuICAgIGRlZmVyID0gcG9zdDtcbiAgICBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGxpc3RlbmVyLCBmYWxzZSk7XG4gIC8vIElFOC1cbiAgfSBlbHNlIGlmIChPTlJFQURZU1RBVEVDSEFOR0UgaW4gY3JlYXRlRWxlbWVudCgnc2NyaXB0JykpIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgaHRtbC5hcHBlbmRDaGlsZChjcmVhdGVFbGVtZW50KCdzY3JpcHQnKSlbT05SRUFEWVNUQVRFQ0hBTkdFXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaHRtbC5yZW1vdmVDaGlsZCh0aGlzKTtcbiAgICAgICAgcnVuKGlkKTtcbiAgICAgIH07XG4gICAgfTtcbiAgLy8gUmVzdCBvbGQgYnJvd3NlcnNcbiAgfSBlbHNlIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgc2V0VGltZW91dChydW5uZXIoaWQpLCAwKTtcbiAgICB9O1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzZXQ6IHNldCxcbiAgY2xlYXI6IGNsZWFyXG59O1xuIiwidmFyIHRvSW50ZWdlck9ySW5maW5pdHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW50ZWdlci1vci1pbmZpbml0eScpO1xuXG52YXIgbWF4ID0gTWF0aC5tYXg7XG52YXIgbWluID0gTWF0aC5taW47XG5cbi8vIEhlbHBlciBmb3IgYSBwb3B1bGFyIHJlcGVhdGluZyBjYXNlIG9mIHRoZSBzcGVjOlxuLy8gTGV0IGludGVnZXIgYmUgPyBUb0ludGVnZXIoaW5kZXgpLlxuLy8gSWYgaW50ZWdlciA8IDAsIGxldCByZXN1bHQgYmUgbWF4KChsZW5ndGggKyBpbnRlZ2VyKSwgMCk7IGVsc2UgbGV0IHJlc3VsdCBiZSBtaW4oaW50ZWdlciwgbGVuZ3RoKS5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGluZGV4LCBsZW5ndGgpIHtcbiAgdmFyIGludGVnZXIgPSB0b0ludGVnZXJPckluZmluaXR5KGluZGV4KTtcbiAgcmV0dXJuIGludGVnZXIgPCAwID8gbWF4KGludGVnZXIgKyBsZW5ndGgsIDApIDogbWluKGludGVnZXIsIGxlbmd0aCk7XG59O1xuIiwiLy8gdG9PYmplY3Qgd2l0aCBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIHN0cmluZ3NcbnZhciBJbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luZGV4ZWQtb2JqZWN0Jyk7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIEluZGV4ZWRPYmplY3QocmVxdWlyZU9iamVjdENvZXJjaWJsZShpdCkpO1xufTtcbiIsInZhciBjZWlsID0gTWF0aC5jZWlsO1xudmFyIGZsb29yID0gTWF0aC5mbG9vcjtcblxuLy8gYFRvSW50ZWdlck9ySW5maW5pdHlgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy10b2ludGVnZXJvcmluZmluaXR5XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICB2YXIgbnVtYmVyID0gK2FyZ3VtZW50O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlIC0tIHNhZmVcbiAgcmV0dXJuIG51bWJlciAhPT0gbnVtYmVyIHx8IG51bWJlciA9PT0gMCA/IDAgOiAobnVtYmVyID4gMCA/IGZsb29yIDogY2VpbCkobnVtYmVyKTtcbn07XG4iLCJ2YXIgdG9JbnRlZ2VyT3JJbmZpbml0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5Jyk7XG5cbnZhciBtaW4gPSBNYXRoLm1pbjtcblxuLy8gYFRvTGVuZ3RoYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtdG9sZW5ndGhcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIHJldHVybiBhcmd1bWVudCA+IDAgPyBtaW4odG9JbnRlZ2VyT3JJbmZpbml0eShhcmd1bWVudCksIDB4MUZGRkZGRkZGRkZGRkYpIDogMDsgLy8gMiAqKiA1MyAtIDEgPT0gOTAwNzE5OTI1NDc0MDk5MVxufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcblxudmFyIE9iamVjdCA9IGdsb2JhbC5PYmplY3Q7XG5cbi8vIGBUb09iamVjdGAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXRvb2JqZWN0XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICByZXR1cm4gT2JqZWN0KHJlcXVpcmVPYmplY3RDb2VyY2libGUoYXJndW1lbnQpKTtcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGlzU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXN5bWJvbCcpO1xudmFyIGdldE1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtbWV0aG9kJyk7XG52YXIgb3JkaW5hcnlUb1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vcmRpbmFyeS10by1wcmltaXRpdmUnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIFR5cGVFcnJvciA9IGdsb2JhbC5UeXBlRXJyb3I7XG52YXIgVE9fUFJJTUlUSVZFID0gd2VsbEtub3duU3ltYm9sKCd0b1ByaW1pdGl2ZScpO1xuXG4vLyBgVG9QcmltaXRpdmVgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy10b3ByaW1pdGl2ZVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaW5wdXQsIHByZWYpIHtcbiAgaWYgKCFpc09iamVjdChpbnB1dCkgfHwgaXNTeW1ib2woaW5wdXQpKSByZXR1cm4gaW5wdXQ7XG4gIHZhciBleG90aWNUb1ByaW0gPSBnZXRNZXRob2QoaW5wdXQsIFRPX1BSSU1JVElWRSk7XG4gIHZhciByZXN1bHQ7XG4gIGlmIChleG90aWNUb1ByaW0pIHtcbiAgICBpZiAocHJlZiA9PT0gdW5kZWZpbmVkKSBwcmVmID0gJ2RlZmF1bHQnO1xuICAgIHJlc3VsdCA9IGNhbGwoZXhvdGljVG9QcmltLCBpbnB1dCwgcHJlZik7XG4gICAgaWYgKCFpc09iamVjdChyZXN1bHQpIHx8IGlzU3ltYm9sKHJlc3VsdCkpIHJldHVybiByZXN1bHQ7XG4gICAgdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlXCIpO1xuICB9XG4gIGlmIChwcmVmID09PSB1bmRlZmluZWQpIHByZWYgPSAnbnVtYmVyJztcbiAgcmV0dXJuIG9yZGluYXJ5VG9QcmltaXRpdmUoaW5wdXQsIHByZWYpO1xufTtcbiIsInZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1wcmltaXRpdmUnKTtcbnZhciBpc1N5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1zeW1ib2wnKTtcblxuLy8gYFRvUHJvcGVydHlLZXlgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy10b3Byb3BlcnR5a2V5XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICB2YXIga2V5ID0gdG9QcmltaXRpdmUoYXJndW1lbnQsICdzdHJpbmcnKTtcbiAgcmV0dXJuIGlzU3ltYm9sKGtleSkgPyBrZXkgOiBrZXkgKyAnJztcbn07XG4iLCJ2YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBUT19TVFJJTkdfVEFHID0gd2VsbEtub3duU3ltYm9sKCd0b1N0cmluZ1RhZycpO1xudmFyIHRlc3QgPSB7fTtcblxudGVzdFtUT19TVFJJTkdfVEFHXSA9ICd6JztcblxubW9kdWxlLmV4cG9ydHMgPSBTdHJpbmcodGVzdCkgPT09ICdbb2JqZWN0IHpdJztcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mJyk7XG5cbnZhciBTdHJpbmcgPSBnbG9iYWwuU3RyaW5nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICBpZiAoY2xhc3NvZihhcmd1bWVudCkgPT09ICdTeW1ib2wnKSB0aHJvdyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IGEgU3ltYm9sIHZhbHVlIHRvIGEgc3RyaW5nJyk7XG4gIHJldHVybiBTdHJpbmcoYXJndW1lbnQpO1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG5cbnZhciBTdHJpbmcgPSBnbG9iYWwuU3RyaW5nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICB0cnkge1xuICAgIHJldHVybiBTdHJpbmcoYXJndW1lbnQpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiAnT2JqZWN0JztcbiAgfVxufTtcbiIsInZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcblxudmFyIGlkID0gMDtcbnZhciBwb3N0Zml4ID0gTWF0aC5yYW5kb20oKTtcbnZhciB0b1N0cmluZyA9IHVuY3VycnlUaGlzKDEuMC50b1N0cmluZyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuICByZXR1cm4gJ1N5bWJvbCgnICsgKGtleSA9PT0gdW5kZWZpbmVkID8gJycgOiBrZXkpICsgJylfJyArIHRvU3RyaW5nKCsraWQgKyBwb3N0Zml4LCAzNik7XG59O1xuIiwiLyogZXNsaW50LWRpc2FibGUgZXMvbm8tc3ltYm9sIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nICovXG52YXIgTkFUSVZFX1NZTUJPTCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uYXRpdmUtc3ltYm9sJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gTkFUSVZFX1NZTUJPTFxuICAmJiAhU3ltYm9sLnNoYW1cbiAgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PSAnc3ltYm9sJztcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgc2hhcmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZCcpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3VpZCcpO1xudmFyIE5BVElWRV9TWU1CT0wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmF0aXZlLXN5bWJvbCcpO1xudmFyIFVTRV9TWU1CT0xfQVNfVUlEID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3VzZS1zeW1ib2wtYXMtdWlkJyk7XG5cbnZhciBXZWxsS25vd25TeW1ib2xzU3RvcmUgPSBzaGFyZWQoJ3drcycpO1xudmFyIFN5bWJvbCA9IGdsb2JhbC5TeW1ib2w7XG52YXIgc3ltYm9sRm9yID0gU3ltYm9sICYmIFN5bWJvbFsnZm9yJ107XG52YXIgY3JlYXRlV2VsbEtub3duU3ltYm9sID0gVVNFX1NZTUJPTF9BU19VSUQgPyBTeW1ib2wgOiBTeW1ib2wgJiYgU3ltYm9sLndpdGhvdXRTZXR0ZXIgfHwgdWlkO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIGlmICghaGFzT3duKFdlbGxLbm93blN5bWJvbHNTdG9yZSwgbmFtZSkgfHwgIShOQVRJVkVfU1lNQk9MIHx8IHR5cGVvZiBXZWxsS25vd25TeW1ib2xzU3RvcmVbbmFtZV0gPT0gJ3N0cmluZycpKSB7XG4gICAgdmFyIGRlc2NyaXB0aW9uID0gJ1N5bWJvbC4nICsgbmFtZTtcbiAgICBpZiAoTkFUSVZFX1NZTUJPTCAmJiBoYXNPd24oU3ltYm9sLCBuYW1lKSkge1xuICAgICAgV2VsbEtub3duU3ltYm9sc1N0b3JlW25hbWVdID0gU3ltYm9sW25hbWVdO1xuICAgIH0gZWxzZSBpZiAoVVNFX1NZTUJPTF9BU19VSUQgJiYgc3ltYm9sRm9yKSB7XG4gICAgICBXZWxsS25vd25TeW1ib2xzU3RvcmVbbmFtZV0gPSBzeW1ib2xGb3IoZGVzY3JpcHRpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICBXZWxsS25vd25TeW1ib2xzU3RvcmVbbmFtZV0gPSBjcmVhdGVXZWxsS25vd25TeW1ib2woZGVzY3JpcHRpb24pO1xuICAgIH1cbiAgfSByZXR1cm4gV2VsbEtub3duU3ltYm9sc1N0b3JlW25hbWVdO1xufTtcbiIsIi8vIGEgc3RyaW5nIG9mIGFsbCB2YWxpZCB1bmljb2RlIHdoaXRlc3BhY2VzXG5tb2R1bGUuZXhwb3J0cyA9ICdcXHUwMDA5XFx1MDAwQVxcdTAwMEJcXHUwMDBDXFx1MDAwRFxcdTAwMjBcXHUwMEEwXFx1MTY4MFxcdTIwMDBcXHUyMDAxXFx1MjAwMicgK1xuICAnXFx1MjAwM1xcdTIwMDRcXHUyMDA1XFx1MjAwNlxcdTIwMDdcXHUyMDA4XFx1MjAwOVxcdTIwMEFcXHUyMDJGXFx1MjA1RlxcdTMwMDBcXHUyMDI4XFx1MjAyOVxcdUZFRkYnO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGlzUHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZicpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mJyk7XG52YXIgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YnKTtcbnZhciBjb3B5Q29uc3RydWN0b3JQcm9wZXJ0aWVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvcHktY29uc3RydWN0b3ItcHJvcGVydGllcycpO1xudmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtY3JlYXRlJyk7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eScpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvcicpO1xudmFyIGNsZWFyRXJyb3JTdGFjayA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGVhci1lcnJvci1zdGFjaycpO1xudmFyIGluc3RhbGxFcnJvckNhdXNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luc3RhbGwtZXJyb3ItY2F1c2UnKTtcbnZhciBpdGVyYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUnKTtcbnZhciBub3JtYWxpemVTdHJpbmdBcmd1bWVudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9ub3JtYWxpemUtc3RyaW5nLWFyZ3VtZW50Jyk7XG52YXIgRVJST1JfU1RBQ0tfSU5TVEFMTEFCTEUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXJyb3Itc3RhY2staW5zdGFsbGFibGUnKTtcblxudmFyIEVycm9yID0gZ2xvYmFsLkVycm9yO1xudmFyIHB1c2ggPSBbXS5wdXNoO1xuXG52YXIgJEFnZ3JlZ2F0ZUVycm9yID0gZnVuY3Rpb24gQWdncmVnYXRlRXJyb3IoZXJyb3JzLCBtZXNzYWdlIC8qICwgb3B0aW9ucyAqLykge1xuICB2YXIgdGhhdCA9IGlzUHJvdG90eXBlT2YoQWdncmVnYXRlRXJyb3JQcm90b3R5cGUsIHRoaXMpID8gdGhpcyA6IGNyZWF0ZShBZ2dyZWdhdGVFcnJvclByb3RvdHlwZSk7XG4gIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQ7XG4gIGlmIChzZXRQcm90b3R5cGVPZikge1xuICAgIHRoYXQgPSBzZXRQcm90b3R5cGVPZihuZXcgRXJyb3IodW5kZWZpbmVkKSwgZ2V0UHJvdG90eXBlT2YodGhhdCkpO1xuICB9XG4gIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSh0aGF0LCAnbWVzc2FnZScsIG5vcm1hbGl6ZVN0cmluZ0FyZ3VtZW50KG1lc3NhZ2UsICcnKSk7XG4gIGlmIChFUlJPUl9TVEFDS19JTlNUQUxMQUJMRSkgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KHRoYXQsICdzdGFjaycsIGNsZWFyRXJyb3JTdGFjayh0aGF0LnN0YWNrLCAxKSk7XG4gIGluc3RhbGxFcnJvckNhdXNlKHRoYXQsIG9wdGlvbnMpO1xuICB2YXIgZXJyb3JzQXJyYXkgPSBbXTtcbiAgaXRlcmF0ZShlcnJvcnMsIHB1c2gsIHsgdGhhdDogZXJyb3JzQXJyYXkgfSk7XG4gIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSh0aGF0LCAnZXJyb3JzJywgZXJyb3JzQXJyYXkpO1xuICByZXR1cm4gdGhhdDtcbn07XG5cbmlmIChzZXRQcm90b3R5cGVPZikgc2V0UHJvdG90eXBlT2YoJEFnZ3JlZ2F0ZUVycm9yLCBFcnJvcik7XG5lbHNlIGNvcHlDb25zdHJ1Y3RvclByb3BlcnRpZXMoJEFnZ3JlZ2F0ZUVycm9yLCBFcnJvcik7XG5cbnZhciBBZ2dyZWdhdGVFcnJvclByb3RvdHlwZSA9ICRBZ2dyZWdhdGVFcnJvci5wcm90b3R5cGUgPSBjcmVhdGUoRXJyb3IucHJvdG90eXBlLCB7XG4gIGNvbnN0cnVjdG9yOiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgJEFnZ3JlZ2F0ZUVycm9yKSxcbiAgbWVzc2FnZTogY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDEsICcnKSxcbiAgbmFtZTogY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDEsICdBZ2dyZWdhdGVFcnJvcicpXG59KTtcblxuLy8gYEFnZ3JlZ2F0ZUVycm9yYCBjb25zdHJ1Y3RvclxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hZ2dyZWdhdGUtZXJyb3ItY29uc3RydWN0b3JcbiQoeyBnbG9iYWw6IHRydWUgfSwge1xuICBBZ2dyZWdhdGVFcnJvcjogJEFnZ3JlZ2F0ZUVycm9yXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyICRmaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbicpLmZpbmQ7XG52YXIgYWRkVG9VbnNjb3BhYmxlcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMnKTtcblxudmFyIEZJTkQgPSAnZmluZCc7XG52YXIgU0tJUFNfSE9MRVMgPSB0cnVlO1xuXG4vLyBTaG91bGRuJ3Qgc2tpcCBob2xlc1xuaWYgKEZJTkQgaW4gW10pIEFycmF5KDEpW0ZJTkRdKGZ1bmN0aW9uICgpIHsgU0tJUFNfSE9MRVMgPSBmYWxzZTsgfSk7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUuZmluZGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5maW5kXG4kKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBTS0lQU19IT0xFUyB9LCB7XG4gIGZpbmQ6IGZ1bmN0aW9uIGZpbmQoY2FsbGJhY2tmbiAvKiAsIHRoYXQgPSB1bmRlZmluZWQgKi8pIHtcbiAgICByZXR1cm4gJGZpbmQodGhpcywgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICB9XG59KTtcblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUtQEB1bnNjb3BhYmxlc1xuYWRkVG9VbnNjb3BhYmxlcyhGSU5EKTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGZyb20gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktZnJvbScpO1xudmFyIGNoZWNrQ29ycmVjdG5lc3NPZkl0ZXJhdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jaGVjay1jb3JyZWN0bmVzcy1vZi1pdGVyYXRpb24nKTtcblxudmFyIElOQ09SUkVDVF9JVEVSQVRJT04gPSAhY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uKGZ1bmN0aW9uIChpdGVyYWJsZSkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tYXJyYXktZnJvbSAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICBBcnJheS5mcm9tKGl0ZXJhYmxlKTtcbn0pO1xuXG4vLyBgQXJyYXkuZnJvbWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LmZyb21cbiQoeyB0YXJnZXQ6ICdBcnJheScsIHN0YXQ6IHRydWUsIGZvcmNlZDogSU5DT1JSRUNUX0lURVJBVElPTiB9LCB7XG4gIGZyb206IGZyb21cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIGFkZFRvVW5zY29wYWJsZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycycpO1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKTtcbnZhciBkZWZpbmVJdGVyYXRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtaXRlcmF0b3InKTtcblxudmFyIEFSUkFZX0lURVJBVE9SID0gJ0FycmF5IEl0ZXJhdG9yJztcbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKEFSUkFZX0lURVJBVE9SKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5lbnRyaWVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmVudHJpZXNcbi8vIGBBcnJheS5wcm90b3R5cGUua2V5c2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5rZXlzXG4vLyBgQXJyYXkucHJvdG90eXBlLnZhbHVlc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS52YWx1ZXNcbi8vIGBBcnJheS5wcm90b3R5cGVbQEBpdGVyYXRvcl1gIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUtQEBpdGVyYXRvclxuLy8gYENyZWF0ZUFycmF5SXRlcmF0b3JgIGludGVybmFsIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1jcmVhdGVhcnJheWl0ZXJhdG9yXG5tb2R1bGUuZXhwb3J0cyA9IGRlZmluZUl0ZXJhdG9yKEFycmF5LCAnQXJyYXknLCBmdW5jdGlvbiAoaXRlcmF0ZWQsIGtpbmQpIHtcbiAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7XG4gICAgdHlwZTogQVJSQVlfSVRFUkFUT1IsXG4gICAgdGFyZ2V0OiB0b0luZGV4ZWRPYmplY3QoaXRlcmF0ZWQpLCAvLyB0YXJnZXRcbiAgICBpbmRleDogMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5leHQgaW5kZXhcbiAgICBraW5kOiBraW5kICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGtpbmRcbiAgfSk7XG4vLyBgJUFycmF5SXRlcmF0b3JQcm90b3R5cGUlLm5leHRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy0lYXJyYXlpdGVyYXRvcnByb3RvdHlwZSUubmV4dFxufSwgZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICB2YXIgdGFyZ2V0ID0gc3RhdGUudGFyZ2V0O1xuICB2YXIga2luZCA9IHN0YXRlLmtpbmQ7XG4gIHZhciBpbmRleCA9IHN0YXRlLmluZGV4Kys7XG4gIGlmICghdGFyZ2V0IHx8IGluZGV4ID49IHRhcmdldC5sZW5ndGgpIHtcbiAgICBzdGF0ZS50YXJnZXQgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICB9XG4gIGlmIChraW5kID09ICdrZXlzJykgcmV0dXJuIHsgdmFsdWU6IGluZGV4LCBkb25lOiBmYWxzZSB9O1xuICBpZiAoa2luZCA9PSAndmFsdWVzJykgcmV0dXJuIHsgdmFsdWU6IHRhcmdldFtpbmRleF0sIGRvbmU6IGZhbHNlIH07XG4gIHJldHVybiB7IHZhbHVlOiBbaW5kZXgsIHRhcmdldFtpbmRleF1dLCBkb25lOiBmYWxzZSB9O1xufSwgJ3ZhbHVlcycpO1xuXG4vLyBhcmd1bWVudHNMaXN0W0BAaXRlcmF0b3JdIGlzICVBcnJheVByb3RvX3ZhbHVlcyVcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtY3JlYXRldW5tYXBwZWRhcmd1bWVudHNvYmplY3Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtY3JlYXRlbWFwcGVkYXJndW1lbnRzb2JqZWN0XG5JdGVyYXRvcnMuQXJndW1lbnRzID0gSXRlcmF0b3JzLkFycmF5O1xuXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS1AQHVuc2NvcGFibGVzXG5hZGRUb1Vuc2NvcGFibGVzKCdrZXlzJyk7XG5hZGRUb1Vuc2NvcGFibGVzKCd2YWx1ZXMnKTtcbmFkZFRvVW5zY29wYWJsZXMoJ2VudHJpZXMnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBjb2xsZWN0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvbGxlY3Rpb24nKTtcbnZhciBjb2xsZWN0aW9uU3Ryb25nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvbGxlY3Rpb24tc3Ryb25nJyk7XG5cbi8vIGBNYXBgIGNvbnN0cnVjdG9yXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW1hcC1vYmplY3RzXG5jb2xsZWN0aW9uKCdNYXAnLCBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gTWFwKCkgeyByZXR1cm4gaW5pdCh0aGlzLCBhcmd1bWVudHMubGVuZ3RoID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTsgfTtcbn0sIGNvbGxlY3Rpb25TdHJvbmcpO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgaXNJbnRlZ3JhbE51bWJlciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1pbnRlZ3JhbC1udW1iZXInKTtcblxuLy8gYE51bWJlci5pc0ludGVnZXJgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1udW1iZXIuaXNpbnRlZ2VyXG4kKHsgdGFyZ2V0OiAnTnVtYmVyJywgc3RhdDogdHJ1ZSB9LCB7XG4gIGlzSW50ZWdlcjogaXNJbnRlZ3JhbE51bWJlclxufSk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcblxuLy8gYE51bWJlci5pc05hTmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW51bWJlci5pc25hblxuJCh7IHRhcmdldDogJ051bWJlcicsIHN0YXQ6IHRydWUgfSwge1xuICBpc05hTjogZnVuY3Rpb24gaXNOYU4obnVtYmVyKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZSAtLSBOYU4gY2hlY2tcbiAgICByZXR1cm4gbnVtYmVyICE9IG51bWJlcjtcbiAgfVxufSk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBwYXJzZUZsb2F0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL251bWJlci1wYXJzZS1mbG9hdCcpO1xuXG4vLyBgTnVtYmVyLnBhcnNlRmxvYXRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1udW1iZXIucGFyc2VGbG9hdFxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW51bWJlci1wYXJzZWZsb2F0IC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4kKHsgdGFyZ2V0OiAnTnVtYmVyJywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBOdW1iZXIucGFyc2VGbG9hdCAhPSBwYXJzZUZsb2F0IH0sIHtcbiAgcGFyc2VGbG9hdDogcGFyc2VGbG9hdFxufSk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBwYXJzZUludCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9udW1iZXItcGFyc2UtaW50Jyk7XG5cbi8vIGBOdW1iZXIucGFyc2VJbnRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1udW1iZXIucGFyc2VpbnRcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1udW1iZXItcGFyc2VpbnQgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiQoeyB0YXJnZXQ6ICdOdW1iZXInLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IE51bWJlci5wYXJzZUludCAhPSBwYXJzZUludCB9LCB7XG4gIHBhcnNlSW50OiBwYXJzZUludFxufSk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBhc3NpZ24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWFzc2lnbicpO1xuXG4vLyBgT2JqZWN0LmFzc2lnbmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5hc3NpZ25cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtYXNzaWduIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4kKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBPYmplY3QuYXNzaWduICE9PSBhc3NpZ24gfSwge1xuICBhc3NpZ246IGFzc2lnblxufSk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciAkZW50cmllcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtdG8tYXJyYXknKS5lbnRyaWVzO1xuXG4vLyBgT2JqZWN0LmVudHJpZXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuZW50cmllc1xuJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUgfSwge1xuICBlbnRyaWVzOiBmdW5jdGlvbiBlbnRyaWVzKE8pIHtcbiAgICByZXR1cm4gJGVudHJpZXMoTyk7XG4gIH1cbn0pO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YnKTtcblxuLy8gYE9iamVjdC5zZXRQcm90b3R5cGVPZmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5zZXRwcm90b3R5cGVvZlxuJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUgfSwge1xuICBzZXRQcm90b3R5cGVPZjogc2V0UHJvdG90eXBlT2Zcbn0pO1xuIiwidmFyIFRPX1NUUklOR19UQUdfU1VQUE9SVCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmctdGFnLXN1cHBvcnQnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZScpO1xudmFyIHRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC10by1zdHJpbmcnKTtcblxuLy8gYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nXG5pZiAoIVRPX1NUUklOR19UQUdfU1VQUE9SVCkge1xuICByZWRlZmluZShPYmplY3QucHJvdG90eXBlLCAndG9TdHJpbmcnLCB0b1N0cmluZywgeyB1bnNhZmU6IHRydWUgfSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBjYWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwnKTtcbnZhciBhQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1jYWxsYWJsZScpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcbnZhciBwZXJmb3JtID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3BlcmZvcm0nKTtcbnZhciBpdGVyYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUnKTtcblxuLy8gYFByb21pc2UuYWxsU2V0dGxlZGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXByb21pc2UuYWxsc2V0dGxlZFxuJCh7IHRhcmdldDogJ1Byb21pc2UnLCBzdGF0OiB0cnVlIH0sIHtcbiAgYWxsU2V0dGxlZDogZnVuY3Rpb24gYWxsU2V0dGxlZChpdGVyYWJsZSkge1xuICAgIHZhciBDID0gdGhpcztcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlLmYoQyk7XG4gICAgdmFyIHJlc29sdmUgPSBjYXBhYmlsaXR5LnJlc29sdmU7XG4gICAgdmFyIHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgIHZhciByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBwcm9taXNlUmVzb2x2ZSA9IGFDYWxsYWJsZShDLnJlc29sdmUpO1xuICAgICAgdmFyIHZhbHVlcyA9IFtdO1xuICAgICAgdmFyIGNvdW50ZXIgPSAwO1xuICAgICAgdmFyIHJlbWFpbmluZyA9IDE7XG4gICAgICBpdGVyYXRlKGl0ZXJhYmxlLCBmdW5jdGlvbiAocHJvbWlzZSkge1xuICAgICAgICB2YXIgaW5kZXggPSBjb3VudGVyKys7XG4gICAgICAgIHZhciBhbHJlYWR5Q2FsbGVkID0gZmFsc2U7XG4gICAgICAgIHJlbWFpbmluZysrO1xuICAgICAgICBjYWxsKHByb21pc2VSZXNvbHZlLCBDLCBwcm9taXNlKS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgIGlmIChhbHJlYWR5Q2FsbGVkKSByZXR1cm47XG4gICAgICAgICAgYWxyZWFkeUNhbGxlZCA9IHRydWU7XG4gICAgICAgICAgdmFsdWVzW2luZGV4XSA9IHsgc3RhdHVzOiAnZnVsZmlsbGVkJywgdmFsdWU6IHZhbHVlIH07XG4gICAgICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgICAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICBpZiAoYWxyZWFkeUNhbGxlZCkgcmV0dXJuO1xuICAgICAgICAgIGFscmVhZHlDYWxsZWQgPSB0cnVlO1xuICAgICAgICAgIHZhbHVlc1tpbmRleF0gPSB7IHN0YXR1czogJ3JlamVjdGVkJywgcmVhc29uOiBlcnJvciB9O1xuICAgICAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICB9KTtcbiAgICBpZiAocmVzdWx0LmVycm9yKSByZWplY3QocmVzdWx0LnZhbHVlKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGFDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWNhbGxhYmxlJyk7XG52YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciBjYWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwnKTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uZXctcHJvbWlzZS1jYXBhYmlsaXR5Jyk7XG52YXIgcGVyZm9ybSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wZXJmb3JtJyk7XG52YXIgaXRlcmF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlJyk7XG5cbnZhciBQUk9NSVNFX0FOWV9FUlJPUiA9ICdObyBvbmUgcHJvbWlzZSByZXNvbHZlZCc7XG5cbi8vIGBQcm9taXNlLmFueWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXByb21pc2UuYW55XG4kKHsgdGFyZ2V0OiAnUHJvbWlzZScsIHN0YXQ6IHRydWUgfSwge1xuICBhbnk6IGZ1bmN0aW9uIGFueShpdGVyYWJsZSkge1xuICAgIHZhciBDID0gdGhpcztcbiAgICB2YXIgQWdncmVnYXRlRXJyb3IgPSBnZXRCdWlsdEluKCdBZ2dyZWdhdGVFcnJvcicpO1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUuZihDKTtcbiAgICB2YXIgcmVzb2x2ZSA9IGNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHByb21pc2VSZXNvbHZlID0gYUNhbGxhYmxlKEMucmVzb2x2ZSk7XG4gICAgICB2YXIgZXJyb3JzID0gW107XG4gICAgICB2YXIgY291bnRlciA9IDA7XG4gICAgICB2YXIgcmVtYWluaW5nID0gMTtcbiAgICAgIHZhciBhbHJlYWR5UmVzb2x2ZWQgPSBmYWxzZTtcbiAgICAgIGl0ZXJhdGUoaXRlcmFibGUsIGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGNvdW50ZXIrKztcbiAgICAgICAgdmFyIGFscmVhZHlSZWplY3RlZCA9IGZhbHNlO1xuICAgICAgICByZW1haW5pbmcrKztcbiAgICAgICAgY2FsbChwcm9taXNlUmVzb2x2ZSwgQywgcHJvbWlzZSkudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICBpZiAoYWxyZWFkeVJlamVjdGVkIHx8IGFscmVhZHlSZXNvbHZlZCkgcmV0dXJuO1xuICAgICAgICAgIGFscmVhZHlSZXNvbHZlZCA9IHRydWU7XG4gICAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgICAgIH0sIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgIGlmIChhbHJlYWR5UmVqZWN0ZWQgfHwgYWxyZWFkeVJlc29sdmVkKSByZXR1cm47XG4gICAgICAgICAgYWxyZWFkeVJlamVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICBlcnJvcnNbaW5kZXhdID0gZXJyb3I7XG4gICAgICAgICAgLS1yZW1haW5pbmcgfHwgcmVqZWN0KG5ldyBBZ2dyZWdhdGVFcnJvcihlcnJvcnMsIFBST01JU0VfQU5ZX0VSUk9SKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICAtLXJlbWFpbmluZyB8fCByZWplY3QobmV3IEFnZ3JlZ2F0ZUVycm9yKGVycm9ycywgUFJPTUlTRV9BTllfRVJST1IpKTtcbiAgICB9KTtcbiAgICBpZiAocmVzdWx0LmVycm9yKSByZWplY3QocmVzdWx0LnZhbHVlKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xudmFyIE5hdGl2ZVByb21pc2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmF0aXZlLXByb21pc2UtY29uc3RydWN0b3InKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG52YXIgcHJvbWlzZVJlc29sdmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcHJvbWlzZS1yZXNvbHZlJyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUnKTtcblxuLy8gU2FmYXJpIGJ1ZyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjAwODI5XG52YXIgTk9OX0dFTkVSSUMgPSAhIU5hdGl2ZVByb21pc2UgJiYgZmFpbHMoZnVuY3Rpb24gKCkge1xuICBOYXRpdmVQcm9taXNlLnByb3RvdHlwZVsnZmluYWxseSddLmNhbGwoeyB0aGVuOiBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0gfSwgZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9KTtcbn0pO1xuXG4vLyBgUHJvbWlzZS5wcm90b3R5cGUuZmluYWxseWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXByb21pc2UucHJvdG90eXBlLmZpbmFsbHlcbiQoeyB0YXJnZXQ6ICdQcm9taXNlJywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUsIGZvcmNlZDogTk9OX0dFTkVSSUMgfSwge1xuICAnZmluYWxseSc6IGZ1bmN0aW9uIChvbkZpbmFsbHkpIHtcbiAgICB2YXIgQyA9IHNwZWNpZXNDb25zdHJ1Y3Rvcih0aGlzLCBnZXRCdWlsdEluKCdQcm9taXNlJykpO1xuICAgIHZhciBpc0Z1bmN0aW9uID0gaXNDYWxsYWJsZShvbkZpbmFsbHkpO1xuICAgIHJldHVybiB0aGlzLnRoZW4oXG4gICAgICBpc0Z1bmN0aW9uID8gZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKEMsIG9uRmluYWxseSgpKS50aGVuKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHg7IH0pO1xuICAgICAgfSA6IG9uRmluYWxseSxcbiAgICAgIGlzRnVuY3Rpb24gPyBmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmUoQywgb25GaW5hbGx5KCkpLnRoZW4oZnVuY3Rpb24gKCkgeyB0aHJvdyBlOyB9KTtcbiAgICAgIH0gOiBvbkZpbmFsbHlcbiAgICApO1xuICB9XG59KTtcblxuLy8gbWFrZXMgc3VyZSB0aGF0IG5hdGl2ZSBwcm9taXNlLWJhc2VkIEFQSXMgYFByb21pc2UjZmluYWxseWAgcHJvcGVybHkgd29ya3Mgd2l0aCBwYXRjaGVkIGBQcm9taXNlI3RoZW5gXG5pZiAoIUlTX1BVUkUgJiYgaXNDYWxsYWJsZShOYXRpdmVQcm9taXNlKSkge1xuICB2YXIgbWV0aG9kID0gZ2V0QnVpbHRJbignUHJvbWlzZScpLnByb3RvdHlwZVsnZmluYWxseSddO1xuICBpZiAoTmF0aXZlUHJvbWlzZS5wcm90b3R5cGVbJ2ZpbmFsbHknXSAhPT0gbWV0aG9kKSB7XG4gICAgcmVkZWZpbmUoTmF0aXZlUHJvbWlzZS5wcm90b3R5cGUsICdmaW5hbGx5JywgbWV0aG9kLCB7IHVuc2FmZTogdHJ1ZSB9KTtcbiAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgTmF0aXZlUHJvbWlzZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uYXRpdmUtcHJvbWlzZS1jb25zdHJ1Y3RvcicpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lJyk7XG52YXIgcmVkZWZpbmVBbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUtYWxsJyk7XG52YXIgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YnKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIHNldFNwZWNpZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXNwZWNpZXMnKTtcbnZhciBhQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1jYWxsYWJsZScpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBhbkluc3RhbmNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLWluc3RhbmNlJyk7XG52YXIgaW5zcGVjdFNvdXJjZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnNwZWN0LXNvdXJjZScpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xudmFyIGNoZWNrQ29ycmVjdG5lc3NPZkl0ZXJhdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jaGVjay1jb3JyZWN0bmVzcy1vZi1pdGVyYXRpb24nKTtcbnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3RvcicpO1xudmFyIHRhc2sgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdGFzaycpLnNldDtcbnZhciBtaWNyb3Rhc2sgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbWljcm90YXNrJyk7XG52YXIgcHJvbWlzZVJlc29sdmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcHJvbWlzZS1yZXNvbHZlJyk7XG52YXIgaG9zdFJlcG9ydEVycm9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9ob3N0LXJlcG9ydC1lcnJvcnMnKTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uZXctcHJvbWlzZS1jYXBhYmlsaXR5Jyk7XG52YXIgcGVyZm9ybSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wZXJmb3JtJyk7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZScpO1xudmFyIGlzRm9yY2VkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWZvcmNlZCcpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIElTX0JST1dTRVIgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLWlzLWJyb3dzZXInKTtcbnZhciBJU19OT0RFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS1pcy1ub2RlJyk7XG52YXIgVjhfVkVSU0lPTiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtdjgtdmVyc2lvbicpO1xuXG52YXIgU1BFQ0lFUyA9IHdlbGxLbm93blN5bWJvbCgnc3BlY2llcycpO1xudmFyIFBST01JU0UgPSAnUHJvbWlzZSc7XG5cbnZhciBnZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXQ7XG52YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0O1xudmFyIGdldEludGVybmFsUHJvbWlzZVN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXR0ZXJGb3IoUFJPTUlTRSk7XG52YXIgTmF0aXZlUHJvbWlzZVByb3RvdHlwZSA9IE5hdGl2ZVByb21pc2UgJiYgTmF0aXZlUHJvbWlzZS5wcm90b3R5cGU7XG52YXIgUHJvbWlzZUNvbnN0cnVjdG9yID0gTmF0aXZlUHJvbWlzZTtcbnZhciBQcm9taXNlUHJvdG90eXBlID0gTmF0aXZlUHJvbWlzZVByb3RvdHlwZTtcbnZhciBUeXBlRXJyb3IgPSBnbG9iYWwuVHlwZUVycm9yO1xudmFyIGRvY3VtZW50ID0gZ2xvYmFsLmRvY3VtZW50O1xudmFyIHByb2Nlc3MgPSBnbG9iYWwucHJvY2VzcztcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlLmY7XG52YXIgbmV3R2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHk7XG5cbnZhciBESVNQQVRDSF9FVkVOVCA9ICEhKGRvY3VtZW50ICYmIGRvY3VtZW50LmNyZWF0ZUV2ZW50ICYmIGdsb2JhbC5kaXNwYXRjaEV2ZW50KTtcbnZhciBOQVRJVkVfUkVKRUNUSU9OX0VWRU5UID0gaXNDYWxsYWJsZShnbG9iYWwuUHJvbWlzZVJlamVjdGlvbkV2ZW50KTtcbnZhciBVTkhBTkRMRURfUkVKRUNUSU9OID0gJ3VuaGFuZGxlZHJlamVjdGlvbic7XG52YXIgUkVKRUNUSU9OX0hBTkRMRUQgPSAncmVqZWN0aW9uaGFuZGxlZCc7XG52YXIgUEVORElORyA9IDA7XG52YXIgRlVMRklMTEVEID0gMTtcbnZhciBSRUpFQ1RFRCA9IDI7XG52YXIgSEFORExFRCA9IDE7XG52YXIgVU5IQU5ETEVEID0gMjtcbnZhciBTVUJDTEFTU0lORyA9IGZhbHNlO1xuXG52YXIgSW50ZXJuYWwsIE93blByb21pc2VDYXBhYmlsaXR5LCBQcm9taXNlV3JhcHBlciwgbmF0aXZlVGhlbjtcblxudmFyIEZPUkNFRCA9IGlzRm9yY2VkKFBST01JU0UsIGZ1bmN0aW9uICgpIHtcbiAgdmFyIFBST01JU0VfQ09OU1RSVUNUT1JfU09VUkNFID0gaW5zcGVjdFNvdXJjZShQcm9taXNlQ29uc3RydWN0b3IpO1xuICB2YXIgR0xPQkFMX0NPUkVfSlNfUFJPTUlTRSA9IFBST01JU0VfQ09OU1RSVUNUT1JfU09VUkNFICE9PSBTdHJpbmcoUHJvbWlzZUNvbnN0cnVjdG9yKTtcbiAgLy8gVjggNi42IChOb2RlIDEwIGFuZCBDaHJvbWUgNjYpIGhhdmUgYSBidWcgd2l0aCByZXNvbHZpbmcgY3VzdG9tIHRoZW5hYmxlc1xuICAvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD04MzA1NjVcbiAgLy8gV2UgY2FuJ3QgZGV0ZWN0IGl0IHN5bmNocm9ub3VzbHksIHNvIGp1c3QgY2hlY2sgdmVyc2lvbnNcbiAgaWYgKCFHTE9CQUxfQ09SRV9KU19QUk9NSVNFICYmIFY4X1ZFUlNJT04gPT09IDY2KSByZXR1cm4gdHJ1ZTtcbiAgLy8gV2UgbmVlZCBQcm9taXNlI2ZpbmFsbHkgaW4gdGhlIHB1cmUgdmVyc2lvbiBmb3IgcHJldmVudGluZyBwcm90b3R5cGUgcG9sbHV0aW9uXG4gIGlmIChJU19QVVJFICYmICFQcm9taXNlUHJvdG90eXBlWydmaW5hbGx5J10pIHJldHVybiB0cnVlO1xuICAvLyBXZSBjYW4ndCB1c2UgQEBzcGVjaWVzIGZlYXR1cmUgZGV0ZWN0aW9uIGluIFY4IHNpbmNlIGl0IGNhdXNlc1xuICAvLyBkZW9wdGltaXphdGlvbiBhbmQgcGVyZm9ybWFuY2UgZGVncmFkYXRpb25cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzY3OVxuICBpZiAoVjhfVkVSU0lPTiA+PSA1MSAmJiAvbmF0aXZlIGNvZGUvLnRlc3QoUFJPTUlTRV9DT05TVFJVQ1RPUl9TT1VSQ0UpKSByZXR1cm4gZmFsc2U7XG4gIC8vIERldGVjdCBjb3JyZWN0bmVzcyBvZiBzdWJjbGFzc2luZyB3aXRoIEBAc3BlY2llcyBzdXBwb3J0XG4gIHZhciBwcm9taXNlID0gbmV3IFByb21pc2VDb25zdHJ1Y3RvcihmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKDEpOyB9KTtcbiAgdmFyIEZha2VQcm9taXNlID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgICBleGVjKGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSwgZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9KTtcbiAgfTtcbiAgdmFyIGNvbnN0cnVjdG9yID0gcHJvbWlzZS5jb25zdHJ1Y3RvciA9IHt9O1xuICBjb25zdHJ1Y3RvcltTUEVDSUVTXSA9IEZha2VQcm9taXNlO1xuICBTVUJDTEFTU0lORyA9IHByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0pIGluc3RhbmNlb2YgRmFrZVByb21pc2U7XG4gIGlmICghU1VCQ0xBU1NJTkcpIHJldHVybiB0cnVlO1xuICAvLyBVbmhhbmRsZWQgcmVqZWN0aW9ucyB0cmFja2luZyBzdXBwb3J0LCBOb2RlSlMgUHJvbWlzZSB3aXRob3V0IGl0IGZhaWxzIEBAc3BlY2llcyB0ZXN0XG4gIHJldHVybiAhR0xPQkFMX0NPUkVfSlNfUFJPTUlTRSAmJiBJU19CUk9XU0VSICYmICFOQVRJVkVfUkVKRUNUSU9OX0VWRU5UO1xufSk7XG5cbnZhciBJTkNPUlJFQ1RfSVRFUkFUSU9OID0gRk9SQ0VEIHx8ICFjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24oZnVuY3Rpb24gKGl0ZXJhYmxlKSB7XG4gIFByb21pc2VDb25zdHJ1Y3Rvci5hbGwoaXRlcmFibGUpWydjYXRjaCddKGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSk7XG59KTtcblxuLy8gaGVscGVyc1xudmFyIGlzVGhlbmFibGUgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIHRoZW47XG4gIHJldHVybiBpc09iamVjdChpdCkgJiYgaXNDYWxsYWJsZSh0aGVuID0gaXQudGhlbikgPyB0aGVuIDogZmFsc2U7XG59O1xuXG52YXIgbm90aWZ5ID0gZnVuY3Rpb24gKHN0YXRlLCBpc1JlamVjdCkge1xuICBpZiAoc3RhdGUubm90aWZpZWQpIHJldHVybjtcbiAgc3RhdGUubm90aWZpZWQgPSB0cnVlO1xuICB2YXIgY2hhaW4gPSBzdGF0ZS5yZWFjdGlvbnM7XG4gIG1pY3JvdGFzayhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHZhbHVlID0gc3RhdGUudmFsdWU7XG4gICAgdmFyIG9rID0gc3RhdGUuc3RhdGUgPT0gRlVMRklMTEVEO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgLy8gdmFyaWFibGUgbGVuZ3RoIC0gY2FuJ3QgdXNlIGZvckVhY2hcbiAgICB3aGlsZSAoY2hhaW4ubGVuZ3RoID4gaW5kZXgpIHtcbiAgICAgIHZhciByZWFjdGlvbiA9IGNoYWluW2luZGV4KytdO1xuICAgICAgdmFyIGhhbmRsZXIgPSBvayA/IHJlYWN0aW9uLm9rIDogcmVhY3Rpb24uZmFpbDtcbiAgICAgIHZhciByZXNvbHZlID0gcmVhY3Rpb24ucmVzb2x2ZTtcbiAgICAgIHZhciByZWplY3QgPSByZWFjdGlvbi5yZWplY3Q7XG4gICAgICB2YXIgZG9tYWluID0gcmVhY3Rpb24uZG9tYWluO1xuICAgICAgdmFyIHJlc3VsdCwgdGhlbiwgZXhpdGVkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgICAgICBpZiAoIW9rKSB7XG4gICAgICAgICAgICBpZiAoc3RhdGUucmVqZWN0aW9uID09PSBVTkhBTkRMRUQpIG9uSGFuZGxlVW5oYW5kbGVkKHN0YXRlKTtcbiAgICAgICAgICAgIHN0YXRlLnJlamVjdGlvbiA9IEhBTkRMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChoYW5kbGVyID09PSB0cnVlKSByZXN1bHQgPSB2YWx1ZTtcbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChkb21haW4pIGRvbWFpbi5lbnRlcigpO1xuICAgICAgICAgICAgcmVzdWx0ID0gaGFuZGxlcih2YWx1ZSk7IC8vIGNhbiB0aHJvd1xuICAgICAgICAgICAgaWYgKGRvbWFpbikge1xuICAgICAgICAgICAgICBkb21haW4uZXhpdCgpO1xuICAgICAgICAgICAgICBleGl0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmVzdWx0ID09PSByZWFjdGlvbi5wcm9taXNlKSB7XG4gICAgICAgICAgICByZWplY3QoVHlwZUVycm9yKCdQcm9taXNlLWNoYWluIGN5Y2xlJykpO1xuICAgICAgICAgIH0gZWxzZSBpZiAodGhlbiA9IGlzVGhlbmFibGUocmVzdWx0KSkge1xuICAgICAgICAgICAgY2FsbCh0aGVuLCByZXN1bHQsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSBlbHNlIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgfSBlbHNlIHJlamVjdCh2YWx1ZSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoZG9tYWluICYmICFleGl0ZWQpIGRvbWFpbi5leGl0KCk7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfVxuICAgIHN0YXRlLnJlYWN0aW9ucyA9IFtdO1xuICAgIHN0YXRlLm5vdGlmaWVkID0gZmFsc2U7XG4gICAgaWYgKGlzUmVqZWN0ICYmICFzdGF0ZS5yZWplY3Rpb24pIG9uVW5oYW5kbGVkKHN0YXRlKTtcbiAgfSk7XG59O1xuXG52YXIgZGlzcGF0Y2hFdmVudCA9IGZ1bmN0aW9uIChuYW1lLCBwcm9taXNlLCByZWFzb24pIHtcbiAgdmFyIGV2ZW50LCBoYW5kbGVyO1xuICBpZiAoRElTUEFUQ0hfRVZFTlQpIHtcbiAgICBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVudCcpO1xuICAgIGV2ZW50LnByb21pc2UgPSBwcm9taXNlO1xuICAgIGV2ZW50LnJlYXNvbiA9IHJlYXNvbjtcbiAgICBldmVudC5pbml0RXZlbnQobmFtZSwgZmFsc2UsIHRydWUpO1xuICAgIGdsb2JhbC5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgfSBlbHNlIGV2ZW50ID0geyBwcm9taXNlOiBwcm9taXNlLCByZWFzb246IHJlYXNvbiB9O1xuICBpZiAoIU5BVElWRV9SRUpFQ1RJT05fRVZFTlQgJiYgKGhhbmRsZXIgPSBnbG9iYWxbJ29uJyArIG5hbWVdKSkgaGFuZGxlcihldmVudCk7XG4gIGVsc2UgaWYgKG5hbWUgPT09IFVOSEFORExFRF9SRUpFQ1RJT04pIGhvc3RSZXBvcnRFcnJvcnMoJ1VuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbicsIHJlYXNvbik7XG59O1xuXG52YXIgb25VbmhhbmRsZWQgPSBmdW5jdGlvbiAoc3RhdGUpIHtcbiAgY2FsbCh0YXNrLCBnbG9iYWwsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcHJvbWlzZSA9IHN0YXRlLmZhY2FkZTtcbiAgICB2YXIgdmFsdWUgPSBzdGF0ZS52YWx1ZTtcbiAgICB2YXIgSVNfVU5IQU5ETEVEID0gaXNVbmhhbmRsZWQoc3RhdGUpO1xuICAgIHZhciByZXN1bHQ7XG4gICAgaWYgKElTX1VOSEFORExFRCkge1xuICAgICAgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChJU19OT0RFKSB7XG4gICAgICAgICAgcHJvY2Vzcy5lbWl0KCd1bmhhbmRsZWRSZWplY3Rpb24nLCB2YWx1ZSwgcHJvbWlzZSk7XG4gICAgICAgIH0gZWxzZSBkaXNwYXRjaEV2ZW50KFVOSEFORExFRF9SRUpFQ1RJT04sIHByb21pc2UsIHZhbHVlKTtcbiAgICAgIH0pO1xuICAgICAgLy8gQnJvd3NlcnMgc2hvdWxkIG5vdCB0cmlnZ2VyIGByZWplY3Rpb25IYW5kbGVkYCBldmVudCBpZiBpdCB3YXMgaGFuZGxlZCBoZXJlLCBOb2RlSlMgLSBzaG91bGRcbiAgICAgIHN0YXRlLnJlamVjdGlvbiA9IElTX05PREUgfHwgaXNVbmhhbmRsZWQoc3RhdGUpID8gVU5IQU5ETEVEIDogSEFORExFRDtcbiAgICAgIGlmIChyZXN1bHQuZXJyb3IpIHRocm93IHJlc3VsdC52YWx1ZTtcbiAgICB9XG4gIH0pO1xufTtcblxudmFyIGlzVW5oYW5kbGVkID0gZnVuY3Rpb24gKHN0YXRlKSB7XG4gIHJldHVybiBzdGF0ZS5yZWplY3Rpb24gIT09IEhBTkRMRUQgJiYgIXN0YXRlLnBhcmVudDtcbn07XG5cbnZhciBvbkhhbmRsZVVuaGFuZGxlZCA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICBjYWxsKHRhc2ssIGdsb2JhbCwgZnVuY3Rpb24gKCkge1xuICAgIHZhciBwcm9taXNlID0gc3RhdGUuZmFjYWRlO1xuICAgIGlmIChJU19OT0RFKSB7XG4gICAgICBwcm9jZXNzLmVtaXQoJ3JlamVjdGlvbkhhbmRsZWQnLCBwcm9taXNlKTtcbiAgICB9IGVsc2UgZGlzcGF0Y2hFdmVudChSRUpFQ1RJT05fSEFORExFRCwgcHJvbWlzZSwgc3RhdGUudmFsdWUpO1xuICB9KTtcbn07XG5cbnZhciBiaW5kID0gZnVuY3Rpb24gKGZuLCBzdGF0ZSwgdW53cmFwKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICBmbihzdGF0ZSwgdmFsdWUsIHVud3JhcCk7XG4gIH07XG59O1xuXG52YXIgaW50ZXJuYWxSZWplY3QgPSBmdW5jdGlvbiAoc3RhdGUsIHZhbHVlLCB1bndyYXApIHtcbiAgaWYgKHN0YXRlLmRvbmUpIHJldHVybjtcbiAgc3RhdGUuZG9uZSA9IHRydWU7XG4gIGlmICh1bndyYXApIHN0YXRlID0gdW53cmFwO1xuICBzdGF0ZS52YWx1ZSA9IHZhbHVlO1xuICBzdGF0ZS5zdGF0ZSA9IFJFSkVDVEVEO1xuICBub3RpZnkoc3RhdGUsIHRydWUpO1xufTtcblxudmFyIGludGVybmFsUmVzb2x2ZSA9IGZ1bmN0aW9uIChzdGF0ZSwgdmFsdWUsIHVud3JhcCkge1xuICBpZiAoc3RhdGUuZG9uZSkgcmV0dXJuO1xuICBzdGF0ZS5kb25lID0gdHJ1ZTtcbiAgaWYgKHVud3JhcCkgc3RhdGUgPSB1bndyYXA7XG4gIHRyeSB7XG4gICAgaWYgKHN0YXRlLmZhY2FkZSA9PT0gdmFsdWUpIHRocm93IFR5cGVFcnJvcihcIlByb21pc2UgY2FuJ3QgYmUgcmVzb2x2ZWQgaXRzZWxmXCIpO1xuICAgIHZhciB0aGVuID0gaXNUaGVuYWJsZSh2YWx1ZSk7XG4gICAgaWYgKHRoZW4pIHtcbiAgICAgIG1pY3JvdGFzayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB3cmFwcGVyID0geyBkb25lOiBmYWxzZSB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNhbGwodGhlbiwgdmFsdWUsXG4gICAgICAgICAgICBiaW5kKGludGVybmFsUmVzb2x2ZSwgd3JhcHBlciwgc3RhdGUpLFxuICAgICAgICAgICAgYmluZChpbnRlcm5hbFJlamVjdCwgd3JhcHBlciwgc3RhdGUpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBpbnRlcm5hbFJlamVjdCh3cmFwcGVyLCBlcnJvciwgc3RhdGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUudmFsdWUgPSB2YWx1ZTtcbiAgICAgIHN0YXRlLnN0YXRlID0gRlVMRklMTEVEO1xuICAgICAgbm90aWZ5KHN0YXRlLCBmYWxzZSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGludGVybmFsUmVqZWN0KHsgZG9uZTogZmFsc2UgfSwgZXJyb3IsIHN0YXRlKTtcbiAgfVxufTtcblxuLy8gY29uc3RydWN0b3IgcG9seWZpbGxcbmlmIChGT1JDRUQpIHtcbiAgLy8gMjUuNC4zLjEgUHJvbWlzZShleGVjdXRvcilcbiAgUHJvbWlzZUNvbnN0cnVjdG9yID0gZnVuY3Rpb24gUHJvbWlzZShleGVjdXRvcikge1xuICAgIGFuSW5zdGFuY2UodGhpcywgUHJvbWlzZVByb3RvdHlwZSk7XG4gICAgYUNhbGxhYmxlKGV4ZWN1dG9yKTtcbiAgICBjYWxsKEludGVybmFsLCB0aGlzKTtcbiAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICAgIHRyeSB7XG4gICAgICBleGVjdXRvcihiaW5kKGludGVybmFsUmVzb2x2ZSwgc3RhdGUpLCBiaW5kKGludGVybmFsUmVqZWN0LCBzdGF0ZSkpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpbnRlcm5hbFJlamVjdChzdGF0ZSwgZXJyb3IpO1xuICAgIH1cbiAgfTtcbiAgUHJvbWlzZVByb3RvdHlwZSA9IFByb21pc2VDb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFycyAtLSByZXF1aXJlZCBmb3IgYC5sZW5ndGhgXG4gIEludGVybmFsID0gZnVuY3Rpb24gUHJvbWlzZShleGVjdXRvcikge1xuICAgIHNldEludGVybmFsU3RhdGUodGhpcywge1xuICAgICAgdHlwZTogUFJPTUlTRSxcbiAgICAgIGRvbmU6IGZhbHNlLFxuICAgICAgbm90aWZpZWQ6IGZhbHNlLFxuICAgICAgcGFyZW50OiBmYWxzZSxcbiAgICAgIHJlYWN0aW9uczogW10sXG4gICAgICByZWplY3Rpb246IGZhbHNlLFxuICAgICAgc3RhdGU6IFBFTkRJTkcsXG4gICAgICB2YWx1ZTogdW5kZWZpbmVkXG4gICAgfSk7XG4gIH07XG4gIEludGVybmFsLnByb3RvdHlwZSA9IHJlZGVmaW5lQWxsKFByb21pc2VQcm90b3R5cGUsIHtcbiAgICAvLyBgUHJvbWlzZS5wcm90b3R5cGUudGhlbmAgbWV0aG9kXG4gICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wcm9taXNlLnByb3RvdHlwZS50aGVuXG4gICAgdGhlbjogZnVuY3Rpb24gdGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xuICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxQcm9taXNlU3RhdGUodGhpcyk7XG4gICAgICB2YXIgcmVhY3Rpb25zID0gc3RhdGUucmVhY3Rpb25zO1xuICAgICAgdmFyIHJlYWN0aW9uID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoc3BlY2llc0NvbnN0cnVjdG9yKHRoaXMsIFByb21pc2VDb25zdHJ1Y3RvcikpO1xuICAgICAgcmVhY3Rpb24ub2sgPSBpc0NhbGxhYmxlKG9uRnVsZmlsbGVkKSA/IG9uRnVsZmlsbGVkIDogdHJ1ZTtcbiAgICAgIHJlYWN0aW9uLmZhaWwgPSBpc0NhbGxhYmxlKG9uUmVqZWN0ZWQpICYmIG9uUmVqZWN0ZWQ7XG4gICAgICByZWFjdGlvbi5kb21haW4gPSBJU19OT0RFID8gcHJvY2Vzcy5kb21haW4gOiB1bmRlZmluZWQ7XG4gICAgICBzdGF0ZS5wYXJlbnQgPSB0cnVlO1xuICAgICAgcmVhY3Rpb25zW3JlYWN0aW9ucy5sZW5ndGhdID0gcmVhY3Rpb247XG4gICAgICBpZiAoc3RhdGUuc3RhdGUgIT0gUEVORElORykgbm90aWZ5KHN0YXRlLCBmYWxzZSk7XG4gICAgICByZXR1cm4gcmVhY3Rpb24ucHJvbWlzZTtcbiAgICB9LFxuICAgIC8vIGBQcm9taXNlLnByb3RvdHlwZS5jYXRjaGAgbWV0aG9kXG4gICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wcm9taXNlLnByb3RvdHlwZS5jYXRjaFxuICAgICdjYXRjaCc6IGZ1bmN0aW9uIChvblJlamVjdGVkKSB7XG4gICAgICByZXR1cm4gdGhpcy50aGVuKHVuZGVmaW5lZCwgb25SZWplY3RlZCk7XG4gICAgfVxuICB9KTtcbiAgT3duUHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHByb21pc2UgPSBuZXcgSW50ZXJuYWwoKTtcbiAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHByb21pc2UpO1xuICAgIHRoaXMucHJvbWlzZSA9IHByb21pc2U7XG4gICAgdGhpcy5yZXNvbHZlID0gYmluZChpbnRlcm5hbFJlc29sdmUsIHN0YXRlKTtcbiAgICB0aGlzLnJlamVjdCA9IGJpbmQoaW50ZXJuYWxSZWplY3QsIHN0YXRlKTtcbiAgfTtcbiAgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUuZiA9IG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKEMpIHtcbiAgICByZXR1cm4gQyA9PT0gUHJvbWlzZUNvbnN0cnVjdG9yIHx8IEMgPT09IFByb21pc2VXcmFwcGVyXG4gICAgICA/IG5ldyBPd25Qcm9taXNlQ2FwYWJpbGl0eShDKVxuICAgICAgOiBuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gIH07XG5cbiAgaWYgKCFJU19QVVJFICYmIGlzQ2FsbGFibGUoTmF0aXZlUHJvbWlzZSkgJiYgTmF0aXZlUHJvbWlzZVByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSkge1xuICAgIG5hdGl2ZVRoZW4gPSBOYXRpdmVQcm9taXNlUHJvdG90eXBlLnRoZW47XG5cbiAgICBpZiAoIVNVQkNMQVNTSU5HKSB7XG4gICAgICAvLyBtYWtlIGBQcm9taXNlI3RoZW5gIHJldHVybiBhIHBvbHlmaWxsZWQgYFByb21pc2VgIGZvciBuYXRpdmUgcHJvbWlzZS1iYXNlZCBBUElzXG4gICAgICByZWRlZmluZShOYXRpdmVQcm9taXNlUHJvdG90eXBlLCAndGhlbicsIGZ1bmN0aW9uIHRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpIHtcbiAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2VDb25zdHJ1Y3RvcihmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgY2FsbChuYXRpdmVUaGVuLCB0aGF0LCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9KS50aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKTtcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy82NDBcbiAgICAgIH0sIHsgdW5zYWZlOiB0cnVlIH0pO1xuXG4gICAgICAvLyBtYWtlcyBzdXJlIHRoYXQgbmF0aXZlIHByb21pc2UtYmFzZWQgQVBJcyBgUHJvbWlzZSNjYXRjaGAgcHJvcGVybHkgd29ya3Mgd2l0aCBwYXRjaGVkIGBQcm9taXNlI3RoZW5gXG4gICAgICByZWRlZmluZShOYXRpdmVQcm9taXNlUHJvdG90eXBlLCAnY2F0Y2gnLCBQcm9taXNlUHJvdG90eXBlWydjYXRjaCddLCB7IHVuc2FmZTogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICAvLyBtYWtlIGAuY29uc3RydWN0b3IgPT09IFByb21pc2VgIHdvcmsgZm9yIG5hdGl2ZSBwcm9taXNlLWJhc2VkIEFQSXNcbiAgICB0cnkge1xuICAgICAgZGVsZXRlIE5hdGl2ZVByb21pc2VQcm90b3R5cGUuY29uc3RydWN0b3I7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuXG4gICAgLy8gbWFrZSBgaW5zdGFuY2VvZiBQcm9taXNlYCB3b3JrIGZvciBuYXRpdmUgcHJvbWlzZS1iYXNlZCBBUElzXG4gICAgaWYgKHNldFByb3RvdHlwZU9mKSB7XG4gICAgICBzZXRQcm90b3R5cGVPZihOYXRpdmVQcm9taXNlUHJvdG90eXBlLCBQcm9taXNlUHJvdG90eXBlKTtcbiAgICB9XG4gIH1cbn1cblxuJCh7IGdsb2JhbDogdHJ1ZSwgd3JhcDogdHJ1ZSwgZm9yY2VkOiBGT1JDRUQgfSwge1xuICBQcm9taXNlOiBQcm9taXNlQ29uc3RydWN0b3Jcbn0pO1xuXG5zZXRUb1N0cmluZ1RhZyhQcm9taXNlQ29uc3RydWN0b3IsIFBST01JU0UsIGZhbHNlLCB0cnVlKTtcbnNldFNwZWNpZXMoUFJPTUlTRSk7XG5cblByb21pc2VXcmFwcGVyID0gZ2V0QnVpbHRJbihQUk9NSVNFKTtcblxuLy8gc3RhdGljc1xuJCh7IHRhcmdldDogUFJPTUlTRSwgc3RhdDogdHJ1ZSwgZm9yY2VkOiBGT1JDRUQgfSwge1xuICAvLyBgUHJvbWlzZS5yZWplY3RgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXByb21pc2UucmVqZWN0XG4gIHJlamVjdDogZnVuY3Rpb24gcmVqZWN0KHIpIHtcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KHRoaXMpO1xuICAgIGNhbGwoY2FwYWJpbGl0eS5yZWplY3QsIHVuZGVmaW5lZCwgcik7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG5cbiQoeyB0YXJnZXQ6IFBST01JU0UsIHN0YXQ6IHRydWUsIGZvcmNlZDogSVNfUFVSRSB8fCBGT1JDRUQgfSwge1xuICAvLyBgUHJvbWlzZS5yZXNvbHZlYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wcm9taXNlLnJlc29sdmVcbiAgcmVzb2x2ZTogZnVuY3Rpb24gcmVzb2x2ZSh4KSB7XG4gICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKElTX1BVUkUgJiYgdGhpcyA9PT0gUHJvbWlzZVdyYXBwZXIgPyBQcm9taXNlQ29uc3RydWN0b3IgOiB0aGlzLCB4KTtcbiAgfVxufSk7XG5cbiQoeyB0YXJnZXQ6IFBST01JU0UsIHN0YXQ6IHRydWUsIGZvcmNlZDogSU5DT1JSRUNUX0lURVJBVElPTiB9LCB7XG4gIC8vIGBQcm9taXNlLmFsbGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvbWlzZS5hbGxcbiAgYWxsOiBmdW5jdGlvbiBhbGwoaXRlcmFibGUpIHtcbiAgICB2YXIgQyA9IHRoaXM7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShDKTtcbiAgICB2YXIgcmVzb2x2ZSA9IGNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyICRwcm9taXNlUmVzb2x2ZSA9IGFDYWxsYWJsZShDLnJlc29sdmUpO1xuICAgICAgdmFyIHZhbHVlcyA9IFtdO1xuICAgICAgdmFyIGNvdW50ZXIgPSAwO1xuICAgICAgdmFyIHJlbWFpbmluZyA9IDE7XG4gICAgICBpdGVyYXRlKGl0ZXJhYmxlLCBmdW5jdGlvbiAocHJvbWlzZSkge1xuICAgICAgICB2YXIgaW5kZXggPSBjb3VudGVyKys7XG4gICAgICAgIHZhciBhbHJlYWR5Q2FsbGVkID0gZmFsc2U7XG4gICAgICAgIHJlbWFpbmluZysrO1xuICAgICAgICBjYWxsKCRwcm9taXNlUmVzb2x2ZSwgQywgcHJvbWlzZSkudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICBpZiAoYWxyZWFkeUNhbGxlZCkgcmV0dXJuO1xuICAgICAgICAgIGFscmVhZHlDYWxsZWQgPSB0cnVlO1xuICAgICAgICAgIHZhbHVlc1tpbmRleF0gPSB2YWx1ZTtcbiAgICAgICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgICAgIH0sIHJlamVjdCk7XG4gICAgICB9KTtcbiAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICB9KTtcbiAgICBpZiAocmVzdWx0LmVycm9yKSByZWplY3QocmVzdWx0LnZhbHVlKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9LFxuICAvLyBgUHJvbWlzZS5yYWNlYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wcm9taXNlLnJhY2VcbiAgcmFjZTogZnVuY3Rpb24gcmFjZShpdGVyYWJsZSkge1xuICAgIHZhciBDID0gdGhpcztcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KEMpO1xuICAgIHZhciByZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgJHByb21pc2VSZXNvbHZlID0gYUNhbGxhYmxlKEMucmVzb2x2ZSk7XG4gICAgICBpdGVyYXRlKGl0ZXJhYmxlLCBmdW5jdGlvbiAocHJvbWlzZSkge1xuICAgICAgICBjYWxsKCRwcm9taXNlUmVzb2x2ZSwgQywgcHJvbWlzZSkudGhlbihjYXBhYmlsaXR5LnJlc29sdmUsIHJlamVjdCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBpZiAocmVzdWx0LmVycm9yKSByZWplY3QocmVzdWx0LnZhbHVlKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBjaGFyQXQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3RyaW5nLW11bHRpYnl0ZScpLmNoYXJBdDtcbnZhciB0b1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmcnKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlJyk7XG52YXIgZGVmaW5lSXRlcmF0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLWl0ZXJhdG9yJyk7XG5cbnZhciBTVFJJTkdfSVRFUkFUT1IgPSAnU3RyaW5nIEl0ZXJhdG9yJztcbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKFNUUklOR19JVEVSQVRPUik7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlW0BAaXRlcmF0b3JdYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS1AQGl0ZXJhdG9yXG5kZWZpbmVJdGVyYXRvcihTdHJpbmcsICdTdHJpbmcnLCBmdW5jdGlvbiAoaXRlcmF0ZWQpIHtcbiAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7XG4gICAgdHlwZTogU1RSSU5HX0lURVJBVE9SLFxuICAgIHN0cmluZzogdG9TdHJpbmcoaXRlcmF0ZWQpLFxuICAgIGluZGV4OiAwXG4gIH0pO1xuLy8gYCVTdHJpbmdJdGVyYXRvclByb3RvdHlwZSUubmV4dGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLSVzdHJpbmdpdGVyYXRvcnByb3RvdHlwZSUubmV4dFxufSwgZnVuY3Rpb24gbmV4dCgpIHtcbiAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgdmFyIHN0cmluZyA9IHN0YXRlLnN0cmluZztcbiAgdmFyIGluZGV4ID0gc3RhdGUuaW5kZXg7XG4gIHZhciBwb2ludDtcbiAgaWYgKGluZGV4ID49IHN0cmluZy5sZW5ndGgpIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgcG9pbnQgPSBjaGFyQXQoc3RyaW5nLCBpbmRleCk7XG4gIHN0YXRlLmluZGV4ICs9IHBvaW50Lmxlbmd0aDtcbiAgcmV0dXJuIHsgdmFsdWU6IHBvaW50LCBkb25lOiBmYWxzZSB9O1xufSk7XG4iLCIoZnVuY3Rpb24gKCkge1xuICB2YXIgdmFsaWRhdG9yID0gbmV3IFJlZ0V4cChcIl5bYS16MC05XXs4fS1bYS16MC05XXs0fS1bYS16MC05XXs0fS1bYS16MC05XXs0fS1bYS16MC05XXsxMn0kXCIsIFwiaVwiKTtcblxuICBmdW5jdGlvbiBnZW4oY291bnQpIHtcbiAgICB2YXIgb3V0ID0gXCJcIjtcbiAgICBmb3IgKHZhciBpPTA7IGk8Y291bnQ7IGkrKykge1xuICAgICAgb3V0ICs9ICgoKDErTWF0aC5yYW5kb20oKSkqMHgxMDAwMCl8MCkudG9TdHJpbmcoMTYpLnN1YnN0cmluZygxKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIGZ1bmN0aW9uIEd1aWQoZ3VpZCkge1xuICAgIGlmICghZ3VpZCkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXJndW1lbnQ7IGB2YWx1ZWAgaGFzIG5vIHZhbHVlLlwiKTtcbiAgICAgIFxuICAgIHRoaXMudmFsdWUgPSBHdWlkLkVNUFRZO1xuICAgIFxuICAgIGlmIChndWlkICYmIGd1aWQgaW5zdGFuY2VvZiBHdWlkKSB7XG4gICAgICB0aGlzLnZhbHVlID0gZ3VpZC50b1N0cmluZygpO1xuXG4gICAgfSBlbHNlIGlmIChndWlkICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChndWlkKSA9PT0gXCJbb2JqZWN0IFN0cmluZ11cIiAmJiBHdWlkLmlzR3VpZChndWlkKSkge1xuICAgICAgdGhpcy52YWx1ZSA9IGd1aWQ7XG4gICAgfVxuICAgIFxuICAgIHRoaXMuZXF1YWxzID0gZnVuY3Rpb24ob3RoZXIpIHtcbiAgICAgIC8vIENvbXBhcmluZyBzdHJpbmcgYHZhbHVlYCBhZ2FpbnN0IHByb3ZpZGVkIGBndWlkYCB3aWxsIGF1dG8tY2FsbFxuICAgICAgLy8gdG9TdHJpbmcgb24gYGd1aWRgIGZvciBjb21wYXJpc29uXG4gICAgICByZXR1cm4gR3VpZC5pc0d1aWQob3RoZXIpICYmIHRoaXMudmFsdWUgPT0gb3RoZXI7XG4gICAgfTtcblxuICAgIHRoaXMuaXNFbXB0eSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMudmFsdWUgPT09IEd1aWQuRU1QVFk7XG4gICAgfTtcbiAgICBcbiAgICB0aGlzLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgICB9O1xuICAgIFxuICAgIHRoaXMudG9KU09OID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgICB9O1xuICB9O1xuXG4gIEd1aWQuRU1QVFkgPSBcIjAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMFwiO1xuXG4gIEd1aWQuaXNHdWlkID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgJiYgKHZhbHVlIGluc3RhbmNlb2YgR3VpZCB8fCB2YWxpZGF0b3IudGVzdCh2YWx1ZS50b1N0cmluZygpKSk7XG4gIH07XG5cbiAgR3VpZC5jcmVhdGUgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IEd1aWQoW2dlbigyKSwgZ2VuKDEpLCBnZW4oMSksIGdlbigxKSwgZ2VuKDMpXS5qb2luKFwiLVwiKSk7XG4gIH07XG5cbiAgR3VpZC5yYXcgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gW2dlbigyKSwgZ2VuKDEpLCBnZW4oMSksIGdlbigxKSwgZ2VuKDMpXS5qb2luKFwiLVwiKTtcbiAgfTtcblxuICBpZih0eXBlb2YgbW9kdWxlICE9ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBHdWlkO1xuICB9XG4gIGVsc2UgaWYgKHR5cGVvZiB3aW5kb3cgIT0gJ3VuZGVmaW5lZCcpIHtcbiAgICB3aW5kb3cuR3VpZCA9IEd1aWQ7XG4gIH1cbn0pKCk7XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUV2ZW50IH0gZnJvbSAnLi9UYWJsZWF1RXZlbnQnO1xuXG5leHBvcnQgY2xhc3MgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZEV2ZW50IGV4dGVuZHMgVGFibGVhdUV2ZW50IGltcGxlbWVudHMgQ29udHJhY3QuRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZEV2ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBfZGFzaGJvYXJkTGF5b3V0Q2hhbmdlRGV0YWlsczogQ29udHJhY3QuRGFzaGJvYXJkTGF5b3V0Q2hhbmdlRGV0YWlscykge1xuICAgIHN1cGVyKENvbnRyYWN0LlRhYmxlYXVFdmVudFR5cGUuRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRhc2hib2FyZExheW91dENoYW5nZURldGFpbHMoKTogQ29udHJhY3QuRGFzaGJvYXJkTGF5b3V0Q2hhbmdlRGV0YWlscyB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZExheW91dENoYW5nZURldGFpbHM7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFcnJvckNvZGVzLCBUYWJsZWF1RXZlbnRUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgVGFibGVhdVdvcmtzaGVldEV2ZW50IH0gZnJvbSAnLi9UYWJsZWF1V29ya3NoZWV0RXZlbnQnO1xuXG5leHBvcnQgY2xhc3MgRmlsdGVyQ2hhbmdlZEV2ZW50IGV4dGVuZHMgVGFibGVhdVdvcmtzaGVldEV2ZW50IGltcGxlbWVudHMgQ29udHJhY3QuRmlsdGVyQ2hhbmdlZEV2ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHdvcmtzaGVldDogQ29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0LCBwcml2YXRlIF9maWVsZE5hbWU6IHN0cmluZywgcHJpdmF0ZSBfZmllbGRJZD86IHN0cmluZykge1xuICAgIHN1cGVyKFRhYmxlYXVFdmVudFR5cGUuRmlsdGVyQ2hhbmdlZCwgd29ya3NoZWV0KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmllbGROYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkTmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmllbGRJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9maWVsZElkO1xuICB9XG5cbiAgcHVibGljIGdldEZpbHRlckFzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuRmlsdGVyPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldC5nZXRGaWx0ZXJzQXN5bmMoKS50aGVuPENvbnRyYWN0LkZpbHRlcj4oKGZpbHRlcnMpID0+IHtcbiAgICAgIC8vIFRPRE86IEZpbHRlcmluZyBvZiB0aGUgZmlsdGVycyBzaG91bGQgZXZlbnR1YWxseSBiZSBkb25lIHBsYXRmb3JtIHNpZGUuXG4gICAgICBjb25zdCBldmVudGVkRmlsdGVyID0gdGhpcy5maWVsZElkXG4gICAgICAgID8gZmlsdGVycy5maW5kKChmaWx0ZXIpID0+IGZpbHRlci5maWVsZElkID09PSB0aGlzLmZpZWxkSWQsIHRoaXMpXG4gICAgICAgIDogZmlsdGVycy5maW5kKChmaWx0ZXIpID0+IGZpbHRlci5maWVsZE5hbWUgPT09IHRoaXMuZmllbGROYW1lLCB0aGlzKTtcblxuICAgICAgaWYgKCFldmVudGVkRmlsdGVyKSB7XG4gICAgICAgIC8vIFdlIHNob3VsZG4ndCBoaXQgdGhpcyB1bmxlc3MgdGhlIGZpbHRlciB3YXMgcmVtb3ZlZCBmcm9tIHRoZSB3b3Jrc2hlZXRcbiAgICAgICAgLy8gYWZ0ZXIgdGhlIGV2ZW50IHdhcyByYWlzZWQuXG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5NaXNzaW5nRmlsdGVyLCBgY2Fubm90IGZpbmQgZmlsdGVyOiAke3RoaXMuX2ZpZWxkTmFtZX1gKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGV2ZW50ZWRGaWx0ZXI7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXZlbnRUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVXb3Jrc2hlZXRFdmVudCB9IGZyb20gJy4vVGFibGVhdVdvcmtzaGVldEV2ZW50JztcblxuZXhwb3J0IGNsYXNzIE1hcmtzU2VsZWN0ZWRFdmVudCBleHRlbmRzIFRhYmxlYXVXb3Jrc2hlZXRFdmVudCBpbXBsZW1lbnRzIENvbnRyYWN0Lk1hcmtzU2VsZWN0ZWRFdmVudCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih3b3Jrc2hlZXQ6IENvbnRyYWN0LkV4dGVuc2lvbldvcmtzaGVldCkge1xuICAgIHN1cGVyKFRhYmxlYXVFdmVudFR5cGUuTWFya1NlbGVjdGlvbkNoYW5nZWQsIHdvcmtzaGVldCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TWFya3NBc3luYygpOiBQcm9taXNlPENvbnRyYWN0Lk1hcmtzQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiB0aGlzLndvcmtzaGVldC5nZXRTZWxlY3RlZE1hcmtzQXN5bmMoKTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEVycm9yQ29kZXMsIFRhYmxlYXVFdmVudFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5LCBQYXJhbWV0ZXJzU2VydmljZSwgU2VydmljZU5hbWVzLCBUYWJsZWF1RXJyb3IgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IFBhcmFtZXRlciB9IGZyb20gJy4uL01vZGVscy9QYXJhbWV0ZXInO1xuaW1wb3J0IHsgRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnlVdGlsJztcbmltcG9ydCB7IFRhYmxlYXVTaGVldEV2ZW50IH0gZnJvbSAnLi9UYWJsZWF1U2hlZXRFdmVudCc7XG5cbmV4cG9ydCBjbGFzcyBQYXJhbWV0ZXJDaGFuZ2VkRXZlbnQgZXh0ZW5kcyBUYWJsZWF1U2hlZXRFdmVudCBpbXBsZW1lbnRzIENvbnRyYWN0LlBhcmFtZXRlckNoYW5nZWRFdmVudCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9nbG9iYWxGaWVsZE5hbWU6IHN0cmluZywgc2hlZXQ6IENvbnRyYWN0LkV4dGVuc2lvblNoZWV0KSB7XG4gICAgc3VwZXIoVGFibGVhdUV2ZW50VHlwZS5QYXJhbWV0ZXJDaGFuZ2VkLCBzaGVldCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0UGFyYW1ldGVyQXN5bmMoKTogUHJvbWlzZTxDb250cmFjdC5QYXJhbWV0ZXI+IHtcbiAgICAvLyBDYWxsIGRvd24gdG8gb3VyIHNlcnZpY2UgdG8gZ2V0IHRoZSBwYXJhbWV0ZXIgYmFjayB2aWEgaXRzIGZpZWxkIG5hbWVcbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxQYXJhbWV0ZXJzU2VydmljZT4oU2VydmljZU5hbWVzLlBhcmFtZXRlcnMpO1xuICAgIHJldHVybiBzZXJ2aWNlLmZpbmRQYXJhbWV0ZXJCeUdsb2JhbEZpZWxkTmFtZUFzeW5jKHRoaXMuX2dsb2JhbEZpZWxkTmFtZSkudGhlbigocGFyYW1ldGVySW1wbCkgPT4ge1xuICAgICAgaWYgKHBhcmFtZXRlckltcGwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuTWlzc2luZ1BhcmFtZXRlciwgYENhbm5vdCBmaW5kIHBhcmFtZXRlcjogJHt0aGlzLl9nbG9iYWxGaWVsZE5hbWV9YCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgUGFyYW1ldGVyKHBhcmFtZXRlckltcGwsIHRoaXMuc2hlZXQpO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUV2ZW50VHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1V29ya3NoZWV0RXZlbnQgfSBmcm9tICcuL1RhYmxlYXVXb3Jrc2hlZXRFdmVudCc7XG5cbmV4cG9ydCBjbGFzcyBTdW1tYXJ5RGF0YUNoYW5nZWRFdmVudCBleHRlbmRzIFRhYmxlYXVXb3Jrc2hlZXRFdmVudCBpbXBsZW1lbnRzIENvbnRyYWN0LlN1bW1hcnlEYXRhQ2hhbmdlZEV2ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHdvcmtzaGVldDogQ29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0KSB7XG4gICAgc3VwZXIoVGFibGVhdUV2ZW50VHlwZS5TdW1tYXJ5RGF0YUNoYW5nZWQsIHdvcmtzaGVldCk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXZlbnRUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcblxuZXhwb3J0IGNsYXNzIFRhYmxlYXVFdmVudCBpbXBsZW1lbnRzIENvbnRyYWN0LlRhYmxlYXVFdmVudCB7XG4gIHByaXZhdGUgX3R5cGU6IFRhYmxlYXVFdmVudFR5cGU7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHR5cGU6IFRhYmxlYXVFdmVudFR5cGUpIHtcbiAgICB0aGlzLl90eXBlID0gdHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdHlwZSgpOiBUYWJsZWF1RXZlbnRUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fdHlwZTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFdmVudFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUV2ZW50IH0gZnJvbSAnLi9UYWJsZWF1RXZlbnQnO1xuXG5leHBvcnQgY2xhc3MgVGFibGVhdVNoZWV0RXZlbnQgZXh0ZW5kcyBUYWJsZWF1RXZlbnQgaW1wbGVtZW50cyBDb250cmFjdC5UYWJsZWF1U2hlZXRFdmVudCB7XG4gIHByaXZhdGUgX3NoZWV0OiBDb250cmFjdC5FeHRlbnNpb25TaGVldDtcblxuICBwdWJsaWMgZ2V0IHNoZWV0KCk6IENvbnRyYWN0LkV4dGVuc2lvblNoZWV0IHtcbiAgICByZXR1cm4gdGhpcy5fc2hlZXQ7XG4gIH1cblxuICBwdWJsaWMgY29uc3RydWN0b3IodHlwZTogVGFibGVhdUV2ZW50VHlwZSwgc2hlZXQ6IENvbnRyYWN0LkV4dGVuc2lvblNoZWV0KSB7XG4gICAgc3VwZXIodHlwZSk7XG5cbiAgICB0aGlzLl9zaGVldCA9IHNoZWV0O1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUV2ZW50VHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1U2hlZXRFdmVudCB9IGZyb20gJy4vVGFibGVhdVNoZWV0RXZlbnQnO1xuXG5leHBvcnQgY2xhc3MgVGFibGVhdVdvcmtzaGVldEV2ZW50IGV4dGVuZHMgVGFibGVhdVNoZWV0RXZlbnQgaW1wbGVtZW50cyBDb250cmFjdC5UYWJsZWF1V29ya3NoZWV0RXZlbnQge1xuICBwdWJsaWMgZ2V0IHdvcmtzaGVldCgpOiBDb250cmFjdC5FeHRlbnNpb25Xb3Jrc2hlZXQge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXQ7XG4gIH1cblxuICBwdWJsaWMgY29uc3RydWN0b3IodHlwZTogVGFibGVhdUV2ZW50VHlwZSwgcHJvdGVjdGVkIF93b3Jrc2hlZXQ6IENvbnRyYWN0LkV4dGVuc2lvbldvcmtzaGVldCkge1xuICAgIHN1cGVyKHR5cGUsIF93b3Jrc2hlZXQpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUV2ZW50IH0gZnJvbSAnLi9UYWJsZWF1RXZlbnQnO1xuXG5leHBvcnQgY2xhc3MgV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50IGV4dGVuZHMgVGFibGVhdUV2ZW50IGltcGxlbWVudHMgQ29udHJhY3QuV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2Zvcm1hdHRpbmc6IENvbnRyYWN0Lldvcmtib29rRm9ybWF0dGluZykge1xuICAgIHN1cGVyKENvbnRyYWN0LlRhYmxlYXVFdmVudFR5cGUuV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZvcm1hdHRpbmcoKTogQ29udHJhY3QuV29ya2Jvb2tGb3JtYXR0aW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybWF0dGluZztcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVXb3Jrc2hlZXRFdmVudCB9IGZyb20gJy4vVGFibGVhdVdvcmtzaGVldEV2ZW50JztcblxuZXhwb3J0IGNsYXNzIFdvcmtzaGVldEZvcm1hdHRpbmdDaGFuZ2VkRXZlbnQgZXh0ZW5kcyBUYWJsZWF1V29ya3NoZWV0RXZlbnQgaW1wbGVtZW50cyBDb250cmFjdC5Xb3Jrc2hlZXRGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHdvcmtzaGVldDogQ29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0LCBwcml2YXRlIF9mb3JtYXR0aW5nOiBDb250cmFjdC5Xb3Jrc2hlZXRGb3JtYXR0aW5nKSB7XG4gICAgc3VwZXIoQ29udHJhY3QuVGFibGVhdUV2ZW50VHlwZS5Xb3Jrc2hlZXRGb3JtYXR0aW5nQ2hhbmdlZCwgd29ya3NoZWV0KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZm9ybWF0dGluZygpOiBDb250cmFjdC5Xb3Jrc2hlZXRGb3JtYXR0aW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybWF0dGluZztcbiAgfVxufVxuIiwiaW1wb3J0IHsgTW9kZWwgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG5leHBvcnQgY29uc3QgQmVudG9uU2Fuc0ZvbnRGYW1pbHlOYW1lID0gJ0JlbnRvbiBTYW5zJztcbmV4cG9ydCBjb25zdCBCZW50b25TYW5zTG93RFBJRm9udEZhbWlseU5hbWUgPSAnQmVudG9uIFNhbnMgTG93LURQSSc7XG5cbmV4cG9ydCBjb25zdCBCZW50b25TYW5zQm9va0ZvbnRGYWNlTmFtZSA9ICdCZW50b24gU2FucyBCb29rJztcbmV4cG9ydCBjb25zdCBCZW50b25TYW5zQm9va0l0YWxpY0ZvbnRGYWNlTmFtZSA9ICdCZW50b24gU2FucyBCb29rIEl0YWxpYyc7XG5leHBvcnQgY29uc3QgQmVudG9uU2Fuc1NlbWlEZW1pRm9udEZhY2VOYW1lID0gJ0JlbnRvbiBTYW5zIFNlbWlEZW1pJztcbmV4cG9ydCBjb25zdCBCZW50b25TYW5zU2VtaURlbWlJdGFsaWNGb250RmFjZU5hbWUgPSAnQmVudG9uIFNhbnMgU2VtaURlbWkgSXRhbGljJztcbmV4cG9ydCBjb25zdCBCZW50b25TYW5zTGlnaHRGb250RmFjZU5hbWUgPSAnQmVudG9uIFNhbnMgTGlnaHQnO1xuZXhwb3J0IGNvbnN0IEJlbnRvblNhbnNNZWRpdW1Gb250RmFjZU5hbWUgPSAnQmVudG9uIFNhbnMgTWVkaXVtJztcblxuZXhwb3J0IGNvbnN0IFN1cHBvcnRlZEJlbnRvblNhbnNGb250RmFjZXM6IE1vZGVsW10gPSBbXG4gIEJlbnRvblNhbnNCb29rRm9udEZhY2VOYW1lLFxuICBCZW50b25TYW5zQm9va0l0YWxpY0ZvbnRGYWNlTmFtZSxcbiAgQmVudG9uU2Fuc1NlbWlEZW1pRm9udEZhY2VOYW1lLFxuICBCZW50b25TYW5zU2VtaURlbWlJdGFsaWNGb250RmFjZU5hbWUsXG4gIEJlbnRvblNhbnNMaWdodEZvbnRGYWNlTmFtZSxcbiAgQmVudG9uU2Fuc01lZGl1bUZvbnRGYWNlTmFtZSxcbl07XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuXG5leHBvcnQgY2xhc3MgQ29ubmVjdGVkU2VydmVyIGltcGxlbWVudHMgQ29udHJhY3QuQ29ubmVjdGVkU2VydmVyIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBfdXNlcklkPzogc3RyaW5nLFxuICAgIHByb3RlY3RlZCBfc2l0ZUlkPzogc3RyaW5nLFxuICAgIHByb3RlY3RlZCBfc2l0ZU5hbWVzcGFjZT86IHN0cmluZyxcbiAgICBwcm90ZWN0ZWQgX3dvcmtib29rSWQ/OiBzdHJpbmcsXG4gICkge31cblxuICBwdWJsaWMgZ2V0IHVzZXJJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl91c2VySWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNpdGVJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9zaXRlSWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNpdGVOYW1lc3BhY2UoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fc2l0ZU5hbWVzcGFjZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgd29ya2Jvb2tJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl93b3JrYm9va0lkO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGF0YVNjaGVtYSwgRGF0YVNvdXJjZSBhcyBEYXRhU291cmNlSW5mbyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBBcGlTZXJ2aWNlUmVnaXN0cnksIERhdGFTb3VyY2UsIERhdGFTb3VyY2VJbXBsLCBEYXRhU291cmNlU2VydmljZSwgU2VydmljZU5hbWVzLCBXb3JrYm9va0ltcGwgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IEV4dGVuc2lvbnNSZWdpc3RyeUlkIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5VXRpbCc7XG5cbmV4cG9ydCBjbGFzcyBFeHRlbnNpb25Xb3JrYm9va0ltcGwgZXh0ZW5kcyBXb3JrYm9va0ltcGwge1xuICBwdWJsaWMgZ2V0QWxsRGF0YVNvdXJjZXNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkRhdGFTb3VyY2U+PiB7XG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RGF0YVNvdXJjZVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5EYXRhU291cmNlU2VydmljZSk7XG5cbiAgICByZXR1cm4gc2VydmljZS5nZXRBbGxEYXRhU291cmNlc0FzeW5jKCkudGhlbjxBcnJheTxDb250cmFjdC5EYXRhU291cmNlPj4oKHJlc3VsdCkgPT4ge1xuICAgICAgY29uc3QgZGF0YVNjaGVtYTogRGF0YVNjaGVtYSA9IHJlc3VsdDtcbiAgICAgIGNvbnN0IGRhdGFTb3VyY2VzOiBBcnJheTxDb250cmFjdC5EYXRhU291cmNlPiA9IFtdO1xuXG4gICAgICAvLyBMb29wIHRocm91Z2ggYWxsIGRhdGEgc291cmNlcyBhbmQgYWRkIHRoZW0uXG4gICAgICBPYmplY3QudmFsdWVzKGRhdGFTY2hlbWEuZGF0YVNvdXJjZXMpLmZvckVhY2goKGRzKSA9PiB7XG4gICAgICAgIGRhdGFTb3VyY2VzLnB1c2godGhpcy5jcmVhdGVEYXRhU291cmNlRnJvbUluZm8oZHMpKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gZGF0YVNvdXJjZXM7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZURhdGFTb3VyY2VGcm9tSW5mbyhkYXRhU291cmNlSW5mbzogRGF0YVNvdXJjZUluZm8pOiBEYXRhU291cmNlIHtcbiAgICBjb25zdCBkYXRhU291cmNlSW1wbCA9IG5ldyBEYXRhU291cmNlSW1wbChkYXRhU291cmNlSW5mbywgRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpO1xuICAgIGNvbnN0IGRhdGFTb3VyY2UgPSBuZXcgRGF0YVNvdXJjZShkYXRhU291cmNlSW1wbCk7XG4gICAgZGF0YVNvdXJjZUltcGwuaW5pdGlhbGl6ZVdpdGhQdWJsaWNJbnRlcmZhY2VzKGRhdGFTb3VyY2UpO1xuICAgIHJldHVybiBkYXRhU291cmNlO1xuICB9XG59XG4iLCJpbXBvcnQgeyBFcnJvckNvZGVzLCBTaGVldFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQ29udGV4dE1lbnVFdmVudCxcbiAgRGFzaGJvYXJkRXh0ZW5zaW9uTG9jYXRvcixcbiAgRXhlY3V0ZVBhcmFtZXRlcnMsXG4gIEV4dGVuc2lvbkRhc2hib2FyZEluZm8sXG4gIEV4dGVuc2lvbkxvY2F0b3IsXG4gIEV4dGVuc2lvblNldHRpbmdzSW5mbyxcbiAgRXh0ZW5zaW9uV29ya3NoZWV0SW5mbyxcbiAgRm9udE5hbWVBbmRJbmZvLFxuICBGb3JtYXR0aW5nU2hlZXQsXG4gIElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT04sXG4gIEluaXRpYWxpemF0aW9uT3B0aW9ucyxcbiAgSW50ZXJuYWxBcGlEaXNwYXRjaGVyLFxuICBJbnRlcm5hbEFwaURpc3BhdGNoZXJGYWN0b3J5LFxuICBNb2RlbCxcbiAgTm90aWZpY2F0aW9uSWQsXG4gIFBhcmFtZXRlcklkLFxuICBTaGVldFBhdGgsXG4gIFZlcmJJZCxcbiAgV29ya2Jvb2tGb3JtYXR0aW5nLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LFxuICBBcGlWZXJzaW9uLFxuICBEYXNoYm9hcmRJbXBsLFxuICBOb3RpZmljYXRpb25TZXJ2aWNlLFxuICBTZXJ2aWNlTmFtZXMsXG4gIFNoZWV0SW5mb0ltcGwsXG4gIFRhYmxlYXVFcnJvcixcbiAgVmVyc2lvbmVkRXh0ZXJuYWxBcGlEaXNwYXRjaGVyLFxuICBWaXpTZXJ2aWNlLFxuICBXb3Jrc2hlZXRJbXBsLFxuICBkb0Nyb3NzRnJhbWVCb290c3RyYXAsXG4gIHJlZ2lzdGVyQWxsU2hhcmVkU2VydmljZXMsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkIH0gZnJvbSAnLi4vTW9kZWxzL0Rhc2hib2FyZCc7XG5pbXBvcnQgeyBXb3JrYm9vayB9IGZyb20gJy4uL01vZGVscy9Xb3JrYm9vayc7XG5pbXBvcnQgeyBXb3Jrc2hlZXQgfSBmcm9tICcuLi9Nb2RlbHMvV29ya3NoZWV0JztcbmltcG9ydCB7IERhc2hib2FyZENvbnRlbnQgfSBmcm9tICcuLi9OYW1lc3BhY2VzL0Rhc2hib2FyZENvbnRlbnQnO1xuaW1wb3J0IHsgRW52aXJvbm1lbnQgfSBmcm9tICcuLi9OYW1lc3BhY2VzL0Vudmlyb25tZW50JztcbmltcG9ydCB7IFNldHRpbmdzIH0gZnJvbSAnLi4vTmFtZXNwYWNlcy9TZXR0aW5ncyc7XG5pbXBvcnQgeyBVSSB9IGZyb20gJy4uL05hbWVzcGFjZXMvVUknO1xuaW1wb3J0IHsgV29ya2Jvb2tGb3JtYXR0aW5nRW52VXRpbCB9IGZyb20gJy4uL05hbWVzcGFjZXMvV29ya2Jvb2tGb3JtYXR0aW5nRW52VXRpbCc7XG5pbXBvcnQgeyBXb3Jrc2hlZXRDb250ZW50IH0gZnJvbSAnLi4vTmFtZXNwYWNlcy9Xb3Jrc2hlZXRDb250ZW50JztcbmltcG9ydCB7IEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9FeHRlbnNpb25zU2VydmljZU5hbWVzJztcbmltcG9ydCB7IEluaXRpYWxpemF0aW9uU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0luaXRpYWxpemF0aW9uU2VydmljZSc7XG5pbXBvcnQgeyByZWdpc3RlckFsbEV4dGVuc2lvbnNTZXJ2aWNlcywgcmVnaXN0ZXJJbml0aWFsaXphdGlvbkV4dGVuc2lvbnNTZXJ2aWNlcyB9IGZyb20gJy4uL1NlcnZpY2VzL1JlZ2lzdGVyQWxsRXh0ZW5zaW9uc1NlcnZpY2VzJztcbmltcG9ydCB7IEV4dGVuc2lvbnNSZWdpc3RyeUlkIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5VXRpbCc7XG5pbXBvcnQgeyBVSVNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9VSVNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgQmVudG9uU2Fuc0Jvb2tGb250RmFjZU5hbWUsXG4gIEJlbnRvblNhbnNCb29rSXRhbGljRm9udEZhY2VOYW1lLFxuICBCZW50b25TYW5zRm9udEZhbWlseU5hbWUsXG4gIEJlbnRvblNhbnNMaWdodEZvbnRGYWNlTmFtZSxcbiAgQmVudG9uU2Fuc0xvd0RQSUZvbnRGYW1pbHlOYW1lLFxuICBCZW50b25TYW5zTWVkaXVtRm9udEZhY2VOYW1lLFxuICBCZW50b25TYW5zU2VtaURlbWlGb250RmFjZU5hbWUsXG4gIEJlbnRvblNhbnNTZW1pRGVtaUl0YWxpY0ZvbnRGYWNlTmFtZSxcbiAgU3VwcG9ydGVkQmVudG9uU2Fuc0ZvbnRGYWNlcyxcbn0gZnJvbSAnLi9CZW50b25TYW5zRm9udE5hbWVDb25zdGFudHMnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uV29ya2Jvb2tJbXBsIH0gZnJvbSAnLi9FeHRlbnNpb25Xb3JrYm9va0ltcGwnO1xuaW1wb3J0IHsgTGVnYWN5SW50ZXJuYWxBcGlEaXNwYXRjaGVySG9sZGVyIH0gZnJvbSAnLi9MZWdhY3lJbnRlcm5hbEFwaURpc3BhdGNoZXJIb2xkZXInO1xuaW1wb3J0IHsgU2V0dGluZ3NJbXBsIH0gZnJvbSAnLi9TZXR0aW5nc0ltcGwnO1xuaW1wb3J0IHtcbiAgU3VwcG9ydGVkVGFibGVhdUZvbnRGYWNlcyxcbiAgVGFibGVhdUJvbGRGb250RmFjZU5hbWUsXG4gIFRhYmxlYXVCb2xkRm9udEZhbWlseU5hbWUsXG4gIFRhYmxlYXVCb29rRm9udEZhY2VOYW1lLFxuICBUYWJsZWF1Qm9va0ZvbnRGYW1pbHlOYW1lLFxuICBUYWJsZWF1TGlnaHRGb250RmFjZU5hbWUsXG4gIFRhYmxlYXVMaWdodEZvbnRGYW1pbHlOYW1lLFxuICBUYWJsZWF1TWVkaXVtRm9udEZhY2VOYW1lLFxuICBUYWJsZWF1TWVkaXVtRm9udEZhbWlseU5hbWUsXG4gIFRhYmxlYXVSZWd1bGFyRm9udEZhY2VOYW1lLFxuICBUYWJsZWF1UmVndWxhckZvbnRGYW1pbHlOYW1lLFxuICBUYWJsZWF1U2VtaUJvbGRGb250RmFjZU5hbWUsXG4gIFRhYmxlYXVTZW1pYm9sZEZvbnRGYW1pbHlOYW1lLFxufSBmcm9tICcuL1RhYmxlYXVCb29rRm9udE5hbWVDb25zdGFudHMnO1xuaW1wb3J0IHsgVUlJbXBsIH0gZnJvbSAnLi9VSUltcGwnO1xuXG5leHBvcnQgdHlwZSBDYWxsYmFja01hcCA9IHsgW2tleTogc3RyaW5nXTogKCkgPT4gUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfTtcblxuZXhwb3J0IGNsYXNzIEV4dGVuc2lvbnNJbXBsIHtcbiAgcHJpdmF0ZSBfaW5pdGlhbGl6YXRpb25Qcm9taXNlOiBQcm9taXNlPHN0cmluZz47XG4gIHByaXZhdGUgX3N0eWxlRWxlbWVudDogSFRNTFN0eWxlRWxlbWVudDtcbiAgcHVibGljIGRhc2hib2FyZENvbnRlbnQ/OiBEYXNoYm9hcmRDb250ZW50O1xuICBwdWJsaWMgd29ya3NoZWV0Q29udGVudD86IFdvcmtzaGVldENvbnRlbnQ7XG4gIHB1YmxpYyBlbnZpcm9ubWVudDogRW52aXJvbm1lbnQ7XG4gIHB1YmxpYyBzZXR0aW5nczogU2V0dGluZ3M7XG4gIHB1YmxpYyB1aTogVUk7XG4gIHB1YmxpYyB3b3JrYm9vazogV29ya2Jvb2s7XG4gIHB1YmxpYyBleHRlbnNpb25ab25lSWQ6IG51bWJlcjtcblxuICBwdWJsaWMgaW5pdGlhbGl6ZUFzeW5jKGlzRXh0ZW5zaW9uRGlhbG9nOiBib29sZWFuLCBjb250ZXh0TWVudUNhbGxiYWNrcz86IENhbGxiYWNrTWFwKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoIXRoaXMuX2luaXRpYWxpemF0aW9uUHJvbWlzZSkge1xuICAgICAgdGhpcy5faW5pdGlhbGl6YXRpb25Qcm9taXNlID0gbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGluaXRPcHRpb25zOiBJbml0aWFsaXphdGlvbk9wdGlvbnMgPSB7IGlzQWxwaGE6IEFwaVZlcnNpb24uSW5zdGFuY2UuaXNBbHBoYSB9O1xuICAgICAgICAvLyBGaXJzdCB0aGluZyB3ZSB3YW50IHRvIGRvIGlzIGNoZWNrIHRvIHNlZSBpZiB0aGVyZSBpcyBhIGRlc2t0b3AgZGlzcGF0Y2hlciBhbHJlYWR5IHJlZ2lzdGVyZWQgZm9yIHVzXG4gICAgICAgIGlmIChMZWdhY3lJbnRlcm5hbEFwaURpc3BhdGNoZXJIb2xkZXIuaGFzRGVza3RvcEFwaURpc3BhdGNoZXJQcm9taXNlKGluaXRPcHRpb25zKSkge1xuICAgICAgICAgIC8vIFJ1bm5pbmcgaW4gYSBwcmUtMjAxOS4zIGRlc2t0b3AsIHVzZSBvdXIgbGVnYWN5IGRpc3BhdGNoZXIgcHJvbWlzZVxuICAgICAgICAgIGNvbnN0IGRlc2t0b3BEaXNwYXRjaGVyUHJvbWlzZSA9IExlZ2FjeUludGVybmFsQXBpRGlzcGF0Y2hlckhvbGRlci5nZXREZXNrdG9wRGlzcGF0Y2hlclByb21pc2UoaW5pdE9wdGlvbnMpO1xuICAgICAgICAgIGRlc2t0b3BEaXNwYXRjaGVyUHJvbWlzZVxuICAgICAgICAgICAgPy50aGVuKChkaXNwYXRjaGVyRmFjdG9yeSkgPT4gdGhpcy5vbkRpc3BhdGNoZXJSZWNlaXZlZChkaXNwYXRjaGVyRmFjdG9yeSwgaXNFeHRlbnNpb25EaWFsb2csIGNvbnRleHRNZW51Q2FsbGJhY2tzKSlcbiAgICAgICAgICAgIC50aGVuKChvcGVuUGF5bG9hZCkgPT4ge1xuICAgICAgICAgICAgICByZXNvbHZlKG9wZW5QYXlsb2FkKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBXZSBtdXN0IGJlIHJ1bm5pbmcgaW4gc2VydmVyLCBzbyB3ZSBzaG91bGQgdHJ5IHRvIGtpY2sgb2YgdGhlIHNlcnZlciBkaXNwYXRjaGVyIGJvb3RzdHJhcHBpbmdcbiAgICAgICAgICBjb25zdCBvbkRpc3BhdGNoZXJSZWNlaXZlZENhbGxiYWNrID0gdGhpcy5vbkRpc3BhdGNoZXJSZWNlaXZlZC5iaW5kKHRoaXMpO1xuICAgICAgICAgIGRvQ3Jvc3NGcmFtZUJvb3RzdHJhcCh3aW5kb3csIElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT04sIGluaXRPcHRpb25zKVxuICAgICAgICAgICAgLnRoZW4oKGZhY3Rvcnk6IEludGVybmFsQXBpRGlzcGF0Y2hlckZhY3RvcnkpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIG9uRGlzcGF0Y2hlclJlY2VpdmVkQ2FsbGJhY2soZmFjdG9yeSwgaXNFeHRlbnNpb25EaWFsb2csIGNvbnRleHRNZW51Q2FsbGJhY2tzKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbigob3BlblBheWxvYWQpID0+IHtcbiAgICAgICAgICAgICAgcmVzb2x2ZShvcGVuUGF5bG9hZCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9pbml0aWFsaXphdGlvblByb21pc2U7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlVml6SW1hZ2VBc3luYyhpbnB1dFNwZWM6IG9iamVjdCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3Qgdml6U2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8Vml6U2VydmljZT4oU2VydmljZU5hbWVzLlZpeik7XG5cbiAgICByZXR1cm4gdml6U2VydmljZS5jcmVhdGVWaXpJbWFnZUFzeW5jKGlucHV0U3BlYyk7XG4gIH1cblxuICBwdWJsaWMgc2V0Q2xpY2tUaHJvdWdoQXN5bmMoY2xpY2tUaHJvdWdoRW5hYmxlZDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHVpU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8VUlTZXJ2aWNlPihFeHRlbnNpb25zU2VydmljZU5hbWVzLlVJU2VydmljZSk7XG5cbiAgICByZXR1cm4gdWlTZXJ2aWNlLnNldENsaWNrVGhyb3VnaEFzeW5jKGNsaWNrVGhyb3VnaEVuYWJsZWQsIHRoaXMuZXh0ZW5zaW9uWm9uZUlkKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNEYXNoYm9hcmRFeHRlbnNpb25Mb2NhdG9yKGxvY2F0b3I6IEV4dGVuc2lvbkxvY2F0b3IpOiBsb2NhdG9yIGlzIERhc2hib2FyZEV4dGVuc2lvbkxvY2F0b3Ige1xuICAgIGNvbnN0IGRhc2hib2FyZEV4dGVuc2lvbkxvY2F0b3IgPSBsb2NhdG9yIGFzIERhc2hib2FyZEV4dGVuc2lvbkxvY2F0b3I7XG4gICAgaWYgKCFkYXNoYm9hcmRFeHRlbnNpb25Mb2NhdG9yLmRhc2hib2FyZFBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnVW5leHBlY3RlZCBlcnJvciBkdXJpbmcgaW5pdGlhbGl6YXRpb24uJyk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkRpc3BhdGNoZXJSZWNlaXZlZChcbiAgICBkaXNwYXRjaGVyRmFjdG9yeTogSW50ZXJuYWxBcGlEaXNwYXRjaGVyRmFjdG9yeSxcbiAgICBpc0V4dGVuc2lvbkRpYWxvZzogYm9vbGVhbixcbiAgICBjb250ZXh0TWVudUZ1bmN0aW9ucz86IENhbGxiYWNrTWFwLFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGxldCBkaXNwYXRjaGVyOiBJbnRlcm5hbEFwaURpc3BhdGNoZXIgPSBkaXNwYXRjaGVyRmFjdG9yeShJTlRFUk5BTF9DT05UUkFDVF9WRVJTSU9OKTtcblxuICAgIC8vIENhbGwgdG8gcmVnaXN0ZXIgYWxsIHRoZSBzZXJ2aWNlcyB3aGljaCB3aWxsIHVzZSB0aGUgbmV3bHkgaW5pdGlhbGl6ZWQgZGlzcGF0Y2hlclxuICAgIHJlZ2lzdGVySW5pdGlhbGl6YXRpb25FeHRlbnNpb25zU2VydmljZXMoZGlzcGF0Y2hlcik7XG5cbiAgICAvLyBHZXQgdGhlIGluaXRpYWxpemF0aW9uIHNlcnZpY2UgYW5kIGluaXRpYWxpemUgdGhpcyBleHRlbnNpb25cbiAgICBjb25zdCBpbml0aWFsaXphdGlvblNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEluaXRpYWxpemF0aW9uU2VydmljZT4oXG4gICAgICBFeHRlbnNpb25zU2VydmljZU5hbWVzLkluaXRpYWxpemF0aW9uU2VydmljZSxcbiAgICApO1xuXG4gICAgY29uc3QgY2FsbGJhY2tNYXBLZXlzID0gY29udGV4dE1lbnVGdW5jdGlvbnMgPyBPYmplY3Qua2V5cyhjb250ZXh0TWVudUZ1bmN0aW9ucykgOiBbXTtcbiAgICByZXR1cm4gaW5pdGlhbGl6YXRpb25TZXJ2aWNlLmluaXRpYWxpemVEYXNoYm9hcmRFeHRlbnNpb25zQXN5bmMoaXNFeHRlbnNpb25EaWFsb2csIGNhbGxiYWNrTWFwS2V5cykudGhlbjxzdHJpbmc+KChyZXN1bHQpID0+IHtcbiAgICAgIC8vIElmIHdlIHJlY2VpdmUgYW4gaW52YWxpZCBwbGFmb3JtIHZlcnNpb24sIHRoaXMgbWVhbnMgdGhhdCBwbGF0Zm9ybSBpcyBydW5ubmluZyAxLjQgb3IgMi4xIGFuZFxuICAgICAgLy8gZG9lc24ndCBwYXNzIHRoZSBwbGF0Zm9ybSB2ZXJzaW9uIHRvIGV4dGVybmFsLiBJbiB0aGlzIGNhc2Ugd2UgYXNzdW1lIHRoZSBwbGF0Zm9ybSB2ZXJzaW9uIHRvIGJlIDEuOVxuICAgICAgY29uc3QgcGxhdGZvcm1WZXJzaW9uID0gcmVzdWx0LmV4dGVuc2lvbkVudmlyb25tZW50LnBsYXRmb3JtVmVyc2lvblxuICAgICAgICA/IHJlc3VsdC5leHRlbnNpb25FbnZpcm9ubWVudC5wbGF0Zm9ybVZlcnNpb25cbiAgICAgICAgOiB7IG1ham9yOiAxLCBtaW5vcjogOSwgZml4OiAwIH07XG5cbiAgICAgIC8vIFdyYXAgb3VyIGV4aXN0aW5nIGRpc3BhdGNoZXIgaW4gYSBkaXNwYXRjaGVyIHRoYXQgY2FuIGRvd25ncmFkZS91cGdyYWRlIGZvciBhbiBvbGRlciBwbGF0Zm9ybS5cbiAgICAgIGlmIChWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIubmVlZHNWZXJzaW9uQ29udmVydGVyKHBsYXRmb3JtVmVyc2lvbikpIHtcbiAgICAgICAgZGlzcGF0Y2hlciA9IG5ldyBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIoZGlzcGF0Y2hlciwgcGxhdGZvcm1WZXJzaW9uKTtcbiAgICAgIH1cbiAgICAgIC8vIFJlZ2lzdHJhdGlvbiBvZiBzZXJ2aWNlcyBtdXN0IGhhcHBlbiBiZWZvcmUgaW5pdGlhbGl6aW5nIGNvbnRlbnQgYW5kIGVudmlyb25tZW50XG4gICAgICAvLyBFeHRlbnNpb25zIGRvZXNuJ3QgbmVlZCB0byBwYXNzIGluIGEgcmVnaXN0cnlJZC4gQnkgZGVmYXVsdCwgdGhlIHNlcnZpY2UgcmVnaXN0cnkgaW5zdGFuY2UgaXMgYXNzb2NpYXRlZCB3aXRoIHJlZ2lzdHJ5SWQ9MC5cbiAgICAgIHJlZ2lzdGVyQWxsU2hhcmVkU2VydmljZXMoZGlzcGF0Y2hlciwgRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpO1xuICAgICAgcmVnaXN0ZXJBbGxFeHRlbnNpb25zU2VydmljZXMoZGlzcGF0Y2hlcik7XG5cbiAgICAgIGlmIChyZXN1bHQuZXh0ZW5zaW9uRGFzaGJvYXJkSW5mbyAmJiB0aGlzLmlzRGFzaGJvYXJkRXh0ZW5zaW9uTG9jYXRvcihyZXN1bHQuZXh0ZW5zaW9uSW5zdGFuY2UubG9jYXRvcikpIHtcbiAgICAgICAgdGhpcy5kYXNoYm9hcmRDb250ZW50ID0gdGhpcy5pbml0aWFsaXplRGFzaGJvYXJkQ29udGVudChcbiAgICAgICAgICByZXN1bHQuZXh0ZW5zaW9uRGFzaGJvYXJkSW5mbyxcbiAgICAgICAgICByZXN1bHQuZXh0ZW5zaW9uSW5zdGFuY2UubG9jYXRvci5kYXNoYm9hcmRQYXRoLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmV4dGVuc2lvblpvbmVJZCA9IHJlc3VsdC5leHRlbnNpb25EYXNoYm9hcmRJbmZvLmV4dGVuc2lvblpvbmVJZDtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc3VsdC5leHRlbnNpb25Xb3Jrc2hlZXRJbmZvKSB7XG4gICAgICAgIHRoaXMud29ya3NoZWV0Q29udGVudCA9IHRoaXMuaW5pdGlhbGl6ZVdvcmtzaGVldENvbnRlbnQocmVzdWx0LmV4dGVuc2lvbldvcmtzaGVldEluZm8pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmVudmlyb25tZW50ID0gbmV3IEVudmlyb25tZW50KHJlc3VsdC5leHRlbnNpb25FbnZpcm9ubWVudCk7XG4gICAgICB0aGlzLnNldHRpbmdzID0gdGhpcy5pbml0aWFsaXplU2V0dGluZ3MocmVzdWx0LmV4dGVuc2lvblNldHRpbmdzSW5mbyk7XG4gICAgICB0aGlzLnVpID0gbmV3IFVJKG5ldyBVSUltcGwoKSk7XG4gICAgICB0aGlzLndvcmtib29rID0gbmV3IFdvcmtib29rKG5ldyBFeHRlbnNpb25Xb3JrYm9va0ltcGwoKSk7XG5cbiAgICAgIGlmIChyZXN1bHQuZXh0ZW5zaW9uRW52aXJvbm1lbnQud29ya2Jvb2tGb3JtYXR0aW5nKSB7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZVRhYmxlYXVGb250cyhkaXNwYXRjaGVyLCByZXN1bHQuZXh0ZW5zaW9uRW52aXJvbm1lbnQud29ya2Jvb2tGb3JtYXR0aW5nKTtcbiAgICAgICAgdGhpcy5hcHBseUFsbEZvcm1hdHRpbmcocmVzdWx0LmV4dGVuc2lvbkVudmlyb25tZW50Lndvcmtib29rRm9ybWF0dGluZyk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFmdGVyIGluaXRpYWxpemF0aW9uIGhhcyBjb21wbGV0ZWQsIHNldHVwIGxpc3RlbmVycyBmb3IgdGhlIGNhbGxiYWNrIGZ1bmN0aW9ucyB0aGF0XG4gICAgICAvLyBhcmUgbWVhbnQgdG8gYmUgdHJpZ2dlcmVkIHdoZW5ldmVyIGEgY29udGV4dCBtZW51IGl0ZW0gaXMgY2xpY2tlZC5cbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUNvbnRleHRNZW51Q2FsbGJhY2tzKGNvbnRleHRNZW51RnVuY3Rpb25zKTtcblxuICAgICAgLy8gQWxzbyBzZXQgdXAgbGlzdGVuZXJzIGZvciBFeHRlbnNpb25TdHlsZXNDaGFuZ2VkRXZlbnRcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZVdvcmtib29rRm9ybWF0dGluZ0NoYW5nZWRFdmVudENhbGxiYWNrKGRpc3BhdGNoZXIpO1xuXG4gICAgICAvLyBJbiB0aGUgbm9ybWFsIGluaXRpYWxpemF0aW9uIGNhc2UsIHRoaXMgd2lsbCBiZSBhbiBlbXB0eSBzdHJpbmcuICBXaGVuIHJldHVybmluZyBmcm9tIGluaXRpYWxpemVBc3luYyB0byB0aGVcbiAgICAgIC8vIGRldmVsb3Blciwgd2UganVzdCBpbmdvcmUgdGhhdCBzdHJpbmcuICBJbiB0aGUgY2FzZSBvZiBpbml0aWFsaXppbmcgZnJvbSBhbiBleHRlbnNpb24gZGlhbG9nLCB0aGlzIHN0cmluZ1xuICAgICAgLy8gaXMgYW4gb3B0aW9uYWwgcGF5bG9hZCBzZW50IGZyb20gdGhlIHBhcmVudCBleHRlbnNpb24uXG4gICAgICByZXR1cm4gcmVzdWx0LmV4dGVuc2lvbkRpYWxvZ1BheWxvYWQ7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlBbGxGb3JtYXR0aW5nKGZvcm1hdHRpbmdNb2RlbDogV29ya2Jvb2tGb3JtYXR0aW5nIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9zdHlsZUVsZW1lbnQpIHtcbiAgICAgIHRoaXMuX3N0eWxlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICB0aGlzLl9zdHlsZUVsZW1lbnQuaWQgPSAnVGFibGVhdS1FeHRlbnNpb24tRm9ybWF0dGluZyc7XG4gICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHRoaXMuX3N0eWxlRWxlbWVudCk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9zdHlsZUVsZW1lbnQuc2hlZXQgfHwgIWZvcm1hdHRpbmdNb2RlbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHN0eWxlc2hlZXQ6IENTU1N0eWxlU2hlZXQgPSB0aGlzLl9zdHlsZUVsZW1lbnQuc2hlZXQgYXMgQ1NTU3R5bGVTaGVldDtcbiAgICB3aGlsZSAoc3R5bGVzaGVldC5jc3NSdWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICBzdHlsZXNoZWV0LmRlbGV0ZVJ1bGUoc3R5bGVzaGVldC5jc3NSdWxlcy5sZW5ndGggLSAxKTtcbiAgICB9XG4gICAgZm9ybWF0dGluZ01vZGVsLmZvcm1hdHRpbmdTaGVldHMubWFwKChjdXJyZW50Rm9ybWF0dGluZ1NoZWV0KSA9PiB7XG4gICAgICB0aGlzLmFwcGx5Rm9ybWF0dGluZ1NoZWV0VG9TdHlsZVNoZWV0KGN1cnJlbnRGb3JtYXR0aW5nU2hlZXQsIHN0eWxlc2hlZXQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseUZvcm1hdHRpbmdTaGVldFRvU3R5bGVTaGVldChjdXJyZW50Rm9ybWF0dGluZ1NoZWV0OiBGb3JtYXR0aW5nU2hlZXQsIHN0eWxlc2hlZXQ6IENTU1N0eWxlU2hlZXQpOiB2b2lkIHtcbiAgICBsZXQgc3R5bGVJbmZvID0gJyc7XG5cbiAgICBjb25zdCBjc3NQcm9wZXJ0aWVzID0gY3VycmVudEZvcm1hdHRpbmdTaGVldC5jc3NQcm9wZXJ0aWVzO1xuICAgIGlmIChjc3NQcm9wZXJ0aWVzLmZvbnRGYW1pbHkpIHtcbiAgICAgIHN0eWxlSW5mbyArPSAnZm9udC1mYW1pbHk6ICcgKyBjc3NQcm9wZXJ0aWVzLmZvbnRGYW1pbHkudG9TdHJpbmcoKSArICc7ICc7XG4gICAgfVxuXG4gICAgaWYgKGNzc1Byb3BlcnRpZXMuZm9udFNpemUpIHtcbiAgICAgIHN0eWxlSW5mbyArPSAnZm9udC1zaXplOiAnICsgY3NzUHJvcGVydGllcy5mb250U2l6ZS50b1N0cmluZygpICsgJzsgJztcbiAgICB9XG5cbiAgICBpZiAoY3NzUHJvcGVydGllcy5mb250V2VpZ2h0KSB7XG4gICAgICBzdHlsZUluZm8gKz0gJ2ZvbnQtd2VpZ2h0OiAnICsgY3NzUHJvcGVydGllcy5mb250V2VpZ2h0LnRvU3RyaW5nKCkgKyAnOyAnO1xuICAgIH1cblxuICAgIGlmIChjc3NQcm9wZXJ0aWVzLmZvbnRTdHlsZSkge1xuICAgICAgc3R5bGVJbmZvICs9ICdmb250LXN0eWxlOiAnICsgY3NzUHJvcGVydGllcy5mb250U3R5bGUudG9TdHJpbmcoKSArICc7ICc7XG4gICAgfVxuXG4gICAgaWYgKGNzc1Byb3BlcnRpZXMudGV4dERlY29yYXRpb24pIHtcbiAgICAgIHN0eWxlSW5mbyArPSAndGV4dC1kZWNvcmF0aW9uOiAnICsgY3NzUHJvcGVydGllcy50ZXh0RGVjb3JhdGlvbi50b1N0cmluZygpICsgJzsgJztcbiAgICB9XG5cbiAgICBpZiAoY3NzUHJvcGVydGllcy5jb2xvcikge1xuICAgICAgc3R5bGVJbmZvICs9ICdjb2xvcjogJyArIGNzc1Byb3BlcnRpZXMuY29sb3IgKyAnOyAnO1xuICAgIH1cblxuICAgIGNvbnN0IHNlbGVjdG9yOiBzdHJpbmcgPSAnLicgKyBjdXJyZW50Rm9ybWF0dGluZ1NoZWV0LmNsYXNzTmFtZUtleTtcbiAgICBjb25zdCBydWxlOiBzdHJpbmcgPSBzZWxlY3RvciArICcgeyAnICsgc3R5bGVJbmZvICsgJyB9JztcbiAgICBzdHlsZXNoZWV0Lmluc2VydFJ1bGUocnVsZSwgc3R5bGVzaGVldC5jc3NSdWxlcy5sZW5ndGgpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50Q2FsbGJhY2soZGlzcGF0Y2hlcjogSW50ZXJuYWxBcGlEaXNwYXRjaGVyKTogdm9pZCB7XG4gICAgY29uc3Qgbm90aWZpY2F0aW9uU2VydmljZTogTm90aWZpY2F0aW9uU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8Tm90aWZpY2F0aW9uU2VydmljZT4oXG4gICAgICBTZXJ2aWNlTmFtZXMuTm90aWZpY2F0aW9uLFxuICAgICk7XG4gICAgLy8gVW5yZWdpc3RlciBmdW5jdGlvbiBub3QgdXNlZCBzaW5jZSB0aGVzZSBub3RpZmljYXRpb25zIHNob3VsZCBiZVxuICAgIC8vIG9ic2VydmVkIGZvciB0aGUgZnVsbCBsaWZldGltZSBvZiB0aGUgZXh0ZW5zaW9uLlxuICAgIG5vdGlmaWNhdGlvblNlcnZpY2UucmVnaXN0ZXJIYW5kbGVyKFxuICAgICAgTm90aWZpY2F0aW9uSWQuV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZCxcbiAgICAgICgpID0+IHRydWUsXG4gICAgICAoZXZlbnRGb3JtYXR0aW5nOiBXb3JrYm9va0Zvcm1hdHRpbmcpID0+IHtcbiAgICAgICAgaWYgKGV2ZW50Rm9ybWF0dGluZykge1xuICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZVRhYmxlYXVGb250cyhkaXNwYXRjaGVyLCBldmVudEZvcm1hdHRpbmcpO1xuICAgICAgICAgIHRoaXMuYXBwbHlBbGxGb3JtYXR0aW5nKGV2ZW50Rm9ybWF0dGluZyk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZVRhYmxlYXVGb250cyhkaXNwYXRjaGVyOiBJbnRlcm5hbEFwaURpc3BhdGNoZXIsIHdvcmtib29rRm9ybWF0dGluZzogV29ya2Jvb2tGb3JtYXR0aW5nKTogdm9pZCB7XG4gICAgY29uc3QgZm9udE5hbWVzOiBNb2RlbFtdID0gWy4uLlN1cHBvcnRlZEJlbnRvblNhbnNGb250RmFjZXMsIC4uLlN1cHBvcnRlZFRhYmxlYXVGb250RmFjZXNdO1xuICAgIHdvcmtib29rRm9ybWF0dGluZy5mb3JtYXR0aW5nU2hlZXRzLmZvckVhY2goKGZvcm1hdHRpbmdTaGVldCkgPT4ge1xuICAgICAgaWYgKGZvcm1hdHRpbmdTaGVldC5jc3NQcm9wZXJ0aWVzLmZvbnRGYW1pbHkpIHtcbiAgICAgICAgZm9udE5hbWVzLnB1c2goZm9ybWF0dGluZ1NoZWV0LmNzc1Byb3BlcnRpZXMuZm9udEZhbWlseSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoZm9udE5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0geyBbUGFyYW1ldGVySWQuRm9udE5hbWVMaXN0SXRlbXNdOiBmb250TmFtZXMgfTtcbiAgICAgIGRpc3BhdGNoZXJcbiAgICAgICAgLmV4ZWN1dGUoVmVyYklkLkdldEZvbnRzLCBwYXJhbWV0ZXJzKVxuICAgICAgICAudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICB0aGlzLmxvYWRGb250cyhyZXNwb25zZS5yZXN1bHQgYXMgQXJyYXk8Rm9udE5hbWVBbmRJbmZvPik7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbG9hZEZvbnRzKGZvbnRzOiBBcnJheTxGb250TmFtZUFuZEluZm8+KTogdm9pZCB7XG4gICAgZm9udHMuZm9yRWFjaCgoZm9udE5hbWVBbmRJbmZvKSA9PiB7XG4gICAgICBpZiAoU3VwcG9ydGVkVGFibGVhdUZvbnRGYWNlcy5pbmNsdWRlcyhmb250TmFtZUFuZEluZm8uZm9udE5hbWUpKSB7XG4gICAgICAgIHRoaXMubG9hZFRhYmxlYXVGb250cyhmb250TmFtZUFuZEluZm8pO1xuICAgICAgfSBlbHNlIGlmIChTdXBwb3J0ZWRCZW50b25TYW5zRm9udEZhY2VzLmluY2x1ZGVzKGZvbnROYW1lQW5kSW5mby5mb250TmFtZSkpIHtcbiAgICAgICAgdGhpcy5sb2FkQmVudG9uU2Fuc0ZvbnRzKGZvbnROYW1lQW5kSW5mbyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQobmV3IEZvbnRGYWNlKGZvbnROYW1lQW5kSW5mby5mb250TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVEYXNoYm9hcmRDb250ZW50KGluZm86IEV4dGVuc2lvbkRhc2hib2FyZEluZm8sIHNoZWV0UGF0aDogU2hlZXRQYXRoKTogRGFzaGJvYXJkQ29udGVudCB7XG4gICAgLy8gc2hlZXRzIGFyZSBhbHdheXMgYWN0aXZlIGZvciBFeHRlbnNpb25zXG4gICAgY29uc3Qgc2hlZXRJbmZvSW1wbCA9IG5ldyBTaGVldEluZm9JbXBsKGluZm8ubmFtZSwgU2hlZXRUeXBlLkRhc2hib2FyZCwgeyB3aWR0aDogaW5mby5zaXplLncsIGhlaWdodDogaW5mby5zaXplLmggfSwgdW5kZWZpbmVkLCB0cnVlKTtcbiAgICBjb25zdCBkYXNoYm9hcmRJbXBsID0gbmV3IERhc2hib2FyZEltcGwoc2hlZXRJbmZvSW1wbCwgaW5mby56b25lcywgc2hlZXRQYXRoLCBFeHRlbnNpb25zUmVnaXN0cnlJZCwgbnVsbCwgaW5mby5hY3RpdmVEYXNoYm9hcmRPYmplY3RJZCk7XG4gICAgY29uc3QgZGFzaGJvYXJkID0gbmV3IERhc2hib2FyZChkYXNoYm9hcmRJbXBsKTtcbiAgICByZXR1cm4gbmV3IERhc2hib2FyZENvbnRlbnQoZGFzaGJvYXJkKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZVdvcmtzaGVldENvbnRlbnQoaW5mbzogRXh0ZW5zaW9uV29ya3NoZWV0SW5mbyk6IFdvcmtzaGVldENvbnRlbnQge1xuICAgIGNvbnN0IHNoZWV0SW5mb0ltcGwgPSBuZXcgU2hlZXRJbmZvSW1wbChcbiAgICAgIGluZm8udmlzdWFsSWQud29ya3NoZWV0LFxuICAgICAgU2hlZXRUeXBlLldvcmtzaGVldCxcbiAgICAgIHsgd2lkdGg6IGluZm8uc2l6ZS53LCBoZWlnaHQ6IGluZm8uc2l6ZS5oIH0sXG4gICAgICB1bmRlZmluZWQsIC8vIGluZGV4IHByb3BlcnR5IGlzIGVtYmVkZGluZyBzcGVjaWZpY1xuICAgICAgdHJ1ZSwgLy8gc2hlZXRzIGFyZSBhbHdheXMgYWN0aXZlIGZvciBFeHRlbnNpb25zXG4gICAgKTtcblxuICAgIGNvbnN0IHdvcmtzaGVldEltcGwgPSBuZXcgV29ya3NoZWV0SW1wbChcbiAgICAgIHNoZWV0SW5mb0ltcGwsXG4gICAgICBFeHRlbnNpb25zUmVnaXN0cnlJZCxcbiAgICAgIGluZm8udmlzdWFsSWQsXG4gICAgICBudWxsLCAvLyBwYXJlbnREYXNoYm9hcmQgaXMgYWx3YXlzIG51bGwgZm9yIHdvcmtzaGVldCBpbiBXb3Jrc2hlZXRDb250ZW50XG4gICAgICBudWxsLCAvLyBwYXJlbnRTdG9yeVBvaW50IGlzIG9ubHkgdXNlZCBmb3IgZW1iZWRkaW5nXG4gICAgICBpbmZvLmJhY2tncm91bmRDb2xvcixcbiAgICAgIFdvcmtib29rRm9ybWF0dGluZ0VudlV0aWwuY29udmVydFRvV29ya2Jvb2tGb3JtYXR0aW5nKGluZm8uZm9ybWF0dGluZyksXG4gICAgKTtcbiAgICBjb25zdCB3b3Jrc2hlZXQgPSBuZXcgV29ya3NoZWV0KHdvcmtzaGVldEltcGwpO1xuICAgIHJldHVybiBuZXcgV29ya3NoZWV0Q29udGVudCh3b3Jrc2hlZXQpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplU2V0dGluZ3Moc2V0dGluZ3NJbmZvOiBFeHRlbnNpb25TZXR0aW5nc0luZm8pOiBTZXR0aW5ncyB7XG4gICAgY29uc3Qgc2V0dGluZ3NJbXBsID0gbmV3IFNldHRpbmdzSW1wbChzZXR0aW5nc0luZm8pO1xuICAgIHJldHVybiBuZXcgU2V0dGluZ3Moc2V0dGluZ3NJbXBsKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUNvbnRleHRNZW51Q2FsbGJhY2tzKGNvbnRleHRNZW51RnVuY3Rpb25zPzogQ2FsbGJhY2tNYXApOiB2b2lkIHtcbiAgICBjb25zdCBub3RpZmljYXRpb25TZXJ2aWNlOiBOb3RpZmljYXRpb25TZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxOb3RpZmljYXRpb25TZXJ2aWNlPihcbiAgICAgIFNlcnZpY2VOYW1lcy5Ob3RpZmljYXRpb24sXG4gICAgKTtcblxuICAgIC8vIFVucmVnaXN0ZXIgZnVuY3Rpb24gbm90IHVzZWQgc2luY2UgdGhlc2Ugbm90aWZpY2F0aW9ucyBzaG91bGQgYmVcbiAgICAvLyBvYnNlcnZlZCBmb3IgdGhlIGZ1bGwgbGlmZXRpbWUgb2YgdGhlIGV4dGVuc2lvbi5cbiAgICBub3RpZmljYXRpb25TZXJ2aWNlLnJlZ2lzdGVySGFuZGxlcihcbiAgICAgIE5vdGlmaWNhdGlvbklkLkNvbnRleHRNZW51Q2xpY2ssXG4gICAgICAoKSA9PiB7XG4gICAgICAgIC8vIExldCB0aHJvdWdoIGFueSBjb250ZXh0IG1lbnUgZXZlbnQsIHRoZXNlIGFyZSBhbHJlYWR5IGZpbHRlcmVkIG9uIGFwaS1jb3JlXG4gICAgICAgIC8vIGJhc2VkIG9uIHRoZSBleHRlbnNpb24gbG9jYXRvci5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9LFxuICAgICAgKGV2ZW50OiBDb250ZXh0TWVudUV2ZW50KSA9PiB7XG4gICAgICAgIC8vIEV4ZWN1dGUgdGhlIGZ1bmN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbnRleHQgbWVudSBJRFxuICAgICAgICBpZiAoY29udGV4dE1lbnVGdW5jdGlvbnMpIHtcbiAgICAgICAgICBpZiAoIWNvbnRleHRNZW51RnVuY3Rpb25zW2V2ZW50LmlkXSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludGVybmFsRXJyb3IsIGBSZWNlaXZlZCB1bmV4cGVjdGVkIGNvbnRleHQgbWVudSBJZCBmcm9tIGV2ZW50OiAke2V2ZW50LmlkfWApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnRleHRNZW51RnVuY3Rpb25zW2V2ZW50LmlkXSgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGxvYWRUYWJsZWF1Rm9udHMoZm9udE5hbWVBbmRJbmZvOiBGb250TmFtZUFuZEluZm8pOiB2b2lkIHtcbiAgICBzd2l0Y2ggKGZvbnROYW1lQW5kSW5mby5mb250TmFtZSkge1xuICAgICAgY2FzZSBUYWJsZWF1Qm9va0ZvbnRGYWNlTmFtZTpcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKG5ldyBGb250RmFjZShUYWJsZWF1Qm9va0ZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnbm9ybWFsJywgc3R5bGU6ICdub3JtYWwnIH0pKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVGFibGVhdUxpZ2h0Rm9udEZhY2VOYW1lOlxuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQobmV3IEZvbnRGYWNlKFRhYmxlYXVMaWdodEZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnbm9ybWFsJywgc3R5bGU6ICdub3JtYWwnIH0pKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVGFibGVhdVJlZ3VsYXJGb250RmFjZU5hbWU6XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChcbiAgICAgICAgICBuZXcgRm9udEZhY2UoVGFibGVhdVJlZ3VsYXJGb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHdlaWdodDogJ25vcm1hbCcsIHN0eWxlOiAnbm9ybWFsJyB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVGFibGVhdVNlbWlCb2xkRm9udEZhY2VOYW1lOlxuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQoXG4gICAgICAgICAgbmV3IEZvbnRGYWNlKFRhYmxlYXVTZW1pYm9sZEZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnbm9ybWFsJywgc3R5bGU6ICdub3JtYWwnIH0pLFxuICAgICAgICApO1xuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQobmV3IEZvbnRGYWNlKFRhYmxlYXVSZWd1bGFyRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdib2xkJywgc3R5bGU6ICdub3JtYWwnIH0pKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVGFibGVhdUJvbGRGb250RmFjZU5hbWU6XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChuZXcgRm9udEZhY2UoVGFibGVhdUJvbGRGb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHdlaWdodDogJ25vcm1hbCcsIHN0eWxlOiAnbm9ybWFsJyB9KSk7XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChuZXcgRm9udEZhY2UoVGFibGVhdUJvbGRGb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHdlaWdodDogJ2JvbGQnLCBzdHlsZTogJ25vcm1hbCcgfSkpO1xuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQobmV3IEZvbnRGYWNlKFRhYmxlYXVNZWRpdW1Gb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHdlaWdodDogJ2JvbGQnLCBzdHlsZTogJ25vcm1hbCcgfSkpO1xuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQoXG4gICAgICAgICAgbmV3IEZvbnRGYWNlKFRhYmxlYXVTZW1pYm9sZEZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnYm9sZCcsIHN0eWxlOiAnbm9ybWFsJyB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVGFibGVhdU1lZGl1bUZvbnRGYWNlTmFtZTpcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKFxuICAgICAgICAgIG5ldyBGb250RmFjZShUYWJsZWF1TWVkaXVtRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdub3JtYWwnLCBzdHlsZTogJ25vcm1hbCcgfSksXG4gICAgICAgICk7XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChuZXcgRm9udEZhY2UoVGFibGVhdUxpZ2h0Rm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdib2xkJywgc3R5bGU6ICdub3JtYWwnIH0pKTtcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKG5ldyBGb250RmFjZShUYWJsZWF1Qm9va0ZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnYm9sZCcsIHN0eWxlOiAnbm9ybWFsJyB9KSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYCdhdHRlbXB0ZWQgdG8gbG9hZCB1bnN1cHBvcnRlZCBmb250OiAke2ZvbnROYW1lQW5kSW5mby5mb250TmFtZX0uJ2ApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbG9hZEJlbnRvblNhbnNGb250cyhmb250TmFtZUFuZEluZm86IEZvbnROYW1lQW5kSW5mbyk6IHZvaWQge1xuICAgIHN3aXRjaCAoZm9udE5hbWVBbmRJbmZvLmZvbnROYW1lKSB7XG4gICAgICBjYXNlIEJlbnRvblNhbnNCb29rRm9udEZhY2VOYW1lOlxuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQobmV3IEZvbnRGYWNlKEJlbnRvblNhbnNGb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHdlaWdodDogJ25vcm1hbCcsIHN0eWxlOiAnbm9ybWFsJyB9KSk7XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChcbiAgICAgICAgICBuZXcgRm9udEZhY2UoQmVudG9uU2Fuc0xvd0RQSUZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnMTAwJywgc3R5bGU6ICdub3JtYWwnIH0pLFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBCZW50b25TYW5zTGlnaHRGb250RmFjZU5hbWU6XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChuZXcgRm9udEZhY2UoQmVudG9uU2Fuc0ZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnMTAwJywgc3R5bGU6ICdub3JtYWwnIH0pKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgQmVudG9uU2Fuc01lZGl1bUZvbnRGYWNlTmFtZTpcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKG5ldyBGb250RmFjZShCZW50b25TYW5zRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdib2xkJywgc3R5bGU6ICdub3JtYWwnIH0pKTtcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKFxuICAgICAgICAgIG5ldyBGb250RmFjZShCZW50b25TYW5zTG93RFBJRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdib2xkJywgc3R5bGU6ICdub3JtYWwnIH0pLFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBCZW50b25TYW5zU2VtaURlbWlGb250RmFjZU5hbWU6XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChcbiAgICAgICAgICBuZXcgRm9udEZhY2UoQmVudG9uU2Fuc0xvd0RQSUZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnbm9ybWFsJywgc3R5bGU6ICdub3JtYWwnIH0pLFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBCZW50b25TYW5zQm9va0l0YWxpY0ZvbnRGYWNlTmFtZTpcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKG5ldyBGb250RmFjZShCZW50b25TYW5zRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyBzdHlsZTogJ2l0YWxpYycgfSkpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBCZW50b25TYW5zU2VtaURlbWlJdGFsaWNGb250RmFjZU5hbWU6XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChuZXcgRm9udEZhY2UoQmVudG9uU2Fuc0xvd0RQSUZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgc3R5bGU6ICdpdGFsaWMnIH0pKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgJ2F0dGVtcHRlZCB0byBsb2FkIHVuc3VwcG9ydGVkIGZvbnQ6ICR7Zm9udE5hbWVBbmRJbmZvLmZvbnROYW1lfS4nYCk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBJbml0aWFsaXphdGlvbk9wdGlvbnMsIEludGVybmFsQXBpRGlzcGF0Y2hlckZhY3RvcnksIElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT04sIFZlcmJJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbi8qKlxuICogTGVnYWN5SW50ZXJuYWxBcGlEaXNwYXRjaGVySG9sZGVyIGhhcyBiZWVuIG1vdmVkIChhbmQgcmVuYW1lZCkgZnJvbSBhcGktaW50ZXJuYWwtY29udHJhY3QuXG4gKiBJdCBzdXBwb3J0cyBydW5uaW5nIGEgbmV3ZXIgZXh0ZXJuYWwgbGlicmFyeSBhZ2FpbnN0IGEgcHJlIDIwMTkuMyBkZXNrdG9wLlxuICogU3RhcnRpbmcgaW4gMjAxOS4zLCB3ZSBoYXZlIGEgbWVyZ2VkIGJvb3RzdHJhcCBzdHlsZSBmb3IgYm90aCBkZXNrdG9wIGFuZCBzZXJ2ZXIuXG4gKiBJbiBhZGRpdGlvbiwgdGhlIGFscGhhIGNoZWNraW5nIHRoYXQgaXMgaGFwcGVuaW5nIGhlcmUgaXMgbm90IG5lY2Vzc2FyeSBpbiBleHRlcm5hbC1hcGktanNcbiAqICBhZnRlciAyMDE5LjMgYmVjYXVzZSB0aGF0IGNoZWNraW5nIGhhcHBlbnMgaW4gYXBpLXBsYXRmb3JtLWpzIChBcGlEaXNwYXRjaGVyVGVzdC50cylcbiAqIFRGU0lEOiAxMDkxNTYxIHRyYWNrcyBhbiBpbXByb3ZlbWVudCB0byB0aGlzIHN5c3RlbSB0byBtYWtlIGl0IGxlc3MgY29tcGxleCBhbmQgdGllIGl0IGRpcmVjdGx5IHRvXG4gKiAgdGFibGVhdSBiZXRhIHJlbGVhc2UgdmVyc2lvbnMuXG4gKiBAZGVwcmVjYXRlZFxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5hbWVzcGFjZVxuZXhwb3J0IG5hbWVzcGFjZSBMZWdhY3lJbnRlcm5hbEFwaURpc3BhdGNoZXJIb2xkZXIge1xuICAvKipcbiAgICogQHBhcmFtIG9wdGlvbnNcbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiBnZXREZXNrdG9wRGlzcGF0Y2hlclByb21pc2Uob3B0aW9ucz86IEluaXRpYWxpemF0aW9uT3B0aW9ucyk6IFByb21pc2U8SW50ZXJuYWxBcGlEaXNwYXRjaGVyRmFjdG9yeT4gfCB1bmRlZmluZWQge1xuICAgIGlmICgoIW9wdGlvbnMgfHwgdHlwZW9mIG9wdGlvbnMuaXNBbHBoYSA9PT0gJ3VuZGVmaW5lZCcpICYmICF3aW5kb3cuX193YXJuaW5nSXNzdWVkKSB7XG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKCdUaGlzIGlzIGEgYmV0YSB2ZXJzaW9uIG9mIHRoZSBFeHRlbnNpb25zIEFQSS4gUGxlYXNlIHVwZ3JhZGUgdG8gYW4gb2ZmaWNpYWwgcmVsZWFzZS4nKTtcbiAgICAgIHdpbmRvdy5fX3dhcm5pbmdJc3N1ZWQgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAob3B0aW9ucz8uaXNBbHBoYSAmJiB3aW5kb3cuX19wbGF0Zm9ybUlzT2ZmaWNpYWxSZWxlYXNlKSB7XG4gICAgICB3aW5kb3cuX190YWJsZWF1RGVza3RvcERpc3BhdGNoZXJcbiAgICAgICAgLnRoZW4oKGRpc3BhdGNoZXJGYWN0b3J5KSA9PiB7XG4gICAgICAgICAgY29uc3QgZGlzcGF0Y2hlciA9IGRpc3BhdGNoZXJGYWN0b3J5KElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT04pO1xuICAgICAgICAgIGRpc3BhdGNoZXIuZXhlY3V0ZShWZXJiSWQuQmxvY2tFeHRlbnNpb24sIHt9KS5jYXRjaCgpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKTtcbiAgICB9XG5cbiAgICAvLyB0aGlzIHdpbGwgYmUgdW5kZWZpbmVkIGlmIHByb21pc2UgaXMgcmVqZWN0ZWQgb3IgdGhyb3dzXG4gICAgcmV0dXJuIHdpbmRvdy5fX3RhYmxlYXVEZXNrdG9wRGlzcGF0Y2hlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgKi9cbiAgZXhwb3J0IGZ1bmN0aW9uIGhhc0Rlc2t0b3BBcGlEaXNwYXRjaGVyUHJvbWlzZShvcHRpb25zPzogSW5pdGlhbGl6YXRpb25PcHRpb25zKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhZ2V0RGVza3RvcERpc3BhdGNoZXJQcm9taXNlKG9wdGlvbnMpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgX190YWJsZWF1RGVza3RvcERpc3BhdGNoZXI6IFByb21pc2U8SW50ZXJuYWxBcGlEaXNwYXRjaGVyRmFjdG9yeT47XG4gICAgX19wbGF0Zm9ybUlzT2ZmaWNpYWxSZWxlYXNlOiBib29sZWFuO1xuICAgIF9fd2FybmluZ0lzc3VlZDogYm9vbGVhbjtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEV4dGVuc2lvblNldHRpbmdzSW5mbywgTm90aWZpY2F0aW9uSWQsIFNldHRpbmdzRXZlbnQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LFxuICBFcnJvckhlbHBlcnMsXG4gIE5vdGlmaWNhdGlvblNlcnZpY2UsXG4gIFNlcnZpY2VOYW1lcyxcbiAgU2luZ2xlRXZlbnRNYW5hZ2VyLFxuICBTaW5nbGVFdmVudE1hbmFnZXJJbXBsLFxuICBUYWJsZWF1RXJyb3IsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgVGFibGVhdUV2ZW50IH0gZnJvbSAnLi4vRXZlbnRzL1RhYmxlYXVFdmVudCc7XG5pbXBvcnQgeyBFeHRlbnNpb25zU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZXMvRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcyc7XG5pbXBvcnQgeyBFeHRlbnNpb25zUmVnaXN0cnlJZCB9IGZyb20gJy4uL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeVV0aWwnO1xuaW1wb3J0IHsgU2V0dGluZ3NDb2xsZWN0aW9uLCBTZXR0aW5nc1NlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXR0aW5nc1NlcnZpY2UnO1xuXG5jbGFzcyBTZXR0aW5nc0NoYW5nZWRFdmVudCBleHRlbmRzIFRhYmxlYXVFdmVudCBpbXBsZW1lbnRzIENvbnRyYWN0LlNldHRpbmdzQ2hhbmdlZEV2ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX25ld1NldHRpbmdzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9KSB7XG4gICAgc3VwZXIoQ29udHJhY3QuVGFibGVhdUV2ZW50VHlwZS5TZXR0aW5nc0NoYW5nZWQpO1xuICB9XG5cbiAgcHVibGljIGdldCBuZXdTZXR0aW5ncygpOiBTZXR0aW5nc0NvbGxlY3Rpb24ge1xuICAgIHJldHVybiB0aGlzLl9uZXdTZXR0aW5ncztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU2V0dGluZ3NJbXBsIHtcbiAgcHJpdmF0ZSBzdGF0aWMgQVNZTkNfU0FWRV9JTl9QUk9HUkVTUyA9ICdBc3luYyBTYXZlIGlzIGluIHByb2dyZXNzLCB1cGRhdGluZyBzZXR0aW5ncyBpcyBub3QgYWxsb3dlZC4nO1xuICBwcml2YXRlIF9pc01vZGlmaWVkOiBib29sZWFuO1xuICBwcml2YXRlIF9jdXJyZW50U2V0dGluZ3M6IFNldHRpbmdzQ29sbGVjdGlvbjtcblxuICAvLyBTaW5jZSBwcm9taXNlcyBjYW4ndCBiZSBpbnRyb3NwZWN0ZWQgZm9yIHN0YXRlLCBrZWVwIGEgdmFyaWFibGUgdGhhdFxuICAvLyBpbmRpY2F0ZXMgYSBzYXZlIGlzIGluIHByb2dyZXNzLCBzbyB0aGF0IHNldC9lcmFzZSBjYW4ndCBiZSBjYWxsZWQgZHVyaW5nIGEgc2F2ZS5cbiAgcHJpdmF0ZSBfc2F2ZUluUHJvZ3Jlc3MgPSBmYWxzZTtcblxuICBwdWJsaWMgY29uc3RydWN0b3Ioc2V0dGluZ3NJbmZvOiBFeHRlbnNpb25TZXR0aW5nc0luZm8pIHtcbiAgICB0aGlzLmluaXRpYWxpemVTZXR0aW5ncyhzZXR0aW5nc0luZm8pO1xuICB9XG5cbiAgcHVibGljIGVyYXNlKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihrZXksICdrZXknKTtcblxuICAgIC8vIE9ubHkgbWFrZSBhIG1vZGlmaWNhdGlvbiBpZiB3ZSBoYXZlIHRoZSBrZXkgYWxyZWFkeVxuICAgIGlmICh0aGlzLl9jdXJyZW50U2V0dGluZ3Nba2V5XSkge1xuICAgICAgdGhpcy52ZXJpZnlTZXR0aW5nc0FyZVVubG9ja2VkKCk7XG5cbiAgICAgIGRlbGV0ZSB0aGlzLl9jdXJyZW50U2V0dGluZ3Nba2V5XTtcbiAgICAgIHRoaXMuX2lzTW9kaWZpZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQoa2V5OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIoa2V5LCAna2V5Jyk7XG5cbiAgICByZXR1cm4gdGhpcy5fY3VycmVudFNldHRpbmdzW2tleV07XG4gIH1cblxuICBwdWJsaWMgZ2V0QWxsKCk6IFNldHRpbmdzQ29sbGVjdGlvbiB7XG4gICAgLy8gUmV0dXJucyBhIG11dGFibGUgY29weSBvZiB0aGUgc2V0dGluZ3NcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fY3VycmVudFNldHRpbmdzKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNNb2RpZmllZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNNb2RpZmllZDtcbiAgfVxuXG4gIHB1YmxpYyBzYXZlQXN5bmMoKTogUHJvbWlzZTxTZXR0aW5nc0NvbGxlY3Rpb24+IHtcbiAgICB0aGlzLnZlcmlmeVNldHRpbmdzQXJlVW5sb2NrZWQoKTtcblxuICAgIC8vIEp1c3QgcmVzb2x2ZSBpbW1lZGlhdGVseSBpZiBzZXR0aW5ncyBhcmUgdW5jaGFuZ2VkXG4gICAgaWYgKCF0aGlzLl9pc01vZGlmaWVkKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlPFNldHRpbmdzQ29sbGVjdGlvbj4odGhpcy5fY3VycmVudFNldHRpbmdzKTtcbiAgICB9XG5cbiAgICB0aGlzLl9zYXZlSW5Qcm9ncmVzcyA9IHRydWU7XG5cbiAgICAvLyBVc2UgdGhlIHNldHRpbmdzIHNlcnZpY2UgdG8gc2F2ZSBzZXR0aW5ncyB0byB0d2JcbiAgICBjb25zdCBzZXR0aW5nc1NlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFNldHRpbmdzU2VydmljZT4oXG4gICAgICBFeHRlbnNpb25zU2VydmljZU5hbWVzLlNldHRpbmdzU2VydmljZSxcbiAgICApO1xuXG4gICAgcmV0dXJuIHNldHRpbmdzU2VydmljZS5zYXZlU2V0dGluZ3NBc3luYyh0aGlzLl9jdXJyZW50U2V0dGluZ3MpLnRoZW48U2V0dGluZ3NDb2xsZWN0aW9uPihcbiAgICAgIChuZXdTZXR0aW5ncykgPT4ge1xuICAgICAgICB0aGlzLl9zYXZlSW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9pc01vZGlmaWVkID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLl9jdXJyZW50U2V0dGluZ3MgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMuX2N1cnJlbnRTZXR0aW5ncyA9IG5ld1NldHRpbmdzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5fY3VycmVudFNldHRpbmdzLCBuZXdTZXR0aW5ncyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ld1NldHRpbmdzO1xuICAgICAgfSxcbiAgICAgIChyZWFzb24pID0+IHtcbiAgICAgICAgdGhpcy5fc2F2ZUluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHJlYXNvbik7XG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVN0cmluZ1BhcmFtZXRlcihrZXksICdrZXknKTsgLy8gS2V5IHNob3VsZG4ndCBiZSBhbiBlbXB0eSBzdHJpbmcuXG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcih2YWx1ZSwgJ3ZhbHVlJyk7IC8vIEVtcHR5IHN0cmluZyB2YWx1ZSBpcyBhbGxvd2VkLlxuICAgIHRoaXMudmVyaWZ5U2V0dGluZ3NBcmVVbmxvY2tlZCgpO1xuXG4gICAgdGhpcy5fY3VycmVudFNldHRpbmdzW2tleV0gPSB2YWx1ZTtcbiAgICB0aGlzLl9pc01vZGlmaWVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyBhbGwgZXZlbnRzIHJlbGV2YW50IHRvIHNldHRpbmdzIG9iamVjdC4gIFRoaXMgaXMgb25seSBhIHNldHRpbmdzVXBkYXRlIGV2ZW50IGN1cnJlbnRseS5cbiAgICpcbiAgICogQHJldHVybnMge0FycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj59IENvbGxlY3Rpb24gb2YgZXZlbnQgbWFuYWdlcnMgdG8gcGFzcyB0byBhbiBFdmVudExpc3RlbmVyTWFuYWdlci5cbiAgICovXG4gIHB1YmxpYyBpbml0aWFsaXplRXZlbnRzKCk6IEFycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj4ge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBuZXcgQXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPigpO1xuICAgIGxldCBub3RpZmljYXRpb25TZXJ2aWNlOiBOb3RpZmljYXRpb25TZXJ2aWNlO1xuXG4gICAgdHJ5IHtcbiAgICAgIG5vdGlmaWNhdGlvblNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPE5vdGlmaWNhdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5Ob3RpZmljYXRpb24pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgdGhpcyBzZXJ2aWNlIHJlZ2lzdGVyZWQsIGp1c3QgcmV0dXJuXG4gICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9XG5cbiAgICBjb25zdCBzZXR0aW5nc0NoYW5nZWRFdmVudCA9IG5ldyBTaW5nbGVFdmVudE1hbmFnZXJJbXBsPFNldHRpbmdzQ2hhbmdlZEV2ZW50PihDb250cmFjdC5UYWJsZWF1RXZlbnRUeXBlLlNldHRpbmdzQ2hhbmdlZCk7XG4gICAgbm90aWZpY2F0aW9uU2VydmljZS5yZWdpc3RlckhhbmRsZXIoXG4gICAgICBOb3RpZmljYXRpb25JZC5TZXR0aW5nc0NoYW5nZWQsXG4gICAgICAoKSA9PiB0cnVlLFxuICAgICAgKGV2ZW50OiBTZXR0aW5nc0V2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRTZXR0aW5ncyA9IGV2ZW50Lm5ld1NldHRpbmdzO1xuICAgICAgICBzZXR0aW5nc0NoYW5nZWRFdmVudC50cmlnZ2VyRXZlbnQoKCkgPT4gbmV3IFNldHRpbmdzQ2hhbmdlZEV2ZW50KGV2ZW50Lm5ld1NldHRpbmdzKSk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICByZXN1bHRzLnB1c2goc2V0dGluZ3NDaGFuZ2VkRXZlbnQpO1xuXG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVTZXR0aW5ncyhzZXR0aW5nc0luZm86IEV4dGVuc2lvblNldHRpbmdzSW5mbyk6IHZvaWQge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIoc2V0dGluZ3NJbmZvLCAnc2V0dGluZ3NJbmZvJyk7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihzZXR0aW5nc0luZm8uc2V0dGluZ3NWYWx1ZXMsICdzZXR0aW5nc0luZm8uU2V0dGluZ3NWYWx1ZXMnKTtcblxuICAgIHRoaXMuX2N1cnJlbnRTZXR0aW5ncyA9IHNldHRpbmdzSW5mby5zZXR0aW5nc1ZhbHVlcztcblxuICAgIC8vIFJlc2V0IHRoZSBpc01vZGlmaWVkIGZsYWdcbiAgICB0aGlzLl9pc01vZGlmaWVkID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBoZWxwZXIgc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgYW55IGxvY2FsIHVwZGF0ZSB0byB0aGlzLmN1cnJlbnRTZXR0aW5ncy5cbiAgICogQ2hlY2tzIGlmIGEgY3VycmVudCBzYXZlIGNhbGwgaXMgc3RpbGwgaW4gcHJvZ3Jlc3MgYW5kIHRocm93cyBhbiBlcnJvciBpZiBzby5cbiAgICovXG4gIHByaXZhdGUgdmVyaWZ5U2V0dGluZ3NBcmVVbmxvY2tlZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fc2F2ZUluUHJvZ3Jlc3MpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRXJyb3JDb2Rlcy5TZXR0aW5nU2F2ZUluUHJvZ3Jlc3MsIFNldHRpbmdzSW1wbC5BU1lOQ19TQVZFX0lOX1BST0dSRVNTKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IE1vZGVsIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuZXhwb3J0IGNvbnN0IFRhYmxlYXVCb29rRm9udEZhbWlseU5hbWUgPSAnVGFibGVhdSBCb29rJztcbmV4cG9ydCBjb25zdCBUYWJsZWF1TGlnaHRGb250RmFtaWx5TmFtZSA9ICdUYWJsZWF1IExpZ2h0JztcbmV4cG9ydCBjb25zdCBUYWJsZWF1UmVndWxhckZvbnRGYW1pbHlOYW1lID0gJ1RhYmxlYXUgUmVndWxhcic7XG5leHBvcnQgY29uc3QgVGFibGVhdU1lZGl1bUZvbnRGYW1pbHlOYW1lID0gJ1RhYmxlYXUgTWVkaXVtJztcbmV4cG9ydCBjb25zdCBUYWJsZWF1U2VtaWJvbGRGb250RmFtaWx5TmFtZSA9ICdUYWJsZWF1IFNlbWlib2xkJztcbmV4cG9ydCBjb25zdCBUYWJsZWF1Qm9sZEZvbnRGYW1pbHlOYW1lID0gJ1RhYmxlYXUgQm9sZCc7XG5cbmV4cG9ydCBjb25zdCBUYWJsZWF1Qm9va0ZvbnRGYWNlTmFtZSA9ICdUYWJsZWF1IEJvb2snO1xuZXhwb3J0IGNvbnN0IFRhYmxlYXVCb2xkRm9udEZhY2VOYW1lID0gJ1RhYmxlYXUgQm9sZCc7XG5leHBvcnQgY29uc3QgVGFibGVhdUxpZ2h0Rm9udEZhY2VOYW1lID0gJ1RhYmxlYXUgTGlnaHQnO1xuZXhwb3J0IGNvbnN0IFRhYmxlYXVNZWRpdW1Gb250RmFjZU5hbWUgPSAnVGFibGVhdSBNZWRpdW0nO1xuZXhwb3J0IGNvbnN0IFRhYmxlYXVSZWd1bGFyRm9udEZhY2VOYW1lID0gJ1RhYmxlYXUgUmVndWxhcic7XG5leHBvcnQgY29uc3QgVGFibGVhdVNlbWlCb2xkRm9udEZhY2VOYW1lID0gJ1RhYmxlYXUgU2VtaSBCb2xkJztcblxuZXhwb3J0IGNvbnN0IFN1cHBvcnRlZFRhYmxlYXVGb250RmFjZXM6IE1vZGVsW10gPSBbXG4gIFRhYmxlYXVCb29rRm9udEZhY2VOYW1lLFxuICBUYWJsZWF1Qm9sZEZvbnRGYWNlTmFtZSxcbiAgVGFibGVhdUxpZ2h0Rm9udEZhY2VOYW1lLFxuICBUYWJsZWF1TWVkaXVtRm9udEZhY2VOYW1lLFxuICBUYWJsZWF1UmVndWxhckZvbnRGYWNlTmFtZSxcbiAgVGFibGVhdVNlbWlCb2xkRm9udEZhY2VOYW1lLFxuXTtcbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFcnJvckNvZGVzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IERpYWxvZ1VwZGF0ZUV2ZW50LCBOb3RpZmljYXRpb25JZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBBcGlTZXJ2aWNlUmVnaXN0cnksIE5vdGlmaWNhdGlvblNlcnZpY2UsIFNlcnZpY2VOYW1lcywgVGFibGVhdUVycm9yIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBFeHRlbnNpb25zU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZXMvRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcyc7XG5pbXBvcnQgeyBFeHRlbnNpb25zUmVnaXN0cnlJZCB9IGZyb20gJy4uL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeVV0aWwnO1xuaW1wb3J0IHsgVUlTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvVUlTZXJ2aWNlJztcblxuZXhwb3J0IGNsYXNzIFVJSW1wbCB7XG4gIHB1YmxpYyBkaXNwbGF5RGlhbG9nQXN5bmModXJsOiBzdHJpbmcsIHBheWxvYWQ/OiBzdHJpbmcsIG9wdGlvbnM/OiBDb250cmFjdC5EaWFsb2dPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB1aVNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFVJU2VydmljZT4oRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcy5VSVNlcnZpY2UpO1xuICAgIGNvbnN0IG5vdGlmaWNhdGlvblNlcnZpY2U6IE5vdGlmaWNhdGlvblNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPE5vdGlmaWNhdGlvblNlcnZpY2U+KFxuICAgICAgU2VydmljZU5hbWVzLk5vdGlmaWNhdGlvbixcbiAgICApO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHVpU2VydmljZVxuICAgICAgICAuZGlzcGxheURpYWxvZ0FzeW5jKHVybCwgcGF5bG9hZCB8fCAnJywgb3B0aW9ucylcbiAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHVucmVnaXN0ZXJGbiA9IG5vdGlmaWNhdGlvblNlcnZpY2UucmVnaXN0ZXJIYW5kbGVyKFxuICAgICAgICAgICAgTm90aWZpY2F0aW9uSWQuRXh0ZW5zaW9uRGlhbG9nVXBkYXRlLFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAvLyBMZXQgdGhyb3VnaCBhbnkgZGlhbG9nIHVwZGF0ZSBldmVudFxuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoZXZlbnQ6IERpYWxvZ1VwZGF0ZUV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgIGlmIChldmVudC5pc0Nsb3NlRXZlbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQuY2xvc2VQYXlsb2FkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnY2xvc2VQYXlsb2FkIGlzIHVuZGVmaW5lZCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXNvbHZlKGV2ZW50LmNsb3NlUGF5bG9hZCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5EaWFsb2dDbG9zZWRCeVVzZXIsICdFeHRlbnNpb24gZGlhbG9nIGNsb3NlZCBieSB1c2VyLicpKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHVucmVnaXN0ZXJGbigpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICApO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgY2xvc2VEaWFsb2cocGF5bG9hZD86IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHVpU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8VUlTZXJ2aWNlPihFeHRlbnNpb25zU2VydmljZU5hbWVzLlVJU2VydmljZSk7XG5cbiAgICB1aVNlcnZpY2UuY2xvc2VEaWFsb2cocGF5bG9hZCk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRMYXlvdXRDaGFuZ2VEZXRhaWxzLCBUYWJsZWF1RXZlbnRUeXBlLCBXb3JrYm9va0Zvcm1hdHRpbmcgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkTGF5b3V0RXZlbnQsIE5vdGlmaWNhdGlvbklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeSxcbiAgRGFzaGJvYXJkSW1wbCxcbiAgRGFzaGJvYXJkT2JqZWN0SW1wbCxcbiAgTm90aWZpY2F0aW9uU2VydmljZSxcbiAgU2VydmljZU5hbWVzLFxuICBTaW5nbGVFdmVudE1hbmFnZXIsXG4gIFNpbmdsZUV2ZW50TWFuYWdlckltcGwsXG4gIFdvcmtzaGVldEltcGwsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZEV2ZW50IH0gZnJvbSAnLi4vRXZlbnRzL0Rhc2hib2FyZExheW91dENoYW5nZWRFdmVudCc7XG5pbXBvcnQgeyBXb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkRXZlbnQgfSBmcm9tICcuLi9FdmVudHMvV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50JztcbmltcG9ydCB7IEV4dGVuc2lvbnNSZWdpc3RyeUlkIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5VXRpbCc7XG5pbXBvcnQgeyBEYXNoYm9hcmRPYmplY3QgfSBmcm9tICcuL0Rhc2hib2FyZE9iamVjdCc7XG5pbXBvcnQgeyBTaGVldCB9IGZyb20gJy4vU2hlZXQnO1xuaW1wb3J0IHsgV29ya3NoZWV0IH0gZnJvbSAnLi9Xb3Jrc2hlZXQnO1xuXG5leHBvcnQgY2xhc3MgRGFzaGJvYXJkIGV4dGVuZHMgU2hlZXQgaW1wbGVtZW50cyBDb250cmFjdC5FeHRlbnNpb25EYXNoYm9hcmQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfZGFzaGJvYXJkSW1wbDogRGFzaGJvYXJkSW1wbCkge1xuICAgIHN1cGVyKF9kYXNoYm9hcmRJbXBsKTtcbiAgICBfZGFzaGJvYXJkSW1wbC5pbml0aWFsaXplV2l0aFB1YmxpY0ludGVyZmFjZXMoKTtcbiAgICB0aGlzLmluaXRpYWxpemVFdmVudHMoKS5mb3JFYWNoKChlKSA9PiB0aGlzLmFkZE5ld0V2ZW50VHlwZShlKSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHdvcmtzaGVldHMoKTogQXJyYXk8Q29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0PiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZEltcGwud29ya3NoZWV0c0ltcGwubWFwKCh3b3Jrc2hlZXRJbXBsOiBXb3Jrc2hlZXRJbXBsKSA9PiB7XG4gICAgICByZXR1cm4gbmV3IFdvcmtzaGVldCh3b3Jrc2hlZXRJbXBsKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgb2JqZWN0cygpOiBBcnJheTxDb250cmFjdC5FeHRlbnNpb25EYXNoYm9hcmRPYmplY3Q+IHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkSW1wbC5vYmplY3RzLm1hcCgoZGFzaGJvYXJkT2JqZWN0SW1wbDogRGFzaGJvYXJkT2JqZWN0SW1wbCkgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBEYXNoYm9hcmRPYmplY3QoZGFzaGJvYXJkT2JqZWN0SW1wbCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFjdGl2ZURhc2hib2FyZE9iamVjdElkKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZEltcGwuYWN0aXZlRGFzaGJvYXJkT2JqZWN0SWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFjdGl2ZURhc2hib2FyZE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkSW1wbC5hY3RpdmVEYXNoYm9hcmROYW1lO1xuICB9XG5cbiAgcHVibGljIHNldFpvbmVWaXNpYmlsaXR5QXN5bmMoem9uZVZpc2liaWxpdHlNYXA6IENvbnRyYWN0LlpvbmVWaXNpYmlsaXR5TWFwKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZEltcGwuc2V0RGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eUFzeW5jKHpvbmVWaXNpYmlsaXR5TWFwKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXREYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5QXN5bmMoZGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eU1hcDogQ29udHJhY3QuRGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eU1hcCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRJbXBsLnNldERhc2hib2FyZE9iamVjdFZpc2liaWxpdHlBc3luYyhkYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5TWFwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXREYXNoYm9hcmRPYmplY3RCeUlkKGRhc2hib2FyZE9iamVjdElkOiBudW1iZXIpOiBEYXNoYm9hcmRPYmplY3QgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHpvbmUgPSB0aGlzLl9kYXNoYm9hcmRJbXBsLmdldERhc2hib2FyZE9iamVjdEJ5SWQoZGFzaGJvYXJkT2JqZWN0SWQpO1xuICAgIHJldHVybiB6b25lICYmIG5ldyBEYXNoYm9hcmRPYmplY3Qoem9uZSk7XG4gIH1cblxuICBwdWJsaWMgaW5pdGlhbGl6ZUV2ZW50cygpOiBBcnJheTxTaW5nbGVFdmVudE1hbmFnZXI+IHtcbiAgICBjb25zdCByZXN1bHRzID0gbmV3IEFycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj4oKTtcblxuICAgIC8vIEluaXRpYWxpemluZyBldmVudHMgYW5kIHJlZ2lzdGVyaW5nIG5vdGlmaWNhdGlvbiBzZXJ2aWNlXG4gICAgbGV0IG5vdGlmaWNhdGlvblNlcnZpY2U6IE5vdGlmaWNhdGlvblNlcnZpY2U7XG5cbiAgICB0cnkge1xuICAgICAgbm90aWZpY2F0aW9uU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8Tm90aWZpY2F0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLk5vdGlmaWNhdGlvbik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSB0aGlzIHNlcnZpY2UgcmVnaXN0ZXJlZCwganVzdCByZXR1cm4gKGFsbG93cyB1bml0IHRlc3Rpbmcgd2l0aG91dCBOb3RpZmljYXRpb25TZXJ2aWNlIG1vY2spXG4gICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9XG5cbiAgICBjb25zdCBkYXNoYm9hcmRMYXlvdXRDaGFuZ2VkRXZlbnQgPSBuZXcgU2luZ2xlRXZlbnRNYW5hZ2VySW1wbDxEYXNoYm9hcmRMYXlvdXRDaGFuZ2VkRXZlbnQ+KFRhYmxlYXVFdmVudFR5cGUuRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZCk7XG4gICAgbm90aWZpY2F0aW9uU2VydmljZS5yZWdpc3RlckhhbmRsZXIoXG4gICAgICBOb3RpZmljYXRpb25JZC5EYXNoYm9hcmRMYXlvdXRDaGFuZ2VkLFxuICAgICAgKCkgPT4gdHJ1ZSxcbiAgICAgIChldmVudDogRGFzaGJvYXJkTGF5b3V0RXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgZGFzaGJvYXJkT2JqZWN0Q2hhbmdlczogRGFzaGJvYXJkTGF5b3V0Q2hhbmdlRGV0YWlscyA9IHRoaXMuX2Rhc2hib2FyZEltcGwudXBkYXRlWm9uZXMoXG4gICAgICAgICAgZXZlbnQuem9uZXMsXG4gICAgICAgICAgZXZlbnQuYWN0aXZlWm9uZUlkLFxuICAgICAgICAgIGV2ZW50LmFjdGl2ZURhc2hib2FyZE5hbWUsXG4gICAgICAgICk7XG4gICAgICAgIGRhc2hib2FyZExheW91dENoYW5nZWRFdmVudC50cmlnZ2VyRXZlbnQoKCkgPT4gbmV3IERhc2hib2FyZExheW91dENoYW5nZWRFdmVudChkYXNoYm9hcmRPYmplY3RDaGFuZ2VzKSk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICByZXN1bHRzLnB1c2goZGFzaGJvYXJkTGF5b3V0Q2hhbmdlZEV2ZW50KTtcblxuICAgIGNvbnN0IHdvcmtib29rRm9ybWF0dGluZ0NoYW5nZWRFdmVudCA9IG5ldyBTaW5nbGVFdmVudE1hbmFnZXJJbXBsPFdvcmtib29rRm9ybWF0dGluZ0NoYW5nZWRFdmVudD4oXG4gICAgICBUYWJsZWF1RXZlbnRUeXBlLldvcmtib29rRm9ybWF0dGluZ0NoYW5nZWQsXG4gICAgKTtcblxuICAgIG5vdGlmaWNhdGlvblNlcnZpY2UucmVnaXN0ZXJIYW5kbGVyKFxuICAgICAgTm90aWZpY2F0aW9uSWQuV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZCxcbiAgICAgICgpID0+IHRydWUsXG4gICAgICAoZXZlbnRGb3JtYXR0aW5nOiBXb3JrYm9va0Zvcm1hdHRpbmcpID0+IHtcbiAgICAgICAgd29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50LnRyaWdnZXJFdmVudCgoKSA9PiBuZXcgV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50KGV2ZW50Rm9ybWF0dGluZykpO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgcmVzdWx0cy5wdXNoKHdvcmtib29rRm9ybWF0dGluZ0NoYW5nZWRFdmVudCk7XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIHB1YmxpYyBtb3ZlQW5kUmVzaXplRGFzaGJvYXJkT2JqZWN0c0FzeW5jKFxuICAgIGRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUFycmF5OiBDb250cmFjdC5EYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGVBcnJheSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZEltcGwubW92ZUFuZFJlc2l6ZURhc2hib2FyZE9iamVjdHNBc3luYyhkYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGVBcnJheSk7XG4gIH1cblxuICBwdWJsaWMgcmVwbGF5QW5pbWF0aW9uQXN5bmMocmVwbGF5U3BlZWQ6IENvbnRyYWN0LlJlcGxheVNwZWVkVHlwZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRJbXBsLnJlcGxheUFuaW1hdGlvbkFzeW5jKHJlcGxheVNwZWVkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRGaWx0ZXJzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5GaWx0ZXI+PiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZEltcGwuZ2V0RmlsdGVyc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlGaWx0ZXJBc3luYyhcbiAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZXM6IEFycmF5PHN0cmluZz4sXG4gICAgdXBkYXRlVHlwZTogQ29udHJhY3QuRmlsdGVyVXBkYXRlVHlwZSxcbiAgICBvcHRpb25zOiBDb250cmFjdC5GaWx0ZXJPcHRpb25zLFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRJbXBsLmFwcGx5RmlsdGVyQXN5bmMoZmllbGROYW1lLCB2YWx1ZXMsIHVwZGF0ZVR5cGUsIG9wdGlvbnMpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkT2JqZWN0SW1wbCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkIH0gZnJvbSAnLi9EYXNoYm9hcmQnO1xuaW1wb3J0IHsgV29ya3NoZWV0IH0gZnJvbSAnLi9Xb3Jrc2hlZXQnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBkYXNoYm9hcmQgb2JqZWN0cyAtIHRoZSB6b25lcyBpbiBhIGRhc2hib2FyZC5cbiAqL1xuZXhwb3J0IGNsYXNzIERhc2hib2FyZE9iamVjdCBpbXBsZW1lbnRzIENvbnRyYWN0LkV4dGVuc2lvbkRhc2hib2FyZE9iamVjdCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9kYXNoYm9hcmRPYmplY3RJbXBsOiBEYXNoYm9hcmRPYmplY3RJbXBsKSB7fVxuXG4gIHB1YmxpYyBnZXQgZGFzaGJvYXJkKCk6IENvbnRyYWN0LkV4dGVuc2lvbkRhc2hib2FyZCB7XG4gICAgcmV0dXJuIG5ldyBEYXNoYm9hcmQodGhpcy5fZGFzaGJvYXJkT2JqZWN0SW1wbC5kYXNoYm9hcmRJbXBsKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdHlwZSgpOiBDb250cmFjdC5EYXNoYm9hcmRPYmplY3RUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkT2JqZWN0SW1wbC50eXBlO1xuICB9XG5cbiAgcHVibGljIGdldCBwb3NpdGlvbigpOiBDb250cmFjdC5Qb2ludCB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZE9iamVjdEltcGwucG9zaXRpb247XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNpemUoKTogQ29udHJhY3QuU2l6ZSB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZE9iamVjdEltcGwuc2l6ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgd29ya3NoZWV0KCk6IENvbnRyYWN0LkV4dGVuc2lvbldvcmtzaGVldCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuX2Rhc2hib2FyZE9iamVjdEltcGwud29ya3NoZWV0SW1wbCkge1xuICAgICAgcmV0dXJuIG5ldyBXb3Jrc2hlZXQodGhpcy5fZGFzaGJvYXJkT2JqZWN0SW1wbC53b3Jrc2hlZXRJbXBsKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRPYmplY3RJbXBsLm5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzRmxvYXRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZE9iamVjdEltcGwuaXNGbG9hdGluZztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNWaXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRPYmplY3RJbXBsLmlzVmlzaWJsZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkT2JqZWN0SW1wbC5pZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmllbGRJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRPYmplY3RJbXBsLmZpZWxkSWQ7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25JZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBBcGlTZXJ2aWNlUmVnaXN0cnksXG4gIEVycm9ySGVscGVycyxcbiAgRXZlbnRMaXN0ZW5lck1hbmFnZXIsXG4gIE5vdGlmaWNhdGlvblNlcnZpY2UsXG4gIFBhcmFtZXRlckltcGwsXG4gIFNlcnZpY2VOYW1lcyxcbiAgU2luZ2xlRXZlbnRNYW5hZ2VyLFxuICBTaW5nbGVFdmVudE1hbmFnZXJJbXBsLFxufSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IFBhcmFtZXRlckNoYW5nZWRFdmVudCB9IGZyb20gJy4uL0V2ZW50cy9QYXJhbWV0ZXJDaGFuZ2VkRXZlbnQnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnlVdGlsJztcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgUGFyYW1ldGVyIGNvbnRyYWN0LiBDYWxscyBkb3duIHRvIHRoZSBpbXBsXG4gKiBjbGFzcyBmb3IgYWxtb3N0IGFsbCBvZiB0aGUgd29yayBpdCBkb2VzLlxuICovXG5leHBvcnQgY2xhc3MgUGFyYW1ldGVyIGV4dGVuZHMgRXZlbnRMaXN0ZW5lck1hbmFnZXIgaW1wbGVtZW50cyBDb250cmFjdC5QYXJhbWV0ZXIge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBwYXJhbWV0ZXJJbXBsOiBQYXJhbWV0ZXJJbXBsLCBzaGVldDogQ29udHJhY3QuRXh0ZW5zaW9uU2hlZXQpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBvdXIgZXZlbnQgaGFuZGxpbmcgZm9yIHRoaXMgY2xhc3NcbiAgICB0aGlzLmluaXRpYWxpemVFdmVudHMoc2hlZXQpLmZvckVhY2goKGUpID0+IHRoaXMuYWRkTmV3RXZlbnRUeXBlKGUpKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBhcmFtZXRlckltcGwubmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY3VycmVudFZhbHVlKCk6IENvbnRyYWN0LkRhdGFWYWx1ZSB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1ldGVySW1wbC5jdXJyZW50VmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRhdGFUeXBlKCk6IENvbnRyYWN0LkRhdGFUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5wYXJhbWV0ZXJJbXBsLmRhdGFUeXBlO1xuICB9XG5cbiAgcHVibGljIGdldCBhbGxvd2FibGVWYWx1ZXMoKTogQ29udHJhY3QuUGFyYW1ldGVyRG9tYWluUmVzdHJpY3Rpb24ge1xuICAgIHJldHVybiB0aGlzLnBhcmFtZXRlckltcGwuYWxsb3dhYmxlVmFsdWVzO1xuICB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBhcmFtZXRlckltcGwuaWQ7XG4gIH1cblxuICBwdWJsaWMgY2hhbmdlVmFsdWVBc3luYyhuZXdWYWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IERhdGUpOiBQcm9taXNlPENvbnRyYWN0LkRhdGFWYWx1ZT4ge1xuICAgIHJldHVybiB0aGlzLnBhcmFtZXRlckltcGwuY2hhbmdlVmFsdWVBc3luYyhuZXdWYWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIG1ldGhvZCB3aGljaCBnb2VzIHRocm91Z2ggYW5kIHJlZ2lzdGVycyBlYWNoIGV2ZW50IHR5cGUgdGhpcyBpbXBsIGtub3dzIGFib3V0XG4gICAqIHdpdGggdGhlIE5vdGlmaWNhdGlvblNlcnZpY2UuIEl0IHJldHVybnMgYW4gYXJyYXkgb2YgU2luZ2xlRXZlbnRNYW5hZ2VyIG9iamVjdHMgd2hpY2hcbiAgICogY2FuIHRoZW4gYmUgcGFzc2VkIHRvIGFuIEV2ZW50TGlzdGVuZXJNYW5hZ2VyIHRvIGhhbmRsZSB1c2VyIHJlZ2lzdHJhdGlvbiAvIHVucmVnaXN0cmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gc2hlZXQgVGhlIHNoZWV0IG9iamVjdCB3aGljaCB3aWxsIGJlIGluY2x1ZGVkIHdpdGggdGhlIGV2ZW50IG5vdGlmaWNhdGlvbnNcbiAgICogQHJldHVybnMge0FycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj59IENvbGxlY3Rpb24gb2YgZXZlbnQgbWFuYWdlcnMgdG8gcGFzcyB0byBhbiBFdmVudExpc3RlbmVyTWFuYWdlclxuICAgKi9cbiAgcHVibGljIGluaXRpYWxpemVFdmVudHMoc2hlZXQ6IENvbnRyYWN0LkV4dGVuc2lvblNoZWV0KTogQXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUludGVybmFsVmFsdWUoc2hlZXQsICdzaGVldCcpO1xuXG4gICAgY29uc3QgcmVzdWx0cyA9IG5ldyBBcnJheTxTaW5nbGVFdmVudE1hbmFnZXI+KCk7XG4gICAgbGV0IG5vdGlmaWNhdGlvblNlcnZpY2U6IE5vdGlmaWNhdGlvblNlcnZpY2U7XG5cbiAgICB0cnkge1xuICAgICAgbm90aWZpY2F0aW9uU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8Tm90aWZpY2F0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLk5vdGlmaWNhdGlvbik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSB0aGlzIHNlcnZpY2UgcmVnaXN0ZXJlZCwganVzdCByZXR1cm5cbiAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH1cblxuICAgIC8vIEluaXRpYWxpemUgYWxsIG9mIHRoZSBldmVudCBtYW5hZ2VycyB3ZSdsbCBuZWVkIChvbmUgZm9yIGVhY2ggZXZlbnQgdHlwZSlcbiAgICBjb25zdCBwYXJhbWV0ZXJFdmVudCA9IG5ldyBTaW5nbGVFdmVudE1hbmFnZXJJbXBsPFBhcmFtZXRlckNoYW5nZWRFdmVudD4oQ29udHJhY3QuVGFibGVhdUV2ZW50VHlwZS5QYXJhbWV0ZXJDaGFuZ2VkKTtcbiAgICBub3RpZmljYXRpb25TZXJ2aWNlLnJlZ2lzdGVySGFuZGxlcihcbiAgICAgIE5vdGlmaWNhdGlvbklkLlBhcmFtZXRlckNoYW5nZWQsXG4gICAgICAobW9kZWwpID0+IHtcbiAgICAgICAgY29uc3QgZmllbGROYW1lID0gbW9kZWwgYXMgc3RyaW5nO1xuICAgICAgICByZXR1cm4gZmllbGROYW1lID09PSB0aGlzLnBhcmFtZXRlckltcGwuaWQ7XG4gICAgICB9LFxuICAgICAgKGZpZWxkTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHBhcmFtZXRlckV2ZW50LnRyaWdnZXJFdmVudCgoKSA9PiBuZXcgUGFyYW1ldGVyQ2hhbmdlZEV2ZW50KGZpZWxkTmFtZSwgc2hlZXQpKTtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIHJlc3VsdHMucHVzaChwYXJhbWV0ZXJFdmVudCk7XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEV2ZW50TGlzdGVuZXJNYW5hZ2VyLCBTaGVldEltcGwsIFRhYmxlYXVFcnJvciB9IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgUGFyYW1ldGVyIH0gZnJvbSAnLi9QYXJhbWV0ZXInO1xuXG5leHBvcnQgY2xhc3MgU2hlZXQgZXh0ZW5kcyBFdmVudExpc3RlbmVyTWFuYWdlciBpbXBsZW1lbnRzIENvbnRyYWN0LkV4dGVuc2lvblNoZWV0IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX3NoZWV0SW1wbDogU2hlZXRJbXBsKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zaGVldEltcGwubmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2hlZXRUeXBlKCk6IENvbnRyYWN0LlNoZWV0VHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWV0SW1wbC5zaGVldFR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNpemUoKTogQ29udHJhY3QuU2l6ZSB7XG4gICAgaWYgKHRoaXMuaXNWYWxpZFNpemUodGhpcy5fc2hlZXRJbXBsLnNpemUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc2hlZXRJbXBsLnNpemU7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLkltcGxlbWVudGF0aW9uRXJyb3IsICdTaXplIG5vdCBpbXBsZW1lbnRlZCcpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1ZhbGlkU2l6ZShzaXplOiBhbnkpOiBzaXplIGlzIENvbnRyYWN0LlNpemUge1xuICAgIGNvbnN0IHRlc3RTaXplID0gc2l6ZSBhcyBDb250cmFjdC5TaXplO1xuICAgIGlmICh0ZXN0U2l6ZS53aWR0aCAhPT0gdW5kZWZpbmVkICYmIHRlc3RTaXplLmhlaWdodCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgZmluZFBhcmFtZXRlckFzeW5jKHBhcmFtZXRlck5hbWU6IHN0cmluZyk6IFByb21pc2U8Q29udHJhY3QuUGFyYW1ldGVyIHwgdW5kZWZpbmVkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWV0SW1wbC5maW5kUGFyYW1ldGVyQXN5bmMocGFyYW1ldGVyTmFtZSkudGhlbigocGFyYW1ldGVySW1wbCkgPT4ge1xuICAgICAgaWYgKHBhcmFtZXRlckltcGwpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPENvbnRyYWN0LlBhcmFtZXRlcj4oKHJlc29sdmUpID0+IHJlc29sdmUobmV3IFBhcmFtZXRlcihwYXJhbWV0ZXJJbXBsLCB0aGlzKSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPHVuZGVmaW5lZD4oKHJlc29sdmUpID0+IHJlc29sdmUodW5kZWZpbmVkKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0UGFyYW1ldGVyc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuUGFyYW1ldGVyPj4ge1xuICAgIHJldHVybiB0aGlzLl9zaGVldEltcGwuZ2V0UGFyYW1ldGVyc0FzeW5jKCkudGhlbigocGFyYW1ldGVyc0ltcGwpID0+IHtcbiAgICAgIHJldHVybiBwYXJhbWV0ZXJzSW1wbC5tYXAoKHBhcmFtZXRlckltcGwpID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQYXJhbWV0ZXIocGFyYW1ldGVySW1wbCwgdGhpcyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEV4dGVuc2lvbldvcmtib29rSW1wbCB9IGZyb20gJy4uL0ltcGwvRXh0ZW5zaW9uV29ya2Jvb2tJbXBsJztcblxuZXhwb3J0IGNsYXNzIFdvcmtib29rIGltcGxlbWVudHMgQ29udHJhY3QuRXh0ZW5zaW9uV29ya2Jvb2sge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfd29ya2Jvb2tJbXBsOiBFeHRlbnNpb25Xb3JrYm9va0ltcGwpIHt9XG5cbiAgcHVibGljIGdldEFsbERhdGFTb3VyY2VzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5EYXRhU291cmNlPj4ge1xuICAgIHJldHVybiB0aGlzLl93b3JrYm9va0ltcGwuZ2V0QWxsRGF0YVNvdXJjZXNBc3luYygpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQ29sdW1uLFxuICBGaWx0ZXJVcGRhdGVUeXBlLFxuICBTZWxlY3Rpb25VcGRhdGVUeXBlLFxuICBUYWJsZWF1RXZlbnRUeXBlLFxuICBUb29sdGlwQ29udGV4dCxcbiAgV29ya3NoZWV0Rm9ybWF0dGluZyxcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEZpbHRlckV2ZW50LCBOb3RpZmljYXRpb25JZCwgU3VtbWFyeURhdGFFdmVudCwgVmlzdWFsSWQsIFdvcmtzaGVldEZvcm1hdHRpbmdFdmVudCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBBcGlTZXJ2aWNlUmVnaXN0cnksXG4gIE5vdGlmaWNhdGlvblNlcnZpY2UsXG4gIFNlcnZpY2VOYW1lcyxcbiAgU2luZ2xlRXZlbnRNYW5hZ2VyLFxuICBTaW5nbGVFdmVudE1hbmFnZXJJbXBsLFxuICBUYWJsZWF1RXJyb3IsXG4gIFdvcmtzaGVldEltcGwsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgRmlsdGVyQ2hhbmdlZEV2ZW50IH0gZnJvbSAnLi4vRXZlbnRzL0ZpbHRlckNoYW5nZWRFdmVudCc7XG5pbXBvcnQgeyBNYXJrc1NlbGVjdGVkRXZlbnQgfSBmcm9tICcuLi9FdmVudHMvTWFya3NTZWxlY3RlZEV2ZW50JztcbmltcG9ydCB7IFN1bW1hcnlEYXRhQ2hhbmdlZEV2ZW50IH0gZnJvbSAnLi4vRXZlbnRzL1N1bW1hcnlEYXRhQ2hhbmdlZEV2ZW50JztcbmltcG9ydCB7IFdvcmtzaGVldEZvcm1hdHRpbmdDaGFuZ2VkRXZlbnQgfSBmcm9tICcuLi9FdmVudHMvV29ya3NoZWV0Rm9ybWF0dGluZ0NoYW5nZWRFdmVudCc7XG5pbXBvcnQgeyBFeHRlbnNpb25zUmVnaXN0cnlJZCB9IGZyb20gJy4uL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeVV0aWwnO1xuaW1wb3J0IHsgRGFzaGJvYXJkIH0gZnJvbSAnLi9EYXNoYm9hcmQnO1xuaW1wb3J0IHsgU2hlZXQgfSBmcm9tICcuL1NoZWV0JztcblxuZXhwb3J0IGNsYXNzIFdvcmtzaGVldCBleHRlbmRzIFNoZWV0IGltcGxlbWVudHMgQ29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBfd29ya3NoZWV0SW1wbDogV29ya3NoZWV0SW1wbCkge1xuICAgIHN1cGVyKF93b3Jrc2hlZXRJbXBsKTtcblxuICAgIC8vIENhbGwgdG8gaW5pdGlhbGl6ZSBldmVudHMgYW5kIHRoZW4gY2FsbCBkb3duIHRvIHRoZSBldmVudCBsaXN0ZW5lciBtYW5hZ2VyIHRvIGhhbmRsZSB0aGluZ3NcbiAgICB0aGlzLmluaXRpYWxpemVFdmVudHMoKS5mb3JFYWNoKChlKSA9PiB0aGlzLmFkZE5ld0V2ZW50VHlwZShlKSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBhcmVudERhc2hib2FyZCgpOiBDb250cmFjdC5FeHRlbnNpb25EYXNoYm9hcmQge1xuICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiBmb3IgRXh0ZW5zaW9ucyBpZiB0aGUgRGFzaGJvYXJkSW1wbHMgYXJlIGNyZWF0ZWQgY29ycmVjdGx5XG4gICAgaWYgKHRoaXMuX3dvcmtzaGVldEltcGwucGFyZW50RGFzaGJvYXJkID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuU2hhcmVkRXJyb3JDb2Rlcy5JbXBsZW1lbnRhdGlvbkVycm9yLCBgUGFyZW50IGRhc2hib2FyZCBub3QgaW1wbGVtZW50ZWRgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IERhc2hib2FyZCh0aGlzLl93b3Jrc2hlZXRJbXBsLnBhcmVudERhc2hib2FyZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGJhY2tncm91bmRDb2xvcigpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLl93b3Jrc2hlZXRJbXBsLmJhY2tncm91bmRDb2xvciA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LlNoYXJlZEVycm9yQ29kZXMuSW1wbGVtZW50YXRpb25FcnJvciwgYFdvcmtzaGVldCBiYWNrZ3JvdW5kIGNvbG9yIGlzIG5vdCBhdmFpbGFibGVgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5iYWNrZ3JvdW5kQ29sb3I7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZvcm1hdHRpbmcoKTogV29ya3NoZWV0Rm9ybWF0dGluZyB7XG4gICAgaWYgKHRoaXMuX3dvcmtzaGVldEltcGwuZm9ybWF0dGluZyA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LlNoYXJlZEVycm9yQ29kZXMuSW1wbGVtZW50YXRpb25FcnJvciwgYFdvcmtzaGVldCBmb3JtYXR0aW5nIGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGVgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5mb3JtYXR0aW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciBtZXRob2Qgd2hpY2ggZ29lcyB0aHJvdWdoIGFuZCByZWdpc3RlcnMgZWFjaCBldmVudCB0eXBlIHRoaXMgaW1wbCBrbm93cyBhYm91dFxuICAgKiB3aXRoIHRoZSBOb3RpZmljYXRpb25TZXJ2aWNlLiBJdCByZXR1cm5zIGFuIGFycmF5IG9mIFNpbmdsZUV2ZW50TWFuYWdlciBvYmplY3RzIHdoaWNoXG4gICAqIGNhbiB0aGVuIGJlIHBhc3NlZCB0byBhbiBFdmVudExpc3RlbmVyTWFuYWdlciB0byBoYW5kbGUgdXNlciByZWdpc3RyYXRpb24gLyB1bnJlZ2lzdHJhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtXb3Jrc2hlZXR9IHdvcmtzaGVldCBUaGUgd29ya3NoZWV0IG9iamVjdCB3aGljaCB3aWxsIGJlIGluY2x1ZGVkIHdpdGggdGhlIGV2ZW50IG5vdGlmaWNhdGlvbnNcbiAgICogQHJldHVybnMge0FycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj59IENvbGxlY3Rpb24gb2YgZXZlbnQgbWFuYWdlcnMgdG8gcGFzcyB0byBhbiBFdmVudExpc3RlbmVyTWFuYWdlclxuICAgKi9cbiAgcHVibGljIGluaXRpYWxpemVFdmVudHMoKTogQXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPiB7XG4gICAgY29uc3QgcmVzdWx0cyA9IG5ldyBBcnJheTxTaW5nbGVFdmVudE1hbmFnZXI+KCk7XG4gICAgbGV0IG5vdGlmaWNhdGlvblNlcnZpY2U6IE5vdGlmaWNhdGlvblNlcnZpY2U7XG5cbiAgICB0cnkge1xuICAgICAgbm90aWZpY2F0aW9uU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8Tm90aWZpY2F0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLk5vdGlmaWNhdGlvbik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSB0aGlzIHNlcnZpY2UgcmVnaXN0ZXJlZCwganVzdCByZXR1cm5cbiAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH1cblxuICAgIC8vIEluaXRpYWxpemUgYWxsIG9mIHRoZSBldmVudCBtYW5hZ2VycyB3ZSdsbCBuZWVkIChvbmUgZm9yIGVhY2ggZXZlbnQgdHlwZSlcbiAgICBjb25zdCBtYXJrc0V2ZW50ID0gbmV3IFNpbmdsZUV2ZW50TWFuYWdlckltcGw8TWFya3NTZWxlY3RlZEV2ZW50PihUYWJsZWF1RXZlbnRUeXBlLk1hcmtTZWxlY3Rpb25DaGFuZ2VkKTtcbiAgICBub3RpZmljYXRpb25TZXJ2aWNlLnJlZ2lzdGVySGFuZGxlcihcbiAgICAgIE5vdGlmaWNhdGlvbklkLlNlbGVjdGVkTWFya3NDaGFuZ2VkLFxuICAgICAgKG1vZGVsKSA9PiB7XG4gICAgICAgIGNvbnN0IHZpc3VhbElkID0gbW9kZWwgYXMgVmlzdWFsSWQ7XG4gICAgICAgIHJldHVybiB0aGlzLnZpc3VhbElkc0FyZUVxdWFsKHZpc3VhbElkLCB0aGlzLl93b3Jrc2hlZXRJbXBsLnZpc3VhbElkKTtcbiAgICAgIH0sXG4gICAgICAoKSA9PiBtYXJrc0V2ZW50LnRyaWdnZXJFdmVudCgoKSA9PiBuZXcgTWFya3NTZWxlY3RlZEV2ZW50KHRoaXMpKSxcbiAgICApO1xuXG4gICAgY29uc3QgZmlsdGVyRXZlbnQgPSBuZXcgU2luZ2xlRXZlbnRNYW5hZ2VySW1wbDxGaWx0ZXJDaGFuZ2VkRXZlbnQ+KFRhYmxlYXVFdmVudFR5cGUuRmlsdGVyQ2hhbmdlZCk7XG4gICAgbm90aWZpY2F0aW9uU2VydmljZS5yZWdpc3RlckhhbmRsZXIoXG4gICAgICBOb3RpZmljYXRpb25JZC5GaWx0ZXJDaGFuZ2VkLFxuICAgICAgKG1vZGVsKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbHRlckV2ZW50UmVzcG9uc2UgPSBtb2RlbCBhcyBGaWx0ZXJFdmVudDtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwudmlzdWFsSWQud29ya3NoZWV0ID09PSBmaWx0ZXJFdmVudFJlc3BvbnNlLnZpc3VhbElkLndvcmtzaGVldDtcbiAgICAgIH0sXG4gICAgICAoZXZlbnQ6IEZpbHRlckV2ZW50KSA9PiB7XG4gICAgICAgIGZpbHRlckV2ZW50LnRyaWdnZXJFdmVudCgoKSA9PiBuZXcgRmlsdGVyQ2hhbmdlZEV2ZW50KHRoaXMsIGV2ZW50LmZpZWxkTmFtZSwgZXZlbnQuZmllbGRJZCkpO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgY29uc3Qgc3VtbWFyeURhdGFFdmVudCA9IG5ldyBTaW5nbGVFdmVudE1hbmFnZXJJbXBsPFN1bW1hcnlEYXRhQ2hhbmdlZEV2ZW50PihUYWJsZWF1RXZlbnRUeXBlLlN1bW1hcnlEYXRhQ2hhbmdlZCk7XG4gICAgbm90aWZpY2F0aW9uU2VydmljZS5yZWdpc3RlckhhbmRsZXIoXG4gICAgICBOb3RpZmljYXRpb25JZC5TdW1tYXJ5RGF0YUNoYW5nZWQsXG4gICAgICAobW9kZWwpID0+IHtcbiAgICAgICAgY29uc3Qgc3VtbWFyeURhdGFFdmVudFJlc3BvbnNlID0gbW9kZWwgYXMgU3VtbWFyeURhdGFFdmVudDtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwudmlzdWFsSWQud29ya3NoZWV0ID09PSBzdW1tYXJ5RGF0YUV2ZW50UmVzcG9uc2UudmlzdWFsSWQud29ya3NoZWV0O1xuICAgICAgfSxcbiAgICAgIChldmVudDogU3VtbWFyeURhdGFFdmVudCkgPT4ge1xuICAgICAgICBzdW1tYXJ5RGF0YUV2ZW50LnRyaWdnZXJFdmVudCgoKSA9PiBuZXcgU3VtbWFyeURhdGFDaGFuZ2VkRXZlbnQodGhpcykpO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgY29uc3Qgd29ya3NoZWV0Rm9ybWF0dGluZ0NoYW5nZWRFdmVudCA9IG5ldyBTaW5nbGVFdmVudE1hbmFnZXJJbXBsPFdvcmtzaGVldEZvcm1hdHRpbmdDaGFuZ2VkRXZlbnQ+KFxuICAgICAgVGFibGVhdUV2ZW50VHlwZS5Xb3Jrc2hlZXRGb3JtYXR0aW5nQ2hhbmdlZCxcbiAgICApO1xuXG4gICAgbm90aWZpY2F0aW9uU2VydmljZS5yZWdpc3RlckhhbmRsZXIoXG4gICAgICBOb3RpZmljYXRpb25JZC5Xb3Jrc2hlZXRGb3JtYXR0aW5nQ2hhbmdlZCxcbiAgICAgIChtb2RlbCkgPT4ge1xuICAgICAgICBjb25zdCB3b3Jrc2hlZXRGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50ID0gbW9kZWwgYXMgV29ya3NoZWV0Rm9ybWF0dGluZ0V2ZW50O1xuICAgICAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC52aXN1YWxJZC53b3Jrc2hlZXQgPT09IHdvcmtzaGVldEZvcm1hdHRpbmdDaGFuZ2VkRXZlbnQudmlzdWFsSWQud29ya3NoZWV0O1xuICAgICAgfSxcbiAgICAgIChldmVudEZvcm1hdHRpbmc6IFdvcmtzaGVldEZvcm1hdHRpbmcpID0+IHtcbiAgICAgICAgd29ya3NoZWV0Rm9ybWF0dGluZ0NoYW5nZWRFdmVudC50cmlnZ2VyRXZlbnQoKCkgPT4gbmV3IFdvcmtzaGVldEZvcm1hdHRpbmdDaGFuZ2VkRXZlbnQodGhpcywgZXZlbnRGb3JtYXR0aW5nKSk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICByZXN1bHRzLnB1c2gobWFya3NFdmVudCk7XG4gICAgcmVzdWx0cy5wdXNoKGZpbHRlckV2ZW50KTtcbiAgICByZXN1bHRzLnB1c2goc3VtbWFyeURhdGFFdmVudCk7XG4gICAgcmVzdWx0cy5wdXNoKHdvcmtzaGVldEZvcm1hdHRpbmdDaGFuZ2VkRXZlbnQpO1xuXG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlGaWx0ZXJBc3luYyhcbiAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZXM6IEFycmF5PHN0cmluZz4sXG4gICAgdXBkYXRlVHlwZTogRmlsdGVyVXBkYXRlVHlwZSxcbiAgICBvcHRpb25zOiBDb250cmFjdC5GaWx0ZXJPcHRpb25zLFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmFwcGx5RmlsdGVyQXN5bmMoZmllbGROYW1lLCB2YWx1ZXMsIHVwZGF0ZVR5cGUsIG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGFwcGx5UmFuZ2VGaWx0ZXJBc3luYyhmaWVsZE5hbWU6IHN0cmluZywgZmlsdGVyT3B0aW9uczogQ29udHJhY3QuUmFuZ2VGaWx0ZXJPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5hcHBseVJhbmdlRmlsdGVyQXN5bmMoZmllbGROYW1lLCBmaWx0ZXJPcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseUhpZXJhcmNoaWNhbEZpbHRlckFzeW5jKFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHZhbHVlczogQXJyYXk8c3RyaW5nPixcbiAgICB1cGRhdGVUeXBlOiBDb250cmFjdC5GaWx0ZXJVcGRhdGVUeXBlLFxuICAgIG9wdGlvbnM6IENvbnRyYWN0LkZpbHRlck9wdGlvbnMsXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuYXBwbHlIaWVyYXJjaGljYWxGaWx0ZXJBc3luYyhmaWVsZE5hbWUsIHZhbHVlcywgdXBkYXRlVHlwZSwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlSZWxhdGl2ZURhdGVGaWx0ZXJBc3luYyhmaWVsZE5hbWU6IHN0cmluZywgb3B0aW9uczogQ29udHJhY3QuUmVsYXRpdmVEYXRlRmlsdGVyT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuYXBwbHlSZWxhdGl2ZURhdGVGaWx0ZXJBc3luYyhmaWVsZE5hbWUsIG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGNsZWFyRmlsdGVyQXN5bmMoZmllbGROYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmNsZWFyRmlsdGVyQXN5bmMoZmllbGROYW1lKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXREYXRhU291cmNlc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuRGF0YVNvdXJjZT4+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5nZXREYXRhU291cmNlc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RmlsdGVyc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuRmlsdGVyPj4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldEZpbHRlcnNBc3luYygpO1xuICB9XG5cbiAgcHVibGljIGdldFNlbGVjdGVkTWFya3NBc3luYygpOiBQcm9taXNlPENvbnRyYWN0Lk1hcmtzQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldFNlbGVjdGVkTWFya3NBc3luYygpO1xuICB9XG5cbiAgcHVibGljIGdldEhpZ2hsaWdodGVkTWFya3NBc3luYygpOiBQcm9taXNlPENvbnRyYWN0Lk1hcmtzQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldEhpZ2hsaWdodGVkTWFya3NBc3luYygpO1xuICB9XG5cbiAgcHVibGljIGdldFN1bW1hcnlEYXRhQXN5bmMob3B0aW9uczogQ29udHJhY3QuR2V0U3VtbWFyeURhdGFPcHRpb25zKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5nZXRTdW1tYXJ5RGF0YUFzeW5jKG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGdldFN1bW1hcnlEYXRhUmVhZGVyQXN5bmMocGFnZVJvd0NvdW50OiBudW1iZXIsIG9wdGlvbnM6IENvbnRyYWN0LkdldFN1bW1hcnlEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlUmVhZGVyPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0U3VtbWFyeURhdGFSZWFkZXJBc3luYyhwYWdlUm93Q291bnQsIG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGdldFN1bW1hcnlDb2x1bW5zSW5mb0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29sdW1uPj4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldFN1bW1hcnlDb2x1bW5zSW5mb0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ0RhdGFBc3luYyhvcHRpb25zOiBDb250cmFjdC5HZXRVbmRlcmx5aW5nRGF0YU9wdGlvbnMpOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT4ge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgICdXb3Jrc2hlZXQuZ2V0VW5kZXJseWluZ0RhdGFBc3luYyBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlICcgK1xuICAgICAgICAnV29ya3NoZWV0LmdldFVuZGVybHlpbmdUYWJsZXNBc3luYyBhbmQgV29ya3NoZWV0LmdldFVuZGVybHlpbmdUYWJsZURhdGFBc3luYycsXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5nZXRVbmRlcmx5aW5nRGF0YUFzeW5jKG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGdldFVuZGVybHlpbmdUYWJsZXNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkxvZ2ljYWxUYWJsZT4+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5nZXRVbmRlcmx5aW5nVGFibGVzQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmRlcmx5aW5nVGFibGVEYXRhQXN5bmMobG9naWNhbFRhYmxlSWQ6IHN0cmluZywgb3B0aW9uczogQ29udHJhY3QuR2V0VW5kZXJseWluZ0RhdGFPcHRpb25zKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5nZXRVbmRlcmx5aW5nVGFibGVEYXRhQXN5bmMobG9naWNhbFRhYmxlSWQsIG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGdldFVuZGVybHlpbmdUYWJsZURhdGFSZWFkZXJBc3luYyhcbiAgICBsb2dpY2FsVGFibGVJZDogc3RyaW5nLFxuICAgIHBhZ2VSb3dDb3VudDogbnVtYmVyLFxuICAgIG9wdGlvbnM6IENvbnRyYWN0LkdldFVuZGVybHlpbmdEYXRhT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGVSZWFkZXI+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5nZXRVbmRlcmx5aW5nVGFibGVEYXRhUmVhZGVyQXN5bmMobG9naWNhbFRhYmxlSWQsIHBhZ2VSb3dDb3VudCwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VmlzdWFsU3BlY2lmaWNhdGlvbkFzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuVmlzdWFsU3BlY2lmaWNhdGlvbj4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldFZpc3VhbFNwZWNpZmljYXRpb25Bc3luYygpO1xuICB9XG5cbiAgcHVibGljIGFkZE1hcmtzQ2FyZEZpZWxkc0FzeW5jKFxuICAgIG1hcmtzQ2FyZEluZGV4OiBudW1iZXIsXG4gICAgZW5jb2RpbmdUeXBlOiBDb250cmFjdC5FbmNvZGluZ1R5cGUsXG4gICAgY29sdW1uczogQXJyYXk8Q29udHJhY3QuQ29sdW1uPixcbiAgICBzdGFydEluZGV4OiBudW1iZXIsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmFkZE1hcmtzQ2FyZEZpZWxkc0FzeW5jKG1hcmtzQ2FyZEluZGV4LCBlbmNvZGluZ1R5cGUsIGNvbHVtbnMsIHN0YXJ0SW5kZXgpO1xuICB9XG5cbiAgcHVibGljIG1vdmVNYXJrc0NhcmRGaWVsZEFzeW5jKG1hcmtzQ2FyZEluZGV4OiBudW1iZXIsIGZyb21JbmRleDogbnVtYmVyLCB0b0luZGV4OiBudW1iZXIsIGZpZWxkQ291bnQgPSAxKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwubW92ZU1hcmtzQ2FyZEZpZWxkQXN5bmMobWFya3NDYXJkSW5kZXgsIGZyb21JbmRleCwgdG9JbmRleCwgZmllbGRDb3VudCk7XG4gIH1cblxuICBwdWJsaWMgc3BsaWNlTWFya3NDYXJkRmllbGRzQXN5bmMoXG4gICAgbWFya3NDYXJkSW5kZXg6IG51bWJlcixcbiAgICBlbmNvZGluZ1R5cGU6IENvbnRyYWN0LkVuY29kaW5nVHlwZSxcbiAgICBzdGFydEluZGV4OiBudW1iZXIsXG4gICAgZGVsZXRlQ291bnQ6IG51bWJlcixcbiAgICBjb2x1bW5zOiBBcnJheTxDb250cmFjdC5Db2x1bW4+LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5zcGxpY2VNYXJrc0NhcmRGaWVsZHNBc3luYyhtYXJrc0NhcmRJbmRleCwgZW5jb2RpbmdUeXBlLCBzdGFydEluZGV4LCBkZWxldGVDb3VudCwgY29sdW1ucyk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJTZWxlY3RlZE1hcmtzQXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuY2xlYXJTZWxlY3RlZE1hcmtzQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RNYXJrc0J5SURBc3luYyhtYXJrc0luZm86IEFycmF5PENvbnRyYWN0Lk1hcmtJbmZvPiwgdXBkYXRlVHlwZTogU2VsZWN0aW9uVXBkYXRlVHlwZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLnNlbGVjdE1hcmtzQnlJZEFzeW5jKG1hcmtzSW5mbywgdXBkYXRlVHlwZSk7XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0TWFya3NCeVZhbHVlQXN5bmMoc2VsZWN0aW9uczogQXJyYXk8Q29udHJhY3QuU2VsZWN0aW9uQ3JpdGVyaWE+LCBzZWxlY3Rpb25VcGRhdGVUeXBlOiBTZWxlY3Rpb25VcGRhdGVUeXBlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuc2VsZWN0TWFya3NCeVZhbHVlQXN5bmMoc2VsZWN0aW9ucywgc2VsZWN0aW9uVXBkYXRlVHlwZSk7XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0TWFya3NCeUlkQXN5bmMoc2VsZWN0aW9uczogQXJyYXk8Q29udHJhY3QuTWFya0luZm8+LCBzZWxlY3Rpb25VcGRhdGVUeXBlOiBTZWxlY3Rpb25VcGRhdGVUeXBlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuc2VsZWN0TWFya3NCeUlkQXN5bmMoc2VsZWN0aW9ucywgc2VsZWN0aW9uVXBkYXRlVHlwZSk7XG4gIH1cblxuICBwdWJsaWMgYW5ub3RhdGVNYXJrQXN5bmMobWFyazogQ29udHJhY3QuTWFya0luZm8sIGFubm90YXRpb25UZXh0OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5hbm5vdGF0ZU1hcmtBc3luYyhtYXJrLCBhbm5vdGF0aW9uVGV4dCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0QW5ub3RhdGlvbnNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkFubm90YXRpb24+PiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0QW5ub3RhdGlvbnNBc3luYygpO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUFubm90YXRpb25Bc3luYyhhbm5vdGF0aW9uOiBDb250cmFjdC5Bbm5vdGF0aW9uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwucmVtb3ZlQW5ub3RhdGlvbkFzeW5jKGFubm90YXRpb24pO1xuICB9XG5cbiAgcHVibGljIGhvdmVyVHVwbGVBc3luYyhob3ZlcmVkVHVwbGU/OiBudW1iZXIsIHRvb2x0aXA/OiBUb29sdGlwQ29udGV4dCB8IG51bGwsIGFsbG93SG92ZXJBY3Rpb25zID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmhvdmVyVHVwbGVBc3luYyhob3ZlcmVkVHVwbGUsIHRvb2x0aXAsIGFsbG93SG92ZXJBY3Rpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RUdXBsZXNBc3luYyhzZWxlY3RlZFR1cGxlczogQXJyYXk8bnVtYmVyPiwgc2VsZWN0T3B0aW9uOiBDb250cmFjdC5TZWxlY3RPcHRpb25zLCB0b29sdGlwPzogVG9vbHRpcENvbnRleHQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5zZWxlY3RUdXBsZXNBc3luYyhzZWxlY3RlZFR1cGxlcywgc2VsZWN0T3B0aW9uLCB0b29sdGlwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRUb29sdGlwVGV4dEFzeW5jKHR1cGxlSWQ6IG51bWJlcik6IFByb21pc2U8U3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0VG9vbHRpcFRleHRBc3luYyh0dXBsZUlkKTtcbiAgfVxuXG4gIHB1YmxpYyBsZWF2ZU1hcmtOYXZpZ2F0aW9uQXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwubGVhdmVNYXJrTmF2aWdhdGlvbkFzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgZWRpdEFsaWFzZXNEaWFsb2dBc3luYyhmaWVsZE5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmVkaXRBbGlhc2VzRGlhbG9nQXN5bmMoZmllbGROYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgdmlzdWFsSWRzQXJlRXF1YWwoYTogVmlzdWFsSWQsIGI6IFZpc3VhbElkKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGEgJiZcbiAgICAgIGIgJiZcbiAgICAgIGEud29ya3NoZWV0ID09PSBiLndvcmtzaGVldCAmJlxuICAgICAgYS5kYXNoYm9hcmQgPT09IGIuZGFzaGJvYXJkICYmXG4gICAgICBhLnN0b3J5Ym9hcmQgPT09IGIuc3Rvcnlib2FyZCAmJlxuICAgICAgYS5zdG9yeVBvaW50SUQgPT09IGIuc3RvcnlQb2ludElEXG4gICAgKTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgZXh0ZXJuYWwgRGFzaGJvYXJkQ29udGVudCBuYW1lc3BhY2UuXG4gKiBUaGlzIGRvZXMgbm90IGZvbGxvdyB0aGUgSW1wbCBwYXR0ZXJuIGFzIERhc2hib2FyZENvbnRlbnQgaXNcbiAqIGN1cnJlbnRseSBqdXN0IGEgKHNpbmdsZSkgcHJvcGVydHkgYmFnLlxuICovXG5leHBvcnQgY2xhc3MgRGFzaGJvYXJkQ29udGVudCBpbXBsZW1lbnRzIENvbnRyYWN0LkRhc2hib2FyZENvbnRlbnQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfZGFzaGJvYXJkOiBDb250cmFjdC5FeHRlbnNpb25EYXNoYm9hcmQpIHt9XG5cbiAgcHVibGljIGdldCBkYXNoYm9hcmQoKTogQ29udHJhY3QuRXh0ZW5zaW9uRGFzaGJvYXJkIHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uRW52aXJvbm1lbnQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQXBpVmVyc2lvbiwgSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzIGFzIEVudW1NYXBwaW5ncyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgQ29ubmVjdGVkU2VydmVyIH0gZnJvbSAnLi4vSW1wbC9Db25uZWN0ZWRTZXJ2ZXInO1xuaW1wb3J0IHsgV29ya2Jvb2tGb3JtYXR0aW5nRW52VXRpbCB9IGZyb20gJy4vV29ya2Jvb2tGb3JtYXR0aW5nRW52VXRpbCc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGV4dGVybmFsIGVudmlyb25tZW50IG5hbWVzcGFjZS5cbiAqIEVudmlyb25tZW50IGRvZXMgbm90IGZvbGxvdyB0aGUgSW1wbCBwYXR0ZXJuIGFzIGl0IGlzXG4gKiBqdXN0IGEgcHJvcGVydHkgYmFnLlxuICogRmlyc3QgY2xhc3MgZXh0ZW5zaW9ucyBjYW4gZ2V0IHRvIENvbm5lY3RlZFNlcnZlciB3aXRoOiBlbnZpcm9ubWVudFsnY29ubmVjdGVkU2VydmVyJ11cbiAqL1xuZXhwb3J0IGNsYXNzIEVudmlyb25tZW50IGltcGxlbWVudHMgQ29udHJhY3QuRW52aXJvbm1lbnQge1xuICAvKipUaGUgZm9sbG93aW5nIGlzIGFuIGluZGV4IHNpZ25hdHVyZS4gSXQgYWxsb3dzIHByb3BlcnRpZXMgdG8gYmUgYWNjZXNzZWQgYnkgbmFtZS5cbiAgICogVGhpcyBhbGxvd3MgdXMgdG8gYWRkIHByb3BlcnRpZXMgZHluYW1pY2FsbHkgKHNlZSB1c2FnZSBvZiB0aGlzLmNvbm5lY3RlZFNlcnZlciBiZWxvdykgd2l0aG91dCBUeXBlc2NyaXB0IGVycm9ycy5cbiAgICogVGhlIHJlYXNvbiB3ZSBkbyB0aGlzIGlzIHNvIHRoYXQgM3JkLXBhcnR5IGV4dGVuc2lvbiBkZXZlbG9wZXJzIGRvIG5vdCBzZWUgdGhlIGNvbm5lY3RlZFNlcnZlciBwcm9wZXJ0eVxuICAgKiB0aGF0IGlzIG9ubHkgYXZhaWxhYmxlIHRvIGZpcnN0IGNsYXNzIGV4dGVuc2lvbiBkZXZlbG9wZXJzLlxuICAgKiBUaGUgdHlwZSBvZiB0aGUgaW5kZXggc2lnYXR1cmUgbmVlZHMgdG8gYmUgYSB1bmlvbiBvZiBhbGwgcHJvcGVydGllcyBpbiB0aGUgb2JqZWN0LCBzaW5jZSB3ZSBjb3VsZFxuICAgKiBhY2Nlc3MgYW55IHByb3BlcnR5IHVzaW5nIHRoZSBwcm9wZXJ0eSBpbmRleCBtZXRob2QuXG4gICAqL1xuICBbeDogc3RyaW5nXTogQ29ubmVjdGVkU2VydmVyIHwgc3RyaW5nIHwgQ29udHJhY3QuV29ya2Jvb2tGb3JtYXR0aW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX2FwaVZlcnNpb246IHN0cmluZztcbiAgcHJpdmF0ZSBfY29udGV4dDogQ29udHJhY3QuRXh0ZW5zaW9uQ29udGV4dDtcbiAgcHJpdmF0ZSBfZm9ybWF0dGluZz86IENvbnRyYWN0Lldvcmtib29rRm9ybWF0dGluZztcbiAgcHJpdmF0ZSBfbGFuZ3VhZ2U6IHN0cmluZztcbiAgcHJpdmF0ZSBfY291bnRyeT86IHN0cmluZztcbiAgcHJpdmF0ZSBfbG9jYWxlOiBzdHJpbmc7XG4gIHByaXZhdGUgX21vZGU6IENvbnRyYWN0LkV4dGVuc2lvbk1vZGU7XG4gIHByaXZhdGUgX29wZXJhdGluZ1N5c3RlbTogc3RyaW5nO1xuICBwcml2YXRlIF90YWJsZWF1VmVyc2lvbjogc3RyaW5nO1xuICBwcml2YXRlIF91bmlxdWVVc2VySWQ/OiBzdHJpbmc7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKGV4dGVuc2lvbkVudmlyb25tZW50OiBFeHRlbnNpb25FbnZpcm9ubWVudCkge1xuICAgIHRoaXMuX2FwaVZlcnNpb24gPSBBcGlWZXJzaW9uLkluc3RhbmNlICYmIEFwaVZlcnNpb24uSW5zdGFuY2UuZm9ybWF0dGVkVmFsdWU7IC8vIG1hai5taW4uZml4IChubyBidWlsZClcbiAgICB0aGlzLl9jb250ZXh0ID0gRW51bU1hcHBpbmdzLmV4dGVuc2lvbkNvbnRleHQuY29udmVydChleHRlbnNpb25FbnZpcm9ubWVudC5leHRlbnNpb25Db250ZXh0KTtcbiAgICB0aGlzLl9mb3JtYXR0aW5nID0gV29ya2Jvb2tGb3JtYXR0aW5nRW52VXRpbC5jb252ZXJ0VG9Xb3JrYm9va0Zvcm1hdHRpbmcoZXh0ZW5zaW9uRW52aXJvbm1lbnQud29ya2Jvb2tGb3JtYXR0aW5nKTtcbiAgICB0aGlzLl9sYW5ndWFnZSA9IGV4dGVuc2lvbkVudmlyb25tZW50LmV4dGVuc2lvbkxhbmd1YWdlO1xuICAgIHRoaXMuX2NvdW50cnkgPSBleHRlbnNpb25FbnZpcm9ubWVudC5leHRlbnNpb25Db3VudHJ5O1xuICAgIHRoaXMuX2xvY2FsZSA9IGV4dGVuc2lvbkVudmlyb25tZW50LmV4dGVuc2lvbkxvY2FsZTtcbiAgICB0aGlzLl9tb2RlID0gRW51bU1hcHBpbmdzLmV4dGVuc2lvbk1vZGUuY29udmVydChleHRlbnNpb25FbnZpcm9ubWVudC5leHRlbnNpb25Nb2RlKTtcbiAgICB0aGlzLl9vcGVyYXRpbmdTeXN0ZW0gPSBleHRlbnNpb25FbnZpcm9ubWVudC5vcGVyYXRpbmdTeXN0ZW07XG4gICAgdGhpcy5fdGFibGVhdVZlcnNpb24gPSBleHRlbnNpb25FbnZpcm9ubWVudC50YWJsZWF1VmVyc2lvbjtcbiAgICB0aGlzLl91bmlxdWVVc2VySWQgPSBleHRlbnNpb25FbnZpcm9ubWVudC51bmlxdWVVc2VySWQ7XG5cbiAgICAvLyBJZiB3ZSBoYXZlIGEgdXNlcklkLCB0aGVuIHdlIGFyZSBhIGZpcnN0IGNsYXNzIGV4dGVuc2lvblxuICAgIGlmIChleHRlbnNpb25FbnZpcm9ubWVudC51c2VySWQpIHtcbiAgICAgIHRoaXMuY29ubmVjdGVkU2VydmVyID0gbmV3IENvbm5lY3RlZFNlcnZlcihcbiAgICAgICAgZXh0ZW5zaW9uRW52aXJvbm1lbnQudXNlcklkLFxuICAgICAgICBleHRlbnNpb25FbnZpcm9ubWVudC5zaXRlSWQsXG4gICAgICAgIGV4dGVuc2lvbkVudmlyb25tZW50LnNpdGVOYW1lc3BhY2UsXG4gICAgICAgIGV4dGVuc2lvbkVudmlyb25tZW50Lndvcmtib29rSWQsXG4gICAgICApO1xuXG4gICAgICB0aGlzLmZlYXR1cmVGbGFncyA9IGV4dGVuc2lvbkVudmlyb25tZW50LmZlYXR1cmVGbGFncztcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFwaVZlcnNpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fYXBpVmVyc2lvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY29udGV4dCgpOiBDb250cmFjdC5FeHRlbnNpb25Db250ZXh0IHtcbiAgICByZXR1cm4gdGhpcy5fY29udGV4dDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgd29ya2Jvb2tGb3JtYXR0aW5nKCk6IENvbnRyYWN0Lldvcmtib29rRm9ybWF0dGluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1hdHRpbmc7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGxhbmd1YWdlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2xhbmd1YWdlO1xuICB9XG5cbiAgcHVibGljIGdldCBjb3VudHJ5KCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2NvdW50cnk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGxvY2FsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9sb2NhbGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG1vZGUoKTogQ29udHJhY3QuRXh0ZW5zaW9uTW9kZSB7XG4gICAgcmV0dXJuIHRoaXMuX21vZGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG9wZXJhdGluZ1N5c3RlbSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9vcGVyYXRpbmdTeXN0ZW07XG4gIH1cblxuICBwdWJsaWMgZ2V0IHRhYmxlYXVWZXJzaW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3RhYmxlYXVWZXJzaW9uO1xuICB9XG5cbiAgcHVibGljIGdldCB1bmlxdWVVc2VySWQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fdW5pcXVlVXNlcklkO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQ2FsbGJhY2tNYXAsIEV4dGVuc2lvbnNJbXBsIH0gZnJvbSAnLi4vSW1wbC9FeHRlbnNpb25zSW1wbCc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGV4dGVybmFsIEV4dGVuc2lvbnMgbmFtZXNwYWNlLlxuICovXG5leHBvcnQgY2xhc3MgRXh0ZW5zaW9ucyBpbXBsZW1lbnRzIENvbnRyYWN0LkV4dGVuc2lvbnMge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBleHRlbnNpb25JbXBsOiBFeHRlbnNpb25zSW1wbCkge1xuICAgIHRoaXMuZXh0ZW5zaW9uSW1wbCA9IGV4dGVuc2lvbkltcGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRhc2hib2FyZENvbnRlbnQoKTogQ29udHJhY3QuRGFzaGJvYXJkQ29udGVudCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZXh0ZW5zaW9uSW1wbC5kYXNoYm9hcmRDb250ZW50O1xuICB9XG5cbiAgcHVibGljIGdldCB3b3Jrc2hlZXRDb250ZW50KCk6IENvbnRyYWN0LldvcmtzaGVldENvbnRlbnQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmV4dGVuc2lvbkltcGwud29ya3NoZWV0Q29udGVudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZW52aXJvbm1lbnQoKTogQ29udHJhY3QuRW52aXJvbm1lbnQge1xuICAgIHJldHVybiB0aGlzLmV4dGVuc2lvbkltcGwuZW52aXJvbm1lbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNldHRpbmdzKCk6IENvbnRyYWN0LlNldHRpbmdzIHtcbiAgICByZXR1cm4gdGhpcy5leHRlbnNpb25JbXBsLnNldHRpbmdzO1xuICB9XG5cbiAgcHVibGljIGdldCB1aSgpOiBDb250cmFjdC5VSSB7XG4gICAgcmV0dXJuIHRoaXMuZXh0ZW5zaW9uSW1wbC51aTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgd29ya2Jvb2soKTogQ29udHJhY3QuRXh0ZW5zaW9uV29ya2Jvb2sge1xuICAgIHJldHVybiB0aGlzLmV4dGVuc2lvbkltcGwud29ya2Jvb2s7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRhc2hib2FyZE9iamVjdElkKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZXh0ZW5zaW9uSW1wbC5leHRlbnNpb25ab25lSWQ7XG4gIH1cblxuICBwdWJsaWMgaW5pdGlhbGl6ZUFzeW5jKGNvbnRleHRNZW51Q2FsbGJhY2tzPzogQ2FsbGJhY2tNYXApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5leHRlbnNpb25JbXBsLmluaXRpYWxpemVBc3luYyhmYWxzZSwgY29udGV4dE1lbnVDYWxsYmFja3MpLnRoZW48dm9pZD4oKTtcbiAgfVxuXG4gIHB1YmxpYyBpbml0aWFsaXplRGlhbG9nQXN5bmMoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5leHRlbnNpb25JbXBsLmluaXRpYWxpemVBc3luYyh0cnVlKTtcbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGVWaXpJbWFnZUFzeW5jKGlucHV0U3BlYzogb2JqZWN0KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5leHRlbnNpb25JbXBsLmNyZWF0ZVZpekltYWdlQXN5bmMoaW5wdXRTcGVjKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRDbGlja1Rocm91Z2hBc3luYyhjbGlja1Rocm91Z2hFbmFibGVkOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuZXh0ZW5zaW9uSW1wbC5zZXRDbGlja1Rocm91Z2hBc3luYyhjbGlja1Rocm91Z2hFbmFibGVkKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgU2V0dGluZ3MgYXMgU2V0dGluZ3NDb250cmFjdCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFdmVudExpc3RlbmVyTWFuYWdlciB9IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgU2V0dGluZ3NJbXBsIH0gZnJvbSAnLi4vSW1wbC9TZXR0aW5nc0ltcGwnO1xuaW1wb3J0IHsgU2V0dGluZ3NDb2xsZWN0aW9uIH0gZnJvbSAnLi4vU2VydmljZXMvU2V0dGluZ3NTZXJ2aWNlJztcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgZXh0ZXJuYWwgc2V0dGluZ3MgbmFtZXNwYWNlLlxuICovXG5leHBvcnQgY2xhc3MgU2V0dGluZ3MgZXh0ZW5kcyBFdmVudExpc3RlbmVyTWFuYWdlciBpbXBsZW1lbnRzIFNldHRpbmdzQ29udHJhY3Qge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfc2V0dGluZ3NJbXBsOiBTZXR0aW5nc0ltcGwpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBvdXIgZXZlbnQgaGFuZGxpbmcgZm9yIHRoaXMgY2xhc3NcbiAgICB0aGlzLl9zZXR0aW5nc0ltcGwuaW5pdGlhbGl6ZUV2ZW50cygpLmZvckVhY2goKGUpID0+IHRoaXMuYWRkTmV3RXZlbnRUeXBlKGUpKTtcbiAgfVxuXG4gIHB1YmxpYyBlcmFzZShrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX3NldHRpbmdzSW1wbC5lcmFzZShrZXkpO1xuICB9XG5cbiAgcHVibGljIGdldChrZXk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzSW1wbC5nZXQoa2V5KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBbGwoKTogU2V0dGluZ3NDb2xsZWN0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5fc2V0dGluZ3NJbXBsLmdldEFsbCgpO1xuICB9XG5cbiAgcHVibGljIGdldCBpc01vZGlmaWVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zZXR0aW5nc0ltcGwuaXNNb2RpZmllZDtcbiAgfVxuXG4gIHB1YmxpYyBzYXZlQXN5bmMoKTogUHJvbWlzZTxTZXR0aW5nc0NvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gdGhpcy5fc2V0dGluZ3NJbXBsLnNhdmVBc3luYygpO1xuICB9XG5cbiAgcHVibGljIHNldChrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX3NldHRpbmdzSW1wbC5zZXQoa2V5LCB2YWx1ZSk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBVSUltcGwgfSBmcm9tICcuLi9JbXBsL1VJSW1wbCc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGV4dGVybmFsIFVJIG5hbWVzcGFjZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFVJIGltcGxlbWVudHMgQ29udHJhY3QuVUkge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfaW1wbDogVUlJbXBsKSB7fVxuXG4gIHB1YmxpYyBkaXNwbGF5RGlhbG9nQXN5bmModXJsOiBzdHJpbmcsIHBheWxvYWQ/OiBzdHJpbmcsIG9wdGlvbnM/OiBDb250cmFjdC5EaWFsb2dPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5faW1wbC5kaXNwbGF5RGlhbG9nQXN5bmModXJsLCBwYXlsb2FkLCBvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBjbG9zZURpYWxvZyhwYXlsb2FkPzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5faW1wbC5jbG9zZURpYWxvZyhwYXlsb2FkKTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyBhcyBFbnVtTWFwcGluZ3MgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IENsYXNzTmFtZUtleSwgV29ya2Jvb2tGb3JtYXR0aW5nIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuZXhwb3J0IGNsYXNzIFdvcmtib29rRm9ybWF0dGluZ0VudlV0aWwge1xuICBwdWJsaWMgc3RhdGljIGNvbnZlcnRUb1dvcmtib29rRm9ybWF0dGluZyh3b3JrYm9va0Zvcm1hdHRpbmdNb2RlbD86IFdvcmtib29rRm9ybWF0dGluZyk6IENvbnRyYWN0Lldvcmtib29rRm9ybWF0dGluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF3b3JrYm9va0Zvcm1hdHRpbmdNb2RlbCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZm9ybWF0dGluZ01hcDogQXJyYXk8Q29udHJhY3QuRm9ybWF0dGluZ1NoZWV0PiA9IHdvcmtib29rRm9ybWF0dGluZ01vZGVsLmZvcm1hdHRpbmdTaGVldHMubWFwKChjdXJyZW50Rm9ybWF0dGluZ1NoZWV0KSA9PiB7XG4gICAgICAgIGNvbnN0IGZvcm1hdHRpbmdTaGVldDogQ29udHJhY3QuRm9ybWF0dGluZ1NoZWV0ID0ge1xuICAgICAgICAgIGNsYXNzTmFtZUtleTogRW51bU1hcHBpbmdzLmNsYXNzTmFtZUtleS5jb252ZXJ0KGN1cnJlbnRGb3JtYXR0aW5nU2hlZXQuY2xhc3NOYW1lS2V5KSxcbiAgICAgICAgICBjc3NQcm9wZXJ0aWVzOiBnZXRDc3NQcm9wZXJ0aWVzKGN1cnJlbnRGb3JtYXR0aW5nU2hlZXQuY2xhc3NOYW1lS2V5LCBjdXJyZW50Rm9ybWF0dGluZ1NoZWV0LmNzc1Byb3BlcnRpZXMpLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gZm9ybWF0dGluZ1NoZWV0O1xuICAgICAgfSk7XG4gICAgICBjb25zdCByZXN1bHQ6IENvbnRyYWN0Lldvcmtib29rRm9ybWF0dGluZyA9IHtcbiAgICAgICAgZm9ybWF0dGluZ1NoZWV0czogZm9ybWF0dGluZ01hcCxcbiAgICAgIH07XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRDc3NQcm9wZXJ0aWVzKGNsYXNzTmFtZUtleTogQ2xhc3NOYW1lS2V5LCBjc3NQcm9wZXJ0aWVzOiBSZWFjdC5DU1NQcm9wZXJ0aWVzKTogaW1wb3J0KCdyZWFjdCcpLkNTU1Byb3BlcnRpZXMge1xuICBpZiAoY2xhc3NOYW1lS2V5ID09PSBDbGFzc05hbWVLZXkuUm93RGl2aWRlcnMgfHwgY2xhc3NOYW1lS2V5ID09PSBDbGFzc05hbWVLZXkuQ29sdW1uRGl2aWRlcnMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYm9yZGVyQ29sb3I6IGNzc1Byb3BlcnRpZXMuYm9yZGVyQ29sb3IsXG4gICAgICBib3JkZXJTdHlsZTogY3NzUHJvcGVydGllcy5ib3JkZXJTdHlsZSxcbiAgICAgIGJvcmRlcldpZHRoOiBjc3NQcm9wZXJ0aWVzLmJvcmRlcldpZHRoLFxuICAgIH0gYXMgUmVhY3QuQ1NTUHJvcGVydGllcztcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZm9udEZhbWlseTogY3NzUHJvcGVydGllcy5mb250RmFtaWx5LFxuICAgIGZvbnRTaXplOiBjc3NQcm9wZXJ0aWVzLmZvbnRTaXplLFxuICAgIGZvbnRXZWlnaHQ6IGNzc1Byb3BlcnRpZXMuZm9udFdlaWdodCxcbiAgICBmb250U3R5bGU6IGNzc1Byb3BlcnRpZXMuZm9udFN0eWxlLFxuICAgIHRleHREZWNvcmF0aW9uOiBjc3NQcm9wZXJ0aWVzLnRleHREZWNvcmF0aW9uLFxuICAgIGNvbG9yOiBjc3NQcm9wZXJ0aWVzLmNvbG9yLFxuICB9O1xufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgZXh0ZXJuYWwgV29ya3NoZWV0Q29udGVudCBuYW1lc3BhY2UuXG4gKiBUaGlzIGRvZXMgbm90IGZvbGxvdyB0aGUgSW1wbCBwYXR0ZXJuIGFzIFdvcmtzaGVldENvbnRlbnQgaXNcbiAqIGN1cnJlbnRseSBqdXN0IGEgKHNpbmdsZSkgcHJvcGVydHkgYmFnLlxuICovXG5leHBvcnQgY2xhc3MgV29ya3NoZWV0Q29udGVudCBpbXBsZW1lbnRzIENvbnRyYWN0LldvcmtzaGVldENvbnRlbnQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfd29ya3NoZWV0OiBDb250cmFjdC5FeHRlbnNpb25Xb3Jrc2hlZXQpIHt9XG5cbiAgcHVibGljIGdldCB3b3Jrc2hlZXQoKTogQ29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0O1xuICB9XG59XG4iLCJpbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgRXh0ZW5zaW9uQm9vdHN0cmFwSW5mbywgUGFyYW1ldGVySWQsIFZlcmJJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9FeHRlbnNpb25zU2VydmljZU5hbWVzJztcbmltcG9ydCB7IEluaXRpYWxpemF0aW9uU2VydmljZSB9IGZyb20gJy4uL0luaXRpYWxpemF0aW9uU2VydmljZSc7XG5cbmV4cG9ydCBjbGFzcyBJbml0aWFsaXphdGlvblNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgSW5pdGlhbGl6YXRpb25TZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBFeHRlbnNpb25zU2VydmljZU5hbWVzLkluaXRpYWxpemF0aW9uU2VydmljZTtcbiAgfVxuXG4gIHB1YmxpYyBpbml0aWFsaXplRGFzaGJvYXJkRXh0ZW5zaW9uc0FzeW5jKGlzRXh0ZW5zaW9uRGlhbG9nOiBib29sZWFuLCBjb250ZXh0TWVudUlkczogc3RyaW5nW10pOiBQcm9taXNlPEV4dGVuc2lvbkJvb3RzdHJhcEluZm8+IHtcbiAgICBjb25zdCBwYXJhbXM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdpbml0aWFsaXplRGFzaGJvYXJkRXh0ZW5zaW9uc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5FeHRlbnNpb25Db250ZXh0TWVudUlkc106IGNvbnRleHRNZW51SWRzLFxuICAgICAgW1BhcmFtZXRlcklkLklzRXh0ZW5zaW9uRGlhbG9nXTogaXNFeHRlbnNpb25EaWFsb2csXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkluaXRpYWxpemVFeHRlbnNpb24sIHBhcmFtcykudGhlbjxFeHRlbnNpb25Cb290c3RyYXBJbmZvPigocmVzcG9uc2UpID0+IHtcbiAgICAgIC8vIFRPRE8gLSBWYWxpZGF0ZSByZXR1cm4gdmFsdWVcblxuICAgICAgY29uc3QgcmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0IGFzIEV4dGVuc2lvbkJvb3RzdHJhcEluZm87XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBFcnJvckNvZGVzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBFeHRlbnNpb25TZXR0aW5nc0luZm8sIFBhcmFtZXRlcklkLCBWZXJiSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlLCBUYWJsZWF1RXJyb3IgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9FeHRlbnNpb25zU2VydmljZU5hbWVzJztcbmltcG9ydCB7IFNldHRpbmdzQ29sbGVjdGlvbiwgU2V0dGluZ3NTZXJ2aWNlIH0gZnJvbSAnLi4vU2V0dGluZ3NTZXJ2aWNlJztcblxuZXhwb3J0IGNsYXNzIFNldHRpbmdzU2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBTZXR0aW5nc1NlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMuU2V0dGluZ3NTZXJ2aWNlO1xuICB9XG5cbiAgcHVibGljIHNhdmVTZXR0aW5nc0FzeW5jKHNldHRpbmdzOiBTZXR0aW5nc0NvbGxlY3Rpb24pOiBQcm9taXNlPFNldHRpbmdzQ29sbGVjdGlvbj4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdzYXZlU2V0dGluZ3NBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuU2V0dGluZ3NWYWx1ZXNdOiBzZXR0aW5ncyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuU2F2ZUV4dGVuc2lvblNldHRpbmdzLCBwYXJhbWV0ZXJzKS50aGVuPFNldHRpbmdzQ29sbGVjdGlvbj4oKHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSB2YWx1ZS5yZXN1bHQgYXMgRXh0ZW5zaW9uU2V0dGluZ3NJbmZvO1xuXG4gICAgICBpZiAoIXJlc3VsdCB8fCAhcmVzdWx0LnNldHRpbmdzVmFsdWVzKSB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnVW5leHBlY3RlZCBlcnJvciBzYXZpbmdzIHNldHRpbmdzLicpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0LnNldHRpbmdzVmFsdWVzO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBEaWFsb2dPcHRpb25zLCBEaWFsb2dTdHlsZSwgRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgRXh0ZW5zaW9uRGlhbG9nUmVzdWx0LCBQYXJhbWV0ZXJJZCwgVmVyYklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEVycm9ySGVscGVycywgRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzLCBTZXJ2aWNlSW1wbEJhc2UsIFRhYmxlYXVFcnJvciB9IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcyB9IGZyb20gJy4uL0V4dGVuc2lvbnNTZXJ2aWNlTmFtZXMnO1xuaW1wb3J0IHsgVUlTZXJ2aWNlIH0gZnJvbSAnLi4vVUlTZXJ2aWNlJztcblxuY29uc3QgREVGQVVMVF9ESUFMT0dfSEVJR0hUID0gNDAwOyAvLyBpbiBwaXhlbHNcbmNvbnN0IERFRkFVTFRfRElBTE9HX1dJRFRIID0gNjAwOyAvLyBpbiBwaXhlbHNcbmNvbnN0IERFRkFVTFRfRElBTE9HX1NUWUxFOiBEaWFsb2dTdHlsZSA9IERpYWxvZ1N0eWxlLldpbmRvdztcblxuZXhwb3J0IGNsYXNzIFVJU2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBVSVNlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMuVUlTZXJ2aWNlO1xuICB9XG5cbiAgcHVibGljIGRpc3BsYXlEaWFsb2dBc3luYyh1cmw6IHN0cmluZywgcGF5bG9hZDogc3RyaW5nLCBvcHRpb25zPzogRGlhbG9nT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdkaXNwbGF5RGlhbG9nQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkV4dGVuc2lvbkRpYWxvZ1VybF06IHVybCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5FeHRlbnNpb25EaWFsb2dQYXlsb2FkXTogcGF5bG9hZCxcbiAgICB9O1xuXG4gICAgY29uc3QgaDogbnVtYmVyID0gb3B0aW9ucyAmJiBvcHRpb25zLmhlaWdodCA/IG9wdGlvbnMuaGVpZ2h0IDogREVGQVVMVF9ESUFMT0dfSEVJR0hUO1xuICAgIGNvbnN0IHc6IG51bWJlciA9IG9wdGlvbnMgJiYgb3B0aW9ucy53aWR0aCA/IG9wdGlvbnMud2lkdGggOiBERUZBVUxUX0RJQUxPR19XSURUSDtcbiAgICBjb25zdCBkaWFsb2dTdHlsZTogRGlhbG9nU3R5bGUgPSBvcHRpb25zICYmIG9wdGlvbnMuZGlhbG9nU3R5bGUgPyBvcHRpb25zLmRpYWxvZ1N0eWxlIDogREVGQVVMVF9ESUFMT0dfU1RZTEU7XG5cbiAgICAvLyBPbiB0aGUgcGxhdGZvcm0gc2lkZSwgd2UgZG8gc29tZXRoaW5nIHJlYXNvbmFibGUgcmVnYXJkZXNzIG9mIHdoZXRoZXIgdGhlIHBhc3NlZFxuICAgIC8vIGhlaWdodCBhbmQgd2lkdGggYXJlIHRvbyBsYXJnZSBvciB0b28gc21hbGwuICBCdXQgdGhpcyBsaWtlbHkgaW5kaWNhdGVzIGEgZGV2ZWxvcGVyIGVycm9yLFxuICAgIC8vIHNvIHdlIHRocm93IGFuIGVycm9yIGhlcmUgdG8gaGVscCB3aXRoIGRlYnVnZ2luZy5cbiAgICBpZiAoaCA8PSAwIHx8IHcgPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsICdTaXplIHBhcmFtZXRlcnMgZm9yIGRpc3BsYXlEaWFsb2dBc3luYyBtdXN0IGJlIHBvc2l0aXZlJyk7XG4gICAgfVxuXG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5FeHRlbnNpb25EaWFsb2dIXSA9IGg7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5FeHRlbnNpb25EaWFsb2dXXSA9IHc7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUVudW1WYWx1ZTxEaWFsb2dTdHlsZT4oZGlhbG9nU3R5bGUsIERpYWxvZ1N0eWxlLCAnRGlhbG9nU3R5bGUnKTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkV4dGVuc2lvbkRpYWxvZ1N0eWxlXSA9IEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncy5kaWFsb2dTdHlsZXMuY29udmVydChkaWFsb2dTdHlsZSk7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5EaXNwbGF5RGlhbG9nLCBwYXJhbWV0ZXJzKS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgZGlhbG9nUmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0IGFzIEV4dGVuc2lvbkRpYWxvZ1Jlc3VsdDtcbiAgICAgIHN3aXRjaCAoZGlhbG9nUmVzdWx0KSB7XG4gICAgICAgIGNhc2UgRXh0ZW5zaW9uRGlhbG9nUmVzdWx0LkRpYWxvZ0FscmVhZHlPcGVuOlxuICAgICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5EaWFsb2dBbHJlYWR5T3BlbiwgJ1RoZXJlIGFscmVhZHkgZXhpc3RzIGFuIG9wZW4gZGlhbG9nIGZvciB0aGlzIGV4dGVuc2lvbi4nKTtcbiAgICAgICAgY2FzZSBFeHRlbnNpb25EaWFsb2dSZXN1bHQuSW52YWxpZERvbWFpbjpcbiAgICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgICAgICAgRXJyb3JDb2Rlcy5JbnZhbGlkRG9tYWluRGlhbG9nLFxuICAgICAgICAgICAgJ1RoZSB1cmwgb2YgYW4gZXh0ZW5zaW9uIGRpYWxvZyBtdXN0IG1hdGNoIHRoZSBkb21haW4gb2YgdGhlIHBhcmVudCBleHRlbnNpb24uJyxcbiAgICAgICAgICApO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIFN1Y2Nlc3MgY2FzZVxuICAgICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBjbG9zZURpYWxvZyhwYXlsb2FkPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2Nsb3NlRGlhbG9nJyxcbiAgICB9O1xuXG4gICAgaWYgKHBheWxvYWQpIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRXh0ZW5zaW9uRGlhbG9nUGF5bG9hZF0gPSBwYXlsb2FkO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkNsb3NlRGlhbG9nLCBwYXJhbWV0ZXJzKS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRDbGlja1Rocm91Z2hBc3luYyhjbGlja1Rocm91Z2hFbmFibGVkOiBib29sZWFuLCBleHRlbnNpb25ab25lSWQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXJUeXBlKGNsaWNrVGhyb3VnaEVuYWJsZWQsICdib29sZWFuJywgJ2NsaWNrVGhyb3VnaEVuYWJsZWQnKTtcblxuICAgIGlmIChleHRlbnNpb25ab25lSWQgPT09IHVuZGVmaW5lZCB8fCBleHRlbnNpb25ab25lSWQgPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludGVybmFsRXJyb3IsICdFeHRlbnNpb24gSWQgaXMgaW52YWxpZC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5FeHRlbnNpb25ab25lSWRdOiBleHRlbnNpb25ab25lSWQsXG4gICAgICBbUGFyYW1ldGVySWQuQ2xpY2tUaHJvdWdoRW5hYmxlZF06IGNsaWNrVGhyb3VnaEVuYWJsZWQsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlNldENsaWNrVGhyb3VnaCwgcGFyYW1ldGVycykudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEludGVybmFsQXBpRGlzcGF0Y2hlciB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBBcGlTZXJ2aWNlUmVnaXN0cnkgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IEluaXRpYWxpemF0aW9uU2VydmljZUltcGwgfSBmcm9tICcuL0ltcGwvSW5pdGlhbGl6YXRpb25TZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBTZXR0aW5nc1NlcnZpY2VJbXBsIH0gZnJvbSAnLi9JbXBsL1NldHRpbmdzU2VydmljZUltcGwnO1xuaW1wb3J0IHsgVUlTZXJ2aWNlSW1wbCB9IGZyb20gJy4vSW1wbC9VSVNlcnZpY2VJbXBsJztcbmltcG9ydCB7IEV4dGVuc2lvbnNSZWdpc3RyeUlkIH0gZnJvbSAnLi9TZXJ2aWNlUmVnaXN0cnlVdGlsJztcblxuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyQWxsRXh0ZW5zaW9uc1NlcnZpY2VzKGRpc3BhdGNoZXI6IEludGVybmFsQXBpRGlzcGF0Y2hlcik6IHZvaWQge1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IFNldHRpbmdzU2VydmljZUltcGwoZGlzcGF0Y2hlciwgRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpKTtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBVSVNlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIEV4dGVuc2lvbnNSZWdpc3RyeUlkKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckluaXRpYWxpemF0aW9uRXh0ZW5zaW9uc1NlcnZpY2VzKGRpc3BhdGNoZXI6IEludGVybmFsQXBpRGlzcGF0Y2hlcik6IHZvaWQge1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IEluaXRpYWxpemF0aW9uU2VydmljZUltcGwoZGlzcGF0Y2hlciwgRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpKTtcbn1cbiIsImV4cG9ydCBjb25zdCBFeHRlbnNpb25zUmVnaXN0cnlJZCA9IDA7XG4iLCIvLyBUaGlzIGZpbGUgcmUtZXhwb3J0cyBldmVyeXRoaW5nIHdoaWNoIGlzIHBhcnQgb2YgdGhlIGV4dGVuc2lvbnMgYXBpIHB1YmxpYyBpbnRlcmZhY2VcblxuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0VtYmVkZGluZy9Bc2tEYXRhSW50ZXJmYWNlcyc7XG5leHBvcnQge1xuICBBcGlNZW51VHlwZSxcbiAgQ3Jvc3N0YWJGaWxlRm9ybWF0LFxuICBEZXZpY2VUeXBlLFxuICBFbWJlZGRpbmdFcnJvckNvZGVzLFxuICBUYWJsZWF1RXZlbnRUeXBlIGFzIEVtYmVkZGluZ1RhYmxlYXVFdmVudFR5cGUsXG4gIEZpbGVGb3JtYXRzLFxuICBQcmludE9yaWVudGF0aW9uLFxuICBQcmludFBhZ2VTaXplLFxuICBQcmludFNjYWxpbmcsXG4gIFB1bHNlRXJyb3JNZXNzYWdlVmlzaWJpbGl0eSxcbiAgUHVsc2VMYXlvdXQsXG4gIFB1bHNlVGltZURpbWVuc2lvbixcbiAgU2hlZXRTaXplQmVoYXZpb3IsXG4gIFRhYmxlYXVEaWFsb2dUeXBlLFxuICBUb29sYmFyLFxufSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL0VudW1zJztcbmV4cG9ydCB7XG4gIEN1c3RvbVZpZXdFdmVudCxcbiAgQ3VzdG9tTWFya0NvbnRleHRNZW51RXZlbnQgYXMgRW1iZWRkaW5nQ3VzdG9tTWFya0NvbnRleHRNZW51RXZlbnQsXG4gIEZpbHRlckNoYW5nZWRFdmVudCBhcyBFbWJlZGRpbmdGaWx0ZXJDaGFuZ2VkRXZlbnQsXG4gIE1hcmtzU2VsZWN0ZWRFdmVudCBhcyBFbWJlZGRpbmdNYXJrU2VsZWN0ZWRFdmVudCxcbiAgUGFyYW1ldGVyQ2hhbmdlZEV2ZW50IGFzIEVtYmVkZGluZ1BhcmFtZXRlckNoYW5nZWRFdmVudCxcbiAgU3VtbWFyeURhdGFDaGFuZ2VkRXZlbnQgYXMgRW1iZWRkaW5nU3VtbWFyeURhdGFDaGFuZ2VkRXZlbnQsXG4gIFRhYmxlYXVTaGVldEV2ZW50IGFzIEVtYmVkZGluZ1RhYmxlYXVTaGVldEV2ZW50LFxuICBUYWJsZWF1V29ya3NoZWV0RXZlbnQgYXMgRW1iZWRkaW5nVGFibGVhdVdvcmtzaGVldEV2ZW50LFxuICBUb29sYmFyU3RhdGVDaGFuZ2VkRXZlbnQgYXMgRW1iZWRkaW5nVG9vbGJhclN0YXRlQ2hhbmdlZEV2ZW50LFxuICBGaXJzdFB1bHNlTWV0cmljU2l6ZUtub3duRXZlbnQsXG4gIEZpcnN0Vml6U2l6ZUtub3duRXZlbnQsXG4gIFB1bHNlRXJyb3JFdmVudCxcbiAgUHVsc2VGaWx0ZXJzQ2hhbmdlZEV2ZW50LFxuICBQdWxzZUluc2lnaHREaXNjb3ZlcmVkRXZlbnQsXG4gIFB1bHNlVGltZURpbWVuc2lvbkNoYW5nZWRFdmVudCxcbiAgUHVsc2VVcmxDaGFuZ2VkRXZlbnQsXG4gIFN0b3J5UG9pbnRTd2l0Y2hlZEV2ZW50LFxuICBUYWJTd2l0Y2hlZEV2ZW50LFxuICBVcmxBY3Rpb25FdmVudCxcbiAgVml6TG9hZEVycm9yRXZlbnQsXG4gIFdvcmtib29rUHVibGlzaGVkQXNFdmVudCxcbn0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0VtYmVkZGluZy9FdmVudEludGVyZmFjZXMnO1xuZXhwb3J0IHsgUGFyYW1ldGVyIGFzIEVtYmVkZGluZ1BhcmFtZXRlciB9IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvUGFyYW1ldGVySW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1B1bHNlSW50ZXJmYWNlcyc7XG5leHBvcnQge1xuICBDb250ZXh0TWVudU9wdGlvbnMsXG4gIEVtYmVkZGluZ0Fic3RyYWN0UXVlcnksXG4gIEF1dGhvcmluZ1dvcmtzaGVldCBhcyBFbWJlZGRpbmdBdXRob3JpbmdXb3Jrc2hlZXQsXG4gIERhc2hib2FyZCBhcyBFbWJlZGRpbmdEYXNoYm9hcmQsXG4gIERhc2hib2FyZE9iamVjdCBhcyBFbWJlZGRpbmdEYXNoYm9hcmRPYmplY3QsXG4gIFNoZWV0IGFzIEVtYmVkZGluZ1NoZWV0LFxuICBFbWJlZGRpbmdWaXpTdGF0ZVdpdGhEYXRhTW9kZWwsXG4gIFdvcmtzaGVldCBhcyBFbWJlZGRpbmdXb3Jrc2hlZXQsXG4gIEhpZXJhcmNoaWNhbExldmVscyxcbiAgU2hlZXRJbmZvLFxuICBTaGVldFNpemUsXG59IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvU2hlZXRJbnRlcmZhY2VzJztcbmV4cG9ydCB7IFN0b3J5LCBTdG9yeVBvaW50LCBTdG9yeVBvaW50SW5mbyB9IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvU3RvcnlJbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvVGFibGVhdUVycm9yJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvVml6SW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1dlYkNvbXBvbmVudEludGVyZmFjZXMnO1xuZXhwb3J0IHtcbiAgQ3VzdG9tVmlldyxcbiAgQXV0aG9yaW5nV29ya2Jvb2sgYXMgRW1iZWRkaW5nQXV0aG9yaW5nV29ya2Jvb2ssXG4gIFdvcmtib29rIGFzIEVtYmVkZGluZ1dvcmtib29rLFxufSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1dvcmtib29rSW50ZXJmYWNlJztcbmV4cG9ydCAqIGZyb20gJy4vU2hhcmVkQXBpRXh0ZXJuYWxDb250cmFjdCc7XG4iLCIvLyBUaGlzIGZpbGUgcmUtZXhwb3J0cyBldmVyeXRoaW5nIHdoaWNoIGlzIHBhcnQgb2YgdGhlIGV4dGVuc2lvbnMgYXBpIHB1YmxpYyBpbnRlcmZhY2VcblxuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0V4dGVuc2lvbnMvRXZlbnRJbnRlcmZhY2UnO1xuZXhwb3J0IHsgRGFzaGJvYXJkQ29udGVudCB9IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FeHRlbnNpb25zL05hbWVzcGFjZXMvRGFzaGJvYXJkQ29udGVudCc7XG5leHBvcnQgeyBFbnZpcm9ubWVudCB9IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FeHRlbnNpb25zL05hbWVzcGFjZXMvRW52aXJvbm1lbnQnO1xuZXhwb3J0IHsgRXh0ZW5zaW9ucyB9IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FeHRlbnNpb25zL05hbWVzcGFjZXMvRXh0ZW5zaW9ucyc7XG5leHBvcnQgeyBTZXR0aW5ncyB9IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FeHRlbnNpb25zL05hbWVzcGFjZXMvU2V0dGluZ3MnO1xuZXhwb3J0IHtcbiAgRXJyb3JDb2RlcyxcbiAgRXh0ZW5zaW9uQ29udGV4dCxcbiAgRXh0ZW5zaW9uTW9kZSxcbiAgVGFibGVhdUV2ZW50VHlwZSxcbiAgVml6SW1hZ2VFbmNvZGluZ1R5cGUsXG4gIFZpekltYWdlUGFsZXR0ZVR5cGUsXG4gIFZpekltYWdlU2l6ZVNldHRpbmdBbGlnbm1lbnRUeXBlLFxuICBWaXpJbWFnZVNpemVTZXR0aW5nVHlwZSxcbiAgVml6SW1hZ2VTb3J0RGlyZWN0aW9uVHlwZSxcbn0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0V4dGVuc2lvbnMvTmFtZXNwYWNlcy9UYWJsZWF1JztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FeHRlbnNpb25zL05hbWVzcGFjZXMvVUknO1xuZXhwb3J0IHsgV29ya3NoZWV0Q29udGVudCB9IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FeHRlbnNpb25zL05hbWVzcGFjZXMvV29ya3NoZWV0Q29udGVudCc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9QYXJhbWV0ZXJJbnRlcmZhY2VzJztcbmV4cG9ydCB7XG4gIERhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZSxcbiAgRGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlQXJyYXksXG4gIERhc2hib2FyZE9iamVjdFZpc2liaWxpdHlNYXAsXG4gIERhc2hib2FyZCBhcyBFeHRlbnNpb25EYXNoYm9hcmQsXG4gIERhc2hib2FyZE9iamVjdCBhcyBFeHRlbnNpb25EYXNoYm9hcmRPYmplY3QsXG4gIFNoZWV0IGFzIEV4dGVuc2lvblNoZWV0LFxuICBXb3Jrc2hlZXQgYXMgRXh0ZW5zaW9uV29ya3NoZWV0LFxuICBQb2ludCxcbiAgWm9uZVZpc2liaWxpdHlNYXAsXG59IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FeHRlbnNpb25zL1NoZWV0SW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9UYWJsZWF1RXJyb3InO1xuZXhwb3J0IHsgV29ya2Jvb2sgYXMgRXh0ZW5zaW9uV29ya2Jvb2sgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9Xb3JrYm9va0ludGVyZmFjZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9TaGFyZWRBcGlFeHRlcm5hbENvbnRyYWN0JztcbiIsIi8qKlxuICogVGhpcyBpcyB5b3VyIG1haW4uIFRoaXMgaXMgd2hlcmUgeW91IHJlLWV4cG9ydCBldmVyeXRoaW5nIHlvdSB3YW50IHRvIGJlIHB1YmxpY2x5IGF2YWlsYWJsZS5cbiAqXG4gKiBUaGUgYnVpbGQgZW5mb3JjZXMgdGhhdCB0aGUgZmlsZSBoYXMgdGhlIHNhbWUgbmFtZSBhcyB0aGUgZ2xvYmFsIHZhcmlhYmxlIHRoYXQgaXMgZXhwb3J0ZWQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9FbWJlZGRpbmdBcGlFeHRlcm5hbENvbnRyYWN0JztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZW5zaW9uc0FwaUV4dGVybmFsQ29udHJhY3QnO1xuIiwiaW1wb3J0IHsgV2ViQ29tcG9uZW50TG9jYWxTZXR0aW5ncywgV2ViQ29tcG9uZW50U2V0dGluZ3NTaGFyZWQgfSBmcm9tICcuL1dlYkNvbXBvbmVudEludGVyZmFjZXMnO1xuXG4vKipcbiAqIFRoZSBuYW1lcyBvZiB0aGUgc3RyaW5nIGNvbnN0YW50cyB5b3UgY2FuIHVzZSBhcyBIVE1MIGF0dHJpYnV0ZXMgZm9yIHRoZSA8dGFibGVhdS1hc2stZGF0YT4gd2ViIGNvbXBvbmVudC5cbiAqIEBpZ25vcmVcbiAqIEBkZXByZWNhdGVkXG4gKi9cbmV4cG9ydCBlbnVtIEFza0RhdGFBdHRyaWJ1dGVzIHtcbiAgT3JpZ2luID0gJ29yaWdpbicsXG4gIFNob3dFbWJlZCA9ICdzaG93LWVtYmVkJyxcbiAgU2hvd1BpbiA9ICdzaG93LXBpbicsXG4gIFNob3dTYXZlID0gJ3Nob3ctc2F2ZScsXG4gIFNob3dTaGFyZSA9ICdzaG93LXNoYXJlJyxcbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFza0RhdGFTZXR0aW5ncyBleHRlbmRzIFdlYkNvbXBvbmVudFNldHRpbmdzU2hhcmVkLCBXZWJDb21wb25lbnRMb2NhbFNldHRpbmdzIHtcbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBlbWJlZCBidXR0b24gaXMgaGlkZGVuIG9yIHZpc2libGUuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS1hc2stZGF0YSBpZD1cInRhYmxlYXVBc2tEYXRhXCIgc2hvdy1lbWJlZD5cbiAgICogYGBgXG4gICAqL1xuICBzaG93RW1iZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgcGluIGJ1dHRvbiBpcyBoaWRkZW4gb3IgdmlzaWJsZS5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LWFzay1kYXRhIGlkPVwidGFibGVhdUFza0RhdGFcIiBzaG93LXBpbj5cbiAgICogYGBgXG4gICAqL1xuICBzaG93UGluPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHNhdmUgYnV0dG9uIGlzIGhpZGRlbiBvciB2aXNpYmxlLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtYXNrLWRhdGEgaWQ9XCJ0YWJsZWF1QXNrRGF0YVwiIHNob3ctc2F2ZT5cbiAgICogYGBgXG4gICAqL1xuICBzaG93U2F2ZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzaGFyZSBidXR0b24gaXMgaGlkZGVuIG9yIHZpc2libGUuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS1hc2stZGF0YSBpZD1cInRhYmxlYXVBc2tEYXRhXCIgc2hvdy1zaGFyZT5cbiAgICogYGBgXG4gICAqL1xuICBzaG93U2hhcmU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiAgVXNlZCBmb3IgdGVsZW1ldHJ5XG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS1hc2stZGF0YSBpZD1cInRhYmxlYXVBc2tEYXRhXCIgb3JpZ2luPVwiZW1iZWRkaW5nU2l0ZVwiPlxuICAgKiBgYGBcbiAgICovXG4gIG9yaWdpbj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgaW50ZXJmYWNlIGZvciB0aGUgdG9wIGxldmVsIEFza0RhdGEgb2JqZWN0LlxuICogQGRlcHJlY2F0ZWRcbiAqKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNrRGF0YSBleHRlbmRzIEFza0RhdGFTZXR0aW5ncyB7fVxuIiwiLy8gQWxsIGVudW0gdmFsdWVzIG1hZGUgYXZhaWxhYmxlIHRvIEVtYmVkZGluZyBkZXZlbG9wZXJzLlxuLy8gRW51bXMgc2hvdWxkIGJlIGtlcHQgaW4gYWxwaGFiZXRpY2FsIG9yZGVyLlxuLy8gTW9zdCBvZiB0aGVtIHNob3VsZCBtYXRjaCBhbiBlbnVtIG9uIHRoZSBzZXJ2ZXIgZGVmaW5lZCBhdFxuLy8gd29ya2dyb3VwL3ZxbHdlYi9zY3JpcHRzaGFycC9zcmMvQXBpU2hhcmVkL1B1YmxpY0VudW1zLmNzI0wzOTg6MTdcblxuLyoqXG4gKiBDcm9zc3RhYiBmaWxlIGZvcm1hdHMgYXZhaWxhYmxlIHRvIHVzZSB3aXRoIHtAbGluayBWaXouZXhwb3J0Q3Jvc3N0YWJBc3luY31cbiAqL1xuZXhwb3J0IGVudW0gQ3Jvc3N0YWJGaWxlRm9ybWF0IHtcbiAgQ1NWID0gJ2NzdicsXG4gIEV4Y2VsID0gJ3hsc3gnLFxufVxuXG4vKipcbiAqIERldmljZSB0eXBlcyBhdmFpbGFibGUgdG8gdXNlIHdpdGgge0BsaW5rIFZpei5kZXZpY2V9XG4gKi9cbmV4cG9ydCBlbnVtIERldmljZVR5cGUge1xuICBEZWZhdWx0ID0gJ2RlZmF1bHQnLFxuICBEZXNrdG9wID0gJ2Rlc2t0b3AnLFxuICBUYWJsZXQgPSAndGFibGV0JyxcbiAgUGhvbmUgPSAncGhvbmUnLFxufVxuXG4vKipcbiAqIEFsbCBlcnJvciBjb2RlcyB1c2VkIGJ5IHRoZSBFbWJlZGRpbmcgQVBJLlxuICovXG5leHBvcnQgZW51bSBFbWJlZGRpbmdFcnJvckNvZGVzIHtcbiAgLyoqXG4gICAqIFJhaXNlZCB3aGVuIGEgcmVxdWVzdCB0byB0aGUgYXV0aCBlbmRwb2ludCBmYWlscy5cbiAgICovXG4gIEF1dGhGYWlsZWQgPSAnYXV0aC1mYWlsZWQnLFxuICAvKipcbiAgICogVGhlIGJyb3dzZXIgaXMgbm90IGNhcGFibGUgb2Ygc3VwcG9ydGluZyB0aGUgVGFibGVhdSBFbWJlZGRpbmcgQVBJXG4gICAqL1xuICBCcm93c2VyTm90Q2FwYWJsZSA9ICdicm93c2VyLW5vdC1jYXBhYmxlJyxcbiAgLyoqXG4gICAqIFRoZSBwZXJtaXNzaW9ucyBvbiBhIHdvcmtib29rIG9yIGEgdmlldyBkbyBub3QgYWxsb3cgZG93bmxvYWRpbmcgdGhlIHdvcmtib29rLlxuICAgKi9cbiAgRG93bmxvYWRXb3JrYm9va05vdEFsbG93ZWQgPSAnZG93bmxvYWQtd29ya2Jvb2stbm90LWFsbG93ZWQnLFxuICAvKipcbiAgICogVGhyb3duIHdoZW4gYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGF0dGVtcHRpbmcgdG8gcGVyZm9ybSBhIGZpbHRlciBvcGVyYXRpb24uXG4gICAqL1xuICBGaWx0ZXJDYW5ub3RCZVBlcmZvcm1lZCA9ICdmaWx0ZXItY2Fubm90LWJlLXBlcmZvcm1lZCcsXG4gIC8qKlxuICAgKiBUaHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIHN3aXRjaCB0byBhIHNoZWV0IGJ5IGluZGV4IHRoYXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIHdvcmtib29rLlxuICAgKi9cbiAgSW5kZXhPdXRPZlJhbmdlID0gJ2luZGV4LW91dC1vZi1yYW5nZScsXG4gIC8qKlxuICAgKiBUaHJvd24gd2hlbiBhbiBlcnJvciBvY2N1cnMgd2l0aGluIHRoZSBUYWJsZWF1IEVtYmVkZGluZyBBUEkuIENvbnRhY3QgVGFibGVhdSBTdXBwb3J0LlxuICAgKi9cbiAgSW50ZXJuYWxFcnJvciA9ICdpbnRlcm5hbC1lcnJvcicsXG4gIC8qKlxuICAgKiBBbiBvcGVyYXRpb24gd2FzIGF0dGVtcHRlZCBvbiBhIGN1c3RvbSB2aWV3IHRoYXQgZG9lcyBub3QgZXhpc3QuXG4gICAqL1xuICBJbnZhbGlkQ3VzdG9tVmlld05hbWUgPSAnaW52YWxpZC1jdXN0b20tdmlldy1uYW1lJyxcbiAgLyoqXG4gICAqIEFuIGludmFsaWQgZGF0ZSB3YXMgc3BlY2lmaWVkIGluIGEgbWV0aG9kIHRoYXQgcmVxdWlyZWQgYSBkYXRlIHBhcmFtZXRlci5cbiAgICovXG4gIEludmFsaWREYXRlUGFyYW1ldGVyID0gJ2ludmFsaWQtZGF0ZS1wYXJhbWV0ZXInLFxuICAvKipcbiAgICogRWl0aGVyIGEgZmlsdGVyIG9wZXJhdGlvbiB3YXMgYXR0ZW1wdGVkIG9uIGEgZmllbGQgdGhhdCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgZGF0YSBzb3VyY2UsIG9yIHRoZSB2YWx1ZSBzdXBwbGllZFxuICAgKiBpbiB0aGUgZmlsdGVyIG9wZXJhdGlvbiBpcyB0aGUgd3JvbmcgZGF0YSB0eXBlIG9yIGZvcm1hdC5cbiAgICovXG4gIGludmFsaWRGaWx0ZXJGaWVsZE5hbWVPclZhbHVlID0gJ2ludmFsaWQtZmlsdGVyLWZpZWxkLW5hbWUnLFxuICAvKipcbiAgICogQSBwYXJhbWV0ZXIgaXMgbm90IHRoZSBjb3JyZWN0IGRhdGEgdHlwZSBvciBmb3JtYXQuIFRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgaXMgc3BlY2lmaWVkIGluIHRoZSBFcnJvci5tZXNzYWdlXG4gICAqIGZpZWxkLlxuICAgKi9cbiAgSW52YWxpZFBhcmFtZXRlciA9ICdpbnZhbGlkLXBhcmFtZXRlcicsXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudGx5IGFwcGxpZWQgdGltZSBkaW1lbnNpb24gY291bGQgbm90IGJlIGRldGVybWluZWQgb3IgaXMgaW52YWxpZC5cbiAgICovXG4gIEludmFsaWRUaW1lRGltZW5zaW9uID0gJ2ludmFsaWQtdGltZS1kaW1lbnNpb24nLFxuICAvKipcbiAgICogQSBuZWdhdGl2ZSBzaXplIHdhcyBzcGVjaWZpZWQgb3IgdGhlIG1heFNpemUgdmFsdWUgaXMgbGVzcyB0aGFuIG1pblNpemUgaW4gU2hlZXQuY2hhbmdlU2l6ZUFzeW5jKCkuXG4gICAqL1xuICBJbnZhbGlkU2l6ZSA9ICdpbnZhbGlkLXNpemUnLFxuICAvKipcbiAgICogQXR0ZW1wdGVkIHRvIGdldCBhbiBhdXRob3Jpbmcgd29ya3NoZWV0IHdoZW4gdGhlIGN1cnJlbnQgc2hlZXQgaXMgbm90IGEgd29ya3NoZWV0LlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBJbnZhbGlkU2hlZXRUeXBlID0gJ2ludmFsaWQtc2hlZXQtdHlwZScsXG4gIC8qKlxuICAgKiBBIGJlaGF2aW9yIHZhbHVlIHdhcyBmb3VuZCB0aGF0IGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgU2hlZXRTaXplQmVoYXZpb3IgZW51bS5cbiAgICovXG4gIEludmFsaWRTaXplQmVoYXZpb3IgPSAnaW52YWxpZC1zaXplLWJlaGF2aW9yJyxcbiAgLyoqXG4gICAqIEEgYmVoYXZpb3Igb3RoZXIgdGhhbiBTaGVldFNpemVCZWhhdmlvci5BdXRvbWF0aWMgd2FzIHNwZWNpZmllZCBpbiBTaGVldC5jaGFuZ2VTaXplQXN5bmMoKSB3aGVuIHRoZSBzaGVldCBpcyBhXG4gICAqIFdvcmtzaGVldCBpbnN0YW5jZS5cbiAgICovXG4gIEludmFsaWRTaXplQmVoYXZpb3JPbldvcmtzaGVldCA9ICdpbnZhbGlkLXNpemUtYmVoYXZpb3Itb24td29ya3NoZWV0JyxcbiAgLyoqXG4gICAqIFRoZSBVUkwgc3BlY2lmaWVkIGluIHRoZSBWaXogY2xhc3MgY29uc3RydWN0b3IgaXMgbm90IHZhbGlkLlxuICAgKi9cbiAgSW52YWxpZFVybCA9ICdpbnZhbGlkLXVybCcsXG4gIC8qKlxuICAgKiBUaGUgbWF4U2l6ZSBmaWVsZCBpcyBtaXNzaW5nIGluIFNoZWV0LmNoYW5nZVNpemVBc3luYygpIHdoZW4gc3BlY2lmeWluZyBTaGVldFNpemVCZWhhdmlvci5BdE1vc3QuXG4gICAqL1xuICBNaXNzaW5nTWF4U2l6ZSA9ICdtaXNzaW5nLW1heC1zaXplJyxcbiAgLyoqXG4gICAqIFRoZSBtaW5TaXplIGZpZWxkIGlzIG1pc3NpbmcgaW4gU2hlZXQuY2hhbmdlU2l6ZUFzeW5jKCkgd2hlbiBzcGVjaWZ5aW5nIFNoZWV0U2l6ZUJlaGF2aW9yLkF0TGVhc3QuXG4gICAqL1xuICBNaXNzaW5nTWluU2l6ZSA9ICdtaXNzaW5nLW1pbi1zaXplJyxcbiAgLyoqXG4gICAqIFRoZSBtaW5TaXplIG9yIG1heFNpemUgZmllbGQgaXMgbWlzc2luZyBpbiBTaGVldC5jaGFuZ2VTaXplQXN5bmMoKSB3aGVuIHNwZWNpZnlpbmcgU2hlZXRTaXplQmVoYXZpb3IuUmFuZ2UuXG4gICAqL1xuICBNaXNzaW5nTWluTWF4U2l6ZSA9ICdtaXNzaW5nLW1pbi1tYXgtc2l6ZScsXG4gIC8qKlxuICAgKiBDYW4gb2NjdXIgaWYgdGhlIGVtYmVkZGluZyBhcHAgaW50ZXJhY3RzIHdpdGggYSBwYXJhbWV0ZXIgdGhhdCBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIHdvcmtzaGVldC5cbiAgICovXG4gIE1pc3NpbmdQYXJhbWV0ZXIgPSAnbWlzc2luZy1wYXJhbWV0ZXInLFxuICAvKipcbiAgICogVGhlIHJhbmdlTiBmaWVsZCBpcyBtaXNzaW5nIGZvciBhIHJlbGF0aXZlIGRhdGUgZmlsdGVyIG9mIHR5cGUgTEFTVE4gb3IgTkVYVE4uXG4gICAqL1xuICBNaXNzaW5nUmFuZ2VORm9yUmVsYXRpdmVEYXRlRmlsdGVycyA9ICdtaXNzaW5nLXJhbmdlLW4tZm9yLXJlbGF0aXZlLWRhdGUtZmlsdGVycycsXG4gIC8qKlxuICAgKiBBbiBhdHRlbXB0IHdhcyBtYWRlIHRvIGFjY2VzcyBTaGVldC5nZXRVcmwoKSBvbiBhIGhpZGRlbiBzaGVldC4gSGlkZGVuIHNoZWV0cyBkbyBub3QgaGF2ZSBVUkxzLlxuICAgKi9cbiAgTm9VcmxGb3JIaWRkZW5Xb3Jrc2hlZXQgPSAnbm8tdXJsLWZvci1oaWRkZW4td29ya3NoZWV0JyxcbiAgLyoqXG4gICAqIE9uZSBvciBib3RoIG9mIHRoZSBwYXJlbnRFbGVtZW50IG9yIHRoZSBVUkwgcGFyYW1ldGVycyBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBWaXogY29uc3RydWN0b3IuXG4gICAqL1xuICBOb1VybE9yUGFyZW50RWxlbWVudE5vdEZvdW5kID0gJ25vLXVybC1vci1wYXJlbnQtZWxlbWVudC1ub3QtZm91bmQnLFxuICAvKipcbiAgICogQW4gb3BlcmF0aW9uIHdhcyBhdHRlbXB0ZWQgb24gYSBzaGVldCB0aGF0IGlzIG5vdCBhY3RpdmUgb3IgZW1iZWRkZWQgd2l0aGluIHRoZSBhY3RpdmUgZGFzaGJvYXJkLlxuICAgKi9cbiAgTm90QWN0aXZlU2hlZXQgPSAnbm90LWFjdGl2ZS1zaGVldCcsXG4gIC8qKlxuICAgKiBBIHJlcXVpcmVkIHBhcmFtZXRlciB3YXMgbm90IHNwZWNpZmllZCwgbnVsbCwgb3IgYW4gZW1wdHkgc3RyaW5nL2FycmF5LlxuICAgKi9cbiAgTnVsbE9yRW1wdHlQYXJhbWV0ZXIgPSAnbnVsbC1vci1lbXB0eS1wYXJhbWV0ZXInLFxuICAvKipcbiAgICogQW4gb3BlcmF0aW9uIHdhcyBhdHRlbXB0ZWQgb24gYSBzaGVldCB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSB3b3JrYm9vay5cbiAgICovXG4gIFNoZWV0Tm90SW5Xb3JrYm9vayA9ICdzaGVldC1ub3QtaW4td29ya2Jvb2snLFxuICAvKipcbiAgICogQW4gb3BlcmF0aW9uIGlzIHBlcmZvcm1lZCBvbiBhIEN1c3RvbVZpZXcgb2JqZWN0IHRoYXQgaXMgbm8gbG9uZ2VyIHZhbGlkIChpdCBoYXMgYmVlbiByZW1vdmVkKS5cbiAgICovXG4gIFN0YWxlRGF0YVJlZmVyZW5jZSA9ICdzdGFsZS1kYXRhLXJlZmVyZW5jZScsXG4gIC8qKlxuICAgKiBVbmtub3duIGVycm9yIHRyaWdnZXJlZCBkdXJpbmcgdGhlIGF1dGggZmxvdy5cbiAgICovXG4gIFVua25vd25BdXRoRXJyb3IgPSAndW5rbm93bi1hdXRoLWVycm9yJyxcbiAgLyoqXG4gICAqIEFuIHVua25vd24gZXZlbnQgbmFtZSB3YXMgc3BlY2lmaWVkIGluIHRoZSBjYWxsIHRvIFZpei5hZGRFdmVudExpc3RlbmVyIG9yIFZpei5yZW1vdmVFdmVudExpc3RlbmVyLlxuICAgKi9cbiAgVW5zdXBwb3J0ZWRFdmVudE5hbWUgPSAndW5zdXBwb3J0ZWQtZXZlbnQtbmFtZScsXG4gIC8qKlxuICAgKiBBIFZpeiBvYmplY3QgaGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkIGFzIGEgY2hpbGQgb2YgdGhlIHBhcmVudEVsZW1lbnQgc3BlY2lmaWVkIGluIHRoZSBWaXogY29uc3RydWN0b3IuXG4gICAqL1xuICBWaXpBbHJlYWR5SW5NYW5hZ2VyID0gJ3Zpei1hbHJlYWR5LWluLW1hbmFnZXInLFxuICAvKipcbiAgICogRnVuY3Rpb24gaXMgbm90IHN1cHBvcnRlZCBpbiB0aGUgZW1iZWRkaW5nIGFwaS5cbiAgICovXG4gIEltcGxlbWVudGF0aW9uRXJyb3IgPSAnd3JvbmctaW1wbGVtZW50YXRpb24nLFxuICAvKipcbiAgICogQE5vdEltcGxlbWVudGVkXG4gICAqL1xuICBOb3RJbXBsZW1lbnRlZCA9ICdub3QtaW1wbGVtZW50ZWQnLFxuICAvKipcbiAgICogVW5rbm93biBlcnJvciBkdXJpbmcgZXZlbnQgaW5pdGlhbGl6YXRpb25cbiAgICovXG4gIEV2ZW50SW5pdGlhbGl6YXRpb25FcnJvciA9ICdldmVudC1pbml0aWFsaXphdGlvbi1lcnJvcicsXG4gIC8qKlxuICAgKiBWZXJzaW9uIG9mIHRoZSBlbWJlZGRpbmcgYXBpIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHZlcnNpb24gb2YgdGFibGVhdVxuICAgKi9cbiAgSW5jb21wYXRpYmxlVmVyc2lvbkVycm9yID0gJ2luY29tcGF0aWJsZS12ZXJzaW9uLWVycm9yJyxcblxuICAvKipcbiAgICogVW5rbm93biB7QGxpbmsgVGFibGVhdURpYWxvZ1R5cGV9IHBhc3NlZCBpbiB0byBWaXouZGlzcGxheURpYWxvZ0FzeW5jLlxuICAgKi9cbiAgVW5rbm93bkRpYWxvZ1R5cGUgPSAndW5rbm93bi1kaWFsb2ctdHlwZScsXG5cbiAgLyoqXG4gICAqIENhbiBvY2N1ciBpZiB0aGUgQVBJIGludGVyYWN0cyB3aXRoIGEgZmlsdGVyIHRoYXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSB3b3Jrc2hlZXQuXG4gICAqIENhbiBhbHNvIG9jY3VycyBpZiBhIHtAbGluayBGaWx0ZXJUeXBlfSBoYXMgbm90IGJlZW4gaW1wbGVtZW50ZWQuXG4gICAqL1xuICBGaWx0ZXJNaXNzaW5nT3JOb3RJbXBsZW1lbnRlZCA9ICdmaWx0ZXItbWlzc2luZy1ub3QtaW1wbGVtZW50ZWQnLFxuXG4gIC8qKlxuICAgKiBDYW4gb2NjdXIgaWYgc3RvcnkgcG9pbnQgaWRzIG5vIGxvbmdlciBtYXRjaC5cbiAgICovXG4gIFN0b3J5UG9pbnRJZE1pc21hdGNoID0gJ3N0b3J5cG9pbnQtaWQtbWlzbWF0Y2gnLFxufVxuXG4vKipcbiAqIEZvcm1hdHMgYXZhaWxhYmxlIHRvIHVzZSB3aXRoIGRpc3BsYXlTdGF0aWNJbWFnZSBpbiBAVml6SW50ZXJmYWNlc1xuICovXG5leHBvcnQgZW51bSBGaWxlRm9ybWF0cyB7XG4gIFBERiA9ICdwZGYnLFxuICBQTkcgPSAncG5nJyxcbn1cblxuZXhwb3J0IGVudW0gUHJpbnRPcmllbnRhdGlvbiB7XG4gIFBvcnRyYWl0ID0gJ3BvcnRyYWl0JyxcbiAgTGFuZHNjYXBlID0gJ2xhbmRzY2FwZScsXG59XG5cbmV4cG9ydCBlbnVtIFByaW50UGFnZVNpemUge1xuICBMZXR0ZXIgPSAnbGV0dGVyJyxcbiAgTGVnYWwgPSAnbGVnYWwnLFxuICBOb3RlID0gJ25vdGUnLFxuICBGb2xpbyA9ICdmb2xpbycsXG4gIFRhYmxvaWQgPSAndGFibG9pZCcsXG4gIExlZGdlciA9ICdsZWRnZXInLFxuICBTdGF0ZW1lbnQgPSAnc3RhdGVtZW50JyxcbiAgRXhlY3V0aXZlID0gJ2V4ZWN1dGl2ZScsXG4gIEEzID0gJ0EzJyxcbiAgQTQgPSAnQTQnLFxuICBBNSA9ICdBNScsXG4gIEI0ID0gJ0I0JyxcbiAgQjUgPSAnQjUnLFxuICBRdWFydG8gPSAncXVhcnRvJyxcbiAgVW5zcGVjaWZpZWQgPSAndW5zcGVjaWZpZWQnLFxufVxuXG5leHBvcnQgZW51bSBQcmludFNjYWxpbmcge1xuICBBdXRvbWF0aWMgPSAnYXV0b21hdGljJyxcbiAgUGVyYzI1ID0gJzI1JScsXG4gIFBlcmM1MCA9ICc1MCUnLFxuICBQZXJjNjAgPSAnNjAlJyxcbiAgUGVyYzc1ID0gJzc1JScsXG4gIFBlcmM4MCA9ICc4MCUnLFxuICBQZXJjOTAgPSAnOTAlJyxcbiAgUGVyYzEwMCA9ICcxMDAlJyxcbiAgUGVyYzIwMCA9ICcyMDAlJyxcbiAgUGVyYzQwMCA9ICc0MDAlJyxcbiAgQXRNb3N0MVBhZ2VIaWdoID0gJ2F0LW1vc3QtMS1wYWdlLWhpZ2gnLFxuICBBdE1vc3QyUGFnZXNIaWdoID0gJ2F0LW1vc3QtMi1wYWdlcy1oaWdoJyxcbiAgQXRNb3N0MVBhZ2VXaWRlID0gJ2F0LW1vc3QtMS1wYWdlLXdpZGUnLFxuICBBdE1vc3QyUGFnZXNXaWRlID0gJ2F0LW1vc3QtMi1wYWdlcy13aWRlJyxcbn1cblxuZXhwb3J0IGVudW0gUmV2ZXJ0Vml6U2VsZWN0aW9uIHtcbiAgQWxsID0gJ2FsbCcsXG4gIEF4ZXMgPSAnYXhlcycsXG4gIEZpbHRlcnMgPSAnZmlsdGVycycsXG4gIFNvcnRzID0gJ3NvcnRzJyxcbiAgU2hlbHZlcyA9ICdzaGVsdmVzJyxcbn1cblxuZXhwb3J0IGVudW0gVG9vbGJhckJ1dHRvbnMge1xuICBBbGVydHMgPSAnYWxlcnRzJyxcbiAgQXNrRGF0YSA9ICdhc2tEYXRhJyxcbiAgQ3VzdG9tVmlld3MgPSAnY3VzdG9tVmlld3MnLFxuICBEYXRhRGV0YWlscyA9ICdkYXRhRGV0YWlscycsXG4gIFNoYXJlID0gJ3NoYXJlJyxcbiAgU3Vic2NyaWJlID0gJ3N1YnNjcmliZScsXG59XG5cbmV4cG9ydCBlbnVtIFRvb2xiYXIge1xuICBUb3AgPSAndG9wJyxcbiAgQm90dG9tID0gJ2JvdHRvbScsXG4gIEhpZGRlbiA9ICdoaWRkZW4nLFxufVxuXG5leHBvcnQgZW51bSBTaGVldFNpemVCZWhhdmlvciB7XG4gIEF1dG9tYXRpYyA9ICdhdXRvbWF0aWMnLFxuICBFeGFjdGx5ID0gJ2V4YWN0bHknLFxuICBSYW5nZSA9ICdyYW5nZScsXG4gIEF0TGVhc3QgPSAnYXRsZWFzdCcsXG4gIEF0TW9zdCA9ICdhdG1vc3QnLFxufVxuXG5leHBvcnQgZW51bSBQdWxzZUxheW91dCB7XG4gIERlZmF1bHQgPSAnZGVmYXVsdCcsXG4gIENhcmQgPSAnY2FyZCcsXG4gIEJhbiA9ICdiYW4nLFxufVxuXG5leHBvcnQgZW51bSBQdWxzZVRpbWVEaW1lbnNpb24ge1xuICBUb2RheSA9ICdUb2RheScsXG4gIFllc3RlcmRheSA9ICdZZXN0ZXJkYXknLFxuICBXZWVrVG9EYXRlID0gJ1dlZWtUb0RhdGUnLFxuICBMYXN0V2VlayA9ICdMYXN0V2VlaycsXG4gIE1vbnRoVG9EYXRlID0gJ01vbnRoVG9EYXRlJyxcbiAgTGFzdE1vbnRoID0gJ0xhc3RNb250aCcsXG4gIFF1YXJ0ZXJUb0RhdGUgPSAnUXVhcnRlclRvRGF0ZScsXG4gIExhc3RRdWFydGVyID0gJ0xhc3RRdWFydGVyJyxcbiAgWWVhclRvRGF0ZSA9ICdZZWFyVG9EYXRlJyxcbiAgTGFzdFllYXIgPSAnTGFzdFllYXInLFxufVxuXG5leHBvcnQgZW51bSBQdWxzZUVycm9yTWVzc2FnZVZpc2liaWxpdHkge1xuICBWaXNpYmxlID0gJ3Zpc2libGUnLFxuICBIaWRkZW4gPSAnaGlkZGVuJyxcbiAgU3VwcHJlc3NlZCA9ICdzdXBwcmVzc2VkJyxcbn1cblxuLyoqXG4gKiBCZSBjYXJlZnVsIHdoZW4gYWRkaW5nIG5ldyBldmVudCB0eXBlcy4gRXh0ZW5zaW9ucyBhbmQgZW1iZWRkaW5nIGZvbGxvdyB0d28gZGlmZmVyZW50IHBhdHRlcm5zIG9uIGhvdyBldmVudHMgYXJlIG5hbWVkLlxuICogRXZlbnRzIHNob3VsZCBiZSBhbGwgbG93ZXIgY2FzZSBhbmQgd2l0aG91dCBoeXBoZW5zIG9yIHVuZGVyc2NvcmVzLlxuICovXG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgdHlwZSBvZiB0YWJsZWF1IGVtYmVkZGluZyBldmVudCB0aGF0IGNhbiBiZSBsaXN0ZW5lZCBmb3IuXG4gKi9cbmV4cG9ydCBlbnVtIFRhYmxlYXVFdmVudFR5cGUge1xuICAvKipcbiAgICogUmFpc2VkIHdoZW4gYSBjdXN0b20gdmlldyBoYXMgZmluaXNoZWQgbG9hZGluZy4gVGhpcyBldmVudCBpcyByYWlzZWQgYWZ0ZXIgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciB7QGxpbmsgRmlyc3RJbnRlcmFjdGl2ZX0gKGlmIGFueSkgaGFzIGJlZW4gY2FsbGVkLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgVmlld2luZ1xuICAgKi9cbiAgQ3VzdG9tVmlld0xvYWRlZCA9ICdjdXN0b212aWV3bG9hZGVkJyxcblxuICAvKipcbiAgICogUmFpc2VkIHdoZW4gYSBjdXN0b20gdmlldyBoYXMgYmVlbiByZW1vdmVkLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgVmlld2luZ1xuICAgKi9cbiAgQ3VzdG9tVmlld1JlbW92ZWQgPSAnY3VzdG9tdmlld3JlbW92ZWQnLFxuXG4gIC8qKlxuICAgKiBSYWlzZWQgd2hlbiBhIGN1c3RvbSB2aWV3IGhhcyBiZWVuIHNhdmVkIChuZXdseSBjcmVhdGVkIG9yIHVwZGF0ZWQpLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgVmlld2luZ1xuICAgKi9cbiAgQ3VzdG9tVmlld1NhdmVkID0gJ2N1c3RvbXZpZXdzYXZlZCcsXG5cbiAgLyoqXG4gICAqIFJhaXNlZCB3aGVuIGEgY3VzdG9tIHZpZXcgaGFzIGJlZW4gc2V0IGFzIHRoZSBkZWZhdWx0IHZpZXcgZm9yIGEgd29ya2Jvb2suXG4gICAqXG4gICAqIEBjYXRlZ29yeSBWaWV3aW5nXG4gICAqL1xuICBDdXN0b21WaWV3U2V0RGVmYXVsdCA9ICdjdXN0b212aWV3c2V0ZGVmYXVsdCcsXG5cbiAgLyoqIFJhaXNlZCB3aGVuIHRoZSB1c2VyIGNsaWNrcyBvbiB0aGUgRWRpdCBCdXR0b24uXG4gICAqXG4gICAqIEBjYXRlZ29yeSBWaWV3aW5nXG4gICAqL1xuICBFZGl0QnV0dG9uQ2xpY2tlZCA9ICdlZGl0YnV0dG9uY2xpY2tlZCcsXG5cbiAgLyoqIFJhaXNlZCB3aGVuIHRoZSB1c2VyIGNsaWNrcyBvbiB0aGUgRWRpdCBJbiBEZXNrdG9wIEJ1dHRvbi5cbiAgICpcbiAgICogQGNhdGVnb3J5IEF1dGhvcmluZywgVmlld2luZ1xuICAgKi9cbiAgRWRpdEluRGVza3RvcEJ1dHRvbkNsaWNrZWQgPSAnZWRpdGluZGVza3RvcGJ1dHRvbmNsaWNrZWQnLFxuXG4gIC8qKiBSYWlzZWQgd2hlbiBhbnkgZmlsdGVyIGhhcyBjaGFuZ2VkIHN0YXRlLiBZb3UgY2FuIHVzZSB0aGlzIGV2ZW50IHR5cGUgd2l0aCBUYWJsZWF1Vml6IG9iamVjdHMuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBWaWV3aW5nXG4gICAqL1xuICBGaWx0ZXJDaGFuZ2VkID0gJ2ZpbHRlcmNoYW5nZWQnLFxuXG4gIC8qKiBGaXJlZCB3aGVuIHZpeiBzaXplIGlzIGtub3duXG4gICAqXG4gICAqIEBjYXRlZ29yeSBBdXRob3JpbmcsIFZpZXdpbmdcbiAgICovXG4gIEZpcnN0Vml6U2l6ZUtub3duID0gJ2ZpcnN0dml6c2l6ZWtub3duJyxcblxuICAvKiogRmlyZWQgd2hlbiBhIHZpeiBmaXJzdCBiZWNvbWVzIGludGVyYWN0aXZlXG4gICAqXG4gICAqIEBjYXRlZ29yeSBBdXRob3JpbmcsIFZpZXdpbmcsIFB1bHNlXG4gICAqL1xuICBGaXJzdEludGVyYWN0aXZlID0gJ2ZpcnN0aW50ZXJhY3RpdmUnLFxuXG4gIC8qKiBSYWlzZWQgd2hlbiBhIGN1c3RvbSBtYXJrIGNvbnRleHQgbWVudSBpcyBjbGlja2VkLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgVmlld2luZ1xuICAgKi9cbiAgQ3VzdG9tTWFya0NvbnRleHRNZW51RXZlbnQgPSAnY3VzdG9tbWFya2NvbnRleHRtZW51JyxcblxuICAvKiogVGhlIHNlbGVjdGVkIG1hcmtzIG9uIGEgdmlzdWFsaXphdGlvbiBoYXZlIGNoYW5nZWQuIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFRhYmxlYXVWaXogb2JqZWN0cy5cbiAgICpcbiAgICogQGNhdGVnb3J5IFZpZXdpbmdcbiAgICovXG4gIE1hcmtTZWxlY3Rpb25DaGFuZ2VkID0gJ21hcmtzZWxlY3Rpb25jaGFuZ2VkJyxcblxuICAvKiogQSBwYXJhbWV0ZXIgaGFzIGhhZCBpdHMgdmFsdWUgbW9kaWZpZWQuIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFtbUGFyYW1ldGVyXV0gb2JqZWN0cy5cbiAgICpcbiAgICogQGNhdGVnb3J5IFZpZXdpbmdcbiAgICovXG4gIFBhcmFtZXRlckNoYW5nZWQgPSAncGFyYW1ldGVyY2hhbmdlZCcsXG5cbiAgLyoqIFJhaXNlZCB3aGVuIGEgdG9vbGJhciBidXR0b24gb3IgY29udHJvbCBiZWNvbWVzIGF2YWlsYWJsZSBvciBiZWNvbWVzIHVuYXZhaWxhYmxlLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgVmlld2luZ1xuICAgKi9cbiAgVG9vbGJhclN0YXRlQ2hhbmdlZCA9ICd0b29sYmFyc3RhdGVjaGFuZ2VkJyxcblxuICAvKiogUmFpc2VkIHdoZW4gdGhlIHdvcmtib29rIGlzIHJlYWR5IHRvIGNsb3NlLiBUaGlzIG5vdGlmaWNhdGlvbiBpcyBzZW50IHdoZW4gdXNpbmcgZW1iZWRkZWQgd2ViIGF1dGhvcmluZyBmdW5jdGlvbmFsaXR5LlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgQXV0aG9yaW5nXG4gICAqL1xuICBXb3JrYm9va1JlYWR5VG9DbG9zZSA9ICd3b3JrYm9va3JlYWR5dG9jbG9zZScsXG5cbiAgLyoqIFJhaXNlZCB3aGVuIHRoZSB3b3JrYm9vayBoYXMgYmVlbiBwdWJsaXNoZWQuIFRoaXMgbm90aWZpY2F0aW9uIGlzIHNlbnQgd2hlbiB1c2luZyBlbWJlZGRlZCB3ZWIgYXV0aG9yaW5nIGZ1bmN0aW9uYWxpdHkuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBBdXRob3JpbmdcbiAgICovXG4gIFdvcmtib29rUHVibGlzaGVkID0gJ3dvcmtib29rcHVibGlzaGVkJyxcblxuICAvKiogUmFpc2VkIHdoZW4gXCJwdWJsaXNoIGFzXCIgaXMgc3VjY2Vzc2Z1bC4gVGhpcyBub3RpZmljYXRpb24gaXMgc2VudCB3aGVuIHVzaW5nIGVtYmVkZGVkIHdlYiBhdXRob3JpbmcgZnVuY3Rpb25hbGl0eS5cbiAgICpcbiAgICogQGNhdGVnb3J5IEF1dGhvcmluZ1xuICAgKi9cbiAgV29ya2Jvb2tQdWJsaXNoZWRBcyA9ICd3b3JrYm9va3B1Ymxpc2hlZGFzJyxcblxuICAvKipcbiAgICogUmFpc2VkIHdoZW4gYSBVUkwgYWN0aW9uIG9jY3Vycy4gU2VlIHRoZSB7QGxpbmsgVXJsQWN0aW9uRXZlbnR9IGNsYXNzLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgVmlld2luZ1xuICAgKi9cbiAgVXJsQWN0aW9uID0gJ3VybGFjdGlvbicsXG5cbiAgLyoqXG4gICAqIFJhaXNlZCBhZnRlciBhIHRhYiBzd2l0Y2ggb2NjdXJzICh0aGUgYWN0aXZlIHNoZWV0IGhhcyBjaGFuZ2VkKS4gR3VhcmFudGVlcyB0aGUgdml6IG9iamVjdCB3aWxsIGJlIGludGVyYWN0aXZlIGFmdGVyIHRoaXMuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBWaWV3aW5nXG4gICAqL1xuICBUYWJTd2l0Y2hlZCA9ICd0YWJzd2l0Y2hlZCcsXG4gIC8qKlxuICAgKlxuICAgKiBSYWlzZWQgYWZ0ZXIgYSBuZXcgc3RvcnkgcG9pbnQgYmVjb21lcyBhY3RpdmUuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBWaWV3aW5nXG4gICAqL1xuICBTdG9yeVBvaW50U3dpdGNoZWQgPSAnc3Rvcnlwb2ludHN3aXRjaGVkJyxcbiAgLyoqXG4gICAqXG4gICAqIFJhaXNlZCB3aGVuIGFuIGVycm9yIG9jY3VycyB3aGlsZSBsb2FkaW5nIHRoZSBjb250ZW50cyBvZiB0aGUgd2ViY29tcG9uZW50LlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgQXV0aG9yaW5nLCBWaWV3aW5nLCBBc2tEYXRhXG4gICAqL1xuICBWaXpMb2FkRXJyb3IgPSAndml6bG9hZGVycm9yJyxcbiAgLyoqXG4gICAqIFJhaXNlZCBhZnRlciB0aGUgaWZyYW1lIHNyYyBhdHRyaWJ1dGUgaGFzIGJlZW4gdXBkYXRlZFxuICAgKlxuICAgKiBAY2F0ZWdvcnkgQXV0aG9yaW5nLCBWaWV3aW5nLCBBc2tEYXRhXG4gICAqL1xuICBJZnJhbWVTcmNVcGRhdGVkID0gJ2lmcmFtZXNyY3VwZGF0ZWQnLFxuXG4gIC8qKlxuICAgKiBSYWlzZWQgd2hlbiBjaGFuZ2VzIGFyZSBtYWRlIHRvIHN1bW1hcnkgZGF0YS5cbiAgICpcbiAgICogQGNhdGVnb3J5IFZpZXdpbmdcbiAgICovXG4gIFN1bW1hcnlEYXRhQ2hhbmdlZCA9ICdzdW1tYXJ5ZGF0YWNoYW5nZWQnLFxuXG4gIC8qKlxuICAgKiBSYWlzZWQgd2hlbiB0YWJsZWF1ICh2aXotY2xpZW50KSBpcyByZWFkeSB0byByZWNlaXZlIGFuIGF1dGggdG9rZW4uXG4gICAqIFVzZWQgZm9yIGF1dGhlbnRpY2F0aW9uIGluIHNhbGVzZm9yY2UgbmF0aXZlIG1vZGUuXG4gICAqXG4gICAqIEBoaWRkZW5cbiAgICogQGNhdGVnb3J5IEF1dGhvcmluZywgVmlld2luZyxcbiAgICovXG4gIFJlYWR5VG9SZWNlaXZlQXV0aFRva2VuID0gJ3JlYWR5dG9yZWNlaXZlYXV0aHRva2VuJyxcblxuICAvKipcbiAgICogRmlyZWQgd2hlbiB0aGUgUHVsc2UgbWV0cmljIHNpemUgaXMga25vd25cbiAgICpcbiAgICogQGNhdGVnb3J5IFB1bHNlXG4gICAqL1xuICBGaXJzdFB1bHNlTWV0cmljU2l6ZUtub3duID0gJ2ZpcnN0cHVsc2VtZXRyaWNzaXpla25vd24nLFxuXG4gIC8qKlxuICAgKiBGaXJlZCB3aGVuIGFuIGludGVybmFsIFB1bHNlIGVycm9yIGlzIGVuY291bnRlcmVkLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgUHVsc2VcbiAgICovXG4gIFB1bHNlRXJyb3IgPSAncHVsc2VlcnJvcicsXG5cbiAgLyoqXG4gICAqIEZpcmVkIHdoZW4gdGhlIFB1bHNlIGZpbHRlcnMgY2hhbmdlXG4gICAqXG4gICAqIEBjYXRlZ29yeSBQdWxzZVxuICAgKi9cbiAgUHVsc2VGaWx0ZXJzQ2hhbmdlZCA9ICdwdWxzZWZpbHRlcnNjaGFuZ2VkJyxcblxuICAvKipcbiAgICogRmlyZWQgd2hlbiBhIFB1bHNlIGluc2lnaHQgaXMgZGlzY292ZXJlZFxuICAgKlxuICAgKiBAY2F0ZWdvcnkgUHVsc2VcbiAgICovXG4gIFB1bHNlSW5zaWdodERpc2NvdmVyZWQgPSAncHVsc2VpbnNpZ2h0ZGlzY292ZXJlZCcsXG5cbiAgLyoqXG4gICAqIEZpcmVkIHdoZW4gdGhlIFB1bHNlIG1ldHJpYyB0aW1lIGRpbWVuc2lvbiBjaGFuZ2VzXG4gICAqXG4gICAqIEBjYXRlZ29yeSBQdWxzZVxuICAgKi9cbiAgUHVsc2VUaW1lRGltZW5zaW9uQ2hhbmdlZCA9ICdwdWxzZXRpbWVkaW1lbnNpb25jaGFuZ2VkJyxcblxuICAvKipcbiAgICogRmlyZWQgd2hlbiB0aGUgUHVsc2UgVVJMIGNoYW5nZXNcbiAgICpcbiAgICogQGNhdGVnb3J5IFB1bHNlXG4gICAqL1xuICBQdWxzZVVybENoYW5nZWQgPSAncHVsc2V1cmxjaGFuZ2VkJyxcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBsb2NhdGlvbiBvZiBhIGNvbnRleHQgbWVudSB3aGVyZSB1c2VycyBjYW4gYWRkIGV4dGVybmFsIG1lbnUgaXRlbXMuXG4gKi9cbmV4cG9ydCBlbnVtIEFwaU1lbnVUeXBlIHtcbiAgLyoqIEV4dGVybmFsIG1lbnUgaXRlbSB3aWxsIGJlIGluamVjdGVkIGluIHViZXJ0aXAgZGlhbG9nICovXG4gIFViZXJ0aXAgPSAndWJlcnRpcCcsXG59XG5cbi8qKiBZb3UgY2FuIHVzZSB0aGlzIHR5cGUgd2l0aCBhIHtAbGluayBWaXp9IG9iamVjdC4gKi9cbmV4cG9ydCBlbnVtIFRhYmxlYXVEaWFsb2dUeXBlIHtcbiAgLyoqXG4gICAqIFVzZWQgdG8gZGlzcGxheSB0aGUgZG93bmxvYWQgUERGIGRpYWxvZy5cbiAgICovXG4gIEV4cG9ydFBERiA9ICdleHBvcnQtcGRmJyxcbiAgLyoqXG4gICAqIFVzZWQgdG8gZGlzcGxheSB0aGUgZG93bmxvYWQgUG93ZXJQb2ludCBkaWFsb2cuXG4gICAqL1xuICBFeHBvcnRQb3dlclBvaW50ID0gJ2V4cG9ydC1wb3dlcnBvaW50JyxcbiAgLyoqXG4gICAqIFVzZWQgdG8gZGlzcGxheSB0aGUgZG93bmxvYWQgRGF0YSBkaWFsb2cuXG4gICAqL1xuICBFeHBvcnREYXRhID0gJ2V4cG9ydC1kYXRhJyxcbiAgLyoqXG4gICAqIFVzZWQgdG8gZGlzcGxheSB0aGUgZG93bmxvYWQgQ3Jvc3NUYWIgZGlhbG9nLlxuICAgKi9cbiAgRXhwb3J0Q3Jvc3NUYWIgPSAnZXhwb3J0LWNyb3NzLXRhYicsXG4gIC8qKlxuICAgKiBVc2VkIHRvIGRpc3BsYXkgdGhlIGRvd25sb2FkIFdvcmtib29rIGRpYWxvZy5cbiAgICovXG4gIEV4cG9ydFdvcmtib29rID0gJ2V4cG9ydC13b3JrYm9vaycsXG4gIC8qKlxuICAgKiBVc2VkIHRvIGRpc3BsYXkgdGhlIFNoYXJlIGRpYWxvZy5cbiAgICovXG4gIFNoYXJlID0gJ3NoYXJlJyxcbn1cbiIsImltcG9ydCB7IEZpbHRlck9wdGlvbnMgfSBmcm9tICcuLi9TaGFyZWQvRmlsdGVySW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBGaWx0ZXJEb21haW5UeXBlLCBGaWx0ZXJUeXBlLCBGaWx0ZXJVcGRhdGVUeXBlIH0gZnJvbSAnLi4vU2hhcmVkL05hbWVzcGFjZXMvVGFibGVhdSc7XG5pbXBvcnQgeyBQdWxzZUxheW91dCwgUHVsc2VUaW1lRGltZW5zaW9uIH0gZnJvbSAnLi9FbnVtcyc7XG5pbXBvcnQgeyBXZWJDb21wb25lbnRMb2NhbFNldHRpbmdzIH0gZnJvbSAnLi9XZWJDb21wb25lbnRJbnRlcmZhY2VzJztcblxuLyoqXG4gKiBUaGUgbmFtZXMgb2YgdGhlIHN0cmluZyBjb25zdGFudHMgeW91IGNhbiB1c2UgYXMgSFRNTCBhdHRyaWJ1dGVzIGZvciB0aGUgPHRhYmxlYXUtcHVsc2U+IHdlYiBjb21wb25lbnQuXG4gKiBAaWdub3JlXG4gKi9cbmV4cG9ydCBlbnVtIFB1bHNlQXR0cmlidXRlcyB7XG4gIERpc2FibGVFeHBsb3JlRmlsdGVyID0gJ2Rpc2FibGUtZXhwbG9yZS1maWx0ZXInLFxuICBMYXlvdXQgPSAnbGF5b3V0JyxcbiAgT25GaXJzdEludGVyYWN0aXZlID0gJ29uRmlyc3RJbnRlcmFjdGl2ZScsXG4gIE9uRmlyc3RQdWxzZU1ldHJpY1NpemVLbm93biA9ICdvbkZpcnN0UHVsc2VNZXRyaWNTaXplS25vd24nLFxuICBPblB1bHNlVXJsRXJyb3IgPSAnb25QdWxzZUVycm9yJyxcbiAgT25QdWxzZUZpbHRlcnNDaGFuZ2VkID0gJ29uUHVsc2VGaWx0ZXJzQ2hhbmdlZCcsXG4gIE9uUHVsc2VJbnNpZ2h0RGlzY292ZXJlZCA9ICdvblB1bHNlSW5zaWdodERpc2NvdmVyZWQnLFxuICBPblB1bHNlVGltZURpbWVuc2lvbkNoYW5nZWQgPSAnb25QdWxzZVRpbWVEaW1lbnNpb25DaGFuZ2VkJyxcbiAgT25QdWxzZVVybENoYW5nZWQgPSAnb25QdWxzZVVybENoYW5nZWQnLFxuICBUaW1lRGltZW5zaW9uID0gJ3RpbWUtZGltZW5zaW9uJyxcbiAgVG9rZW5PcHRpb25hbCA9ICd0b2tlbi1vcHRpb25hbCcsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHVsc2VTZXR0aW5ncyBleHRlbmRzIFdlYkNvbXBvbmVudExvY2FsU2V0dGluZ3Mge1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGV4cGxvcmUgZmlsdGVyIGlzIGhpZGRlbiBvciB2aXNpYmxlLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtcHVsc2UgaWQ9XCJ0YWJsZWF1UHVsc2VcIiBkaXNhYmxlLWV4cGxvcmUtZmlsdGVyPlxuICAgKiBgYGBcbiAgICovXG4gIGRpc2FibGVFeHBsb3JlRmlsdGVyPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBkZXNpcmVkIGN1c3RvbSBsYXlvdXQgb2YgdGhlIFB1bHNlIG1ldHJpYy5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXB1bHNlIGlkPVwidGFibGVhdVB1bHNlXCIgbGF5b3V0PVwiY2FyZFwiPlxuICAgKiBgYGBcbiAgICovXG4gIGxheW91dD86IFB1bHNlTGF5b3V0O1xuXG4gIC8qKlxuICAgKiBUaGUgdG9rZW4gdXNlZCBmb3IgYXV0aG9yaXphdGlvblxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIHRva2VuPVwic29tZS10b2tlbi1jb250YWluaW5nLWNsaWVudElkXCIgLz5cbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiB0b2tlbj1cInNvbWUtdG9rZW4tY29udGFpbmluZy1jbGllbnRJZFwiIC8+XG4gICAqIDx0YWJsZWF1LXB1bHNlIGlkPVwidGFibGVhdVB1bHNlXCIgdG9rZW49XCJzb21lLXRva2VuLWNvbnRhaW5pbmctY2xpZW50SWRcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIHRva2VuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgb2YgdGhlICdsb2FkaW5nJyBhdHRyaWJ1dGUgb2YgdGhlIGVtYmVkZGVkIGlmcmFtZS5cbiAgICogU2VlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvaWZyYW1lI2xvYWRpbmdcbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBpZnJhbWUtYXR0ci1sb2FkaW5nPVwibGF6eVwiIC8+XG4gICAqIDx0YWJsZWF1LWF1dGhvcmluZy12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgaWZyYW1lLWF0dHItbG9hZGluZz1cImxhenlcIiAvPlxuICAgKiA8dGFibGVhdS1wdWxzZSBpZD1cInRhYmxlYXVQdWxzZVwiIGlmcmFtZS1hdHRyLWxvYWRpbmc9XCJsYXp5XCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBpZnJhbWVBdHRyaWJ1dGVMb2FkaW5nPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgb2YgdGhlICdzdHlsZScgYXR0cmlidXRlIG9mIHRoZSBlbWJlZGRlZCBpZnJhbWUuXG4gICAqXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgaWZyYW1lLWF0dHItc3R5bGU9XCJib3JkZXI6IDFweCBzb2xpZCByZWRcIiAvPlxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIGlmcmFtZS1hdHRyLXN0eWxlPVwiYm9yZGVyOiAxcHggc29saWQgcmVkXCIgLz5cbiAgICogPHRhYmxlYXUtcHVsc2UgaWQ9XCJ0YWJsZWF1UHVsc2VcIiBpZnJhbWUtYXR0ci1zdHlsZT1cImJvcmRlcjogMXB4IHNvbGlkIHJlZFwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgaWZyYW1lQXR0cmlidXRlU3R5bGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSBvZiB0aGUgJ2NsYXNzJyBhdHRyaWJ1dGUgb2YgdGhlIGVtYmVkZGVkIGlmcmFtZSBwcm92aWRpbmcgYWNjZXNzIHRvIGFueVxuICAgKiBjdXN0b20gc2VsZWN0b3JzIGRlZmluZWQgaW4gdGhlIGA8aWZyYW1lLXN0eWxlPmAgY2hpbGQgdGFnLlxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtcHVsc2UgaWQ9XCJ0YWJsZWF1Vml6XCIgaWZyYW1lLWF0dHItY2xhc3M9XCJyZWQtYm9yZGVyXCI+XG4gICAqICAgPGlmcmFtZS1zdHlsZT5cbiAgICogICAgIC5yZWQtYm9yZGVyIHtcbiAgICogICAgICAgYm9yZGVyOiAxcHggc29saWQgcmVkO1xuICAgKiAgICAgfVxuICAgKiAgIDwvaWZyYW1lLXN0eWxlPlxuICAgKiA8L3RhYmxlYXUtcHVsc2U+XG4gICAqIGBgYFxuICAgKi9cbiAgaWZyYW1lQXR0cmlidXRlQ2xhc3M/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBCYXNlNjQtZW5jb2RlZCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIFB1bHNlIHRoZW1lIG9iamVjdC5cbiAgICpcbiAgICovXG4gIHRoZW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIGRlc2lyZWQgdGltZSBkaW1lbnNpb24gdG8gYXBwbHkgdG8gdGhlIFB1bHNlIG1ldHJpYyBieSBkZWZhdWx0LlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtcHVsc2UgaWQ9XCJ0YWJsZWF1UHVsc2VcIiB0aW1lLWRpbWVuc2lvbj1cIk1vbnRoVG9EYXRlXCI+XG4gICAqIGBgYFxuICAgKi9cbiAgdGltZURpbWVuc2lvbj86IFB1bHNlVGltZURpbWVuc2lvbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHRva2VuIGlzIG9wdGlvbmFsLlxuICAgKiBXaGVuIHRydWUsIHRoZSBtZXRyaWMgd2lsbCBhdHRlbXB0IHRvIGxvYWQgZXZlbiB3aXRob3V0IHNwZWNpZnlpbmcgYSB0b2tlbi5cbiAgICogVGhpcyB3YXMgYWRkZWQgc3BlY2lmaWNhbGx5IGZvciB0aGUgTW9iaWxlIHRlYW0gd2hvIHVzZXMgUEtDRSBmbG93IHRvIGluaXRpYXRlIHRoZSBzZXNzaW9uXG4gICAqIGFuZCBzaG91bGQgbm90IGJlIGFkdmVydGlzZWQgdG8gM3JkIHBhcnRpZXMuXG4gICAqXG4gICAqIEBpZ25vcmVcbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXB1bHNlIGlkPVwidGFibGVhdVB1bHNlXCIgdG9rZW4tb3B0aW9uYWw+XG4gICAqIGBgYFxuICAgKi9cbiAgaXNUb2tlbk9wdGlvbmFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUaGUgbmFtZXMgb2YgdGhlIHN0cmluZyBjb25zdGFudHMgeW91IGNhbiB1c2UgYXMgY2hpbGQgdGFncyBmb3IgVGFibGVhdVB1bHNlIGN1c3RvbSBlbGVtZW50LlxuICovXG5leHBvcnQgZW51bSBQdWxzZUNoaWxkRWxlbWVudHMge1xuICAvKipcbiAgICogQ3VzdG9tIHN0eWxlcyBhcHBsaWNhYmxlIHRvIHRoZSBlbWJlZGRlZCBpZnJhbWUgZWxlbWVudCBpdHNlbGYgKG5vdCBpbnNpZGUgaXQpLlxuICAgKi9cbiAgSWZyYW1lU3R5bGUgPSAnaWZyYW1lLXN0eWxlJyxcblxuICAvKipcbiAgICogQSBwYXJhbWV0ZXIgdG8gYmUgdXNlZCBpbiB0aGUgUHVsc2UgdGhlbWUuXG4gICAqL1xuICBUaGVtZVBhcmFtZXRlciA9ICd0aGVtZS1wYXJhbWV0ZXInLFxuXG4gIC8qKlxuICAgKiBDb250YWlucyBhIGxpc3Qgb2YgZmlsdGVyIHBhcmFtZXRlcnMuXG4gICAqL1xuICBQdWxzZUZpbHRlciA9ICdwdWxzZS1maWx0ZXInLFxufVxuXG4vKipcbiAqIFRoZSBhdHRyaWJ1dGVzIG9mIHRoZSA8dGhlbWUtcGFyYW1ldGVyPiBjaGlsZCBlbGVtZW50cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQdWxzZVRoZW1lUHJvcGVydHkge1xuICAvKipcbiAgICogTmFtZSBvZiB0aGUgdGhlbWUgcGFyYW1ldGVyIHRvIGJlIHNldC5cbiAgICovXG4gIG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVmFsdWUgZm9yIHRoZSB0aGVtZSBwYXJhbWV0ZXIgYmVpbmcgc2V0LlxuICAgKi9cbiAgdmFsdWU6IHN0cmluZztcblxuICAvKipcbiAgICogT3B0aW9uYWwgdHlwZSBvZiB0aGVtZSBwYXJhbWV0ZXIgYmVpbmcgc2V0LlxuICAgKi9cbiAgdHlwZTogc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqXG4gKiBUaGUgYXR0cmlidXRlcyBvZiB0aGUgY2hpbGQgZWxlbWVudHMgb2YgPHRhYmxlYXUtcHVsc2U+LlxuICovXG5leHBvcnQgZW51bSBQdWxzZUNoaWxkRWxlbWVudEF0dHJpYnV0ZXMge1xuICBOYW1lID0gJ25hbWUnLFxuICBGaWVsZCA9ICdmaWVsZCcsXG4gIFZhbHVlID0gJ3ZhbHVlJyxcbiAgVHlwZSA9ICd0eXBlJyxcbn1cblxuLyoqXG4gKiBUaGUgUHVsc2UgdGhlbWUgZGF0YSBzdHJ1Y3R1cmUuXG4gKi9cbmV4cG9ydCB0eXBlIFB1bHNlVGhlbWUgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PjtcblxuLyoqXG4gKiBBY3Rpb25zIHJlbGF0ZWQgdG8gZXZlbnRzIGFuZCBzdGF0ZSBvZiB0aGUgUHVsc2UgbWV0cmljXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHVsc2VBY3Rpb25zIHtcbiAgLyoqXG4gICAqIEFwcGxpZXMgdGhlIGxpc3Qgb2YgcHJvdmlkZWQgY2F0ZWdvcmljYWwgZmlsdGVyIHZhbHVlcyB0byB0aGUgUHVsc2UgbWV0cmljLlxuICAgKlxuICAgKiBAcGFyYW0gZmllbGROYW1lICAgICAgVGhlIG5hbWUgb2YgdGhlIGZpZWxkIHRvIGZpbHRlciBvbi5cbiAgICogQHBhcmFtIHZhbHVlcyAgICAgICAgIFRoZSBsaXN0IG9mIHZhbHVlcyB0byBmaWx0ZXIgb24uXG4gICAqIEBwYXJhbSB1cGRhdGVUeXBlICAgICBUaGUgdXBkYXRlIHR5cGUgb2YgdGhpcyBmaWx0ZXIgKGFkZCwgYWxsLCByZW1vdmUsIHJlcGxhY2UpLlxuICAgKiBAcGFyYW0gZmlsdGVyT3B0aW9ucyAgQWR2YW5jZWQgZmlsdGVyIG9wdGlvbnMgKGlzRXhjbHVkZU1vZGUpLlxuICAgKiBAcmV0dXJucyBUaGUgZmllbGQgbmFtZSB0aGF0IHRoZSBmaWx0ZXIgaXMgYXBwbGllZCBvbi5cbiAgICovXG4gIGFwcGx5RmlsdGVyQXN5bmMoZmllbGROYW1lOiBzdHJpbmcsIHZhbHVlczogUHVsc2VGaWVsZFZhbHVlQXJyYXksIHVwZGF0ZVR5cGU6IEZpbHRlclVwZGF0ZVR5cGUsIG9wdGlvbnM6IEZpbHRlck9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz47XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgYXQgbGVhc3Qgb25lIGNhdGVnb3JpY2FsIGZpbHRlciB2YWx1ZSB0byB0aGUgUHVsc2UgbWV0cmljLlxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5PHtcbiAgICogICAgICAgZmllbGROYW1lOiBzdHJpbmc7XG4gICAqICAgICAgIHZhbHVlczogUHVsc2VGaWVsZFZhbHVlQXJyYXk7XG4gICAqICAgICAgIHVwZGF0ZVR5cGU6IEZpbHRlclVwZGF0ZVR5cGU7XG4gICAqICAgICAgIG9wdGlvbnM6IEZpbHRlck9wdGlvbnM7XG4gICAqICAgICB9Pn0gZmlsdGVycyBUaGUgc2V0IG9mIGZpbHRlcnMgdG8gYXBwbHkuXG4gICAqIEByZXR1cm5zIFRoZSBmaWVsZCBuYW1lcyB0aGF0IHRoZSBmaWx0ZXIgd2FzIGFwcGxpZWQgb24uXG4gICAqL1xuICBhcHBseUZpbHRlcnNBc3luYyhcbiAgICBmaWx0ZXJzOiBBcnJheTx7XG4gICAgICBmaWVsZE5hbWU6IHN0cmluZztcbiAgICAgIHZhbHVlczogUHVsc2VGaWVsZFZhbHVlQXJyYXk7XG4gICAgICB1cGRhdGVUeXBlOiBGaWx0ZXJVcGRhdGVUeXBlO1xuICAgICAgb3B0aW9uczogRmlsdGVyT3B0aW9ucztcbiAgICB9PixcbiAgKTogUHJvbWlzZTxBcnJheTxzdHJpbmc+PjtcblxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudCB0aW1lIGRpbWVuc2lvbiBhcHBsaWVkIHRvIHRoZSBQdWxzZSBtZXRyaWMuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IHRpbWUgZGltZW5zaW9uLlxuICAgKi9cbiAgZ2V0VGltZURpbWVuc2lvbkFzeW5jKCk6IFByb21pc2U8UHVsc2VUaW1lRGltZW5zaW9uPjtcblxuICAvKipcbiAgICogQXBwbGllcyB0aGUgdGltZSBkaW1lbnNpb24gdG8gdGhlIFB1bHNlIG1ldHJpYy5cbiAgICpcbiAgICogQHBhcmFtIHtQdWxzZVRpbWVEaW1lbnNpb259IHRpbWVEaW1lbnNpb24gVGhlIHRpbWUgZGltZW5zaW9uIHRvIGFwcGx5XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXBwbHlUaW1lRGltZW5zaW9uQXN5bmModGltZURpbWVuc2lvbjogUHVsc2VUaW1lRGltZW5zaW9uKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogR2V0cyBhIGxpc3Qgb2YgZmlsdGVycyBmb3IgdGhlIFB1bHNlIG1ldHJpYy5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8QXJyYXk8UHVsc2VGaWx0ZXI+Pn0gVGhlIGxpc3Qgb2YgZmlsdGVycy5cbiAgICovXG4gIGdldEZpbHRlcnNBc3luYygpOiBQcm9taXNlPEFycmF5PFB1bHNlRmlsdGVyPj47XG5cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgZXhpc3RpbmcgZmlsdGVyIGZvciB0aGUgZ2l2ZW4gZmllbGQgb24gdGhlIFB1bHNlIG1ldHJpYy5cbiAgICpcbiAgICogQHBhcmFtIGZpZWxkTmFtZSAgVGhlIG5hbWUgb2YgdGhlIGZpZWxkIHRvIGNsZWFyIGZpbHRlciBvbi5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGZpZWxkIHRvIGNsZWFyIGZpbHRlciBvbi5cbiAgICovXG4gIGNsZWFyRmlsdGVyQXN5bmMoZmllbGROYW1lczogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlIGV4aXN0aW5nIGZpbHRlciBmb3IgdGhlIGdpdmVuIGZpZWxkcyBvbiB0aGUgUHVsc2UgbWV0cmljLlxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGZpZWxkTmFtZXMgVGhlIG5hbWUgb2YgdGhlIGZpZWxkcyB0byBjbGVhciBmaWx0ZXIgb24uXG4gICAqIEByZXR1cm5zIFRoZSBmaWVsZHMgdG8gY2xlYXIgZmlsdGVyIG9uLlxuICAgKi9cbiAgY2xlYXJGaWx0ZXJzQXN5bmMoZmllbGROYW1lczogQXJyYXk8c3RyaW5nPik6IFByb21pc2U8QXJyYXk8c3RyaW5nPj47XG5cbiAgLyoqXG4gICAqIFJlc2V0cyBhbGwgdGhlIGV4aXN0aW5nIGZpbHRlcnMgb24gdGhlIFB1bHNlIG1ldHJpYy5cbiAgICovXG4gIGNsZWFyQWxsRmlsdGVyc0FzeW5jKCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIFVzZSB0aGlzIG1ldGhvZCB0byBmaWx0ZXIgdGhlIFB1bHNlIG1ldHJpYyBiZWZvcmUgaW5pdGlhbGl6YXRpb24uIElmIHVzZWQgYWZ0ZXIgaW5pdGlhbGl6YXRpb24sIGl0IHdpbGwgcmUtcmVuZGVyIHRoZSBtZXRyaWMuXG4gICAqIEZvciBmaWx0ZXJpbmcgYWZ0ZXIgaW5pdGlhbGl6YXRpb24sIHVzZSB0aGUgb3RoZXIgZmlsdGVyaW5nIG1ldGhvZHMsIHN1Y2ggYXMgYGFwcGx5RmlsdGVyQXN5bmNgLlxuICAgKlxuICAgKiBJZiB5b3UgYWRkIHRoZSBzYW1lIGZpbHRlciBmaWVsZHMgdXNpbmcgdGhlIGBhZGRGaWx0ZXIoKWAgbWV0aG9kIGFuZCBieSB1c2luZyB0aGUgYDxwdWxzZS1maWx0ZXI+YCBlbGVtZW50IGluIHRoZSBgPHRhYmxlYXUtcHVsc2U+YCB3ZWIgY29tcG9uZW50LFxuICAgKiB5b3UgbWlnaHQgZXhwZXJpZW5jZSB1bmV4cGVjdGVkIGJlaGF2aW9yLlxuICAgKlxuICAgKiBAcGFyYW0gZmllbGROYW1lIFRoZSBuYW1lIG9mIHRoZSBmaWVsZCB0byBmaWx0ZXIgb24uXG4gICAqIEBwYXJhbSB2YWx1ZSBTaW5nbGUgdmFsdWUgb3IgYSBsaXN0IG9mIGNvbW1hIHNlcGFyYXRlZCB2YWx1ZXMgdG8gZmlsdGVyIG9uLlxuICAgKlxuICAgKiBgYGBcbiAgICogcHVsc2UuYWRkRmlsdGVyKCdSZWdpb24nLCAnQ2VudHJhbCxXZXN0Jyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYWRkRmlsdGVyKGZpZWxkTmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZDtcblxuICAvKipcbiAgICogVXNlIHRoaXMgbWV0aG9kIHRvIHJlYWRqdXN0IHRoZSBkaW1lbnNpb25zIG9mIHRoZSBlbWJlZGRlZCBQdWxzZSBtZXRyaWMgaW4gcmVzcG9uc2UgdG8gdGhpbmdzIGxpa2UgYSB3aW5kb3cgcmVzaXplLCBkZXZpY2Ugb3JpZW50YXRpb24gY2hhbmdlLCBvclxuICAgKiBwYXJlbnQgY29udGFpbmVyIHJlc2l6ZS5cbiAgICpcbiAgICogYGBgXG4gICAqIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCAoKSA9PiBwdWxzZS5yZXNpemUoKSk7XG4gICAqXG4gICAqIG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiBwdWxzZS5yZXNpemUoKSkub2JzZXJ2ZShwdWxzZS5wYXJlbnRFbGVtZW50KTtcbiAgICogYGBgXG4gICAqL1xuICByZXNpemUoKTogdm9pZDtcbn1cblxuLyoqXG4gKiBUaGUgaW50ZXJmYWNlIGZvciB0aGUgdG9wLWxldmVsIFB1bHNlIG9iamVjdC5cbiAqKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHVsc2UgZXh0ZW5kcyBQdWxzZVNldHRpbmdzLCBQdWxzZUFjdGlvbnMge31cblxuLyoqXG4gKiBBIFB1bHNlRmllbGRWYWx1ZUFycmF5IGlzIGFuIGFycmF5IHRoYXQgY2FuIGNvbnRhaW4gc3RyaW5ncywgYm9vbGVhbnMsIG9yIG51bGxzLCBidXQgd2lsbCBuZXZlciBjb250YWluIGJvdGggc3RyaW5ncyBhbmQgYm9vbGVhbnMgYXQgdGhlIHNhbWUgdGltZS5cbiAqL1xuZXhwb3J0IHR5cGUgUHVsc2VGaWVsZFZhbHVlQXJyYXkgPSBBcnJheTxib29sZWFuIHwgbnVsbD4gfCBBcnJheTxzdHJpbmcgfCBudWxsPjtcblxuLyoqXG4gKlxuICogQW4gYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYWxsIG9mIHRoZSBQdWxzZSBmaWx0ZXIgdHlwZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHVsc2VGaWx0ZXIge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGZpZWxkIGJlaW5nIGZpbHRlcmVkLiAgTm90ZSB0aGF0IHRoaXMgaXMgdGhlIGNhcHRpb25cbiAgICogYXMgc2hvd24gaW4gdGhlIFVJLCBhbmQgbm90IHRoZSBhY3R1YWwgZGF0YWJhc2UgZmllbGQgbmFtZS5cbiAgICovXG4gIGZpZWxkTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0aGUgZmlsdGVyLlxuICAgKi9cbiAgZmlsdGVyVHlwZTogRmlsdGVyVHlwZTtcblxuICAvKipcbiAgICogVGhlIFB1bHNlIG1ldHJpYyBJRC5cbiAgICovXG4gIG1ldHJpY0lkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBQdWxzZSBDYXRlZ29yaWNhbCBGaWx0ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXRlZ29yaWNhbFB1bHNlRmlsdGVyIGV4dGVuZHMgUHVsc2VGaWx0ZXIge1xuICAvKipcbiAgICogQSBsaXN0IG9mIHZhbHVlcyBhcHBsaWVkIHRvIHRoaXMgY2F0ZWdvcmljYWwgZmlsdGVyLiBOb3RpY2UgdGhhdCBpZiB0aGUgUHVsc2UgbWV0cmljXG4gICAqIGhhcyBhIGRlZmluaXRpb24gZmlsdGVyLCB0aGUgY3VycmVudCByZWxldmFudCB2YWx1ZXMgY2FuIGJlIGZldGNoZWQgYnkgY2FsbGluZ1xuICAgKiBgZ2V0RG9tYWluQXN5bmMoRmlsdGVyRG9tYWluVHlwZS5SZWxldmFudClgLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwbGllZFZhbHVlczogUHVsc2VGaWVsZFZhbHVlQXJyYXk7XG5cbiAgLyoqXG4gICAqIFRydWUgaWYgdGhpcyBmaWx0ZXIgaXMgYW4gZXhjbHVkZSBmaWx0ZXIsIGZhbHNlIGlmIGFuIGluY2x1ZGUgZmlsdGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNFeGNsdWRlTW9kZTogYm9vbGVhbjtcblxuICAvKipcbiAgICogVHJ1ZSBpZiBhbGwgdGhlIHZhbHVlcyBhcmUgc2VsZWN0ZWQgZm9yIHRoaXMgZmlsdGVyLiBXaGVuICdBbGwnIGlzIHNlbGVjdGVkLFxuICAgKiBhcHBsaWVkVmFsdWVzIHJldHVybnMgYW4gZW1wdHkgbGlzdC5cbiAgICovXG4gIHJlYWRvbmx5IGlzQWxsU2VsZWN0ZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBkb21haW4gb2YgYSBjYXRlZ29yaWNhbCBmaWx0ZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7KHN0cmluZyB8IHVuZGVmaW5lZCl9IHNlYXJjaFRlcm0gVGhlIHRlcm0gdG8gc2VhcmNoIGZvciBpbiB0aGUgZG9tYWluLlxuICAgKiBAcGFyYW0geyhudW1iZXIgfCB1bmRlZmluZWQpfSBwYWdlU2l6ZSBUaGUgbWF4aW11bSBudW1iZXIgb2YgdmFsdWVzIHRvIHJldHVybi4gSWdub3JlZCB3aGVuIG5leHRQYWdlVG9rZW4gaXMgbm90IHByb3ZpZGVkLlxuICAgKiBAcGFyYW0geyhzdHJpbmcgfCB1bmRlZmluZWQpfSBuZXh0UGFnZVRva2VuIFRoZSBuZXh0IHBhZ2UgdG9rZW4gcmV0dXJuZWQgYnkgUHVsc2Ugd2hlbiBhZGRpdGlvbmFsIHZhbHVlcyBhcmUgYXZhaWxhYmxlLlxuICAgKiBAcGFyYW0geyhGaWx0ZXJEb21haW5UeXBlIHwgdW5kZWZpbmVkKX0gZG9tYWluVHlwZSBUaGUgZG9tYWluIHR5cGUgb2YgdGhlIGZpbHRlci5cbiAgICogQHJldHVybnMge1Byb21pc2U8UHVsc2VDYXRlZ29yaWNhbERvbWFpbj59IEEgcHJvbWlzZSBjb250YWluaW5nIHRoZSBjYXRlZ29yaWNhbCBkb21haW4gZm9yIHRoZSBmaWx0ZXIuXG4gICAqL1xuICBnZXREb21haW5Bc3luYzogKFxuICAgIHNlYXJjaFRlcm0/OiBzdHJpbmcsXG4gICAgcGFnZVNpemU/OiBudW1iZXIsXG4gICAgbmV4dFBhZ2VUb2tlbj86IHN0cmluZyxcbiAgICBkb21haW5UeXBlPzogRmlsdGVyRG9tYWluVHlwZSxcbiAgKSA9PiBQcm9taXNlPFB1bHNlQ2F0ZWdvcmljYWxEb21haW4+O1xufVxuXG4vKipcbiAqIFRoZSBkb21haW4gb2YgYSBQdWxzZSBjYXRlZ29yaWNhbCBmaWx0ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQdWxzZUNhdGVnb3JpY2FsRG9tYWluIHtcbiAgLyoqXG4gICAqIFRoZSBkb21haW4gdHlwZSAocmVsZXZhbnQsIGRhdGFiYXNlKVxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZTogRmlsdGVyRG9tYWluVHlwZTtcbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIHZhbHVlcyBpbiB0aGUgZG9tYWluIG9mIHRoZSBmaWx0ZXJcbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlczogUHVsc2VGaWVsZFZhbHVlQXJyYXk7XG4gIC8qKlxuICAgKiBUaGUgdG90YWwgYXZhaWxhYmxlIG51bWJlciBvZiB2YWx1ZXMgaW4gdGhlIGRvbWFpbiBvZiB0aGUgZmlsdGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgdG90YWxBdmFpbGFibGU6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBuZXh0IHBhZ2UgdG9rZW4gcmV0dXJuZWQgYnkgUHVsc2Ugd2hlbiBhZGRpdGlvbmFsIHZhbHVlcyBhcmUgYXZhaWxhYmxlLlxuICAgKiBQcm92aWRlIHRoaXMgdG9rZW4gdG8gZ2V0RG9tYWluQXN5bmMgdG8gZ2V0IHRoZSBuZXh0IHBhZ2Ugb2YgdmFsdWVzLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV4dFBhZ2VUb2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuIiwiaW1wb3J0IHtcbiAgQ3Jvc3N0YWJGaWxlRm9ybWF0LFxuICBEZXZpY2VUeXBlLFxuICBQcmludE9yaWVudGF0aW9uLFxuICBQcmludFBhZ2VTaXplLFxuICBQcmludFNjYWxpbmcsXG4gIFRhYmxlYXVEaWFsb2dUeXBlLFxuICBUYWJsZWF1RXZlbnRUeXBlLFxuICBUb29sYmFyLFxufSBmcm9tICcuL0VudW1zJztcbmltcG9ydCB7IFNoZWV0U2l6ZSB9IGZyb20gJy4vU2hlZXRJbnRlcmZhY2VzJztcbmltcG9ydCB7IFdlYkNvbXBvbmVudExvY2FsU2V0dGluZ3MsIFdlYkNvbXBvbmVudFNldHRpbmdzU2hhcmVkIH0gZnJvbSAnLi9XZWJDb21wb25lbnRJbnRlcmZhY2VzJztcbmltcG9ydCB7IFdvcmtib29rIH0gZnJvbSAnLi9Xb3JrYm9va0ludGVyZmFjZSc7XG5cbi8qKlxuICogVGhlIHNoYXJlZCBzdHJpbmcgY29uc3RhbnRzIHlvdSBjYW4gdXNlIGFzIEhUTUwgYXR0cmlidXRlcyBmb3IgdGhlIDx0YWJsZWF1LXZpej4gYW5kIDx0YWJsZWF1LWF1dGhvcmluZy12aXo+IHdlYiBjb21wb25lbnQuXG4gKiBAaWdub3JlXG4gKi9cbmV4cG9ydCBlbnVtIFZpelNoYXJlZEF0dHJpYnV0ZXMge1xuICBUb3VjaE9wdGltaXplID0gJ3RvdWNoLW9wdGltaXplJyxcbiAgSGlkZUVkaXRJbkRlc2t0b3BCdXR0b24gPSAnaGlkZS1lZGl0LWluLWRlc2t0b3AtYnV0dG9uJyxcbiAgU3VwcHJlc3NEZWZhdWx0RWRpdEJlaGF2aW9yID0gJ3N1cHByZXNzLWRlZmF1bHQtZWRpdC1iZWhhdmlvcicsXG4gIERpc2FibGVWZXJzaW9uQ2hlY2sgPSAnZGlzYWJsZS12ZXJzaW9uLWNoZWNrJyxcbiAgT25FZGl0SW5EZXNrdG9wQnV0dG9uQ2xpY2tlZCA9ICdvbkVkaXRJbkRlc2t0b3BCdXR0b25DbGlja2VkJyxcbiAgT25GaXJzdFZpelNpemVLbm93biA9ICdvbkZpcnN0Vml6U2l6ZUtub3duJyxcbiAgT25GaXJzdEludGVyYWN0aXZlID0gJ29uRmlyc3RJbnRlcmFjdGl2ZScsXG59XG5cbi8qKlxuICogVGhlIG5hbWVzIG9mIHRoZSBzdHJpbmcgY29uc3RhbnRzIHlvdSBjYW4gdXNlIGFzIEhUTUwgYXR0cmlidXRlcyBmb3IgdGhlIDx0YWJsZWF1LXZpej4gd2ViIGNvbXBvbmVudC5cbiAqIEBpZ25vcmVcbiAqL1xuZXhwb3J0IGVudW0gVml6QXR0cmlidXRlcyB7XG4gIERpc2FibGVVcmxBY3Rpb25zUG9wdXBzID0gJ2Rpc2FibGUtdXJsLWFjdGlvbnMnLFxuICBIaWRlVGFicyA9ICdoaWRlLXRhYnMnLFxuICBUb29sYmFyID0gJ3Rvb2xiYXInLFxuICBJbnN0YW5jZUlkVG9DbG9uZSA9ICdpbnN0YW5jZS1pZC10by1jbG9uZScsXG4gIERldmljZSA9ICdkZXZpY2UnLFxuICBIaWRlRWRpdEJ1dHRvbiA9ICdoaWRlLWVkaXQtYnV0dG9uJyxcbiAgT25FZGl0QnV0dG9uQ2xpY2tlZCA9ICdvbkVkaXRCdXR0b25DbGlja2VkJyxcbiAgT25GaWx0ZXJDaGFuZ2VkID0gJ29uRmlsdGVyQ2hhbmdlZCcsXG4gIE9uQ3VzdG9tTWFya0NvbnRleHRNZW51RXZlbnQgPSAnb25DdXN0b21NYXJrQ29udGV4dE1lbnVFdmVudCcsXG4gIE9uTWFya1NlbGVjdGlvbkNoYW5nZWQgPSAnb25NYXJrU2VsZWN0aW9uQ2hhbmdlZCcsXG4gIE9uUGFyYW1ldGVyQ2hhbmdlZCA9ICdvblBhcmFtZXRlckNoYW5nZWQnLFxuICBPblRvb2xiYXJTdGF0ZUNoYW5nZWQgPSAnb25Ub29sYmFyU3RhdGVDaGFuZ2VkJyxcbiAgT25VcmxBY3Rpb24gPSAnb25VcmxBY3Rpb24nLFxuICBPblRhYlN3aXRjaGVkID0gJ29uVGFiU3dpdGNoZWQnLFxuICBPbkN1c3RvbVZpZXdMb2FkZWQgPSAnb25DdXN0b21WaWV3TG9hZGVkJyxcbiAgT25DdXN0b21WaWV3UmVtb3ZlZCA9ICdvbkN1c3RvbVZpZXdSZW1vdmVkJyxcbiAgT25DdXN0b21WaWV3U2F2ZWQgPSAnb25DdXN0b21WaWV3U2F2ZWQnLFxuICBPbkN1c3RvbVZpZXdTZXREZWZhdWx0ID0gJ29uQ3VzdG9tVmlld1NldERlZmF1bHQnLFxuICBPblN0b3J5UG9pbnRTd2l0Y2hlZCA9ICdvblN0b3J5UG9pbnRTd2l0Y2hlZCcsXG4gIE9uU3VtbWFyeURhdGFDaGFuZ2VkID0gJ29uU3VtbWFyeURhdGFDaGFuZ2VkJyxcbiAgT25SZWFkeVRvUmVjZWl2ZUF1dGhUb2tlbiA9ICdvblJlYWR5VG9SZWNlaXZlQXV0aFRva2VuJyxcbn1cblxuLyoqXG4gKiBUaGUgbmFtZXMgb2YgdGhlIHN0cmluZyBjb25zdGFudHMgeW91IGNhbiB1c2UgYXMgSFRNTCBhdHRyaWJ1dGVzIGZvciB0aGUgPHRhYmxlYXUtYXV0aG9yaW5nLXZpej4gd2ViIGNvbXBvbmVudC5cbiAqIEBpZ25vcmVcbiAqL1xuZXhwb3J0IGVudW0gVml6QXV0aG9yaW5nQXR0cmlidXRlcyB7XG4gIE9uV29ya2Jvb2tQdWJsaXNoZWQgPSAnb25Xb3JrYm9va1B1Ymxpc2hlZCcsXG4gIE9uV29ya2Jvb2tQdWJsaXNoZWRBcyA9ICdvbldvcmtib29rUHVibGlzaGVkQXMnLFxuICBPbldvcmtib29rUmVhZHlUb0Nsb3NlID0gJ29uV29ya2Jvb2tSZWFkeVRvQ2xvc2UnLFxuICBIaWRlQ2xvc2VCdXR0b24gPSAnaGlkZS1jbG9zZS1idXR0b24nLFxufVxuXG4vKipcbiAqIFRoZSBuYW1lcyBvZiB0aGUgc3RyaW5nIGNvbnN0YW50cyB5b3UgY2FuIHVzZSBhcyBjaGlsZCB0YWdzIGZvciBUYWJsZWF1Vml6IGFuZCBUYWJsZWF1QXV0aG9yaW5nVml6IGN1c3RvbSBlbGVtZW50cy5cbiAqL1xuZXhwb3J0IGVudW0gVml6Q2hpbGRFbGVtZW50cyB7XG4gIC8qKlxuICAgKiBDb250YWlucyBhIGxpc3Qgb2YgZmlsdGVyIHBhcmFtZXRlcnMuIEF2YWlsYWJsZSBvbmx5IGluIHZpZXdpbmcgbW9kZS5cbiAgICovXG4gIFZpekZpbHRlciA9ICd2aXotZmlsdGVyJyxcblxuICAvKipcbiAgICogQ29udGFpbnMgYSBuYW1lIGFuZCB2YWx1ZSBmb3IgYSBwYXJhbWV0ZXIuIEF2YWlsYWJsZSBvbmx5IGluIHZpZXdpbmcgbW9kZS5cbiAgICovXG4gIFZpelBhcmFtZXRlciA9ICd2aXotcGFyYW1ldGVyJyxcblxuICAvKipcbiAgICogQ29udGFpbnMgYSBsaXN0IG9mIGN1c3RvbSBwYXJhbWV0ZXJzLiAgQXZhaWxhYmxlIGluIGJvdGggdmlld2luZyBhbmQgYXV0aG9yaW5nIG1vZGVzLlxuICAgKi9cbiAgQ3VzdG9tUGFyYW1ldGVyID0gJ2N1c3RvbS1wYXJhbWV0ZXInLFxuXG4gIC8qKlxuICAgKiBDdXN0b20gc3R5bGVzIGFwcGxpY2FibGUgdG8gdGhlIGVtYmVkZGVkIGlmcmFtZSBlbGVtZW50IGl0c2VsZiAobm90IGluc2lkZSBpdCkuIEF2YWlsYWJsZSBpbiBib3RoIHZpZXdpbmcgYW5kIGF1dGhvcmluZyBtb2Rlcy5cbiAgICovXG4gIElmcmFtZVN0eWxlID0gJ2lmcmFtZS1zdHlsZScsXG59XG5cbmV4cG9ydCBlbnVtIFZpekNoaWxkRWxlbWVudEF0dHJpYnV0ZXMge1xuICBGaWVsZCA9ICdmaWVsZCcsXG4gIFZhbHVlID0gJ3ZhbHVlJyxcbiAgTmFtZSA9ICduYW1lJyxcbn1cblxuLyoqXG4gKiBUaGUgaW50ZXJmYWNlIGZvciB0aGUgdG9wIGxldmVsIFZpeiBvYmplY3QuXG4gKiovXG5leHBvcnQgaW50ZXJmYWNlIFZpeiBleHRlbmRzIFZpelNldHRpbmdzLCBXZWJDb21wb25lbnRMb2NhbFNldHRpbmdzLCBWaXpBY3Rpb25zIHtcbiAgLyoqXG4gICAqIE9uZSBXb3JrYm9vayBpcyBzdXBwb3J0ZWQgcGVyIHZpc3VhbGl6YXRpb24uXG4gICAqL1xuICByZWFkb25seSB3b3JrYm9vaz86IFdvcmtib29rO1xuXG4gIC8qKlxuICAgKiBQcm92aWRlIGFuIGF1dGggdG9rZW4gZm9yIHNhbGVzZm9yY2UgbmF0aXZlIG1vZGVcbiAgICogQHBhcmFtIHRva2VuXG4gICAqL1xuICBzZXRBdXRoVG9rZW4odG9rZW46IHN0cmluZyk6IHZvaWQ7XG59XG5cbi8qKlxuICogVGhlIGludGVyZmFjZSBmb3IgdGhlIHRvcCBsZXZlbCBBdXRob3JpbmcgVml6IG9iamVjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRob3JpbmdWaXogZXh0ZW5kcyBWaXpBdXRob3JpbmdTZXR0aW5ncywgV2ViQ29tcG9uZW50TG9jYWxTZXR0aW5ncyB7XG4gIC8qKlxuICAgKiBHZXRzIHRoZSB2aXN1YWxpemF0aW9uJ3MgY3VycmVudCBVUkwuXG4gICAqL1xuICBnZXRDdXJyZW50U3JjQXN5bmMoKTogUHJvbWlzZTxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBQcm92aWRlIGFuIGF1dGggdG9rZW4gZm9yIHNhbGVzZm9yY2UgbmF0aXZlIG1vZGVcbiAgICogQHBhcmFtIHRva2VuXG4gICAqL1xuICBzZXRBdXRoVG9rZW4odG9rZW46IHN0cmluZyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFVzZSB0aGlzIG1ldGhvZCB0byByZWFkanVzdCB0aGUgZGltZW5zaW9ucyBvZiB0aGUgZW1iZWRkZWQgdml6IGluIHJlc3BvbnNlIHRvIHRoaW5ncyBsaWtlIGEgd2luZG93IHJlc2l6ZSwgZGV2aWNlIG9yaWVudGF0aW9uIGNoYW5nZSwgb3JcbiAgICogcGFyZW50IGNvbnRhaW5lciByZXNpemUuXG4gICAqXG4gICAqIGBgYFxuICAgKiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgKCkgPT4gdml6LnJlc2l6ZSgpKTtcbiAgICpcbiAgICogbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHZpei5yZXNpemUoKSkub2JzZXJ2ZSh2aXoucGFyZW50RWxlbWVudCk7XG4gICAqIGBgYFxuICAgKi9cbiAgcmVzaXplKCk6IHZvaWQ7XG59XG5cbi8qKlxuICogUGFydGlhbGx5IGltcGxlbWVudGVkIC0gQWN0aW9ucyByZWxhdGVkIHRvIGV2ZW50cyBhbmQgc3RhdGUgb2YgdGhlIHZpelxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpekFjdGlvbnMge1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgYXV0b21hdGljIHVwZGF0ZXMgYXJlIGN1cnJlbnRseSBwYXVzZWQuXG4gICAqL1xuICByZWFkb25seSBhdXRvbWF0aWNVcGRhdGVzQXJlUGF1c2VkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBQYXVzZSBsYXlvdXQgdXBkYXRlcy4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IGFyZSByZXNpemluZyB0aGUgdmlzdWFsaXphdGlvbiBvciBwZXJmb3JtaW5nIG11bHRpcGxlIGNhbGxzIHRoYXQgY291bGQgYWZmZWN0IHRoZSBsYXlvdXQuXG4gICAqL1xuICBwYXVzZUF1dG9tYXRpY1VwZGF0ZXNBc3luYygpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBSZXN1bWUgbGF5b3V0IHVwZGF0ZXMuXG4gICAqL1xuICByZXN1bWVBdXRvbWF0aWNVcGRhdGVzQXN5bmMoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogVG9nZ2xlIGxheW91dCB1cGRhdGVzLlxuICAgKi9cbiAgdG9nZ2xlQXV0b21hdGljVXBkYXRlc0FzeW5jKCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEVxdWl2YWxlbnQgdG8gY2xpY2tpbmcgb24gdGhlIFJldmVydCBBbGwgdG9vbGJhciBidXR0b24sIHdoaWNoIHJlc3RvcmVzIHRoZSB3b3JrYm9vayB0byBpdHMgc3RhcnRpbmcgc3RhdGUuXG4gICAqL1xuICByZXZlcnRBbGxBc3luYygpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBFcXVpdmFsZW50IHRvIGNsaWNraW5nIG9uIHRoZSBSZWZyZXNoIERhdGEgdG9vbGJhciBidXR0b24uXG4gICAqL1xuICByZWZyZXNoRGF0YUFzeW5jKCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEVxdWl2YWxlbnQgdG8gY2xpY2tpbmcgb24gRG93bmxvYWQgPiBJbWFnZSBmcm9tIHRoZSB0b29sYmFyLCB3aGljaCBjcmVhdGVzIGEgUE5HIGZpbGUgb2YgdGhlIGN1cnJlbnQgdmlzdWFsaXphdGlvbi5cbiAgICovXG4gIGV4cG9ydEltYWdlQXN5bmMoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogRXhwb3J0cyB0aGUgY3Jvc3N0YWIgb2YgYW55IGdpdmVuIHdvcmtzaGVldCB3aXRoaW4gdGhlIGN1cnJlbnQgdmlldyB0byBhXG4gICAqIHNwZWNpZmllZCBmb3JtYXQgKENyb3NzdGFiRmlsZUZvcm1hdC5FeGNlbCwgQ3Jvc3N0YWJGaWxlRm9ybWF0LkNTVikuXG4gICAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgc2hlZXQgbmFtZSBkb2VzIG5vdCBtYXRjaCBhbnkgd29ya3NoZWV0cyB3aXRoaW4gdGhlIGFjdGl2ZSBzaGVldC5cbiAgICogVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBjcm9zc3RhYiBmaWxlIGZhaWxlZCB0byBiZSBjcmVhdGVkLlxuICAgKiBOb3RlOiBleHBvcnRDcm9zc3RhYkFzeW5jIHJlc29sdmVzIHdoZW4gYSBkb3dubG9hZCBpcyBpbml0aWF0ZWQuIEl0IGRvZXMgbm90IGluZGljYXRlIHRoYXQgYSBkb3dubG9hZCB3YXMgc3VjY2Vzc2Z1bCBvciBpZiB0aGUgZG93bmxvYWQgd2FzIGNvbXBsZXRlLlxuICAgKlxuICAgKiBgYGBcbiAgICogbGV0IHZpeiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWJsZWF1Vml6Jyk7XG4gICAqIHZpei5leHBvcnRDcm9zc3RhYkFzeW5jKCdTYWxlcyBieSBTZWdtZW50JywgQ3Jvc3N0YWJGaWxlRm9ybWF0LkNTVik7XG4gICAqIGBgYFxuICAgKi9cbiAgZXhwb3J0Q3Jvc3N0YWJBc3luYyhzaGVldE5hbWU6IHN0cmluZywgZm9ybWF0OiBDcm9zc3RhYkZpbGVGb3JtYXQpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBFeHBvcnRzIHRoZSBzdW1tYXJ5IGRhdGEgc2hvd24gaW4gdGhlIFZpZXcgRGF0YSB3aW5kb3dcbiAgICogKHNob3duIHdoZW4geW91IGNsaWNrIERvd25sb2FkID4gRGF0YSBmcm9tIHRoZSB0b29sYmFyIGZvciBhbnkgZ2l2ZW4gd29ya3NoZWV0IHdpdGhpbiB0aGUgY3VycmVudCB2aWV3KS5cbiAgICogVGhlIGN1cnJlbnQgZmlsZSBmb3JtYXQgaXMgQ1NWLiBUaGVyZSBpcyBubyBsaW1pdGF0aW9uIG9uIHRoZSBhbW91bnQgb2Ygc3VtbWFyeSBkYXRhIHlvdSBjYW4gZXhwb3J0LlxuICAgKiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIHNoZWV0IG5hbWUgZG9lcyBub3QgbWF0Y2ggYW55IHdvcmtzaGVldHMgd2l0aGluIHRoZSBhY3RpdmUgc2hlZXQuXG4gICAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgQ1NWIGZpbGUgZmFpbGVkIHRvIGJlIGNyZWF0ZWQuXG4gICAqIE5vdGU6IGV4cG9ydERhdGFBc3luYyByZXNvbHZlcyB3aGVuIGEgZG93bmxvYWQgaXMgaW5pdGlhdGVkLiBJdCBkb2VzIG5vdCBpbmRpY2F0ZSB0aGF0IGEgZG93bmxvYWQgd2FzIHN1Y2Nlc3NmdWwgb3IgaWYgdGhlIGRvd25sb2FkIHdhcyBjb21wbGV0ZS5cbiAgICpcbiAgICogYGBgXG4gICAqIGxldCB2aXogPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFibGVhdVZpeicpO1xuICAgKiBjb25zdCBhY3RpdmVTaGVldCA9IHZpei53b3JrYm9vay5hY3RpdmVTaGVldDtcbiAgICogaWYgKGFjdGl2ZVNoZWV0LnNoZWV0VHlwZSA9PT0gU2hlZXRUeXBlLldvcmtzaGVldCkge1xuICAgKiAgIGNvbnN0IGNvbHVtbnMgPSBhd2FpdCBhY3RpdmVTaGVldC5nZXRTdW1tYXJ5Q29sdW1uc0luZm9Bc3luYygpO1xuICAgKiAgIC8vIEdldHRpbmcgZmllbGRJZCdzIGZvciBMYXRpdHVkZSBhbmQgTG9uZ2l0dWRlIGNvbHVtbnNcbiAgICogICBjb25zdCBjb2x1bW5zVG9JbmNsdWRlQnlJZCA9IGNvbHVtbnMubWFwKChjb2x1bW4pID0+IHtcbiAgICogICAgIGlmIChjb2x1bW4uZmllbGROYW1lID09PSAnTGF0aXR1ZGUnIHx8IGNvbHVtbi5maWVsZE5hbWUgPT09ICdMb25naXR1ZGUnKSB7XG4gICAqICAgICAgIHJldHVybiBjb2x1bW4uZmllbGRJZDtcbiAgICogICAgIH1cbiAgICogICB9KTtcbiAgICogICBhd2FpdCB2aXouZXhwb3J0RGF0YUFzeW5jKGFjdGl2ZVNoZWV0Lm5hbWUsIHsgY29sdW1uc1RvSW5jbHVkZUJ5SWQgfSk7XG4gICAqIH1cbiAgICogZWxzZSBpZiAoYWN0aXZlU2hlZXQuc2hlZXRUeXBlID09PSBTaGVldFR5cGUuRGFzaGJvYXJkKSB7XG4gICAqICAgLy8gRXhwb3J0aW5nIHRoZSBzdW1tYXJ5IGRhdGEgZm9yIGVhY2ggd29ya3NoZWV0IGluIHRoZSBkYXNoYm9hcmQgd2hpbGUgYWxzbyBpZ25vcmluZyBhbGlhc2VzXG4gICAqICAgZm9yIChjb25zdCB3b3Jrc2hlZXQgb2YgYWN0aXZlU2hlZXQud29ya3NoZWV0cykge1xuICAgKiAgICAgYXdhaXQgdml6LmV4cG9ydERhdGFBc3luYyh3b3Jrc2hlZXQubmFtZSwgeyBpZ25vcmVBbGlhc2VzOiB0cnVlIH0pO1xuICAgKiAgIH1cbiAgICogfVxuICAgKiBlbHNlXG4gICAqIHtcbiAgICogICAvLyBhY3RpdmVTaGVldCBpcyBhIFN0b3J5IGFuZCB3ZSB3YW50IHRvIGV4cG9ydCB3b3Jrc2hlZXRzIHdpdGhpbiB0aGUgY3VycmVudCB2aWV3XG4gICAqICAgY29uc3QgY29udGFpbmVkU2hlZXQgPSBhY3RpdmVTaGVldC5hY3RpdmVTdG9yeVBvaW50LmNvbnRhaW5lZFNoZWV0O1xuICAgKiAgIGlmIChjb250YWluZWRTaGVldCAhPT0gdW5kZWZpbmVkICYmIGNvbnRhaW5lZFNoZWV0LnNoZWV0VHlwZSA9PT0gU2hlZXRUeXBlLldvcmtzaGVldCkge1xuICAgKiAgICAgLy8gRXhwb3J0aW5nIHN1bW1hcnkgZGF0YSBvZiBhIHdvcmtzaGVldCB3aXRoaW4gdGhlIGFjdGl2ZSBzdG9yeSBwb2ludFxuICAgKiAgICAgYXdhaXQgdml6LmV4cG9ydERhdGFBc3luYyhjb250YWluZWRTaGVldC5uYW1lKTtcbiAgICogICB9IGVsc2UgaWYgKGNvbnRhaW5lZFNoZWV0ICE9PSB1bmRlZmluZWQgJiYgY29udGFpbmVkU2hlZXQuc2hlZXRUeXBlID09PSBTaGVldFR5cGUuRGFzaGJvYXJkKSB7XG4gICAqICAgICAvLyBFeHBvcnRpbmcgdGhlIHN1bW1hcnkgZGF0YSBmb3IgZWFjaCB3b3Jrc2hlZXQgd2l0aGluIHRoZSBhY3RpdmUgc3RvcnkgcG9pbnRcbiAgICogICAgIGZvciAoY29uc3Qgd29ya3NoZWV0IG9mIGNvbnRhaW5lZFNoZWV0LndvcmtzaGVldHMpIHtcbiAgICogICAgICAgYXdhaXQgdml6LmV4cG9ydERhdGFBc3luYyh3b3Jrc2hlZXQubmFtZSk7XG4gICAqICAgICB9XG4gICAqICAgfVxuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgZXhwb3J0RGF0YUFzeW5jKHNoZWV0TmFtZTogc3RyaW5nLCBvcHRpb25zPzogRXhwb3J0RGF0YU9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBFeHBvcnRzIHRoZSBsaXN0IG9mIHNoZWV0cyB0byBhIFBvd2VyUG9pbnQgZmlsZS4gSWYgbm8gc2hlZXRzIGFyZSBzcGVjaWZpZWQsIHRoZSBjdXJyZW50IHNoZWV0IGlzIGV4cG9ydGVkLlxuICAgKiBUaGUgb3JkZXIgdGhlIHNoZWV0cyBhcHBlYXIgaW4gdGhlIGxpc3QgaXMgdGhlIG9yZGVyIHRoZSBzaGVldHMgYXBwZWFyIGluIHRoZSBQb3dlclBvaW50IGZpbGUuXG4gICAqIFRoZSBsaXN0IG9mIHNoZWV0cyBjYW4gZWl0aGVyIGV4Y2x1c2l2ZWx5IGluY2x1ZGUgdGhlIHdvcmtzaGVldHMgd2l0aGluIGEgZGFzaGJvYXJkIG9yIGV4Y2x1c2l2ZWx5IGluY2x1ZGUgdGhlIHB1Ymxpc2hlZCBzaGVldHMgZnJvbSB0aGUgd29ya2Jvb2suXG4gICAqXG4gICAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgbGlzdCBvZiBzaGVldHMgY29udGFpbnMgYm90aCB3b3Jrc2hlZXRzIHdpdGhpbiBhIGRhc2hib2FyZCBhbmQgcHVibGlzaGVkIHNoZWV0cyBmcm9tIHRoZSB3b3JrYm9vay5cbiAgICogVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBQb3dlclBvaW50IGZpbGUgZmFpbHMgdG8gYmUgY3JlYXRlZC5cbiAgICpcbiAgICogTm90ZTogZXhwb3J0UG93ZXJQb2ludEFzeW5jIHJlc29sdmVzIHdoZW4gYSBkb3dubG9hZCBpcyBpbml0aWF0ZWQuIEl0IGRvZXMgbm90IGluZGljYXRlIHRoYXQgYSBkb3dubG9hZCB3YXMgc3VjY2Vzc2Z1bCBvciBpZiB0aGUgZG93bmxvYWQgd2FzIGNvbXBsZXRlLlxuICAgKlxuICAgKiBgYGBcbiAgICogbGV0IHZpeiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWJsZWF1Vml6Jyk7XG4gICAqIGNvbnN0IHdvcmtib29rID0gdml6Lndvcmtib29rO1xuICAgKiBjb25zdCBhY3RpdmVTaGVldCA9IHdvcmtib29rLmFjdGl2ZVNoZWV0O1xuICAgKiBpZiAoYWN0aXZlU2hlZXQuc2hlZXRUeXBlID09PSBTaGVldFR5cGUuV29ya3NoZWV0IHx8IGFjdGl2ZVNoZWV0LnNoZWV0VHlwZSA9PT0gU2hlZXRUeXBlLlN0b3J5KSB7XG4gICAqICAgYXdhaXQgdml6LmV4cG9ydFBvd2VyUG9pbnRBc3luYygpO1xuICAgKiB9IGVsc2UgaWYgKGFjdGl2ZVNoZWV0LnNoZWV0VHlwZSA9PT0gIFNoZWV0VHlwZS5EYXNoYm9hcmQpIHtcbiAgICogICBjb25zdCB3b3Jrc2hlZXROYW1lcyA9IGFjdGl2ZVNoZWV0LndvcmtzaGVldHMubWFwKCh3b3Jrc2hlZXQpID0+IHdvcmtzaGVldC5uYW1lKTtcbiAgICogICBhd2FpdCB2aXouZXhwb3J0UG93ZXJQb2ludEFzeW5jKHdvcmtzaGVldE5hbWVzKTtcbiAgICogfVxuICAgKiAvLyBleHBvcnRpbmcgYWxsIHNoZWV0cyB3aXRoaW4gdGhlIHdvcmtib29rIHRvIFBvd2VyUG9pbnRcbiAgICogY29uc3QgcHVibGlzaGVkU2hlZXROYW1lcyA9IHdvcmtib29rLnB1Ymxpc2hlZFNoZWV0c0luZm8ubWFwKChwdWJsaXNoZWRTaGVldEluZm8pID0+IHB1Ymxpc2hlZFNoZWV0SW5mby5uYW1lKTtcbiAgICogYXdhaXQgdml6LmV4cG9ydFBvd2VyUG9pbnRBc3luYyhwdWJsaXNoZWRTaGVldE5hbWVzKTtcbiAgICogYGBgXG4gICAqL1xuICBleHBvcnRQb3dlclBvaW50QXN5bmMoc2hlZXROYW1lcz86IEFycmF5PHN0cmluZz4pOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBFeHBvcnRzIHRoZSBsaXN0IG9mIHNoZWV0cyB3aXRoIHRoZSBnaXZlbiB7QGxpbmsgRXhwb3J0UERGT3B0aW9uc30gb3B0aW9ucy4gSWYgbm8gc2hlZXRzIGFyZSBzcGVjaWZpZWQsIHRoZSBjdXJyZW50IHNoZWV0IGlzIGV4cG9ydGVkLlxuICAgKiBUaGUgbGlzdCBvZiBzaGVldHMgY2FuIGVpdGhlciBleGNsdXNpdmVseSBpbmNsdWRlIHRoZSB3b3Jrc2hlZXRzIHdpdGhpbiBhIGRhc2hib2FyZCBvciBleGNsdXNpdmVseSBpbmNsdWRlIHRoZSBwdWJsaXNoZWQgc2hlZXRzIGZyb20gdGhlIHdvcmtib29rLlxuICAgKiBJZiBubyBFeHBvcnRQREZPcHRpb25zIGFyZSBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IHNldHRpbmdzIGFyZTogU2NhbGluZyA9IEF1dG9tYXRpYywgUGFnZVNpemUgPSBMZXR0ZXIsIGFuZCBPcmllbnRhdGlvbiA9IFBvcnRyYWl0LlxuICAgKlxuICAgKiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIGxpc3Qgb2Ygc2hlZXRzIGNvbnRhaW5zIGJvdGggd29ya3NoZWV0cyB3aXRoaW4gYSBkYXNoYm9hcmQgYW5kIHB1Ymxpc2hlZCBzaGVldHMgZnJvbSB0aGUgd29ya2Jvb2suXG4gICAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgUERGIGZpbGUgZmFpbHMgdG8gYmUgY3JlYXRlZC5cbiAgICpcbiAgICogTm90ZTogZXhwb3J0UERGQXN5bmMgcmVzb2x2ZXMgd2hlbiBhIGRvd25sb2FkIGlzIGluaXRpYXRlZC4gSXQgZG9lcyBub3QgaW5kaWNhdGUgdGhhdCBhIGRvd25sb2FkIHdhcyBzdWNjZXNzZnVsIG9yIGlmIHRoZSBkb3dubG9hZCB3YXMgY29tcGxldGUuXG4gICAqXG4gICAqIGBgYFxuICAgKiBsZXQgdml6ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhYmxlYXVWaXonKTtcbiAgICogY29uc3Qgd29ya2Jvb2sgPSB2aXoud29ya2Jvb2s7XG4gICAqIGNvbnN0IGFjdGl2ZVNoZWV0ID0gd29ya2Jvb2suYWN0aXZlU2hlZXQ7XG4gICAqIGlmIChhY3RpdmVTaGVldC5zaGVldFR5cGUgPT09IFNoZWV0VHlwZS5Xb3Jrc2hlZXQgfHwgYWN0aXZlU2hlZXQuc2hlZXRUeXBlID09PSBTaGVldFR5cGUuU3RvcnkpIHtcbiAgICogICBhd2FpdCB2aXouZXhwb3J0UERGQXN5bmMoKTtcbiAgICogfSBlbHNlIGlmIChhY3RpdmVTaGVldC5zaGVldFR5cGUgPT09ICBTaGVldFR5cGUuRGFzaGJvYXJkKSB7XG4gICAqICAgY29uc3Qgd29ya3NoZWV0TmFtZXMgPSBhY3RpdmVTaGVldC53b3Jrc2hlZXRzLm1hcCgod29ya3NoZWV0KSA9PiB3b3Jrc2hlZXQubmFtZSk7XG4gICAqICAgYXdhaXQgdml6LmV4cG9ydFBERkFzeW5jKHdvcmtzaGVldE5hbWVzKTtcbiAgICogfVxuICAgKiAvLyBleHBvcnRpbmcgYWxsIHNoZWV0cyB3aXRoaW4gdGhlIHdvcmtib29rIHRvIFBERlxuICAgKiBjb25zdCBwdWJsaXNoZWRTaGVldE5hbWVzID0gd29ya2Jvb2sucHVibGlzaGVkU2hlZXRzSW5mby5tYXAoKHB1Ymxpc2hlZFNoZWV0SW5mbykgPT4gcHVibGlzaGVkU2hlZXRJbmZvLm5hbWUpO1xuICAgKiBhd2FpdCB2aXouZXhwb3J0UERGQXN5bmMocHVibGlzaGVkU2hlZXROYW1lcyk7XG4gICAqIGBgYFxuICAgKi9cbiAgZXhwb3J0UERGQXN5bmMoc2hlZXROYW1lcz86IEFycmF5PHN0cmluZz4sIG9wdGlvbnM/OiBFeHBvcnRQREZPcHRpb25zKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogRGlzcGxheSBvbmUgb2YgdGhlIGV4cG9ydCBkaWFsb2dzIGJhc2VkIG9uIHRoZSBkaWFsb2dUeXBlIHBhcmFtZXRlclxuICAgKlxuICAgKiBUaHJvd3MgYW4gZXJyb3IgaWYgZGlhbG9nVHlwZSBpcyBpbnZhbGlkXG4gICAqL1xuICBkaXNwbGF5RGlhbG9nQXN5bmMoZGlhbG9nVHlwZTogVGFibGVhdURpYWxvZ1R5cGUpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB2aXN1YWxpemF0aW9uJ3MgY3VycmVudCBVUkwuXG4gICAqL1xuICBnZXRDdXJyZW50U3JjQXN5bmMoKTogUHJvbWlzZTxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBSZWRvZXMgdGhlIGxhc3QgYWN0aW9uIHBlcmZvcm1lZCBvbiBhIHNoZWV0LlxuICAgKi9cbiAgcmVkb0FzeW5jKCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIFVuZG9lcyB0aGUgbGFzdCBhY3Rpb24gcGVyZm9ybWVkIG9uIGEgc2hlZXQuXG4gICAqL1xuICB1bmRvQXN5bmMoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogQWRkcyBhbiBldmVudCBsaXN0ZW5lciB0byB0aGUgc3BlY2lmaWVkIGV2ZW50LlxuICAgKlxuICAgKiBgYGBcbiAgICogYXN5bmMgZnVuY3Rpb24gZ2V0U2VsZWN0ZWRNYXJrcyhldmVudCkge1xuICAgKiAgICAgY29uc3QgbWFya3NTZWxlY3RlZCA9IGF3YWl0IGV2ZW50LmRldGFpbC5nZXRNYXJrc0FzeW5jKCk7XG4gICAqICAgICBjb25zdCBudW1NYXJrcyA9IG1hcmtzU2VsZWN0ZWQuZGF0YVswXS5kYXRhLmxlbmd0aDtcbiAgICogICAgIGNvbnNvbGUubG9nKGAke251bU1hcmtzfSBtYXJrcyBTZWxlY3RlZGApO1xuICAgKiB9XG4gICAqXG4gICAqIGxldCB2aXogPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFibGVhdVZpeicpO1xuICAgKiB2aXouYWRkRXZlbnRMaXN0ZW5lcihcIm1hcmtzZWxlY3Rpb25jaGFuZ2VkXCIsIGdldFNlbGVjdGVkTWFya3MpO1xuICAgKiBgYGBcbiAgICovXG4gIGFkZEV2ZW50TGlzdGVuZXIodHlwZTogVGFibGVhdUV2ZW50VHlwZSwgbGlzdGVuZXI6IEV2ZW50TGlzdGVuZXJPckV2ZW50TGlzdGVuZXJPYmplY3QsIG9wdGlvbnM/OiBib29sZWFuIHwgQWRkRXZlbnRMaXN0ZW5lck9wdGlvbnMpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuIGV2ZW50IGxpc3RlbmVyIGZyb20gdGhlIHNwZWNpZmllZCBldmVudC5cbiAgICpcbiAgICogYGBgXG4gICAqIGxldCB2aXogPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFibGVhdVZpeicpO1xuICAgKiB2aXoucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1hcmtzZWxlY3Rpb25jaGFuZ2VkXCIsIGdldFNlbGVjdGVkTWFya3MpO1xuICAgKiBgYGBcbiAgICovXG4gIHJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZTogVGFibGVhdUV2ZW50VHlwZSwgbGlzdGVuZXI6IEV2ZW50TGlzdGVuZXJPckV2ZW50TGlzdGVuZXJPYmplY3QsIG9wdGlvbnM/OiBib29sZWFuIHwgRXZlbnRMaXN0ZW5lck9wdGlvbnMpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBVc2UgdGhpcyBtZXRob2QgdG8gZmlsdGVyIHRoZSB2aXogYmVmb3JlIGluaXRpYWxpemF0aW9uLiBJZiB1c2VkIGFmdGVyIGluaXRpYWxpemF0aW9uLCBpdCB3aWxsIHJlLXJlbmRlciB0aGUgdml6LlxuICAgKiBGb3IgZmlsdGVyaW5nIGFmdGVyIGluaXRpYWxpemF0aW9uLCB1c2UgdGhlIG90aGVyIGZpbHRlcmluZyBtZXRob2RzLCBzdWNoIGFzIGBhcHBseUZpbHRlckFzeW5jYC5cbiAgICpcbiAgICogSWYgeW91IGFkZCB0aGUgc2FtZSBmaWx0ZXIgZmllbGRzIHVzaW5nIHRoZSBgYWRkRmlsdGVyKClgIG1ldGhvZCBhbmQgYnkgdXNpbmcgdGhlIGA8dml6LWZpbHRlcj5gIGVsZW1lbnQgaW4gdGhlIGA8dGFibGVhdS12aXo+YCB3ZWIgY29tcG9uZW50LFxuICAgKiB5b3UgbWlnaHQgZXhwZXJpZW5jZSB1bmV4cGVjdGVkIGJlaGF2aW9yLlxuICAgKlxuICAgKiBAcGFyYW0gZmllbGROYW1lIFRoZSBuYW1lIG9mIHRoZSBmaWVsZCB0byBmaWx0ZXIgb24uXG4gICAqIEBwYXJhbSB2YWx1ZSBTaW5nbGUgdmFsdWUgb3IgYSBsaXN0IG9mIGNvbW1hIHNlcGFyYXRlZCB2YWx1ZXMgdG8gZmlsdGVyIG9uLlxuICAgKlxuICAgKiBgYGBcbiAgICogdml6LmFkZEZpbHRlcignUmVnaW9uJywgJ0NlbnRyYWwsV2VzdCcpO1xuICAgKiBgYGBcbiAgICovXG4gIGFkZEZpbHRlcihmaWVsZE5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFVzZSB0aGlzIG1ldGhvZCB0byByZWFkanVzdCB0aGUgZGltZW5zaW9ucyBvZiB0aGUgZW1iZWRkZWQgdml6IGluIHJlc3BvbnNlIHRvIHRoaW5ncyBsaWtlIGEgd2luZG93IHJlc2l6ZSwgZGV2aWNlIG9yaWVudGF0aW9uIGNoYW5nZSwgb3JcbiAgICogcGFyZW50IGNvbnRhaW5lciByZXNpemUuXG4gICAqXG4gICAqIGBgYFxuICAgKiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgKCkgPT4gdml6LnJlc2l6ZSgpKTtcbiAgICpcbiAgICogbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHZpei5yZXNpemUoKSkub2JzZXJ2ZSh2aXoucGFyZW50RWxlbWVudCk7XG4gICAqIGBgYFxuICAgKi9cbiAgcmVzaXplKCk6IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVml6U2l6ZSB7XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzaGVldFNpemUgcmVjb3JkIGZvciB0aGUgY3VycmVudCBzaGVldFxuICAgKi9cbiAgcmVhZG9ubHkgc2hlZXRTaXplOiBTaGVldFNpemU7XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGhlaWdodCBvZiB0aGUgVGFibGVhdSBVSSBlbGVtZW50cyAodGhlIGNocm9tZSkgc3Vycm91bmRpbmcgdGhlIHZpZXcuXG4gICAqL1xuICByZWFkb25seSBjaHJvbWVIZWlnaHQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUaGlzIGludGVyZmFjZSByZXByZXNlbnRzIGFsbCBvZiB0aGUgb3B0aW9ucyBmb3IgY29uZmlndXJpbmcgYSB2aXogdGhhdCBhcmUgY29tbW9uIGJldHdlZW5cbiAqIHZpZXdpbmcgYW5kIGF1dGhvcmluZyBtb2RlLlxuICovXG5pbnRlcmZhY2UgVml6U2V0dGluZ3NTaGFyZWQgZXh0ZW5kcyBXZWJDb21wb25lbnRTZXR0aW5nc1NoYXJlZCB7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0byB0b3VjaCBvcHRpbWl6ZSB2aXogY29udHJvbHMuXG4gICAqXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgdG91Y2gtb3B0aW1pemUgLz5cbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiB0b3VjaC1vcHRpbWl6ZSAvPlxuICAgKiBgYGBcbiAgICovXG4gIHRvdWNoT3B0aW1pemU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgRWRpdCBpbiBEZXNrdG9wIGJ1dHRvbiBpcyBoaWRkZW4gb3IgdmlzaWJsZS5cbiAgICogSWYgbm90IHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gZmFsc2UsIG1lYW5pbmcgdGhhdCB0aGUgRWRpdCBpbiBEZXNrdG9wIGJ1dHRvbiBpcyB2aXNpYmxlLlxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIGhpZGUtZWRpdC1pbi1kZXNrdG9wLWJ1dHRvbj5cbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiBoaWRlLWVkaXQtaW4tZGVza3RvcC1idXR0b24+XG4gICAqIGBgYFxuICAgKi9cbiAgaGlkZUVkaXRJbkRlc2t0b3BCdXR0b24/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZGVmYXVsdCBlZGl0IGJlaGF2aW9yIGlzIHN1cHByZXNzZWQuXG4gICAqIElmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvIGZhbHNlLCBtZWFuaW5nIHRoYXQgdGhlIGRlZmF1bHQgZWRpdCBiZWhhdmlvciBpcyBub3Qgc3VwcHJlc3NlZC5cbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBzdXBwcmVzcy1kZWZhdWx0LWVkaXQtYmVoYXZpb3I+XG4gICAqIDx0YWJsZWF1LWF1dGhvcmluZy12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgc3VwcHJlc3MtZGVmYXVsdC1lZGl0LWJlaGF2aW9yPlxuICAgKiBgYGBcbiAgICovXG4gIHN1cHByZXNzRGVmYXVsdEVkaXRCZWhhdmlvcj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIHRoZSB1c2VyIGNsaWNrcyBvbiB0aGUgRWRpdCBJbiBEZXNrdG9wIEJ1dHRvbi4gWW91IGNhbiB1c2UgdGhpcyBldmVudCB0eXBlIHdpdGggVGFibGVhdVZpeiBvYmplY3RzLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uRWRpdEluRGVza3RvcEJ1dHRvbkNsaWNrZWQ9XCJvbkVkaXRJbkRlc2t0b3BCdXR0b25DbGlja2VkSGFuZGxlclwiIC8+XG4gICAqIDx0YWJsZWF1LWF1dGhvcmluZy12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25FZGl0SW5EZXNrdG9wQnV0dG9uQ2xpY2tlZD1cIm9uRWRpdEluRGVza3RvcEJ1dHRvbkNsaWNrZWRIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvbkVkaXRJbkRlc2t0b3BCdXR0b25DbGlja2VkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgd2hlbiB0aGUgc2l6ZSBvZiB0aGUgdml6IGlzIGtub3duLiBZb3UgY2FuIHVzZSB0aGlzIGV2ZW50IHRvIHBlcmZvcm0gdGFza3Mgc3VjaCBhcyByZXNpemluZ1xuICAgKiB0aGUgZWxlbWVudHMgc3Vycm91bmRpbmcgdGhlIFZpeiBvYmplY3Qgb25jZSB0aGUgb2JqZWN0J3Mgc2l6ZSBoYXMgYmVlbiBlc3RhYmxpc2hlZC5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBcIm9uRmlyc3RWaXpTaXplS25vd25cIj1cIm9uRmlyc3RWaXpTaXplS25vd25IYW5kbGVyXCIgLz5cbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvbkZpcnN0Vml6U2l6ZUtub3duPVwib25GaXJzdFZpelNpemVLbm93bkhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uRmlyc3RWaXpTaXplS25vd24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIHRoZSBWaXogb2JqZWN0IGZpcnN0IGJlY29tZXMgaW50ZXJhY3RpdmUuIFRoaXMgaXMgb25seSByYWlzZWQgb25jZS5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBcIm9uRmlyc3RJbnRlcmFjdGl2ZVwiPVwib25GaXJzdEludGVyYWN0aXZlSGFuZGxlclwiIC8+XG4gICAqIDx0YWJsZWF1LWF1dGhvcmluZy12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25GaXJzdEludGVyYWN0aXZlPVwib25GaXJzdEludGVyYWN0aXZlSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25GaXJzdEludGVyYWN0aXZlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBvcHRpb25zIGZvciBjb25maWd1cmluZyBhIHZpeiBpbiB2aWV3IG1vZGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVml6U2V0dGluZ3MgZXh0ZW5kcyBWaXpTZXR0aW5nc1NoYXJlZCB7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0byBzdXBwcmVzcyB0aGUgZXhlY3V0aW9uIG9mIFVSTCBhY3Rpb25zLiBUaGlzIG9wdGlvbiBkb2VzIG5vdCBwcmV2ZW50IHRoZSBVUkwgYWN0aW9uXG4gICAqIGV2ZW50IGZyb20gYmVpbmcgcmFpc2VkLiBZb3UgY2FuIHVzZSB0aGlzIG9wdGlvbiB0byBjaGFuZ2Ugd2hhdCBoYXBwZW5zIHdoZW4gYSBVUkwgYWN0aW9uIG9jY3Vycy4gSWYgc2V0XG4gICAqIHRvIHRydWUgYW5kIHlvdSBjcmVhdGUgYW4gZXZlbnQgbGlzdGVuZXIgZm9yIHRoZSBVUkxfQUNUSU9OIGV2ZW50LCB5b3UgY2FuIHVzZSBhbiBldmVudCBsaXN0ZW5lclxuICAgKiBoYW5kbGVyIHRvIGN1c3RvbWl6ZSB0aGUgYWN0aW9ucy5cbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBkaXNhYmxlLXVybC1hY3Rpb25zIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgZGlzYWJsZVVybEFjdGlvbnNQb3B1cHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0YWJzIGFyZSBoaWRkZW4gb3Igc2hvd24uXG4gICAqXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgIGhpZGUtdGFicyAvPlxuICAgKiBgYGBcbiAgICovXG4gIGhpZGVUYWJzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBwb3NpdGlvbiBvZiB0aGUgdG9vbGJhciwgaWYgaXQgaXMgc2hvd24uIFRoZSB2YWx1ZXMgY2FuIGJlIFRvb2xiYXIuVG9wLFxuICAgKiBUb29sYmFyLkJvdHRvbSBvciBUb29sYmFyLkhpZGRlbi5cbiAgICogSWYgbm90IHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gVG9vbGJhci5Cb3R0b20uXG4gICAqXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgIHRvb2xiYXI9XCJoaWRkZW5cIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIHRvb2xiYXI/OiBUb29sYmFyO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgYSBkZXZpY2UgbGF5b3V0IGZvciBhIGRhc2hib2FyZCwgaWYgaXQgZXhpc3RzLlxuICAgKiBWYWx1ZXMgY2FuIGJlIGRlZmF1bHQsIGRlc2t0b3AsIHRhYmxldCwgb3IgcGhvbmUuXG4gICAqIElmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvIGxvYWRpbmcgYSBsYXlvdXQgYmFzZWQgb24gdGhlXG4gICAqIHNtYWxsZXN0IGRpbWVuc2lvbiBvZiB0aGUgaG9zdGluZyBpZnJhbWUgZWxlbWVudC5cbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiAgZGV2aWNlPVwiZGVza3RvcFwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgZGV2aWNlPzogRGV2aWNlVHlwZTtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBJRCBvZiBhbiBleGlzdGluZyBpbnN0YW5jZSB0byBtYWtlIGEgY29weSAoY2xvbmUpIG9mLlxuICAgKiBUaGlzIGlzIHVzZWZ1bCBpZiB0aGUgdXNlciB3YW50cyB0byBjb250aW51ZSBhbmFseXNpcyBvZiBhbiBleGlzdGluZyB2aXN1YWxpemF0aW9uXG4gICAqIHdpdGhvdXQgbG9zaW5nIHRoZSBzdGF0ZSBvZiB0aGUgb3JpZ2luYWwuIElmIHRoZSBJRCBkb2VzIG5vdCByZWZlciB0byBhbiBleGlzdGluZyB2aXN1YWxpemF0aW9uLFxuICAgKiB0aGUgY2xvbmVkIHZlcnNpb24gaXMgZGVyaXZlZCBmcm9tIHRoZSBvcmlnaW5hbCB2aXN1YWxpemF0aW9uLlxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiICBpbnN0YW5jZS1pZC10by1jbG9uZT1cImlkMVwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgaW5zdGFuY2VJZFRvQ2xvbmU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBFZGl0IGJ1dHRvbiBpcyBoaWRkZW4gb3IgdmlzaWJsZS5cbiAgICogSWYgbm90IHNldCwgZGVmYXVsdHMgdG8gZmFsc2UsIG1lYW5pbmcgdGhhdCB0aGUgRWRpdCBidXR0b24gaXMgdmlzaWJsZS5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBoaWRlLWVkaXQtYnV0dG9uPlxuICAgKiBgYGBcbiAgICovXG4gIGhpZGVFZGl0QnV0dG9uPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIG9uIHRoZSBFZGl0IEJ1dHRvbi5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvbkVkaXRCdXR0b25DbGlja2VkPVwib25FZGl0QnV0dG9uQ2xpY2tlZEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uRWRpdEJ1dHRvbkNsaWNrZWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIGFueSBmaWx0ZXIgaGFzIGNoYW5nZWQgc3RhdGUuIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFRhYmxlYXVWaXogb2JqZWN0cy5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvbkZpbHRlckNoYW5nZWQ9XCJvbkZpbHRlckNoYW5nZWRIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvbkZpbHRlckNoYW5nZWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIGEgY3VzdG9tIG1hcmsgY29udGV4dCBtZW51IGlzIGNsaWNrZWQuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25DdXN0b21NYXJrQ29udGV4dE1lbnVFdmVudD1cIm9uQ3VzdG9tTWFya0NvbnRleHRNZW51RXZlbnRIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvbkN1c3RvbU1hcmtDb250ZXh0TWVudUV2ZW50Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgd2hlbiB0aGUgc2VsZWN0ZWQgbWFya3Mgb24gYSB2aXN1YWxpemF0aW9uIGhhdmUgY2hhbmdlZC4gWW91IGNhbiB1c2UgdGhpcyBldmVudCB0eXBlIHdpdGggVGFibGVhdVZpeiBvYmplY3RzLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uTWFya1NlbGVjdGlvbkNoYW5nZWQ9XCJvbk1hcmtTZWxlY3Rpb25DaGFuZ2VkSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25NYXJrU2VsZWN0aW9uQ2hhbmdlZD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gYSBwYXJhbWV0ZXIgaGFzIGhhZCBpdHMgdmFsdWUgbW9kaWZpZWQuIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFtbUGFyYW1ldGVyXV0gb2JqZWN0cy5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvblBhcmFtZXRlckNoYW5nZWQ9XCJvblBhcmFtZXRlckNoYW5nZWRIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvblBhcmFtZXRlckNoYW5nZWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIGEgdG9vbGJhciBidXR0b24gb3IgY29udHJvbCBiZWNvbWVzIGF2YWlsYWJsZSBvciBiZWNvbWVzIHVuYXZhaWxhYmxlLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uVG9vbGJhclN0YXRlQ2hhbmdlZD1cIm9uVG9vbGJhclN0YXRlQ2hhbmdlZEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uVG9vbGJhclN0YXRlQ2hhbmdlZD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gYSBVUkwgYWN0aW9uIG9jY3Vycy4gU2VlIHRoZSB7QGxpbmsgVXJsQWN0aW9uRXZlbnR9IGNsYXNzLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uVXJsQWN0aW9uPVwib25VcmxBY3Rpb25IYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvblVybEFjdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIGFmdGVyIGEgdGFiIHN3aXRjaCBvY2N1cnMgKHRoZSBhY3RpdmUgc2hlZXQgaGFzIGNoYW5nZWQpLiBHdWFyYW50ZWVzIHRoZSB2aXogb2JqZWN0IHdpbGwgYmUgaW50ZXJhY3RpdmUgYWZ0ZXIgdGhpcy5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvblRhYlN3aXRjaGVkPVwib25UYWJTd2l0Y2hlZEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uVGFiU3dpdGNoZWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIGEgY3VzdG9tIHZpZXcgaGFzIGZpbmlzaGVkIGxvYWRpbmcuIFRoaXMgZXZlbnQgaXMgcmFpc2VkIGFmdGVyIHRoZSBjYWxsYmFja1xuICAgKiBmdW5jdGlvbiBmb3Ige0BsaW5rIEZpcnN0SW50ZXJhY3RpdmV9IChpZiBhbnkpIGhhcyBiZWVuIGNhbGxlZC5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvbkN1c3RvbVZpZXdMb2FkZWQ9XCJvbkN1c3RvbVZpZXdMb2FkZWRIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvbkN1c3RvbVZpZXdMb2FkZWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIGEgY3VzdG9tIHZpZXcgaGFzIGJlZW4gcmVtb3ZlZC5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvbkN1c3RvbVZpZXdSZW1vdmVkPVwib25DdXN0b21WaWV3UmVtb3ZlZEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uQ3VzdG9tVmlld1JlbW92ZWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIGEgY3VzdG9tIHZpZXcgaGFzIGJlZW4gc2F2ZWQgKG5ld2x5IGNyZWF0ZWQgb3IgdXBkYXRlZCkuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25DdXN0b21WaWV3U2F2ZWQ9XCJvbkN1c3RvbVZpZXdTYXZlZEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uQ3VzdG9tVmlld1NhdmVkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgd2hlbiBhIGN1c3RvbSB2aWV3IGhhcyBiZWVuIHNldCBhcyB0aGUgZGVmYXVsdCB2aWV3IGZvciBhIHdvcmtib29rLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uQ3VzdG9tVmlld1NldERlZmF1bHQ9XCJvbkN1c3RvbVZpZXdTZXREZWZhdWx0SGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25DdXN0b21WaWV3U2V0RGVmYXVsdD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIGFmdGVyIGEgbmV3IHN0b3J5IHBvaW50IGJlY29tZXMgYWN0aXZlLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uU3RvcnlQb2ludFN3aXRjaGVkPVwib25TdG9yeVBvaW50U3dpdGNoZWRIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvblN0b3J5UG9pbnRTd2l0Y2hlZD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gdGhlIHN1bW1hcnkgZGF0YSBvbiBhIHZpc3VhbGl6YXRpb24gaGF2ZSBjaGFuZ2VkLiBZb3UgY2FuIHVzZSB0aGlzIGV2ZW50IHR5cGUgd2l0aCBUYWJsZWF1Vml6IG9iamVjdHMuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25TdW1tYXJ5RGF0YUNoYW5nZWQ9XCJvblN1bW1hcnlEYXRhQ2hhbmdlZEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uU3VtbWFyeURhdGFDaGFuZ2VkPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIChCZXRhKSBSZXByZXNlbnRzIHRoZSBvcHRpb25zIGZvciBjb25maWd1cmluZyBhIHZpeiBpbiBhdXRob3JpbmcgbW9kZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaXpBdXRob3JpbmdTZXR0aW5ncyBleHRlbmRzIFZpelNldHRpbmdzU2hhcmVkIHtcbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBDbG9zZSBidXR0b24gaXMgaGlkZGVuIG9yIHZpc2libGUuXG4gICAqIElmIG5vdCBzZXQsIGRlZmF1bHRzIHRvIGZhbHNlLCBtZWFuaW5nIHRoYXQgdGhlIENsb3NlIGJ1dHRvbiBpcyB2aXNpYmxlLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiBoaWRlLWNsb3NlLWJ1dHRvbiAvPlxuICAgKiBgYGBcbiAgICovXG4gIGhpZGVDbG9zZUJ1dHRvbj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIHRoZSB3b3JrYm9vayBoYXMgYmVlbiBwdWJsaXNoZWQuIFRoaXMgbm90aWZpY2F0aW9uIGlzIHNlbnQgd2hlbiB1c2luZyBlbWJlZGRlZCB3ZWIgYXV0aG9yaW5nIGZ1bmN0aW9uYWxpdHkuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIG9uV29ya2Jvb2tQdWJsaXNoZWQ9XCJvbldvcmtib29rUHVibGlzaGVkSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25Xb3JrYm9va1B1Ymxpc2hlZD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gXCJwdWJsaXNoIGFzXCIgaXMgc3VjY2Vzc2Z1bC4gVGhpcyBub3RpZmljYXRpb24gaXMgc2VudCB3aGVuIHVzaW5nIGVtYmVkZGVkIHdlYiBhdXRob3JpbmcgZnVuY3Rpb25hbGl0eS5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LWF1dGhvcmluZy12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25Xb3JrYm9va1B1Ymxpc2hlZEFzPVwib25Xb3JrYm9va1B1Ymxpc2hlZEFzSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25Xb3JrYm9va1B1Ymxpc2hlZEFzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgd2hlbiB0aGUgd29ya2Jvb2sgaXMgcmVhZHkgdG8gY2xvc2UuIFRoaXMgbm90aWZpY2F0aW9uIGlzIHNlbnQgd2hlbiB1c2luZyBlbWJlZGRlZCB3ZWIgYXV0aG9yaW5nIGZ1bmN0aW9uYWxpdHkuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIG9uV29ya2Jvb2tSZWFkeVRvQ2xvc2U9XCJvbldvcmtib29rUmVhZHlUb0Nsb3NlSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25Xb3JrYm9va1JlYWR5VG9DbG9zZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWx0ZXJQYXJhbWV0ZXJzIHtcbiAgZmllbGQ6IHN0cmluZztcbiAgdmFsdWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBWaXpQYXJhbWV0ZXJzIGFyZSB1c2VkIHRvIHNldCBQYXJhbWV0ZXIgdmFsdWVzIG9uIHRoZSB2aXouXG4gKlxuICogKiBgYGBcbiAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIj5cbiAqICA8dml6LXBhcmFtZXRlciBuYW1lPVwicGFyYW1ldGVyLW5hbWVcIiB2YWx1ZT1cInBhcmFtZXRlci12YWx1ZVwiPjwvdml6LXBhcmFtZXRlcj5cbiAqIDwvdGFibGVhdS12aXo+XG4gKiBgYGBcbiAqXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVml6UGFyYW1ldGVyIHtcbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHBhcmFtZXRlciB0byBiZSBzZXQuXG4gICAqL1xuICBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFZhbGlkIHZhbHVlIGZvciB0aGUgcGFyYW1ldGVyIGJlaW5nIHNldC5cbiAgICovXG4gIHZhbHVlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ3VzdG9tUGFyYW1ldGVycyBhcmUgdXNlZCB0byBwYXNzIGFsb25nIHNldHRpbmdzLCBpbmZvcm1hdGlvbiwgZXRjLiwgdGhhdCBhcmVuJ3QgZXhwb3NlZCBvbiB0aGVcbiAqIHRhYmxlYXUtdml6IGVsZW1lbnQuIEN1c3RvbVBhcmFtZXRlcnMgd2lsbCBvdmVycmlkZSBhdHRyaWJ1dGVzLCBvciBmaWx0ZXJzLCBzZXQgb24gdGhlIHRhYmxlYXUtdml6IGVsZW1lbnQuXG4gKlxuICogKiBgYGBcbiAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIj5cbiAqICA8Y3VzdG9tLXBhcmFtZXRlciBuYW1lPVwicGFyYW1ldGVyLW5hbWVcIiB2YWx1ZT1cInBhcmFtZXRlci12YWx1ZVwiPjwvY3VzdG9tLXBhcmFtZXRlcj5cbiAqIDwvdGFibGVhdS12aXo+XG4gKiBgYGBcbiAqXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3VzdG9tUGFyYW1ldGVyIHtcbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHBhcmFtZXRlciB0byBiZSBzZXQuXG4gICAqL1xuICBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFZhbGlkIHZhbHVlIGZvciB0aGUgcGFyYW1ldGVyIGJlaW5nIHNldC5cbiAgICovXG4gIHZhbHVlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBvYmplY3QgZm9yIGV4cG9ydGluZyBkYXRhLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4cG9ydERhdGFPcHRpb25zIHtcbiAgLyoqXG4gICAqIERvIG5vdCB1c2UgYWxpYXNlcyBzcGVjaWZpZWQgaW4gdGhlIGRhdGEgc291cmNlIGluIFRhYmxlYXUuIERlZmF1bHQgaXMgZmFsc2UuXG4gICAqL1xuICBpZ25vcmVBbGlhc2VzPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRoZSBjb2x1bW5zIHRvIGluY2x1ZGUgc3BlY2lmaWVkIGJ5IGZpZWxkIGlkLCBpbmNsdWRlcyBhbGwgYnkgZGVmYXVsdC5cbiAgICogVGhlIG9yZGVyIG9mIHRoZSBjb2x1bW4gaWRzIGluIHRoZSBhcnJheSBkZXRlcm1pbmVzIHRoZSBjb2x1bW4gb3JkZXIgc2hvd24gaW4gdGhlIHN1bW1hcnkgZGF0YSB0YWJsZS5cbiAgICovXG4gIGNvbHVtbnNUb0luY2x1ZGVCeUlkPzogQXJyYXk8c3RyaW5nPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeHBvcnRQREZPcHRpb25zIHtcbiAgc2NhbGluZzogUHJpbnRTY2FsaW5nO1xuICBwYWdlU2l6ZTogUHJpbnRQYWdlU2l6ZTtcbiAgb3JpZW50YXRpb246IFByaW50T3JpZW50YXRpb247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhwb3J0U2NlbmFyaW9zRm9yUERGQW5kUG93ZXJQb2ludCB7XG4gIGN1cnJlbnRTaGVldE5hbWU6IHN0cmluZztcbiAgZXhwb3J0YWJsZVNoZWV0TmFtZXNGcm9tRGFzaGJvYXJkOiBBcnJheTxzdHJpbmc+O1xuICBleHBvcnRhYmxlU2hlZXROYW1lc0Zyb21Xb3JrYm9vazogQXJyYXk8c3RyaW5nPjtcbn1cbiIsIi8qKlxuICogVXNlciBzdXBwbGllZCBvcHRpb25zIHRoYXQgZG8gbm90IGdldCBwYXNzZWQgYXMgcmVxdWVzdCBwYXJhbWV0ZXJzIHRvIGxvYWQgYSBUYWJsZWF1IHZpeiwgVGFibGVhdSBhc2tkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2ViQ29tcG9uZW50TG9jYWxTZXR0aW5ncyB7XG4gIC8qKlxuICAgKiBUaGUgdml6IHNyY1xuICAgKi9cbiAgc3JjPzogc3RyaW5nIHwgbnVsbDtcblxuICAvKipcbiAgICogUmVwcmVzZW50cyB3aWR0aCBpbiBwaXhlbHNcbiAgICogQ2FuIGJlIGFueSB2YWxpZCBDU1Mgc2l6ZSBzcGVjaWZpZXIuIElmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvIHRoZSBwdWJsaXNoZWQgd2lkdGggb2YgdGhlIHZpZXcuXG4gICAqL1xuICB3aWR0aD86IHN0cmluZyB8IG51bWJlcjtcblxuICAvKipcbiAgICogUmVwcmVzZW50cyBoZWlnaHQgaW4gcGl4ZWxzXG4gICAqIENhbiBiZSBhbnkgdmFsaWQgQ1NTIHNpemUgc3BlY2lmaWVyLiBJZiBub3Qgc3BlY2lmaWVkLCBkZWZhdWx0cyB0byB0aGUgcHVibGlzaGVkIGhlaWdodCBvZiB0aGUgdmlldy5cbiAgICovXG4gIGhlaWdodD86IHN0cmluZyB8IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUaGlzIGludGVyZmFjZSByZXByZXNlbnRzIGFsbCBvZiB0aGUgb3B0aW9ucyBmb3IgY29uZmlndXJpbmcgYSB3ZWJjb21wb25lbnQgdGhhdCBhcmUgY29tbW9uIGJldHdlZW5cbiAqIHZpeiBhbmQgYXNrZGF0YS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJDb21wb25lbnRTZXR0aW5nc1NoYXJlZCB7XG4gIC8qKlxuICAgKiBUaGUgdG9rZW4gdXNlZCBmb3IgYXV0aG9yaXphdGlvblxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIHRva2VuPVwic29tZS10b2tlbi1jb250YWluaW5nLWNsaWVudElkXCIgLz5cbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiB0b2tlbj1cInNvbWUtdG9rZW4tY29udGFpbmluZy1jbGllbnRJZFwiIC8+XG4gICAqIDx0YWJsZWF1LWFzay1kYXRhIGlkPVwidGFibGVhdUFza0RhdGFcIiB0b2tlbj1cInNvbWUtdG9rZW4tY29udGFpbmluZy1jbGllbnRJZFwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgdG9rZW4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBub24tbWluaWZpZWQgdmVyc2lvbiBvZiBKYXZhU2NyaXB0IGlzIGxvYWRlZC4gSWYgc3BlY2lmaWVkIChvciBzZXQgdG8gdHJ1ZSksIHRoZVxuICAgKiBub24tbWluaWZpZWQgdmVyc2lvbiBpcyB1c2VkIGZvciBib3RoIHRoZSBsb2NhbCBjb21wb25lbnQgYW5kIHRoZSBUYWJsZWF1IFNlcnZlciB2aXN1YWxpemF0aW9uIChpZiBlbmFibGVkKS5cbiAgICogSWYgbm90IHNwZWNpZmllZCAob3Igc2V0IHRvIGZhbHNlKSwgdGhlIG1pbmlmaWVkIHZlcnNpb24gb2YgdGhlIEphdmFTY3JpcHQgZmlsZXMgYXJlIGxvYWRlZC5cbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBkZWJ1ZyAvPlxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIGRlYnVnIC8+XG4gICAqIDx0YWJsZWF1LWFzay1kYXRhIGlkPVwidGFibGVhdUFza0RhdGFcIiBkZWJ1ZyAvPlxuICAgKiBgYGBcbiAgICovXG4gIGRlYnVnPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdG8gdXNlIHRoZSBvbGQgYXV0aCBtZWNoYW5pc20gZm9yIGF1dGhlbnRpY2F0aW9uIHdoaWNoIGhhcHBlbnMgaW5zaWRlIHRoZSBpZnJhbWUuIElmIHNwZWNpZmllZCwgVml6TG9hZEVycm9yRXZlbnRzXG4gICAqIHRyaWdnZXJlZCBkdWUgdG8gYXV0aCBmYWlsdXJlcyB3aWxsIG5vdCBiZSB0aHJvd24uXG4gICAqXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgaWZyYW1lLWF1dGggLz5cbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiBpZnJhbWUtYXV0aCAvPlxuICAgKiA8dGFibGVhdS1hc2stZGF0YSBpZD1cInRhYmxlYXVBc2tEYXRhXCIgaWZyYW1lLWF1dGggLz5cbiAgICogYGBgXG4gICAqL1xuICBpZnJhbWVBdXRoPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHZhbHVlIG9mIHRoZSAnbG9hZGluZycgYXR0cmlidXRlIG9mIHRoZSBlbWJlZGRlZCBpZnJhbWUuXG4gICAqIFNlZTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRNTC9FbGVtZW50L2lmcmFtZSNsb2FkaW5nXG4gICAqXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgaWZyYW1lLWF0dHItbG9hZGluZz1cImxhenlcIiAvPlxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIGlmcmFtZS1hdHRyLWxvYWRpbmc9XCJsYXp5XCIgLz5cbiAgICogPHRhYmxlYXUtcHVsc2UgaWQ9XCJ0YWJsZWF1UHVsc2VcIiBpZnJhbWUtYXR0ci1sb2FkaW5nPVwibGF6eVwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgaWZyYW1lQXR0cmlidXRlTG9hZGluZz86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZhbHVlIG9mIHRoZSAnc3R5bGUnIGF0dHJpYnV0ZSBvZiB0aGUgZW1iZWRkZWQgaWZyYW1lLlxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIGlmcmFtZS1hdHRyLXN0eWxlPVwiYm9yZGVyOiAxcHggc29saWQgcmVkXCIgLz5cbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiBpZnJhbWUtYXR0ci1zdHlsZT1cImJvcmRlcjogMXB4IHNvbGlkIHJlZFwiIC8+XG4gICAqIDx0YWJsZWF1LXB1bHNlIGlkPVwidGFibGVhdVB1bHNlXCIgaWZyYW1lLWF0dHItc3R5bGU9XCJib3JkZXI6IDFweCBzb2xpZCByZWRcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIGlmcmFtZUF0dHJpYnV0ZVN0eWxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgb2YgdGhlICdjbGFzcycgYXR0cmlidXRlIG9mIHRoZSBlbWJlZGRlZCBpZnJhbWUgcHJvdmlkaW5nIGFjY2VzcyB0byBhbnlcbiAgICogY3VzdG9tIHNlbGVjdG9ycyBkZWZpbmVkIGluIHRoZSBgPGlmcmFtZS1zdHlsZT5gIGNoaWxkIHRhZy5cbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBpZnJhbWUtYXR0ci1jbGFzcz1cInJlZC1ib3JkZXJcIj5cbiAgICogICA8aWZyYW1lLXN0eWxlPlxuICAgKiAgICAgLnJlZC1ib3JkZXIge1xuICAgKiAgICAgICBib3JkZXI6IDFweCBzb2xpZCByZWQ7XG4gICAqICAgICB9XG4gICAqICAgPC9pZnJhbWUtc3R5bGU+XG4gICAqIDwvdGFibGVhdS12aXo+XG4gICAqIGBgYFxuICAgKi9cbiAgaWZyYW1lQXR0cmlidXRlQ2xhc3M/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIG5hbWVzIG9mIHRoZSBjb21tb24gc3RyaW5nIGNvbnN0YW50cyB5b3UgY2FuIHVzZSBhcyBIVE1MIGF0dHJpYnV0ZXMgZm9yIHRoZSB0YWJsZWF1IHdlYiBjb21wb25lbnQuXG4gKiBAaWdub3JlXG4gKi9cbmV4cG9ydCBlbnVtIFdlYkNvbXBvbmVudEF0dHJpYnV0ZXMge1xuICBTcmMgPSAnc3JjJyxcbiAgV2lkdGggPSAnd2lkdGgnLFxuICBIZWlnaHQgPSAnaGVpZ2h0JyxcbiAgVG9rZW4gPSAndG9rZW4nLFxuICBEZWJ1ZyA9ICdkZWJ1ZycsXG4gIElmcmFtZUF1dGggPSAnaWZyYW1lLWF1dGgnLFxuICBPblZpekxvYWRFcnJvciA9ICdvbnZpemxvYWRlcnJvcicsXG4gIEZvcmNlVG9rZW5TeW5jID0gJ2ZvcmNlLXRva2VuLXN5bmMnLFxufVxuXG4vKipcbiAqIFRoZSBuYW1lcyBvZiB0aGUgZW1iZWRkZWQgaWZyYW1lIGF0dHJpYnV0ZXMgd2hvc2UgdmFsdWVzIGNhbiBiZSBjb250cm9sbGVkLlxuICogQGlnbm9yZVxuICovXG5leHBvcnQgZW51bSBFbWJlZGRlZElmcmFtZUF0dHJpYnV0ZXMge1xuICBMb2FkaW5nID0gJ2lmcmFtZS1hdHRyLWxvYWRpbmcnLFxuICBTdHlsZSA9ICdpZnJhbWUtYXR0ci1zdHlsZScsXG4gIENsYXNzID0gJ2lmcmFtZS1hdHRyLWNsYXNzJyxcbn1cblxuLyoqXG4gKiBUaGUgbmFtZXMgb2YgdGhlIHN0cmluZyBjb25zdGFudHMgeW91IGNhbiB1c2UgYXMgY2hpbGQgdGFncyBmb3IgVGFibGVhdVZpeiwgVGFibGVhdUF1dGhvcmluZ1ZpeiBhbmQgVGFibGVhdUFza0RhdGEgY3VzdG9tIGVsZW1lbnRzLlxuICogQGlnbm9yZVxuICovXG5leHBvcnQgZW51bSBXZWJDb21wb25lbnRDaGlsZEVsZW1lbnRzIHtcbiAgLyoqXG4gICAqIENvbnRhaW5zIGEgbGlzdCBvZiBjdXN0b20gcGFyYW1ldGVycy4gIEF2YWlsYWJsZSBpbiB2aXogdmlld2luZywgdml6IGF1dGhvcmluZyBhbmQgYXNrZGF0YS5cbiAgICovXG4gIEN1c3RvbVBhcmFtZXRlciA9ICdjdXN0b20tcGFyYW1ldGVyJyxcblxuICAvKipcbiAgICogQ3VzdG9tIHN0eWxlcyBhcHBsaWNhYmxlIHRvIHRoZSBlbWJlZGRlZCBpZnJhbWUgZWxlbWVudCBpdHNlbGYgKG5vdCBpbnNpZGUgaXQpLlxuICAgKi9cbiAgSWZyYW1lU3R5bGUgPSAnaWZyYW1lLXN0eWxlJyxcbn1cblxuZXhwb3J0IGVudW0gV2ViQ29tcG9uZW50Q2hpbGRFbGVtZW50QXR0cmlidXRlcyB7XG4gIEZpZWxkID0gJ2ZpZWxkJyxcbiAgVmFsdWUgPSAndmFsdWUnLFxuICBOYW1lID0gJ25hbWUnLFxufVxuIiwiLy8gQWxsIGVudW0gdmFsdWVzIG1hZGUgYXZhaWxhYmxlIHRvIEV4dGVuc2lvbnMgZGV2ZWxvcGVycy5cbi8vIEVudW1zIHNob3VsZCBiZSBrZXB0IGluIGFscGhhYmV0aWNhbCBvcmRlci5cblxuaW1wb3J0IHsgRXh0ZW5zaW9ucyB9IGZyb20gJy4vRXh0ZW5zaW9ucyc7XG5cbm5hbWVzcGFjZSBUYWJsZWF1IHtcbiAgZXhwb3J0IGxldCBleHRlbnNpb25zOiBFeHRlbnNpb25zO1xuICAvKipcbiAgICogQWxsIGVycm9yIGNvZGVzIHVzZWQgYnkgdGhlIEV4dGVuc2lvbnMgQVBJLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gRXJyb3JDb2RlcyB7XG4gICAgLyoqXG4gICAgICogVGhyb3duIHdoZW4gY2FsbGVyIGF0dGVtcHRzIHRvIGV4ZWN1dGUgY29tbWFuZCBiZWZvcmUgaW5pdGlhbGl6YXRpb24gaGFzIGNvbXBsZXRlZC5cbiAgICAgKi9cbiAgICBBUElOb3RJbml0aWFsaXplZCA9ICdhcGktbm90LWluaXRpYWxpemVkJyxcbiAgICAvKipcbiAgICAgKiBUaHJvd24gd2hlbiBjYWxsZXIgYXR0ZW1wdHMgdG8gZXhlY3V0ZSBjb21tYW5kIHdoaWxlIGV4dGVuc2lvbiBpcyBub3QgdmlzaWJsZS5cbiAgICAgKi9cbiAgICBWaXNpYmlsaXR5RXJyb3IgPSAndmlzaWJpbGl0eS1lcnJvcicsXG4gICAgLyoqXG4gICAgICogT25seSBvbmUgZGlhbG9nIGNhbiBiZSBvcGVuZWQgYXQgdGltZSB3aXRoIHRoZSBVSSBuYW1lc3BhY2UgZnVuY3Rpb25hbGl0eS5cbiAgICAgKi9cbiAgICBEaWFsb2dBbHJlYWR5T3BlbiA9ICdkaWFsb2ctYWxyZWFkeS1vcGVuJyxcbiAgICAvKipcbiAgICAgKiBUaGUgb3BlbiBkaWFsb2cgd2FzIGNsb3NlZCBieSB0aGUgdXNlci5cbiAgICAgKi9cbiAgICBEaWFsb2dDbG9zZWRCeVVzZXIgPSAnZGlhbG9nLWNsb3NlZC1ieS11c2VyJyxcbiAgICAvKipcbiAgICAgKiBBbiBlcnJvciBvY2N1cnJlZCB3aXRoaW4gdGhlIFRhYmxlYXUgRXh0ZW5zaW9ucyBBUEkuIENvbnRhY3QgVGFibGVhdSBTdXBwb3J0LlxuICAgICAqL1xuICAgIEludGVybmFsRXJyb3IgPSAnaW50ZXJuYWwtZXJyb3InLFxuICAgIC8qKlxuICAgICAqIEEgZGlhbG9nIG11c3Qgc3RhcnQgb24gdGhlIHNhbWUgZG9tYWluIGFzIHRoZSBwYXJlbnQgZXh0ZW5pb24uXG4gICAgICovXG4gICAgSW52YWxpZERvbWFpbkRpYWxvZyA9ICdpbnZhbGlkLWRpYWxvZy1kb21haW4nLFxuICAgIC8qKlxuICAgICAqIEEgcGFyYW1ldGVyIGlzIG5vdCB0aGUgY29ycmVjdCBkYXRhIHR5cGUgb3IgZm9ybWF0LiBUaGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCBpbiB0aGUgRXJyb3IubWVzc2FnZSBmaWVsZC5cbiAgICAgKi9cbiAgICBJbnZhbGlkUGFyYW1ldGVyID0gJ2ludmFsaWQtcGFyYW1ldGVyJyxcbiAgICAvKipcbiAgICAgKiBDYW4gb2NjdXIgaWYgdGhlIGV4dGVuc2lvbiBpbnRlcmFjdHMgd2l0aCBhIGZpbHRlciB0aGF0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgd29ya3NoZWV0LlxuICAgICAqL1xuICAgIE1pc3NpbmdGaWx0ZXIgPSAnbWlzc2luZy1maWx0ZXInLFxuICAgIC8qKlxuICAgICAqIENhbiBvY2N1ciBpZiB0aGUgZXh0ZW5zaW9uIGludGVyYWN0cyB3aXRoIGEgcGFyYW1ldGVyIHRoYXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSB3b3Jrc2hlZXQuXG4gICAgICovXG4gICAgTWlzc2luZ1BhcmFtZXRlciA9ICdtaXNzaW5nLXBhcmFtZXRlcicsXG4gICAgLyoqXG4gICAgICogSW50ZXJuYWwgU2VydmVyIEVycm9yXG4gICAgICovXG4gICAgU2VydmVyRXJyb3IgPSAnc2VydmVyLWVycm9yJyxcbiAgICAvKipcbiAgICAgKiBEZXZlbG9wZXIgY2Fubm90IHNhdmUgc2V0dGluZ3Mgd2hpbGUgYW5vdGhlciBzYXZlIGlzIHN0aWxsIGluIHByb2dyZXNzLlxuICAgICAqL1xuICAgIFNldHRpbmdTYXZlSW5Qcm9ncmVzcyA9ICdzZXR0aW5nLXNhdmUtaW4tcHJvZ3Jlc3MnLFxuICAgIC8qKlxuICAgICAqIEFuIHVua25vd24gZXZlbnQgbmFtZSB3YXMgc3BlY2lmaWVkIGluIHRoZSBjYWxsIHRvIGBhZGRFdmVudExpc3RlbmVyYCBvciBgcmVtb3ZlRXZlbnRMaXN0ZW5lcmAuXG4gICAgICovXG4gICAgVW5zdXBwb3J0ZWRFdmVudE5hbWUgPSAndW5zdXBwb3J0ZWQtZXZlbnQtbmFtZScsXG4gICAgLyoqXG4gICAgICogQSBtZXRob2Qgd2FzIHVzZWQgZm9yIGEgdHlwZSBvZiBkYXRhIHNvdXJjZSB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCB0aGF0IG1ldGhvZCAoc2VlIGdldEFjdGl2ZVRhYmxlc0FzeW5jIGZvciBhbiBleGFtcGxlKVxuICAgICAqL1xuICAgIFVuc3VwcG9ydGVkTWV0aG9kRm9yRGF0YVNvdXJjZVR5cGUgPSAndW5zdXBwb3J0ZWQtbWV0aG9kLWZvci1kYXRhLXNvdXJjZS10eXBlJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgRXh0ZW5zaW9ucyBpcyBjdXJyZW50bHkgcnVubmluZy5cbiAgICovXG4gIGV4cG9ydCBlbnVtIEV4dGVuc2lvbkNvbnRleHQge1xuICAgIERlc2t0b3AgPSAnZGVza3RvcCcsXG4gICAgU2VydmVyID0gJ3NlcnZlcicsXG4gIH1cblxuICAvKipcbiAgICogVGhlIG1vZGUgaW4gd2hpY2ggdGhlIEV4dGVuc2lvbnMgaXMgY3VycmVudGx5IHJ1bm5pbmcuXG4gICAqL1xuICBleHBvcnQgZW51bSBFeHRlbnNpb25Nb2RlIHtcbiAgICBBdXRob3JpbmcgPSAnYXV0aG9yaW5nJyxcbiAgICBWaWV3aW5nID0gJ3ZpZXdpbmcnLFxuICB9XG5cbiAgLyoqXG4gICAqIFJlcHJlc2VudHMgdGhlIHR5cGUgb2YgZXZlbnQgdGhhdCBjYW4gYmUgbGlzdGVuZWQgZm9yLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gVGFibGVhdUV2ZW50VHlwZSB7XG4gICAgLyoqIFJhaXNlZCB3aGVuIGFueSBmaWx0ZXIgaGFzIGNoYW5nZWQgc3RhdGUuIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFtXb3Jrc2hlZXRdKC4uL2ludGVyZmFjZXMvd29ya3NoZWV0Lmh0bWwpIG9iamVjdHMuKi9cbiAgICBGaWx0ZXJDaGFuZ2VkID0gJ2ZpbHRlci1jaGFuZ2VkJyxcblxuICAgIC8qKiBUaGUgc2VsZWN0ZWQgbWFya3Mgb24gYSB2aXN1YWxpemF0aW9uIGhhcyBjaGFuZ2VkLlxuICAgICAqIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFtXb3Jrc2hlZXRdKC4uL2ludGVyZmFjZXMvd29ya3NoZWV0Lmh0bWwpIG9iamVjdHMuICovXG4gICAgTWFya1NlbGVjdGlvbkNoYW5nZWQgPSAnbWFyay1zZWxlY3Rpb24tY2hhbmdlZCcsXG5cbiAgICAvKiogVGhlIHN1bW1hcnkgZGF0YSBiYWNraW5nIGEgd29ya3NoZWV0IGhhcyBjaGFuZ2VkXG4gICAgICogWW91IGNhbiB1c2UgdGhpcyBldmVudCB0eXBlIHdpdGggW1dvcmtzaGVldF0oLi4vaW50ZXJmYWNlcy93b3Jrc2hlZXQuaHRtbCkgb2JqZWN0cy4qL1xuICAgIFN1bW1hcnlEYXRhQ2hhbmdlZCA9ICdzdW1tYXJ5LWRhdGEtY2hhbmdlZCcsXG5cbiAgICAvKiogQSBwYXJhbWV0ZXIgaGFzIGhhZCBpdHMgdmFsdWUgbW9kaWZpZWQuIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFtbUGFyYW1ldGVyXV0gb2JqZWN0cy4gKi9cbiAgICBQYXJhbWV0ZXJDaGFuZ2VkID0gJ3BhcmFtZXRlci1jaGFuZ2VkJyxcblxuICAgIC8qKiBTZXR0aW5ncyBoYXZlIGJlZW4gY2hhbmdlZCBmb3IgdGhpcyBleHRlbnNpb24uIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFtbU2V0dGluZ3NdXSBvYmplY3RzLiAqL1xuICAgIFNldHRpbmdzQ2hhbmdlZCA9ICdzZXR0aW5ncy1jaGFuZ2VkJyxcblxuICAgIC8qKiBUaGUgZGFzaGJvYXJkIGxheW91dCBoYXMgY2hhbmdlZFxuICAgICAqIEBjYXRlZ29yeSBEYXNoYm9hcmQgRXh0ZW5zaW9uc1xuICAgICAqL1xuICAgIERhc2hib2FyZExheW91dENoYW5nZWQgPSAnZGFzaGJvYXJkLWxheW91dC1jaGFuZ2VkJyxcblxuICAgIC8qKiBUaGUgd29ya2Jvb2sgZm9ybWF0dGluZyBoYXMgY2hhbmdlZFxuICAgICAqIEBjYXRlZ29yeSBEYXNoYm9hcmQgRXh0ZW5zaW9uc1xuICAgICAqL1xuICAgIFdvcmtib29rRm9ybWF0dGluZ0NoYW5nZWQgPSAnd29ya2Jvb2stZm9ybWF0dGluZy1jaGFuZ2VkJyxcblxuICAgIC8qKiBUaGUgd29ya3NoZWV0IGZvcm1hdHRpbmcgaGFzIGNoYW5nZWRcbiAgICAgKiBAY2F0ZWdvcnkgVml6IEV4dGVuc2lvbnNcbiAgICAgKi9cbiAgICBXb3Jrc2hlZXRGb3JtYXR0aW5nQ2hhbmdlZCA9ICd3b3Jrc2hlZXQtZm9ybWF0dGluZy1jaGFuZ2VkJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnVtIHRoYXQgcmVwcmVzZW50cyB0aGUgZGF0YSB0eXBlIG9mIGVuY29kaW5ncyBmb3IgY3JlYXRlVml6SW1hZ2VBc3luYy5cbiAgICogQHNpbmNlIDEuNi4wXG4gICAqL1xuICBleHBvcnQgZW51bSBWaXpJbWFnZUVuY29kaW5nVHlwZSB7XG4gICAgRGlzY3JldGUgPSAnZGlzY3JldGUnLFxuICAgIENvbnRpbnVvdXMgPSAnY29udGludW91cycsXG4gIH1cblxuICAvKipcbiAgICogRW51bSB0aGF0IHJlcHJlc2VudHMgdGhlIHNvcnQgZGlyZWN0aW9uIGZvciBjcmVhdGVWaXpJbWFnZUFzeW5jLlxuICAgKiBAc2luY2UgMS44LjAgYW5kIFRhYmxlYXUgMjAyMS40XG4gICAqL1xuICBleHBvcnQgZW51bSBWaXpJbWFnZVNvcnREaXJlY3Rpb25UeXBlIHtcbiAgICBBc2NlbmRpbmcgPSAnYXNjZW5kaW5nJyxcbiAgICBEZXNjZW5kaW5nID0gJ2Rlc2NlbmRpbmcnLFxuICB9XG5cbiAgLyoqXG4gICAqIEVudW0gdGhhdCByZXByZXNlbnRzIHRoZSBwYWxldHRlIHR5cGUgZm9yIGNyZWF0ZVZpekltYWdlQXN5bmMuXG4gICAqIEBzaW5jZSAxLjguMCBhbmQgVGFibGVhdSAyMDIxLjRcbiAgICovXG4gIGV4cG9ydCBlbnVtIFZpekltYWdlUGFsZXR0ZVR5cGUge1xuICAgIEN1c3RvbURpdmVyZ2luZyA9ICdjdXN0b20tZGl2ZXJnaW5nJyxcbiAgICBDdXN0b21TZXF1ZW50aWFsID0gJ2N1c3RvbS1zZXF1ZW50aWFsJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnVtIHRoYXQgcmVwcmVzZW50cyB0aGUgU2l6ZSBTZXR0aW5nIHR5cGUgZm9yIGNyZWF0ZVZpekltYWdlQXN5bmMuXG4gICAqIEBzaW5jZSAxLjguMCBhbmQgVGFibGVhdSAyMDIxLjRcbiAgICovXG4gIGV4cG9ydCBlbnVtIFZpekltYWdlU2l6ZVNldHRpbmdUeXBlIHtcbiAgICBGaXhlZCA9ICdmaXhlZCcsXG4gICAgTWFudWFsID0gJ21hbnVhbCcsXG4gIH1cblxuICAvKipcbiAgICogRW51bSB0aGF0IHJlcHJlc2VudHMgdGhlIFNpemUgU2V0dGluZyBhbGlnbm1lbnQgdHlwZSBmb3IgY3JlYXRlVml6SW1hZ2VBc3luYy5cbiAgICogQHNpbmNlIDEuOC4wIGFuZCBUYWJsZWF1IDIwMjEuNFxuICAgKi9cbiAgZXhwb3J0IGVudW0gVml6SW1hZ2VTaXplU2V0dGluZ0FsaWdubWVudFR5cGUge1xuICAgIFJpZ2h0ID0gJ3JpZ2h0JyxcbiAgICBMZWZ0ID0gJ2xlZnQnLFxuICAgIENlbnRlciA9ICdjZW50ZXInLFxuICB9XG59XG5leHBvcnQgPSBUYWJsZWF1O1xuIiwiZXhwb3J0IGVudW0gU2hhcmVkRXJyb3JDb2RlcyB7XG4gIC8qKlxuICAgKiBBIENTViBvciBFeGNlbCBmaWxlIGZhaWxlZCB0byBiZSBjcmVhdGVkIGluIFZpei5leHBvcnRDcm9zc3RhYkFzeW5jKCkuXG4gICAqL1xuICBDcm9zc3RhYkNyZWF0aW9uRXJyb3IgPSAnY3Jvc3N0YWItY3JlYXRpb24tZXJyb3InLFxuICAvKipcbiAgICogQSBDU1YgZmlsZSBmYWlsZWQgdG8gYmUgY3JlYXRlZCBpbiBWaXouZXhwb3J0RGF0YUFzeW5jKCkuXG4gICAqL1xuICBEYXRhQ3JlYXRpb25FcnJvciA9ICdkYXRhLWNyZWF0aW9uLWVycm9yJyxcbiAgLyoqXG4gICAqIEFuIGludmFsaWQgYWdncmVnYXRpb24gd2FzIHNwZWNpZmllZCBmb3IgdGhlIGZpbHRlciwgc3VjaCBhcyBzZXR0aW5nIGEgcmFuZ2UgZmlsdGVyIHRvIFwiU1VNKFNhbGVzKVwiIGluc3RlYWQgb2ZcbiAgICogXCJTYWxlc1wiLlxuICAgKi9cbiAgSW52YWxpZEFnZ3JlZ2F0aW9uRmllbGROYW1lID0gJ2ludmFsaWQtYWdncmVnYXRpb24tZmllbGQtbmFtZScsXG4gIC8qKlxuICAgKiBBIGZpbHRlciBvcGVyYXRpb24gd2FzIGF0dGVtcHRlZCBvbiBhIGZpZWxkIHRoYXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGRhdGEgc291cmNlLlxuICAgKi9cbiAgSW52YWxpZEZpbHRlckZpZWxkTmFtZSA9ICdpbnZhbGlkLWZpbHRlci1uYW1lJyxcbiAgLyoqXG4gICAqIEEgZmlsdGVyIG9wZXJhdGlvbiB3YXMgYXR0ZW1wdGVkIHVzaW5nIGEgdmFsdWUgdGhhdCBpcyB0aGUgd3JvbmcgZGF0YSB0eXBlIG9yIGZvcm1hdC5cbiAgICovXG4gIEludmFsaWRGaWx0ZXJGaWVsZFZhbHVlID0gJ2ludmFsaWQtZmlsdGVyLWZpZWxkVmFsdWUnLFxuICAvKipcbiAgICogQW4gaW52YWxpZCBkYXRlIHZhbHVlIHdhcyBzcGVjaWZpZWQgaW4gYSBTaGVldC5zZWxlY3RNYXJrc0FzeW5jKCkgY2FsbCBmb3IgYSBkYXRlIGZpZWxkLlxuICAgKi9cbiAgSW52YWxpZFNlbGVjdGlvbkRhdGUgPSAnaW52YWxpZC1zZWxlY3Rpb24tZGF0ZScsXG4gIC8qKlxuICAgKiBBIGZpZWxkIHdhcyBzcGVjaWZpZWQgaW4gYSBTaGVldC5zZWxlY3RNYXJrc0FzeW5jKCkgY2FsbCB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBkYXRhIHNvdXJjZS5cbiAgICovXG4gIEludmFsaWRTZWxlY3Rpb25GaWVsZE5hbWUgPSAnaW52YWxpZC1zZWxlY3Rpb24tZmllbGROYW1lJyxcbiAgLyoqXG4gICAqIEFuIGludmFsaWQgdmFsdWUgd2FzIHNwZWNpZmllZCBpbiBhIFNoZWV0LnNlbGVjdE1hcmtzQXN5bmMoKSBjYWxsLlxuICAgKi9cbiAgSW52YWxpZFNlbGVjdGlvblZhbHVlID0gJ2ludmFsaWQtc2VsZWN0aW9uLXZhbHVlJyxcbiAgLyoqXG4gICAqIEEgcGFyYW1ldGVyIGRpZCBub3QgaW5jbHVkZSBhIHZhbGlkIHNoZWV0IHNlbGVjdGlvbiBmb3IgZXhwb3J0aW5nLlxuICAgKi9cbiAgSW52YWxpZFNlbGVjdGlvblNoZWV0ID0gJ2ludmFsaWQtc2VsZWN0aW9uLXNoZWV0JyxcbiAgLyoqXG4gICAqIEFuIGVycm9yIG9jY3VycmVkIHdpdGhpbiB0aGUgVGFibGVhdSBBUEkuIENvbnRhY3QgVGFibGVhdSBTdXBwb3J0LlxuICAgKi9cbiAgSW50ZXJuYWxFcnJvciA9ICdpbnRlcm5hbC1lcnJvcicsXG4gIC8qKlxuICAgKiBBIHBhcmFtZXRlciBpcyBub3QgdGhlIGNvcnJlY3QgZGF0YSB0eXBlIG9yIGZvcm1hdC4gVGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciBpcyBzcGVjaWZpZWQgaW4gdGhlIEVycm9yLm1lc3NhZ2UgZmllbGQuXG4gICAqL1xuICBJbnZhbGlkUGFyYW1ldGVyID0gJ2ludmFsaWQtcGFyYW1ldGVyJyxcbiAgLyoqXG4gICAqIEEgUERGIGZpbGUgZmFpbGVkIHRvIGJlIGNyZWF0ZWQgaW4gVml6LmV4cG9ydFBERkFzeW5jKCkuXG4gICAqL1xuICBQREZDcmVhdGlvbkVycm9yID0gJ3BkZi1jcmVhdGlvbi1lcnJvcicsXG4gIC8qKlxuICAgKiBBIFBvd2VyUG9pbnQgZmlsZSBmYWlsZWQgdG8gYmUgY3JlYXRlZCBpbiBWaXouZXhwb3J0UG93ZXJQb2ludEFzeW5jKCkuXG4gICAqL1xuICBQb3dlclBvaW50Q3JlYXRpb25FcnJvciA9ICdwb3dlcnBvaW50LWNyZWF0aW9uLWVycm9yJyxcbiAgLyoqXG4gICAqIEFuIG9wZXJhdGlvbiB3YXMgYXR0ZW1wdGVkIG9uIGEgc2hlZXQgdGhhdCBpcyBub3QgYWN0aXZlIG9yIGVtYmVkZGVkIHdpdGhpbiB0aGUgYWN0aXZlIGRhc2hib2FyZC5cbiAgICovXG4gIE5vdEFjdGl2ZVNoZWV0ID0gJ25vdC1hY3RpdmUtc2hlZXQnLFxuICAvKipcbiAgICogUHJvcGVydHkgb3IgRnVuY3Rpb24gaXMgbm90IHN1cHBvcnRlZCB3aXRoaW4gdGhlIFRhYmxlYXUgQVBJLlxuICAgKi9cbiAgSW1wbGVtZW50YXRpb25FcnJvciA9ICd3cm9uZy1pbXBsZW1lbnRhdGlvbicsXG4gIC8qKlxuICAgKiBDYW4gb2NjdXIgd2hlbiB0d28gaW5jb21wYXRpYmxlIGNhbGxzIGFyZSB0cmlnZ2VyZWQgdG9nZXRoZXIuXG4gICAqL1xuICBBcGlFeGVjdXRpb25FcnJvciA9ICdhcGktZXhlY3V0aW9uLWVycm9yJyxcbiAgLyoqXG4gICAqIEEgZ2VuZXJhbC1wdXJwb3NlIHNlcnZlciBlcnJvciBvY2N1cnJlZC4gRGV0YWlscyBhcmUgY29udGFpbmVkIGluIHRoZSBFcnJvciBvYmplY3QuXG4gICAqL1xuICBTZXJ2ZXJFcnJvciA9ICdzZXJ2ZXItZXJyb3InLFxuICAvKipcbiAgICogQ2FuIG9jY3VyIHdoZW4gYW4gYXBpIGNhbGwgdGltZXMgb3V0LlxuICAgKi9cbiAgVGltZW91dCA9ICd0aW1lb3V0Jyxcbn1cbiIsIi8qKlxuICogVGhlIHRhYmxlYXUgbmFtZXNwYWNlIGV4aXN0cyBmb3Igb3JnYW5pemF0aW9uIGFuZCB0byBhdm9pZCBwb2xsdXRpbmdcbiAqIHRoZSBnbG9iYWwgbmFtZXNwYWNlLiBJdCBjb250YWlucyBubyBjb25zdHJ1Y3RzIG90aGVyIHRoYW4gc3ViLW5hbWVzcGFjZXMgYW5kIHRoZSBUYWJsZWF1IGVudW1lcmF0aW9ucy5cbiAqL1xubmFtZXNwYWNlIFRhYmxlYXUge1xuICBleHBvcnQgZW51bSBBbmFseXRpY3NPYmplY3RUeXBlIHtcbiAgICBDbHVzdGVyID0gJ2NsdXN0ZXInLFxuICAgIEZvcmVjYXN0ID0gJ2ZvcmVjYXN0JyxcbiAgICBUcmVuZExpbmUgPSAndHJlbmQtbGluZScsXG4gIH1cblxuICBleHBvcnQgZW51bSBBbm5vdGF0aW9uVHlwZSB7XG4gICAgTWFyayA9ICdtYXJrJyxcbiAgICBQb2ludCA9ICdwb2ludCcsXG4gICAgQXJlYSA9ICdhcmVhJyxcbiAgfVxuXG4gIGV4cG9ydCBlbnVtIENvbHVtblR5cGUge1xuICAgIERpc2NyZXRlID0gJ2Rpc2NyZXRlJyxcbiAgICBDb250aW51b3VzID0gJ2NvbnRpbnVvdXMnLFxuICAgIFVua25vd24gPSAndW5rbm93bicsXG4gIH1cblxuICBleHBvcnQgZW51bSBDbGFzc05hbWVLZXkge1xuICAgIFdvcmtzaGVldFRpdGxlID0gJ3RhYmxlYXUtd29ya3NoZWV0LXRpdGxlJyxcbiAgICBXb3Jrc2hlZXQgPSAndGFibGVhdS13b3Jrc2hlZXQnLFxuICAgIFRvb2x0aXAgPSAndGFibGVhdS10b29sdGlwJyxcbiAgICBTdG9yeVRpdGxlID0gJ3RhYmxlYXUtc3RvcnktdGl0bGUnLFxuICAgIERhc2hib2FyZFRpdGxlID0gJ3RhYmxlYXUtZGFzaGJvYXJkLXRpdGxlJyxcbiAgICBQYW5lID0gJ3RhYmxlYXUtcGFuZScsXG4gICAgUm93RGl2aWRlcnMgPSAndGFibGVhdS1yb3ctZGl2aWRlcnMnLFxuICAgIENvbHVtbkRpdmlkZXJzID0gJ3RhYmxlYXUtY29sdW1uLWRpdmlkZXJzJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGF0IHRoZSBvYmplY3QgcmVwcmVzZW50cyBpbiBhIGRhc2hib2FyZC5cbiAgICovXG4gIGV4cG9ydCBlbnVtIERhc2hib2FyZE9iamVjdFR5cGUge1xuICAgIEJsYW5rID0gJ2JsYW5rJyxcbiAgICBXb3Jrc2hlZXQgPSAnd29ya3NoZWV0JyxcbiAgICBRdWlja0ZpbHRlciA9ICdxdWljay1maWx0ZXInLFxuICAgIFBhcmFtZXRlckNvbnRyb2wgPSAncGFyYW1ldGVyLWNvbnRyb2wnLFxuICAgIFBhZ2VGaWx0ZXIgPSAncGFnZS1maWx0ZXInLFxuICAgIExlZ2VuZCA9ICdsZWdlbmQnLFxuICAgIFRpdGxlID0gJ3RpdGxlJyxcbiAgICBUZXh0ID0gJ3RleHQnLFxuICAgIEltYWdlID0gJ2ltYWdlJyxcbiAgICBXZWJQYWdlID0gJ3dlYi1wYWdlJyxcbiAgICBFeHRlbnNpb24gPSAnZXh0ZW5zaW9uJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnVtIHRoYXQgcmVwcmVzZW50cyB0aGUgdmlzaWJpbGl0eSBzdGF0ZSBvZiBhIGRhc2hib2FyZCBvYmplY3QuXG4gICAqIEBzaW5jZSAxLjcuMFxuICAgKi9cbiAgZXhwb3J0IGVudW0gRGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eVR5cGUge1xuICAgIC8qKiBVc2VkIGZvciB0dXJuaW5nIG9uIHRoZSB2aXNpYmlsaXR5IG9mIGEgZGFzaGJvYXJkIG9iamVjdC4qL1xuICAgIFNob3cgPSAnc2hvdycsXG5cbiAgICAvKiogVXNlZCBmb3IgdHVybmluZyBvZmYgdGhlIHZpc2liaWxpdHkgb2YgYSBkYXNoYm9hcmQgb2JqZWN0LiovXG4gICAgSGlkZSA9ICdoaWRlJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZGlmZmVyZW50IHR5cGVzIG9mIGRhdGEgYSB2YWx1ZSBjYW4gaGF2ZVxuICAgKi9cbiAgZXhwb3J0IGVudW0gRGF0YVR5cGUge1xuICAgIFN0cmluZyA9ICdzdHJpbmcnLFxuICAgIEludCA9ICdpbnQnLFxuICAgIEZsb2F0ID0gJ2Zsb2F0JyxcbiAgICBCb29sID0gJ2Jvb2wnLFxuICAgIERhdGUgPSAnZGF0ZScsXG4gICAgRGF0ZVRpbWUgPSAnZGF0ZS10aW1lJyxcbiAgICBTcGF0aWFsID0gJ3NwYXRpYWwnLFxuICAgIFVua25vd24gPSAndW5rbm93bicsXG4gIH1cblxuICAvKipcbiAgICogRW51bSB0aGF0IHJlcHJlc2VudHMgdGhlIGNoYW5nZXMgdGhhdCBvY2N1ciB0byBhIGRhc2hib2FyZCBvYmplY3QuXG4gICAqL1xuICBleHBvcnQgZW51bSBEYXNoYm9hcmRMYXlvdXRDaGFuZ2Uge1xuICAgIC8qKiBBIGRhc2hib2FyZCBvYmplY3Qgd2FzIGFkZGVkICovXG4gICAgQWRkZWQgPSAnYWRkZWQnLFxuXG4gICAgLyoqIEEgZGFzaGJvYXJkIG9iamVjdCB3YXMgcmVtb3ZlZCAqL1xuICAgIFJlbW92ZWQgPSAncmVtb3ZlZCcsXG5cbiAgICAvKiogQSBkYXNoYm9hcmQgb2JqZWN0J3MgZmxvYXRpbmcgc3RhdGUgY2hhbmdlZCAqL1xuICAgIElzRmxvYXRpbmdDaGFuZ2VkID0gJ2lzLWZsb2F0aW5nLWNoYW5nZWQnLFxuXG4gICAgLyoqIEEgZGFzaGJvYXJkIG9iamVjdCdzIHZpc2liaWxpdHkgY2hhbmdlZCAqL1xuICAgIElzVmlzaWJsZUNoYW5nZWQgPSAnaXMtdmlzaWJsZS1jaGFuZ2VkJyxcblxuICAgIC8qKiBBIGRhc2hib2FyZCBvYmplY3QncyBwb3NpdGlvbiBjaGFuZ2VkICovXG4gICAgUG9zaXRpb25DaGFuZ2VkID0gJ3Bvc2l0aW9uLWNoYW5nZWQnLFxuXG4gICAgLyoqIEEgZGFzaGJvYXJkIG9iamVjdCdzIHNpemUgY2hhbmdlZCAqL1xuICAgIFNpemVDaGFuZ2VkID0gJ3NpemUtY2hhbmdlZCcsXG5cbiAgICAvKiogQSBkYXNoYm9hcmQgb2JqZWN0IHdhcyByZW5hbWVkICovXG4gICAgTmFtZUNoYW5nZWQgPSAnbmFtZS1jaGFuZ2VkJyxcblxuICAgIC8qKiBBIGRhc2hib2FyZCBvYmplY3QgaXMgc2VsZWN0ZWQgKi9cbiAgICBTZWxlY3RlZCA9ICdzZWxlY3RlZCcsXG5cbiAgICAvKiogQSBkYXNoYm9hcmQgb2JqZWN0IGlzIGRlc2VsZWN0ZWQgKi9cbiAgICBEZXNlbGVjdGVkID0gJ2Rlc2VsZWN0ZWQnLFxuXG4gICAgLyoqIE5hdmlnYXRlIHRvIGFub3RoZXIgZGFzaGJvYXJkICovXG4gICAgRGFzaGJvYXJkQ2hhbmdlZCA9ICdkYXNoYm9hcmQtY2hhbmdlZCcsXG4gIH1cblxuICAvKipcbiAgICogVmFsaWQgZGF0ZSByYW5nZXMgZm9yIGEgcmVsYXRpdmUgZGF0ZSBmaWx0ZXIuXG4gICAqL1xuICBleHBvcnQgZW51bSBEYXRlUmFuZ2VUeXBlIHtcbiAgICBMYXN0ID0gJ2xhc3QnLFxuICAgIExhc3ROID0gJ2xhc3QtbicsXG4gICAgTmV4dCA9ICduZXh0JyxcbiAgICBOZXh0TiA9ICduZXh0LW4nLFxuICAgIEN1cnJlbnQgPSAnY3VycmVudCcsXG4gICAgVG9EYXRlID0gJ3RvLWRhdGUnLFxuICB9XG5cbiAgLyoqXG4gICAqIEVudW0gdGhhdCByZXByZXNlbnRzIHRoZSB0eXBlcyBvZiBkaWFsb2cgcG9wdXAgc3R5bGVzLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gRGlhbG9nU3R5bGUge1xuICAgIFdpbmRvdyA9ICd3aW5kb3cnLFxuICAgIE1vZGFsID0gJ21vZGFsJyxcbiAgICBNb2RlbGVzcyA9ICdtb2RlbGVzcycsXG4gIH1cblxuICBleHBvcnQgZW51bSBFbmNvZGluZ1R5cGUge1xuICAgIENvbHVtbiA9ICdjb2x1bW4nLFxuICAgIFJvdyA9ICdyb3cnLFxuICAgIFBhZ2UgPSAncGFnZScsXG4gICAgRmlsdGVyID0gJ2ZpbHRlcicsXG4gICAgTWFya3NUeXBlID0gJ21hcmtzLXR5cGUnLFxuICAgIE1lYXN1cmVWYWx1ZXMgPSAnbWVhc3VyZS12YWx1ZXMnLFxuICAgIENvbG9yID0gJ2NvbG9yJyxcbiAgICBTaXplID0gJ3NpemUnLFxuICAgIExhYmVsID0gJ2xhYmVsJyxcbiAgICBEZXRhaWwgPSAnZGV0YWlsJyxcbiAgICBUb29sdGlwID0gJ3Rvb2x0aXAnLFxuICAgIFNoYXBlID0gJ3NoYXBlJyxcbiAgICBQYXRoID0gJ3BhdGgnLFxuICAgIEFuZ2xlID0gJ2FuZ2xlJyxcbiAgICBHZW9tZXRyeSA9ICdnZW9tZXRyeScsXG4gICAgQ3VzdG9tID0gJ2N1c3RvbScsXG4gIH1cblxuICAvKipcbiAgICogIFR5cGUgb2YgYWdncmVnYXRpb24gb24gYSBmaWVsZC5cbiAgICovXG4gIGV4cG9ydCBlbnVtIEZpZWxkQWdncmVnYXRpb25UeXBlIHtcbiAgICBTdW0gPSAnc3VtJyxcbiAgICBBdmcgPSAnYXZnJyxcbiAgICBNaW4gPSAnbWluJyxcbiAgICBNYXggPSAnbWF4JyxcbiAgICBTdGRldiA9ICdzdGRldicsXG4gICAgU3RkZXZwID0gJ3N0ZGV2cCcsXG4gICAgVmFyID0gJ3ZhcicsXG4gICAgVmFycCA9ICd2YXJwJyxcbiAgICBDb2xsZWN0ID0gJ2NvbGxlY3QnLFxuICAgIENvdW50ID0gJ2NvdW50JyxcbiAgICBDb3VudGQgPSAnY291bnRkJyxcbiAgICBNZWRpYW4gPSAnbWVkaWFuJyxcbiAgICBBdHRyID0gJ2F0dHInLFxuICAgIE5vbmUgPSAnbm9uZScsXG4gICAgWWVhciA9ICd5ZWFyJyxcbiAgICBRdHIgPSAncXRyJyxcbiAgICBNb250aCA9ICdtb250aCcsXG4gICAgRGF5ID0gJ2RheScsXG4gICAgSG91ciA9ICdob3VyJyxcbiAgICBNaW51dGUgPSAnbWludXRlJyxcbiAgICBTZWNvbmQgPSAnc2Vjb25kJyxcbiAgICBXZWVrID0gJ3dlZWsnLFxuICAgIFdlZWtkYXkgPSAnd2Vla2RheScsXG4gICAgTW9udGhZZWFyID0gJ21vbnRoLXllYXInLFxuICAgIE1keSA9ICdtZHknLFxuICAgIEVuZCA9ICdlbmQnLFxuICAgIFRydW5jWWVhciA9ICd0cnVuYy15ZWFyJyxcbiAgICBUcnVuY1F0ciA9ICd0cnVuYy1xdHInLFxuICAgIFRydW5jTW9udGggPSAndHJ1bmMtbW9udGgnLFxuICAgIFRydW5jV2VlayA9ICd0cnVuYy13ZWVrJyxcbiAgICBUcnVuY0RheSA9ICd0cnVuYy1kYXknLFxuICAgIFRydW5jSG91ciA9ICd0cnVuYy1ob3VyJyxcbiAgICBUcnVuY01pbnV0ZSA9ICd0cnVuYy1taW51dGUnLFxuICAgIFRydW5jU2Vjb25kID0gJ3RydW5jLXNlY29uZCcsXG4gICAgUXVhcnQxID0gJ3F1YXJ0MScsXG4gICAgUXVhcnQzID0gJ3F1YXJ0MycsXG4gICAgU2tld25lc3MgPSAnc2tld25lc3MnLFxuICAgIEt1cnRvc2lzID0gJ2t1cnRvc2lzJyxcbiAgICBJbk91dCA9ICdpbi1vdXQnLFxuICAgIFVzZXIgPSAndXNlcicsXG4gIH1cblxuICAvKipcbiAgICogUm9sZSBvZiBhIGZpZWxkLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gRmllbGRSb2xlVHlwZSB7XG4gICAgRGltZW5zaW9uID0gJ2RpbWVuc2lvbicsXG4gICAgTWVhc3VyZSA9ICdtZWFzdXJlJyxcbiAgICBVbmtub3duID0gJ3Vua25vd24nLFxuICB9XG5cbiAgLyoqXG4gICAqIEFuIGVudW1lcmF0aW9uIG9mIHRoZSB2YWxpZCB0eXBlcyBvZiBmaWx0ZXJzIHRoYXQgY2FuIGJlIGFwcGxpZWQuXG4gICAqL1xuICBleHBvcnQgZW51bSBGaWx0ZXJUeXBlIHtcbiAgICBDYXRlZ29yaWNhbCA9ICdjYXRlZ29yaWNhbCcsXG4gICAgUmFuZ2UgPSAncmFuZ2UnLFxuICAgIEhpZXJhcmNoaWNhbCA9ICdoaWVyYXJjaGljYWwnLFxuICAgIFJlbGF0aXZlRGF0ZSA9ICdyZWxhdGl2ZS1kYXRlJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZGlmZmVyZW50IHVwZGF0ZSB0eXBlcyBmb3IgYXBwbHlpbmcgZmlsdGVyXG4gICAqL1xuICBleHBvcnQgZW51bSBGaWx0ZXJVcGRhdGVUeXBlIHtcbiAgICBBZGQgPSAnYWRkJyxcbiAgICBBbGwgPSAnYWxsJyxcbiAgICBSZXBsYWNlID0gJ3JlcGxhY2UnLFxuICAgIFJlbW92ZSA9ICdyZW1vdmUnLFxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBkb21haW4gdHlwZSBmb3IgYSBmaWx0ZXJcbiAgICovXG4gIGV4cG9ydCBlbnVtIEZpbHRlckRvbWFpblR5cGUge1xuICAgIC8qKlxuICAgICAqIFRoZSBkb21haW4gdmFsdWVzIHRoYXQgYXJlIHJlbGV2YW50IHRvIHRoZSBzcGVjaWZpZWQgZmlsdGVyXG4gICAgICogaS5lLiB0aGUgZG9tYWluIGlzIHJlc3RyaWN0ZWQgYnkgYSBwcmV2aW91cyBmaWx0ZXJcbiAgICAgKi9cbiAgICBSZWxldmFudCA9ICdyZWxldmFudCcsXG4gICAgLyoqXG4gICAgICogbGlzdCBvZiBhbGwgcG9zc2libGUgZG9tYWluIHZhbHVlcyBmcm9tIGRhdGFiYXNlXG4gICAgICovXG4gICAgRGF0YWJhc2UgPSAnZGF0YWJhc2UnLFxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBvcHRpb24gZm9yIHNwZWNpZnlpbmcgd2hpY2ggdmFsdWVzIHRvIGluY2x1ZGUgZm9yIGZpbHRlcmluZ1xuICAgKiBJbmRpY2F0ZXMgd2hhdCB0byBkbyB3aXRoIG51bGwgdmFsdWVzIGZvciBhIGdpdmVuIGZpbHRlciBvciBtYXJrIHNlbGVjdGlvbiBjYWxsLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gRmlsdGVyTnVsbE9wdGlvbiB7XG4gICAgTnVsbFZhbHVlcyA9ICdudWxsLXZhbHVlcycsXG4gICAgTm9uTnVsbFZhbHVlcyA9ICdub24tbnVsbC12YWx1ZXMnLFxuICAgIEFsbFZhbHVlcyA9ICdhbGwtdmFsdWVzJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnVtIHRoYXQgc2VydmVzIGFzIGEgZmlsdGVyIG9uIHRoZSBEYXRhVmFsdWVzIHJldHVybmVkIGZyb20gYGdldFN1bW1hcnlEYXRhUmVhZGVyQXN5bmNgLFxuICAgKiBgZ2V0VW5kZXJseWluZ1RhYmxlRGF0YVJlYWRlckFzeW5jYCBhbmQgYGdldExvZ2ljYWxUYWJsZURhdGFSZWFkZXJBc3luY2AuXG4gICAqIFRoaXMgaXMgYW4gb3B0aW1pemF0aW9uIG9mIHJldHVybmVkIGRhdGEgdmFsdWVzIG9ubHkuIFRhYmxlYXUgdmVyc2lvbnMgcHJpb3IgdG8gMjAyMS4yXG4gICAqIHdpbGwgcGFzcyB0aGUgZGF0YSBhY3Jvc3MgYW5kIHBvcHVsYXRlIHRoZSBEYXRhVmFsdWUgcHJvcGVydGllcy5cbiAgICogUGxlYXNlIG5vdGUgdGhhdCBhbGwgcHJvcGVydGllcyBub3QgcmVxdWVzdGVkIHdpbGwgYmUgYHVuZGVmaW5lZGAgaW4gdGhlIERhdGFWYWx1ZSByZXN1bHRzLlxuICAgKiBAc2luY2UgMS41LjBcbiAgICovXG4gIGV4cG9ydCBlbnVtIEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uIHtcbiAgICAvKiogRGF0YVZhbHVlcyB3aWxsIGluY2x1ZGUgYWxsIHByb3BlcnRpZXMuKi9cbiAgICBBbGxWYWx1ZXMgPSAnYWxsLXZhbHVlcycsXG5cbiAgICAvKiogRGF0YVZhbHVlcyB3aWxsIG9ubHkgaW5jbHVkZSB2YWx1ZSBhbmQgbmF0aXZlVmFsdWUgcHJvcGVydGllcy4qL1xuICAgIE9ubHlOYXRpdmVWYWx1ZXMgPSAnb25seS1uYXRpdmUtdmFsdWVzJyxcblxuICAgIC8qKiBEYXRhVmFsdWVzIHdpbGwgb25seSBpbmNsdWRlIGZvcm1hdHRlZFZhbHVlIHByb3BlcnRpZXMuICovXG4gICAgT25seUZvcm1hdHRlZFZhbHVlcyA9ICdvbmx5LWZvcm1hdHRlZC12YWx1ZXMnLFxuICB9XG5cbiAgLyoqXG4gICAqIFR5cGUgb2YgbWFyayBmb3IgYSBnaXZlbiBtYXJrcyBjYXJkIGluIGEgdml6LlxuICAgKi9cbiAgZXhwb3J0IGVudW0gTWFya1R5cGUge1xuICAgIEJhciA9ICdiYXInLFxuICAgIExpbmUgPSAnbGluZScsXG4gICAgQXJlYSA9ICdhcmVhJyxcbiAgICBTcXVhcmUgPSAnc3F1YXJlJyxcbiAgICBDaXJjbGUgPSAnY2lyY2xlJyxcbiAgICBTaGFwZSA9ICdzaGFwZScsXG4gICAgVGV4dCA9ICd0ZXh0JyxcbiAgICBNYXAgPSAnbWFwJyxcbiAgICBQaWUgPSAncGllJyxcbiAgICBHYW50dEJhciA9ICdnYW50dC1iYXInLFxuICAgIFBvbHlnb24gPSAncG9seWdvbicsXG4gICAgSGVhdG1hcCA9ICdoZWF0bWFwJyxcbiAgICBWaXpFeHRlbnNpb24gPSAndml6LWV4dGVuc2lvbicsXG4gIH1cblxuICAvKipcbiAgICogQW4gZW51bWVyYXRpb24gZGVzY3JpYmluZyB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIGFsbG93YWJsZSB2YWx1ZXMuXG4gICAqIFRoaXMgaXMgdXNlZCBmb3IgcmVzdHJpY3RpbmcgdGhlIGRvbWFpbiBvZiBhIHBhcmFtZXRlclxuICAgKi9cbiAgZXhwb3J0IGVudW0gUGFyYW1ldGVyVmFsdWVUeXBlIHtcbiAgICBBbGwgPSAnYWxsJyxcbiAgICBMaXN0ID0gJ2xpc3QnLFxuICAgIFJhbmdlID0gJ3JhbmdlJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBEYXRlIHBlcmlvZCB1c2VkIGluIGZpbHRlcnMgYW5kIGluIHBhcmFtZXRlcnMuXG4gICAqL1xuICBleHBvcnQgZW51bSBQZXJpb2RUeXBlIHtcbiAgICBZZWFycyA9ICd5ZWFycycsXG4gICAgUXVhcnRlcnMgPSAncXVhcnRlcnMnLFxuICAgIE1vbnRocyA9ICdtb250aHMnLFxuICAgIFdlZWtzID0gJ3dlZWtzJyxcbiAgICBEYXlzID0gJ2RheXMnLFxuICAgIEhvdXJzID0gJ2hvdXJzJyxcbiAgICBNaW51dGVzID0gJ21pbnV0ZXMnLFxuICAgIFNlY29uZHMgPSAnc2Vjb25kcycsXG4gIH1cblxuICBleHBvcnQgZW51bSBRdWlja1RhYmxlQ2FsY1R5cGUge1xuICAgIFJ1bm5pbmdUb3RhbCA9ICdydW5uaW5nLXRvdGFsJyxcbiAgICBEaWZmZXJlbmNlID0gJ2RpZmZlcmVuY2UnLFxuICAgIFBlcmNlbnREaWZmZXJlbmNlID0gJ3BlcmNlbnQtZGlmZmVyZW5jZScsXG4gICAgUGVyY2VudE9mVG90YWwgPSAncGVyY2VudC1vZi10b3RhbCcsXG4gICAgUmFuayA9ICdyYW5rJyxcbiAgICBQZXJjZW50aWxlID0gJ3BlcmNlbnRpbGUnLFxuICAgIE1vdmluZ0F2ZXJhZ2UgPSAnbW92aW5nLWF2ZXJhZ2UnLFxuICAgIFlURFRvdGFsID0gJ3l0ZC10b3RhbCcsXG4gICAgQ29tcG91bmRHcm93dGhSYXRlID0gJ2NvbXBvdW5kLWdyb3d0aC1yYXRlJyxcbiAgICBZZWFyT3ZlclllYXJHcm93dGggPSAneWVhci1vdmVyLXllYXItZ3Jvd3RoJyxcbiAgICBZVERHcm93dGggPSAneXRkLWdyb3d0aCcsXG4gICAgVW5kZWZpbmVkID0gJ3VuZGVmaW5lZCcsXG4gIH1cblxuICAvKipcbiAgICogRW51bSBmb3Igc3BlY2lmeWluZyB0aGUgc2VsZWN0aW9uIHR5cGUgZm9yIHNlbGVjdCBtYXJrcyBhcGkuXG4gICAqL1xuICBleHBvcnQgZW51bSBTZWxlY3Rpb25VcGRhdGVUeXBlIHtcbiAgICBSZXBsYWNlID0gJ3NlbGVjdC1yZXBsYWNlJyxcbiAgICBBZGQgPSAnc2VsZWN0LWFkZCcsXG4gICAgUmVtb3ZlID0gJ3NlbGVjdC1yZW1vdmUnLFxuICB9XG5cbiAgLyoqXG4gICAqIEVudW0gZm9yIHNwZWNpZnlpbmcgdGhlIHNlbGVjdCBvcHRpb24gZm9yIHRoZSBgZXh0ZW5zaW9ucy5Xb3Jrc2hlZXQuc2VsZWN0VHVwbGVzQXN5bmNgIG1ldGhvZC5cbiAgICovXG4gIGV4cG9ydCBlbnVtIFNlbGVjdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIENsZWFycyBleGlzdGluZyBzZWxlY3Rpb24gYmVmb3JlIHNlbGVjdGluZyB0aGUgdHVwbGVzIHNwZWNpZmllZFxuICAgICAqL1xuICAgIFNpbXBsZSA9ICdzZWxlY3Qtb3B0aW9ucy1zaW1wbGUnLFxuICAgIC8qKlxuICAgICAqIEFkZHMgc3BlY2lmaWVkIHR1cGxlcyB0byB0aGUgZXhpc3Rpbmcgc2VsZWN0aW9uXG4gICAgICovXG4gICAgVG9nZ2xlID0gJ3NlbGVjdC1vcHRpb25zLXRvZ2dsZScsXG4gIH1cblxuICAvKipcbiAgICogVGhlIHR5cGUgb2Ygc2hlZXQgYSBbW1NoZWV0XV0gb2JqZWN0IHJlcHJlc2VudHNcbiAgICovXG4gIGV4cG9ydCBlbnVtIFNoZWV0VHlwZSB7XG4gICAgRGFzaGJvYXJkID0gJ2Rhc2hib2FyZCcsXG4gICAgU3RvcnkgPSAnc3RvcnknLFxuICAgIFdvcmtzaGVldCA9ICd3b3Jrc2hlZXQnLFxuICB9XG5cbiAgZXhwb3J0IGVudW0gU29ydERpcmVjdGlvbiB7XG4gICAgSW5jcmVhc2luZyA9ICdpbmNyZWFzaW5nJyxcbiAgICBEZWNyZWFzaW5nID0gJ2RlY3JlYXNpbmcnLFxuICB9XG5cbiAgZXhwb3J0IGVudW0gVHJlbmRMaW5lTW9kZWxUeXBlIHtcbiAgICBMaW5lYXIgPSAnbGluZWFyJyxcbiAgICBMb2dhcml0aG1pYyA9ICdsb2dhcml0aG1pYycsXG4gICAgRXhwb25lbnRpYWwgPSAnZXhwb25lbnRpYWwnLFxuICAgIFBvbHlub21pYWwgPSAncG9seW5vbWlhbCcsXG4gIH1cblxuICAvKipcbiAgICogRW51bSB0aGF0IHJlcHJlc2VudHMgdGhlIHJlcGxheSBzcGVlZCBvZiBhbiBhbmltYXRpb24uXG4gICAqIEBzaW5jZSAxLjcuMFxuICAgKi9cbiAgZXhwb3J0IGVudW0gUmVwbGF5U3BlZWRUeXBlIHtcbiAgICAvKiogVXNlZCBmb3Igc2V0dGluZyB0aGUgcmVwbGF5IHNwZWVkIG9mIGFuIGFuaW1hdGlvbiB0byAwLjV4LiovXG4gICAgU2xvdyA9ICdzbG93JyxcblxuICAgIC8qKiBVc2VkIGZvciBzZXR0aW5nIHRoZSByZXBsYXkgc3BlZWQgb2YgYW4gYW5pbWF0aW9uIHRvIDEuMHguKi9cbiAgICBOb3JtYWwgPSAnbm9ybWFsJyxcblxuICAgIC8qKiBVc2VkIGZvciBzZXR0aW5nIHRoZSByZXBsYXkgc3BlZWQgb2YgYW4gYW5pbWF0aW9uIHRvIDIuMHguKi9cbiAgICBGYXN0ID0gJ2Zhc3QnLFxuICB9XG5cbiAgLyoqXG4gICAqIEVudW0gdGhhdCByZXByZXNlbnRzIHRoZSBzZWxlY3Rpb24gc3RhdGUgb2YgYSBsZXZlbCBpbiBhIGhpZXJhcmNoaWNhbCBmaWx0ZXJcbiAgICogQHNpbmNlIEV4dGVuc2lvbnMgMS4xMC4wXG4gICAqL1xuICBleHBvcnQgZW51bSBIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlIHtcbiAgICBBbGxTZWxlY3RlZCA9ICdhbGwtc2VsZWN0ZWQnLFxuICAgIE5vbmVTZWxlY3RlZCA9ICdub25lLXNlbGVjdGVkJyxcbiAgICBTb21lU2VsZWN0ZWQgPSAnc29tZS1zZWxlY3RlZCcsXG4gICAgVW5rbm93blNlbGVjdGVkID0gJ3Vua25vd24tc2VsZWN0ZWQnLFxuICB9XG5cbiAgLyoqXG4gICAqIFpvbmVWaXNpYmlsaXR5VHlwZVxuICAgKiBAZGVwcmVjYXRlZCB1c2UgRGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eVR5cGVcbiAgICovXG4gIGV4cG9ydCBkZWNsYXJlIHR5cGUgWm9uZVZpc2liaWxpdHlUeXBlID0gRGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eVR5cGU7XG4gIGV4cG9ydCBjb25zdCBab25lVmlzaWJpbGl0eVR5cGUgPSB7IC4uLkRhc2hib2FyZE9iamVjdFZpc2liaWxpdHlUeXBlIH07XG59XG5leHBvcnQgPSBUYWJsZWF1O1xuIiwiLy8gVGhpcyBmaWxlIHJlLWV4cG9ydHMgZXZlcnl0aGluZyB3aGljaCBpcyBwYXJ0IG9mIHRoZSBzaGFyZWQgYXBpIHB1YmxpYyBpbnRlcmZhY2VcblxuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9Bbm5vdGF0aW9uSW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvU2hhcmVkL0RhdGFTb3VyY2VJbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvRGF0YVRhYmxlSW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvU2hhcmVkL0VudW1zJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvRW52aXJvbm1lbnRJbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvRmlsdGVySW50ZXJmYWNlcyc7XG5leHBvcnQge1xuICBBbmFseXRpY3NPYmplY3RUeXBlLFxuICBBbm5vdGF0aW9uVHlwZSxcbiAgQ2xhc3NOYW1lS2V5LFxuICBDb2x1bW5UeXBlLFxuICBEYXNoYm9hcmRMYXlvdXRDaGFuZ2UsXG4gIERhc2hib2FyZE9iamVjdFR5cGUsXG4gIERhc2hib2FyZE9iamVjdFZpc2liaWxpdHlUeXBlLFxuICBEYXRhVHlwZSxcbiAgRGF0ZVJhbmdlVHlwZSxcbiAgRGlhbG9nU3R5bGUsXG4gIEVuY29kaW5nVHlwZSxcbiAgRmllbGRBZ2dyZWdhdGlvblR5cGUsXG4gIEZpZWxkUm9sZVR5cGUsXG4gIEZpbHRlckRvbWFpblR5cGUsXG4gIEZpbHRlck51bGxPcHRpb24sXG4gIEZpbHRlclR5cGUsXG4gIEZpbHRlclVwZGF0ZVR5cGUsXG4gIEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUsXG4gIEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICBNYXJrVHlwZSxcbiAgUGFyYW1ldGVyVmFsdWVUeXBlLFxuICBQZXJpb2RUeXBlLFxuICBRdWlja1RhYmxlQ2FsY1R5cGUsXG4gIFJlcGxheVNwZWVkVHlwZSxcbiAgU2VsZWN0T3B0aW9ucyxcbiAgU2VsZWN0aW9uVXBkYXRlVHlwZSxcbiAgU2hlZXRUeXBlLFxuICBTb3J0RGlyZWN0aW9uLFxuICBUcmVuZExpbmVNb2RlbFR5cGUsXG4gIFpvbmVWaXNpYmlsaXR5VHlwZSxcbn0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9OYW1lc3BhY2VzL1RhYmxlYXUnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9TZWxlY3Rpb25JbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvU2hlZXRJbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvVmlzdWFsTW9kZWxJbnRlcmZhY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9Xb3JrYm9va0Zvcm1hdHRpbmdJbnRlcmZhY2VzJztcbiIsIi8qKlxuICogVGhpcyBpcyB5b3VyIG1haW4uIFRoaXMgaXMgd2hlcmUgeW91IHJlLWV4cG9ydCBldmVyeXRoaW5nIHlvdSB3YW50IHRvIGJlIHB1YmxpY2x5IGF2YWlsYWJsZS5cbiAqXG4gKiBUaGUgYnVpbGQgZW5mb3JjZXMgdGhhdCB0aGUgZmlsZSBoYXMgdGhlIHNhbWUgbmFtZSBhcyB0aGUgZ2xvYmFsIHZhcmlhYmxlIHRoYXQgaXMgZXhwb3J0ZWQuXG4gKi9cblxuLy8gVGhlIGZvbGxvd2luZyBwb2x5ZmlsbHMgYXJlIG5lZWRlZCBmb3IgSUUxMVxuaW1wb3J0ICdjb3JlLWpzL2VzL251bWJlci9pcy1pbnRlZ2VyJztcbmltcG9ydCAnY29yZS1qcy9lcy9udW1iZXIvaXMtbmFuJztcbmltcG9ydCAnY29yZS1qcy9lcy9vYmplY3QvYXNzaWduJztcbi8vIEV4cG9ydCB0aGUgdmVyc2lvbiBvZiB0aGUgaW50ZXJuYWwgY29udHJhY3QgdG8gYmUgYXZhaWxhYmxlIGF0IHJ1bnRpbWVcbi8vICBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IHlhcm4gcHVibGlzaDpidW1wIHZpYSBzY3JpcHRzL3B1Ymxpc2gtY2hlY2sudHNcbi8vICB1cGRhdGVJbnRlcm5hbENvbnRyYWN0UnVudGltZVZlcnNpb24gaW4gdGhlIG1vbm9yZXBvIHJvb3QuXG5pbXBvcnQgKiBhcyBpbnRlcm5hbENvbnRyYWN0VmVyc2lvbiBmcm9tICcuLi9pbnRlcm5hbC1jb250cmFjdC12ZXJzaW9uLmpzb24nO1xuZXhwb3J0IGNvbnN0IElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT04gPSBpbnRlcm5hbENvbnRyYWN0VmVyc2lvbjtcblxuZXhwb3J0ICogZnJvbSAnLi9jb250cmFjdC9EYXRhVHlwZUNvbnZlcnRlcic7XG5leHBvcnQgKiBmcm9tICcuL2NvbnRyYWN0L0VudW1zJztcbmV4cG9ydCAqIGZyb20gJy4vY29udHJhY3QvTW9kZWxzJztcbmV4cG9ydCAqIGZyb20gJy4vY29udHJhY3QvTm90aWZpY2F0aW9ucyc7XG5leHBvcnQgKiBmcm9tICcuL2NvbnRyYWN0L1BhcmFtZXRlcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb250cmFjdC9WZXJicyc7XG5leHBvcnQgKiBmcm9tICcuL2ludGVyZmFjZS9Bc2tEYXRhSW50ZXJmYWNlJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJmYWNlL0luaXRpYWxpemF0aW9uT3B0aW9ucyc7XG5leHBvcnQgKiBmcm9tICcuL2ludGVyZmFjZS9JbnRlcm5hbEFwaURpc3BhdGNoZXInO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcmZhY2UvUHVsc2VJbnRlcmZhY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcmZhY2UvVmVyc2lvbk51bWJlcic7XG5leHBvcnQgKiBmcm9tICcuL2ludGVyZmFjZS9WcWxJbnRlcmZhY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9tZXNzYWdpbmcvQ3Jvc3NGcmFtZU1lc3Nlbmdlcic7XG5leHBvcnQgKiBmcm9tICcuL21lc3NhZ2luZy9pbnRlcmZhY2UvTWVzc2FnZURpc3BhdGNoZXInO1xuZXhwb3J0ICogZnJvbSAnLi9tZXNzYWdpbmcvaW50ZXJmYWNlL01lc3NhZ2VMaXN0ZW5lcic7XG5leHBvcnQgKiBmcm9tICcuL21lc3NhZ2luZy9pbnRlcmZhY2UvTWVzc2FnZVR5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vbWVzc2FnaW5nL2ludGVyZmFjZS9NZXNzZW5nZXInO1xuZXhwb3J0ICogZnJvbSAnLi9tZXNzYWdpbmcvaW50ZXJmYWNlL1ByZXBhcmVkTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL3ZlcnNpb25pbmcvSW50ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXInO1xuZXhwb3J0ICogZnJvbSAnLi92ZXJzaW9uaW5nL1ZlcnNpb25Db252ZXJ0ZXJGYWN0b3J5JztcbmV4cG9ydCAqIGZyb20gJy4vdmVyc2lvbmluZy9leHRlcm5hbC9FeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcic7XG5leHBvcnQgKiBmcm9tICcuL3ZlcnNpb25pbmcvZXh0ZXJuYWwvRXh0ZXJuYWxJZGVudGl0eVZlcnNpb25Db252ZXJ0ZXInO1xuZXhwb3J0ICogZnJvbSAnLi92ZXJzaW9uaW5nL2V4dGVybmFsL0V4dGVybmFsVmVyc2lvbkNvbnZlcnRlckZhY3RvcnknO1xuXG4vLyBFeHBvcnQgdGhlIHZlcnNpb24gbnVtYmVyIG9mIG1lc3NhZ2luZyBmb3IgY29uc3VtZXJzIHRvIHVzZS5cbi8vIEJlIHZlcnkgY2FyZWZ1bCBtYWtpbmcgYW55IHVwZGF0ZXMgdG8gdGhpcyBjb250cmFjdCB3aGljaCBicmVhayB2ZXJzaW9uIGNvbXBhdGliaWxpdHkuXG5leHBvcnQgY29uc3QgTUVTU0FHSU5HX1ZFUlNJT04gPSB7XG4gIG1ham9yOiAxLFxuICBtaW5vcjogMCxcbiAgZml4OiAwLFxufTtcbiIsImltcG9ydCB7IERhdGFUeXBlIH0gZnJvbSAnLi9FbnVtcyc7XG5cbmV4cG9ydCBjbGFzcyBEYXRhVHlwZUNvbnZlcnRlciB7XG4gIHByaXZhdGUgc3RhdGljIGlzU3BlY2lhbCh2YWx1ZUFzU3RyaW5nOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAvLyBQcmlvciB0byBTaG93RGF0YVRhYmxlUHJlc01vZGVsLCBzcGVjaWFsIHZhbHVlcyBjb21lIHRvIHVzIGFzXG4gICAgLy8gJyVudWxsJScsICclYWxsJScsICcld2lsZGNhcmQlJywgJyVtaXNzaW5nJScuLi5cbiAgICAvLyBXaGlsZSB0aGlzIGZ1bmN0aW9uIHdpbGwgbmV2ZXIgcmV0dXJuIHRydWUgZm9yIFNob3dEYXRhVGFibGVQcmVzTW9kZWwgY29udmVyc2lvbixcbiAgICAvLyBpdCBpcyBhcyBjaGVhcCBhcyBwYXNzaW5nIGFyb3VuZCBhIHZlcnNpb24gYW5kIGNoZWNraW5nIHRoYXQuXG4gICAgLy8gKFNlZSBEYXRhVmFsdWVGb3JtYXR0ZXIuY3BwKVxuXG4gICAgaWYgKHZhbHVlQXNTdHJpbmcubGVuZ3RoID4gMiAmJiB2YWx1ZUFzU3RyaW5nWzBdID09PSAnJScgJiYgdmFsdWVBc1N0cmluZ1t2YWx1ZUFzU3RyaW5nLmxlbmd0aCAtIDFdID09PSAnJScpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBzcGVjaWFsVmFsdWVJbmRpY2F0b3IgPSAnJW51bGwlJztcblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gIHByaXZhdGUgc3RhdGljIHBhcnNlQm9vbGVhbihib29sZWFuU3RyaW5nOiBzdHJpbmcpOiBib29sZWFuIHwgc3RyaW5nIHtcbiAgICAvLyBib29sZWFuIHZhbHVlcyBjb21lIHRvIHVzIGFzICd0cnVlJ3wnZmFsc2UnXG4gICAgY29uc3Qgbm9ybWFsaXplZEJvb2xlYW46IHN0cmluZyA9IGJvb2xlYW5TdHJpbmcudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gbm9ybWFsaXplZEJvb2xlYW4gIT09ICd0cnVlJyAmJiBub3JtYWxpemVkQm9vbGVhbiAhPT0gJ2ZhbHNlJyA/IHRoaXMuc3BlY2lhbFZhbHVlSW5kaWNhdG9yIDogbm9ybWFsaXplZEJvb2xlYW4gPT09ICd0cnVlJztcbiAgfVxuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgcHJpdmF0ZSBzdGF0aWMgcGFyc2VOdW1iZXIodmFsdWVBc1N0cmluZzogc3RyaW5nKTogbnVtYmVyIHwgc3RyaW5nIHtcbiAgICBjb25zdCB2YWx1ZSA9IE51bWJlcih2YWx1ZUFzU3RyaW5nKTtcbiAgICByZXR1cm4gaXNOYU4odmFsdWUpID8gdGhpcy5zcGVjaWFsVmFsdWVJbmRpY2F0b3IgOiB2YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHBhcnNlRGF0ZShkYXRlQXNTdHJpbmc6IHN0cmluZyk6IERhdGUgfCBudWxsIHtcbiAgICAvLyBOb3RlIHRoYXQgd2l0aG91dCBhIHRpbWUsIHRoZSBkYXRlIGlzIGFzc3VtZWQgdG8gYmUgVVRDXG4gICAgLy8gSW5wdXQgb2YgMjAyMC0wMy0yNSBpcyBwcmludGVkIGFzOiBNYXIgMjQgMjAyMCAxNzowMDowMCBHTVQtMDcwMFxuICAgIC8vIFRoaXMgbWF0Y2hlcyBzdHlsZSB1c2VkIGluIGV4aXN0aW5nIGNvbnZlcnRGaWx0ZXJWYWx1ZVByZXNNb2RlbFxuICAgIGNvbnN0IHZhbHVlID0gbmV3IERhdGUoZGF0ZUFzU3RyaW5nKTtcbiAgICByZXR1cm4gTnVtYmVyLmlzTmFOKHZhbHVlLmdldFRpbWUoKSkgPyBudWxsIDogdmFsdWU7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBwYXJzZURhdGVUaW1lKGRhdGVBc1N0cmluZzogc3RyaW5nKTogRGF0ZSB8IG51bGwge1xuICAgIC8vIFdpdGggYSB0aW1lLCB0aGUgZGF0ZSBpcyBhc3N1bWVkIHRvIGJlIFVUQy5cbiAgICAvLyBPdXIgZGF0ZSBmb3JtYXQgaXMgYWx3YXlzOiB5eXl5LW1tLWRkIGhoOm1tOnNzXG4gICAgLy8gVW5mb3J0dW5hdGVseSwgSUUxMSBjYW4ndCBwYXJzZSB0aGF0IGZvcm1hdCBzbyB3ZSBhZGQgYSBUIGJldHdlZW4gdGhlIGRheSBhbmQgdGltZS5cbiAgICAvLyBXZSBhbHNvIGFkZCBhIFogc28gdGhhdCBpdCBpcyBVVEMuIChXaXRob3V0IHRoZSBaLCBzb21lIGJyb3dzZXJzIGFzc3VtZSBsb2NhbCwgYW5kIG90aGVycyBVVEMpXG4gICAgY29uc3QgZm9ybWF0dGVkRGF0ZVN0cmluZzogc3RyaW5nID0gZGF0ZUFzU3RyaW5nLnJlcGxhY2UoJyAnLCAnVCcpLmNvbmNhdCgnWicpO1xuICAgIGNvbnN0IHZhbHVlID0gbmV3IERhdGUoZm9ybWF0dGVkRGF0ZVN0cmluZyk7XG4gICAgcmV0dXJuIE51bWJlci5pc05hTih2YWx1ZS5nZXRUaW1lKCkpID8gbnVsbCA6IHZhbHVlO1xuICB9XG5cbiAgLy8gSXQgd291bGQgYmUgbmljZSB0byBtZXJnZSB0aGlzIGFuZCB0aGUgbWV0aG9kIEZpbHRlckNvbnZlcnRlcjo6Y29udmVydEZpbHRlclZhbHVlUHJlc01vZGVsIGluIGFwaS1wbGF0Zm9ybS1qc1xuICBwdWJsaWMgc3RhdGljIGNvbnZlcnRWYWx1ZUFzU3RyaW5nVG9WYWx1ZSh2YWx1ZUFzU3RyaW5nOiBzdHJpbmcsIHR5cGU6IERhdGFUeXBlKTogYm9vbGVhbiB8IG51bWJlciB8IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgLy8gVGhpcyBpcyBib3RoIERhdGFEaWN0aW9uYXJ5IGFuZCBTaG93RGF0YVRhYmxlUHJlc01vZGVsIGNvbXBhdGlibGUuXG4gICAgLy8gSW4gdGhlIERhdGFEaWN0aW9uYXJ5LCB2YWx1ZUFzU3RyaW5nIGNhbiBiZSAnJW51bGwlJyBvciAnJW1pc3NpbmclJywgd2hpbGUgaW5cbiAgICAvLyBTaG93RGF0YVRhYmxlUHJlc01vZGVsLCB3ZSBjYW4gZ2V0ICdudWxsJyBvciAnbWlzc2luZycsIG9yICclbnVsbCUnIGZvciBzdHJpbmcgc3BlY2lhbCB2YWx1ZXMuXG4gICAgLy8gRm9yIGVpdGhlciBvZiB0aGVzZSBjYXNlcywgd2UgcmV0dXJuIHNwZWNpYWxWYWx1ZUluZGljYXRvciAob3IgdGhlIG9yaWdpbmFsIHNwZWNpYWwgc3RyaW5nKS5cbiAgICAvLyBUbyBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbHR5LCB0aGlzIGNvbnZlcnRlcjpcbiAgICAvLyAxLiByZXR1cm5zIGEgc3RyaW5nIGZvciBhbnkgc3BlY2lhbCB2YWx1ZXNcbiAgICAvLyAyLiByZXR1cm5zIGEgc3RyaW5nIGZvciBhbnkgZGF0ZVxuXG4gICAgLy8gUGFyYW1ldGVyIG1pbi9tYXggdmFsdWVzIGNhbiBiZSB1bmRlZmluZWQsIHNvIHJlc3VsdCBpcyBhbHNvIHVuZGVmaW5lZFxuICAgIGlmICh2YWx1ZUFzU3RyaW5nID09PSB1bmRlZmluZWQgfHwgdmFsdWVBc1N0cmluZyA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc1NwZWNpYWwodmFsdWVBc1N0cmluZykpIHtcbiAgICAgIHJldHVybiB2YWx1ZUFzU3RyaW5nO1xuICAgIH1cblxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBEYXRhVHlwZS5Cb29sOlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUJvb2xlYW4odmFsdWVBc1N0cmluZyk7XG5cbiAgICAgIGNhc2UgRGF0YVR5cGUuSW50OlxuICAgICAgY2FzZSBEYXRhVHlwZS5GbG9hdDpcbiAgICAgICAgLy8gUmV0dXJuIHNwZWNpYWwgdmFsdWUgJyVudWxsJScgZm9yIGFueSBmYWlsdXJlIGluIHBhcnNpbmcuXG4gICAgICAgIC8vIFdlIG5lZWQgdG8gZG8gdGhhdCBiZWNhdXNlIFNob3dEYXRhVGFibGVQcmVzTW9kZWwgd2lsbCBnaXZlIHVzIHN0cmluZ3MgbGlrZSAnbnVsbCdcbiAgICAgICAgLy8gZm9yIHNwZWNpYWwgdmFsdWVzLlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZU51bWJlcih2YWx1ZUFzU3RyaW5nKTtcblxuICAgICAgY2FzZSBEYXRhVHlwZS5EYXRlOlxuICAgICAgICAvLyBGb3IgU2hvd0RhdGFUYWJsZVByZXNNb2RlbCwgc3BlY2lhbCB2YWx1ZXMgd2lsbCBiZSBcIm51bGxcIiB3aGljaCB3aWxsIGZhaWwgdG8gcGFyc2UuXG4gICAgICAgIC8vIEluIHRoYXQgY2FzZSwgd2UgcmV0dXJuICclbnVsbCUnLlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZURhdGUodmFsdWVBc1N0cmluZykgPT09IG51bGwgPyB0aGlzLnNwZWNpYWxWYWx1ZUluZGljYXRvciA6IHZhbHVlQXNTdHJpbmc7XG5cbiAgICAgIGNhc2UgRGF0YVR5cGUuRGF0ZVRpbWU6XG4gICAgICAgIC8vIEZvciBTaG93RGF0YVRhYmxlUHJlc01vZGVsLCBzcGVjaWFsIHZhbHVlcyB3aWxsIGJlIFwibnVsbFwiIHdoaWNoIHdpbGwgZmFpbCB0byBwYXJzZS5cbiAgICAgICAgLy8gSW4gdGhhdCBjYXNlLCB3ZSByZXR1cm4gJyVudWxsJSdcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VEYXRlVGltZSh2YWx1ZUFzU3RyaW5nKSA9PT0gbnVsbCA/IHRoaXMuc3BlY2lhbFZhbHVlSW5kaWNhdG9yIDogdmFsdWVBc1N0cmluZztcblxuICAgICAgY2FzZSBEYXRhVHlwZS5TcGF0aWFsOlxuICAgICAgY2FzZSBEYXRhVHlwZS5TdHJpbmc6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdmFsdWVBc1N0cmluZztcbiAgICB9XG4gIH1cblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gIHB1YmxpYyBzdGF0aWMgY29udmVydFZhbHVlVG9OYXRpdmVWYWx1ZSh2YWx1ZTogYW55LCB0eXBlOiBEYXRhVHlwZSk6IGJvb2xlYW4gfCBudW1iZXIgfCBEYXRlIHwgc3RyaW5nIHwgbnVsbCB7XG4gICAgLy8gVGhpcyBjb252ZXJ0cyBmcm9tIG91ciAxLjIgQVBJIHRoYXQgcmV0dXJucyBzdHJpbmdzIGZvciBzcGVjaWFscywgYW5kIGRhdGVzIGFzIHN0cmluZ3MuXG4gICAgLy8gSXQgdGFrZXMgdGhlIHNwZWNpYWwgY2FzZSBvZiAnJW51bGwlJyBhbmQgcmV0dXJucyBhIG51bGwuXG4gICAgLy8gRm9yIGRhdGVzLCBpdCByZXR1cm5zIGEgRGF0ZSBvYmplY3QgcmF0aGVyIHRoYW4gYSBzdHJpbmcuXG4gICAgLy8gY29udmVydFZhbHVlVG9OYXRpdmVWYWx1ZSBzaG91bGQgYmUgdXNlZCB0byBidWlsZCBhIERhdGFWYWx1ZS5uYXRpdmVWYWx1ZSBmaWVsZC5cblxuICAgIC8vIFBhcmFtZXRlciBtaW4vbWF4IGNhbiBiZSB1bmRlZmluZWQuIElmIHRoYXQgaXMgdGhlIGNhc2UsIG5hdGl2ZVZhbHVlIGlzIHRyZWF0ZWQgbGlrZSBhIHNwZWNpYWxcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIERhdGFUeXBlLkJvb2w6XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gbnVsbCA6IHZhbHVlO1xuXG4gICAgICBjYXNlIERhdGFUeXBlLkludDpcbiAgICAgIGNhc2UgRGF0YVR5cGUuRmxvYXQ6XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gbnVsbCA6IHZhbHVlO1xuXG4gICAgICBjYXNlIERhdGFUeXBlLkRhdGU6XG4gICAgICAgIC8vIENvbnZlcnQgdGhlIHN0cmluZyB0byBEYXRlIG9iamVjdCAob3IgbnVsbCBpZiBwYXJzaW5nIGZhaWxzIC4uLiB3ZSBhc3N1bWUgc3BlY2lhbClcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VEYXRlKHZhbHVlKTtcblxuICAgICAgY2FzZSBEYXRhVHlwZS5EYXRlVGltZTpcbiAgICAgICAgLy8gQ29udmVydCB0aGUgc3RyaW5nIHRvIERhdGUgb2JqZWN0IChvciBudWxsIGlmIHBhcnNpbmcgZmFpbHMgLi4uIHdlIGFzc3VtZSBzcGVjaWFsKVxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZURhdGVUaW1lKHZhbHVlKTtcblxuICAgICAgY2FzZSBEYXRhVHlwZS5TdHJpbmc6XG4gICAgICAgIHJldHVybiB0aGlzLmlzU3BlY2lhbCh2YWx1ZSkgPyBudWxsIDogdmFsdWU7XG5cbiAgICAgIGNhc2UgRGF0YVR5cGUuU3BhdGlhbDpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gIHB1YmxpYyBzdGF0aWMgY29udmVydFN0cmluZ1ZhbHVlVG9OYXRpdmVWYWx1ZSh2YWx1ZTogc3RyaW5nLCB0eXBlOiBEYXRhVHlwZSk6IGJvb2xlYW4gfCBudW1iZXIgfCBEYXRlIHwgc3RyaW5nIHwgbnVsbCB7XG4gICAgLy8gVGhpcyBoYW5kbGVzIHRoZSBjb252ZXJzaW9uIGZyb20gc3RyaW5nIGRpcmVjdGx5IHRvIG5hdGl2ZSB2YWx1ZSBmb3IgYWxsIHR5cGVzXG4gICAgcmV0dXJuIHRoaXMuY29udmVydFZhbHVlVG9OYXRpdmVWYWx1ZSh0aGlzLmNvbnZlcnRWYWx1ZUFzU3RyaW5nVG9WYWx1ZSh2YWx1ZSwgdHlwZSksIHR5cGUpO1xuICB9XG59XG4iLCJleHBvcnQgZW51bSBFeHRlbnNpb25Db250ZXh0IHtcbiAgRGVza3RvcCA9ICdkZXNrdG9wJyxcbiAgU2VydmVyID0gJ3NlcnZlcicsXG4gIFVua25vd24gPSAndW5rbm93bicsXG59XG5cbmV4cG9ydCBlbnVtIEV4dGVuc2lvbk1vZGUge1xuICBBdXRob3JpbmcgPSAnYXV0aG9yaW5nJyxcbiAgVmlld2luZyA9ICd2aWV3aW5nJyxcbiAgVW5rbm93biA9ICd1bmtub3duJyxcbn1cblxuZXhwb3J0IGVudW0gQW5ub3RhdGVFbnVtIHtcbiAgTWFyayA9ICdtYXJrJyxcbiAgUG9pbnQgPSAncG9pbnQnLFxuICBBcmVhID0gJ2FyZWEnLFxufVxuXG5leHBvcnQgZW51bSBDb2x1bW5UeXBlIHtcbiAgRGlzY3JldGUgPSAnZGlzY3JldGUnLFxuICBDb250aW51b3VzID0gJ2NvbnRpbnVvdXMnLFxuICBVbmtub3duID0gJ3Vua25vd24nLFxufVxuXG5leHBvcnQgZW51bSBEYXNoYm9hcmRPYmplY3RUeXBlIHtcbiAgQmxhbmsgPSAnYmxhbmsnLFxuICBXb3Jrc2hlZXQgPSAnd29ya3NoZWV0JyxcbiAgUXVpY2tGaWx0ZXIgPSAncXVpY2stZmlsdGVyJyxcbiAgUGFyYW1ldGVyQ29udHJvbCA9ICdwYXJhbWV0ZXItY29udHJvbCcsXG4gIFBhZ2VGaWx0ZXIgPSAncGFnZS1maWx0ZXInLFxuICBMZWdlbmQgPSAnbGVnZW5kJyxcbiAgVGl0bGUgPSAndGl0bGUnLFxuICBUZXh0ID0gJ3RleHQnLFxuICBJbWFnZSA9ICdpbWFnZScsXG4gIFdlYlBhZ2UgPSAnd2ViLXBhZ2UnLFxuICBFeHRlbnNpb24gPSAnZXh0ZW5zaW9uJyxcbn1cblxuZXhwb3J0IGVudW0gRGF0YVR5cGUge1xuICBTdHJpbmcgPSAnc3RyaW5nJyxcbiAgSW50ID0gJ2ludCcsXG4gIEZsb2F0ID0gJ2Zsb2F0JyxcbiAgQm9vbCA9ICdib29sJyxcbiAgRGF0ZSA9ICdkYXRlJyxcbiAgRGF0ZVRpbWUgPSAnZGF0ZS10aW1lJyxcbiAgU3BhdGlhbCA9ICdzcGF0aWFsJyxcbiAgVW5rbm93biA9ICd1bmtub3duJyxcbn1cblxuZXhwb3J0IGVudW0gRGlhbG9nU3R5bGUge1xuICBXaW5kb3cgPSAnd2luZG93JyxcbiAgTW9kYWwgPSAnbW9kYWwnLFxuICBNb2RlbGVzcyA9ICdtb2RlbGVzcycsXG59XG5cbmV4cG9ydCBlbnVtIEVuY29kZWREYXRhVHlwZSB7XG4gIE51bWJlciA9ICdudW1iZXInLFxuICBTdHJpbmcgPSAnc3RyaW5nJyxcbiAgRGF0ZSA9ICdkYXRlJyxcbiAgQm9vbGVhbiA9ICdib29sZWFuJyxcbn1cblxuZXhwb3J0IGVudW0gRXJyb3JDb2RlcyB7XG4gIElOSVRJQUxJWkFUSU9OX0VSUk9SID0gJ2luaXRpYWxpemF0aW9uLWVycm9yJyxcbiAgSU5URVJOQUxfRVJST1IgPSAnaW50ZXJuYWwtZXJyb3InLFxuICBNSVNTSU5HX0VOVU1fTUFQUElORyA9ICdtaXNzaW5nLWVudW0tbWFwcGluZycsXG4gIE1JU1NJTkdfUEFSQU1FVEVSID0gJ21pc3NpbmctcGFyYW1ldGVyJyxcbiAgUEVSTUlTU0lPTl9ERU5JRUQgPSAncGVybWlzc2lvbi1kZW5pZWQnLFxuICBQUkVTX01PREVMX1BBUlNJTkdfRVJST1IgPSAncHJlcy1tb2RlbC1wYXJzaW5nLWVycm9yJyxcbiAgVkVSU0lPTl9OT1RfQ09ORklHVVJFRCA9ICd2ZXJzaW9uLW5vdC1jb25maWd1cmVkJyxcbiAgVklTSUJJTElUWV9FUlJPUiA9ICd2aXNpYmlsaXR5LWVycm9yJyxcbiAgVU5LTk9XTl9WRVJCX0lEID0gJ3Vua25vd24tdmVyYi1pZCcsXG59XG5cbmV4cG9ydCBlbnVtIEZpZWxkQWdncmVnYXRpb25UeXBlIHtcbiAgU3VtID0gJ3N1bScsXG4gIEF2ZyA9ICdhdmcnLFxuICBNaW4gPSAnbWluJyxcbiAgTWF4ID0gJ21heCcsXG4gIFN0ZGV2ID0gJ3N0ZGV2JyxcbiAgU3RkZXZwID0gJ3N0ZGV2cCcsXG4gIFZhciA9ICd2YXInLFxuICBWYXJwID0gJ3ZhcnAnLFxuICBDb2xsZWN0ID0gJ2NvbGxlY3QnLFxuICBDb3VudCA9ICdjb3VudCcsXG4gIENvdW50ZCA9ICdjb3VudGQnLFxuICBNZWRpYW4gPSAnbWVkaWFuJyxcbiAgQXR0ciA9ICdhdHRyJyxcbiAgTm9uZSA9ICdub25lJyxcbiAgWWVhciA9ICd5ZWFyJyxcbiAgUXRyID0gJ3F0cicsXG4gIE1vbnRoID0gJ21vbnRoJyxcbiAgRGF5ID0gJ2RheScsXG4gIEhvdXIgPSAnaG91cicsXG4gIE1pbnV0ZSA9ICdtaW51dGUnLFxuICBTZWNvbmQgPSAnc2Vjb25kJyxcbiAgV2VlayA9ICd3ZWVrJyxcbiAgV2Vla2RheSA9ICd3ZWVrZGF5JyxcbiAgTW9udGhZZWFyID0gJ21vbnRoLXllYXInLFxuICBNZHkgPSAnbWR5JyxcbiAgRW5kID0gJ2VuZCcsXG4gIFRydW5jWWVhciA9ICd0cnVuYy15ZWFyJyxcbiAgVHJ1bmNRdHIgPSAndHJ1bmMtcXRyJyxcbiAgVHJ1bmNNb250aCA9ICd0cnVuYy1tb250aCcsXG4gIFRydW5jV2VlayA9ICd0cnVuYy13ZWVrJyxcbiAgVHJ1bmNEYXkgPSAndHJ1bmMtZGF5JyxcbiAgVHJ1bmNIb3VyID0gJ3RydW5jLWhvdXInLFxuICBUcnVuY01pbnV0ZSA9ICd0cnVuYy1taW51dGUnLFxuICBUcnVuY1NlY29uZCA9ICd0cnVuYy1zZWNvbmQnLFxuICBRdWFydDEgPSAncXVhcnQxJyxcbiAgUXVhcnQzID0gJ3F1YXJ0MycsXG4gIFNrZXduZXNzID0gJ3NrZXduZXNzJyxcbiAgS3VydG9zaXMgPSAna3VydG9zaXMnLFxuICBJbk91dCA9ICdpbi1vdXQnLFxuICBVc2VyID0gJ3VzZXInLFxufVxuXG5leHBvcnQgZW51bSBGaWVsZFJvbGVUeXBlIHtcbiAgRGltZW5zaW9uID0gJ2RpbWVuc2lvbicsXG4gIE1lYXN1cmUgPSAnbWVhc3VyZScsXG4gIFVua25vd24gPSAndW5rbm93bicsXG59XG5cbi8qKlxuICogIFRoZSBkaWZmZXJlbnQgdXBkYXRlIHR5cGVzIGZvciBhcHBseWluZyBmaWx0ZXIuXG4gKi9cbmV4cG9ydCBlbnVtIEZpbHRlclVwZGF0ZVR5cGUge1xuICBBZGQgPSAnYWRkJyxcbiAgQWxsID0gJ2FsbCcsXG4gIFJlcGxhY2UgPSAncmVwbGFjZScsXG4gIFJlbW92ZSA9ICdyZW1vdmUnLFxufVxuXG5leHBvcnQgZW51bSBTaGVldFR5cGUge1xuICBEYXNoYm9hcmQgPSAnZGFzaGJvYXJkJyxcbiAgU3RvcnkgPSAnc3RvcnknLFxuICBXb3Jrc2hlZXQgPSAnd29ya3NoZWV0Jyxcbn1cblxuZXhwb3J0IGVudW0gRG9tYWluUmVzdHJpY3Rpb25UeXBlIHtcbiAgQWxsID0gJ2FsbCcsXG4gIExpc3QgPSAnbGlzdCcsXG4gIFJhbmdlID0gJ3JhbmdlJyxcbn1cblxuZXhwb3J0IGVudW0gRGF0ZVN0ZXBQZXJpb2Qge1xuICBZZWFycyA9ICd5ZWFycycsXG4gIFF1YXJ0ZXJzID0gJ3F1YXJ0ZXJzJyxcbiAgTW9udGhzID0gJ21vbnRocycsXG4gIFdlZWtzID0gJ3dlZWtzJyxcbiAgRGF5cyA9ICdkYXlzJyxcbiAgSG91cnMgPSAnaG91cnMnLFxuICBNaW51dGVzID0gJ21pbnV0ZXMnLFxuICBTZWNvbmRzID0gJ3NlY29uZHMnLFxufVxuXG4vKipcbiAqIFRoZSBvcHRpb24gZm9yIHNwZWNpZnlpbmcgd2hpY2ggdmFsdWVzIHRvIGluY2x1ZGUgZm9yIGZpbHRlcmluZy5cbiAqL1xuZXhwb3J0IGVudW0gRmlsdGVyTnVsbE9wdGlvbiB7XG4gIE51bGxWYWx1ZXMgPSAnbnVsbHZhbHVlcycsXG4gIE5vbk51bGxWYWx1ZXMgPSAnbm9ubnVsbHZhbHVlcycsXG4gIEFsbFZhbHVlcyA9ICdhbGx2YWx1ZXMnLFxufVxuXG4vKipcbiAqIFRoZSB0eXBlIG9mIGZpbHRlciBkb21haW5cbiAqL1xuZXhwb3J0IGVudW0gRmlsdGVyRG9tYWluVHlwZSB7XG4gIFJlbGV2YW50ID0gJ3JlbGV2YW50JyxcbiAgRGF0YWJhc2UgPSAnZGF0YWJhc2UnLFxufVxuXG4vKipcbiAqIEludGVybmFsIGVudW0gZm9yIHNwZWNpZnlpbmcgdGhlIHNlbGVjdGlvbiB0eXBlIGZvciBzZWxlY3QgbWFya3MgYXBpLlxuICovXG5leHBvcnQgZW51bSBTZWxlY3Rpb25VcGRhdGVUeXBlIHtcbiAgUmVwbGFjZSA9ICdzZWxlY3QtcmVwbGFjZScsXG4gIEFkZCA9ICdzZWxlY3QtYWRkJyxcbiAgUmVtb3ZlID0gJ3NlbGVjdC1yZW1vdmUnLFxufVxuXG4vKipcbiAqIEludGVybmFsIGVudW0gZm9yIHNwZWNpZnlpbmcgdGhlIHNlbGVjdCBvcHRpb24gZm9yIHRoZSBzZWxlY3QgdHVwbGVzIGFwaS5cbiAqL1xuZXhwb3J0IGVudW0gU2VsZWN0T3B0aW9ucyB7XG4gIFNpbXBsZSA9ICdzZWxlY3Qtb3B0aW9ucy1zaW1wbGUnLFxuICBUb2dnbGUgPSAnc2VsZWN0LW9wdGlvbnMtdG9nZ2xlJyxcbiAgTWVudSA9ICdzZWxlY3Qtb3B0aW9ucy1tZW51JywgLy8gbm90IGltcGxlbWVudGVkIGluIHRoZSBleHRlcm5hbCBjb250cmFjdFxuICBSYW5nZSA9ICdzZWxlY3Qtb3B0aW9ucy1yYW5nZScsIC8vIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGUgZXh0ZXJuYWwgY29udHJhY3RcbiAgU2VhcmNoID0gJ3NlbGVjdC1vcHRpb25zLXNlYXJjaCcsIC8vIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGUgZXh0ZXJuYWwgY29udHJhY3Rcbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBlbnVtIGZvciBzcGVjaWZ5aW5nIHRoZSBpbmNsdWRlZCB2YWx1ZXMgdHlwZSBmb3IgcmFuZ2Ugc2VsZWN0aW9uLlxuICovXG5leHBvcnQgZW51bSBRdWFudGl0YXRpdmVJbmNsdWRlZFZhbHVlcyB7XG4gIEluY2x1ZGVOdWxsID0gJ2luY2x1ZGUtbnVsbCcsXG4gIEluY2x1ZGVOb25OdWxsID0gJ2luY2x1ZGUtbm9uLW51bGwnLFxuICBJbmNsdWRlQWxsID0gJ2luY2x1ZGUtYWxsJyxcbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBlbnVtIGZvciBzcGVjaWZ5aW5nIGEgaGllcmFyY2hpY2FsIGxldmVsIHNlbGVjdGlvbiBzdGF0ZS5cbiAqL1xuZXhwb3J0IGVudW0gSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZSB7XG4gIEFsbFNlbGVjdGVkID0gJ2FsbC1zZWxlY3RlZCcsXG4gIE5vbmVTZWxlY3RlZCA9ICdub25lLXNlbGVjdGVkJyxcbiAgU29tZVNlbGVjdGVkID0gJ3NvbWUtc2VsZWN0ZWQnLFxuICBVbmtub3duU2VsZWN0ZWQgPSAndW5rbm93bi1zZWxlY3RlZCcsXG59XG5cbi8qKlxuICogVHlwZSBvZiBtYXJrIGZvciBhIGdpdmVuIG1hcmtzIGNhcmQgaW4gYSB2aXouXG4gKi9cbmV4cG9ydCBlbnVtIE1hcmtUeXBlIHtcbiAgQmFyID0gJ2JhcicsXG4gIExpbmUgPSAnbGluZScsXG4gIEFyZWEgPSAnYXJlYScsXG4gIFNxdWFyZSA9ICdzcXVhcmUnLFxuICBDaXJjbGUgPSAnY2lyY2xlJyxcbiAgU2hhcGUgPSAnc2hhcGUnLFxuICBUZXh0ID0gJ3RleHQnLFxuICBNYXAgPSAnbWFwJyxcbiAgUGllID0gJ3BpZScsXG4gIEdhbnR0QmFyID0gJ2dhbnR0LWJhcicsXG4gIFBvbHlnb24gPSAncG9seWdvbicsXG4gIEhlYXRtYXAgPSAnaGVhdG1hcCcsXG4gIFZpekV4dGVuc2lvbiA9ICd2aXotZXh0ZW5zaW9uJyxcbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBlbnVtIGZvciBzcGVjaWZ5aW5nIHRoZSB0eXBlIG9mIGZpbHRlclxuICovXG5leHBvcnQgZW51bSBGaWx0ZXJUeXBlIHtcbiAgQ2F0ZWdvcmljYWwgPSAnY2F0ZWdvcmljYWwnLFxuICBSYW5nZSA9ICdyYW5nZScsXG4gIFJlbGF0aXZlRGF0ZSA9ICdyZWxhdGl2ZURhdGUnLFxuICBIaWVyYXJjaGljYWwgPSAnaGllcmFyY2hpY2FsJyxcbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBlbnVtIGZvciBzcGVjaWZ5aW5nIHRoZSBEYXRlUmFuZ2VUeXBlIG9mIGEgcmVsYXRpdmUgZGF0ZSBmaWx0ZXJcbiAqL1xuZXhwb3J0IGVudW0gRGF0ZVJhbmdlVHlwZSB7XG4gIC8qKlxuICAgKiBSZWZlcnMgdG8gdGhlIGxhc3QgZGF5LCB3ZWVrLCBtb250aCwgZXRjLiBvZiB0aGUgZGF0ZSBwZXJpb2QuXG4gICAqL1xuICBMYXN0ID0gJ2xhc3QnLFxuICAvKipcbiAgICogUmVmZXJzIHRvIHRoZSBsYXN0IE4gZGF5cywgd2Vla3MsIG1vbnRocywgZXRjLiBvZiB0aGUgZGF0ZSBwZXJpb2QuXG4gICAqL1xuICBMYXN0TiA9ICdsYXN0TicsXG4gIC8qKlxuICAgKiBSZWZlcnMgdG8gdGhlIG5leHQgZGF5LCB3ZWVrLCBtb250aCwgZXRjLiBvZiB0aGUgZGF0ZSBwZXJpb2QuXG4gICAqL1xuICBOZXh0ID0gJ25leHQnLFxuICAvKipcbiAgICogUmVmZXJzIHRvIHRoZSBuZXh0IE4gZGF5cywgd2Vla3MsIG1vbnRocywgZXRjLiBvZiB0aGUgZGF0ZSBwZXJpb2QuXG4gICAqL1xuICBOZXh0TiA9ICduZXh0TicsXG4gIC8qKlxuICAgKiBSZWZlcnMgdG8gdGhlIGN1cnJlbnQgZGF5LCB3ZWVrLCBtb250aCwgZXRjLiBvZiB0aGUgZGF0ZSBwZXJpb2QuXG4gICAqL1xuICBDdXJyZW50ID0gJ2N1cnJlbnQnLFxuICAvKipcbiAgICogUmVmZXJzIHRvIGV2ZXJ5dGhpbmcgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGUgY3VycmVudCBkYXksIHdlZWssIG1vbnRoLCBldGMuIG9mIHRoZSBkYXRlIHBlcmlvZC5cbiAgICovXG4gIFRvRGF0ZSA9ICd0b0RhdGUnLFxufVxuXG4vKipcbiAqIFVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBsYXVuY2hpbmcgb2YgYW4gZXh0ZW5zaW9uIGRpYWxvZyBzdWNjZWVkZWQgb3IgZmFpbGVkLlxuICovXG5leHBvcnQgZW51bSBFeHRlbnNpb25EaWFsb2dSZXN1bHQge1xuICBEaWFsb2dBbHJlYWR5T3BlbiA9ICdkaWFsb2ctYWxyZWFkeS1vcGVuJyxcbiAgSW52YWxpZERvbWFpbiA9ICdpbnZhbGlkLWRvbWFpbicsXG4gIFN1Y2Nlc3MgPSAnc3VjY2VzcycsXG59XG5cbi8qKlxuICogVXNlZCB0byBvcHRpbWl6ZSB0aGUgZ2V0U3VtbWFyeURhdGEvZ2V0VW5kZXJseWluZ1RhYmxlRGF0YSByZXN1bHRzXG4gKiBNYXBwZWQgZnJvbSBleHRlcm5hbCBJbmNsdWRlRGF0YVZhbHVlc09wdGlvblxuICovXG5leHBvcnQgZW51bSBBcGlTaG93RGF0YVRhYmxlRm9ybWF0IHtcbiAgTmF0aXZlVmFsdWVzT25seSA9ICduYXRpdmUtdmFsdWVzLW9ubHknLFxuICBGb3JtYXR0ZWRWYWx1ZXNPbmx5ID0gJ2Zvcm1hdHRlZC12YWx1ZXMtb25seScsXG4gIE5hdGl2ZUFuZEZvcm1hdHRlZFZhbHVlcyA9ICduYXRpdmUtYW5kLWZvcm1hdHRlZC12YWx1ZXMnLFxufVxuXG4vKipcbiAqIFVzZWQgdG8gZGVub3RlIHRoZSBzZWN0aW9ucyBvZiBmb3JtYXR0aW5nIHdpdGhpbiB0YWJsZWF1XG4gKi9cbmV4cG9ydCBjb25zdCBlbnVtIENsYXNzTmFtZUtleSB7XG4gIFdvcmtzaGVldFRpdGxlID0gJ3RhYmxlYXUtd29ya3NoZWV0LXRpdGxlJyxcbiAgV29ya3NoZWV0ID0gJ3RhYmxlYXUtd29ya3NoZWV0JyxcbiAgVG9vbHRpcCA9ICd0YWJsZWF1LXRvb2x0aXAnLFxuICBTdG9yeVRpdGxlID0gJ3RhYmxlYXUtc3RvcnktdGl0bGUnLFxuICBEYXNoYm9hcmRUaXRsZSA9ICd0YWJsZWF1LWRhc2hib2FyZC10aXRsZScsXG4gIFBhbmUgPSAndGFibGVhdS1wYW5lJyxcbiAgUm93RGl2aWRlcnMgPSAndGFibGVhdS1yb3ctZGl2aWRlcnMnLFxuICBDb2x1bW5EaXZpZGVycyA9ICd0YWJsZWF1LWNvbHVtbi1kaXZpZGVycycsXG59XG5cbi8qKlxuICogVXNlZCB0byBzZXQgcGFnZSBzaXplIGZvciBleHBvcnQgbGF5b3V0IG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBlbnVtIFBhZ2VTaXplT3B0aW9uIHtcbiAgTGV0dGVyID0gJ2xldHRlcicsXG4gIExlZ2FsID0gJ2xlZ2FsJyxcbiAgTm90ZSA9ICdub3RlJyxcbiAgRm9saW8gPSAnZm9saW8nLFxuICBUYWJsb2lkID0gJ3RhYmxvaWQnLFxuICBMZWRnZXIgPSAnbGVkZ2VyJyxcbiAgU3RhdGVtZW50ID0gJ3N0YXRlbWVudCcsXG4gIEV4ZWN1dGl2ZSA9ICdleGVjdXRpdmUnLFxuICBBMyA9ICdhMycsXG4gIEE0ID0gJ2E0JyxcbiAgQTUgPSAnYTUnLFxuICBCNCA9ICdiNCcsXG4gIEI1ID0gJ2I1JyxcbiAgUXVhcnRvID0gJ3F1YXJ0bycsXG4gIFVuc3BlY2lmaWVkID0gJ3Vuc3BlY2lmaWVkJyxcbn1cblxuLyoqXG4gKiBVc2VkIHRvIHNldCB0aGUgcGFnZSBvcmllbnRhdGlvbiBtb2RlIGZvciBleHBvcnQgbGF5b3V0IG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBlbnVtIFBhZ2VPcmllbnRhdGlvbiB7XG4gIFByaW50ZXIgPSAncHJpbnRlcicsXG4gIFBvcnRyYWl0ID0gJ3BvcnRyYWl0JyxcbiAgTGFuZHNjYXBlID0gJ2xhbmRzY2FwZScsXG59XG5cbi8qKlxuICogVXNlZCB0byBzZXQgc2NhbGUgbW9kZSBmb3IgZXhwb3J0IGxheW91dCBvcHRpb25zLlxuICovXG5leHBvcnQgZW51bSBTY2FsZU1vZGUge1xuICBTY2FsZUF1dG8gPSAnYXV0bycsXG4gIFNjYWxlUGVyY2VudGFnZSA9ICdwZXJjZW50JyxcbiAgU2NhbGVGaXRQYWdlcyA9ICdmaXQtcGFnZXMnLFxufVxuXG4vKipcbiAqIFVzZWQgYnkgc2V0Rml0QW5kU2NhbGVWYWx1ZXMgdG8gc2NhbGUgcGVyY2VudCB2YWx1ZXNcbiAqL1xuZXhwb3J0IGVudW0gUGFnZVNjYWxpbmdPcHRpb24ge1xuICBTY2FsZVBjdEF1dG8gPSAnYXV0bycsXG4gIFNjYWxlUGN0NDAwID0gJ3BjdDQwMCcsXG4gIFNjYWxlUGN0MjAwID0gJ3BjdDIwMCcsXG4gIFNjYWxlUGN0MTAwID0gJ3BjdDEwMCcsXG4gIFNjYWxlUGN0OTAgPSAncGN0OTAnLFxuICBTY2FsZVBjdDgwID0gJ3BjdDgwJyxcbiAgU2NhbGVQY3Q3NSA9ICdwY3Q3NScsXG4gIFNjYWxlUGN0NjAgPSAncGN0NjAnLFxuICBTY2FsZVBjdDUwID0gJ3BjdDUwJyxcbiAgU2NhbGVQY3QyNSA9ICdwY3QyNScsXG59XG5cbi8qKlxuICogVXNlZCBieSBzZXRGaXRBbmRTY2FsZVZhbHVlcyB0byBzY2FsZSBmaXQgcGFnZSB2YWx1ZXNcbiAqL1xuZXhwb3J0IGVudW0gRml0UGFnZXMge1xuICBGaXRPbmVIaWdoID0gJ2ZpdDB4MScsXG4gIEZpdFR3b0hpZ2ggPSAnZml0MHgyJyxcbiAgRml0T25lV2lkZSA9ICdmaXQxeDAnLFxuICBGaXRUd29XaWRlID0gJ2ZpdDJ4MCcsXG59XG5cbi8qKlxuICogVXNlZCBieSBnZXRWaXN1YWxTcGVjaWZpY2F0aW9uQXN5bmNcbiAqL1xuZXhwb3J0IGVudW0gRW5jb2RpbmdUeXBlIHtcbiAgQ29sb3IgPSAnY29sb3InLFxuICBTaXplID0gJ3NpemUnLFxuICBMYWJlbCA9ICdsYWJlbCcsXG4gIERldGFpbCA9ICdkZXRhaWwnLFxuICBUb29sdGlwID0gJ3Rvb2x0aXAnLFxuICBTaGFwZSA9ICdzaGFwZScsXG4gIFBhdGggPSAncGF0aCcsXG4gIEFuZ2xlID0gJ2FuZ2xlJyxcbiAgR2VvbWV0cnkgPSAnZ2VvbWV0cnknLFxuICBDdXN0b20gPSAnY3VzdG9tJyxcbn1cblxuZXhwb3J0IGVudW0gUHVsc2VUaW1lRGltZW5zaW9uIHtcbiAgVG9kYXkgPSAnVG9kYXknLFxuICBZZXN0ZXJkYXkgPSAnWWVzdGVyZGF5JyxcbiAgV2Vla1RvRGF0ZSA9ICdXZWVrVG9EYXRlJyxcbiAgTGFzdFdlZWsgPSAnTGFzdFdlZWsnLFxuICBNb250aFRvRGF0ZSA9ICdNb250aFRvRGF0ZScsXG4gIExhc3RNb250aCA9ICdMYXN0TW9udGgnLFxuICBRdWFydGVyVG9EYXRlID0gJ1F1YXJ0ZXJUb0RhdGUnLFxuICBMYXN0UXVhcnRlciA9ICdMYXN0UXVhcnRlcicsXG4gIFllYXJUb0RhdGUgPSAnWWVhclRvRGF0ZScsXG4gIExhc3RZZWFyID0gJ0xhc3RZZWFyJyxcbn1cblxuZXhwb3J0IGVudW0gUHVsc2VFcnJvck1lc3NhZ2VWaXNpYmlsaXR5IHtcbiAgVmlzaWJsZSA9ICd2aXNpYmxlJyxcbiAgSGlkZGVuID0gJ2hpZGRlbicsXG4gIFN1cHByZXNzZWQgPSAnc3VwcHJlc3NlZCcsXG59XG4iLCJleHBvcnQgZW51bSBOb3RpZmljYXRpb25JZCB7XG4gIEN1c3RvbU1hcmtDb250ZXh0TWVudUNsaWNrZWQgPSAnY3VzdG9tLW1hcmstY29udGV4dC1tZW51LWNsaWNrZWQnLFxuICBDb250ZXh0TWVudUNsaWNrID0gJ2NvbnRleHQtbWVudS1jbGljaycsXG4gIEN1c3RvbVZpZXdSZW1vdmVkID0gJ2N1c3RvbS12aWV3LXJlbW92ZWQnLFxuICBDdXN0b21WaWV3U2F2ZWQgPSAnY3VzdG9tLXZpZXctc2F2ZWQnLFxuICBDdXN0b21WaWV3U2V0RGVmYXVsdCA9ICdjdXN0b20tdmlldy1zZXQtZGVmYXVsdCcsXG4gIEN1c3RvbVZpZXdzTG9hZGVkID0gJ2N1c3RvbS12aWV3cy1sb2FkZWQnLFxuICBEYXNoYm9hcmRMYXlvdXRDaGFuZ2VkID0gJ2Rhc2hib2FyZC1sYXlvdXQtY2hhbmdlZCcsXG4gIEVkaXRCdXR0b25DbGlja2VkID0gJ2VkaXQtYnV0dG9uLWNsaWNrZWQnLFxuICBFZGl0SW5EZXNrdG9wQnV0dG9uQ2xpY2tlZCA9ICdlZGl0LWluLWRlc2t0b3AtYnV0dG9uLWNsaWNrZWQnLFxuICBFeHRlbnNpb25EaWFsb2dVcGRhdGUgPSAnZXh0ZW5zaW9uLWRpYWxvZy11cGRhdGUnLFxuICBGaWx0ZXJDaGFuZ2VkID0gJ2ZpbHRlci1jaGFuZ2VkJyxcbiAgRmlyc3RWaXpTaXplS25vd24gPSAnZmlyc3Qtdml6LXNpemUta25vd24nLFxuICBGaXJzdFB1bHNlTWV0cmljU2l6ZUtub3duID0gJ2ZpcnN0LXB1bHNlLW1ldHJpYy1zaXplLWtub3duJyxcbiAgUGFyYW1ldGVyQ2hhbmdlZCA9ICdwYXJhbWV0ZXItY2hhbmdlZCcsXG4gIFB1bHNlRXJyb3IgPSAncHVsc2UtZXJyb3InLFxuICBQdWxzZUZpbHRlcnNDaGFuZ2VkID0gJ3B1bHNlLWZpbHRlcnMtY2hhbmdlZCcsXG4gIFB1bHNlSW5zaWdodERpc2NvdmVyZWQgPSAncHVsc2UtaW5zaWdodC1kaXNjb3ZlcmVkJyxcbiAgUHVsc2VJbnRlcmFjdGl2ZSA9ICdwdWxzZS1pbnRlcmFjdGl2ZScsXG4gIFB1bHNlVGltZURpbWVuc2lvbkNoYW5nZWQgPSAncHVsc2UtdGltZS1kaW1lbnNpb24tY2hhbmdlZCcsXG4gIFB1bHNlVXJsQ2hhbmdlZCA9ICdwdWxzZS11cmwtY2hhbmdlZCcsXG4gIFNlbGVjdGVkTWFya3NDaGFuZ2VkID0gJ3NlbGVjdGVkLW1hcmtzLWNoYW5nZWQnLFxuICBTZXR0aW5nc0NoYW5nZWQgPSAnc2V0dGluZ3MtY2hhbmdlZCcsXG4gIFN1bW1hcnlEYXRhQ2hhbmdlZCA9ICdzdW1tYXJ5LWRhdGEtY2hhbmdlZCcsXG4gIFRlc3RDb252ZXJzaW9uTm90aWZpY2F0aW9uID0gJ3Rlc3QtY29udmVyc2lvbi1ub3RpZmljYXRpb24nLFxuICBUb29sYmFyU3RhdGVDaGFuZ2VkID0gJ3Rvb2xiYXItc3RhdGUtY2hhbmdlZCcsXG4gIFZpekludGVyYWN0aXZlID0gJ3Zpei1pbnRlcmFjdGl2ZScsXG4gIEFza0RhdGFJbnRlcmFjdGl2ZSA9ICdhc2stZGF0YS1pbnRlcmFjdGl2ZScsXG4gIFdvcmtib29rUmVhZHlUb0Nsb3NlID0gJ3dvcmtib29rLXJlYWR5LXRvLWNsb3NlJyxcbiAgV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZCA9ICd3b3JrYm9vay1mb3JtYXR0aW5nLWNoYW5nZWQnLFxuICBXb3JrYm9va1B1Ymxpc2hlZCA9ICd3b3JrYm9vay1wdWJsaXNoZWQnLFxuICBXb3JrYm9va1B1Ymxpc2hlZEFzID0gJ3dvcmtib29rLXB1Ymxpc2hlZC1hcycsXG4gIFdvcmtzaGVldEZvcm1hdHRpbmdDaGFuZ2VkID0gJ3dvcmtzaGVldC1mb3JtYXR0aW5nLWNoYW5nZWQnLFxuICBVcmxBY3Rpb24gPSAndXJsLWFjdGlvbicsXG4gIFRhYlN3aXRjaGVkID0gJ3RhYi1zd2l0Y2hlZCcsXG4gIFN0b3J5UG9pbnRTd2l0Y2hlZCA9ICdzdG9yeS1wb2ludC1zd2l0Y2hlZCcsXG4gIFJlYWR5VG9SZWNlaXZlQXV0aFRva2VuID0gJ3JlYWR5LXRvLXJlY2VpdmUtYXV0aC10b2tlbicsXG59XG4iLCIvLyBQTEVBU0UgS0VFUCBJTiBBTFBIQUJFVElDQUwgT1JERVIuIFRoaXMgaGVscHMgd2l0aCB2aXN1YWxseSBmaW5kaW5nIGVudHJpZXMsIGtub3dpbmcgd2hlcmUgdG8gcHV0XG4vLyBuZXcgb25lcywgYW5kIG1lcmdlIGNvbmZsaWN0cy5cbmV4cG9ydCBlbnVtIFBhcmFtZXRlcklkIHtcbiAgQWN0aXZlVGFibGVzSW5mbyA9ICdhY3RpdmUtdGFibGVzLWluZm8nLFxuICBBbmNob3JEYXRlID0gJ2FuY2hvci1kYXRlJyxcbiAgQW5ub3RhdGVFbnVtID0gJ2Fubm90YXRlLWVudW0nLFxuICBBbm5vdGF0aW9uTGlzdCA9ICdhbm5vdGF0aW9uLWxpc3QnLFxuICBBcHBseVdvcmtzaGVldEZvcm1hdHRpbmcgPSAnYXBwbHktd29ya3NoZWV0LWZvcm1hdHRpbmcnLFxuXG4gIENhdGVnb3JpY2FsRG9tYWluID0gJ2NhdGVnb3JpY2FsLWRvbWFpbicsXG4gIENsaWNrVGhyb3VnaEVuYWJsZWQgPSAnY2xpY2stdGhyb3VnaC1lbmFibGVkJyxcbiAgQ29sdW1ucyA9ICdjb2x1bW5zJyxcbiAgQ29sdW1uc1RvSW5jbHVkZSA9ICdjb2x1bW5zLXRvLWluY2x1ZGUnLFxuICBDb2x1bW5zVG9JbmNsdWRlQnlJZCA9ICdjb2x1bW5zLXRvLWluY2x1ZGUtYnktaWQnLFxuICBDb25uZWN0aW9uRGVzY3JpcHRpb25TdW1tYXJpZXMgPSAnY29ubmVjdGlvbi1kZXNjcmlwdGlvbi1zdW1tYXJpZXMnLFxuICBDdXJyZW50U2hlZXRUeXBlID0gJ2N1cnJlbnQtc2hlZXQtdHlwZScsXG4gIEN1c3RvbVZpZXcgPSAnY3VzdG9tLXZpZXcnLFxuICBDdXN0b21WaWV3SXNEZWZhdWx0ID0gJ2N1c3RvbS12aWV3LWlzLWRlZmF1bHQnLFxuICBDdXN0b21WaWV3SXNQdWJsaWMgPSAnY3VzdG9tLXZpZXctaXMtcHVibGljJyxcbiAgQ3VzdG9tVmlld0x1aWQgPSAnY3VzdG9tLXZpZXctbHVpZCcsXG4gIEN1c3RvbVZpZXdOYW1lID0gJ2N1c3RvbS12aWV3LW5hbWUnLFxuICBDdXN0b21WaWV3cyA9ICdjdXN0b20tdmlld3MnLFxuXG4gIERhc2hib2FyZCA9ICdkYXNoYm9hcmQnLFxuICBEYXNoYm9hcmRGaWx0ZXJzID0gJ2Rhc2hib2FyZC1maWx0ZXJzJyxcbiAgRGFzaGJvYXJkTmFtZSA9ICdkYXNoYm9hcmQnLFxuICBEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUgPSAnZGFzaGJvYXJkLW9iamVjdC1wb3NpdGlvbi1hbmQtc2l6ZS11cGRhdGUnLFxuICBEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGVMaXN0ID0gJ2Rhc2hib2FyZC1vYmplY3QtcG9zaXRpb24tYW5kLXNpemUtdXBkYXRlLWxpc3QnLFxuICBEYXRhUm93SW5kZXggPSAnZGF0YS1yb3ctaW5kZXgnLFxuICBEYXRhU2NoZW1hID0gJ2RhdGEtc2NoZW1hJyxcbiAgRGF0YVNvdXJjZSA9ICdkYXRhLXNvdXJjZScsXG4gIERhdGFTb3VyY2VEYXRhVGFibGUgPSAnZGF0YS1zb3VyY2UtZGF0YS10YWJsZScsXG4gIERhdGFTb3VyY2VJZCA9ICdkYXRhLXNvdXJjZS1pZCcsXG4gIERhdGFTb3VyY2VOYW1lID0gJ2RhdGEtc291cmNlLW5hbWUnLFxuICBEYXRhVGFibGUgPSAnZGF0YS10YWJsZScsXG4gIERhdGFUYWJsZVJlYWRlciA9ICdkYXRhLXRhYmxlLXJlYWRlcicsXG4gIERhdGVSYW5nZVR5cGUgPSAnZGF0ZS1yYW5nZS10eXBlJyxcbiAgRGVsZXRlQ291bnQgPSAnZGVsZXRlLWNvdW50JyxcbiAgRGVsdGFUaW1lTXMgPSAnZGVsdGEtdGltZS1tcycsXG4gIERpbVZhbFNlbGVjdGlvbk1vZGVscyA9ICdkaW1lbnNpb25WYWx1ZVNlbGVjdGlvbk1vZGVscycsXG4gIERvbWFpblR5cGUgPSAnZG9tYWluLXR5cGUnLFxuXG4gIEVtYmVkZGluZ0Fic3RyYWN0UXVlcnkgPSAnZW1iZWRkaW5nLWFic3RyYWN0LXF1ZXJ5JyxcbiAgRW1iZWRkaW5nQm9vdHN0cmFwSW5mbyA9ICdlbWJlZGRpbmctYm9vdHN0cmFwLWluZm8nLFxuICBFbmNvZGluZ1R5cGUgPSAnZW5jb2RpbmctdHlwZScsXG4gIEV4cG9ydENyb3NzdGFiU2hlZXRNYXAgPSAnZXhwb3J0LWNyb3NzdGFiLXNoZWV0LW1hcCcsXG4gIEV4cG9ydEZpbGUgPSAnZXhwb3J0LWZpbGUnLFxuICBFeHBvcnRPcmlnaW5VcmwgPSAnZXhwb3J0LW9yaWdpbi11cmwnLFxuICBFeHBvcnRQZGZPcHRpb25zID0gJ2V4cG9ydC1wZGYtb3B0aW9ucycsXG4gIEV4dGVuc2lvbkJvb3RzdHJhcEluZm8gPSAnZXh0ZW5zaW9uLWJvb3RzdHJhcC1pbmZvJyxcbiAgRXh0ZW5zaW9uQ29udGV4dE1lbnVJZHMgPSAnZXh0ZW5zaW9uLWNvbnRleHQtbWVudS1pZHMnLFxuICBFeHRlbnNpb25EaWFsb2dIID0gJ2V4dGVuc2lvbi1kaWFsb2ctaGVpZ2h0JyxcbiAgRXh0ZW5zaW9uRGlhbG9nUGF5bG9hZCA9ICdleHRlbnNpb24tZGlhbG9nLXBheWxvYWQnLFxuICBFeHRlbnNpb25EaWFsb2dSZXN1bHQgPSAnZXh0ZW5zaW9uLWRpYWxvZy1yZXN1bHQnLFxuICBFeHRlbnNpb25EaWFsb2dTdHlsZSA9ICdleHRlbnNpb24tZGlhbG9nLXN0eWxlJyxcbiAgRXh0ZW5zaW9uRGlhbG9nVXJsID0gJ2V4dGVuc2lvbi1kaWFsb2ctdXJsJyxcbiAgRXh0ZW5zaW9uRGlhbG9nVyA9ICdleHRlbnNpb24tZGlhbG9nLXdpZHRoJyxcbiAgRXh0ZW5zaW9uTG9jYXRvciA9ICdleHRlbnNpb24tbG9jYXRvcicsXG4gIEV4dGVuc2lvblNldHRpbmdzSW5mbyA9ICdleHRlbnNpb24tc2V0dGluZ3MtaW5mbycsXG4gIEV4dGVuc2lvblpvbmVJZCA9ICdleHRlbnNpb24tem9uZS1pZCcsXG4gIEV4dGVybmFsTWVudURlc2NyaXB0aW9uID0gJ2V4dGVybmFsLW1lbnUtZGVzY3JpcHRpb24nLFxuICBFeHRlcm5hbE1lbnVIZWFkZXIgPSAnZXh0ZXJuYWwtbWVudS1oZWFkZXInLFxuICBFeHRlcm5hbE1lbnVJdGVtRGlzcGxheU5hbWUgPSAnZXh0ZXJuYWwtbWVudS1pdGVtLWRpc3BsYXktbmFtZScsXG4gIEV4dGVybmFsTWVudUl0ZW1JZCA9ICdleHRlcm5hbC1tZW51LWl0ZW0taWQnLFxuXG4gIEZpZWxkID0gJ2ZpZWxkJyxcbiAgRmllbGRDb3VudCA9ICdmaWVsZC1jb3VudCcsXG4gIEZpZWxkSWQgPSAnZmllbGQtaWQnLFxuICBGaWVsZE5hbWUgPSAnZmllbGQtbmFtZScsXG4gIEZpbHRlckxldmVscyA9ICdmaWx0ZXItbGV2ZWxzJyxcbiAgRmlsdGVyUmFuZ2VNYXggPSAnZmlsdGVyLXJhbmdlLW1heCcsXG4gIEZpbHRlclJhbmdlTWluID0gJ2ZpbHRlci1yYW5nZS1taW4nLFxuICBGaWx0ZXJSYW5nZU51bGxPcHRpb24gPSAnZmlsdGVyLXJhbmdlLW51bGwtb3B0aW9uJyxcbiAgRmlsdGVyVXBkYXRlVHlwZSA9ICdmaWx0ZXItdXBkYXRlLXR5cGUnLFxuICBGaWx0ZXJWYWx1ZXMgPSAnZmlsdGVyLXZhbHVlcycsXG4gIEZvbnROYW1lTGlzdEl0ZW1zID0gJ2ZvbnQtbmFtZS1saXN0LWl0ZW1zJyxcbiAgRm9ybWF0dGVkVGV4dCA9ICdmb3JtYXR0ZWQtdGV4dCcsXG4gIEZ1bmN0aW9uTmFtZSA9ICdmdW5jdGlvbi1uYW1lJyxcbiAgRnJvbUluZGV4ID0gJ2Zyb20taW5kZXgnLFxuXG4gIEhpZXJWYWxTZWxlY3Rpb25Nb2RlbHMgPSAnaGllcmFyY2hpY2FsVmFsdWVTZWxlY3Rpb25Nb2RlbHMnLFxuICBIaWdobGlnaHRlZERhdGEgPSAnaGlnaGxpZ2h0ZWQtZGF0YScsXG4gIEhvdmVyVHVwbGVJbnRlcmFjdGlvbiA9ICdob3Zlci10dXBsZS1pbnRlcmFjdGlvbicsXG5cbiAgSWdub3JlQWxpYXNlcyA9ICdpZ25vcmUtYWxpYXNlcycsXG4gIElnbm9yZVNlbGVjdGlvbiA9ICdpZ25vcmUtc2VsZWN0aW9uJyxcbiAgSW5jbHVkZUFsbENvbHVtbnMgPSAnaW5jbHVkZS1hbGwtY29sdW1ucycsXG4gIEludmFsaWRBZ2dGaWVsZE5hbWUgPSAnaW52YWxpZC1hZ2ctZmllbGQtbmFtZScsXG4gIEludmFsaWREYXRlcyA9ICdpbnZhbGlkLWRhdGVzJyxcbiAgSW52YWxpZEZpZWxkQ2FwdGlvbiA9ICdpbnZhbGlkLWZpZWxkLWNhcHRpb24nLFxuICBJbnZhbGlkRmllbGRzID0gJ2ludmFsaWQtZmllbGRzJyxcbiAgSW52YWxpZFZhbHVlcyA9ICdpbnZhbGlkLXZhbHVlcycsXG4gIElzRXhjbHVkZU1vZGUgPSAnaXMtZXhjbHVkZScsXG4gIElzRXh0ZW5zaW9uRGlhbG9nID0gJ2lzLWV4dGVuc2lvbi1kaWFsb2cnLFxuXG4gIEpvaW5EZXNjcmlwdGlvbiA9ICdqb2luLWRlc2NyaXB0aW9uJyxcblxuICBMb2dpY2FsVGFibGVJZCA9ICdsb2dpY2FsLXRhYmxlLWlkJyxcbiAgTG9naWNhbFRhYmxlSW5mb0xpc3QgPSAnbG9naWNhbC10YWJsZS1pbmZvLWxpc3QnLFxuXG4gIE1hcmtzQ2FyZEluZGV4ID0gJ21hcmtzLWNhcmQtaW5kZXgnLFxuICBNYXhIZWlnaHQgPSAnbWF4LWhlaWdodCcsXG4gIE1heFJvd3MgPSAnbWF4LXJvd3MnLFxuICBNYXhXaWR0aCA9ICdtYXgtd2lkdGgnLFxuICBNaW5IZWlnaHQgPSAnbWluLWhlaWdodCcsXG4gIE1pbldpZHRoID0gJ21pbi13aWR0aCcsXG5cbiAgUGFnZVJvd0NvdW50ID0gJ3BhZ2Utcm93LWNvdW50JyxcbiAgUGFyYW1ldGVyQ2FwdGlvbiA9ICdwYXJlbWV0ZXItY2FwdGlvbicsXG4gIFBhcmFtZXRlckVycm9yID0gJ3BhcmFtZXRlci1lcnJvcicsXG4gIFBhcmFtZXRlckZpZWxkTmFtZSA9ICdwYXJhbWV0ZXItZmllbGQtbmFtZScsXG4gIFBhcmFtZXRlckluZm8gPSAncGFyYW1ldGVyLWluZm8nLFxuICBQYXJhbWV0ZXJJbmZvcyA9ICdwYXJhbWV0ZXItaW5mb3MnLFxuICBQYXJhbWV0ZXJWYWx1ZSA9ICdwYXJhbWV0ZXItdmFsdWUnLFxuICBQZXJpb2RUeXBlID0gJ3BlcmlvZC10eXBlJyxcbiAgUHVsc2VGaWVsZE5hbWUgPSAnZmllbGROYW1lJyxcbiAgUHVsc2VGaWVsZE5hbWVzID0gJ2ZpZWxkTmFtZXMnLFxuICBQdWxzZUZpbHRlckRvbWFpblR5cGUgPSAnZG9tYWluVHlwZScsXG4gIFB1bHNlRmlsdGVyRG9tYWluU2VhcmNoVGVybSA9ICdzZWFyY2hUZXJtJyxcbiAgUHVsc2VQYWdlU2l6ZSA9ICdwYWdlU2l6ZScsXG4gIFB1bHNlTmV4dFBhZ2VUb2tlbiA9ICduZXh0UGFnZVRva2VuJyxcbiAgUHVsc2VGaWx0ZXJzID0gJ2ZpbHRlcnMnLFxuICBQdWxzZVRpbWVEaW1lbnNpb24gPSAndGltZURpbWVuc2lvbicsXG5cbiAgUXVhbnRpdGF0aXZlRG9tYWluID0gJ3F1YW50aXRhdGl2ZS1kbWFpbicsXG4gIFF1YW50UmFuZ2VTZWxlY3Rpb25Nb2RlbHMgPSAncXVhbnRhdGl2ZVJhbmdlU2VsZWN0aW9uTW9kZWxzJyxcblxuICBSYW5nZU4gPSAncmFuZ2UtbicsXG4gIFJlcGxheVNwZWVkID0gJ3JlcGxheS1zcGVlZCcsXG5cbiAgU2VsZWN0ZWREYXRhID0gJ3NlbGVjdGVkLWRhdGEnLFxuICBTZWxlY3RlZFNoZWV0TmFtZXMgPSAnc2VsZWN0ZWQtc2hlZXQtbmFtZXMnLFxuICBTZWxlY3Rpb24gPSAnc2VsZWN0aW9uJyxcbiAgU2VsZWN0aW9uTGlzdCA9ICdzZWxlY3Rpb24tbGlzdCcsXG4gIFNlbGVjdGlvblVwZGF0ZVR5cGUgPSAnc2VsZWN0aW9uVXBkYXRlVHlwZScsXG4gIFNlbGVjdFR1cGxlc0ludGVyYWN0aW9uID0gJ3NlbGVjdC10dXBsZXMtaW50ZXJhY3Rpb24nLFxuICBTZW5kTm90aWZpY2F0aW9ucyA9ICdzZW5kLW5vdGlmaWNhdGlvbnMnLFxuICBTZXR0aW5nc1ZhbHVlcyA9ICdzZXR0aW5ncy12YWx1ZXMnLFxuICBTaGFyZWRGaWx0ZXJTaGVldHMgPSAnc2hhcmVkLWZpbHRlci1zaGVldHMnLFxuICBTaGFyZWRGaWx0ZXJzSW5mbyA9ICdzaGFyZWQtZmlsdGVycy1pbmZvJyxcbiAgU2hlZXRJZGVudGlmaWVyID0gJ3NoZWV0LWlkZW50aWZpZXInLFxuICBTaGVldE5hbWUgPSAnc2hlZXQtbmFtZScsXG4gIFNoZWV0UGF0aCA9ICdzaGVldC1wYXRoJyxcbiAgU2hvdWxkUmVmcmVzaERTID0gJ3Nob3VsZC1yZWZyZXNoLWRzJyxcbiAgU2hvd0RhdGFUYWJsZUZvcm1hdCA9ICdzaG93LWRhdGEtdGFibGUtZm9ybWF0JyxcbiAgU3RhcnRJbmRleCA9ICdzdGFydC1pbmRleCcsXG4gIFN0YXRlID0gJ3N0YXRlJyxcbiAgU3RvcnlQb2ludEluZGV4ID0gJ3N0b3J5LXBvaW50LWluZGV4JyxcbiAgU3RvcnlQb2ludEluZm8gPSAnc3RvcnktcG9pbnQtaW5mbycsXG4gIFN3aXRjaFRvU2hlZXROYW1lID0gJ3N3aXRjaC10by1zaGVldC1uYW1lJyxcblxuICBUYXJnZXRQb2ludCA9ICd0YXJnZXQtcG9pbnQnLFxuICBUZXN0Q29udmVyc2lvblBhcmFtZXRlciA9ICd0ZXN0LWNvbnZlcnNpb24tcGFyYW1ldGVyJyxcbiAgVGV4dCA9ICdmb3JtYXR0ZWQtdGV4dCcsXG4gIFRvSW5kZXggPSAndG8taW5kZXgnLFxuICBUb29sdGlwQ29udGV4dCA9ICd0b29sdGlwLWNvbnRleHQnLFxuICBUb29sdGlwVGV4dFJlcXVlc3QgPSAndG9vbHRpcC10ZXh0LXJlcXVlc3QnLFxuICBUb29sdGlwVGV4dCA9ICd0b29sdGlwLXRleHQnLFxuXG4gIFVuZGVybHlpbmdEYXRhVGFibGUgPSAndW5kZXJseWluZy1kYXRhLXRhYmxlJyxcbiAgVW5kZXJseWluZ1N1bW1hcnlEYXRhVGFibGUgPSAndW5kZXJseWluZy1zdW1tYXJ5LWRhdGEtdGFibGUnLFxuICBVcmwgPSAndXJsJyxcbiAgVXNlVGFiRGVsaW1pdGVycyA9ICd1c2UtdGFiLWRlbGltaXRlcnMnLFxuXG4gIFZpZXdEYXRhVGFibGVDYWNoZUlkID0gJ3ZpZXctZGF0YS10YWJsZS1jYWNoZS1pZCcsXG4gIFZpZXdEYXRhVGFibGVJZCA9ICd2aWV3LWRhdGEtdGFibGUtaWQnLFxuICBWaXN1YWxJZCA9ICd2aXN1YWwtaWQnLFxuICBWaXN1YWxTcGVjaWZpY2F0aW9uID0gJ3Zpc3VhbC1zcGVjaWZpY2F0aW9uJyxcbiAgVml6QVBJSW5wdXRKc29uID0gJ3ZpemFwaS1pbnB1dC1qc29uJyxcbiAgVml6QVBJU3RhdGVXaXRoRGF0YU1vZGVsID0gJ3ZpemFwaS1zdGF0ZS13aXRoLWRhdGEtbW9kZWwnLFxuICBWaXpBUElTdGF0ZVdhcm5pbmdNc2cgPSAndml6YXBpLXN0YXRlLXdhcm5pbmctbXNnJyxcbiAgVml6QVBJU1ZHID0gJ3ZpemFwaS1zdmcnLFxuXG4gIFdvcmtzaGVldE5hbWUgPSAnd29ya3NoZWV0LW5hbWUnLFxuICBXb3Jrc2hlZXRGaWx0ZXJzID0gJ3dvcmtzaGVldC1maWx0ZXJzJyxcblxuICBab25lSWRzVmlzaWJpbGl0eU1hcCA9ICd6b25lLWlkcy12aXNpYmlsaXR5LW1hcCcsXG59XG4iLCIvLyBEZWNsYXJlIHRoaXMga2V5IHR5cGUgYW5kIGV4cG9ydCB0aGUgTm90aWZpY2F0aW9uSWQgdG8gbWFrZSB0aGlzIGJlaGF2ZSBsaWtlIGEgc3RyaW5nIGVudW0uXG4vL1xuLy8gUExFQVNFIEtFRVAgSU4gQUxQSEFCRVRJQ0FMIE9SREVSLiBUaGlzIGhlbHBzIHdpdGggdmlzdWFsbHkgZmluZGluZyBlbnRyaWVzLCBrbm93aW5nIHdoZXJlIHRvIHB1dFxuLy8gbmV3IG9uZXMsIGFuZCBtZXJnZSBjb25mbGljdHMuXG5leHBvcnQgZW51bSBWZXJiSWQge1xuICBBY3RpdmF0ZU5leHRTdG9yeVBvaW50ID0gJ2FjdGl2YXRlLW5leHQtc3RvcnktcG9pbnQnLFxuICBBY3RpdmF0ZVByZXZpb3VzU3RvcnlQb2ludCA9ICdhY3RpdmF0ZS1wcmV2aW91cy1zdG9yeS1wb2ludCcsXG4gIEFjdGl2YXRlU2hlZXQgPSAnYWN0aXZhdGVTaGVldCcsXG4gIEFjdGl2YXRlU3RvcnlQb2ludCA9ICdhY3RpdmF0ZS1zdG9yeS1wb2ludCcsXG4gIEFkZE1hcmtzQ2FyZEZpZWxkcyA9ICdhZGQtbWFya3MtY2FyZC1maWVsZHMnLFxuICBBcHBlbmRFeHRlcm5hbE1lbnVJdGVtID0gJ2FwcGVuZC1leHRlcm5hbC1tZW51LWl0ZW0nLFxuICBBcHBseUNhdGVnb3JpY2FsRmlsdGVyID0gJ2NhdGVnb3JpY2FsLWZpbHRlcicsXG4gIEFwcGx5UHVsc2VGaWx0ZXJzID0gJ2FwcGx5LXB1bHNlLWZpbHRlcnMnLFxuICBBcHBseVB1bHNlVGltZURpbWVuc2lvbiA9ICdhcHBseS1wdWxzZS10aW1lLWRpbWVuc2lvbicsXG4gIEFwcGx5UmFuZ2VGaWx0ZXIgPSAncmFuZ2UtZmlsdGVyJyxcbiAgQXBwbHlSZWxhdGl2ZURhdGVGaWx0ZXIgPSAnYXBwbHktcmVsYXRpdmUtZGF0ZS1GaWx0ZXInLFxuICBBdXRoZW50aWNhdGUgPSAnYXV0aGVudGljYXRlJyxcblxuICBCbG9ja0V4dGVuc2lvbiA9ICdibG9jay1leHRlbnNpb24nLFxuXG4gIENoYW5nZVBhcmFtZXRlclZhbHVlID0gJ2NoYW5nZS1wYXJhbWV0ZXItdmFsdWUnLFxuICBDaGFuZ2VTaGFyZWRGaWx0ZXIgPSAnY2hhbmdlLXNoYXJlZC1maWx0ZXInLFxuICBDbGVhckFsbFB1bHNlRmlsdGVycyA9ICdjbGVhci1hbGwtcHVsc2UtZmlsdGVycycsXG4gIENsZWFyRmlsdGVyID0gJ2NsZWFyLWZpbHRlcicsXG4gIENsZWFyUHVsc2VGaWx0ZXJzID0gJ2NsZWFyLXB1bHNlLWZpbHRlcnMnLFxuICBDbGVhclNlbGVjdGVkTWFya3MgPSAnY2xlYXItc2VsZWN0ZWQtbWFya3MnLFxuICBDbG9zZURpYWxvZyA9ICdjbG9zZS1kaWFsb2cnLFxuICBDcmVhdGVBbm5vdGF0aW9uID0gJ2NyZWF0ZS1hbm5vdGF0aW9uJyxcblxuICBEYXNoYm9hcmRDYXRlZ29yaWNhbEZpbHRlciA9ICdkYXNoYm9hcmQtY2F0ZWdvcmljYWwtZmlsdGVyJyxcbiAgRGlzcGxheURpYWxvZyA9ICdkaXNwbGF5LWRpYWxvZycsXG4gIERvd25sb2FkV29ya2Jvb2sgPSAnZG93bmxvYWQtd29ya2Jvb2snLFxuXG4gIEVkaXRBbGlhc2VzRGlhbG9nID0gJ2VkaXQtYWxpYXNlcy1kaWFsb2cnLFxuICBFeGVjdXRlRXh0ZXJuYWxNZW51SXRlbSA9ICdleGVjdXRlLWV4dGVybmFsLW1lbnUtaXRlbScsXG4gIEV4cG9ydENyb3NzdGFiID0gJ2V4cG9ydC1jcm9zc3RhYicsXG4gIEV4cG9ydENyb3NzdGFiQ3N2RG93bmxvYWQgPSAnZXhwb3J0LWNyb3NzdGFiLWNzdi1kb3dubG9hZCcsXG4gIEV4cG9ydENyb3NzdGFiRXhjZWxEb3dubG9hZCA9ICdleHBvcnQtY3Jvc3N0YWItZXhjZWwtZG93bmxvYWQnLFxuICBFeHBvcnREYXRhID0gJ2V4cG9ydC1kYXRhJyxcbiAgRXhwb3J0RGF0YURvd25sb2FkID0gJ2V4cG9ydC1kYXRhLWRvd25sb2FkJyxcbiAgRXhwb3J0SW1hZ2UgPSAnZXhwb3J0LWltYWdlJyxcbiAgRXhwb3J0UGRmID0gJ2V4cG9ydC1wZGYnLFxuICBFeHBvcnRQZGZEb3dubG9hZCA9ICdleHBvcnQtcGRmLWRvd25sb2FkJyxcbiAgRXhwb3J0UG93ZXJwb2ludCA9ICdleHBvcnQtcG93ZXJwb2ludCcsXG4gIEV4cG9ydFBvd2VycG9pbnREb3dubG9hZCA9ICdleHBvcnQtcG93ZXJwb2ludC1kb3dubG9hZCcsXG5cbiAgRmluZFBhcmFtZXRlciA9ICdmaW5kLXBhcmFtZXRlcicsXG5cbiAgR2V0QWN0aXZlVGFibGVzID0gJ2dldC1hY3RpdmUtdGFibGVzJyxcbiAgR2V0QWxsRGF0YVNvdXJjZXMgPSAnZ2V0LWFsbC1kYXRhLXNvdXJjZXMnLFxuICBHZXRBbm5vdGF0aW9ucyA9ICdnZXQtYW5ub3RhdGlvbnMnLFxuICBHZXRDYXRlZ29yaWNhbERvbWFpbiA9ICdnZXQtY2F0ZWdvcmljYWwtZG9tYWluJyxcbiAgR2V0Q29ubmVjdGlvbkRlc2NyaXB0aW9uU3VtbWFyaWVzID0gJ2dldC1jb25uZWN0aW9uLWRlc2NyaXB0aW9uLXN1bW1hcmllcycsXG4gIEdldEN1cnJlbnRTcmMgPSAnZ2V0LWN1cnJlbnQtc3JjJyxcbiAgR2V0Q3VzdG9tVmlld3MgPSAnZ2V0LWN1c3RvbS12aWV3cycsXG4gIEdldERhc2hib2FyZEZpbHRlcnMgPSAnZ2V0LWRhc2hib2FyZC1maWx0ZXJzJyxcbiAgR2V0RGF0YVNvdXJjZSA9ICdnZXQtZGF0YXNvdXJjZScsXG4gIEdldERhdGFTb3VyY2VEYXRhID0gJ2dldC1kYXRhc291cmNlLWRhdGEnLFxuICBHZXREYXRhU291cmNlcyA9ICdnZXQtZGF0YS1zb3VyY2VzJyxcbiAgR2V0RGF0YVN1bW1hcnlEYXRhID0gJ2dldC1zdW1tYXJ5LWRhdGEnLFxuICBHZXREYXRhU3VtbWFyeURhdGFSZWFkZXIgPSAnZ2V0LXN1bW1hcnktZGF0YS1yZWFkZXInLFxuICBHZXREYXRhVGFibGVSZWFkZXJQYWdlID0gJ2dldC1kYXRhLXRhYmxlLXJlYWRlci1wYWdlJyxcbiAgR2V0RW1iZWRkaW5nQWJzdHJhY3RRdWVyeVdpdGhEYXRhTW9kZWwgPSAnZ2V0LWVtYmVkZGluZy1hYnN0cmFjdC1xdWVyeS13aXRoLWRhdGEtbW9kZWwnLFxuICBHZXRFbWJlZGRpbmdDbGllbnRJbmZvID0gJ2dldC1lbWJlZGRpbmctY2xpZW50LWluZm8nLFxuICBHZXRWaXpTdGF0ZVdpdGhEYXRhTW9kZWwgPSAnZ2V0LXZpei1zdGF0ZS13aXRoLWRhdGEtbW9kZWwnLFxuICBHZXRFeHBvcnRDcm9zc3RhYlNoZWV0TWFwID0gJ2dldC1leHBvcnQtY3Jvc3N0YWItc2hlZXQtbWFwJyxcbiAgR2V0RXhwb3J0UGRmT3B0aW9ucyA9ICdnZXQtZXhwb3J0LXBkZi1vcHRpb25zJyxcbiAgR2V0RmllbGQgPSAnZ2V0LWZpZWxkJyxcbiAgR2V0RmllbGRBbmREYXRhU291cmNlID0gJ2dldC1maWVsZC1hbmQtZGF0YXNvdXJjZScsXG4gIEdldFZpc3VhbFNwZWNpZmljYXRpb24gPSAnZ2V0LXZpc3VhbC1zcGVjaWZpY2F0aW9uJyxcbiAgR2V0RmlsdGVycyA9ICdnZXQtZmlsdGVycycsXG4gIEdldEZvbnRzID0gJ2dldC1mb250cycsXG4gIEdldEhpZ2hsaWdodGVkTWFya3MgPSAnZ2V0LWhpZ2hsaWdodGVkLW1hcmtzJyxcbiAgR2V0Sm9pbkRlc2NyaXB0aW9uID0gJ2dldC1qb2luLWRlc2NyaXB0aW9uJyxcbiAgR2V0TG9naWNhbFRhYmxlRGF0YSA9ICdnZXQtbG9naWNhbC10YWJsZS1kYXRhJyxcbiAgR2V0TG9naWNhbFRhYmxlRGF0YVJlYWRlciA9ICdnZXQtbG9naWNhbC10YWJsZS1kYXRhLXJlYWRlcicsXG4gIEdldExvZ2ljYWxUYWJsZXMgPSAnZ2V0LWxvZ2ljYWwtdGFibGVzJyxcbiAgR2V0UGFyYW1ldGVyc0ZvclNoZWV0ID0gJ2dldC1wYXJhbWV0ZXJzLWZvci1zaGVldCcsXG4gIEdldFB1bHNlQ2F0ZWdvcmljYWxEb21haW4gPSAnZ2V0LXB1bHNlLWNhdGVnb3JpY2FsLWRvbWFpbicsXG4gIEdldFB1bHNlRmlsdGVycyA9ICdnZXQtcHVsc2UtZmlsdGVycycsXG4gIEdldFB1bHNlVGltZURpbWVuc2lvbiA9ICdnZXQtcHVsc2UtdGltZS1kaW1lbnNpb24nLFxuICBHZXRSYW5nZURvbWFpbiA9ICdnZXQtcmFuZ2UtZG9tYWluJyxcbiAgR2V0U2VsZWN0ZWRNYXJrcyA9ICdnZXQtc2VsZWN0ZWQtbWFya3MnLFxuICBHZXRTaGFyZWRGaWx0ZXIgPSAnZ2V0LXNoYXJlZC1maWx0ZXInLFxuICBHZXRUb29sdGlwVGV4dCA9ICdnZXQtdG9vbHRpcC10ZXh0JyxcbiAgR2V0VW5kZXJseWluZ0RhdGEgPSAnZ2V0LXVuZGVybHlpbmctZGF0YScsXG4gIEdldFVuZGVybHlpbmdUYWJsZURhdGEgPSAnZ2V0LXVuZGVybHlpbmctdGFibGUtZGF0YScsXG4gIEdldFVuZGVybHlpbmdUYWJsZURhdGFSZWFkZXIgPSAnZ2V0LXVuZGVybHlpbmctdGFibGUtZGF0YS1yZWFkZXInLFxuICBHZXRVbmRlcmx5aW5nVGFibGVzID0gJ2dldC11bmRlcmx5aW5nLXRhYmxlcycsXG5cbiAgSGllcmFyY2hpY2FsRmlsdGVyID0gJ2hpZXJhY2hpY2FsLWZpbHRlcicsXG5cbiAgSW5pdGlhbGl6ZUV4dGVuc2lvbiA9ICdpbml0aWFsaXplLWV4dGVuc2lvbicsXG5cbiAgTW92ZUFuZFJlc2l6ZVpvbmVzID0gJ21vdmUtYW5kLXJlc2l6ZS16b25lcycsXG4gIE1vdmVNYXJrc0NhcmRGaWVsZCA9ICdtb3ZlLW1hcmtzLWNhcmQtZmllbGQnLFxuXG4gIFJhaXNlTGVhdmVNYXJrTmF2Tm90aWZpY2F0aW9uID0gJ3JhaXNlLWxlYXZlLW1hcmstbmF2LW5vdGlmaWNhdGlvbicsXG4gIFJhaXNlSG92ZXJUdXBsZU5vdGlmaWNhdGlvbiA9ICdyYWlzZS1ob3Zlci10dXBsZS1ub3RpZmljYXRpb24nLFxuICBSYWlzZVNlbGVjdFR1cGxlc05vdGlmaWNhdGlvbiA9ICdyYWlzZS1zZWxlY3QtdHVwbGVzLW5vdGlmaWNhdGlvbicsXG4gIFJlZG8gPSAncmVkbycsXG4gIFJlZnJlc2hEYXRhU291cmNlID0gJ3JlZnJlc2gtZGF0YS1zb3VyY2UnLFxuICBSZWxlYXNlRGF0YVRhYmxlUmVhZGVyID0gJ3JlbGVhc2UtZGF0YS10YWJsZS1yZWFkZXInLFxuICBSZW1vdmVBbm5vdGF0aW9uID0gJ3JlbW92ZS1hbm5vdGF0aW9uJyxcbiAgUmVtb3ZlQ3VzdG9tVmlldyA9ICdyZW1vdmUtY3VzdG9tLXZpZXcnLFxuICBSZW1vdmVFeHRlcm5hbE1lbnVJdGVtID0gJ3JlbW92ZS1leHRlcm5hbC1tZW51LWl0ZW0nLFxuICBSZW5hbWVFeHRlcm5hbE1lbnUgPSAncmVuYW1lLWV4dGVybmFsLW1lbnUnLFxuICBSZXBsYXlBbmltYXRpb24gPSAncmVwbGF5LWFuaW1hdGlvbicsXG4gIFJldmVydFN0b3J5UG9pbnQgPSAncmV2ZXJ0LXN0b3J5LXBvaW50JyxcbiAgUmV2ZXJ0V29ya2Jvb2sgPSAncmV2ZXJ0LXdvcmtib29rJyxcblxuICBTYXZlRXh0ZW5zaW9uU2V0dGluZ3MgPSAnc2F2ZS1leHRlbnNpb24tc2V0dGluZ3MnLFxuICBTYXZlV29ya2Jvb2tBc0N1c3RvbVZpZXcgPSAnc2F2ZS13b3JrYm9vay1hcy1jdXN0b20tdmlldycsXG4gIFNlbGVjdEJ5VmFsdWUgPSAnc2VsZWN0LWJ5LXZhbHVlJyxcbiAgU2V0QWN0aXZlQ3VzdG9tVmlld0FzRGVmYXVsdCA9ICdzZXQtYWN0aXZlLWN1c3RvbS12aWV3LWFzLWRlZmF1bHQnLFxuICBTZXRBdXRvVXBkYXRlID0gJ3NldC1hdXRvLXVwZGF0ZScsXG4gIFNldENsaWNrVGhyb3VnaCA9ICdzZXQtY2xpY2stdGhyb3VnaCcsXG4gIFNldFZpelN0YXRlV2l0aERhdGFNb2RlbCA9ICdzZXQtdml6LXN0YXRlLXdpdGgtZGF0YS1tb2RlbCcsXG4gIFNldFNoZWV0U2l6ZSA9ICdzZXQtc2hlZXQtc2l6ZScsXG4gIFNldFpvbmVWaXNpYmlsaXR5ID0gJ3NldC16b25lLXZpc2liaWxpdHknLFxuICBTaGFyZSA9ICdzaGFyZScsXG4gIFNob3dDdXN0b21WaWV3ID0gJ3Nob3ctY3VzdG9tLXZpZXcnLFxuICBTcGxpY2VNYXJrc0NhcmRGaWVsZHMgPSAnc3BsaWNlLW1hcmtzLWNhcmQtZmllbGRzJyxcblxuICBUZXN0Q29udmVyc2lvblZlcmIgPSAndGVzdC1jb252ZXJzaW9uLXZlcmInLFxuXG4gIFVuZG8gPSAndW5kbycsXG4gIFVwZGF0ZUN1c3RvbVZpZXcgPSAndXBkYXRlLWN1c3RvbS12aWV3JyxcblxuICBWaXpBUEkgPSAndml6LWFwaScsXG59XG4iLCJleHBvcnQgZW51bSBBc2tEYXRhT3B0aW9uTmFtZXMge1xuICB0b2tlbiA9ICd0b2tlbicsXG4gIG9yaWdpbiA9ICdvcmlnaW4nLFxuICBzaG93RW1iZWQgPSAnc2hvd0VtYmVkJyxcbiAgc2hvd1BpbiA9ICdzaG93UGluJyxcbiAgc2hvd1NhdmUgPSAnc2hvd1NhdmUnLFxuICBzaG93U2hhcmUgPSAnc2hvd1NoYXJlJyxcbiAgZGVidWcgPSAnOmpzZGVidWcnLFxuICBBcGlJRCA9ICc6YXBpSUQnLFxuICBBcGlFeHRlcm5hbFZlcnNpb24gPSAnOmFwaUV4dGVybmFsVmVyc2lvbicsXG4gIEFwaUludGVybmFsVmVyc2lvbiA9ICc6YXBpSW50ZXJuYWxWZXJzaW9uJyxcbiAgQXNrRGF0YVdlYkNvbXBvbmVudCA9ICc6YXNrRGF0YVdlYkNvbXBvbmVudCcsXG59XG4iLCJleHBvcnQgZW51bSBQdWxzZU9wdGlvbk5hbWVzIHtcbiAgZW1iZWQgPSAnZW1iZWQnLFxuICB0b2tlbiA9ICd0b2tlbicsXG4gIGRpc2FibGVFeHBsb3JlRmlsdGVyID0gJ2Rpc2FibGVFeHBsb3JlRmlsdGVyJyxcbiAgbGF5b3V0ID0gJ2VtYmVkX2xheW91dCcsXG4gIHRoZW1lID0gJ2VtYmVkX3RoZW1lJyxcbiAgQXBpRXh0ZXJuYWxWZXJzaW9uID0gJzphcGlFeHRlcm5hbFZlcnNpb24nLFxuICBBcGlJbnRlcm5hbFZlcnNpb24gPSAnOmFwaUludGVybmFsVmVyc2lvbicsXG4gIFB1bHNlV2ViQ29tcG9uZW50ID0gJzpwdWxzZVdlYkNvbXBvbmVudCcsXG59XG4iLCIvKipcbiAqIFRoZXNlIHN0cmluZ3Mgd2VyZSAqbWFudWFsbHkgY29waWVkKiBmcm9tIHRoZSBzZXJ2ZXIsXG4gKiB3b3JrZ3JvdXAvc3JjL3NpbG9zL3RhYmxlYXUtc2VydmVyL2xpYnJhcmllcy90YWItY29udHJvbGxlci12aXpxbC9zcmMvY29tL3RhYmxlYXVzb2Z0d2FyZS9cbiAqIGNvbnRyb2xsZXIvdml6cWwvY29uc3RhbnRzL1BhcmFtZXRlcktleXMuamF2YSNMOVxuICogc2hvdWxkIGJlIGV4cG9ydGVkIGluc3RlYWRcbiAqIHBhcmFtZXRlcnMgdGhhdCB2aXpxbCB3aWxsIGFjY2VwdCBpbiBhbiBlbWJlZGRpbmcgVVJMXG4gKiovXG5lbnVtIFZxbFBhcmFtZXRlck5hbWVzIHtcbiAgT05FID0gJzEnLFxuICBBTEVSVFMgPSAnOmFsZXJ0cycsXG4gIEFMSUFTID0gJ2FsaWFzJyxcbiAgQUxMT1dfREVGRVJSRURfQk9PVFNUUkFQID0gJzphbGxvd0RlZmVycmVkQm9vdHN0cmFwJyxcbiAgQUxMT1dfQVVUT0dFTl9XT1JLU0hFRVRfUEhPTkVfTEFZT1VUUyA9ICdhbGxvd0F1dG9nZW5Xb3Jrc2hlZXRQaG9uZUxheW91dHMnLFxuICBBUElfSUQgPSAnOmFwaUlEJyxcbiAgQVBQID0gJzphcHAnLFxuICBBVFRBQ0hNRU5UID0gJ2F0dGFjaG1lbnQnLFxuICBJU19JUEFEX0FQUCA9ICdhcHAnLFxuICBBTklNQVRFX1RSQU5TSVRJT04gPSAnOmFuaW1hdGVfdHJhbnNpdGlvbicsXG4gIEFTQ0VORElORyA9ICdhc2NlbmRpbmcnLFxuICBBVVRIRU5USUNBVElPTiA9ICdhdXRoZW50aWNhdGlvbicsXG4gIEFUVFJJQlVURVMgPSAnYXR0cmlidXRlcycsXG4gIEFVVEhPUklOR19TSEVFVCA9ICc6YXV0aFNoZWV0JyxcbiAgQVhJUyA9ICdheGlzJyxcbiAgQk9PVFNUUkFQX1dIRU5fTk9USUZJRUQgPSAnOmJvb3RzdHJhcFdoZW5Ob3RpZmllZCcsXG4gIEJST1dTRVJfQkFDS19CVVRUT05fVU5ETyA9ICc6YnJvd3NlckJhY2tCdXR0b25VbmRvJyxcbiAgQlJPV1NFUl9SRU5ERVJJTkdfT04gPSAnaXNCcm93c2VyUmVuZGVyaW5nJyxcbiAgQlJPV1NFUl9SRU5ERVJJTkdfVEhSRVNIT0xEID0gJ2Jyb3dzZXJSZW5kZXJpbmdUaHJlc2hvbGQnLFxuICBDSEFSU0VUID0gJ2NoYXJzZXQnLFxuICBDTElFTlRfRElNRU5TSU9OID0gJ2NsaWVudERpbWVuc2lvbicsXG4gIENMSUVOVF9JUCA9ICdjbGllbnRfaXAnLFxuICBDTElFTlRfTlVNID0gJ2NsaWVudE51bScsXG4gIENPTE9OX0VNQkVEREVEID0gJzplbWJlZGRlZCcsXG4gIENPTE9OX01PQklMRSA9ICc6bW9iaWxlJyxcbiAgQ09MT05fREVFUF9MSU5LSU5HX0RJU0FCTEVEID0gJzpkZWVwTGlua2luZ0Rpc2FibGVkJyxcbiAgQ09MT05fV0FURVJNQVJLID0gJzp3YXRlcm1hcmsnLFxuICBDT01NRU5UUyA9ICc6Y29tbWVudHMnLFxuICBDT01NRU5USU5HX0VOQUJMRUQgPSAnOmNvbW1lbnRpbmdFbmFibGVkJyxcbiAgQ09NTUVOVElOR19NRU5USU9OU19FTkFCTEVEID0gJzpjb21tZW50aW5nTWVudGlvbnMnLFxuICBDT05ORUNUSU9OID0gJ2Nvbm5lY3Rpb24nLFxuICBDUkVBVEVEX0JZX0ZFQVRVUkUgPSAnY3JlYXRlZEJ5RmVhdHVyZScsXG4gIENSWVBURURfUEFTU1dPUkQgPSAnY3J5cHRlZCcsXG4gIENTU0RFQlVHID0gJzpjc3NkZWJ1ZycsXG4gIENTViA9ICdjc3YnLFxuICBDVVNUT01fVklFV1MgPSAnOmN1c3RvbVZpZXdzJyxcbiAgQ1YgPSAnOmN2JyxcbiAgQ1ZfSUQgPSAnY3ZJZCcsXG4gIERBU0hCT0FSRF9QT1JUX1NJWkUgPSAnZGFzaGJvYXJkUG9ydFNpemUnLFxuICBEQVRBX0RFVEFJTFMgPSAnOmRhdGFEZXRhaWxzJyxcbiAgREFUQVNPVVJDRSA9ICdkYXRhc291cmNlJyxcbiAgREVCVUcgPSAnOmRlYnVnJyxcbiAgREVMQVkgPSAnOmRlbGF5JyxcbiAgREVQVEggPSAnZGVwdGgnLFxuICBERVZJQ0VfVFlQRSA9ICc6ZGV2aWNlJyxcbiAgREVWSUNFX1BJWEVMX1JBVElPID0gJ2RldmljZVBpeGVsUmF0aW8nLFxuICBERVZJQ0VfUFJFVklFV19NT0RFID0gJzpkZXZpY2VwcmV2aWV3bW9kZScsXG4gIERJTUVOU0lPTlMgPSAnOmRpbWVuc2lvbnMnLFxuICBESVNBQkxFX1NIQVJFRF9TRVNTSU9OUyA9ICc6ZGlzYWJsZV9zaGFyZWRfc2Vzc2lvbnMnLFxuICBESVNBQkxFX1VSTF9BQ1RJT05TX1BPUFVQUyA9ICc6ZGlzYWJsZVVybEFjdGlvbnNQb3B1cHMnLFxuICBESVJFQ1RJT04gPSAnZGlyZWN0aW9uJyxcbiAgRElTUExBWV9PVkVSTEFZID0gJzpkaXNwbGF5X292ZXJsYXknLFxuICBESVNQTEFZX1NIQVJFID0gJzpkaXNwbGF5X3NoYXJlJyxcbiAgRElTUExBWV9TUElOTkVSID0gJzpkaXNwbGF5X3NwaW5uZXInLFxuICBESVNQTEFZX1NUQVRJQ19JTUFHRSA9ICc6ZGlzcGxheV9zdGF0aWNfaW1hZ2UnLFxuICBESVNQTEFZX1RBQlMgPSAnZGlzcGxheV90YWJzJyxcbiAgRElTUExBWV9WSUVXX0NPVU5UID0gJzpkaXNwbGF5X2NvdW50JyxcbiAgSUdOT1JFX1NUSUNLWV9TRVNTSU9OID0gJzppZ25vcmVfc3RpY2t5X3Nlc3Npb24nLFxuICBJTkNSRU1FTlRfVklFV19DT1VOVCA9ICc6aW5jcmVtZW50X3ZpZXdfY291bnQnLFxuICBET0NNT0RFID0gJ2RvY21vZGUnLFxuICBET01BSU4gPSAnZG9tYWluJyxcbiAgRE9fV09SSyA9ICdkb193b3JrJyxcbiAgRFggPSAnZHgnLFxuICBEWSA9ICdkeScsXG4gIEVESVRfREFUQV9BTEVSVCA9ICc6ZWRpdERhdGFBbGVydCcsXG4gIEVNQkVEID0gJzplbWJlZCcsXG4gIEVNQkVEREVEID0gJ2VtYmVkZGVkJyxcbiAgRU5DUllQVEVEID0gJ2VuY3J5cHRlZCcsXG4gIEFQSV9FWFRFUk5BTF9WRVJTSU9OID0gJzphcGlFeHRlcm5hbFZlcnNpb24nLFxuICBBUElfSU5URVJOQUxfVkVSU0lPTiA9ICc6YXBpSW50ZXJuYWxWZXJzaW9uJyxcbiAgRVhDTFVERSA9ICdleGNsdWRlJyxcbiAgRVhQT1JUX0ZPUk1BVCA9ICc6ZXhwb3J0X2Zvcm1hdCcsXG4gIEZJRUxETkFNRSA9ICdmaWVsZG5hbWUnLFxuICBGSUVMRF9OQU1FID0gJ2ZpZWxkX25hbWUnLFxuICBGSUVMRF9TRVAgPSAnZmllbGRfc2VwJyxcbiAgRklMRSA9ICdmaWxlJyxcbiAgRklMVEVSX1RJTEVfU0laRSA9ICdmaWx0ZXJUaWxlU2l6ZScsXG4gIEZOID0gJ2ZuJyxcbiAgRk9DVVMgPSAnZm9jdXMnLFxuICBGT1JDRV9DQUNIRSA9ICdmb3JjZV9jYWNoZScsXG4gIEZPUk1BVCA9ICdmb3JtYXQnLFxuICBGT1JNQVRfREFUQV9WQUxVRV9MT0NBTExZID0gJ2Zvcm1hdERhdGFWYWx1ZUxvY2FsbHknLFxuICBGUk9NX1dHID0gJzpmcm9tX3dnJyxcbiAgR1JBUEhRTF9EQVRBQkFTRV9JRCA9ICc6Z3JhcGhRTERhdGFiYXNlSWQnLFxuICBHUkFQSFFMX1RBQkxFX0lEID0gJzpncmFwaFFMVGFibGVJZCcsXG4gIEdVSUQgPSAnOmd1aWQnLFxuICBIID0gJ2gnLFxuICBISURERU4gPSAnaGlkZGVuJyxcbiAgSElERV9DTE9TRV9CVVRUT04gPSAnOmhpZGVDbG9zZUJ1dHRvbicsXG4gIEhJREVfRURJVF9CVVRUT04gPSAnOmhpZGVFZGl0QnV0dG9uJyxcbiAgSElERV9FRElUX0lOX0RFU0tUT1BfQlVUVE9OID0gJzpoaWRlRWRpdEluRGVza3RvcEJ1dHRvbicsXG4gIEhJR0hfRFBJID0gJzpoaWdoZHBpJyxcbiAgSU1BR0VfU0laRV9MSU1JVCA9ICdpbWFnZVNpemVMaW1pdCcsXG4gIFRSQU5TUEFSRU5UX0xJTkVfTUFSS1NfTElNSVQgPSAndHJhbnNwYXJlbnRMaW5lTWFya0xpbWl0JyxcbiAgQ0xJRU5UX1JFTkRFUl9QSVhFTF9MSU1JVCA9ICdjbGllbnRSZW5kZXJQaXhlbExpbWl0JyxcbiAgSU4gPSAnaW4nLFxuICBJTlNUQU5DRV9JRCA9ICc6aWlkJyxcbiAgSVNfR1VFU1RfUkVESVJFQ1RfRlJPTV9WSVpQT1JUQUwgPSAnOmlzR3Vlc3RSZWRpcmVjdEZyb21WaXpwb3J0YWwnLFxuICBJU19NQVJLX0FOSU1BVElPTl9FTkFCTEVEID0gJ2lzTWFya0FuaW1hdGlvbkVuYWJsZWQnLFxuICBJU19WSVpQT1JUQUwgPSAnOmlzVml6UG9ydGFsJyxcbiAgSU5QVVRfID0gJ2lucHV0X3N0cmluZycsXG4gIEpTREVCVUcgPSAnOmpzZGVidWcnLFxuICBKU09OID0gJ2pzb24nLFxuICBKU09OX09OTFkgPSAnOmpzb25Pbmx5JyxcbiAgS0VFUEZJTEUgPSAna2VlcGZpbGUnLFxuICBLRVkgPSAna2V5JyxcbiAgTEFOR1VBR0UgPSAnbGFuZ3VhZ2UnLFxuICBMQU5HVUFHRV9SRVFVRVNURUQgPSAnOmxhbmd1YWdlJyxcbiAgTElOS1RBUkdFVCA9ICc6bGlua3RhcmdldCcsXG4gIExPQURfT1JERVJfSUQgPSAnOmxvYWRPcmRlcklEJywgLy8gdXNlZCBmb3IgUHVibGljXG4gIExPQURfTkVXRVNUX1JFVklTSU9OID0gJzpsb2FkTmV3ZXN0UmV2aXNpb24nLFxuICBMT0NBTF9QQVRIUyA9ICc6bG9jYWxQYXRocycsXG4gIExPQ0FMRSA9ICdsb2NhbGUnLFxuICBMT0NBVElPTl9JRCA9ICdsb2NhdGlvbmlkJyxcbiAgTE9DQVRJT05fVFlQRSA9ICdsb2NhdGlvbnR5cGUnLFxuICBXT1JLQk9PS19MT0NBTEUgPSAnd29ya2Jvb2tMb2NhbGUnLFxuICBNQVhST1dTID0gJ21heHJvd3MnLFxuICBNQVhfQUdFID0gJ21heEFnZScsXG4gIE1BWF9ST1dTID0gJ21heFJvd3MnLFxuICBNRVRIT0QgPSAnbWV0aG9kJyxcbiAgTU9CSUxFID0gJ21vYmlsZScsXG4gIE1PRElGSUVSID0gJ21vZGlmaWVyJyxcbiAgTkFNRSA9ICduYW1lJyxcbiAgTkFWX1RZUEUgPSAnbmF2VHlwZScsXG4gIE5BVl9TUkMgPSAnbmF2U3JjJyxcbiAgTk9BVFRBQ0hNRU5UID0gJ25vLWF0dGFjaG1lbnQnLFxuICBOT19PVkVSV1JJVEUgPSAnbm9fb3ZlcndyaXRlJyxcbiAgT1BFTl9BVVRIT1JJTkdfSU5fVE9QX1dJTkRPVyA9ICc6b3BlbkF1dGhvcmluZ0luVG9wV2luZG93JyxcbiAgT1BFTklEX0hEID0gJzpvcGVuaWRfaGQnLFxuICBPUEVOSURfTE9HSU5fSElOVCA9ICc6b3BlbmlkX2xvZ2luX2hpbnQnLFxuICBPQVVUSFJFUVVFU1QgPSAnb2F1dGhyZXF1ZXN0JyxcbiAgT0FVVEhfQ1JFREVOVElBTF9JRFMgPSAnb2F1dGhfY3JlZGVudGlhbF9pZHMnLFxuICBPRkZMSU5FX01PREUgPSAnOm9mZmxpbmVtb2RlJyxcbiAgT1JJR0lOID0gJzpvcmlnaW4nLFxuICBPVkVSTEFZID0gJzpvdmVybGF5JyxcbiAgUCA9ICdwJyxcbiAgUEFUSCA9ICdwYXRoJyxcbiAgUEFORV9SRVNPTFZFUl9YID0gJ3BhbmVSZXNvbHZlclgnLFxuICBQQU5FX1JFU09MVkVSX1kgPSAncGFuZVJlc29sdmVyWScsXG4gIFBBUkFNID0gJ3BhcmFtJyxcbiAgUEFSRU5UX0lEID0gJ3BhcmVudF9pZCcsXG4gIFBBU1NXT1JEID0gJ3Bhc3N3b3JkJyxcbiAgUEFUVEVSTiA9ICdwYXR0ZXJuJyxcbiAgUElYRUxfUkFUSU8gPSAnOnBpeGVscmF0aW8nLFxuICBQUkVGSVggPSAnOnByZWZpeCcsXG4gIFBSRVZJRVcgPSAnOnByZXZpZXcnLFxuICBQUklNQVJZX0NPTlRFTlRfVVJMID0gJ3ByaW1hcnlfY29udGVudF91cmwnLFxuICBQUk9KRUNUID0gJ3Byb2plY3QnLFxuICBQUk9UT0NPTCA9ICdwcm90b2NvbCcsXG4gIFBTRVVETyA9ICc6cHNldWRvJyxcbiAgUVVFUlkgPSAncXVlcnknLFxuICBSID0gJ3InLFxuICBSQU5HRV9UWVBFID0gJ3JhbmdlX3R5cGUnLFxuICBSRUNPUkRfU0VQID0gJ3JlY29yZF9zZXAnLFxuICBSRUNPUkRfQ0xJRU5UX1BFUkZPUk1BTkNFID0gJzpyZWNvcmRfY2xpZW50X3BlcmZvcm1hbmNlJyxcbiAgUkVDT1JEX1BFUkZPUk1BTkNFID0gJzpyZWNvcmRfcGVyZm9ybWFuY2UnLFxuICBSRUNPVkVSX09MRF9TRVNTSU9OX0lEID0gJzpyZWNvdmVyX29sZF9zZXNzaW9uX2lkJyxcbiAgUkVDT1ZFUl9TRVNTSU9OX1NUQVRFX1RJQ0tFVFMgPSAnOnJlY292ZXJfc2Vzc2lvbl9zdGF0ZV90aWNrZXRzJyxcbiAgUkVGUkVTSCA9ICc6cmVmcmVzaCcsXG4gIFJFRlJFU0hVTk1PRElGSUVEID0gJzpyZWZyZXNodW5tb2RpZmllZCcsXG4gIFJFR0lPTiA9ICdyZWdpb24nLFxuICBSRUxPQURfT05fQ1VTVE9NX1ZJRVdfU0FWRSA9ICc6cmVsb2FkT25DdXN0b21WaWV3U2F2ZScsXG4gIFJFTkRFUiA9ICc6cmVuZGVyJyxcbiAgUkVOREVSX01BUFNfQ0xJRU5UX1NJREUgPSAncmVuZGVyTWFwc0NsaWVudFNpZGUnLFxuICBSRVRSWSA9ICc6cmV0cnknLFxuICBSRVVTRSA9ICdyZXVzZScsXG4gIFJFVVNFX0ZPUkVWRVIgPSAncmV1c2VfZm9yZXZlcicsXG4gIFJFVkVSVCA9ICc6cmV2ZXJ0JyxcbiAgU0FWRV9EQl9QQVNTV09SRFMgPSAnc2F2ZV9kYl9wYXNzd29yZHMnLFxuICBTRUxFQ1RfWCA9ICdzZWxlY3RfeCcsXG4gIFNFTEVDVF9ZID0gJ3NlbGVjdF95JyxcbiAgU0VTU0lPTl9GRUFUVVJFX1BSRUZJWCA9ICc6ZmZfJyxcbiAgU0VTU0lPTl9GTEFHUyA9ICc6c2Vzc2lvbl9mZWF0dXJlX2ZsYWdzJyxcbiAgU0hBUkVfQlVUVE9OID0gJ3NoYXJlX2J1dHRvbicsXG4gIFNIRUVUX0lEID0gJ3NoZWV0X2lkJyxcbiAgU0hBUkVEID0gJ3NoYXJlZCcsXG4gIFNIT1dBTEwgPSAnc2hvd2FsbCcsXG4gIFNIT1dfQVBQX0JBTk5FUiA9ICc6c2hvd0FwcEJhbm5lcicsXG4gIFNIT1dfQVNLX0RBVEEgPSAnOnNob3dBc2tEYXRhJyxcbiAgU0hPV19QQVJBTVMgPSAnc2hvd1BhcmFtcycsXG4gIFNIT1dfU0hBUkVfT1BUSU9OUyA9ICc6c2hvd1NoYXJlT3B0aW9ucycsXG4gIFNJWkUgPSAnOnNpemUnLFxuICBTT1VSQ0UgPSAnc291cmNlJyxcbiAgU1RBVEUgPSAnc3RhdGUnLFxuICBTVElDS1lfU0VTU0lPTl9LRVkgPSAnc3RpY2t5U2Vzc2lvbktleScsXG4gIFNVQlNDUklQVElPTlMgPSAnOnN1YnNjcmlwdGlvbnMnLFxuICBTVU1NQVJZID0gJ3N1bW1hcnknLFxuICBTVVBQUkVTU19ERUZBVUxUX0VESVRfQkVIQVZJT1IgPSAnOnN1cHByZXNzRGVmYXVsdEVkaXRCZWhhdmlvcicsXG4gIFNZTkNfU0VTU0lPTiA9ICc6c3luY19zZXNzaW9uJyxcbiAgU1lOQ19TRVNTSU9OX1NUQVRFID0gJ3N5bmNfc2Vzc2lvbl9zdGF0ZScsXG4gIFRBQlMgPSAnOnRhYnMnLFxuICBUQVJHRVQgPSAndGFyZ2V0JyxcbiAgVEFSR0VUX1NJVEUgPSAndGFyZ2V0X3NpdGUnLFxuICBUT09MQkFSID0gJzp0b29sYmFyJyxcbiAgVE9PTFRJUCA9ICc6dG9vbHRpcCcsXG4gIFRTID0gJ3RzJyxcbiAgVU5ERVJMWUlOR19UQUJMRV9JRCA9ICd1bmRlcmx5aW5nX3RhYmxlX2lkJyxcbiAgVU5ERVJMWUlOR19UQUJMRV9DQVBUSU9OID0gJ3VuZGVybHlpbmdfdGFibGVfY2FwdGlvbicsXG4gIFVQREFURV9UWVBFID0gJ3VwZGF0ZV90eXBlJyxcbiAgVVNFX0dVRVNUID0gJzp1c2VHdWVzdCcsXG4gIFVTRV9JTkxJTkVfSU1BR0VTID0gJ3VzZV9pbmxpbmVfaW1hZ2VzJyxcbiAgVVNFUkFHRU5UID0gJ3VzZXJhZ2VudCcsXG4gIFVTRVJOQU1FID0gJ3VzZXJuYW1lJyxcbiAgVkFMVUUgPSAndmFsdWUnLFxuICBWRVJCT1NFX01PREUgPSAndmVyYm9zZU1vZGUnLFxuICBWSUVXX0lEID0gJ3ZpZXdzX2lkJyxcbiAgVklaX1NOQVBTSE9UX0lEID0gJ3Zpel9zbmFwc2hvdF9pZCcsXG4gIFZXID0gJzp2dycsXG4gIFcgPSAndycsXG4gIFdPUktTSEVFVF9QT1JUX1NJWkUgPSAnd29ya3NoZWV0UG9ydFNpemUnLFxuICBXQVRFUk1BUksgPSAnd2F0ZXJtYXJrJyxcbiAgV0FURVJNQVJLX01BUkdJTiA9ICc6d2F0ZXJtYXJrX21hcmdpbicsXG4gIFdCID0gJzp3YicsXG4gIFdISUNIID0gJ3doaWNoJyxcbiAgWCA9ICd4JyxcbiAgWSA9ICd5JyxcbiAgWklEID0gJ3ppZCcsXG4gIFpPTkVfSUQgPSAnem9uZV9pZCcsXG4gIEtFWUNIQUlOX1ZFUlNJT04gPSAna2V5Y2hhaW5fdmVyc2lvbicsXG4gIERBVEFTT1VSQ0VfSUQgPSAnZGF0YXNvdXJjZV9pZCcsXG4gIERBVEFTT1VSQ0VfTkFNRSA9ICdkYXRhc291cmNlX25hbWUnLFxuICBMRU5TX0lEID0gJ2xlbnNfaWQnLFxuICBXSURUSCA9ICd3aWR0aCcsXG4gIEhFSUdIVCA9ICdoZWlnaHQnLFxuXG4gIC8vIERlZmF1bHQgTGF5b3V0IHBhcmFtc1xuICBMQVlPVVRfVklFV1MgPSAndmlld3MnLFxuICBMQVlPVVRfTUVOVVMgPSAnbWVudXMnLFxuICBMQVlPVVRfR0VPTUVUUlkgPSAnZ2VvbWV0cnknLFxuICBMQVlPVVRfUEFHRVMgPSAncGFnZXMnLFxuICBMQVlPVVRfQ0FDSEVVUkwgPSAnY2FjaGV1cmwnLFxuICBMQVlPVVRfU0hFRVQgPSAnc2hlZXQnLFxuICBMQVlPVVRfREVQVEggPSAnZGVwdGgnLFxufVxuXG4vKipcbiAqIHBhcmFtZXRlcnMgdGhhdCBhcmUgb25seSByZWxldmFudCB3aGVuIHdvcmtpbmcgd2l0aCBUYWJsZWF1IFB1YmxpY1xuICogbWF5YmUgbm90IHJlYWxseSBuZWNlc3NyeSB0byBzcGxpdCB0aGVtIG91dFxuICovXG5lbnVtIFB1YmxpY1BhcmFtZXRlck5hbWVzIHtcbiAgU0hPV19WSVpfSE9NRSA9ICc6c2hvd1ZpekhvbWUnLFxuICAvLyBkaXNwbGF5IHZpZXcgY291bnRcbn1cblxuLyoqXG4gKiBNYXAgdGhlIHBhcmFtZXRlciBuYW1lcyBhcyB1c2VkIGluIHRoZSB1cmwgdG8gd2hhdCB3ZSBjYWxsIHRoZW0gcHVibGljbHkgaW4gdGhlIGVtYmVkZGluZyBsaWJyYXJ5LlxuICogVGhlIG9ubHkgcGFyYW1ldGVycyBsaXN0ZWQgaGVyZSBzaG91bGQgYmUgdGhlIG9uZXMgdGhhdCBnZXQgc2VudCB0byB2aXpxbFxuICogIC0gdGhpcyBzaG91bGQgbWF0Y2ggdGhlIGludGVyZmFjZSBhdCBleHRlcm5hbC1jb250cmFjdDpWaXpJbnRlcmZhY2VzOlZpelNldHRpbmdzXG4gKi9cbmV4cG9ydCBlbnVtIFZpek9wdGlvbk5hbWVzIHtcbiAgLy8gcHVibGljTmFtZSA9IGludGVybmFsU3RyaW5nVmFsdWVcbiAgU2l6ZSA9IFZxbFBhcmFtZXRlck5hbWVzLlNJWkUsXG4gIEVtYmVkID0gVnFsUGFyYW1ldGVyTmFtZXMuRU1CRUQsXG4gIEFwaUludGVybmFsVmVyc2lvbiA9IFZxbFBhcmFtZXRlck5hbWVzLkFQSV9JTlRFUk5BTF9WRVJTSU9OLFxuICBBcGlFeHRlcm5hbFZlcnNpb24gPSBWcWxQYXJhbWV0ZXJOYW1lcy5BUElfRVhURVJOQUxfVkVSU0lPTixcbiAgU2hvd1ZpekhvbWUgPSBQdWJsaWNQYXJhbWV0ZXJOYW1lcy5TSE9XX1ZJWl9IT01FLFxuICBKc2RlYnVnID0gVnFsUGFyYW1ldGVyTmFtZXMuSlNERUJVRyxcbiAgQm9vdHN0cmFwV2hlbk5vdGlmaWVkID0gVnFsUGFyYW1ldGVyTmFtZXMuQk9PVFNUUkFQX1dIRU5fTk9USUZJRUQsXG4gIE5hdlR5cGUgPSBWcWxQYXJhbWV0ZXJOYW1lcy5OQVZfVFlQRSxcbiAgTmF2U3JjID0gVnFsUGFyYW1ldGVyTmFtZXMuTkFWX1NSQyxcbiAgZGVidWcgPSBWcWxQYXJhbWV0ZXJOYW1lcy5KU0RFQlVHLFxuICBBcGlJRCA9IFZxbFBhcmFtZXRlck5hbWVzLkFQSV9JRCxcblxuICBkaXNhYmxlVXJsQWN0aW9uc1BvcHVwcyA9IFZxbFBhcmFtZXRlck5hbWVzLkRJU0FCTEVfVVJMX0FDVElPTlNfUE9QVVBTLFxuICBoaWRlVGFicyA9IFZxbFBhcmFtZXRlck5hbWVzLlRBQlMsXG4gIHRvb2xiYXIgPSBWcWxQYXJhbWV0ZXJOYW1lcy5UT09MQkFSLFxuICBkZXZpY2UgPSBWcWxQYXJhbWV0ZXJOYW1lcy5ERVZJQ0VfVFlQRSxcbiAgaW5zdGFuY2VJZFRvQ2xvbmUgPSBWcWxQYXJhbWV0ZXJOYW1lcy5JTlNUQU5DRV9JRCxcbiAgdG91Y2hPcHRpbWl6ZSA9IFZxbFBhcmFtZXRlck5hbWVzLk1PQklMRSxcbiAgaGlkZUVkaXRCdXR0b24gPSBWcWxQYXJhbWV0ZXJOYW1lcy5ISURFX0VESVRfQlVUVE9OLFxuICBoaWRlRWRpdEluRGVza3RvcEJ1dHRvbiA9IFZxbFBhcmFtZXRlck5hbWVzLkhJREVfRURJVF9JTl9ERVNLVE9QX0JVVFRPTixcbiAgc3VwcHJlc3NEZWZhdWx0RWRpdEJlaGF2aW9yID0gVnFsUGFyYW1ldGVyTmFtZXMuU1VQUFJFU1NfREVGQVVMVF9FRElUX0JFSEFWSU9SLFxuICBoaWRlQ2xvc2VCdXR0b24gPSBWcWxQYXJhbWV0ZXJOYW1lcy5ISURFX0NMT1NFX0JVVFRPTixcbn1cbiIsImltcG9ydCAqIGFzIGd1aWQgZnJvbSAnZ3VpZCc7XG5pbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgSU5URVJOQUxfQ09OVFJBQ1RfVkVSU0lPTiwgTW9kZWwsIE5vdGlmaWNhdGlvbklkLCBWZXJiSWQsIFZlcnNpb25OdW1iZXIgfSBmcm9tICcuLi9Kc0FwaUludGVybmFsQ29udHJhY3QnO1xuaW1wb3J0IHsgSW5pdGlhbGl6YXRpb25PcHRpb25zIH0gZnJvbSAnLi4vaW50ZXJmYWNlL0luaXRpYWxpemF0aW9uT3B0aW9ucyc7XG5pbXBvcnQgeyBDcm9zc0ZyYW1lUHJlcGFyZWRNZXNzYWdlIH0gZnJvbSAnLi9Dcm9zc0ZyYW1lUHJlcGFyZWRNZXNzYWdlJztcbmltcG9ydCB7XG4gIGlzQ29tbWFuZE1lc3NhZ2UsXG4gIGlzQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSxcbiAgaXNIYW5kc2hha2VNZXNzYWdlLFxuICBpc0luaXRNZXNzYWdlLFxuICBpc01lc3NhZ2UsXG4gIGlzTm90aWZpY2F0aW9uTWVzc2FnZSxcbn0gZnJvbSAnLi9NZXNzYWdlVHlwZUNoZWNrcyc7XG5pbXBvcnQge1xuICBDb21tYW5kTWVzc2FnZUhhbmRsZXIsXG4gIENvbW1hbmRSZXNwb25zZU1lc3NhZ2VIYW5kbGVyLFxuICBIYW5kc2hha2VNZXNzYWdlSGFuZGxlcixcbiAgSW5pdGlhbGl6ZU1lc3NhZ2VIYW5kbGVyLFxuICBOb3RpZmljYXRpb25NZXNzYWdlSGFuZGxlcixcbn0gZnJvbSAnLi9pbnRlcmZhY2UvTWVzc2FnZUxpc3RlbmVyJztcbmltcG9ydCB7XG4gIENvbW1hbmRNZXNzYWdlLFxuICBDb21tYW5kUmVzcG9uc2VNZXNzYWdlLFxuICBIYW5kc2hha2VNZXNzYWdlLFxuICBJbml0aWFsaXplTWVzc2FnZSxcbiAgTWVzc2FnZSxcbiAgTWVzc2FnZVR5cGUsXG4gIE5vdGlmaWNhdGlvbk1lc3NhZ2UsXG59IGZyb20gJy4vaW50ZXJmYWNlL01lc3NhZ2VUeXBlcyc7XG5pbXBvcnQgeyBNZXNzZW5nZXIgfSBmcm9tICcuL2ludGVyZmFjZS9NZXNzZW5nZXInO1xuaW1wb3J0IHsgUHJlcGFyZWRNZXNzYWdlIH0gZnJvbSAnLi9pbnRlcmZhY2UvUHJlcGFyZWRNZXNzYWdlJztcblxuLyoqXG4gKiBUaGUgQ3Jvc3NGcmFtZU1lc3NlbmdlciBpcyB0aGUgcHJpbWFyeSBleHBvcnQgZnJvbSB0aGUgYXBpLW1lc3NhZ2luZyBtb2R1bGUuIEFuIGluc3RhbmNlIG9mXG4gKiB0aGlzIGNsYXNzIGNhbiBiZSBpbnN0YW50aWF0ZWQgb24gYm90aCBzaWRlcyBvZiBhIGZyYW1lIGJvdW5kYXJ5IHRvIGZhY2lsaXRhdGUgY29tbXVuaWNhdGlvblxuICogaW4gYm90aCBkaXJlY3Rpb25zIGJldHdlZW4gdGhlIGZyYW1lcy4gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGJvdGggdGhlIGRpc3BhdGNoZXIgYW5kIHRoZSBsaXN0ZW5lclxuICogcG9ydGlvbnMsIGJ1dCBkb2Vzbid0IHJlcXVpcmUgY2FsbGVycyB0byBjYXJlIGFib3V0IGJvdGguXG4gKi9cbmV4cG9ydCBjbGFzcyBDcm9zc0ZyYW1lTWVzc2VuZ2VyIGltcGxlbWVudHMgTWVzc2VuZ2VyIHtcbiAgcHJpdmF0ZSB1bnJlZ2lzdGVyRnVuY3Rpb24/OiAoKSA9PiB2b2lkO1xuICBwcml2YXRlIGluaXRpYWxpemVNZXNzYWdlSGFuZGxlcj86IEluaXRpYWxpemVNZXNzYWdlSGFuZGxlcjtcbiAgcHJpdmF0ZSBjb21tYW5kUmVzcG9uc2VNZXNzYWdlSGFuZGxlcj86IENvbW1hbmRSZXNwb25zZU1lc3NhZ2VIYW5kbGVyO1xuICBwcml2YXRlIGNvbW1hbmRNZXNzYWdlSGFuZGxlcj86IENvbW1hbmRNZXNzYWdlSGFuZGxlcjtcbiAgcHJpdmF0ZSBub3RpZmljYXRpb25NZXNzYWdlSGFuZGxlcj86IE5vdGlmaWNhdGlvbk1lc3NhZ2VIYW5kbGVyO1xuICBwcml2YXRlIGhhbmRzaGFrZU1lc3NhZ2VIYW5kbGVyPzogSGFuZHNoYWtlTWVzc2FnZUhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgQ3Jvc3NGcmFtZU1lc3Nlbmdlci4gSWYgeW91IHdvdWxkIGxpa2UgdG8gdXNlIHRoZSBDcm9zc0ZyYW1lTWVzc2VuZ2VyIGFzIGEgTWVzc2FnZUxpc3RlbmVyLFxuICAgKiBiZSBzdXJlIHRvIGNhbGwgU3RhcnRMaXN0ZW5pbmcgYW5kIHJlZ2lzdGVyIG1lc3NhZ2UgaGFuZGxlcnMuXG4gICAqIEBwYXJhbSB0aGlzV2luZG93IFRoZSB3aW5kb3cgb2JqZWN0IHdoaWNoIHRoZSBDcm9zc0ZyYW1lTWVzc2VuZ2VyIGxpdmVzLiBBbiBvbk1lc3NhZ2UgbGlzdGVuZXIgd2lsbCBiZSBhZGRlZCBoZXJlLlxuICAgKiBAcGFyYW0gW290aGVyV2luZG93XSBPcHRpb25hbCBvdGhlcldpbmRvdyB3aGljaCBtZXNzYWdlcyB3aWxsIGJlIHBvc3RlZCB0by5cbiAgICogICAgICAgICAgICAgICAgICAgICAgSWYgZGVmaW5lZCwgaW5jb21pbmcgbWVzc2FnZXMgbXVzdCBvcmlnaW5hdGUgZnJvbSBvdGhlcldpbmRvdyB0byBiZSBwYXNzZWQgb25cbiAgICogQHBhcmFtIFtvdGhlcldpbmRvd09yaWdpbl0gVGhlIHRhcmdldCBvcmlnaW4gd2hpY2ggb3RoZXJXaW5kb3cgbXVzdCBoYXZlIGluIG9yZGVyIHRvIHJlY2VpdmUgZGlzcGF0Y2hlZCBtZXNzYWdlcy5cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyB2YWx1ZSB3aWxsIGJlIHNlbnQgYXMgdGhlIHRhcmdldE9yaWdpbiBvZiBhIHBvc3RNZXNzYWdlXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIChodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2luZG93L3Bvc3RNZXNzYWdlKVxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgdGhpc1dpbmRvdzogV2luZG93LCBwcml2YXRlIG90aGVyV2luZG93PzogV2luZG93LCBwcml2YXRlIG90aGVyV2luZG93T3JpZ2luPzogc3RyaW5nKSB7XG4gICAgLy8gTWFrZSBzdXJlIHRvIGNhbGwgU3RhcnRMaXN0ZW5pbmdcbiAgfVxuXG4gIC8vLy8vIE1lc3NhZ2VMaXN0ZW5lciBJbXBsZW1lbnRhdGlvblxuXG4gIHB1YmxpYyBzdGFydExpc3RlbmluZygpOiB2b2lkIHtcbiAgICAvLyBDaGVjayBpZiB3ZSBhbHJlYWR5IGFyZSBsaXN0ZW5pbmcsIGlmIG5vdCwgaG9vayB1cCBhIG1lc3NhZ2UgbGlzdGVuZXJcbiAgICBpZiAoIXRoaXMudW5yZWdpc3RlckZ1bmN0aW9uKSB7XG4gICAgICBjb25zdCBib3VuZEhhbmRsZXIgPSB0aGlzLm9uTWVzc2FnZVJlY2VpdmVkLmJpbmQodGhpcyk7XG4gICAgICB0aGlzLnRoaXNXaW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGJvdW5kSGFuZGxlciwgdHJ1ZSk7XG4gICAgICB0aGlzLnVucmVnaXN0ZXJGdW5jdGlvbiA9ICgpID0+IHRoaXMudGhpc1dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgYm91bmRIYW5kbGVyLCB0cnVlKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc3RvcExpc3RlbmluZygpOiB2b2lkIHtcbiAgICAvLyBTdG9wIGxpc3RlbmluZyBpZiB3ZSBoYXZlIHN0YXJ0ZWQgbGlzdGVuaW5nXG4gICAgaWYgKHRoaXMudW5yZWdpc3RlckZ1bmN0aW9uKSB7XG4gICAgICB0aGlzLnVucmVnaXN0ZXJGdW5jdGlvbigpO1xuICAgICAgdGhpcy51bnJlZ2lzdGVyRnVuY3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNldEluaXRpYWxpemVNZXNzYWdlSGFuZGxlcihoYW5kbGVyPzogSW5pdGlhbGl6ZU1lc3NhZ2VIYW5kbGVyKTogdm9pZCB7XG4gICAgdGhpcy5pbml0aWFsaXplTWVzc2FnZUhhbmRsZXIgPSBoYW5kbGVyO1xuICB9XG5cbiAgcHVibGljIHNldENvbW1hbmRSZXNwb25zZU1lc3NhZ2VIYW5kbGVyKGhhbmRsZXI/OiBDb21tYW5kUmVzcG9uc2VNZXNzYWdlSGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMuY29tbWFuZFJlc3BvbnNlTWVzc2FnZUhhbmRsZXIgPSBoYW5kbGVyO1xuICB9XG5cbiAgcHVibGljIHNldENvbW1hbmRNZXNzYWdlSGFuZGxlcihoYW5kbGVyPzogQ29tbWFuZE1lc3NhZ2VIYW5kbGVyKTogdm9pZCB7XG4gICAgdGhpcy5jb21tYW5kTWVzc2FnZUhhbmRsZXIgPSBoYW5kbGVyO1xuICB9XG5cbiAgcHVibGljIHNldE5vdGlmaWNhdGlvbk1lc3NhZ2VIYW5kbGVyKGhhbmRsZXI/OiBOb3RpZmljYXRpb25NZXNzYWdlSGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMubm90aWZpY2F0aW9uTWVzc2FnZUhhbmRsZXIgPSBoYW5kbGVyO1xuICB9XG5cbiAgcHVibGljIHNldEhhbmRzaGFrZU1lc3NhZ2VIYW5kbGVyKGhhbmRsZXI/OiBIYW5kc2hha2VNZXNzYWdlSGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMuaGFuZHNoYWtlTWVzc2FnZUhhbmRsZXIgPSBoYW5kbGVyO1xuICB9XG5cbiAgLy8vLy8gTWVzc2FnZURpc3BhdGNoZXIgSW1wbGVtZW50YXRpb25cblxuICAvKipcbiAgICogQHBhcmFtIGFwaVZlcnNpb24gYXBpLWludGVybmFsLWNvbnRyYWN0LWpzIHZlcnNpb24gKGV4cG9ydGVkIGluIEpzQXBpSW50ZXJuYWxDb25udHJhY3QpXG4gICAqIEBwYXJhbSBjcm9zc0ZyYW1lVmVyc2lvbiBjcm9zc2ZyYW1lIG1lc3NhZ2luZyB2ZXJzaW9uIChleHBvcnRlZCBpbiBKc0FwaUludGVybmFsQ29ubnRyYWN0KVxuICAgKiBAcGFyYW0gb3B0aW9ucyBhZGRpdGlvbmFsIG9wdGlvbnMgdGhhdCBjYW4gYmUgcGFzc2VkIGF0IGluaXRpYWxpemF0aW9uIChpbmZvcm1hdGlvbiBhYm91dCB0aGUgdmVyc2lvbiBvZlxuICAgKiAgICAgICAgICAgICAgICBleHRlcm5hbCBiZWluZyB1c2VkIGZvciBleGFtcGxlKVxuICAgKi9cbiAgcHVibGljIHByZXBhcmVJbml0aWFsaXphdGlvbk1lc3NhZ2UoXG4gICAgYXBpVmVyc2lvbjogVmVyc2lvbk51bWJlcixcbiAgICBjcm9zc0ZyYW1lVmVyc2lvbjogVmVyc2lvbk51bWJlcixcbiAgICBvcHRpb25zPzogSW5pdGlhbGl6YXRpb25PcHRpb25zLFxuICApOiBQcmVwYXJlZE1lc3NhZ2Uge1xuICAgIGNvbnN0IG1lc3NhZ2U6IEluaXRpYWxpemVNZXNzYWdlID0ge1xuICAgICAgbXNnR3VpZDogZ3VpZC5yYXcoKSxcbiAgICAgIG1zZ1R5cGU6IE1lc3NhZ2VUeXBlLkluaXRpYWxpemUsXG4gICAgICBjcm9zc0ZyYW1lVmVyc2lvbjogY3Jvc3NGcmFtZVZlcnNpb24sXG4gICAgICBhcGlWZXJzaW9uOiBhcGlWZXJzaW9uLFxuICAgICAgb3B0aW9uczogb3B0aW9ucyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMucHJlcGFyZU1lc3NhZ2UobWVzc2FnZSk7XG4gIH1cblxuICBwdWJsaWMgcHJlcGFyZUNvbW1hbmRNZXNzYWdlKHZlcmJJZDogVmVyYklkLCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyk6IFByZXBhcmVkTWVzc2FnZSB7XG4gICAgY29uc3QgbWVzc2FnZTogQ29tbWFuZE1lc3NhZ2UgPSB7XG4gICAgICBtc2dHdWlkOiBndWlkLnJhdygpLFxuICAgICAgbXNnVHlwZTogTWVzc2FnZVR5cGUuQ29tbWFuZCxcbiAgICAgIHZlcmJJZDogdmVyYklkLFxuICAgICAgcGFyYW1ldGVyczogcGFyYW1ldGVycyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMucHJlcGFyZU1lc3NhZ2UobWVzc2FnZSk7XG4gIH1cblxuICBwdWJsaWMgcHJlcGFyZUNvbW1hbmRSZXNwb25zZU1lc3NhZ2UoY29tbWFuZEd1aWQ6IHN0cmluZywgZGF0YTogTW9kZWwgfCB1bmRlZmluZWQsIGVycm9yOiBNb2RlbCB8IHVuZGVmaW5lZCk6IFByZXBhcmVkTWVzc2FnZSB7XG4gICAgY29uc3QgbWVzc2FnZTogQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSA9IHtcbiAgICAgIG1zZ0d1aWQ6IGd1aWQucmF3KCksXG4gICAgICBtc2dUeXBlOiBNZXNzYWdlVHlwZS5Db21tYW5kUmVzcG9uc2UsXG4gICAgICBjb21tYW5kR3VpZDogY29tbWFuZEd1aWQsXG4gICAgICBkYXRhOiBkYXRhLFxuICAgICAgZXJyb3I6IGVycm9yLFxuICAgIH07XG5cbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIC8vIHN0cmluZ2lmeSBlcnJvciBvYmplY3QgdG8gcmVtb3ZlIHVuc2VyaWFsaXphYmxlIGZpZWxkcyBsaWtlIGZ1bmN0aW9ucyBhbmQgcHJldmVudCBzZXJpYWxpemF0aW9uIGVycm9yc1xuICAgICAgbWVzc2FnZS5lcnJvciA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZXJyb3IpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5wcmVwYXJlTWVzc2FnZShtZXNzYWdlKTtcbiAgfVxuXG4gIHB1YmxpYyBwcmVwYXJlTm90aWZpY2F0aW9uTWVzc2FnZShub3RpZmljYXRpb25JZDogTm90aWZpY2F0aW9uSWQsIGRhdGE6IE1vZGVsKTogUHJlcGFyZWRNZXNzYWdlIHtcbiAgICBjb25zdCBtZXNzYWdlOiBOb3RpZmljYXRpb25NZXNzYWdlID0ge1xuICAgICAgbXNnR3VpZDogZ3VpZC5yYXcoKSxcbiAgICAgIG1zZ1R5cGU6IE1lc3NhZ2VUeXBlLk5vdGlmaWNhdGlvbixcbiAgICAgIG5vdGlmaWNhdGlvbklkOiBub3RpZmljYXRpb25JZCxcbiAgICAgIGRhdGE6IGRhdGEsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLnByZXBhcmVNZXNzYWdlKG1lc3NhZ2UpO1xuICB9XG5cbiAgcHVibGljIHByZXBhcmVBY2tNZXNzYWdlKCk6IFByZXBhcmVkTWVzc2FnZSB7XG4gICAgY29uc3QgbWVzc2FnZTogSGFuZHNoYWtlTWVzc2FnZSA9IHtcbiAgICAgIG1zZ0d1aWQ6IGd1aWQucmF3KCksXG4gICAgICBtc2dUeXBlOiBNZXNzYWdlVHlwZS5BY2ssXG4gICAgICBwbGF0Zm9ybVZlcnNpb246IElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT04sXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLnByZXBhcmVNZXNzYWdlKG1lc3NhZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXBhcmVzIGEgcGVuZGluZyBtZXNzYWdlIGZvciBzZW5kaW5nIGFuZCByZXR1cm5zIHRoZSBwcmVwYXJlZCBtZXNzYWdlXG4gICAqXG4gICAqIEBwYXJhbSBtc2cgVGhlIG1lc3NhZ2UgdG8gYmUgc2VudCB0byB0aGlzLm90aGVyV2luZG93XG4gICAqIEByZXR1cm5zIFRoZSBwcmVwYXJlZCBtZXNzYWdlXG4gICAqL1xuICBwcml2YXRlIHByZXBhcmVNZXNzYWdlKG1zZzogTWVzc2FnZSk6IFByZXBhcmVkTWVzc2FnZSB7XG4gICAgaWYgKCF0aGlzLm90aGVyV2luZG93IHx8ICF0aGlzLm90aGVyV2luZG93T3JpZ2luKSB7XG4gICAgICB0aHJvdyAnT3RoZXIgd2luZG93IG5vdCBpbml0aWFsaXplZCwgY2Fubm90IGRpc3BhdGNoIG1lc3NhZ2VzJztcbiAgICB9XG5cbiAgICBjb25zdCBwcmVwYXJlZE1lc3NhZ2UgPSBuZXcgQ3Jvc3NGcmFtZVByZXBhcmVkTWVzc2FnZShtc2csIHRoaXMub3RoZXJXaW5kb3csIHRoaXMub3RoZXJXaW5kb3dPcmlnaW4pO1xuICAgIHJldHVybiBwcmVwYXJlZE1lc3NhZ2U7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gYSBtZXNzYWdlIGlzIHJlY2VpdmVkLiBEb2VzIHNvbWUgdmFsaWRhdGlvbiBvZiB0aGUgbWVzc2FnZSwgYW5kIHRoZW5cbiAgICogY2FsbHMgYW4gYXBwcm9wcmlhdGUgbWVzc2FnZSBoYW5kbGVyIGlmIG9uZSBpcyBkZWZpbmVkXG4gICAqXG4gICAqIEBwYXJhbSBldmVudCBUaGUgaW5jb21pbmcgTWVzc2FnZUV2ZW50XG4gICAqL1xuICBwcml2YXRlIG9uTWVzc2FnZVJlY2VpdmVkKGV2ZW50OiBNZXNzYWdlRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBJZiB3ZSBoYXZlIGFuIG90aGVyV2luZG93IGRlZmluZWQsIG1ha2Ugc3VyZSB0aGUgbWVzc2FnZSBpcyBjb21pbmcgZnJvbSB0aGVyZVxuICAgIGlmICh0aGlzLm90aGVyV2luZG93ICYmIGV2ZW50LnNvdXJjZSAhPT0gdGhpcy5vdGhlcldpbmRvdykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIERvIHNvbWUgdmFsaWRhdGlvbiBvbiBldmVudC5kYXRhIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgcmVjZWl2ZWQgYSByZWFsIG1lc3NhZ2VcbiAgICBpZiAoIWV2ZW50LmRhdGEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBtZXNzYWdlID0gZXZlbnQuZGF0YTtcbiAgICBpZiAoIWlzTWVzc2FnZShtZXNzYWdlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENoZWNrIHRoZSBkZWNsYXJlZCBtZXNzYWdlIHR5cGUsIHZhbGlkYXRlIHRoZSBtZXNzYWdlLCBhbmQgY2FsbCBhbiBhcHByb3ByaWF0ZSBoYW5kZXIgaWYgb25lIGV4aXN0c1xuICAgIHN3aXRjaCAobWVzc2FnZS5tc2dUeXBlKSB7XG4gICAgICBjYXNlIE1lc3NhZ2VUeXBlLkluaXRpYWxpemU6IHtcbiAgICAgICAgaWYgKCFpc0luaXRNZXNzYWdlKG1lc3NhZ2UpIHx8ICF0aGlzLmluaXRpYWxpemVNZXNzYWdlSGFuZGxlcikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZU1lc3NhZ2VIYW5kbGVyKG1lc3NhZ2UsIGV2ZW50LnNvdXJjZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBNZXNzYWdlVHlwZS5Db21tYW5kUmVzcG9uc2U6IHtcbiAgICAgICAgaWYgKCFpc0NvbW1hbmRSZXNwb25zZU1lc3NhZ2UobWVzc2FnZSkgfHwgIXRoaXMuY29tbWFuZFJlc3BvbnNlTWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbW1hbmRSZXNwb25zZU1lc3NhZ2VIYW5kbGVyKG1lc3NhZ2UsIGV2ZW50LnNvdXJjZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBNZXNzYWdlVHlwZS5Db21tYW5kOiB7XG4gICAgICAgIGlmICghaXNDb21tYW5kTWVzc2FnZShtZXNzYWdlKSB8fCAhdGhpcy5jb21tYW5kTWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbW1hbmRNZXNzYWdlSGFuZGxlcihtZXNzYWdlLCBldmVudC5zb3VyY2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgTWVzc2FnZVR5cGUuTm90aWZpY2F0aW9uOiB7XG4gICAgICAgIGlmICghaXNOb3RpZmljYXRpb25NZXNzYWdlKG1lc3NhZ2UpIHx8ICF0aGlzLm5vdGlmaWNhdGlvbk1lc3NhZ2VIYW5kbGVyKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb25NZXNzYWdlSGFuZGxlcihtZXNzYWdlLCBldmVudC5zb3VyY2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgTWVzc2FnZVR5cGUuSGFuZHNoYWtlOiB7XG4gICAgICAgIGlmICghaXNIYW5kc2hha2VNZXNzYWdlKG1lc3NhZ2UpIHx8ICF0aGlzLmhhbmRzaGFrZU1lc3NhZ2VIYW5kbGVyKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5oYW5kc2hha2VNZXNzYWdlSGFuZGxlcihtZXNzYWdlLCBldmVudC5zb3VyY2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAvLyBKdXN0IGlnbm9yZSB0aGlzIHNpbmNlIHdlIGRvbid0IGtub3cgaG93IHRvIGhhbmRsZSB0aGUgbWVzc2FnZSB0eXBlXG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNldE90aGVyV2luZG93KG90aGVyV2luZG93OiBXaW5kb3cpOiB2b2lkIHtcbiAgICB0aGlzLm90aGVyV2luZG93ID0gb3RoZXJXaW5kb3c7XG4gIH1cblxuICBwdWJsaWMgc2V0T3RoZXJXaW5kb3dPcmlnaW4ob3JpZ2luOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm90aGVyV2luZG93T3JpZ2luID0gb3JpZ2luO1xuICB9XG59XG4iLCJpbXBvcnQgeyBNZXNzYWdlIH0gZnJvbSAnLi9pbnRlcmZhY2UvTWVzc2FnZVR5cGVzJztcbmltcG9ydCB7IFByZXBhcmVkTWVzc2FnZSB9IGZyb20gJy4vaW50ZXJmYWNlL1ByZXBhcmVkTWVzc2FnZSc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFByZXBhcmVkTWVzc2FnZSBpbnRlcmZhY2UgdXNlZCB0byBwb3N0IG1lc3NhZ2VzIGJldHdlZW5cbiAqIHR3byBmcmFtZXMgdXNpbmcgd2luZG93LnBvc3RNZXNzYWdlXG4gKi9cbmV4cG9ydCBjbGFzcyBDcm9zc0ZyYW1lUHJlcGFyZWRNZXNzYWdlIGltcGxlbWVudHMgUHJlcGFyZWRNZXNzYWdlIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgQ3Jvc3NGcmFtZVByZXBhcmVkTWVzc2FnZS5cbiAgICogQHBhcmFtIF9tZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGJlIHNlbnRcbiAgICogQHBhcmFtIF90YXJnZXQgVGhlIHRhcmdldCB3aW5kb3cgd2hlcmUgdGhlIG1lc3NhZ2Ugd2lsbCBiZSBzZW50XG4gICAqIEBwYXJhbSBfb3JpZ2luIFRoZSB0YXJnZXRPcmlnaW4gd2hlcmUgdGhpcyBtZXNzYWdlIGNhbiBiZSByZWNlaXZlZFxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX21lc3NhZ2U6IE1lc3NhZ2UsIHByaXZhdGUgX3RhcmdldDogV2luZG93LCBwcml2YXRlIF9vcmlnaW46IHN0cmluZykge31cblxuICBwdWJsaWMgZ2V0IG1lc3NhZ2VHdWlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX21lc3NhZ2UubXNnR3VpZDtcbiAgfVxuXG4gIHB1YmxpYyBzZW5kKCk6IFByZXBhcmVkTWVzc2FnZSB7XG4gICAgdGhpcy5fdGFyZ2V0LnBvc3RNZXNzYWdlKHRoaXMuX21lc3NhZ2UsIHRoaXMuX29yaWdpbik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIGd1aWQgZnJvbSAnZ3VpZCc7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25JZCB9IGZyb20gJy4uL2NvbnRyYWN0L05vdGlmaWNhdGlvbnMnO1xuaW1wb3J0IHsgVmVyc2lvbk51bWJlciB9IGZyb20gJy4uL2ludGVyZmFjZS9WZXJzaW9uTnVtYmVyJztcbmltcG9ydCB7XG4gIENvbW1hbmRNZXNzYWdlLFxuICBDb21tYW5kUmVzcG9uc2VNZXNzYWdlLFxuICBIYW5kc2hha2VNZXNzYWdlLFxuICBJbml0aWFsaXplTWVzc2FnZSxcbiAgTWVzc2FnZSxcbiAgTWVzc2FnZVR5cGUsXG4gIE5vdGlmaWNhdGlvbk1lc3NhZ2UsXG59IGZyb20gJy4vaW50ZXJmYWNlL01lc3NhZ2VUeXBlcyc7XG5cbmNvbnN0IGV4cGVjdGVkRW1wdHlOb3RpZmljYXRpb25zID0gbmV3IFNldChbXG4gIE5vdGlmaWNhdGlvbklkLkVkaXRCdXR0b25DbGlja2VkLFxuICBOb3RpZmljYXRpb25JZC5FZGl0SW5EZXNrdG9wQnV0dG9uQ2xpY2tlZCxcbiAgTm90aWZpY2F0aW9uSWQuV29ya2Jvb2tQdWJsaXNoZWQsXG4gIE5vdGlmaWNhdGlvbklkLldvcmtib29rUmVhZHlUb0Nsb3NlLFxuICBOb3RpZmljYXRpb25JZC5SZWFkeVRvUmVjZWl2ZUF1dGhUb2tlbixcbl0pO1xuXG4vKiB0c2xpbnQ6ZGlzYWJsZSBuby1hbnkgKi9cbmV4cG9ydCBmdW5jdGlvbiBpc01lc3NhZ2UoZGF0YTogTWVzc2FnZSB8IGFueSk6IGRhdGEgaXMgTWVzc2FnZSB7XG4gIGlmICghZGF0YSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IG1lc3NhZ2UgPSBkYXRhIGFzIE1lc3NhZ2U7XG4gIGlmICghbWVzc2FnZSB8fCAhbWVzc2FnZS5tc2dHdWlkIHx8ICFtZXNzYWdlLm1zZ1R5cGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWd1aWQuaXNHdWlkKG1lc3NhZ2UubXNnR3VpZCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAodHlwZW9mIG1lc3NhZ2UubXNnVHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBtZXNzYWdlVHlwZXM6IEFycmF5PHN0cmluZz4gPSBbXG4gICAgTWVzc2FnZVR5cGUuQ29tbWFuZCxcbiAgICBNZXNzYWdlVHlwZS5Db21tYW5kUmVzcG9uc2UsXG4gICAgTWVzc2FnZVR5cGUuSW5pdGlhbGl6ZSxcbiAgICBNZXNzYWdlVHlwZS5Ob3RpZmljYXRpb24sXG4gICAgTWVzc2FnZVR5cGUuSGFuZHNoYWtlLFxuICBdO1xuXG4gIGlmIChtZXNzYWdlVHlwZXMuaW5kZXhPZihtZXNzYWdlLm1zZ1R5cGUpIDwgMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNWZXJzaW9uKHZlcnNpb25OdW1iZXI6IFZlcnNpb25OdW1iZXIgfCBhbnkpOiB2ZXJzaW9uTnVtYmVyIGlzIFZlcnNpb25OdW1iZXIge1xuICBpZiAoIXZlcnNpb25OdW1iZXIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCB2ID0gdmVyc2lvbk51bWJlciBhcyBWZXJzaW9uTnVtYmVyO1xuXG4gIGlmICh0eXBlb2YgdiAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAodHlwZW9mIHYuZml4ICE9PSAnbnVtYmVyJyB8fCB0eXBlb2Ygdi5taW5vciAhPT0gJ251bWJlcicgfHwgdHlwZW9mIHYubWFqb3IgIT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0luaXRNZXNzYWdlKG1lc3NhZ2U6IEluaXRpYWxpemVNZXNzYWdlIHwgYW55KTogbWVzc2FnZSBpcyBJbml0aWFsaXplTWVzc2FnZSB7XG4gIGlmICghaXNNZXNzYWdlKG1lc3NhZ2UpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgaW5pdE1lc3NhZ2UgPSBtZXNzYWdlIGFzIEluaXRpYWxpemVNZXNzYWdlO1xuICBpZiAoaW5pdE1lc3NhZ2UubXNnVHlwZSAhPT0gTWVzc2FnZVR5cGUuSW5pdGlhbGl6ZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghaW5pdE1lc3NhZ2UuYXBpVmVyc2lvbiB8fCAhaXNWZXJzaW9uKGluaXRNZXNzYWdlLmFwaVZlcnNpb24pKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFpbml0TWVzc2FnZS5jcm9zc0ZyYW1lVmVyc2lvbiB8fCAhaXNWZXJzaW9uKGluaXRNZXNzYWdlLmNyb3NzRnJhbWVWZXJzaW9uKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNDb21tYW5kUmVzcG9uc2VNZXNzYWdlKG1lc3NhZ2U6IENvbW1hbmRSZXNwb25zZU1lc3NhZ2UgfCBhbnkpOiBtZXNzYWdlIGlzIENvbW1hbmRSZXNwb25zZU1lc3NhZ2Uge1xuICBpZiAoIWlzTWVzc2FnZShtZXNzYWdlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGNyTWVzc2FnZSA9IG1lc3NhZ2UgYXMgQ29tbWFuZFJlc3BvbnNlTWVzc2FnZTtcbiAgaWYgKGNyTWVzc2FnZS5tc2dUeXBlICE9PSBNZXNzYWdlVHlwZS5Db21tYW5kUmVzcG9uc2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWd1aWQuaXNHdWlkKGNyTWVzc2FnZS5jb21tYW5kR3VpZCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWNyTWVzc2FnZS5kYXRhICYmICFjck1lc3NhZ2UuZXJyb3IpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQ29tbWFuZE1lc3NhZ2UobWVzc2FnZTogQ29tbWFuZE1lc3NhZ2UgfCBhbnkpOiBtZXNzYWdlIGlzIENvbW1hbmRNZXNzYWdlIHtcbiAgaWYgKCFpc01lc3NhZ2UobWVzc2FnZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBjb21tYW5kTWVzc2FnZSA9IG1lc3NhZ2UgYXMgQ29tbWFuZE1lc3NhZ2U7XG4gIGlmIChjb21tYW5kTWVzc2FnZS5tc2dUeXBlICE9PSBNZXNzYWdlVHlwZS5Db21tYW5kKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFjb21tYW5kTWVzc2FnZS5wYXJhbWV0ZXJzIHx8IHR5cGVvZiBjb21tYW5kTWVzc2FnZS5wYXJhbWV0ZXJzICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghY29tbWFuZE1lc3NhZ2UudmVyYklkIHx8IHR5cGVvZiBjb21tYW5kTWVzc2FnZS52ZXJiSWQgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc05vdGlmaWNhdGlvbk1lc3NhZ2UobWVzc2FnZTogTm90aWZpY2F0aW9uTWVzc2FnZSB8IGFueSk6IG1lc3NhZ2UgaXMgTm90aWZpY2F0aW9uTWVzc2FnZSB7XG4gIGlmICghaXNNZXNzYWdlKG1lc3NhZ2UpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3Qgbm90aWZpY2F0aW9uTWVzc2FnZSA9IG1lc3NhZ2UgYXMgTm90aWZpY2F0aW9uTWVzc2FnZTtcbiAgaWYgKG5vdGlmaWNhdGlvbk1lc3NhZ2UubXNnVHlwZSAhPT0gTWVzc2FnZVR5cGUuTm90aWZpY2F0aW9uKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFub3RpZmljYXRpb25NZXNzYWdlLmRhdGEgJiYgIWV4cGVjdGVkRW1wdHlOb3RpZmljYXRpb25zLmhhcyhub3RpZmljYXRpb25NZXNzYWdlLm5vdGlmaWNhdGlvbklkKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghbm90aWZpY2F0aW9uTWVzc2FnZS5ub3RpZmljYXRpb25JZCB8fCB0eXBlb2Ygbm90aWZpY2F0aW9uTWVzc2FnZS5ub3RpZmljYXRpb25JZCAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzSGFuZHNoYWtlTWVzc2FnZShtZXNzYWdlOiBIYW5kc2hha2VNZXNzYWdlIHwgYW55KTogbWVzc2FnZSBpcyBIYW5kc2hha2VNZXNzYWdlIHtcbiAgaWYgKCFpc01lc3NhZ2UobWVzc2FnZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBoYW5kc2hha2VNZXNzYWdlID0gbWVzc2FnZSBhcyBIYW5kc2hha2VNZXNzYWdlO1xuICBpZiAoaGFuZHNoYWtlTWVzc2FnZS5tc2dUeXBlICE9PSBNZXNzYWdlVHlwZS5IYW5kc2hha2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cbiIsImltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBNb2RlbCwgTm90aWZpY2F0aW9uSWQsIFZlcmJJZCwgVmVyc2lvbk51bWJlciB9IGZyb20gJy4uLy4uL0pzQXBpSW50ZXJuYWxDb250cmFjdCc7XG5pbXBvcnQgeyBJbml0aWFsaXphdGlvbk9wdGlvbnMgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2UvSW5pdGlhbGl6YXRpb25PcHRpb25zJztcblxuLyoqXG4gKiBFbnVtIGRlZmluaW5nIHRoZSA0IGRpZmZlcmVudCB0eXBlcyBvZiBtZXNzYWdlcyB3ZSBoYXZlIGRlZmluZWRcbiAqL1xuZXhwb3J0IGVudW0gTWVzc2FnZVR5cGUge1xuICBJbml0aWFsaXplID0gJ2luaXRpYWxpemUnLFxuICBOb3RpZmljYXRpb24gPSAnbm90aWZpY2F0aW9uJyxcbiAgQ29tbWFuZCA9ICdjb21tYW5kJyxcbiAgQ29tbWFuZFJlc3BvbnNlID0gJ2NvbW1hbmQtcmVzcG9uc2UnLFxuICBIYW5kc2hha2UgPSAndi1oYW5kc2hha2UnLFxuICBBY2sgPSAndi1hY2snLFxufVxuXG4vKipcbiAqIFRoZSBNZXNzYWdlIGludGVyZmFjZSBpcyB0aGUgYmFzZSBpbnRlcmZhY2UgZm9yIGFsbCB0aGUgb3RoZXJcbiAqIG1lc3NhZ2UgdHlwZSBpbnRlcmZhY2VzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1lc3NhZ2Uge1xuICAvKipcbiAgICogQSB1bmlxdWUgaWQgZm9yIHRoaXMgbWVzc2FnZVxuICAgKi9cbiAgbXNnR3VpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0aGlzIG1lc3NhZ2VcbiAgICovXG4gIG1zZ1R5cGU6IE1lc3NhZ2VUeXBlO1xufVxuXG4vKipcbiAqIFRoZSBpbml0aWFsaXplIG1lc3NhZ2UgaXMgdGhlIGZpcnN0IG1lc3NhZ2Ugd2hpY2ggd2lsbCBiZSBzZW50XG4gKiBmcm9tIHRoZSBqYXZhc2NyaXB0IHRvIHNldCB1cCBjb21tdW5pY2F0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEluaXRpYWxpemVNZXNzYWdlIGV4dGVuZHMgTWVzc2FnZSB7XG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgYXBpIHdoaWNoIHRoZSBzZW5kZXIgd2FudHMgdG8gdXNlXG4gICAqL1xuICBhcGlWZXJzaW9uOiBWZXJzaW9uTnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBvZiB0aGlzIG1lc3NhZ2luZyBjb250cmFjdCB0byBiZSB1c2VkLiBGb3Igbm93LCB0aGVyZVxuICAgKiBzaG91bGQgb25seSBiZSBhIHNpbmdsZSB2ZXJzaW9uIGJ1dCBzZW5kaW5nIHRoaXMgYWxvbmcgc2hvdWxkIGhlbHBcbiAgICogaWYgd2UgbmVlZCB0byBhZGQgYSBuZXcgdmVyc2lvbiBpbiBhIGZ1dHVyZSByZWxlYXNlXG4gICAqL1xuICBjcm9zc0ZyYW1lVmVyc2lvbjogVmVyc2lvbk51bWJlcjtcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBvcHRpb25zIHRoYXQgY2FuIGJlIHBhc3NlZCBhdCB0aGUgdGltZSBvZiBpbml0aWFsaXphdGlvblxuICAgKi9cbiAgb3B0aW9ucz86IEluaXRpYWxpemF0aW9uT3B0aW9ucztcbn1cblxuLyoqXG4gKiBUaGlzIG1lc3NhZ2UgaXMgc2VudCB3aGVuIGEgbm90aWZpY2F0aW9uIG9jY3VycyBmcm9tIHRoZSBwcmVzbGF5ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOb3RpZmljYXRpb25NZXNzYWdlIGV4dGVuZHMgTWVzc2FnZSB7XG4gIC8qKlxuICAgKiBUaGUgaWQgZm9yIHRoaXMgdHlwZSBvZiBub3RpZmljYXRpb25cbiAgICovXG4gIG5vdGlmaWNhdGlvbklkOiBOb3RpZmljYXRpb25JZDtcblxuICAvKipcbiAgICogVGhlIGRhdGEgd2hpY2ggY2FtZSBhbG9uZyB3aXRoIHRoZSBub3RpZmljYXRpb25cbiAgICovXG4gIGRhdGE6IE1vZGVsO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgY2FsbGluZyBhbiBpbnRlcm5hbCBjb250cmFjdCBjb21tYW5kXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tbWFuZE1lc3NhZ2UgZXh0ZW5kcyBNZXNzYWdlIHtcbiAgLyoqXG4gICAqIFRoZSBpZCBvZiB0aGUgY29tbWFuZCB3aGljaCBzaG91bGQgYmUgZXhlY3V0ZWRcbiAgICovXG4gIHZlcmJJZDogVmVyYklkO1xuXG4gIC8qKlxuICAgKiBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGNvbW1hbmRcbiAgICovXG4gIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzO1xufVxuXG4vKipcbiAqIFRoaXMgbWVzc2FnZSBpcyBzZW50IGluIHJlc3BvbnNlIHRvIGEgQ29tbWFuZE1lc3NhZ2Ugd2l0aCB0aGVcbiAqIHJlc3VsdCBvZiB0aGF0IGNvbW1hbmRzIGludm9jYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21tYW5kUmVzcG9uc2VNZXNzYWdlIGV4dGVuZHMgTWVzc2FnZSB7XG4gIC8qKlxuICAgKiBHdWlkIG9mIHRoZSBDb21tYW5kTWVzc2FnZSB3aGljaCB0aGlzIGlzIGluIHJlc3BvbnNlIHRvXG4gICAqL1xuICBjb21tYW5kR3VpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJZiB0aGVyZSB3YXMgYW4gZXJyb3IgcmV0dXJuZWQgZnJvbSB0aGUgY29tbWFuZCwgdGhpcyB3aWxsIGJlIGRlZmluZWRcbiAgICogYW5kIGNvbnRhaW4gdGhlIGVycm9yXG4gICAqL1xuICBlcnJvcj86IE1vZGVsO1xuXG4gIC8qKlxuICAgKiBJZiB0aGUgY29tbWFuZCBleGVjdXRlZCBzdWNjZXNzZnVsbHksIHRoaXMgd2lsbCBjb250YWluIHRoZSBjb21tYW5kIHJlc3VsdFxuICAgKi9cbiAgZGF0YT86IE1vZGVsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEhhbmRzaGFrZU1lc3NhZ2UgZXh0ZW5kcyBNZXNzYWdlIHtcbiAgLyoqXG4gICAqIEludGVybmFsIEFQSSBjb250cmFjdCB2ZXJzaW9uXG4gICAqL1xuICBwbGF0Zm9ybVZlcnNpb246IFZlcnNpb25OdW1iZXI7XG59XG4iLCJpbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgRXhlY3V0ZVJlc3BvbnNlLCBOb3RpZmljYXRpb24sIFZlcmJJZCB9IGZyb20gJy4uL0pzQXBpSW50ZXJuYWxDb250cmFjdCc7XG5pbXBvcnQgeyBJbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB9IGZyb20gJy4vSW50ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXInO1xuXG4vLyB0c2xpbnQ6ZGlzYWJsZTpuby1hbnlcblxuLyoqXG4gKiBUaGlzIHZlcnNpb24gY29udmVydGVyIGRvZXNuJ3QgYWN0dWFsbHkgZG8gYW55dGhpbmcgYnV0IGlzIHVzZWZ1bCBmb3IgdGVzdGluZyBvciB3aGVuIHdlIGhhdmVcbiAqIGEgbWF0Y2hpbmcgcGxhdGZvcm0gYW5kIGludGVybmFsIHZlcnNpb24gbnVtYmVyXG4gKi9cbmV4cG9ydCBjbGFzcyBJZGVudGl0eVZlcnNpb25Db252ZXJ0ZXIgaW1wbGVtZW50cyBJbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB7XG4gIHB1YmxpYyB1cGdyYWRlRXhlY3V0ZUNhbGwodmVyYjogYW55LCBwYXJhbWV0ZXJzOiBhbnkpOiB7IHZlcmI6IFZlcmJJZDsgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgfSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZlcmI6IHZlcmIgYXMgVmVyYklkLFxuICAgICAgcGFyYW1ldGVyczogcGFyYW1ldGVycyBhcyBFeGVjdXRlUGFyYW1ldGVycyxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGRvd25ncmFkZUV4ZWN1dGVSZXR1cm4oZXhlY3V0ZVJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UpOiBFeGVjdXRlUmVzcG9uc2Uge1xuICAgIHJldHVybiBleGVjdXRlUmVzcG9uc2U7XG4gIH1cblxuICBwdWJsaWMgZG93bmdyYWRlTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uKTogTm90aWZpY2F0aW9uIHtcbiAgICByZXR1cm4gbm90aWZpY2F0aW9uO1xuICB9XG59XG4iLCJpbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgRXhlY3V0ZVJlc3BvbnNlLCBOb3RpZmljYXRpb24sIFZlcmJJZCwgVmVyc2lvbk51bWJlciB9IGZyb20gJy4uL0pzQXBpSW50ZXJuYWxDb250cmFjdCc7XG5pbXBvcnQgeyBJbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB9IGZyb20gJy4vSW50ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXInO1xuaW1wb3J0ICogYXMgVHJhbnNsYXRpb25zIGZyb20gJy4vVmVyc2lvblRyYW5zbGF0aW9ucyc7XG5cbi8vIHRzbGludDpkaXNhYmxlOm5vLWFueVxuXG4vKipcbiAqIFRoZSB2ZXJzaW9uIGNvbnZlcnRlciBpcyBkZXNpZ25lZCB0byBhbGxvdyB0aGUgcGxhdGZvcm0gYW5kIGV4dGVybmFsIG1vZHVsZXNcbiAqIHRvIHNlZW1sZXNzbHkgY29tbXVuaWNhdGUgb3ZlciB0d28gZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoZSBpbnRlcm5hbCBBUEkuIFRoZSBvbmx5XG4gKiBtb2RlIGl0IHN1cHBvcnRzIGlzIGV4dGVybmFsJ3MgdmVyc2lvbiA8PSBwbGF0Zm9ybSdzIHZlcnNpb24uIFdoZW4gZXhlY3V0aW5nXG4gKiBjb21tYW5kcywgaXQgaXMgdXNlZCB0byB1cGdyYWRlIHRoZSBleHRlcm5hbCByZXByZXNlbnRhdGlvbiB0byB3aGF0IHBsYXRmb3JtIGtub3dzIG9uIHRoZSB3YXkgaW5cbiAqIGFuZCBkb3duZ3JhZGUgdGhlIHJlcHJlc2VudGF0aW9ucyBvbiB0aGUgd2F5IG91dC4gU2ltaWxhcmx5IGZvciBub3RpZmljYXRpb25zLCBpdCBjYW5cbiAqIGRvd25ncmFkZSB0aG9zZSBvbiB0aGUgd2F5IGZyb20gcGxhdGZvcm0gdG8gZXh0ZXJuYWwuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIgaW1wbGVtZW50cyBJbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXJcbiAgICpcbiAgICogQHBhcmFtIF9leHRlcm5hbFZlcnNpb24gVGhlIHZlcnNpb24gb2YgdGhlIGludGVybmFsIGNvbnRyYWN0IGFwaS1leHRlcm5hbC1qcyBpcyB1c2luZ1xuICAgKiBAcGFyYW0gX3BsYXRmb3JtVmVyc2lvbiBUaGUgdmVyc2lvbiBvZiB0aGUgaW50ZXJuYWwgY29udHJhY3QgdGhlIGFwaS1wbGF0Zm9ybS1qcyBpcyB1c2luZ1xuICAgKiBAcGFyYW0gX3VwZ3JhZGVFeGVjdXRlVHJhbnNsYXRpb25zIE9yZGVyZWQgbGlzdCBvZiB0aGUgdHJhbnNsYXRpb25zIHRvIHBlcmZvcm0gd2hlbiB1cGdyYWRpbmcgY21kIHBhcmFtZXRlcnNcbiAgICogQHBhcmFtIF9kb3duZ3JhZGVFeGVjdXRlVHJhbnNsYXRpb25zIE9yZGVyZWQgbGlzdCBvZiBkb3duZ3JhZGUgdHJhbnNsYXRpb25zIHRvIHBlcmZvcm0gYWZ0ZXIgYSBjbWRcbiAgICogQHBhcmFtIF9kb3duZ3JhZGVOb3RpZmljYXRpb25UcmFuc2xhdGlvbnMgT3JkZXJlZCBsaXN0IG9mIGRvd25ncmFkZSB0cmFuc2xhdGlvbnMgdG8gcGVyZm9ybSBvbiBhIG5vdGlmaWNhdGlvblxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tRGF0YShcbiAgICBleHRlcm5hbFZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4gICAgcGxhdGZvcm1WZXJzaW9uOiBWZXJzaW9uTnVtYmVyLFxuICAgIHVwZ3JhZGVFeGVjdXRlVHJhbnNsYXRpb25zOiBBcnJheTxUcmFuc2xhdGlvbnMuVXBncmFkZUV4ZWN1dGVDYWxsPixcbiAgICBkb3duZ3JhZGVFeGVjdXRlVHJhbnNsYXRpb25zOiBBcnJheTxUcmFuc2xhdGlvbnMuRG93bmdyYWRlRXhlY3V0ZVJldHVybj4sXG4gICAgZG93bmdyYWRlTm90aWZpY2F0aW9uVHJhbnNsYXRpb25zOiBBcnJheTxUcmFuc2xhdGlvbnMuRG93bmdyYWRlTm90aWZpY2F0aW9uPixcbiAgKTogU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyIHtcbiAgICByZXR1cm4gbmV3IHRoaXMoXG4gICAgICBleHRlcm5hbFZlcnNpb24ubWFqb3IsXG4gICAgICBwbGF0Zm9ybVZlcnNpb24ubWFqb3IsXG4gICAgICB1cGdyYWRlRXhlY3V0ZVRyYW5zbGF0aW9ucyxcbiAgICAgIGRvd25ncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnMsXG4gICAgICBkb3duZ3JhZGVOb3RpZmljYXRpb25UcmFuc2xhdGlvbnMsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXJcbiAgICpcbiAgICogQHBhcmFtIF9leHRlcm5hbE1ham9yVmVyc2lvbiBUaGUgbWFqb3IgdmVyc2lvbiBvZiB0aGUgaW50ZXJuYWwgY29udHJhY3QgYXBpLWV4dGVybmFsLWpzIGlzIHVzaW5nXG4gICAqIEBwYXJhbSBfcGxhdGZvcm1NYWpvclZlcnNpb24gVGhlIG1ham9yIHZlcnNpb24gb2YgdGhlIGludGVybmFsIGNvbnRyYWN0IHRoZSBhcGktcGxhdGZvcm0tanMgaXMgdXNpbmdcbiAgICogQHBhcmFtIF91cGdyYWRlRXhlY3V0ZVRyYW5zbGF0aW9ucyBPcmRlcmVkIGxpc3Qgb2YgdGhlIHRyYW5zbGF0aW9ucyB0byBwZXJmb3JtIHdoZW4gdXBncmFkaW5nIGNtZCBwYXJhbWV0ZXJzXG4gICAqIEBwYXJhbSBfZG93bmdyYWRlRXhlY3V0ZVRyYW5zbGF0aW9ucyBPcmRlcmVkIGxpc3Qgb2YgZG93bmdyYWRlIHRyYW5zbGF0aW9ucyB0byBwZXJmb3JtIGFmdGVyIGEgY21kXG4gICAqIEBwYXJhbSBfZG93bmdyYWRlTm90aWZpY2F0aW9uVHJhbnNsYXRpb25zIE9yZGVyZWQgbGlzdCBvZiBkb3duZ3JhZGUgdHJhbnNsYXRpb25zIHRvIHBlcmZvcm0gb24gYSBub3RpZmljYXRpb25cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9leHRlcm5hbE1ham9yVmVyc2lvbjogbnVtYmVyLFxuICAgIHByaXZhdGUgX3BsYXRmb3JtTWFqb3JWZXJzaW9uOiBudW1iZXIsXG4gICAgcHJpdmF0ZSBfdXBncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnM6IEFycmF5PFRyYW5zbGF0aW9ucy5VcGdyYWRlRXhlY3V0ZUNhbGw+LFxuICAgIHByaXZhdGUgX2Rvd25ncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnM6IEFycmF5PFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVFeGVjdXRlUmV0dXJuPixcbiAgICBwcml2YXRlIF9kb3duZ3JhZGVOb3RpZmljYXRpb25UcmFuc2xhdGlvbnM6IEFycmF5PFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVOb3RpZmljYXRpb24+LFxuICApIHtcbiAgICBpZiAodGhpcy5fZXh0ZXJuYWxNYWpvclZlcnNpb24gPiB0aGlzLl9wbGF0Zm9ybU1ham9yVmVyc2lvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY29udmVydCBiZXR3ZWVuIGV4dGVybmFsIHZlcnNpb24gJHt0aGlzLl9leHRlcm5hbE1ham9yVmVyc2lvbn0gYW5kICR7dGhpcy5fcGxhdGZvcm1NYWpvclZlcnNpb259YCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHVwZ3JhZGVFeGVjdXRlQ2FsbCh2ZXJiOiBhbnksIHBhcmFtZXRlcnM6IGFueSk6IHsgdmVyYjogVmVyYklkOyBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyB9IHtcbiAgICAvLyBQZXJmb3JtIHRoZSB1cGdyYWRlIG9mIHRoZSB2ZXJiIGFuZCBwYXJhbWV0ZXJzIHRvIHRoZSBsZXZlbCB0aGF0IHBsYXRmb3JtIGlzIHVzaW5nXG4gICAgbGV0IHVwZ3JhZGVkID0geyB2ZXJiOiB2ZXJiLCBwYXJhbWV0ZXJzOiBwYXJhbWV0ZXJzIH07XG4gICAgZm9yIChjb25zdCB1cGdyYWRlVHJhbnNsYXRpb24gb2YgdGhpcy5fdXBncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnMpIHtcbiAgICAgIHVwZ3JhZGVkID0gdXBncmFkZVRyYW5zbGF0aW9uKHVwZ3JhZGVkLnZlcmIsIHVwZ3JhZGVkLnBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIHJldHVybiB1cGdyYWRlZDtcbiAgfVxuXG4gIHB1YmxpYyBkb3duZ3JhZGVFeGVjdXRlUmV0dXJuKGV4ZWN1dGVSZXNwb25zZTogRXhlY3V0ZVJlc3BvbnNlKTogRXhlY3V0ZVJlc3BvbnNlIHtcbiAgICAvLyBEb3duZ3JhZGUgdGhlIHJlc3BvbnNlIHRvIHdoYXQgdGhlIGV4dGVybmFsIG1vZHVsZSBpcyBleHBlY3RpbmdcbiAgICBsZXQgZG93bmdyYWRlZCA9IGV4ZWN1dGVSZXNwb25zZTtcbiAgICBmb3IgKGNvbnN0IGRvd25ncmFkZVRyYW5zbGF0aW9uIG9mIHRoaXMuX2Rvd25ncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnMpIHtcbiAgICAgIGRvd25ncmFkZWQgPSBkb3duZ3JhZGVUcmFuc2xhdGlvbihkb3duZ3JhZGVkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZG93bmdyYWRlZDtcbiAgfVxuXG4gIHB1YmxpYyBkb3duZ3JhZGVOb3RpZmljYXRpb24obm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24pOiBOb3RpZmljYXRpb24ge1xuICAgIC8vIERvd25ncmFkZSB0aGUgbm90aWZpY2F0aW9uIHRvIHdoYXQgdGhlIGV4dGVybmFsIG1vZHVsZSBpcyBleHBlY3RpbmdcbiAgICBsZXQgZG93bmdyYWRlZCA9IG5vdGlmaWNhdGlvbjtcbiAgICBmb3IgKGNvbnN0IGRvd25ncmFkZVRyYW5zbGF0aW9uIG9mIHRoaXMuX2Rvd25ncmFkZU5vdGlmaWNhdGlvblRyYW5zbGF0aW9ucykge1xuICAgICAgZG93bmdyYWRlZCA9IGRvd25ncmFkZVRyYW5zbGF0aW9uKGRvd25ncmFkZWQpO1xuICAgIH1cblxuICAgIHJldHVybiBkb3duZ3JhZGVkO1xuICB9XG59XG4iLCJpbXBvcnQgeyBWZXJzaW9uTnVtYmVyIH0gZnJvbSAnLi4vSnNBcGlJbnRlcm5hbENvbnRyYWN0JztcbmltcG9ydCB7IElkZW50aXR5VmVyc2lvbkNvbnZlcnRlciB9IGZyb20gJy4vSWRlbnRpdHlWZXJzaW9uQ29udmVydGVyJztcbmltcG9ydCB7IEludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIH0gZnJvbSAnLi9JbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcic7XG5pbXBvcnQgeyBTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIgfSBmcm9tICcuL1N0YWNraW5nVmVyc2lvbkNvbnZlcnRlcic7XG5pbXBvcnQgKiBhcyBUcmFuc2xhdGlvbnMgZnJvbSAnLi9WZXJzaW9uVHJhbnNsYXRpb25zJztcbmltcG9ydCB7XG4gIERvd25ncmFkZUZsaXBib2FyZFpvbmVJRCxcbiAgRG93bmdyYWRlV29ya3NoZWV0Rm9tYXR0aW5nMTc1LFxuICBEb3duZ3JhZGVXb3Jrc2hlZXRGb21hdHRpbmdOb3RpZmljYXRpb24xNzUsXG4gIERvd25ncmFkZVdvcmtzaGVldE5hbWVzLFxufSBmcm9tICcuL1ZlcnNpb25UcmFuc2xhdGlvbnMnO1xuXG4vKipcbiAqIEByZXR1cm5zIHRydWUgaWYgbGhzIDwgcmhzIChpZ25vcmluZyBmaXggbnVtYmVyKVxuICogQHBhcmFtIGxoc1xuICogQHBhcmFtIHJoc1xuICovXG5leHBvcnQgZnVuY3Rpb24gVmVyc2lvbkxlc3NUaGFuKGxoczogVmVyc2lvbk51bWJlciwgcmhzOiBWZXJzaW9uTnVtYmVyKTogYm9vbGVhbiB7XG4gIGlmIChsaHMubWFqb3IgPiByaHMubWFqb3IpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGxocy5tYWpvciA8IHJocy5tYWpvcikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBsaHMubWlub3IgPCByaHMubWlub3I7XG59XG5cbi8qKlxuICogQHJldHVybnMgdHJ1ZSBpZiBsaHMgPT0gcmhzIChpZ25vcmluZyBmaXggbnVtYmVyKVxuICogQHBhcmFtIGxoc1xuICogQHBhcmFtIHJoc1xuICovXG5leHBvcnQgZnVuY3Rpb24gVmVyc2lvbkVxdWFsVG8obGhzOiBWZXJzaW9uTnVtYmVyLCByaHM6IFZlcnNpb25OdW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIGxocy5tYWpvciA9PT0gcmhzLm1ham9yICYmIGxocy5taW5vciA9PT0gcmhzLm1pbm9yO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1ham9yTWlub3JUcmFuc2xhdG9yczxUPiB7XG4gIFttYWpvcjogbnVtYmVyXTogeyBbbWlub3I6IG51bWJlcl06IEFycmF5PFQ+IH07XG59XG5cbi8vIEEgbWFwcGluZyBmcm9tIGFuIG9sZGVyIGNsaWVudCB2ZXJzaW9uIG9mIGludGVybmFsLWNvbnRyYWN0IHRvIHRoZSBjdXJyZW50IHBsYXRmb3JtIHZlcnNpb24gb2YgdGhpcyBjb250cmFjdC5cbi8vIEVhY2ggdmVyc2lvbiBidW1wIGNhbiBoYXZlIGFuIGFycmF5IG9mIHRyYW5zbGF0aW9ucyB0byBwZXJmb3JtIGluIG9yZGVyLiBOb3RpY2UgdGhhdCB0aGlzIGlzXG4vLyBkaWZmZXJlbnQgdGhhbiB0aGUgbWFqb3IgdXBncmFkZXMvZG93bmdyYWRlcyBhYm92ZSBiZWNhdXNlIGl0IGhhbmRsZXMgYm90aCBtYWpvciBhbmQgbWlub3IgdmVyc2lvbiBjaGFuZ2VzLlxuLy8gQWxzbyBwbGVhc2Ugbm90ZTogZG93bmdyYWRlRXhlY3V0ZUNhbGwgaXMgaGFuZGxlZCBvbiB0aGUgY2xpZW50L2V4dGVybmFsIHNpZGUgcmF0aGVyIHRoYW4gcGxhdGZvcm0gc2lkZS5cbi8vIFdoZW4gdXBkYXRpbmcgdGhlIG1ham9yIG9yIG1pbm9yIHZlcnNpb24gb2Ygb3VyIGludGVybmFsLWNvbnRyYWN0LCB5b3Ugd2lsbCBuZWVkIHRvIHVwZGF0ZSB0aGVzZSBkYXRhIHN0cnVjdHVyZXMuXG4vLyAqIElmIHRoZXJlIGFyZSB0cmFuc2xhdGlvbnMgdG8gYWRkLCBhZGQgdGhlbSB0byB0aGUgdmVyc2lvbiB0byBcInVwZ3JhZGUgZnJvbVwiIG9yIFwiZG93bmdyYWRlIHRvXCIuXG5leHBvcnQgY29uc3QgRXhlY3V0ZU1pbm9yVXBncmFkZXM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnMuVXBncmFkZUV4ZWN1dGVDYWxsPiA9IHtcbiAgMToge1xuICAgIDk6IFtdLCAvLyBOb3RlIHRoYXQgd2UgcHV0IHVwZ3JhZGVzIGZyb20gMS45IHRvIDEuMTAgaW4gdGhlIFsxXVs5XSBidWNrZXRcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBFeGVjdXRlTWlub3JEb3duZ3JhZGVzOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VHJhbnNsYXRpb25zLkRvd25ncmFkZUV4ZWN1dGVSZXR1cm4+ID0ge1xuICAxOiB7XG4gICAgNTogW0Rvd25ncmFkZVdvcmtzaGVldE5hbWVzXSxcbiAgICA5OiBbXSxcbiAgICAxNzU6IFtEb3duZ3JhZGVXb3Jrc2hlZXRGb21hdHRpbmcxNzVdLFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IE5vdGlmaWNhdGlvbk1pbm9yRG93bmdyYWRlczogTWFqb3JNaW5vclRyYW5zbGF0b3JzPFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVOb3RpZmljYXRpb24+ID0ge1xuICAxOiB7XG4gICAgOTogW10sXG4gICAgMTA6IFtEb3duZ3JhZGVGbGlwYm9hcmRab25lSURdLFxuICAgIDE3NTogW0Rvd25ncmFkZVdvcmtzaGVldEZvbWF0dGluZ05vdGlmaWNhdGlvbjE3NV0sXG4gIH0sXG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgSW50ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXIgd2hpY2ggaGFzIHRoZSBhYmlsaXR5IHRvIHVwZ3JhZGUgYW5kIGRvd25ncmFkZSB0aGUgY29udHJhY3RcbiAqIGJldHdlZW4gdGhlIHR3byB2ZXJzaW9ucywgd2hpY2ggYXJlIHNwZWNpZmllZC4gSWYgZXh0ZXJuYWxNYWpvclZlcnNpb24gaXMgZ3JlYXRlciB0aGFuIHBsYXRmb3JtTWFqb3JWZXJzaW9uLFxuICogYW4gZXJyb3Igd2lsbCBiZSB0aHJvd24gYmVjYXVzZSB3ZSB3b24ndCBrbm93IGhvdyB0byBkbyB0aG9zZSBjb252ZXJzaW9ucy5cbiAqIFRoaXMgY29udmVydGVyIGNhbiBoYW5kbGUgYm90aCBtYWpvciBhbmQgbWlub3IgdXBkYXRlcyB3aGVuIHRoZSBwbGF0Zm9ybSB2ZXJzaW9uIGlzIGdyZWF0ZXIgdGhhbiBleHRlcm5hbCB2ZXJzaW9uLlxuICpcbiAqIEBwYXJhbSBleHRlcm5hbFZlcnNpb24gVmVyc2lvbk51bWJlciBvZiB0aGUgaW50ZXJuYWwgYXBpIHdoaWNoIHRoZSBleHRlcm5hbCBtb2R1bGUgaXMgdXNpbmdcbiAqIEBwYXJhbSBwbGF0Zm9ybVZlcnNpb24gVmVyc2lvbk51bWJlciBvZiB0aGUgaW50ZXJuYWwgYXBpIHdoaWNoIHRoZSBwbGF0Zm9ybSBpcyB1c2luZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gQ3JlYXRlVmVyc2lvbkNvbnZlcnRlcihleHRlcm5hbFZlcnNpb246IFZlcnNpb25OdW1iZXIsIHBsYXRmb3JtVmVyc2lvbjogVmVyc2lvbk51bWJlcik6IEludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIHtcbiAgcmV0dXJuIENyZWF0ZVZlcnNpb25Db252ZXJ0ZXJXaXRoVHJhbnNsYXRvcnMoXG4gICAgZXh0ZXJuYWxWZXJzaW9uLFxuICAgIHBsYXRmb3JtVmVyc2lvbixcbiAgICBFeGVjdXRlTWlub3JVcGdyYWRlcyxcbiAgICBFeGVjdXRlTWlub3JEb3duZ3JhZGVzLFxuICAgIE5vdGlmaWNhdGlvbk1pbm9yRG93bmdyYWRlcyxcbiAgKTtcbn1cblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiBDcmVhdGVWZXJzaW9uQ29udmVydGVyLiBUaGlzIGZ1bmN0aW9uIHRha2VzIHRoZSB1cGdyYWRlLCBkb3duZ3JhZGUsIGFuZFxuICogbm90aWZpY2F0aW9uIGFycmF5cyBzbyB0aGF0IGFsbCB0aGUgbG9naWMgY2FuIGJlIHRlc3RlZC5cbiAqXG4gKiBAcGFyYW0gZXh0ZXJuYWxWZXJzaW9uIFZlcnNpb25OdW1iZXIgb2YgdGhlIGludGVybmFsIGFwaSB3aGljaCB0aGUgZXh0ZXJuYWwgbW9kdWxlIGlzIHVzaW5nXG4gKiBAcGFyYW0gcGxhdGZvcm1WZXJzaW9uIFZlcnNpb25OdW1iZXIgb2YgdGhlIGludGVybmFsIGFwaSB3aGljaCB0aGUgcGxhdGZvcm0gaXMgdXNpbmdcbiAqIEBwYXJhbSB1cGdyYWRlcyBNYWpvck1pbm9yVHJhbnNsYXRvcnMgZm9yIHVwZ3JhZGVzXG4gKiBAcGFyYW0gZG93bmdyYWRlcyBNYWpvck1pbm9yVHJhbnNsYXRvcnMgZm9yIGRvd25ncmFkZXNcbiAqIEBwYXJhbSBub3RpZmljYXRpb25Eb3duZ3JhZGVzIE1ham9yTWlub3JUcmFuc2xhdG9ycyBmb3Igbm90aWZpY2F0aW9uIGRvd25ncmFkZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENyZWF0ZVZlcnNpb25Db252ZXJ0ZXJXaXRoVHJhbnNsYXRvcnMoXG4gIGV4dGVybmFsVmVyc2lvbjogVmVyc2lvbk51bWJlcixcbiAgcGxhdGZvcm1WZXJzaW9uOiBWZXJzaW9uTnVtYmVyLFxuICB1cGdyYWRlczogTWFqb3JNaW5vclRyYW5zbGF0b3JzPFRyYW5zbGF0aW9ucy5VcGdyYWRlRXhlY3V0ZUNhbGw+LFxuICBkb3duZ3JhZGVzOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VHJhbnNsYXRpb25zLkRvd25ncmFkZUV4ZWN1dGVSZXR1cm4+LFxuICBub3RpZmljYXRpb25Eb3duZ3JhZGVzOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VHJhbnNsYXRpb25zLkRvd25ncmFkZU5vdGlmaWNhdGlvbj4sXG4pOiBJbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB7XG4gIGNvbnN0IGV4dGVybmFsTWFqb3JWZXJzaW9uOiBudW1iZXIgPSBleHRlcm5hbFZlcnNpb24ubWFqb3I7XG4gIGNvbnN0IGV4dGVybmFsTWlub3JWZXJzaW9uOiBudW1iZXIgPSBleHRlcm5hbFZlcnNpb24ubWlub3I7XG4gIGNvbnN0IHBsYXRmb3JtTWFqb3JWZXJzaW9uOiBudW1iZXIgPSBwbGF0Zm9ybVZlcnNpb24ubWFqb3I7XG5cbiAgaWYgKGV4dGVybmFsTWFqb3JWZXJzaW9uID4gcGxhdGZvcm1NYWpvclZlcnNpb24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEV4dGVybmFsIHZlcnNpb24gbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gcGxhdGZvcm0gdmVyc2lvbi5cbiAgICBleHRlcm5hbE1ham9yVmVyc2lvbj0ke2V4dGVybmFsTWFqb3JWZXJzaW9ufSBwbGF0Zm9ybU1ham9yVmVyc2lvbj0ke3BsYXRmb3JtTWFqb3JWZXJzaW9ufWApO1xuICB9XG5cbiAgLy8gSWYgd2UgYXJlIHVzaW5nIHRoZSBleGFjdCBzYW1lIHZlcnNpb25zIChtYWpvci5taW5vciksIGp1c3QgdXNlIHRoZSBpZGVudGl0eSBjb252ZXJ0ZXJcbiAgaWYgKFZlcnNpb25FcXVhbFRvKGV4dGVybmFsVmVyc2lvbiwgcGxhdGZvcm1WZXJzaW9uKSkge1xuICAgIHJldHVybiBuZXcgSWRlbnRpdHlWZXJzaW9uQ29udmVydGVyKCk7XG4gIH1cblxuICAvLyBXYWxrIHRoZSBzcGFuIGJldHdlZW4gdGhlIHZlcnNpb25zIHdlIGhhdmUgaGVyZSBhbmQgY29sbGVjdCB0aGUgdXBncmFkZSBhbmQgZG93bmdyYWRlcyBuZWNlc3NhcnlcbiAgY29uc3QgbmVlZGVkRXhlY3V0ZVVwZ3JhZGVzOiBBcnJheTxUcmFuc2xhdGlvbnMuVXBncmFkZUV4ZWN1dGVDYWxsPiA9IEdldE5lZWRlZFRyYW5zbGF0aW9ucyhcbiAgICBleHRlcm5hbE1ham9yVmVyc2lvbixcbiAgICBwbGF0Zm9ybU1ham9yVmVyc2lvbixcbiAgICBleHRlcm5hbE1pbm9yVmVyc2lvbixcbiAgICB1cGdyYWRlcyxcbiAgKTtcblxuICBjb25zdCBuZWVkZWRFeGVjdXRlRG93bmdyYWRlczogQXJyYXk8VHJhbnNsYXRpb25zLkRvd25ncmFkZUV4ZWN1dGVSZXR1cm4+ID0gR2V0TmVlZGVkVHJhbnNsYXRpb25zKFxuICAgIGV4dGVybmFsTWFqb3JWZXJzaW9uLFxuICAgIHBsYXRmb3JtTWFqb3JWZXJzaW9uLFxuICAgIGV4dGVybmFsTWlub3JWZXJzaW9uLFxuICAgIGRvd25ncmFkZXMsXG4gICk7XG5cbiAgY29uc3QgbmVlZGVkTm90aWZpY2F0aW9uRG93bmdyYWRlczogQXJyYXk8VHJhbnNsYXRpb25zLkRvd25ncmFkZU5vdGlmaWNhdGlvbj4gPSBHZXROZWVkZWRUcmFuc2xhdGlvbnMoXG4gICAgZXh0ZXJuYWxNYWpvclZlcnNpb24sXG4gICAgcGxhdGZvcm1NYWpvclZlcnNpb24sXG4gICAgZXh0ZXJuYWxNaW5vclZlcnNpb24sXG4gICAgbm90aWZpY2F0aW9uRG93bmdyYWRlcyxcbiAgKTtcblxuICAvLyBXZSB3YW50IHRvIGFwcGx5IHRoZSBkb3duZ3JhZGVzIGluIHJldmVyc2Ugb3JkZXIgaW4gY2FzZSBvZiBkZXBlbmRlbmNpZXMgYmV0d2VlbiB0aGVtXG4gIG5lZWRlZEV4ZWN1dGVEb3duZ3JhZGVzLnJldmVyc2UoKTtcbiAgbmVlZGVkTm90aWZpY2F0aW9uRG93bmdyYWRlcy5yZXZlcnNlKCk7XG5cbiAgcmV0dXJuIFN0YWNraW5nVmVyc2lvbkNvbnZlcnRlci5mcm9tRGF0YShcbiAgICBleHRlcm5hbFZlcnNpb24sXG4gICAgcGxhdGZvcm1WZXJzaW9uLFxuICAgIG5lZWRlZEV4ZWN1dGVVcGdyYWRlcyxcbiAgICBuZWVkZWRFeGVjdXRlRG93bmdyYWRlcyxcbiAgICBuZWVkZWROb3RpZmljYXRpb25Eb3duZ3JhZGVzLFxuICApO1xufVxuXG5mdW5jdGlvbiBHZXROZWVkZWRUcmFuc2xhdGlvbnM8VD4oXG4gIGV4dGVybmFsTWFqb3JWZXJzaW9uOiBudW1iZXIsXG4gIHBsYXRmb3JtTWFqb3JWZXJzaW9uOiBudW1iZXIsXG4gIGV4dGVybmFsTWlub3JWZXJzaW9uOiBudW1iZXIsXG4gIG1ham9yTWlub3JUcmFuc2xhdG9yczogTWFqb3JNaW5vclRyYW5zbGF0b3JzPFQ+LFxuKTogQXJyYXk8VD4ge1xuICBjb25zdCBuZWVkZWRUcmFuc2xhdGlvbnM6IEFycmF5PFQ+ID0gW107XG5cbiAgZm9yIChsZXQgbWFqb3IgPSBleHRlcm5hbE1ham9yVmVyc2lvbjsgbWFqb3IgPD0gcGxhdGZvcm1NYWpvclZlcnNpb247IG1ham9yKyspIHtcbiAgICBpZiAobWFqb3IgaW4gbWFqb3JNaW5vclRyYW5zbGF0b3JzKSB7XG4gICAgICBjb25zdCBzdGFydCA9IG1ham9yID09PSBleHRlcm5hbE1ham9yVmVyc2lvbiA/IGV4dGVybmFsTWlub3JWZXJzaW9uIDogMDtcbiAgICAgIGNvbnN0IG1heGltdW1NaW5vclZlcnNpb24gPSBHZXRNYXhpbXVtTWlub3JJbmRleChPYmplY3Qua2V5cyhtYWpvck1pbm9yVHJhbnNsYXRvcnNbbWFqb3JdKSk7XG4gICAgICBmb3IgKGxldCBtaW5vciA9IHN0YXJ0OyBtaW5vciA8PSBtYXhpbXVtTWlub3JWZXJzaW9uOyBtaW5vcisrKSB7XG4gICAgICAgIGlmIChtaW5vciBpbiBtYWpvck1pbm9yVHJhbnNsYXRvcnNbbWFqb3JdKSB7XG4gICAgICAgICAgbmVlZGVkVHJhbnNsYXRpb25zLnB1c2goLi4ubWFqb3JNaW5vclRyYW5zbGF0b3JzW21ham9yXVttaW5vcl0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5lZWRlZFRyYW5zbGF0aW9ucztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEdldE1heGltdW1NaW5vckluZGV4KG1pbm9yVmVyc2lvbnM6IEFycmF5PHN0cmluZz4pOiBudW1iZXIge1xuICByZXR1cm4gbWlub3JWZXJzaW9ucy5tYXAoKGEpID0+IE51bWJlcihhKSkucmVkdWNlKChhLCBiKSA9PiAoYSA+IGIgPyBhIDogYikpO1xufVxuIiwiaW1wb3J0IHsgQ2xhc3NOYW1lS2V5LCBFeGVjdXRlUGFyYW1ldGVycywgRXhlY3V0ZVJlc3BvbnNlLCBFeHRlbnNpb25Cb290c3RyYXBJbmZvLCBOb3RpZmljYXRpb24sIFZlcmJJZCB9IGZyb20gJy4uL0pzQXBpSW50ZXJuYWxDb250cmFjdCc7XG5pbXBvcnQgeyBWaXN1YWxJZCwgV29ya2Jvb2tGb3JtYXR0aW5nIH0gZnJvbSAnLi4vY29udHJhY3QvTW9kZWxzJztcbmltcG9ydCB7IE5vdGlmaWNhdGlvbklkIH0gZnJvbSAnLi4vY29udHJhY3QvTm90aWZpY2F0aW9ucyc7XG5cbi8vIHRzbGludDpkaXNhYmxlOm5vLWFueVxuXG4vKiogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB3ZSByZWNlaXZlIG9sZCB2ZXJzIGFuZCBwYXJhbWV0ZXJzIGZyb20gdGhlIGV4dGVybmFsIGJlZm9yZSB3ZSBzZW5kIGl0IHRvIHBsYXRmb3JtICovXG5leHBvcnQgdHlwZSBVcGdyYWRlRXhlY3V0ZUNhbGwgPSAodmVyYjogVmVyYklkLCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycykgPT4geyB2ZXJiOiBWZXJiSWQ7IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzIH07XG5cbi8qKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHdlIHJlY2VpdmVkIGEgcmVzcG9uc2UgYmFjayBmcm9tIHBsYXRmb3JtIGFuZCB3ZSBuZWVkIHRvIGRvd25ncmFkZSBpdCB0byBleHRlcm5hbCdzIHZlcnNpb24gKi9cbmV4cG9ydCB0eXBlIERvd25ncmFkZUV4ZWN1dGVSZXR1cm4gPSAoZXhlY3V0ZVJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UpID0+IEV4ZWN1dGVSZXNwb25zZTtcblxuLyoqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gd2UgcmVjZWl2ZSBhIG5vdGlmaWNhdGlvbiBmcm9tIHBsYXRmb3JtIGFuZCB3ZSBuZWVkIHRvIGRvd25ncmFkZSBpdCB0byBleHRlcm5hbCdzIHZlcnNpb24gKi9cbmV4cG9ydCB0eXBlIERvd25ncmFkZU5vdGlmaWNhdGlvbiA9IChub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbikgPT4gTm90aWZpY2F0aW9uO1xuXG4vLyBUaGlzIGlzIHdoZXJlIHdlIHdpbGwgc3RhcnQgdG8gZGVmaW5lIHNvbWUgb2YgdGhlc2UgdHJhbnNsYXRpb25zLlxuLy8gV2hlbiBtb2RpZnlpbmcgZXhpc3RpbmcgbW9kZWxzLCBhZGQgdGhlIHJlcXVpc2l0ZSBjb252ZXJzaW9uIGZ1bmN0aW9ucyBoZXJlLCB0aGVuIHVzZSB0aGVtXG4vLyBpbiB0aGUgVmVyc2lvbkNvbnZlcnRlckZhY3RvcnkgaW1wbGVtZW50YXRpb24uIEltcG9ydCBvbGQgdmVyc2lvbnMgYXMgeW91IHdvdWxkIGFueSBvdGhlciBtb2R1bGVcblxuLy8gMCA8LT4gVHJhbnNsYXRpb25zXG4vLyBVbmNvbW1lbnQgdGhpcyBsaW5lIHRvIGltcG9ydCBmcm9tIHRoZSBWMCBkZWZpbml0aW9uIG9mIHRoZSBBUElcbi8vIGltcG9ydCAqIGFzIFYwIGZyb20gJ0B0YWJsZWF1LWFwaS1pbnRlcm5hbC1jb250cmFjdC1qc192MCc7XG5cbi8vIDEgPC0+IDIgVHJhbnNsYXRpb25zXG4vLyBVbmNvbW1lbnQgdGhpcyBsaW5lIHRvIGltcG9ydCBmcm9tIHRoZSBWMSBkZWZpbml0aW9uIG9mIHRoZSBBUElcbi8vIGltcG9ydCAqIGFzIFYxIGZyb20gJ0B0YWJsZWF1LWFwaS1pbnRlcm5hbC1jb250cmFjdC1qc192MSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBEb3duZ3JhZGVXb3Jrc2hlZXROYW1lcyhleGVjdXRlUmVzcG9uc2U6IEV4ZWN1dGVSZXNwb25zZSk6IEV4ZWN1dGVSZXNwb25zZSB7XG4gIC8vIEZpeCB0aGUgZGFzaGJvYXJkIGZyaWVuZGx5IG5hbWUgaXNzdWUuIFRoZSBzdHJ1Y3R1cmVzIGFyZSBjb21wYXRpYmxlLFxuICAvLyBzbyB3ZSBzdGlsbCByZXR1cm4gdGhlIG9yaWdpbmFsIHJlcGx5LCBidXQgd2UgY29weSB0aGUgU2hlZXRJbmZvLm5hbWVcbiAgLy8gaW50byB0aGUgRGFzaGJvYXJkWm9uZS5uYW1lLCB3aGVyZSB2MSB3YW50cyB0byBmaW5kIGl0LlxuXG4gIGNvbnN0IGJvb3RzdHJhcEluZm8gPSBleGVjdXRlUmVzcG9uc2UucmVzdWx0IGFzIEV4dGVuc2lvbkJvb3RzdHJhcEluZm87XG4gIGlmIChib290c3RyYXBJbmZvLmV4dGVuc2lvbkRhc2hib2FyZEluZm8gIT09IHVuZGVmaW5lZCkge1xuICAgIGJvb3RzdHJhcEluZm8uZXh0ZW5zaW9uRGFzaGJvYXJkSW5mby56b25lcy5mb3JFYWNoKCh6b25lKSA9PiB7XG4gICAgICBpZiAoem9uZS5zaGVldEluZm8pIHtcbiAgICAgICAgem9uZS5uYW1lID0gem9uZS5zaGVldEluZm8ubmFtZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBleGVjdXRlUmVzcG9uc2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBEb3duZ3JhZGVGbGlwYm9hcmRab25lSUQobm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24pOiBOb3RpZmljYXRpb24ge1xuICAvLyBGaXggdGhlIEZsaXBib2FyZFpvbmVJZCBpc3N1ZS4gT2xkZXIgZXh0ZXJuYWwgdmVyc2lvbnMgc3RpbGwgY2hlY2sgZm9yIGZsaXBib2FyZFpvbmVJRHMuXG4gIC8vIFdoZW4gcnVubmluZyBhZ2FpbnN0IGEgbmV3ZXIgc2VydmVyLCBpZiBmbGlwYm9hcmRab25lSWQgaXMgYWJzZW50LCBzZXQgaXQgdG8gZGVmYXVsdCgwKS5cblxuICBpZiAobm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbklkID09PSBOb3RpZmljYXRpb25JZC5TZWxlY3RlZE1hcmtzQ2hhbmdlZCkge1xuICAgIGNvbnN0IHZpc3VhbE1vZGVsID0gbm90aWZpY2F0aW9uLmRhdGEgYXMgVmlzdWFsSWQ7XG4gICAgaWYgKHZpc3VhbE1vZGVsLmZsaXBib2FyZFpvbmVJRCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB2aXN1YWxNb2RlbC5mbGlwYm9hcmRab25lSUQgPSAwO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBub3RpZmljYXRpb247XG59XG5cbi8vIEZpbHRlciBvdXQgZm9ybWF0dGluZyBzaGVldHMgdGhhdCBhcmUgc3BlY2lmaWVkIGluIHRoZSBjbGFzc05hbWVzIGxpc3RcbmZ1bmN0aW9uIERvd25ncmFkZVdvcmtzaGVldEZvcm1hdHRpbmcoZXhlY3V0ZVJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UsIGNsYXNzTmFtZXM6IENsYXNzTmFtZUtleVtdKTogRXhlY3V0ZVJlc3BvbnNlIHtcbiAgY29uc3QgYm9vdHN0cmFwSW5mbyA9IGV4ZWN1dGVSZXNwb25zZS5yZXN1bHQgYXMgRXh0ZW5zaW9uQm9vdHN0cmFwSW5mbztcblxuICBpZiAoYm9vdHN0cmFwSW5mbz8uZXh0ZW5zaW9uV29ya3NoZWV0SW5mbz8uZm9ybWF0dGluZylcbiAgICBib290c3RyYXBJbmZvLmV4dGVuc2lvbldvcmtzaGVldEluZm8uZm9ybWF0dGluZy5mb3JtYXR0aW5nU2hlZXRzID1cbiAgICAgIGJvb3RzdHJhcEluZm8uZXh0ZW5zaW9uV29ya3NoZWV0SW5mby5mb3JtYXR0aW5nLmZvcm1hdHRpbmdTaGVldHMuZmlsdGVyKCh4KSA9PiAhY2xhc3NOYW1lcy5pbmNsdWRlcyh4LmNsYXNzTmFtZUtleSkpO1xuICByZXR1cm4gZXhlY3V0ZVJlc3BvbnNlO1xufVxuXG4vLyBGaWx0ZXIgb3V0IGZvcm1hdHRpbmcgc2hlZXRzIHRoYXQgYXJlIHNwZWNpZmllZCBpbiB0aGUgY2xhc3NOYW1lcyBsaXN0XG4vLyBGaWx0ZXIgb3V0IGZvcm1hdHRpbmcgc2hlZXRzIHRoYXQgYXJlIHNwZWNpZmllZCBpbiB0aGUgY2xhc3NOYW1lcyBsaXN0XG5mdW5jdGlvbiBEb3duZ3JhZGVXb3Jrc2hlZXRGb3JtYXR0aW5nTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uLCBjbGFzc05hbWVzOiBDbGFzc05hbWVLZXlbXSk6IE5vdGlmaWNhdGlvbiB7XG4gIGlmIChub3RpZmljYXRpb24ubm90aWZpY2F0aW9uSWQgPT09IE5vdGlmaWNhdGlvbklkLldvcmtzaGVldEZvcm1hdHRpbmdDaGFuZ2VkKSB7XG4gICAgY29uc3QgZm9ybWF0dGluZyA9IG5vdGlmaWNhdGlvbi5kYXRhIGFzIFdvcmtib29rRm9ybWF0dGluZztcbiAgICBub3RpZmljYXRpb24uZGF0YSA9IGZvcm1hdHRpbmcuZm9ybWF0dGluZ1NoZWV0cy5maWx0ZXIoKHgpID0+ICFjbGFzc05hbWVzLmluY2x1ZGVzKHguY2xhc3NOYW1lS2V5KSk7XG4gIH1cblxuICByZXR1cm4gbm90aWZpY2F0aW9uO1xufVxuXG4vLyBXZSBhZGRlZCBuZXcgZW51bSB2YWx1ZXMgZm9yIENsYXNzTmFtZUtleXMgZW51bSBpbiAxNzYuIE5lZWQgdG8gZmlsdGVyIHRoZW0gb3V0IGlmIHRoZSBjbGllbnQgdmVyc2lvbiBpcyA8MTc2XG5jb25zdCBDbGFzc05hbWVLZXlzVG9GaWx0ZXIxNzUgPSBbQ2xhc3NOYW1lS2V5LlJvd0RpdmlkZXJzLCBDbGFzc05hbWVLZXkuQ29sdW1uRGl2aWRlcnMsIENsYXNzTmFtZUtleS5QYW5lXTtcblxuZXhwb3J0IGNvbnN0IERvd25ncmFkZVdvcmtzaGVldEZvbWF0dGluZzE3NSA9IChyZXNwb25zZTogRXhlY3V0ZVJlc3BvbnNlKSA9PlxuICBEb3duZ3JhZGVXb3Jrc2hlZXRGb3JtYXR0aW5nKHJlc3BvbnNlLCBDbGFzc05hbWVLZXlzVG9GaWx0ZXIxNzUpO1xuZXhwb3J0IGNvbnN0IERvd25ncmFkZVdvcmtzaGVldEZvbWF0dGluZ05vdGlmaWNhdGlvbjE3NSA9IChub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbikgPT5cbiAgRG93bmdyYWRlV29ya3NoZWV0Rm9ybWF0dGluZ05vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIENsYXNzTmFtZUtleXNUb0ZpbHRlcjE3NSk7XG4iLCJpbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgRXhlY3V0ZVJlc3BvbnNlLCBOb3RpZmljYXRpb24sIFZlcmJJZCB9IGZyb20gJy4uLy4uL0pzQXBpSW50ZXJuYWxDb250cmFjdCc7XG5pbXBvcnQgeyBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB9IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXInO1xuXG4vLyB0c2xpbnQ6ZGlzYWJsZTpuby1hbnlcblxuLyoqXG4gKiBUaGlzIHZlcnNpb24gY29udmVydGVyIGRvZXNuJ3QgYWN0dWFsbHkgZG8gYW55dGhpbmcgYnV0IGlzIHVzZWZ1bCBmb3IgdGVzdGluZyBvciB3aGVuIHdlIGhhdmVcbiAqIGEgbWF0Y2hpbmcgcGxhdGZvcm0gYW5kIGV4dGVybmFsIHZlcnNpb24gbnVtYmVyXG4gKi9cbmV4cG9ydCBjbGFzcyBFeHRlcm5hbElkZW50aXR5VmVyc2lvbkNvbnZlcnRlciBpbXBsZW1lbnRzIEV4dGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIHtcbiAgcHVibGljIGRvd25ncmFkZUV4ZWN1dGVDYWxsKHZlcmI6IGFueSwgcGFyYW1ldGVyczogYW55KTogeyB2ZXJiOiBWZXJiSWQ7IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzIH0ge1xuICAgIHJldHVybiB7XG4gICAgICB2ZXJiOiB2ZXJiIGFzIFZlcmJJZCxcbiAgICAgIHBhcmFtZXRlcnM6IHBhcmFtZXRlcnMgYXMgRXhlY3V0ZVBhcmFtZXRlcnMsXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyB1cGdyYWRlRXhlY3V0ZVJldHVybihleGVjdXRlUmVzcG9uc2U6IEV4ZWN1dGVSZXNwb25zZSwgdmVyYjogVmVyYklkLCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyk6IEV4ZWN1dGVSZXNwb25zZSB7XG4gICAgcmV0dXJuIGV4ZWN1dGVSZXNwb25zZTtcbiAgfVxuXG4gIHB1YmxpYyB1cGdyYWRlTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uKTogTm90aWZpY2F0aW9uIHtcbiAgICByZXR1cm4gbm90aWZpY2F0aW9uO1xuICB9XG59XG4iLCJpbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgRXhlY3V0ZVJlc3BvbnNlLCBOb3RpZmljYXRpb24sIFZlcmJJZCwgVmVyc2lvbk51bWJlciB9IGZyb20gJy4uLy4uL0pzQXBpSW50ZXJuYWxDb250cmFjdCc7XG5pbXBvcnQgeyBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB9IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXInO1xuaW1wb3J0ICogYXMgVHJhbnNsYXRpb25zIGZyb20gJy4vRXh0ZXJuYWxWZXJzaW9uVHJhbnNsYXRpb25zJztcblxuLy8gdHNsaW50OmRpc2FibGU6bm8tYW55XG4vKipcbiAqIFRoZSB2ZXJzaW9uIGNvbnZlcnRlciBpcyBkZXNpZ25lZCB0byBhbGxvdyB0aGUgcGxhdGZvcm0gYW5kIGV4dGVybmFsIG1vZHVsZXNcbiAqIHRvIHNlZW1sZXNzbHkgY29tbXVuaWNhdGUgb3ZlciB0d28gZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoZSBpbnRlcm5hbCBBUEkuIFRoaXMgY29udmVydGVyXG4gKiBzdXBwb3J0cyBleHRlcm5hbCdzIHZlcnNpb24obWlub3IpID49IHBsYXRmb3JtJ3MgdmVyc2lvbihtaW5vcikuIFdoZW4gZXhlY3V0aW5nXG4gKiBjb21tYW5kcywgaXQgaXMgdXNlZCB0byBkb3duZ3JhZGUgdGhlIGV4dGVybmFsIHJlcHJlc2VudGF0aW9uIHRvIHdoYXQgcGxhdGZvcm0ga25vd3Mgb24gdGhlIHdheSBpblxuICogYW5kIHVwZ3JhZGUgdGhlIHJlcHJlc2VudGF0aW9ucyBvbiB0aGUgd2F5IG91dC5cbiAqL1xuZXhwb3J0IGNsYXNzIEV4dGVybmFsU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyIGltcGxlbWVudHMgRXh0ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXIge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyXG4gICAqXG4gICAqIEBwYXJhbSBfZXh0ZXJuYWxWZXJzaW9uIFRoZSB2ZXJzaW9uIG9mIHRoZSBpbnRlcm5hbCBjb250cmFjdCBhcGktZXh0ZXJuYWwtanMgaXMgdXNpbmdcbiAgICogQHBhcmFtIF9wbGF0Zm9ybVZlcnNpb24gVGhlIHZlcnNpb24gb2YgdGhlIGludGVybmFsIGNvbnRyYWN0IHRoZSBhcGktcGxhdGZvcm0tanMgaXMgdXNpbmdcbiAgICogQHBhcmFtIF9kb3duZ3JhZGVFeGVjdXRlQ2FsbFRyYW5zbGF0aW9ucyBPcmRlcmVkIGxpc3Qgb2YgdGhlIHRyYW5zbGF0aW9ucyB0byBwZXJmb3JtIHdoZW4gZG93bmdyYWRpbmcgY21kIHBhcmFtZXRlcnNcbiAgICogQHBhcmFtIF91cGdyYWRlRXhlY3V0ZVJldHVyblRyYW5zbGF0aW9ucyBPcmRlcmVkIGxpc3Qgb2YgdXBncmFkZSB0cmFuc2xhdGlvbnMgdG8gcGVyZm9ybSBhZnRlciBhIGNtZCBpcyBleGVjdXRlZFxuICAgKiBAcGFyYW0gX3VwZ3JhZGVOb3RpZmljYXRpb25UcmFuc2xhdGlvbnMgT3JkZXJlZCBsaXN0IG9mIHVwZ3JhZGUgbm90ZmljYXRpb25zIHRvIHBlcmZvcm0gb24gZXZlbnRzXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfZXh0ZXJuYWxWZXJzaW9uOiBWZXJzaW9uTnVtYmVyLFxuICAgIHByaXZhdGUgX3BsYXRmb3JtVmVyc2lvbjogVmVyc2lvbk51bWJlcixcbiAgICBwcml2YXRlIF9kb3duZ3JhZGVFeGVjdXRlQ2FsbFRyYW5zbGF0aW9uczogQXJyYXk8VHJhbnNsYXRpb25zLkRvd25ncmFkZUV4ZWN1dGVDYWxsPixcbiAgICBwcml2YXRlIF91cGdyYWRlRXhlY3V0ZVJldHVyblRyYW5zbGF0aW9uczogQXJyYXk8VHJhbnNsYXRpb25zLlVwZ3JhZGVFeGVjdXRlUmV0dXJuPixcbiAgICBwcml2YXRlIF91cGdyYWRlTm90aWZpY2F0aW9uVHJhbnNsYXRpb25zOiBBcnJheTxUcmFuc2xhdGlvbnMuVXBncmFkZU5vdGlmaWNhdGlvbj4sXG4gICkge1xuICAgIGlmICh0aGlzLl9leHRlcm5hbFZlcnNpb24ubWFqb3IgPiB0aGlzLl9wbGF0Zm9ybVZlcnNpb24ubWFqb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNvbnZlcnQgYmV0d2VlbiBleHRlcm5hbCB2ZXJzaW9uICR7dGhpcy5fZXh0ZXJuYWxWZXJzaW9uLm1ham9yfVxuICAgICAgYW5kICR7dGhpcy5fcGxhdGZvcm1WZXJzaW9uLm1ham9yfWApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBkb3duZ3JhZGVFeGVjdXRlQ2FsbCh2ZXJiOiBhbnksIHBhcmFtZXRlcnM6IGFueSk6IHsgdmVyYjogVmVyYklkOyBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyB9IHtcbiAgICAvLyBQZXJmb3JtIHRoZSBkb3duZ3JhZGUgb2YgdGhlIHZlcmIgYW5kIHBhcmFtZXRlcnMgdG8gdGhlIGxldmVsIHRoYXQgcGxhdGZvcm0gaXMgdXNpbmdcbiAgICBsZXQgZG93bmdyYWRlZCA9IHsgdmVyYjogdmVyYiwgcGFyYW1ldGVyczogcGFyYW1ldGVycyB9O1xuICAgIGZvciAoY29uc3QgZG93bmdyYWRlVHJhbnNsYXRpb24gb2YgdGhpcy5fZG93bmdyYWRlRXhlY3V0ZUNhbGxUcmFuc2xhdGlvbnMpIHtcbiAgICAgIGRvd25ncmFkZWQgPSBkb3duZ3JhZGVUcmFuc2xhdGlvbihkb3duZ3JhZGVkLnZlcmIsIGRvd25ncmFkZWQucGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRvd25ncmFkZWQ7XG4gIH1cblxuICBwdWJsaWMgdXBncmFkZUV4ZWN1dGVSZXR1cm4oZXhlY3V0ZVJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UsIHZlcmI6IFZlcmJJZCwgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMpOiBFeGVjdXRlUmVzcG9uc2Uge1xuICAgIC8vIFBlcmZvcm0gdGhlIHVwZ3JhZGUgb2YgdGhlIHJlc3BvbnNlIHRvIHdoYXQgdGhlIGV4dGVybmFsIG1vZHVsZSBpcyBleHBlY3RpbmdcbiAgICBsZXQgdXBncmFkZWQgPSBleGVjdXRlUmVzcG9uc2U7XG4gICAgZm9yIChjb25zdCB1cGdyYWRlVHJhbnNsYXRpb24gb2YgdGhpcy5fdXBncmFkZUV4ZWN1dGVSZXR1cm5UcmFuc2xhdGlvbnMpIHtcbiAgICAgIHVwZ3JhZGVkID0gdXBncmFkZVRyYW5zbGF0aW9uKHVwZ3JhZGVkLCB2ZXJiLCBwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdXBncmFkZWQ7XG4gIH1cblxuICBwdWJsaWMgdXBncmFkZU5vdGlmaWNhdGlvbihub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbik6IE5vdGlmaWNhdGlvbiB7XG4gICAgLy8gUGVyZm9ybSB0aGUgdXBncmFkZSBvZiBub3RpZmljYXRpb24gdG8gd2hhdCB0aGUgZXh0ZXJuYWwgbW9kdWxlIGlzIGV4cGVjdGluZ1xuICAgIGxldCB1cGdyYWRlZCA9IG5vdGlmaWNhdGlvbjtcbiAgICBmb3IgKGNvbnN0IHVwZ3JhZGVOb3RpZmljYXRpb24gb2YgdGhpcy5fdXBncmFkZU5vdGlmaWNhdGlvblRyYW5zbGF0aW9ucykge1xuICAgICAgdXBncmFkZWQgPSB1cGdyYWRlTm90aWZpY2F0aW9uKHVwZ3JhZGVkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdXBncmFkZWQ7XG4gIH1cbn1cbiIsImltcG9ydCB7IFZlcnNpb25OdW1iZXIgfSBmcm9tICcuLi8uLi9Kc0FwaUludGVybmFsQ29udHJhY3QnO1xuaW1wb3J0IHsgR2V0TWF4aW11bU1pbm9ySW5kZXgsIE1ham9yTWlub3JUcmFuc2xhdG9ycywgVmVyc2lvbkVxdWFsVG8gfSBmcm9tICcuLi9WZXJzaW9uQ29udmVydGVyRmFjdG9yeSc7XG5pbXBvcnQgeyBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB9IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXInO1xuaW1wb3J0IHsgRXh0ZXJuYWxJZGVudGl0eVZlcnNpb25Db252ZXJ0ZXIgfSBmcm9tICcuL0V4dGVybmFsSWRlbnRpdHlWZXJzaW9uQ29udmVydGVyJztcbmltcG9ydCB7IEV4dGVybmFsU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyIH0gZnJvbSAnLi9FeHRlcm5hbFN0YWNraW5nVmVyc2lvbkNvbnZlcnRlcic7XG5pbXBvcnQgKiBhcyBUcmFuc2xhdGlvbnNFeHRlcm5hbCBmcm9tICcuL0V4dGVybmFsVmVyc2lvblRyYW5zbGF0aW9ucyc7XG5pbXBvcnQgeyBVcGdyYWRlRGF0YVRhYmxlUm93c0FuZENvbHVtbnMsIFVwZ3JhZGVEYXRhVGFibGVUeXBlcyB9IGZyb20gJy4vRXh0ZXJuYWxWZXJzaW9uVHJhbnNsYXRpb25zJztcblxuLy8gQSBtYXBwaW5nIGZyb20gdGhlIGN1cnJlbnQgY2xpZW50IHZlcnNpb24gb2YgaW50ZXJuYWwtY29udHJhY3QgdG8gYW4gb2xkZXIgcGxhdGZvcm0gdmVyc2lvbiBvZiB0aGUgY29udHJhY3QuXG4vLyBFYWNoIHZlcnNpb24gYnVtcCBjYW4gaGF2ZSBhbiBhcnJheSBvZiB0cmFuc2xhdGlvbnMgdG8gcGVyZm9ybSBpbiBvcmRlci5cbi8vIFRoZXNlIHRyYW5zbGF0aW9ucyBoYW5kbGUgZG93bmdyYWRlRXhlY3V0ZUNhbGwgYW5kIHVwZ3JhZGVFeGVjdXRlUmV0dXJuIGFuZCBhcmUgbWVhbnQgdG8gYmUgY2FsbGVkIG9uIHRoZVxuLy8gY2xpZW50L2V4dGVybmFsIHNpZGUuXG4vLyBXaGVuIHVwZGF0aW5nIHRoZSBtYWpvciBvciBtaW5vciB2ZXJzaW9uIG9mIG91ciBpbnRlcm5hbC1jb250cmFjdCwgeW91IHdpbGwgbmVlZCB0byB1cGRhdGUgdGhlc2UgZGF0YSBzdHJ1Y3R1cmVzLlxuLy8gKiBJZiB0aGVyZSBhcmUgdHJhbnNsYXRpb25zIHRvIGFkZCwgYWRkIHRoZW0gdG8gdGhlIHZlcnNpb24gdG8gJ3VwZ3JhZGUgZnJvbScgb3IgJ2Rvd25ncmFkZSB0bycuXG5leHBvcnQgY29uc3QgRXhlY3V0ZU1pbm9yRG93bmdyYWRlQ2FsbEV4dGVybmFsOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VHJhbnNsYXRpb25zRXh0ZXJuYWwuRG93bmdyYWRlRXhlY3V0ZUNhbGw+ID0ge1xuICAxOiB7XG4gICAgOTogW10sIC8vIE5vdGUgdGhhdCB3ZSBwdXQgZG93bmdyYWRlcyBmcm9tIDEuMTAgdG8gMS45IGluIHRoZSBbMV1bOV0gYnVja2V0XG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgRXhlY3V0ZU1pbm9yVXBncmFkZVJldHVybkV4dGVybmFsOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VHJhbnNsYXRpb25zRXh0ZXJuYWwuVXBncmFkZUV4ZWN1dGVSZXR1cm4+ID0ge1xuICAxOiB7XG4gICAgOTogW1VwZ3JhZGVEYXRhVGFibGVUeXBlc10sIC8vIE5vdGUgdGhhdCB3ZSBwdXQgdXBncmFkZXMgZnJvbSAxLjkgdG8gMS4xMCBpbiB0aGUgWzFdWzldIGJ1Y2tldFxuICAgIDI5OiBbVXBncmFkZURhdGFUYWJsZVJvd3NBbmRDb2x1bW5zXSwgLy8gMjAyMS4xIHdhcyByZWxlYXNlZCB3aXRoIDEuMjkuIFVwZ3JhZGUgZnJvbSAxLjI5IGluIHRoZSBbMV1bMjldIGJ1Y2tldFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IEV4ZWN1dGVNaW5vclVwZ3JhZGVOb3RpZmljYXRpb246IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnNFeHRlcm5hbC5VcGdyYWRlTm90aWZpY2F0aW9uPiA9IHtcbiAgMToge1xuICAgIDk6IFtdLCAvLyBOb3RlIHRoYXQgd2UgcHV0IHVwZ3JhZGVzIGZyb20gMS45IHRvIDEuMTAgaW4gdGhlIFsxXVs5XSBidWNrZXRcbiAgfSxcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB3aGljaCBoYXMgdGhlIGFiaWxpdHkgdG8gdXBncmFkZSBhbmQgZG93bmdyYWRlXG4gKiB0aGUgY29udHJhY3QgYmV0d2VlbiB0aGUgdHdvIHZlcnNpb25zIHdoaWNoIGFyZSBzcGVjaWZpZWQuIElmIGV4dGVybmFsTWFqb3JWZXJzaW9uIGlzIGxlc3MgdGhhblxuICogcGxhdGZvcm1NYWpvclZlcnNpb24sIGFuIEV4dGVybmFsSWRlbnRpdHlWZXJzaW9uQ29udmVydGVyIHdpbGwgYmUgcmV0dXJuZWQuXG4gKiBIYW5kbGVzIHVwZ3JhZGUvZG93bmdyYWRlIGZvciBib3RoIG1ham9yIGFuZCBtaW5vciB1cGRhdGVzLlxuICpcbiAqIEBwYXJhbSBleHRlcm5hbFZlcnNpb24gVmVyc2lvbk51bWJlciBvZiB0aGUgaW50ZXJuYWwgYXBpIHdoaWNoIHRoZSBleHRlcm5hbCBtb2R1bGUgaXMgdXNpbmdcbiAqIEBwYXJhbSBwbGF0Zm9ybVZlcnNpb24gVmVyc2lvbk51bWJlciBvZiB0aGUgaW50ZXJuYWwgYXBpIHdoaWNoIHRoZSBwbGF0Zm9ybSBpcyB1c2luZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gQ3JlYXRlRXh0ZXJuYWxDb21wYXRpYmxlVmVyc2lvbkNvbnZlcnRlcihcbiAgZXh0ZXJuYWxWZXJzaW9uOiBWZXJzaW9uTnVtYmVyLFxuICBwbGF0Zm9ybVZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4pOiBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB7XG4gIHJldHVybiBDcmVhdGVFeHRlcm5hbENvbXBhdGlibGVWZXJzaW9uQ29udmVydGVyV2l0aFRyYW5zbGF0b3JzKFxuICAgIGV4dGVybmFsVmVyc2lvbixcbiAgICBwbGF0Zm9ybVZlcnNpb24sXG4gICAgRXhlY3V0ZU1pbm9yRG93bmdyYWRlQ2FsbEV4dGVybmFsLFxuICAgIEV4ZWN1dGVNaW5vclVwZ3JhZGVSZXR1cm5FeHRlcm5hbCxcbiAgICBFeGVjdXRlTWlub3JVcGdyYWRlTm90aWZpY2F0aW9uLFxuICApO1xufVxuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIENyZWF0ZUV4dGVybmFsQ29tcGF0aWJsZVZlcnNpb25Db252ZXJ0ZXJXaXRoVHJhbnNsYXRvcnMuXG4gKiBUaGlzIGZ1bmN0aW9uIHRha2VzIHRoZSB1cGdyYWRlLCBkb3duZ3JhZGUgYXJyYXlzIHNvIHRoYXQgYWxsIHRoZSBsb2dpYyBjYW4gYmUgdGVzdGVkLlxuICpcbiAqIEBwYXJhbSBleHRlcm5hbFZlcnNpb24gVmVyc2lvbk51bWJlciBvZiB0aGUgaW50ZXJuYWwgY29udHJhY3Qgd2hpY2ggdGhlIGV4dGVybmFsIG1vZHVsZSBpcyB1c2luZ1xuICogQHBhcmFtIHBsYXRmb3JtVmVyc2lvbiBWZXJzaW9uTnVtYmVyIG9mIHRoZSBpbnRlcm5hbCBjb250cmFjdCB3aGljaCB0aGUgcGxhdGZvcm0gaXMgdXNpbmdcbiAqIEBwYXJhbSB1cGdyYWRlcyBNYWpvck1pbm9yVHJhbnNsYXRvcnMgZm9yIHJlc3BvbnNlIHVwZ3JhZGVzXG4gKiBAcGFyYW0gZG93bmdyYWRlcyBNYWpvck1pbm9yVHJhbnNsYXRvcnMgZm9yIGV4ZWN1dGUgY2FsbCBkb3duZ3JhZGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDcmVhdGVFeHRlcm5hbENvbXBhdGlibGVWZXJzaW9uQ29udmVydGVyV2l0aFRyYW5zbGF0b3JzKFxuICBleHRlcm5hbFZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4gIHBsYXRmb3JtVmVyc2lvbjogVmVyc2lvbk51bWJlcixcbiAgZG93bmdyYWRlczogTWFqb3JNaW5vclRyYW5zbGF0b3JzPFRyYW5zbGF0aW9uc0V4dGVybmFsLkRvd25ncmFkZUV4ZWN1dGVDYWxsPixcbiAgdXBncmFkZXM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnNFeHRlcm5hbC5VcGdyYWRlRXhlY3V0ZVJldHVybj4sXG4gIHVwZ3JhZGVOb3RpZmljYXRpb25zOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VHJhbnNsYXRpb25zRXh0ZXJuYWwuVXBncmFkZU5vdGlmaWNhdGlvbj4sXG4pOiBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB7XG4gIGNvbnN0IGV4dGVybmFsTWFqb3JWZXJzaW9uOiBudW1iZXIgPSBleHRlcm5hbFZlcnNpb24ubWFqb3I7XG4gIGNvbnN0IHBsYXRmb3JtTWFqb3JWZXJzaW9uOiBudW1iZXIgPSBwbGF0Zm9ybVZlcnNpb24ubWFqb3I7XG4gIGNvbnN0IHBsYXRmb3JtTWlub3JWZXJzaW9uOiBudW1iZXIgPSBwbGF0Zm9ybVZlcnNpb24ubWlub3I7XG5cbiAgLy8gVGhpcyBjaGVjayBpcyBwcmVzZW50IGluIFZlcnNpb25Db252ZXJ0ZXJGYWN0b3J5LiBXZSB0aHJvdyB0aGUgc2FtZSBlcnJvciBoZXJlIGFzIHdlbGwuXG4gIC8vIEhlbmNlIHdlIG9ubHkgbmVlZCB0byBjaGVjayB0aGUgbWlub3IgdmVyc2lvbnMgZm9yIHRyYW5zbGF0aW9ucy5cbiAgaWYgKGV4dGVybmFsTWFqb3JWZXJzaW9uID4gcGxhdGZvcm1NYWpvclZlcnNpb24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEV4dGVybmFsIHZlcnNpb24gbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gcGxhdGZvcm0gdmVyc2lvbi5cbiAgICBleHRlcm5hbE1ham9yVmVyc2lvbj0ke2V4dGVybmFsTWFqb3JWZXJzaW9ufSBwbGF0Zm9ybU1ham9yVmVyc2lvbj0ke3BsYXRmb3JtTWFqb3JWZXJzaW9ufWApO1xuICB9XG5cbiAgaWYgKGV4dGVybmFsTWFqb3JWZXJzaW9uIDwgcGxhdGZvcm1NYWpvclZlcnNpb24gfHwgVmVyc2lvbkVxdWFsVG8oZXh0ZXJuYWxWZXJzaW9uLCBwbGF0Zm9ybVZlcnNpb24pKSB7XG4gICAgcmV0dXJuIG5ldyBFeHRlcm5hbElkZW50aXR5VmVyc2lvbkNvbnZlcnRlcigpO1xuICB9XG5cbiAgLy8gV2FsayB0aGUgc3BhbiBiZXR3ZWVuIHRoZSB2ZXJzaW9ucyB3ZSBoYXZlIGhlcmUgYW5kIGNvbGxlY3QgdGhlIHVwZ3JhZGUgYW5kIGRvd25ncmFkZXMgbmVjZXNzYXJ5XG4gIGNvbnN0IG5lZWRlZEV4ZWN1dGVDYWxsRG93bmdyYWRlOiBBcnJheTxUcmFuc2xhdGlvbnNFeHRlcm5hbC5Eb3duZ3JhZGVFeGVjdXRlQ2FsbD4gPSBHZXROZWVkZWRFeHRlcm5hbFRyYW5zbGF0aW9ucyhcbiAgICBwbGF0Zm9ybU1ham9yVmVyc2lvbixcbiAgICBwbGF0Zm9ybU1pbm9yVmVyc2lvbixcbiAgICBkb3duZ3JhZGVzLFxuICApO1xuXG4gIGNvbnN0IG5lZWRlZEV4ZWN1dGVSZXR1cm5VcGdyYWRlczogQXJyYXk8VHJhbnNsYXRpb25zRXh0ZXJuYWwuVXBncmFkZUV4ZWN1dGVSZXR1cm4+ID0gR2V0TmVlZGVkRXh0ZXJuYWxUcmFuc2xhdGlvbnMoXG4gICAgcGxhdGZvcm1NYWpvclZlcnNpb24sXG4gICAgcGxhdGZvcm1NaW5vclZlcnNpb24sXG4gICAgdXBncmFkZXMsXG4gICk7XG5cbiAgY29uc3QgbmVlZGVkTm90aWZpY2F0aW9uVXBncmFkZXM6IEFycmF5PFRyYW5zbGF0aW9uc0V4dGVybmFsLlVwZ3JhZGVOb3RpZmljYXRpb24+ID0gR2V0TmVlZGVkRXh0ZXJuYWxUcmFuc2xhdGlvbnMoXG4gICAgcGxhdGZvcm1NYWpvclZlcnNpb24sXG4gICAgcGxhdGZvcm1NaW5vclZlcnNpb24sXG4gICAgdXBncmFkZU5vdGlmaWNhdGlvbnMsXG4gICk7XG5cbiAgLy8gUmV2ZXJzZSB0aGUgZG93bmdyYWRlIGNhbGxzLCBzbyB0aGF0IHdlIHN0YXJ0IHRoZSBkb3duZ3JhZGUgZnJvbSB0aGUgZXh0ZXJuYWwgdmVyc2lvbiB0byB0aGUgcGxhdGZvcm0gdmVyc2lvblxuICBuZWVkZWRFeGVjdXRlQ2FsbERvd25ncmFkZS5yZXZlcnNlKCk7XG4gIHJldHVybiBuZXcgRXh0ZXJuYWxTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIoXG4gICAgZXh0ZXJuYWxWZXJzaW9uLFxuICAgIHBsYXRmb3JtVmVyc2lvbixcbiAgICBuZWVkZWRFeGVjdXRlQ2FsbERvd25ncmFkZSxcbiAgICBuZWVkZWRFeGVjdXRlUmV0dXJuVXBncmFkZXMsXG4gICAgbmVlZGVkTm90aWZpY2F0aW9uVXBncmFkZXMsXG4gICk7XG59XG5cbmZ1bmN0aW9uIEdldE5lZWRlZEV4dGVybmFsVHJhbnNsYXRpb25zPFQ+KFxuICBwbGF0Zm9ybU1ham9yVmVyc2lvbjogbnVtYmVyLFxuICBwbGF0Zm9ybU1pbm9yVmVyc2lvbjogbnVtYmVyLFxuICBtYWpvck1pbm9yVHJhbnNsYXRvcnM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUPixcbik6IEFycmF5PFQ+IHtcbiAgY29uc3QgbmVlZGVkVHJhbnNsYXRpb25zOiBBcnJheTxUPiA9IFtdO1xuXG4gIGlmIChwbGF0Zm9ybU1ham9yVmVyc2lvbiBpbiBtYWpvck1pbm9yVHJhbnNsYXRvcnMpIHtcbiAgICBjb25zdCBzdGFydCA9IHBsYXRmb3JtTWlub3JWZXJzaW9uO1xuICAgIGNvbnN0IG1heGltdW1NaW5vclZlcnNpb24gPSBHZXRNYXhpbXVtTWlub3JJbmRleChPYmplY3Qua2V5cyhtYWpvck1pbm9yVHJhbnNsYXRvcnNbcGxhdGZvcm1NYWpvclZlcnNpb25dKSk7XG4gICAgZm9yIChsZXQgbWlub3IgPSBzdGFydDsgbWlub3IgPD0gbWF4aW11bU1pbm9yVmVyc2lvbjsgbWlub3IrKykge1xuICAgICAgaWYgKG1pbm9yIGluIG1ham9yTWlub3JUcmFuc2xhdG9yc1twbGF0Zm9ybU1ham9yVmVyc2lvbl0pIHtcbiAgICAgICAgbmVlZGVkVHJhbnNsYXRpb25zLnB1c2goLi4ubWFqb3JNaW5vclRyYW5zbGF0b3JzW3BsYXRmb3JtTWFqb3JWZXJzaW9uXVttaW5vcl0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZWVkZWRUcmFuc2xhdGlvbnM7XG59XG4iLCJpbXBvcnQge1xuICBEYXRhSGVhZGVyLFxuICBEYXRhVGFibGUsXG4gIERhdGFUeXBlQ29udmVydGVyLFxuICBFeGVjdXRlUGFyYW1ldGVycyxcbiAgRXhlY3V0ZVJlc3BvbnNlLFxuICBOb3RpZmljYXRpb24sXG4gIFBhcmFtZXRlcklkLFxuICBTZWxlY3RlZE1hcmtzVGFibGUsXG4gIFVuZGVybHlpbmdEYXRhVGFibGUsXG4gIFZlcmJJZCxcbn0gZnJvbSAnLi4vLi4vSnNBcGlJbnRlcm5hbENvbnRyYWN0JztcblxuLy8gdHNsaW50OmRpc2FibGU6bm8tYW55XG5cbi8qKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHdlIHJlY2VpdmUgbmV3ZXIgdmVyc2lvbiBhbmQgcGFyYW1ldGVycyBmcm9tIHRoZSBleHRlcm5hbCBiZWZvcmUgd2Ugc2VuZCBpdCB0byBwbGF0Zm9ybSAqL1xuZXhwb3J0IHR5cGUgRG93bmdyYWRlRXhlY3V0ZUNhbGwgPSAodmVyYjogVmVyYklkLCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycykgPT4geyB2ZXJiOiBWZXJiSWQ7IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzIH07XG5cbi8qKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHdlIHJlY2VpdmUgYSByZXNwb25zZSBiYWNrIGZyb20gcGxhdGZvcm0gYW5kIHdlIG5lZWQgdG8gdXBncmFkZSBpdCB0byBleHRlcm5hbCdzIHZlcnNpb25cbiAqICBUaGUgdmVyYiBhbmQgcGFyYW1ldGVycyBwcm92aWRlIGEgY29udGV4dCB0byBkZWNpZGUgaG93IHRvIGhhbmRsZSB0aGUgcmVzcG9uc2UuXG4gKi9cbmV4cG9ydCB0eXBlIFVwZ3JhZGVFeGVjdXRlUmV0dXJuID0gKGV4ZWN1dGVSZXNwb25zZTogRXhlY3V0ZVJlc3BvbnNlLCB2ZXJiOiBWZXJiSWQsIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzKSA9PiBFeGVjdXRlUmVzcG9uc2U7XG5cbi8qKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHdlIHJlY2VpdmUgYSBub3RpZmljYXRpb24gZnJvbSBwbGF0Zm9ybSBhbmQgd2UgbmVlZCB0byB1cGdyYWRlIGl0IHRvIGV4dGVybmFsJ3MgdmVyc2lvbiAqL1xuZXhwb3J0IHR5cGUgVXBncmFkZU5vdGlmaWNhdGlvbiA9IChub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbikgPT4gTm90aWZpY2F0aW9uO1xuXG4vLyAxLjIgLT4gMS4wIFRyYW5zbGF0aW9uc1xuLy8gVW5jb21tZW50IHRoaXMgbGluZSB0byBpbXBvcnQgZnJvbSB0aGUgVjEgZGVmaW5pdGlvbiBvZiB0aGUgQVBJXG4vLyBpbXBvcnQgKiBhcyBWMSBmcm9tICdAdGFibGVhdS1hcGktaW50ZXJuYWwtY29udHJhY3QtanNfdjEnO1xuXG4vKipcbiAqIFByaW9yIHRvIDIwMTkuMiAoaW50ZXJuYWwtY29udHJhY3QgdjEuOSksIERhdGFWYWx1ZS52YWx1ZSB3ZXJlIGFsbCBzdHJpbmdzLlxuICogR28gdGhyb3VnaCBhbGwgRGF0YVZhbHVlIG9iamVjdHMuIElmIHdlIGhhdmUgYSBzdHJpbmcsIGJ1dCB0aGUgdHlwZSBzaG91bGQgbm90IGJlIGEgc3RyaW5nLFxuICogY29udmVydCBpdCB0byB0aGUgY29ycmVjdCB0eXBlLiBUaGUgdHlwZSBvZiBEYXRhVmFsdWUudmFsdWUgaXMgJ2FueScgaW4gdGhlIGNvbnRyYWN0LCBzb1xuICogdGhpcyBjaGFuZ2UgZG9lc24ndCBuZWVkIGFueSB1cGRhdGVzIHRvIGNsYXNzZXMgb3IgdHlwZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBVcGdyYWRlRGF0YVRhYmxlVHlwZXMoZXhlY3V0ZVJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UsIHZlcmI6IFZlcmJJZCwgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMpOiBFeGVjdXRlUmVzcG9uc2Uge1xuICBpZiAoIWV4ZWN1dGVSZXNwb25zZSkge1xuICAgIHJldHVybiBleGVjdXRlUmVzcG9uc2U7XG4gIH1cblxuICBjb25zdCBvbGRVbmRlcmx5aW5nRGF0YVRhYmxlID0gZXhlY3V0ZVJlc3BvbnNlLnJlc3VsdCBhcyBVbmRlcmx5aW5nRGF0YVRhYmxlO1xuICBpZiAob2xkVW5kZXJseWluZ0RhdGFUYWJsZS5kYXRhICE9PSB1bmRlZmluZWQgJiYgb2xkVW5kZXJseWluZ0RhdGFUYWJsZS5pc1N1bW1hcnkgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnZlcnREYXRhVmFsdWVzKG9sZFVuZGVybHlpbmdEYXRhVGFibGUuZGF0YSk7XG4gICAgcmV0dXJuIGV4ZWN1dGVSZXNwb25zZTtcbiAgfVxuXG4gIGNvbnN0IG9sZFNlbGVjdGVkTWFya3NUYWJsZSA9IGV4ZWN1dGVSZXNwb25zZS5yZXN1bHQgYXMgU2VsZWN0ZWRNYXJrc1RhYmxlO1xuICBpZiAob2xkU2VsZWN0ZWRNYXJrc1RhYmxlLmRhdGEgIT09IHVuZGVmaW5lZCAmJiBBcnJheS5pc0FycmF5KG9sZFNlbGVjdGVkTWFya3NUYWJsZS5kYXRhKSkge1xuICAgIG9sZFNlbGVjdGVkTWFya3NUYWJsZS5kYXRhLmZvckVhY2goKG1hcmtzVGFibGUpID0+IHtcbiAgICAgIGNvbnZlcnREYXRhVmFsdWVzKG1hcmtzVGFibGUpO1xuICAgIH0pO1xuICAgIHJldHVybiBleGVjdXRlUmVzcG9uc2U7XG4gIH1cblxuICByZXR1cm4gZXhlY3V0ZVJlc3BvbnNlO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0RGF0YVZhbHVlcyh0YWJsZTogRGF0YVRhYmxlKTogdm9pZCB7XG4gIC8vIGRhdGFUYWJsZSBpcyBhIHR3by1kaW1lbnNpb25hbCBhcnJheSBvZiBkYXRhLiBGaXJzdCBpbmRleCBpcyB0aGUgcm93LCBzZWNvbmQgaXMgdGhlIGNvbHVtbi5cbiAgaWYgKHRhYmxlID09PSB1bmRlZmluZWQgfHwgdGFibGUuZGF0YVRhYmxlID09PSB1bmRlZmluZWQgfHwgIUFycmF5LmlzQXJyYXkodGFibGUuZGF0YVRhYmxlKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRhYmxlLmRhdGFUYWJsZS5mb3JFYWNoKChyb3cpID0+IHtcbiAgICByb3cuZm9yRWFjaCgoZGF0YVZhbHVlLCBjb2x1bW5JbmRleCkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSBkYXRhVmFsdWUudmFsdWU7XG4gICAgICBpZiAodmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgZGF0YVZhbHVlLnZhbHVlID0gRGF0YVR5cGVDb252ZXJ0ZXIuY29udmVydFZhbHVlQXNTdHJpbmdUb1ZhbHVlKHZhbHVlLCB0YWJsZS5oZWFkZXJzW2NvbHVtbkluZGV4XS5kYXRhVHlwZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFByaW9yIHRvIDIwMjEuMiAoaW50ZXJuYWwtY29udHJhY3QgdjEuMjkgYW5kIGJlbG93KSwgZ2V0U3VtbWFyeURhdGFBc3luYyBkaWQgbm90IHN1cHBvcnQgbWF4Um93cyxcbiAqIGFuZCBhbnkgZ2V0Li4uRGF0YUFzeW5jIGRpZCBub3Qgc3VwcG9ydCBjb2x1bW5zVG9JbmNsdWRlQnlJZC5cbiAqIFRyaW0gcmVzdWx0IHRvIG1heFJvd3MgaWYgaXQgaXMgaW5jbHVkZWQgaW4gdGhlIHBhcmFtZXRlcnMgZm9yIGdldFN1bW1hcnlEYXRhQXN5bmNcbiAqIFRyaW0gY29sdW1ucyB0byBjb2x1bW5zVG9JbmNsdWRlIGlmIGluY2x1ZGVkIGluIHRoZSBwYXJhbWV0ZXJzIGZvciBhbnkgZ2V0Li4uRGF0YUFzeW5jXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBVcGdyYWRlRGF0YVRhYmxlUm93c0FuZENvbHVtbnMoXG4gIGV4ZWN1dGVSZXNwb25zZTogRXhlY3V0ZVJlc3BvbnNlLFxuICB2ZXJiOiBWZXJiSWQsXG4gIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzLFxuKTogRXhlY3V0ZVJlc3BvbnNlIHtcbiAgaWYgKGlzR2V0U3VtbWFyeURhdGFWZXJiKHZlcmIpICYmIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuTWF4Um93c10pIHtcbiAgICBleGVjdXRlUmVzcG9uc2UgPSBhZGp1c3REYXRhUm93TGVuZ3RoKGV4ZWN1dGVSZXNwb25zZSwgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5NYXhSb3dzXSBhcyBudW1iZXIpO1xuICB9XG5cbiAgaWYgKGlzR2V0VGFibGVEYXRhVmVyYih2ZXJiKSAmJiBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkNvbHVtbnNUb0luY2x1ZGVCeUlkXSkge1xuICAgIGV4ZWN1dGVSZXNwb25zZSA9IGFkanVzdERhdGFDb2x1bW5zKGV4ZWN1dGVSZXNwb25zZSwgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5Db2x1bW5zVG9JbmNsdWRlQnlJZF0gYXMgc3RyaW5nW10pO1xuICB9XG5cbiAgcmV0dXJuIGV4ZWN1dGVSZXNwb25zZTtcbn1cblxuZnVuY3Rpb24gaXNHZXRTdW1tYXJ5RGF0YVZlcmIodmVyYjogVmVyYklkKTogYm9vbGVhbiB7XG4gIHJldHVybiB2ZXJiID09PSBWZXJiSWQuR2V0RGF0YVN1bW1hcnlEYXRhO1xufVxuXG5mdW5jdGlvbiBpc0dldFRhYmxlRGF0YVZlcmIodmVyYjogVmVyYklkKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgdmVyYiA9PT0gVmVyYklkLkdldERhdGFTdW1tYXJ5RGF0YSB8fFxuICAgIHZlcmIgPT09IFZlcmJJZC5HZXRVbmRlcmx5aW5nVGFibGVEYXRhIHx8XG4gICAgdmVyYiA9PT0gVmVyYklkLkdldExvZ2ljYWxUYWJsZURhdGEgfHxcbiAgICB2ZXJiID09PSBWZXJiSWQuR2V0RGF0YVNvdXJjZURhdGEgfHxcbiAgICB2ZXJiID09PSBWZXJiSWQuR2V0VW5kZXJseWluZ0RhdGFcbiAgKTtcbn1cblxuZnVuY3Rpb24gYWRqdXN0RGF0YVJvd0xlbmd0aChleGVjdXRlUmVzcG9uc2U6IEV4ZWN1dGVSZXNwb25zZSwgbWF4Um93czogbnVtYmVyKTogRXhlY3V0ZVJlc3BvbnNlIHtcbiAgY29uc3QgdW5kZXJseWluZ0RhdGFUYWJsZSA9IGV4ZWN1dGVSZXNwb25zZS5yZXN1bHQgYXMgVW5kZXJseWluZ0RhdGFUYWJsZTtcbiAgaWYgKCF1bmRlcmx5aW5nRGF0YVRhYmxlLmRhdGEgfHwgIUFycmF5LmlzQXJyYXkodW5kZXJseWluZ0RhdGFUYWJsZS5kYXRhLmRhdGFUYWJsZSkpIHtcbiAgICByZXR1cm4gZXhlY3V0ZVJlc3BvbnNlO1xuICB9XG5cbiAgaWYgKG1heFJvd3MgPiAwICYmIG1heFJvd3MgPCB1bmRlcmx5aW5nRGF0YVRhYmxlLmRhdGEuZGF0YVRhYmxlLmxlbmd0aCkge1xuICAgIHVuZGVybHlpbmdEYXRhVGFibGUuZGF0YS5kYXRhVGFibGUubGVuZ3RoID0gbWF4Um93cztcbiAgfVxuICByZXR1cm4gZXhlY3V0ZVJlc3BvbnNlO1xufVxuXG5mdW5jdGlvbiBhZGp1c3REYXRhQ29sdW1ucyhleGVjdXRlUmVzcG9uc2U6IEV4ZWN1dGVSZXNwb25zZSwgY29sdW1uc1RvSW5jbHVkZTogc3RyaW5nW10pOiBFeGVjdXRlUmVzcG9uc2Uge1xuICBpZiAoY29sdW1uc1RvSW5jbHVkZS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gZXhlY3V0ZVJlc3BvbnNlO1xuICB9XG5cbiAgLy8gdmVyaWZ5IHRoYXQgd2UgaGF2ZSBhIHZhbGlkIFVuZGVybHlpbmdEYXRhVGFibGVcbiAgY29uc3QgdW5kZXJseWluZ0RhdGFUYWJsZSA9IGV4ZWN1dGVSZXNwb25zZS5yZXN1bHQgYXMgVW5kZXJseWluZ0RhdGFUYWJsZTtcbiAgaWYgKCF1bmRlcmx5aW5nRGF0YVRhYmxlLmRhdGEgfHwgIUFycmF5LmlzQXJyYXkodW5kZXJseWluZ0RhdGFUYWJsZS5kYXRhLmRhdGFUYWJsZSkgfHwgIUFycmF5LmlzQXJyYXkodW5kZXJseWluZ0RhdGFUYWJsZS5kYXRhLmhlYWRlcnMpKSB7XG4gICAgcmV0dXJuIGV4ZWN1dGVSZXNwb25zZTtcbiAgfVxuXG4gIC8vIDEuIGZpbHRlciB0aGUgaGVhZGVycyB0byBvbmx5IGNvbHVtbnNUb0luY2x1ZGVcbiAgLy8gMi4gdXNlIHRoZSBuZXcgaGVhZGVycyB0byBmaWx0ZXIgYWxsIHJvd3NcbiAgLy8gMy4gdXBkYXRlIHRoZSBpbmRpY2VzIGluIG91ciBuZXcgaGVhZGVyc1xuICBjb25zdCBuZXdIZWFkZXJzOiBEYXRhSGVhZGVyW10gPSB1bmRlcmx5aW5nRGF0YVRhYmxlLmRhdGEuaGVhZGVycy5maWx0ZXIoKGhlYWRlciwgaW5kZXgpID0+XG4gICAgY29sdW1uc1RvSW5jbHVkZS5maW5kKChuYW1lKSA9PiBuYW1lID09PSBoZWFkZXIuZmllbGROYW1lKSxcbiAgKTtcbiAgdW5kZXJseWluZ0RhdGFUYWJsZS5kYXRhLmRhdGFUYWJsZS5mb3JFYWNoKChyb3csIGluZGV4KSA9PiB7XG4gICAgdW5kZXJseWluZ0RhdGFUYWJsZS5kYXRhLmRhdGFUYWJsZVtpbmRleF0gPSByb3cuZmlsdGVyKFxuICAgICAgKHZhbHVlLCB2YWx1ZUluZGV4KSA9PiBuZXdIZWFkZXJzLmZpbmRJbmRleCgoaGVhZGVyKSA9PiBoZWFkZXIuaW5kZXggPT09IHZhbHVlSW5kZXgpICE9PSAtMSxcbiAgICApO1xuICB9KTtcbiAgbGV0IG5ld0luZGV4ID0gMDtcbiAgdW5kZXJseWluZ0RhdGFUYWJsZS5kYXRhLmhlYWRlcnMgPSBuZXdIZWFkZXJzLm1hcCgoaGVhZGVyKSA9PiB7XG4gICAgaGVhZGVyLmluZGV4ID0gbmV3SW5kZXgrKztcbiAgICByZXR1cm4gaGVhZGVyO1xuICB9KTtcblxuICByZXR1cm4gZXhlY3V0ZVJlc3BvbnNlO1xufVxuIiwiLy8gRXhwb3J0IGV2ZXJ5dGhpbmcgd2hpY2ggaGFkIGJlZW4gcHJldmlvdXNseSBpbiB0aGUgYXBpLXNoYXJlZCBtb2R1bGVcblxuZXhwb3J0IHsgQXBpVmVyc2lvbiB9IGZyb20gJy4vQXBpU2hhcmVkL0FwaVZlcnNpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9BcGlTaGFyZWQvQ3Jvc3NGcmFtZS9Dcm9zc0ZyYW1lQm9vdHN0cmFwJztcbmV4cG9ydCB7IENyb3NzRnJhbWVEaXNwYXRjaGVyIH0gZnJvbSAnLi9BcGlTaGFyZWQvQ3Jvc3NGcmFtZS9Dcm9zc0ZyYW1lRGlzcGF0Y2hlcic7XG5leHBvcnQgeyBEYXRhU291cmNlIH0gZnJvbSAnLi9BcGlTaGFyZWQvRGF0YVNvdXJjZSc7XG5leHBvcnQgeyBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MgfSBmcm9tICcuL0FwaVNoYXJlZC9FbnVtTWFwcGluZ3MvRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzJztcbmV4cG9ydCB7IEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyB9IGZyb20gJy4vQXBpU2hhcmVkL0VudW1NYXBwaW5ncy9JbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MnO1xuZXhwb3J0IHsgRXZlbnRMaXN0ZW5lck1hbmFnZXIgfSBmcm9tICcuL0FwaVNoYXJlZC9FdmVudExpc3RlbmVyTWFuYWdlcic7XG5leHBvcnQgeyBGaWVsZCB9IGZyb20gJy4vQXBpU2hhcmVkL0ZpZWxkJztcbmV4cG9ydCB7IEN1c3RvbVZpZXdJbXBsIH0gZnJvbSAnLi9BcGlTaGFyZWQvSW1wbC9DdXN0b21WaWV3SW1wbCc7XG5leHBvcnQgeyBEYXNoYm9hcmRJbXBsIH0gZnJvbSAnLi9BcGlTaGFyZWQvSW1wbC9EYXNoYm9hcmRJbXBsJztcbmV4cG9ydCB7IERhc2hib2FyZE9iamVjdEltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL0Rhc2hib2FyZE9iamVjdEltcGwnO1xuZXhwb3J0IHsgRGF0YVNvdXJjZUltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL0RhdGFTb3VyY2VJbXBsJztcbmV4cG9ydCB7IFBhcmFtZXRlckltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL1BhcmFtZXRlckltcGwnO1xuZXhwb3J0IHsgU2hlZXRJbXBsIH0gZnJvbSAnLi9BcGlTaGFyZWQvSW1wbC9TaGVldEltcGwnO1xuZXhwb3J0IHsgU2hlZXRJbmZvSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvU2hlZXRJbmZvSW1wbCc7XG5leHBvcnQgeyBTaW5nbGVFdmVudE1hbmFnZXJJbXBsIH0gZnJvbSAnLi9BcGlTaGFyZWQvSW1wbC9TaW5nbGVFdmVudE1hbmFnZXJJbXBsJztcbmV4cG9ydCB7IFN0b3J5SW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvU3RvcnlJbXBsJztcbmV4cG9ydCB7IFN0b3J5UG9pbnRJbXBsIH0gZnJvbSAnLi9BcGlTaGFyZWQvSW1wbC9TdG9yeVBvaW50SW1wbCc7XG5leHBvcnQgeyBTdG9yeVBvaW50SW5mb0ltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL1N0b3J5UG9pbnRJbmZvSW1wbCc7XG5leHBvcnQgeyBXb3JrYm9va0ltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL1dvcmtib29rSW1wbCc7XG5leHBvcnQgeyBXb3Jrc2hlZXRJbXBsIH0gZnJvbSAnLi9BcGlTaGFyZWQvSW1wbC9Xb3Jrc2hlZXRJbXBsJztcbmV4cG9ydCB7IFBvaW50IH0gZnJvbSAnLi9BcGlTaGFyZWQvUG9pbnQnO1xuZXhwb3J0IHsgQW5ub3RhdGlvblNlcnZpY2UgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9Bbm5vdGF0aW9uU2VydmljZSc7XG5leHBvcnQgeyBEYXRhU291cmNlU2VydmljZSB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL0RhdGFTb3VyY2VTZXJ2aWNlJztcbmV4cG9ydCB7IEV4cG9ydFNlcnZpY2UgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9FeHBvcnRTZXJ2aWNlJztcbmV4cG9ydCB7IEZpbHRlclNlcnZpY2UgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9GaWx0ZXJTZXJ2aWNlJztcbmV4cG9ydCB7IEdldERhdGFTZXJ2aWNlIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvR2V0RGF0YVNlcnZpY2UnO1xuZXhwb3J0IHsgTm90aWZpY2F0aW9uU2VydmljZSwgVW5yZWdpc3RlckZuIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvTm90aWZpY2F0aW9uU2VydmljZSc7XG5leHBvcnQgeyBQYXJhbWV0ZXJzU2VydmljZSB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL1BhcmFtZXRlcnNTZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL1JlZ2lzdGVyQWxsU2hhcmVkU2VydmljZXMnO1xuZXhwb3J0IHsgU2VsZWN0aW9uU2VydmljZSB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL1NlbGVjdGlvblNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5JztcbmV4cG9ydCB7IFNpemVTZXJ2aWNlIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvU2l6ZVNlcnZpY2UnO1xuZXhwb3J0IHsgU3RvcnlBY3RpdmF0aW9uU2VydmljZSB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL1N0b3J5QWN0aXZhdGlvblNlcnZpY2UnO1xuZXhwb3J0IHsgVml6U2VydmljZSB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL1ZpelNlcnZpY2UnO1xuZXhwb3J0IHsgQ2xpZW50SW5mb1NlcnZpY2VJbXBsIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9DbGllbnRJbmZvU2VydmljZUltcGwnO1xuZXhwb3J0IHsgTm90aWZpY2F0aW9uU2VydmljZUltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL05vdGlmaWNhdGlvblNlcnZpY2VJbXBsJztcbmV4cG9ydCB7IE5vdGlmaWNhdGlvblNlcnZpY2VJbXBsQmFzZSwgUmVnaXN0cmF0aW9uIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9Ob3RpZmljYXRpb25TZXJ2aWNlSW1wbEJhc2UnO1xuZXhwb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9TZXJ2aWNlSW1wbEJhc2UnO1xuZXhwb3J0IHsgU2l6ZVNlcnZpY2VJbXBsIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9TaXplU2VydmljZUltcGwnO1xuZXhwb3J0IHsgU3RvcnlBY3RpdmF0aW9uU2VydmljZUltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1N0b3J5QWN0aXZhdGlvblNlcnZpY2VJbXBsJztcbmV4cG9ydCB7IFNpbmdsZUV2ZW50TWFuYWdlciB9IGZyb20gJy4vQXBpU2hhcmVkL1NpbmdsZUV2ZW50TWFuYWdlcic7XG5leHBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuL0FwaVNoYXJlZC9UYWJsZWF1RXJyb3InO1xuZXhwb3J0IHsgRGVmZXJyZWQgfSBmcm9tICcuL0FwaVNoYXJlZC9VdGlscy9EZWZlcnJlZCc7XG5leHBvcnQgeyBFcnJvckhlbHBlcnMgfSBmcm9tICcuL0FwaVNoYXJlZC9VdGlscy9FcnJvckhlbHBlcnMnO1xuZXhwb3J0IHsgRXhwb3J0SGVscGVycyB9IGZyb20gJy4vQXBpU2hhcmVkL1V0aWxzL0V4cG9ydEhlbHBlcnMnO1xuZXhwb3J0IHsgU2hlZXRVdGlscyB9IGZyb20gJy4vQXBpU2hhcmVkL1V0aWxzL1NoZWV0VXRpbHMnO1xuZXhwb3J0IHsgVmVyc2lvbk51bWJlciB9IGZyb20gJy4vQXBpU2hhcmVkL1ZlcnNpb25OdW1iZXInO1xuZXhwb3J0IHsgVmVyc2lvbmVkRXh0ZXJuYWxBcGlEaXNwYXRjaGVyIH0gZnJvbSAnLi9WZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXInO1xuIiwiaW1wb3J0IHsgVmVyc2lvbk51bWJlciB9IGZyb20gJy4vVmVyc2lvbk51bWJlcic7XG5pbXBvcnQgeyBWZXJzaW9uTnVtYmVyQ29udHJhY3QgfSBmcm9tICcuL1ZlcnNpb25OdW1iZXJDb250cmFjdCc7XG5cbi8qKlxuICogVGhpcyBpcyB0aGUgc2luZ2xldG9uIHdyYXBwZXIgb2YgVmVyc2lvbk51bWJlclxuICovXG5leHBvcnQgY2xhc3MgQXBpVmVyc2lvbiB7XG4gIC8vIFVzaW5nIHNvbWUgd2VicGFjayB0cmlja3MsIHdlIGNhbiBpbmplY3QgdGhpcyB2ZXJzaW9uIGludG8gb3VyIGNvZGUgKGtpbmRhIGxpa2UgYysrIHByZXByb2Nlc3NvciBzdHVmZilcbiAgcHJpdmF0ZSBzdGF0aWMgX2luc3RhbmNlOiBWZXJzaW9uTnVtYmVyQ29udHJhY3Q7XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgdmVyc2lvbiBudW1iZXIuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdldCBJbnN0YW5jZSgpOiBWZXJzaW9uTnVtYmVyQ29udHJhY3Qge1xuICAgIHJldHVybiBBcGlWZXJzaW9uLl9pbnN0YW5jZTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgU2V0VmVyc2lvbk51bWJlcihudW1TdHJpbmc6IHN0cmluZywgaXNBbHBoYTogYm9vbGVhbik6IHZvaWQge1xuICAgIEFwaVZlcnNpb24uX2luc3RhbmNlID0gbmV3IFZlcnNpb25OdW1iZXIobnVtU3RyaW5nLCBpc0FscGhhKTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IENvbm5lY3Rpb25EZXNjcmlwdGlvblN1bW1hcnkgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIGEgY29ubmVjdGlvbiBzdW1tYXJ5LlxuICogVGhpcyBkb2VzIG5vdCBmb2xsb3cgdGhlIEltcGwgcGF0dGVybiBhcyBpdCBpcyBqdXN0IGEgcHJvcGVydHkgYmFnLlxuICovXG5leHBvcnQgY2xhc3MgQ29ubmVjdGlvblN1bW1hcnkgaW1wbGVtZW50cyBDb250cmFjdC5Db25uZWN0aW9uU3VtbWFyeSB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9jb25uZWN0aW9uSW5mbzogQ29ubmVjdGlvbkRlc2NyaXB0aW9uU3VtbWFyeSkge31cblxuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fY29ubmVjdGlvbkluZm8ubmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fY29ubmVjdGlvbkluZm8uaWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNlcnZlclVSSSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jb25uZWN0aW9uSW5mby5zZXJ2ZXJVUkk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fY29ubmVjdGlvbkluZm8udHlwZTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIENvbW1hbmRSZXNwb25zZU1lc3NhZ2UsXG4gIENyb3NzRnJhbWVNZXNzZW5nZXIsXG4gIEluaXRpYWxpemF0aW9uT3B0aW9ucyxcbiAgTUVTU0FHSU5HX1ZFUlNJT04gYXMgQXBpTWVzc2FnaW5nVmVyc2lvbixcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IENyb3NzRnJhbWVEaXNwYXRjaGVyIH0gZnJvbSAnLi9Dcm9zc0ZyYW1lRGlzcGF0Y2hlcic7XG5cbi8vIENoZWNrcyB0byBzZWUgaWYgd2UgYXJlIHJ1bm5pbmcgaW4gYW4gaWZyYW1lIGN1cnJlbnRseTogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzMyNjA3Ni84ODIxMTUzXG5mdW5jdGlvbiBpbklmcmFtZSh0aGlzV2luZG93OiBXaW5kb3cpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gdGhpc1dpbmRvdy5zZWxmICE9PSB0aGlzV2luZG93LnBhcmVudDtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cbi8qKlxuICogQXR0ZW1wdHMgdG8gYm9vdHN0cmFwIHRoZSBleHRlbnNpb24gd2l0aCBhIGNyb3NzLWZyYW1lIHBhcmVudCB3aGVyZSBUYWJsZWF1IGlzIHJ1bm5pbmdcbiAqXG4gKiBAcGFyYW0gdGhpc1dpbmRvdyBUaGUgd2luZG93IHdoaWNoIHdlIGFyZSBydW5uaW5nIGluIChpbmplY3RlZCBmb3IgdW5pdCB0ZXN0aW5nIHB1cnBvc2VzKVxuICogQHBhcmFtIGludGVybmFsQ29udHJhY3RWZXJzaW9uIFRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgaW50ZXJuYWwgY29udHJhY3Qgd2UgYXJlIHVzaW5nXG4gKiBAcmV0dXJucyBBIHByb21pc2Ugd2hpY2ggaXMgZG9pbmcgdGhlIGFjdHVhbCBib290c3RyYXBwaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkb0Nyb3NzRnJhbWVCb290c3RyYXAoXG4gIHRoaXNXaW5kb3c6IFdpbmRvdyxcbiAgaW50ZXJuYWxDb250cmFjdFZlcnNpb246IENvbnRyYWN0LlZlcnNpb25OdW1iZXIsXG4gIG9wdGlvbnM6IEluaXRpYWxpemF0aW9uT3B0aW9ucyxcbik6IFByb21pc2U8Q29udHJhY3QuSW50ZXJuYWxBcGlEaXNwYXRjaGVyRmFjdG9yeT4ge1xuICByZXR1cm4gbmV3IFByb21pc2U8Q29udHJhY3QuSW50ZXJuYWxBcGlEaXNwYXRjaGVyRmFjdG9yeT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGxldCBwYXJlbnQ6IFdpbmRvdztcblxuICAgIC8vIE5vcm1hbGx5LCB3ZSBhcmUgcnVubmluZyBpbnNpZGUgYW4gaWZyYW1lLiAgVGhlIGV4Y2VwdGlvbiB0byB0aGlzIGlzXG4gICAgLy8gd2hlbiB3ZSBhcmUgcnVubmluZyBhcyBhbiBleHRlbnNpb24gaW5zaWRlIGEgZGlhbG9nIGFzIHBhcnQgb2YgdGhlIFVJTmFtZXNwYWNlXG4gICAgLy8gZnVuY3Rpb25hbGl0eS4gIEluIHRoYXQgY2FzZSwgd2Ugd2FudCB0aGUgb3BlbmVyIG9mIHRoaXMgd2luZG93IHJhdGhlciB0aGFuIHRoZSBwYXJlbnQuXG4gICAgaWYgKCFpbklmcmFtZSh0aGlzV2luZG93KSkge1xuICAgICAgcGFyZW50ID0gdGhpc1dpbmRvdy5vcGVuZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcmVudCA9IHRoaXNXaW5kb3cucGFyZW50O1xuICAgIH1cblxuICAgIGlmICghcGFyZW50KSB7XG4gICAgICByZWplY3QoJ1RoaXMgZXh0ZW5zaW9uIGlzIG5vdCBydW5uaW5nIGluc2lkZSBhbiBpZnJhbWUsIGRlc2t0b3AsIG9yIHBvcHVwIHdpbmRvdy4gSW5pdGlhbGl6YXRpb24gZmFpbGVkLicpO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSB0aGUgbWVzc2VuZ2VyIHdoaWNoIHdpbGwgZG8gaGUgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHRoaXMgd2luZG93IGFuZCBvdXIgcGFyZW50XG4gICAgLy8gU2luY2Ugd2UgZG9uJ3Qga25vdyB3aGVyZSB3ZSBhcmUgcnVubmluZyB5ZXQsIHdlIGhhdmUgdG8gbWFrZSB0aGlzIGluaXRpYWwgb3JpZ2luICcqJy4gT25jZVxuICAgIC8vIHdlIGhhdmUgc3VjY2Vzc2Z1bGx5IGluaXRpYWxpemVkIG91ciBleHRlbnNpb24sIHdlIHdpbGwgbGltaXQgd2hlcmUgd2Ugc2VuZCBtZXNzYWdlc1xuICAgIGNvbnN0IG1lc3NlbmdlciA9IG5ldyBDcm9zc0ZyYW1lTWVzc2VuZ2VyKHRoaXNXaW5kb3csIHBhcmVudCwgJyonKTtcblxuICAgIC8vIFByZXBhcmUgdG8gc2VuZCBhbiBpbml0aWFsaXphdGlvbiBtZXNzYWdlIHRvIHRoZSBwYXJlbnQgZnJhbWVcbiAgICBjb25zdCBpbml0aWFsaXphdGlvbk1lc3NhZ2UgPSBtZXNzZW5nZXIucHJlcGFyZUluaXRpYWxpemF0aW9uTWVzc2FnZShpbnRlcm5hbENvbnRyYWN0VmVyc2lvbiwgQXBpTWVzc2FnaW5nVmVyc2lvbiwgb3B0aW9ucyk7XG5cbiAgICAvLyBXaGVuIHdlIHJlY2VpdmUgYSByZXNwb25zZSBiYWNrIGZyb20gdGhlIHBhcmVudCwgd2UgY2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBndWlkcyBtYXRjaCBhbmQgdGhlbiB3ZSBrbm93XG4gICAgLy8gdGhhdCB0aGUgcGFyZW50IGlzIGF3YXJlIG9mIHVzIGFuZCB3ZSBjYW4gc3RhcnQgY29tbXVuaWNhdGluZ1xuICAgIG1lc3Nlbmdlci5zZXRDb21tYW5kUmVzcG9uc2VNZXNzYWdlSGFuZGxlcihmdW5jdGlvbiAobXNnOiBDb21tYW5kUmVzcG9uc2VNZXNzYWdlKTogdm9pZCB7XG4gICAgICAvLyBWZXJpZnkgd2UgYXJlIGdldHRpbmcgYSByZXNwb25zZSBmcm9tIG91ciBpbml0aWFsaXplIG1lc3NhZ2VcbiAgICAgIGlmIChtc2cuY29tbWFuZEd1aWQgPT09IGluaXRpYWxpemF0aW9uTWVzc2FnZS5tZXNzYWdlR3VpZCkge1xuICAgICAgICAvLyBUaGUgdmVyc2lvbmluZyBvZiB0aGUgZGlzcGF0Y2hlciBoYXBwZW5zIG9uIHRoZSBvdGhlciBzaWRlIG9mIG91ciBmcmFtZSwgYW5kXG4gICAgICAgIC8vIGluIGEgd3JhcHBlciBvbiB0aGlzIHNpZGUuIFRoaXMgb25lIGRvZXNuJ3QgaGF2ZSBhbnkgdmVyc2lvbiBrbm93bGVkZ2UuXG4gICAgICAgIGNvbnN0IGRpc3BhdGNoZXJGYWN0b3J5ID0gKCkgPT4gbmV3IENyb3NzRnJhbWVEaXNwYXRjaGVyKG1lc3Nlbmdlcik7XG4gICAgICAgIHJlc29sdmUoZGlzcGF0Y2hlckZhY3RvcnkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gTm93IHRoYXQgb3VyIGhhbmRsZXJzIGFyZSByZWFkeSwgc3RhcnQgbGlzdGVuaW5nIGFuZCBzZW5kIG91ciBpbml0aWFsaXphdGlvbiBtZXNzYWdlXG4gICAgbWVzc2VuZ2VyLnN0YXJ0TGlzdGVuaW5nKCk7XG4gICAgaW5pdGlhbGl6YXRpb25NZXNzYWdlLnNlbmQoKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgeyBFbWJlZGRpbmdFcnJvckNvZGVzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIENvbW1hbmRSZXNwb25zZU1lc3NhZ2UsXG4gIEV4ZWN1dGVQYXJhbWV0ZXJzLFxuICBFeGVjdXRlUmVzcG9uc2UsXG4gIEludGVybmFsQXBpRGlzcGF0Y2hlcixcbiAgTWVzc2VuZ2VyLFxuICBNb2RlbCxcbiAgTm90aWZpY2F0aW9uSGFuZGxlcixcbiAgTm90aWZpY2F0aW9uTWVzc2FnZSxcbiAgVmVyYklkLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vVGFibGVhdUVycm9yJztcblxuLyoqXG4gKiBUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBJbnRlcm5hbEFwaURpc3BhdGNoZXIgaW50ZXJmYWNlIHdoaWNoIGZ1bmN0aW9ucyBieSBwYXNzaW5nIG1lc3NhZ2VzXG4gKiBhY3Jvc3MgYSBmcmFtZSBib3VuZGFyeS4gVGhpcyBpcyB1c3VhbGx5IGJldHdlZW4gdGhlIGNvZGUgd2hlcmUgb3VyIGphdnNjcmlwdCBsaWJyYXJ5IGhhcyBiZWVuIGluY2x1ZGVkXG4gKiBieSBhIDNyZCBwYXJ0eSBkZXYgYW5kIGFub3RoZXIgZnJhbWUgd2hlcmUgVGFibGVhdSBzZXJ2ZXIgaGFzIGNvbnRlbnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBDcm9zc0ZyYW1lRGlzcGF0Y2hlciBpbXBsZW1lbnRzIEludGVybmFsQXBpRGlzcGF0Y2hlciB7XG4gIC8vIENvbGxlY3Rpb24gb2YgcGVuZGluZyBwcm9taXNlcyB3aGljaCBhcmUgd2FpdGluZyB0byBiZSByZXNvbHZlZC4gV2hlbiB3ZSByZWNlaXZlIGEgcmVzcG9uc2UgYmFjayBmcm9tIHRoZSBvdGhlciBmcmFtZSxcbiAgLy8gdGhlc2UgcHJvbWlzZXMgY2FuIGJlIGVpdGhlciByZXNvbHZlZCBvciByZWplY3RlZFxuICBwcml2YXRlIF9wZW5kaW5nUHJvbWlzZXM6IHsgW21lc3NhZ2VHdWlkOiBzdHJpbmddOiB7IHJlc29sdmU6IChyZXNwb25zZTogRXhlY3V0ZVJlc3BvbnNlKSA9PiB2b2lkOyByZWplY3Q6IChlcnJvcjogTW9kZWwpID0+IHZvaWQgfSB9ID1cbiAgICB7fTtcblxuICAvLyBUaGUgY29sbGVjdGlvbiBvZiBub3RpZmljYXRpb24gaGFuZGxlcnMgd2hpY2ggaGF2ZSBiZWVuIHJlZ2lzdGVyZWQgd2l0aCB0aGlzIGRpc3BhdGNoZXJcbiAgcHJpdmF0ZSBfbm90aWZpY2F0aW9uSGFuZGxlcnM6IEFycmF5PE5vdGlmaWNhdGlvbkhhbmRsZXI+ID0gW107XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgQ3Jvc3NGcmFtZURpc3BhdGNoZXIgd2hpY2ggd2lsbCB1c2UgdGhlIGdpdmVuIG1lc3NlbmdlciB0byBjb21tdW5pY2F0ZVxuICAgKiBAcGFyYW0gX21lc3NlbmdlciBhbiBpbnN0YW50aWF0ZWQgYW5kIGxpc3RlbmluZyBtZXNzZW5nZXIgb2JqZWN0XG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfbWVzc2VuZ2VyOiBNZXNzZW5nZXIpIHtcbiAgICBpZiAoIXRoaXMuX21lc3Nlbmdlcikge1xuICAgICAgdGhyb3cgJ01pc3NpbmcgbWVzc2VuZ2VyIG9iamVjdCc7XG4gICAgfVxuXG4gICAgLy8gU2V0IHVwIG91ciBtZXNzYWdlIGhhbmRsZXJzLiBXZSBvbmx5IGNhcmUgYWJvdXQgaW5jb21pbmcgbm90aWZpY2F0aW9ucyBhbmQgY29tbWFuZCByZXNwb25zZXNcbiAgICB0aGlzLl9tZXNzZW5nZXIuc2V0Q29tbWFuZFJlc3BvbnNlTWVzc2FnZUhhbmRsZXIodGhpcy5vbkNvbW1hbmRSZXNwb25zZS5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLl9tZXNzZW5nZXIuc2V0Tm90aWZpY2F0aW9uTWVzc2FnZUhhbmRsZXIodGhpcy5vbk5vdGlmaWNhdGlvbi5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIC8vLy8vLyBTdGFydCBJbnRlcm5hbEFwaURpc3BhdGNoZXIgaW1wbGVtZW50YXRpb25cblxuICBwdWJsaWMgZXhlY3V0ZSh2ZXJiOiBWZXJiSWQsIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzKTogUHJvbWlzZTxFeGVjdXRlUmVzcG9uc2U+IHtcbiAgICAvLyBUbyBleGVjdXRlIGEgdmVyYiwgd2UgZmlyc3QgcHJlcGFyZSBhIGNvbW1hbmQgbWVzc2FnZSBhbmQgdGhlbiBkZWZpbmUgYSBwcm9taXNlLlxuICAgIGNvbnN0IHByZXBhcmVkTWVzc2FnZSA9IHRoaXMuX21lc3Nlbmdlci5wcmVwYXJlQ29tbWFuZE1lc3NhZ2UodmVyYiwgcGFyYW1ldGVycyk7XG4gICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlPEV4ZWN1dGVSZXNwb25zZT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgLy8gU2F2ZSBvZmYgdGhlIHBlbmRpbmcgcHJvbWlzZSBieSB0aGUgbWVzc2FnZUd1aWQgd2UgYXJlIGFib3V0IHRvIHNlbmQuIFdoZW4gYSByZXNwb25zZSBpc1xuICAgICAgLy8gcmVjZWl2ZWQsIHdlJ2xsIGJlIGFibGUgdG8gcmVzb2x2ZSB0aGlzIHByb21pc2Ugd2l0aCB0aGUgcmVzdWx0XG4gICAgICB0aGlzLl9wZW5kaW5nUHJvbWlzZXNbcHJlcGFyZWRNZXNzYWdlLm1lc3NhZ2VHdWlkXSA9IHsgcmVzb2x2ZTogcmVzb2x2ZSwgcmVqZWN0OiByZWplY3QgfTtcbiAgICB9KTtcblxuICAgIC8vIEFjdHVhbGx5IHNlbmQgdGhlIG1lc3NhZ2UgYW5kIHJldHVybiB0aGUgcHJvbWlzZVxuICAgIHByZXBhcmVkTWVzc2FnZS5zZW5kKCk7XG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJOb3RpZmljYXRpb25IYW5kbGVyKGhhbmRsZXI6IE5vdGlmaWNhdGlvbkhhbmRsZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9ub3RpZmljYXRpb25IYW5kbGVycy5wdXNoKGhhbmRsZXIpO1xuICB9XG5cbiAgcHVibGljIHVucmVnaXN0ZXJOb3RpZmljYXRpb25IYW5kbGVyKGhhbmRsZXI6IE5vdGlmaWNhdGlvbkhhbmRsZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9ub3RpZmljYXRpb25IYW5kbGVycyA9IHRoaXMuX25vdGlmaWNhdGlvbkhhbmRsZXJzLmZpbHRlcigoaCkgPT4gaCAhPT0gaGFuZGxlcik7XG4gIH1cblxuICAvLy8vLy8gRW5kIEludGVybmFsQXBpRGlzcGF0Y2hlciBpbXBsZW1lbnRhdGlvblxuXG4gIHByaXZhdGUgb25Db21tYW5kUmVzcG9uc2UocmVzcG9uc2U6IENvbW1hbmRSZXNwb25zZU1lc3NhZ2UpOiB2b2lkIHtcbiAgICAvLyBXZSBnb3QgYSBjb21tYW5kIHJlc3BvbnNlLCBsb29rIHRocm91Z2ggdGhlIHBlbmRpbmcgcHJvbWlzZXMgYW5kIHJlc29sdmVcbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5fcGVuZGluZ1Byb21pc2VzKS5pbmRleE9mKHJlc3BvbnNlLmNvbW1hbmRHdWlkKSA8IDApIHtcbiAgICAgIHJldHVybjsgLy8gV2UgZG9uJ3QgaGF2ZSBhbnkgcmVmZXJlbmNlIHRvIHRoaXMgY29tbWFuZCwganVzdCByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBwZW5kaW5nUHJvbWlzZSA9IHRoaXMuX3BlbmRpbmdQcm9taXNlc1tyZXNwb25zZS5jb21tYW5kR3VpZF07XG5cbiAgICAvLyBJZiB3ZSBoYXZlIGFuIGVycm9yIGRlZmluZWQsIHJlamVjdCB0aGUgcHJvbWlzZVxuICAgIGlmIChyZXNwb25zZS5lcnJvcikge1xuICAgICAgcGVuZGluZ1Byb21pc2UucmVqZWN0KHJlc3BvbnNlLmVycm9yKTtcbiAgICB9XG5cbiAgICAvLyBJZiB3ZSBoYXZlIGRhdGEgZGVmaW5lZCwgcmVzb2x2ZSB0aGUgcHJvbWlzZVxuICAgIGlmIChyZXNwb25zZS5kYXRhKSB7XG4gICAgICBwZW5kaW5nUHJvbWlzZS5yZXNvbHZlKHsgcmVzdWx0OiByZXNwb25zZS5kYXRhIH0pO1xuICAgIH1cblxuICAgIC8vIENsZWFuIHVwIG91ciBwZW5kaW5nIHByb21pc2VzIG9iamVjdFxuICAgIGRlbGV0ZSB0aGlzLl9wZW5kaW5nUHJvbWlzZXNbcmVzcG9uc2UuY29tbWFuZEd1aWRdO1xuICB9XG5cbiAgcHJpdmF0ZSBvbk5vdGlmaWNhdGlvbihub3RpZmljYXRpb25NZXNzYWdlOiBOb3RpZmljYXRpb25NZXNzYWdlKTogdm9pZCB7XG4gICAgLy8gR28gdGhyb3VnaCBlYWNoIG5vdGlmaWNhdGlvbiBoYW5kbGVyIHdlIGhhdmUgcmVnaXN0ZXJlZCBhbmQgbGV0IHRoZW0ga25vdyBhIG5vdGlmaWNhdGlvbiBjYW1lIGluXG4gICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIHRoaXMuX25vdGlmaWNhdGlvbkhhbmRsZXJzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBoYW5kbGVyKHsgbm90aWZpY2F0aW9uSWQ6IG5vdGlmaWNhdGlvbk1lc3NhZ2Uubm90aWZpY2F0aW9uSWQsIGRhdGE6IG5vdGlmaWNhdGlvbk1lc3NhZ2UuZGF0YSB9KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gSW5jYXNlIG9mIGEgSW5jb21wYXRpYmxlVmVyc2lvbkVycm9yLCByZS10aHJvdyB0aGUgZXJyb3IuXG4gICAgICAgIGlmICgoZSBhcyBUYWJsZWF1RXJyb3IpLmVycm9yQ29kZSA9PT0gRW1iZWRkaW5nRXJyb3JDb2Rlcy5JbmNvbXBhdGlibGVWZXJzaW9uRXJyb3IpIHtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIC8vIEVsc2UgSWdub3JlICBzbyBpZiBvbmUgaGFuZGxlciBlcnJvcnMsIHRoZSBvdGhlciBzdGlsbCBnZXQgdGhlIG1lc3NhZ2UuXG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGF0YVNvdXJjZUltcGwgfSBmcm9tICcuL0ltcGwvRGF0YVNvdXJjZUltcGwnO1xuXG5leHBvcnQgY2xhc3MgRGF0YVNvdXJjZSBpbXBsZW1lbnRzIENvbnRyYWN0LkRhdGFTb3VyY2Uge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfZGF0YVNvdXJjZUltcGw6IERhdGFTb3VyY2VJbXBsKSB7fVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5pZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmllbGRzKCk6IEFycmF5PENvbnRyYWN0LkZpZWxkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbXBsLmZpZWxkcztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZXh0cmFjdFVwZGF0ZVRpbWUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwuZXh0cmFjdFVwZGF0ZVRpbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzRXh0cmFjdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwuaXNFeHRyYWN0O1xuICB9XG5cbiAgcHVibGljIGdldCBpc1B1Ymxpc2hlZCgpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwuaXNQdWJsaXNoZWQ7XG4gIH1cblxuICBwdWJsaWMgcHVibGlzaGVkVXJsKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbXBsLnB1Ymxpc2hlZFVybCgpO1xuICB9XG5cbiAgcHVibGljIHJlZnJlc2hBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwucmVmcmVzaEFzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0QWN0aXZlVGFibGVzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5UYWJsZVN1bW1hcnk+PiB7XG4gICAgY29uc29sZS53YXJuKCdEYXRhU291cmNlLmdldEFjdGl2ZVRhYmxlc0FzeW5jIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgRGF0YVNvdXJjZS5nZXRMb2dpY2FsVGFibGVzQXN5bmMuJyk7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbXBsLmdldEFjdGl2ZVRhYmxlc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29ubmVjdGlvblN1bW1hcmllc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuQ29ubmVjdGlvblN1bW1hcnk+PiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbXBsLmdldENvbm5lY3Rpb25TdW1tYXJpZXNBc3luYygpO1xuICB9XG5cbiAgcHVibGljIGdldFVuZGVybHlpbmdEYXRhQXN5bmMob3B0aW9ucz86IENvbnRyYWN0LkRhdGFTb3VyY2VVbmRlcmx5aW5nRGF0YU9wdGlvbnMpOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT4ge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgICdEYXRhU291cmNlLmdldFVuZGVybHlpbmdEYXRhQXN5bmMgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSAnICtcbiAgICAgICAgJ0RhdGFTb3VyY2UuZ2V0TG9naWNhbFRhYmxlc0FzeW5jIGFuZCBEYXRhU291cmNlLmdldExvZ2ljYWxUYWJsZURhdGFBc3luYy4nLFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbXBsLmdldFVuZGVybHlpbmdEYXRhQXN5bmMob3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TG9naWNhbFRhYmxlc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuTG9naWNhbFRhYmxlPj4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5nZXRMb2dpY2FsVGFibGVzQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMb2dpY2FsVGFibGVEYXRhQXN5bmMobG9naWNhbFRhYmxlSWQ6IHN0cmluZywgb3B0aW9ucz86IENvbnRyYWN0LkRhdGFTb3VyY2VVbmRlcmx5aW5nRGF0YU9wdGlvbnMpOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5nZXRMb2dpY2FsVGFibGVEYXRhQXN5bmMobG9naWNhbFRhYmxlSWQsIG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGdldExvZ2ljYWxUYWJsZURhdGFSZWFkZXJBc3luYyhcbiAgICBsb2dpY2FsVGFibGVJZDogc3RyaW5nLFxuICAgIHBhZ2VSb3dDb3VudD86IG51bWJlcixcbiAgICBvcHRpb25zPzogQ29udHJhY3QuRGF0YVNvdXJjZVVuZGVybHlpbmdEYXRhT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGVSZWFkZXI+IHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwuZ2V0TG9naWNhbFRhYmxlRGF0YVJlYWRlckFzeW5jKGxvZ2ljYWxUYWJsZUlkLCBwYWdlUm93Q291bnQsIG9wdGlvbnMpO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBEYXRlUmFuZ2VUeXBlIGFzIEV4dGVybmFsRGF0ZVJhbmdlVHlwZSxcbiAgRGlhbG9nU3R5bGUgYXMgRXh0ZXJuYWxEaWFsb2dTdHlsZSxcbiAgRmlsdGVyRG9tYWluVHlwZSBhcyBFeHRlcm5hbERvbWFpblR5cGUsXG4gIEZpbHRlck51bGxPcHRpb24gYXMgRXh0ZXJuYWxOdWxsT3B0aW9uLFxuICBGaWx0ZXJVcGRhdGVUeXBlIGFzIEV4dGVybmFsRmlsdGVyVXBkYXRlVHlwZSxcbiAgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gIFBlcmlvZFR5cGUsXG4gIFJlcGxheVNwZWVkVHlwZSxcbiAgU2hlZXRUeXBlIGFzIEV4dGVybmFsU2hlZXRUeXBlLFxuICBab25lVmlzaWJpbGl0eVR5cGUsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBBcGlTaG93RGF0YVRhYmxlRm9ybWF0LFxuICBEYXRlUmFuZ2VUeXBlIGFzIEludGVybmFsRGF0ZVJhbmdlVHlwZSxcbiAgRGF0ZVN0ZXBQZXJpb2QsXG4gIERpYWxvZ1N0eWxlIGFzIEludGVybmFsRGlhbG9nU3R5bGUsXG4gIEZpbHRlckRvbWFpblR5cGUgYXMgSW50ZXJuYWxEb21haW5UeXBlLFxuICBGaWx0ZXJOdWxsT3B0aW9uIGFzIEludGVybmFsTnVsbE9wdGlvbixcbiAgRmlsdGVyVXBkYXRlVHlwZSBhcyBJbnRlcm5hbEZpbHRlclVwZGF0ZVR5cGUsXG4gIFNoZWV0VHlwZSBhcyBJbnRlcm5hbFNoZWV0VHlwZSxcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEVudW1Db252ZXJ0ZXIgfSBmcm9tICcuLi9VdGlscy9FbnVtQ29udmVydGVyJztcblxuLyogdHNsaW50OmRpc2FibGU6dHlwZWRlZiAtIERpc2FibGUgdGhpcyB0byBtYWtlIGRlY2xhcmluZyB0aGVzZSBjbGFzc2VzIGEgYml0IGVhc2llciAqL1xuLyoqXG4gKiBNYXBzIGVudW1zIHVzZWQgYnkgdGhlIGV4dGVybmFsLWFwaS1jb250cmFjdCB0byB0aGUgZW51bXMgdXNlZFxuICogaW4gdGhlIGludGVybmFsLWFwaS1jb250cmFjdCwgd2hpY2ggZGV2ZWxvcGVycyBjb2RlIGFnYWluc3QuXG4gKi9cbmV4cG9ydCBjbGFzcyBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3Mge1xuICBwdWJsaWMgc3RhdGljIGZpbHRlckRvbWFpblR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxFeHRlcm5hbERvbWFpblR5cGUsIEludGVybmFsRG9tYWluVHlwZT4oe1xuICAgIFtFeHRlcm5hbERvbWFpblR5cGUuUmVsZXZhbnRdOiBJbnRlcm5hbERvbWFpblR5cGUuUmVsZXZhbnQsXG4gICAgW0V4dGVybmFsRG9tYWluVHlwZS5EYXRhYmFzZV06IEludGVybmFsRG9tYWluVHlwZS5EYXRhYmFzZSxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBudWxsT3B0aW9ucyA9IG5ldyBFbnVtQ29udmVydGVyPEV4dGVybmFsTnVsbE9wdGlvbiwgSW50ZXJuYWxOdWxsT3B0aW9uPih7XG4gICAgW0V4dGVybmFsTnVsbE9wdGlvbi5BbGxWYWx1ZXNdOiBJbnRlcm5hbE51bGxPcHRpb24uQWxsVmFsdWVzLFxuICAgIFtFeHRlcm5hbE51bGxPcHRpb24uTm9uTnVsbFZhbHVlc106IEludGVybmFsTnVsbE9wdGlvbi5Ob25OdWxsVmFsdWVzLFxuICAgIFtFeHRlcm5hbE51bGxPcHRpb24uTnVsbFZhbHVlc106IEludGVybmFsTnVsbE9wdGlvbi5OdWxsVmFsdWVzLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIGZpbHRlclVwZGF0ZVR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxFeHRlcm5hbEZpbHRlclVwZGF0ZVR5cGUsIEludGVybmFsRmlsdGVyVXBkYXRlVHlwZT4oe1xuICAgIFtFeHRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuQWRkXTogSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLkFkZCxcbiAgICBbRXh0ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLkFsbF06IEludGVybmFsRmlsdGVyVXBkYXRlVHlwZS5BbGwsXG4gICAgW0V4dGVybmFsRmlsdGVyVXBkYXRlVHlwZS5SZW1vdmVdOiBJbnRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuUmVtb3ZlLFxuICAgIFtFeHRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuUmVwbGFjZV06IEludGVybmFsRmlsdGVyVXBkYXRlVHlwZS5SZXBsYWNlLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIHNldFZpc2liaWxpdHlUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8Wm9uZVZpc2liaWxpdHlUeXBlLCBib29sZWFuPih7XG4gICAgW1pvbmVWaXNpYmlsaXR5VHlwZS5TaG93XTogdHJ1ZSxcbiAgICBbWm9uZVZpc2liaWxpdHlUeXBlLkhpZGVdOiBmYWxzZSxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBzZXRSZXBsYXlTcGVlZFR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxSZXBsYXlTcGVlZFR5cGUsIG51bWJlcj4oe1xuICAgIC8vIHRoZXNlIG51bWJlcnMgYXJlIGR1cmF0aW9uIG11bHRpcGxpZXJzXG4gICAgLy8gMi4wLCBmb3IgZXhhbXBsZSwgZG91YmxlcyB0aGUgZHVyYXRpb24gb2YgdGhlIHJlcGxheSwgc2xvd2luZyBpdCBkb3duIHRvIDAuNXggc3BlZWRcbiAgICBbUmVwbGF5U3BlZWRUeXBlLlNsb3ddOiAyLjAsXG4gICAgW1JlcGxheVNwZWVkVHlwZS5Ob3JtYWxdOiAxLjAsXG4gICAgW1JlcGxheVNwZWVkVHlwZS5GYXN0XTogMC41LFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIHNoZWV0VHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEV4dGVybmFsU2hlZXRUeXBlLCBJbnRlcm5hbFNoZWV0VHlwZT4oe1xuICAgIFtFeHRlcm5hbFNoZWV0VHlwZS5EYXNoYm9hcmRdOiBJbnRlcm5hbFNoZWV0VHlwZS5EYXNoYm9hcmQsXG4gICAgW0V4dGVybmFsU2hlZXRUeXBlLldvcmtzaGVldF06IEludGVybmFsU2hlZXRUeXBlLldvcmtzaGVldCxcbiAgICBbRXh0ZXJuYWxTaGVldFR5cGUuU3RvcnldOiBJbnRlcm5hbFNoZWV0VHlwZS5TdG9yeSxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBzaG93RGF0YVRhYmxlRm9ybWF0VHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLCBBcGlTaG93RGF0YVRhYmxlRm9ybWF0Pih7XG4gICAgW0luY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLkFsbFZhbHVlc106IEFwaVNob3dEYXRhVGFibGVGb3JtYXQuTmF0aXZlQW5kRm9ybWF0dGVkVmFsdWVzLFxuICAgIFtJbmNsdWRlRGF0YVZhbHVlc09wdGlvbi5Pbmx5TmF0aXZlVmFsdWVzXTogQXBpU2hvd0RhdGFUYWJsZUZvcm1hdC5OYXRpdmVWYWx1ZXNPbmx5LFxuICAgIFtJbmNsdWRlRGF0YVZhbHVlc09wdGlvbi5Pbmx5Rm9ybWF0dGVkVmFsdWVzXTogQXBpU2hvd0RhdGFUYWJsZUZvcm1hdC5Gb3JtYXR0ZWRWYWx1ZXNPbmx5LFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIHBlcmlvZFR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxQZXJpb2RUeXBlLCBEYXRlU3RlcFBlcmlvZD4oe1xuICAgIFtQZXJpb2RUeXBlLlllYXJzXTogRGF0ZVN0ZXBQZXJpb2QuWWVhcnMsXG4gICAgW1BlcmlvZFR5cGUuUXVhcnRlcnNdOiBEYXRlU3RlcFBlcmlvZC5RdWFydGVycyxcbiAgICBbUGVyaW9kVHlwZS5Nb250aHNdOiBEYXRlU3RlcFBlcmlvZC5Nb250aHMsXG4gICAgW1BlcmlvZFR5cGUuV2Vla3NdOiBEYXRlU3RlcFBlcmlvZC5XZWVrcyxcbiAgICBbUGVyaW9kVHlwZS5EYXlzXTogRGF0ZVN0ZXBQZXJpb2QuRGF5cyxcbiAgICBbUGVyaW9kVHlwZS5Ib3Vyc106IERhdGVTdGVwUGVyaW9kLkhvdXJzLFxuICAgIFtQZXJpb2RUeXBlLk1pbnV0ZXNdOiBEYXRlU3RlcFBlcmlvZC5NaW51dGVzLFxuICAgIFtQZXJpb2RUeXBlLlNlY29uZHNdOiBEYXRlU3RlcFBlcmlvZC5TZWNvbmRzLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIGRhdGVSYW5nZVR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxFeHRlcm5hbERhdGVSYW5nZVR5cGUsIEludGVybmFsRGF0ZVJhbmdlVHlwZT4oe1xuICAgIFtFeHRlcm5hbERhdGVSYW5nZVR5cGUuTGFzdF06IEludGVybmFsRGF0ZVJhbmdlVHlwZS5MYXN0LFxuICAgIFtFeHRlcm5hbERhdGVSYW5nZVR5cGUuTGFzdE5dOiBJbnRlcm5hbERhdGVSYW5nZVR5cGUuTGFzdE4sXG4gICAgW0V4dGVybmFsRGF0ZVJhbmdlVHlwZS5OZXh0XTogSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLk5leHQsXG4gICAgW0V4dGVybmFsRGF0ZVJhbmdlVHlwZS5OZXh0Tl06IEludGVybmFsRGF0ZVJhbmdlVHlwZS5OZXh0TixcbiAgICBbRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLkN1cnJlbnRdOiBJbnRlcm5hbERhdGVSYW5nZVR5cGUuQ3VycmVudCxcbiAgICBbRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLlRvRGF0ZV06IEludGVybmFsRGF0ZVJhbmdlVHlwZS5Ub0RhdGUsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZGlhbG9nU3R5bGVzID0gbmV3IEVudW1Db252ZXJ0ZXI8RXh0ZXJuYWxEaWFsb2dTdHlsZSwgSW50ZXJuYWxEaWFsb2dTdHlsZT4oe1xuICAgIFtFeHRlcm5hbERpYWxvZ1N0eWxlLldpbmRvd106IEludGVybmFsRGlhbG9nU3R5bGUuV2luZG93LFxuICAgIFtFeHRlcm5hbERpYWxvZ1N0eWxlLk1vZGFsXTogSW50ZXJuYWxEaWFsb2dTdHlsZS5Nb2RhbCxcbiAgICBbRXh0ZXJuYWxEaWFsb2dTdHlsZS5Nb2RlbGVzc106IEludGVybmFsRGlhbG9nU3R5bGUuTW9kZWxlc3MsXG4gIH0pO1xufVxuLyogdHNsaW50OmVuYWJsZTp0eXBlZGVmICovXG4iLCJpbXBvcnQge1xuICBBbm5vdGF0aW9uVHlwZSBhcyBFeHRlcm5hbEFubm90YXRpb25UeXBlLFxuICBDbGFzc05hbWVLZXkgYXMgRXh0ZXJuYWxDbGFzc05hbWVLZXksXG4gIENvbHVtblR5cGUgYXMgRXh0ZXJuYWxDb2x1bW5UeXBlLFxuICBEYXNoYm9hcmRPYmplY3RUeXBlIGFzIEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZSxcbiAgRGF0YVR5cGUgYXMgRXh0ZXJuYWxEYXRhVHlwZSxcbiAgUGVyaW9kVHlwZSBhcyBFeHRlcm5hbERhdGVQZXJpb2QsXG4gIERhdGVSYW5nZVR5cGUgYXMgRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLFxuICBFcnJvckNvZGVzIGFzIEV4dGVybmFsRXJyb3JDb2RlcyxcbiAgRXh0ZW5zaW9uQ29udGV4dCBhcyBFeHRlcm5hbEV4dGVuc2lvbnNDb250ZXh0LFxuICBFeHRlbnNpb25Nb2RlIGFzIEV4dGVybmFsRXh0ZW5zaW9uc01vZGUsXG4gIEZpZWxkQWdncmVnYXRpb25UeXBlIGFzIEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUsXG4gIEZpZWxkUm9sZVR5cGUgYXMgRXh0ZXJuYWxGaWVsZFJvbGVUeXBlLFxuICBGaWx0ZXJUeXBlIGFzIEV4dGVybmFsRmlsdGVyVHlwZSxcbiAgRmlsdGVyVXBkYXRlVHlwZSBhcyBFeHRlcm5hbEZpbHRlclVwZGF0ZVR5cGUsXG4gIEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUgYXMgRXh0ZXJuYWxIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlLFxuICBNYXJrVHlwZSBhcyBFeHRlcm5hbE1hcmtUeXBlLFxuICBQYXJhbWV0ZXJWYWx1ZVR5cGUgYXMgRXh0ZXJuYWxQYXJhbWV0ZXJWYWx1ZVR5cGUsXG4gIFNoZWV0VHlwZSBhcyBFeHRlcm5hbFNoZWV0VHlwZSxcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIEFubm90YXRlRW51bSBhcyBJbnRlcm5hbEFubm90YXRpb25UeXBlLFxuICBDbGFzc05hbWVLZXkgYXMgSW50ZXJuYWxDbGFzc05hbWVLZXksXG4gIENvbHVtblR5cGUgYXMgSW50ZXJuYWxDb2x1bW5UeXBlLFxuICBEYXNoYm9hcmRPYmplY3RUeXBlIGFzIEludGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZSxcbiAgRGF0YVR5cGUgYXMgSW50ZXJuYWxEYXRhVHlwZSxcbiAgRGF0ZVJhbmdlVHlwZSBhcyBJbnRlcm5hbERhdGVSYW5nZVR5cGUsXG4gIERhdGVTdGVwUGVyaW9kIGFzIEludGVybmFsRGF0ZVN0ZXBQZXJpb2QsXG4gIERvbWFpblJlc3RyaWN0aW9uVHlwZSBhcyBJbnRlcm5hbERvbWFpblJlc3RyaWN0aW9uVHlwZSxcbiAgRXJyb3JDb2RlcyBhcyBJbnRlcm5hbEVycm9yQ29kZXMsXG4gIEV4dGVuc2lvbkNvbnRleHQgYXMgSW50ZXJuYWxFeHRlbnNpb25zQ29udGV4dCxcbiAgRXh0ZW5zaW9uTW9kZSBhcyBJbnRlcm5hbEV4dGVuc2lvbnNNb2RlLFxuICBGaWVsZEFnZ3JlZ2F0aW9uVHlwZSBhcyBJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLFxuICBGaWVsZFJvbGVUeXBlIGFzIEludGVybmFsRmllbGRSb2xlVHlwZSxcbiAgRmlsdGVyVHlwZSBhcyBJbnRlcm5hbEZpbHRlclR5cGUsXG4gIEZpbHRlclVwZGF0ZVR5cGUgYXMgSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLFxuICBIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlIGFzIEludGVybmFsSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZSxcbiAgTWFya1R5cGUgYXMgSW50ZXJuYWxNYXJrVHlwZSxcbiAgU2hlZXRUeXBlIGFzIEludGVybmFsU2hlZXRUeXBlLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRW51bUNvbnZlcnRlciB9IGZyb20gJy4uL1V0aWxzL0VudW1Db252ZXJ0ZXInO1xuXG4vKiB0c2xpbnQ6ZGlzYWJsZTp0eXBlZGVmIC0gRGlzYWJsZSB0aGlzIHRvIG1ha2UgZGVjbGFyaW5nIHRoZXNlIGNsYXNzZXMgYSBiaXQgZWFzaWVyICovXG4vKipcbiAqIE1hcHMgZW51bXMgdXNlZCBieSB0aGUgaW50ZXJuYWwtYXBpLWNvbnRyYWN0IHRvIHRoZSBlbnVtcyB1c2VkXG4gKiBpbiB0aGUgZXh0ZXJuYWwtYXBpLWNvbnRyYWN0LCB3aGljaCBkZXZlbG9wZXJzIGNvZGUgYWdhaW5zdC5cbiAqL1xuZXhwb3J0IGNsYXNzIEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyB7XG4gIHB1YmxpYyBzdGF0aWMgZXh0ZW5zaW9uQ29udGV4dCA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsRXh0ZW5zaW9uc0NvbnRleHQsIEV4dGVybmFsRXh0ZW5zaW9uc0NvbnRleHQ+KHtcbiAgICBbSW50ZXJuYWxFeHRlbnNpb25zQ29udGV4dC5EZXNrdG9wXTogRXh0ZXJuYWxFeHRlbnNpb25zQ29udGV4dC5EZXNrdG9wLFxuICAgIFtJbnRlcm5hbEV4dGVuc2lvbnNDb250ZXh0LlNlcnZlcl06IEV4dGVybmFsRXh0ZW5zaW9uc0NvbnRleHQuU2VydmVyLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIGV4dGVuc2lvbk1vZGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbEV4dGVuc2lvbnNNb2RlLCBFeHRlcm5hbEV4dGVuc2lvbnNNb2RlPih7XG4gICAgW0ludGVybmFsRXh0ZW5zaW9uc01vZGUuQXV0aG9yaW5nXTogRXh0ZXJuYWxFeHRlbnNpb25zTW9kZS5BdXRob3JpbmcsXG4gICAgW0ludGVybmFsRXh0ZW5zaW9uc01vZGUuVmlld2luZ106IEV4dGVybmFsRXh0ZW5zaW9uc01vZGUuVmlld2luZyxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBjb2x1bW5UeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxDb2x1bW5UeXBlLCBFeHRlcm5hbENvbHVtblR5cGU+KHtcbiAgICBbSW50ZXJuYWxDb2x1bW5UeXBlLkNvbnRpbnVvdXNdOiBFeHRlcm5hbENvbHVtblR5cGUuQ29udGludW91cyxcbiAgICBbSW50ZXJuYWxDb2x1bW5UeXBlLkRpc2NyZXRlXTogRXh0ZXJuYWxDb2x1bW5UeXBlLkRpc2NyZXRlLFxuICAgIFtJbnRlcm5hbENvbHVtblR5cGUuVW5rbm93bl06IEV4dGVybmFsQ29sdW1uVHlwZS5Vbmtub3duLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIGZpZWxkQWdncmVnYXRpb25UeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZSwgRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZT4oe1xuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkF0dHJdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkF0dHIsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuQXZnXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5BdmcsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuQ29sbGVjdF06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuQ29sbGVjdCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Db3VudF06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuQ291bnQsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuQ291bnRkXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Db3VudGQsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuRGF5XTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5EYXksXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuRW5kXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5FbmQsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuSG91cl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuSG91cixcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Jbk91dF06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuSW5PdXQsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuS3VydG9zaXNdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkt1cnRvc2lzLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLk1heF06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTWF4LFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLk1keV06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTWR5LFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLk1lZGlhbl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTWVkaWFuLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLk1pbl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTWluLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLk1pbnV0ZV06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTWludXRlLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLk1vbnRoWWVhcl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTW9udGhZZWFyLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLk5vbmVdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLk5vbmUsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuUXRyXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5RdHIsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuUXVhcnQxXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5RdWFydDEsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuUXVhcnQzXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5RdWFydDMsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuU2Vjb25kXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5TZWNvbmQsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuU2tld25lc3NdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlNrZXduZXNzLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlN0ZGV2XTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5TdGRldixcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5TdGRldnBdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlN0ZGV2cCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5TdW1dOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlN1bSxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY0RheV06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNEYXksXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNIb3VyXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY0hvdXIsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNNaW51dGVdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jTWludXRlLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jTW9udGhdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jTW9udGgsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNRdHJdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jUXRyLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jU2Vjb25kXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY1NlY29uZCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY1dlZWtdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jV2VlayxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY1llYXJdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jWWVhcixcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Vc2VyXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Vc2VyLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlZhcl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVmFyLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlZhcnBdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlZhcnAsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuV2Vla106IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuV2VlayxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5XZWVrZGF5XTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5XZWVrZGF5LFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlllYXJdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlllYXIsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZmllbGRSb2xlVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsRmllbGRSb2xlVHlwZSwgRXh0ZXJuYWxGaWVsZFJvbGVUeXBlPih7XG4gICAgW0ludGVybmFsRmllbGRSb2xlVHlwZS5EaW1lbnNpb25dOiBFeHRlcm5hbEZpZWxkUm9sZVR5cGUuRGltZW5zaW9uLFxuICAgIFtJbnRlcm5hbEZpZWxkUm9sZVR5cGUuTWVhc3VyZV06IEV4dGVybmFsRmllbGRSb2xlVHlwZS5NZWFzdXJlLFxuICAgIFtJbnRlcm5hbEZpZWxkUm9sZVR5cGUuVW5rbm93bl06IEV4dGVybmFsRmllbGRSb2xlVHlwZS5Vbmtub3duLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIHNoZWV0VHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsU2hlZXRUeXBlLCBFeHRlcm5hbFNoZWV0VHlwZT4oe1xuICAgIFtJbnRlcm5hbFNoZWV0VHlwZS5EYXNoYm9hcmRdOiBFeHRlcm5hbFNoZWV0VHlwZS5EYXNoYm9hcmQsXG4gICAgW0ludGVybmFsU2hlZXRUeXBlLlN0b3J5XTogRXh0ZXJuYWxTaGVldFR5cGUuU3RvcnksXG4gICAgW0ludGVybmFsU2hlZXRUeXBlLldvcmtzaGVldF06IEV4dGVybmFsU2hlZXRUeXBlLldvcmtzaGVldCxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBkYXNoYm9hcmRPYmplY3RUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLCBFeHRlcm5hbERhc2hib2FyZE9iamVjdFR5cGU+KHtcbiAgICBbSW50ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLkV4dGVuc2lvbl06IEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5FeHRlbnNpb24sXG4gICAgW0ludGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5CbGFua106IEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5CbGFuayxcbiAgICBbSW50ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLkltYWdlXTogRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLkltYWdlLFxuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuTGVnZW5kXTogRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLkxlZ2VuZCxcbiAgICBbSW50ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLlBhZ2VGaWx0ZXJdOiBFeHRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuUGFnZUZpbHRlcixcbiAgICBbSW50ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLlBhcmFtZXRlckNvbnRyb2xdOiBFeHRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuUGFyYW1ldGVyQ29udHJvbCxcbiAgICBbSW50ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLlF1aWNrRmlsdGVyXTogRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLlF1aWNrRmlsdGVyLFxuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuVGV4dF06IEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5UZXh0LFxuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuVGl0bGVdOiBFeHRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuVGl0bGUsXG4gICAgW0ludGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5XZWJQYWdlXTogRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLldlYlBhZ2UsXG4gICAgW0ludGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5Xb3Jrc2hlZXRdOiBFeHRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuV29ya3NoZWV0LFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIGRhdGFUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxEYXRhVHlwZSwgRXh0ZXJuYWxEYXRhVHlwZT4oe1xuICAgIFtJbnRlcm5hbERhdGFUeXBlLkJvb2xdOiBFeHRlcm5hbERhdGFUeXBlLkJvb2wsXG4gICAgW0ludGVybmFsRGF0YVR5cGUuRGF0ZV06IEV4dGVybmFsRGF0YVR5cGUuRGF0ZSxcbiAgICBbSW50ZXJuYWxEYXRhVHlwZS5EYXRlVGltZV06IEV4dGVybmFsRGF0YVR5cGUuRGF0ZVRpbWUsXG4gICAgW0ludGVybmFsRGF0YVR5cGUuRmxvYXRdOiBFeHRlcm5hbERhdGFUeXBlLkZsb2F0LFxuICAgIFtJbnRlcm5hbERhdGFUeXBlLkludF06IEV4dGVybmFsRGF0YVR5cGUuSW50LFxuICAgIFtJbnRlcm5hbERhdGFUeXBlLlNwYXRpYWxdOiBFeHRlcm5hbERhdGFUeXBlLlNwYXRpYWwsXG4gICAgW0ludGVybmFsRGF0YVR5cGUuU3RyaW5nXTogRXh0ZXJuYWxEYXRhVHlwZS5TdHJpbmcsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZmlsdGVyVXBkYXRlVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsRmlsdGVyVXBkYXRlVHlwZSwgRXh0ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlPih7XG4gICAgW0ludGVybmFsRmlsdGVyVXBkYXRlVHlwZS5BZGRdOiBFeHRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuQWRkLFxuICAgIFtJbnRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuQWxsXTogRXh0ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLkFsbCxcbiAgICBbSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLlJlbW92ZV06IEV4dGVybmFsRmlsdGVyVXBkYXRlVHlwZS5SZW1vdmUsXG4gICAgW0ludGVybmFsRmlsdGVyVXBkYXRlVHlwZS5SZXBsYWNlXTogRXh0ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLlJlcGxhY2UsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgYWxsb3dhYmxlVmFsdWVzID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxEb21haW5SZXN0cmljdGlvblR5cGUsIEV4dGVybmFsUGFyYW1ldGVyVmFsdWVUeXBlPih7XG4gICAgW0ludGVybmFsRG9tYWluUmVzdHJpY3Rpb25UeXBlLkFsbF06IEV4dGVybmFsUGFyYW1ldGVyVmFsdWVUeXBlLkFsbCxcbiAgICBbSW50ZXJuYWxEb21haW5SZXN0cmljdGlvblR5cGUuTGlzdF06IEV4dGVybmFsUGFyYW1ldGVyVmFsdWVUeXBlLkxpc3QsXG4gICAgW0ludGVybmFsRG9tYWluUmVzdHJpY3Rpb25UeXBlLlJhbmdlXTogRXh0ZXJuYWxQYXJhbWV0ZXJWYWx1ZVR5cGUuUmFuZ2UsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZGF0ZVN0ZXBQZXJpb2QgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbERhdGVTdGVwUGVyaW9kLCBFeHRlcm5hbERhdGVQZXJpb2Q+KHtcbiAgICBbSW50ZXJuYWxEYXRlU3RlcFBlcmlvZC5ZZWFyc106IEV4dGVybmFsRGF0ZVBlcmlvZC5ZZWFycyxcbiAgICBbSW50ZXJuYWxEYXRlU3RlcFBlcmlvZC5RdWFydGVyc106IEV4dGVybmFsRGF0ZVBlcmlvZC5RdWFydGVycyxcbiAgICBbSW50ZXJuYWxEYXRlU3RlcFBlcmlvZC5Nb250aHNdOiBFeHRlcm5hbERhdGVQZXJpb2QuTW9udGhzLFxuICAgIFtJbnRlcm5hbERhdGVTdGVwUGVyaW9kLldlZWtzXTogRXh0ZXJuYWxEYXRlUGVyaW9kLldlZWtzLFxuICAgIFtJbnRlcm5hbERhdGVTdGVwUGVyaW9kLkRheXNdOiBFeHRlcm5hbERhdGVQZXJpb2QuRGF5cyxcbiAgICBbSW50ZXJuYWxEYXRlU3RlcFBlcmlvZC5Ib3Vyc106IEV4dGVybmFsRGF0ZVBlcmlvZC5Ib3VycyxcbiAgICBbSW50ZXJuYWxEYXRlU3RlcFBlcmlvZC5NaW51dGVzXTogRXh0ZXJuYWxEYXRlUGVyaW9kLk1pbnV0ZXMsXG4gICAgW0ludGVybmFsRGF0ZVN0ZXBQZXJpb2QuU2Vjb25kc106IEV4dGVybmFsRGF0ZVBlcmlvZC5TZWNvbmRzLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIGRhdGVSYW5nZVR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbERhdGVSYW5nZVR5cGUsIEV4dGVybmFsRGF0ZVJhbmdlVHlwZT4oe1xuICAgIFtJbnRlcm5hbERhdGVSYW5nZVR5cGUuQ3VycmVudF06IEV4dGVybmFsRGF0ZVJhbmdlVHlwZS5DdXJyZW50LFxuICAgIFtJbnRlcm5hbERhdGVSYW5nZVR5cGUuTGFzdF06IEV4dGVybmFsRGF0ZVJhbmdlVHlwZS5MYXN0LFxuICAgIFtJbnRlcm5hbERhdGVSYW5nZVR5cGUuTGFzdE5dOiBFeHRlcm5hbERhdGVSYW5nZVR5cGUuTGFzdE4sXG4gICAgW0ludGVybmFsRGF0ZVJhbmdlVHlwZS5OZXh0XTogRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLk5leHQsXG4gICAgW0ludGVybmFsRGF0ZVJhbmdlVHlwZS5OZXh0Tl06IEV4dGVybmFsRGF0ZVJhbmdlVHlwZS5OZXh0TixcbiAgICBbSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLlRvRGF0ZV06IEV4dGVybmFsRGF0ZVJhbmdlVHlwZS5Ub0RhdGUsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZXJyb3JDb2RlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxFcnJvckNvZGVzLCBFeHRlcm5hbEVycm9yQ29kZXM+KFxuICAgIHtcbiAgICAgIFtJbnRlcm5hbEVycm9yQ29kZXMuSU5JVElBTElaQVRJT05fRVJST1JdOiBFeHRlcm5hbEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvcixcbiAgICAgIFtJbnRlcm5hbEVycm9yQ29kZXMuSU5URVJOQUxfRVJST1JdOiBFeHRlcm5hbEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvcixcbiAgICAgIFtJbnRlcm5hbEVycm9yQ29kZXMuTUlTU0lOR19FTlVNX01BUFBJTkddOiBFeHRlcm5hbEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvcixcbiAgICAgIFtJbnRlcm5hbEVycm9yQ29kZXMuTUlTU0lOR19QQVJBTUVURVJdOiBFeHRlcm5hbEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvcixcbiAgICAgIFtJbnRlcm5hbEVycm9yQ29kZXMuUEVSTUlTU0lPTl9ERU5JRURdOiBFeHRlcm5hbEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvcixcbiAgICAgIFtJbnRlcm5hbEVycm9yQ29kZXMuUFJFU19NT0RFTF9QQVJTSU5HX0VSUk9SXTogRXh0ZXJuYWxFcnJvckNvZGVzLkludGVybmFsRXJyb3IsXG4gICAgICBbSW50ZXJuYWxFcnJvckNvZGVzLlVOS05PV05fVkVSQl9JRF06IEV4dGVybmFsRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLFxuICAgICAgW0ludGVybmFsRXJyb3JDb2Rlcy5WRVJTSU9OX05PVF9DT05GSUdVUkVEXTogRXh0ZXJuYWxFcnJvckNvZGVzLkFQSU5vdEluaXRpYWxpemVkLFxuICAgICAgW0ludGVybmFsRXJyb3JDb2Rlcy5WSVNJQklMSVRZX0VSUk9SXTogRXh0ZXJuYWxFcnJvckNvZGVzLlZpc2liaWxpdHlFcnJvcixcbiAgICB9LFxuICAgIEV4dGVybmFsRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLFxuICApO1xuXG4gIHB1YmxpYyBzdGF0aWMgZmlsdGVyVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsRmlsdGVyVHlwZSwgRXh0ZXJuYWxGaWx0ZXJUeXBlPih7XG4gICAgW0ludGVybmFsRmlsdGVyVHlwZS5DYXRlZ29yaWNhbF06IEV4dGVybmFsRmlsdGVyVHlwZS5DYXRlZ29yaWNhbCxcbiAgICBbSW50ZXJuYWxGaWx0ZXJUeXBlLlJhbmdlXTogRXh0ZXJuYWxGaWx0ZXJUeXBlLlJhbmdlLFxuICAgIFtJbnRlcm5hbEZpbHRlclR5cGUuUmVsYXRpdmVEYXRlXTogRXh0ZXJuYWxGaWx0ZXJUeXBlLlJlbGF0aXZlRGF0ZSxcbiAgICBbSW50ZXJuYWxGaWx0ZXJUeXBlLkhpZXJhcmNoaWNhbF06IEV4dGVybmFsRmlsdGVyVHlwZS5IaWVyYXJjaGljYWwsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgY2xhc3NOYW1lS2V5ID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxDbGFzc05hbWVLZXksIEV4dGVybmFsQ2xhc3NOYW1lS2V5Pih7XG4gICAgW0ludGVybmFsQ2xhc3NOYW1lS2V5LkRhc2hib2FyZFRpdGxlXTogRXh0ZXJuYWxDbGFzc05hbWVLZXkuRGFzaGJvYXJkVGl0bGUsXG4gICAgW0ludGVybmFsQ2xhc3NOYW1lS2V5LlN0b3J5VGl0bGVdOiBFeHRlcm5hbENsYXNzTmFtZUtleS5TdG9yeVRpdGxlLFxuICAgIFtJbnRlcm5hbENsYXNzTmFtZUtleS5Ub29sdGlwXTogRXh0ZXJuYWxDbGFzc05hbWVLZXkuVG9vbHRpcCxcbiAgICBbSW50ZXJuYWxDbGFzc05hbWVLZXkuV29ya3NoZWV0XTogRXh0ZXJuYWxDbGFzc05hbWVLZXkuV29ya3NoZWV0LFxuICAgIFtJbnRlcm5hbENsYXNzTmFtZUtleS5Xb3Jrc2hlZXRUaXRsZV06IEV4dGVybmFsQ2xhc3NOYW1lS2V5LldvcmtzaGVldFRpdGxlLFxuICAgIFtJbnRlcm5hbENsYXNzTmFtZUtleS5QYW5lXTogRXh0ZXJuYWxDbGFzc05hbWVLZXkuUGFuZSxcbiAgICBbSW50ZXJuYWxDbGFzc05hbWVLZXkuUm93RGl2aWRlcnNdOiBFeHRlcm5hbENsYXNzTmFtZUtleS5Sb3dEaXZpZGVycyxcbiAgICBbSW50ZXJuYWxDbGFzc05hbWVLZXkuQ29sdW1uRGl2aWRlcnNdOiBFeHRlcm5hbENsYXNzTmFtZUtleS5Db2x1bW5EaXZpZGVycyxcbiAgICAvLyBUZW1wb3JhcnkgdW50aWwgd2UgZml4IDEzMTcyNjYgLSBQbGF0Zm9ybSBoYXNuJ3QgYmVlbiB1cGRhdGVkIGN1cnJlbnRseSBiZWNhdXNlIG5lYXIgYnJhbmNoIGlzIGNsb3NlZFxuICAgIFsnZGFzaGJvYXJkLXRpdGxlJ106IEV4dGVybmFsQ2xhc3NOYW1lS2V5LkRhc2hib2FyZFRpdGxlLFxuICAgIFsnc3RvcnktdGl0bGUnXTogRXh0ZXJuYWxDbGFzc05hbWVLZXkuU3RvcnlUaXRsZSxcbiAgICBbJ3Rvb2x0aXAnXTogRXh0ZXJuYWxDbGFzc05hbWVLZXkuVG9vbHRpcCxcbiAgICBbJ3dvcmtzaGVldCddOiBFeHRlcm5hbENsYXNzTmFtZUtleS5Xb3Jrc2hlZXQsXG4gICAgWyd3b3Jrc2hlZXQtdGl0bGUnXTogRXh0ZXJuYWxDbGFzc05hbWVLZXkuV29ya3NoZWV0VGl0bGUsXG4gICAgWydwYW5lJ106IEV4dGVybmFsQ2xhc3NOYW1lS2V5LlBhbmUsXG4gICAgWydyb3ctZGl2aWRlcnMnXTogRXh0ZXJuYWxDbGFzc05hbWVLZXkuUm93RGl2aWRlcnMsXG4gICAgWydjb2x1bW4tZGl2aWRlcnMnXTogRXh0ZXJuYWxDbGFzc05hbWVLZXkuQ29sdW1uRGl2aWRlcnMsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgaGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZSA9IG5ldyBFbnVtQ29udmVydGVyPFxuICAgIEludGVybmFsSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZSxcbiAgICBFeHRlcm5hbEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGVcbiAgPih7XG4gICAgW0ludGVybmFsSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZS5BbGxTZWxlY3RlZF06IEV4dGVybmFsSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZS5BbGxTZWxlY3RlZCxcbiAgICBbSW50ZXJuYWxIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlLk5vbmVTZWxlY3RlZF06IEV4dGVybmFsSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZS5Ob25lU2VsZWN0ZWQsXG4gICAgW0ludGVybmFsSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZS5Tb21lU2VsZWN0ZWRdOiBFeHRlcm5hbEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUuU29tZVNlbGVjdGVkLFxuICAgIFtJbnRlcm5hbEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUuVW5rbm93blNlbGVjdGVkXTogRXh0ZXJuYWxIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlLlVua25vd25TZWxlY3RlZCxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBhbm5vdGF0aW9uVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsQW5ub3RhdGlvblR5cGUsIEV4dGVybmFsQW5ub3RhdGlvblR5cGU+KHtcbiAgICBbSW50ZXJuYWxBbm5vdGF0aW9uVHlwZS5BcmVhXTogRXh0ZXJuYWxBbm5vdGF0aW9uVHlwZS5BcmVhLFxuICAgIFtJbnRlcm5hbEFubm90YXRpb25UeXBlLk1hcmtdOiBFeHRlcm5hbEFubm90YXRpb25UeXBlLk1hcmssXG4gICAgW0ludGVybmFsQW5ub3RhdGlvblR5cGUuUG9pbnRdOiBFeHRlcm5hbEFubm90YXRpb25UeXBlLlBvaW50LFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIG1hcmtUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxNYXJrVHlwZSwgRXh0ZXJuYWxNYXJrVHlwZT4oe1xuICAgIFtJbnRlcm5hbE1hcmtUeXBlLkFyZWFdOiBFeHRlcm5hbE1hcmtUeXBlLkFyZWEsXG4gICAgW0ludGVybmFsTWFya1R5cGUuQmFyXTogRXh0ZXJuYWxNYXJrVHlwZS5CYXIsXG4gICAgW0ludGVybmFsTWFya1R5cGUuQ2lyY2xlXTogRXh0ZXJuYWxNYXJrVHlwZS5DaXJjbGUsXG4gICAgW0ludGVybmFsTWFya1R5cGUuR2FudHRCYXJdOiBFeHRlcm5hbE1hcmtUeXBlLkdhbnR0QmFyLFxuICAgIFtJbnRlcm5hbE1hcmtUeXBlLkhlYXRtYXBdOiBFeHRlcm5hbE1hcmtUeXBlLkhlYXRtYXAsXG4gICAgW0ludGVybmFsTWFya1R5cGUuTGluZV06IEV4dGVybmFsTWFya1R5cGUuTGluZSxcbiAgICBbSW50ZXJuYWxNYXJrVHlwZS5NYXBdOiBFeHRlcm5hbE1hcmtUeXBlLk1hcCxcbiAgICBbSW50ZXJuYWxNYXJrVHlwZS5QaWVdOiBFeHRlcm5hbE1hcmtUeXBlLlBpZSxcbiAgICBbSW50ZXJuYWxNYXJrVHlwZS5Qb2x5Z29uXTogRXh0ZXJuYWxNYXJrVHlwZS5Qb2x5Z29uLFxuICAgIFtJbnRlcm5hbE1hcmtUeXBlLlNoYXBlXTogRXh0ZXJuYWxNYXJrVHlwZS5TaGFwZSxcbiAgICBbSW50ZXJuYWxNYXJrVHlwZS5TcXVhcmVdOiBFeHRlcm5hbE1hcmtUeXBlLlNxdWFyZSxcbiAgICBbSW50ZXJuYWxNYXJrVHlwZS5UZXh0XTogRXh0ZXJuYWxNYXJrVHlwZS5UZXh0LFxuICAgIFtJbnRlcm5hbE1hcmtUeXBlLlZpekV4dGVuc2lvbl06IEV4dGVybmFsTWFya1R5cGUuVml6RXh0ZW5zaW9uLFxuICB9KTtcbn1cbi8qIHRzbGludDplbmFibGU6dHlwZWRlZiAqL1xuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEVycm9yQ29kZXMsIFRhYmxlYXVFdmVudFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgU2luZ2xlRXZlbnRNYW5hZ2VyIH0gZnJvbSAnLi9TaW5nbGVFdmVudE1hbmFnZXInO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi9UYWJsZWF1RXJyb3InO1xuXG4vKipcbiAqIENsYXNzIGRlc2lnbmVkIHRvIHJlZ2lzdGVyIGFuZCB1bnJlZ2lzdGVyIGhhbmRsZXJzIGZyb20gYSB1c2VyLiBPbmx5IHRob3NlIGV2ZW50c1xuICogd2hpY2ggYXJlIGFkZGVkIHZpYSBBZGROZXdFdmVudFR5cGUgd2lsbCBiZSBzdXBwb3J0ZWQgYnkgdGhpcyBpbnN0YW5jZVxuICovXG5leHBvcnQgY2xhc3MgRXZlbnRMaXN0ZW5lck1hbmFnZXIgaW1wbGVtZW50cyBDb250cmFjdC5FdmVudExpc3RlbmVyTWFuYWdlciB7XG4gIHByaXZhdGUgX2V2ZW50TGlzdGVuZXJNYW5hZ2VyczogeyBbdGFibGVhdUV2ZW50VHlwZTogc3RyaW5nXTogU2luZ2xlRXZlbnRNYW5hZ2VyIH07XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX2V2ZW50TGlzdGVuZXJNYW5hZ2VycyA9IHt9O1xuICB9XG5cbiAgcHVibGljIGFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlOiBUYWJsZWF1RXZlbnRUeXBlLCBoYW5kbGVyOiBDb250cmFjdC5UYWJsZWF1RXZlbnRIYW5kbGVyRm4pOiBDb250cmFjdC5UYWJsZWF1RXZlbnRVbnJlZ2lzdGVyRm4ge1xuICAgIGlmICghdGhpcy5fZXZlbnRMaXN0ZW5lck1hbmFnZXJzLmhhc093blByb3BlcnR5KGV2ZW50VHlwZSkpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5VbnN1cHBvcnRlZEV2ZW50TmFtZSwgYENhbm5vdCBhZGQgZXZlbnQsIHVuc3VwcG9ydGVkIGV2ZW50IHR5cGU6ICR7ZXZlbnRUeXBlfWApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9ldmVudExpc3RlbmVyTWFuYWdlcnNbZXZlbnRUeXBlXS5hZGRFdmVudExpc3RlbmVyKGhhbmRsZXIpO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlOiBUYWJsZWF1RXZlbnRUeXBlLCBoYW5kbGVyOiBDb250cmFjdC5UYWJsZWF1RXZlbnRIYW5kbGVyRm4pOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuX2V2ZW50TGlzdGVuZXJNYW5hZ2Vycy5oYXNPd25Qcm9wZXJ0eShldmVudFR5cGUpKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuVW5zdXBwb3J0ZWRFdmVudE5hbWUsIGBDYW5ub3QgcmVtb3ZlIGV2ZW50LCB1bnN1cHBvcnRlZCBldmVudCB0eXBlOiAke2V2ZW50VHlwZX1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fZXZlbnRMaXN0ZW5lck1hbmFnZXJzW2V2ZW50VHlwZV0ucmVtb3ZlRXZlbnRMaXN0ZW5lcihoYW5kbGVyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhZGROZXdFdmVudFR5cGUoZXZlbnRNYW5hZ2VyOiBTaW5nbGVFdmVudE1hbmFnZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9ldmVudExpc3RlbmVyTWFuYWdlcnNbZXZlbnRNYW5hZ2VyLmV2ZW50VHlwZV0gPSBldmVudE1hbmFnZXI7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBDb2x1bW5UeXBlLCBEYXRhVHlwZSwgRmllbGRBZ2dyZWdhdGlvblR5cGUsIEZpZWxkUm9sZVR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRmllbGRJbXBsIH0gZnJvbSAnLi9JbXBsL0ZpZWxkSW1wbCc7XG5cbmV4cG9ydCBjbGFzcyBGaWVsZCBpbXBsZW1lbnRzIENvbnRyYWN0LkZpZWxkIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2ZpZWxkSW1wbDogRmllbGRJbXBsKSB7fVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwubmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbXBsLmlkO1xuICB9XG5cbiAgcHVibGljIGdldCBkZXNjcmlwdGlvbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwuZGVzY3JpcHRpb247XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRhdGFUeXBlKCk6IERhdGFUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbXBsLmRhdGFUeXBlO1xuICB9XG5cbiAgcHVibGljIGdldCBhZ2dyZWdhdGlvbigpOiBGaWVsZEFnZ3JlZ2F0aW9uVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW1wbC5hZ2dyZWdhdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGF0YVNvdXJjZSgpOiBDb250cmFjdC5EYXRhU291cmNlIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbXBsLmRhdGFTb3VyY2U7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHJvbGUoKTogRmllbGRSb2xlVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW1wbC5yb2xlO1xuICB9XG5cbiAgcHVibGljIGdldCBjb2x1bW5UeXBlKCk6IENvbHVtblR5cGUge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwuY29sdW1uVHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNDYWxjdWxhdGVkRmllbGQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW1wbC5pc0NhbGN1bGF0ZWRGaWVsZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNDb21iaW5lZEZpZWxkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwuaXNDb21iaW5lZEZpZWxkO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0dlbmVyYXRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbXBsLmlzR2VuZXJhdGVkO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0dlb3NwYXRpYWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW1wbC5pc0dlb3NwYXRpYWw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzSGlkZGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwuaXNIaWRkZW47XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzUHJlc2VudE9uUHVibGlzaGVkRGF0YXNvdXJjZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbXBsLmlzUHJlc2VudE9uUHVibGlzaGVkRGF0YXNvdXJjZTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ3VzdG9tVmlld01vZGVsIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEFwaVNlcnZpY2VSZWdpc3RyeSwgU2VydmljZU5hbWVzLCBWaXpTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vQXBpU2hhcmVkJztcbmV4cG9ydCBjbGFzcyBDdXN0b21WaWV3SW1wbCB7XG4gIHByaXZhdGUgX2x1aWQ6IHN0cmluZztcbiAgcHJpdmF0ZSBfbmFtZTogc3RyaW5nO1xuICBwcml2YXRlIF9zaGFyZWQ6IGJvb2xlYW47XG4gIHByaXZhdGUgX2lzRGVmYXVsdDogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfb3duZXJOYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgX3VybDogc3RyaW5nO1xuICBwdWJsaWMgY29uc3RydWN0b3IoY3VzdG9tVmlld01vZGVsOiBDdXN0b21WaWV3TW9kZWwsIHByaXZhdGUgX3JlZ2lzdHJ5SWQ6IG51bWJlcikge1xuICAgIHRoaXMuX2x1aWQgPSBjdXN0b21WaWV3TW9kZWwubHVpZDtcbiAgICB0aGlzLl9uYW1lID0gY3VzdG9tVmlld01vZGVsLm5hbWU7XG4gICAgdGhpcy5fc2hhcmVkID0gY3VzdG9tVmlld01vZGVsLnNoYXJlZDtcbiAgICB0aGlzLl9pc0RlZmF1bHQgPSBjdXN0b21WaWV3TW9kZWwuaXNEZWZhdWx0O1xuICAgIHRoaXMuX293bmVyTmFtZSA9IGN1c3RvbVZpZXdNb2RlbC5vd25lci51c2VyRnJpZW5kbHlOYW1lO1xuICAgIHRoaXMuX3VybCA9IGN1c3RvbVZpZXdNb2RlbC51cmw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGx1aWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2x1aWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX25hbWU7XG4gIH1cblxuICBwdWJsaWMgc2V0IG5hbWUobmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fbmFtZSA9IG5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNoYXJlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc2hhcmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBzaGFyZWQoc2hhcmVkOiBib29sZWFuKSB7XG4gICAgdGhpcy5fc2hhcmVkID0gc2hhcmVkO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0RlZmF1bHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzRGVmYXVsdDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaXNEZWZhdWx0KGlzRGVmYXVsdDogYm9vbGVhbikge1xuICAgIHRoaXMuX2lzRGVmYXVsdCA9IGlzRGVmYXVsdDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgb3duZXJOYW1lKCkge1xuICAgIHJldHVybiB0aGlzLl9vd25lck5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHVybCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdXJsO1xuICB9XG5cbiAgcHVibGljIHNhdmVBc3luYygpOiBQcm9taXNlPEN1c3RvbVZpZXdJbXBsPiB7XG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxWaXpTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuVml6KTtcbiAgICByZXR1cm4gc2VydmljZS5zYXZlQXN5bmModGhpcyk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBEYXNoYm9hcmRMYXlvdXRDaGFuZ2UsXG4gIERhc2hib2FyZExheW91dENoYW5nZURldGFpbHMsXG4gIEVycm9yQ29kZXMsXG4gIFNoYXJlZEVycm9yQ29kZXMsXG4gIFNoZWV0VHlwZSxcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IERhc2hib2FyZE9iamVjdFR5cGUsIERhc2hib2FyZFpvbmUsIFNoZWV0UGF0aCwgVmlzdWFsSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzIH0gZnJvbSAnLi4vRW51bU1hcHBpbmdzL0ludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyc7XG5pbXBvcnQgeyBQb2ludCB9IGZyb20gJy4uL1BvaW50JztcbmltcG9ydCB7IEFuaW1hdGlvblNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9BbmltYXRpb25TZXJ2aWNlJztcbmltcG9ydCB7IEZpbHRlclNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9GaWx0ZXJTZXJ2aWNlJztcbmltcG9ydCB7IEFwaVNlcnZpY2VSZWdpc3RyeSwgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFpvbmVTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvWm9uZVNlcnZpY2UnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vVGFibGVhdUVycm9yJztcbmltcG9ydCB7IEVycm9ySGVscGVycyB9IGZyb20gJy4uL1V0aWxzL0Vycm9ySGVscGVycyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRPYmplY3RJbXBsIH0gZnJvbSAnLi9EYXNoYm9hcmRPYmplY3RJbXBsJztcbmltcG9ydCB7IFNoZWV0SW1wbCB9IGZyb20gJy4vU2hlZXRJbXBsJztcbmltcG9ydCB7IFNoZWV0SW5mb0ltcGwgfSBmcm9tICcuL1NoZWV0SW5mb0ltcGwnO1xuaW1wb3J0IHsgU3RvcnlQb2ludEltcGwgfSBmcm9tICcuL1N0b3J5UG9pbnRJbXBsJztcbmltcG9ydCB7IFdvcmtzaGVldEltcGwgfSBmcm9tICcuL1dvcmtzaGVldEltcGwnO1xuXG5leHBvcnQgY2xhc3MgRGFzaGJvYXJkSW1wbCBleHRlbmRzIFNoZWV0SW1wbCB7XG4gIHByaXZhdGUgX3dvcmtzaGVldHNJbXBsOiBBcnJheTxXb3Jrc2hlZXRJbXBsPjtcbiAgcHJpdmF0ZSBfb2JqZWN0czogQXJyYXk8RGFzaGJvYXJkT2JqZWN0SW1wbD47XG4gIHByaXZhdGUgem9uZU1hcDogTWFwPG51bWJlciwgRGFzaGJvYXJkT2JqZWN0SW1wbD47XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIF9zaGVldEluZm86IFNoZWV0SW5mb0ltcGwsXG4gICAgcHJpdmF0ZSBfem9uZXM6IEFycmF5PERhc2hib2FyZFpvbmU+LFxuICAgIHByaXZhdGUgX3NoZWV0UGF0aDogU2hlZXRQYXRoLFxuICAgIF9yZWdpc3RyeUlkOiBudW1iZXIsXG4gICAgcHJpdmF0ZSBfcGFyZW50U3RvcnlQb2ludEltcGw6IFN0b3J5UG9pbnRJbXBsIHwgbnVsbCxcbiAgICBwcml2YXRlIF9hY3RpdmVEYXNoYm9hcmRPYmplY3RJZDogbnVtYmVyID0gMCxcbiAgKSB7XG4gICAgc3VwZXIoX3NoZWV0SW5mbywgX3JlZ2lzdHJ5SWQpO1xuICB9XG5cbiAgcHVibGljIGdldCB3b3Jrc2hlZXRzSW1wbCgpOiBBcnJheTxXb3Jrc2hlZXRJbXBsPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldHNJbXBsO1xuICB9XG5cbiAgcHVibGljIGdldCBvYmplY3RzKCk6IEFycmF5PERhc2hib2FyZE9iamVjdEltcGw+IHtcbiAgICByZXR1cm4gdGhpcy5fb2JqZWN0cztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcGFyZW50U3RvcnlQb2ludCgpOiBTdG9yeVBvaW50SW1wbCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9wYXJlbnRTdG9yeVBvaW50SW1wbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWN0aXZlRGFzaGJvYXJkT2JqZWN0SWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlRGFzaGJvYXJkT2JqZWN0SWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFjdGl2ZURhc2hib2FyZE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc2hlZXRQYXRoLnNoZWV0TmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBpbml0aWFsaXplV2l0aFB1YmxpY0ludGVyZmFjZXMoKTogdm9pZCB7XG4gICAgdGhpcy5fd29ya3NoZWV0c0ltcGwgPSBuZXcgQXJyYXk8V29ya3NoZWV0SW1wbD4oKTtcbiAgICB0aGlzLl9vYmplY3RzID0gbmV3IEFycmF5PERhc2hib2FyZE9iamVjdEltcGw+KCk7XG4gICAgdGhpcy56b25lTWFwID0gbmV3IE1hcDxudW1iZXIsIERhc2hib2FyZE9iamVjdEltcGw+KCk7XG5cbiAgICAvLyBQcm9jZXNzIGFsbCB0aGUgem9uZXMgd2hpY2ggYXJlIGNvbnRhaW5lZCBpbiB0aGlzIGRhc2hib2FyZFxuICAgIGZvciAoY29uc3Qgem9uZSBvZiB0aGlzLl96b25lcykge1xuICAgICAgbGV0IHdvcmtzaGVldEltcGw6IFdvcmtzaGVldEltcGwgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgICAgIGNvbnN0IHpvbmVTaXplOiBDb250cmFjdC5TaXplID0geyB3aWR0aDogem9uZS53aWR0aCwgaGVpZ2h0OiB6b25lLmhlaWdodCB9O1xuICAgICAgLy8gQXMgdGhlIGRhc2hib2FyZCBpcyBhY3RpdmUsIGFsbCBvdGhlciB6b25lcyBpbiB0aGUgZGFzaGJvYXJkIGFyZSBpbmFjdGl2ZS5cbiAgICAgIGNvbnN0IGlzQWN0aXZlID0gZmFsc2U7XG5cbiAgICAgIGlmICh6b25lLnpvbmVUeXBlID09PSBEYXNoYm9hcmRPYmplY3RUeXBlLldvcmtzaGVldCB8fCB6b25lLnpvbmVUeXBlID09PSBEYXNoYm9hcmRPYmplY3RUeXBlLlF1aWNrRmlsdGVyKSB7XG4gICAgICAgIGxldCB3b3Jrc2hlZXROYW1lID0gJyc7XG4gICAgICAgIGxldCB3b3Jrc2hlZXRVcmwgPSAnJztcbiAgICAgICAgbGV0IGlzSGlkZGVuID0gZmFsc2U7XG4gICAgICAgIGlmICh6b25lLnNoZWV0SW5mbykge1xuICAgICAgICAgIC8vIHpvbmUuc2hlZXRJbmZvIHdhcyBub3QgaW5pdGlhbGl6ZWQgcHJpb3IgdG8gaW50ZXJuYWwtY29udHJhY3QgMS42LjBcbiAgICAgICAgICB3b3Jrc2hlZXROYW1lID0gem9uZS5zaGVldEluZm8ubmFtZTtcblxuICAgICAgICAgIC8vIHdvcmtzaGVldFVybCAmIGlzSGlkZGVuIGlzIGZvciBFbWJlZGRpbmcgb25seVxuICAgICAgICAgIHdvcmtzaGVldFVybCA9IHpvbmUuc2hlZXRJbmZvLnVybCB8fCAnJztcbiAgICAgICAgICAvLyBJZiB0aGVyZSdzIGEgdXJsLCB0aGVuIGl0J3Mgbm90IGhpZGRlblxuICAgICAgICAgIGlzSGlkZGVuID0gd29ya3NoZWV0VXJsID09PSAnJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB3b3Jrc2hlZXROYW1lID0gem9uZS5uYW1lO1xuICAgICAgICB9XG4gICAgICAgIC8vIEluZGV4ZXMsIGlzQWN0aXZlIGFuZCBzb21lIG1vcmUgcHJvcGVydGllcyBpbiBzaGVldEluZm9JbXBsIGFyZSBlbWJlZGRpbmcgc3BlY2lmaWMuXG4gICAgICAgIC8vIEJ1dCB3ZSBpbml0IHRoZW0gZm9yIGJvdGggZXh0ZW5zaW9ucyBhbmQgZW1iZWRkaW5nIGFzIHRoZSBNb2RlbHMgd2lsbCBvbmx5IHVzZSB3aGF0IGlzIHJlbGV2YW50LlxuICAgICAgICBjb25zdCBzaGVldEluZm9JbXBsID0gbmV3IFNoZWV0SW5mb0ltcGwoXG4gICAgICAgICAgd29ya3NoZWV0TmFtZSxcbiAgICAgICAgICBTaGVldFR5cGUuV29ya3NoZWV0LFxuICAgICAgICAgIHpvbmVTaXplLFxuICAgICAgICAgIHRoaXMuX3dvcmtzaGVldHNJbXBsLmxlbmd0aCxcbiAgICAgICAgICBpc0FjdGl2ZSxcbiAgICAgICAgICBpc0hpZGRlbixcbiAgICAgICAgICB3b3Jrc2hlZXRVcmwsXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3Qgdml6SWQ6IFZpc3VhbElkID0ge1xuICAgICAgICAgIHdvcmtzaGVldDogd29ya3NoZWV0TmFtZSxcbiAgICAgICAgICBkYXNoYm9hcmQ6IHRoaXMuX3NoZWV0SW5mb0ltcGwubmFtZSxcbiAgICAgICAgICBzdG9yeWJvYXJkOiB0aGlzLl9zaGVldFBhdGguc3Rvcnlib2FyZCxcbiAgICAgICAgICBmbGlwYm9hcmRab25lSUQ6IHRoaXMuX3NoZWV0UGF0aC5mbGlwYm9hcmRab25lSUQsXG4gICAgICAgICAgc3RvcnlQb2ludElEOiB0aGlzLl9zaGVldFBhdGguc3RvcnlQb2ludElELFxuICAgICAgICB9O1xuXG4gICAgICAgIHdvcmtzaGVldEltcGwgPSBuZXcgV29ya3NoZWV0SW1wbChzaGVldEluZm9JbXBsLCB0aGlzLl9yZWdpc3RyeUlkLCB2aXpJZCwgdGhpcywgdGhpcy5fcGFyZW50U3RvcnlQb2ludEltcGwpO1xuICAgICAgICBpZiAoem9uZS56b25lVHlwZSA9PT0gRGFzaGJvYXJkT2JqZWN0VHlwZS5Xb3Jrc2hlZXQpIHtcbiAgICAgICAgICB0aGlzLl93b3Jrc2hlZXRzSW1wbC5wdXNoKHdvcmtzaGVldEltcGwpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHpvbmVQb2ludCA9IG5ldyBQb2ludCh6b25lLngsIHpvbmUueSk7XG5cbiAgICAgIGNvbnN0IGRhc2hib2FyZE9iamVjdEltcGwgPSBuZXcgRGFzaGJvYXJkT2JqZWN0SW1wbChcbiAgICAgICAgdGhpcyxcbiAgICAgICAgSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzLmRhc2hib2FyZE9iamVjdFR5cGUuY29udmVydCh6b25lLnpvbmVUeXBlKSxcbiAgICAgICAgem9uZVBvaW50LFxuICAgICAgICB6b25lU2l6ZSxcbiAgICAgICAgd29ya3NoZWV0SW1wbCxcbiAgICAgICAgem9uZS5uYW1lLFxuICAgICAgICB6b25lLmlzRmxvYXRpbmcgIT09IHVuZGVmaW5lZCA/IHpvbmUuaXNGbG9hdGluZyA6IGZhbHNlLCAvLyBiZWZvcmUgMS42LjAgd2UgZGlkbid0IGhhdmUgaXNGbG9hdGluZywgc28gd2UgYXNzdW1lIGZhbHNlXG4gICAgICAgIHpvbmUuaXNWaXNpYmxlICE9PSB1bmRlZmluZWQgPyB6b25lLmlzVmlzaWJsZSA6IHRydWUsIC8vIGJlZm9yZSAxLjYuMCB3ZSBkaWRuJ3QgaGF2ZSBpc1Zpc2libGUsIHNvIHdlIGFzc3VtZSB0cnVlXG4gICAgICAgIHpvbmUuem9uZUlkLFxuICAgICAgICB6b25lLmZpZWxkSWQsXG4gICAgICApO1xuXG4gICAgICB0aGlzLl9vYmplY3RzLnB1c2goZGFzaGJvYXJkT2JqZWN0SW1wbCk7XG4gICAgICB0aGlzLnpvbmVNYXAuc2V0KHpvbmUuem9uZUlkLCBkYXNoYm9hcmRPYmplY3RJbXBsKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2V0RGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eUFzeW5jKGRhc2hib2FyZE9iamVjdFZpc2liaWxpdHlNYXA6IENvbnRyYWN0LkRhc2hib2FyZE9iamVjdFZpc2liaWxpdHlNYXAgfCBvYmplY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB6b25lU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxab25lU2VydmljZT4oU2VydmljZU5hbWVzLlpvbmUpO1xuXG4gICAgcmV0dXJuIHpvbmVTZXJ2aWNlLnNldFZpc2liaWxpdHlBc3luYygvKkRhc2hib2FyZCBOYW1lKi8gdGhpcy5uYW1lLCB0aGlzLnpvbmVNYXAsIGRhc2hib2FyZE9iamVjdFZpc2liaWxpdHlNYXApO1xuICB9XG5cbiAgcHVibGljIGdldERhc2hib2FyZE9iamVjdEJ5SWQoZGFzaGJvYXJkT2JqZWN0SWQ6IG51bWJlcik6IERhc2hib2FyZE9iamVjdEltcGwgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnpvbmVNYXAuZ2V0KGRhc2hib2FyZE9iamVjdElkKTtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVab25lcyhuZXdab25lczogQXJyYXk8RGFzaGJvYXJkWm9uZT4sIG5ld0FjdGl2ZVpvbmVJZCA9IDAsIG5ld0FjdGl2ZURhc2hib2FyZE5hbWUgPSAnJyk6IERhc2hib2FyZExheW91dENoYW5nZURldGFpbHMge1xuICAgIC8vIGdldHRpbmcgcHJldmlvdXMgZGFzaGJvYXJkIG9iamVjdHMsIGFjdGl2ZSB6b25lIElEIGFuZCBhY3RpdmUgZGFzaGJvYXJkIG5hbWVcbiAgICBjb25zdCBvbGREYXNoYm9hcmRPYmplY3RzID0gdGhpcy5fb2JqZWN0cztcbiAgICBjb25zdCBvbGRab25lTWFwID0gdGhpcy56b25lTWFwO1xuICAgIGNvbnN0IG9sZEFjdGl2ZVpvbmVJZCA9IHRoaXMuX2FjdGl2ZURhc2hib2FyZE9iamVjdElkO1xuICAgIGNvbnN0IG9sZEFjdGl2ZURhc2hib2FyZE5hbWUgPSB0aGlzLl9zaGVldFBhdGguc2hlZXROYW1lO1xuICAgIC8vIHVwZGF0aW5nIHpvbmVzIGFuZCByZWluaXRpYWxpemluZyBpbnN0YW5jZSB2YXJpYWJsZXNcbiAgICB0aGlzLl96b25lcyA9IG5ld1pvbmVzO1xuICAgIHRoaXMuX2FjdGl2ZURhc2hib2FyZE9iamVjdElkID0gbmV3QWN0aXZlWm9uZUlkO1xuICAgIGlmIChuZXdBY3RpdmVEYXNoYm9hcmROYW1lKSB7XG4gICAgICB0aGlzLl9zaGVldFBhdGguc2hlZXROYW1lID0gbmV3QWN0aXZlRGFzaGJvYXJkTmFtZTtcbiAgICAgIHRoaXMuX3NoZWV0SW5mb0ltcGwubmFtZSA9IG5ld0FjdGl2ZURhc2hib2FyZE5hbWU7XG4gICAgfVxuICAgIHRoaXMuaW5pdGlhbGl6ZVdpdGhQdWJsaWNJbnRlcmZhY2VzKCk7XG4gICAgLy8gZ2V0dGluZyBuZXcgZGFzaGJvYXJkIG9iamVjdHNcbiAgICBjb25zdCBuZXdEYXNoYm9hcmRPYmplY3RzID0gdGhpcy5fb2JqZWN0cztcbiAgICBjb25zdCBuZXdab25lTWFwID0gdGhpcy56b25lTWFwO1xuICAgIC8vIGluaXRpYWxpemluZyBtYXAgZm9yIGNoYW5nZXNcbiAgICBjb25zdCB6b25lQ2hhbmdlczogRGFzaGJvYXJkTGF5b3V0Q2hhbmdlRGV0YWlscyA9IG5ldyBNYXAoKTtcblxuICAgIC8vIGNvbXBhcmluZyBvbGQgZGFzaGJvYXJkIG9iamVjdHMgd2l0aCBuZXcgb25lc1xuICAgIG9sZERhc2hib2FyZE9iamVjdHMuZm9yRWFjaCgob2xkT2JqZWN0KSA9PiB7XG4gICAgICBjb25zdCBvbGRJZDogbnVtYmVyID0gb2xkT2JqZWN0LmlkO1xuXG4gICAgICAvLyBjaGVja2luZyBpZiB6b25lIHdhcyByZW1vdmVkXG4gICAgICBpZiAoIW5ld1pvbmVNYXAuaGFzKG9sZElkKSkge1xuICAgICAgICB0aGlzLmFkZENoYW5nZShvbGRJZCwgem9uZUNoYW5nZXMsIERhc2hib2FyZExheW91dENoYW5nZS5SZW1vdmVkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBuZXdPYmplY3QgPSBuZXdab25lTWFwLmdldChvbGRJZCk7XG4gICAgICBpZiAob2xkT2JqZWN0LmlzRmxvYXRpbmcgIT09IG5ld09iamVjdCEuaXNGbG9hdGluZykge1xuICAgICAgICB0aGlzLmFkZENoYW5nZShvbGRJZCwgem9uZUNoYW5nZXMsIERhc2hib2FyZExheW91dENoYW5nZS5Jc0Zsb2F0aW5nQ2hhbmdlZCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvbGRPYmplY3QuaXNWaXNpYmxlICE9PSBuZXdPYmplY3QhLmlzVmlzaWJsZSkge1xuICAgICAgICB0aGlzLmFkZENoYW5nZShvbGRJZCwgem9uZUNoYW5nZXMsIERhc2hib2FyZExheW91dENoYW5nZS5Jc1Zpc2libGVDaGFuZ2VkKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9sZE9iamVjdC5uYW1lICE9PSBuZXdPYmplY3QhLm5hbWUpIHtcbiAgICAgICAgdGhpcy5hZGRDaGFuZ2Uob2xkSWQsIHpvbmVDaGFuZ2VzLCBEYXNoYm9hcmRMYXlvdXRDaGFuZ2UuTmFtZUNoYW5nZWQpO1xuICAgICAgfVxuXG4gICAgICBpZiAob2xkT2JqZWN0LnBvc2l0aW9uLnggIT09IG5ld09iamVjdCEucG9zaXRpb24ueCB8fCBvbGRPYmplY3QucG9zaXRpb24ueSAhPT0gbmV3T2JqZWN0IS5wb3NpdGlvbi55KSB7XG4gICAgICAgIHRoaXMuYWRkQ2hhbmdlKG9sZElkLCB6b25lQ2hhbmdlcywgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlLlBvc2l0aW9uQ2hhbmdlZCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvbGRPYmplY3Quc2l6ZS53aWR0aCAhPT0gbmV3T2JqZWN0IS5zaXplLndpZHRoIHx8IG9sZE9iamVjdC5zaXplLmhlaWdodCAhPT0gbmV3T2JqZWN0IS5zaXplLmhlaWdodCkge1xuICAgICAgICB0aGlzLmFkZENoYW5nZShvbGRJZCwgem9uZUNoYW5nZXMsIERhc2hib2FyZExheW91dENoYW5nZS5TaXplQ2hhbmdlZCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBDaGVja2luZyBmb3IgYW55IGFkZGVkIHpvbmVzXG4gICAgbmV3RGFzaGJvYXJkT2JqZWN0cy5mb3JFYWNoKChuZXdPYmplY3QpID0+IHtcbiAgICAgIGlmICghb2xkWm9uZU1hcC5oYXMobmV3T2JqZWN0LmlkKSkge1xuICAgICAgICB0aGlzLmFkZENoYW5nZShuZXdPYmplY3QuaWQsIHpvbmVDaGFuZ2VzLCBEYXNoYm9hcmRMYXlvdXRDaGFuZ2UuQWRkZWQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gQ2hlY2tpbmcgaWYgem9uZSBzZWxlY3Rpb24gaGFzIGNoYW5nZWRcbiAgICBpZiAob2xkQWN0aXZlWm9uZUlkICE9PSBuZXdBY3RpdmVab25lSWQpIHtcbiAgICAgIGlmIChuZXdBY3RpdmVab25lSWQgIT09IDApIHtcbiAgICAgICAgdGhpcy5hZGRDaGFuZ2UobmV3QWN0aXZlWm9uZUlkLCB6b25lQ2hhbmdlcywgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlLlNlbGVjdGVkKTtcbiAgICAgIH1cbiAgICAgIGlmIChvbGRBY3RpdmVab25lSWQgIT09IDApIHtcbiAgICAgICAgdGhpcy5hZGRDaGFuZ2Uob2xkQWN0aXZlWm9uZUlkLCB6b25lQ2hhbmdlcywgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlLkRlc2VsZWN0ZWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNraW5nIGlmIHN3aXRjaGVkIHRvIGFub3RoZXIgZGFzaGJvYXJkXG4gICAgaWYgKG5ld0FjdGl2ZURhc2hib2FyZE5hbWUgJiYgb2xkQWN0aXZlRGFzaGJvYXJkTmFtZSAhPT0gbmV3QWN0aXZlRGFzaGJvYXJkTmFtZSkge1xuICAgICAgdGhpcy5hZGRDaGFuZ2UoMCwgem9uZUNoYW5nZXMsIERhc2hib2FyZExheW91dENoYW5nZS5EYXNoYm9hcmRDaGFuZ2VkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gem9uZUNoYW5nZXM7XG4gIH1cblxuICBwcml2YXRlIGFkZENoYW5nZSh6b25lSWQ6IG51bWJlciwgem9uZUNoYW5nZXM6IERhc2hib2FyZExheW91dENoYW5nZURldGFpbHMsIGNoYW5nZTogRGFzaGJvYXJkTGF5b3V0Q2hhbmdlKTogdm9pZCB7XG4gICAgaWYgKCF6b25lQ2hhbmdlcy5oYXMoem9uZUlkKSkge1xuICAgICAgem9uZUNoYW5nZXMuc2V0KHpvbmVJZCwgW10pO1xuICAgIH1cblxuICAgIHpvbmVDaGFuZ2VzLmdldCh6b25lSWQpIS5wdXNoKGNoYW5nZSk7XG4gIH1cblxuICBwdWJsaWMgbW92ZUFuZFJlc2l6ZURhc2hib2FyZE9iamVjdHNBc3luYyhcbiAgICBkYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGVBcnJheTogQ29udHJhY3QuRGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlQXJyYXksXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHpvbmVTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFpvbmVTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuWm9uZSk7XG5cbiAgICByZXR1cm4gem9uZVNlcnZpY2UubW92ZUFuZFJlc2l6ZUFzeW5jKC8qRGFzaGJvYXJkIE5hbWUqLyB0aGlzLm5hbWUsIHRoaXMuem9uZU1hcCwgZGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlQXJyYXkpO1xuICB9XG5cbiAgcHVibGljIHJlcGxheUFuaW1hdGlvbkFzeW5jKHJlcGxheVNwZWVkOiBDb250cmFjdC5SZXBsYXlTcGVlZFR5cGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBhbmltYXRpb25TZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEFuaW1hdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5BbmltYXRpb24pO1xuXG4gICAgcmV0dXJuIGFuaW1hdGlvblNlcnZpY2UucmVwbGF5QXN5bmMocmVwbGF5U3BlZWQpO1xuICB9XG5cbiAgcHVibGljIGdldEZpbHRlcnNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkZpbHRlcj4+IHtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0T3JFbWJlZGRlZEluQWN0aXZlU3RvcnlQb2ludCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxGaWx0ZXJTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRmlsdGVyKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXREYXNoYm9hcmRGaWx0ZXJzQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseUZpbHRlckFzeW5jKFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHZhbHVlczogQXJyYXk8c3RyaW5nPixcbiAgICB1cGRhdGVUeXBlOiBDb250cmFjdC5GaWx0ZXJVcGRhdGVUeXBlLFxuICAgIG9wdGlvbnM6IENvbnRyYWN0LkZpbHRlck9wdGlvbnMsXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUVudW1WYWx1ZTxDb250cmFjdC5GaWx0ZXJVcGRhdGVUeXBlPih1cGRhdGVUeXBlLCBDb250cmFjdC5GaWx0ZXJVcGRhdGVUeXBlLCAnRmlsdGVyVXBkYXRlVHlwZScpO1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlTdHJpbmdQYXJhbWV0ZXIoZmllbGROYW1lLCAnZmllbGROYW1lJyk7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlcykpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLCAndmFsdWVzIHBhcmFtZXRlciBmb3IgYXBwbHlEYXNoYm9hcmRGaWx0ZXJBc3luYyBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gICAgfVxuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXRPckVtYmVkZGVkSW5BY3RpdmVTdG9yeVBvaW50KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEZpbHRlclNlcnZpY2U+KFNlcnZpY2VOYW1lcy5GaWx0ZXIpO1xuICAgIHJldHVybiBzZXJ2aWNlLmFwcGx5RGFzaGJvYXJkRmlsdGVyQXN5bmMoZmllbGROYW1lLCB2YWx1ZXMsIHVwZGF0ZVR5cGUsIG9wdGlvbnMpO1xuICB9XG5cbiAgLy8gQFctMTI5ODY0Mzk6IHJlbW92ZSBvbmNlIGluaXRpYWxpemVXaXRoUHVibGljSW50ZXJmYWNlcyBpcyBtb3ZlZCB0byB0aGUgY29uc3RydWN0b3IgZm9yIHRoaXMgY2xhc3NcbiAgLy8gVGhpcyBtZXRob2Qgb25seSBleGlzdHMgc2luY2Ugd29ya3NoZWV0c0ltcGwgY2FuIGJlIHVuZGVmaW5lZCwgYnV0IHdlIG5lZWQgdGhlIHdvcmtzaGVldCBuYW1lcyBpbiB0aGUgRXhwb3J0IEFQSXNcbiAgcHVibGljIGdldFdvcmtzaGVldE5hbWVzRnJvbVpvbmVzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIGNvbnN0IHdvcmtzaGVldE5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAoY29uc3Qgem9uZSBvZiB0aGlzLl96b25lcykge1xuICAgICAgaWYgKHpvbmUuem9uZVR5cGUgIT09IERhc2hib2FyZE9iamVjdFR5cGUuV29ya3NoZWV0KSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gem9uZS5zaGVldEluZm8gd2FzIG5vdCBpbml0aWFsaXplZCBwcmlvciB0byBpbnRlcm5hbC1jb250cmFjdCAxLjYuMFxuICAgICAgY29uc3Qgd29ya3NoZWV0TmFtZSA9IHpvbmUuc2hlZXRJbmZvID8gem9uZS5zaGVldEluZm8ubmFtZSA6IHpvbmUubmFtZTtcbiAgICAgIHdvcmtzaGVldE5hbWVzLnB1c2god29ya3NoZWV0TmFtZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHdvcmtzaGVldE5hbWVzO1xuICB9XG5cbiAgcHJpdmF0ZSB2ZXJpZnlBY3RpdmVTaGVldE9yRW1iZWRkZWRJbkFjdGl2ZVN0b3J5UG9pbnQoKSB7XG4gICAgY29uc3QgaXNSb290QW5kQWN0aXZlRGFzaGJvYXJkID0gdGhpcy5hY3RpdmU7XG4gICAgY29uc3QgaXNXaXRoaW5BY3RpdmVTdG9yeVBvaW50ID0gdGhpcy5wYXJlbnRTdG9yeVBvaW50ICE9IG51bGwgJiYgdGhpcy5wYXJlbnRTdG9yeVBvaW50LmFjdGl2ZTtcbiAgICBpZiAoIWlzUm9vdEFuZEFjdGl2ZURhc2hib2FyZCAmJiAhaXNXaXRoaW5BY3RpdmVTdG9yeVBvaW50KSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuTm90QWN0aXZlU2hlZXQsICdPcGVyYXRpb24gbm90IGFsbG93ZWQgb24gbm9uLWFjdGl2ZSBzaGVldCcpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IERhc2hib2FyZE9iamVjdFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkSW1wbCB9IGZyb20gJy4vRGFzaGJvYXJkSW1wbCc7XG5pbXBvcnQgeyBXb3Jrc2hlZXRJbXBsIH0gZnJvbSAnLi9Xb3Jrc2hlZXRJbXBsJztcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgZGFzaGJvYXJkIG9iamVjdHMgLSB0aGUgem9uZXMgaW4gYSBkYXNoYm9hcmQuXG4gKiBUaGlzIGRvZXMgbm90IGZvbGxvdyB0aGUgSW1wbCBwYXR0ZXJuIGFzIGl0IGlzIGp1c3QgYSBwcm9wZXJ0eSBiYWcuXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXNoYm9hcmRPYmplY3RJbXBsIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX2Rhc2hib2FyZEltcGw6IERhc2hib2FyZEltcGwsXG4gICAgcHJpdmF0ZSBfdHlwZTogRGFzaGJvYXJkT2JqZWN0VHlwZSxcbiAgICBwcml2YXRlIF9wb3NpdGlvbjogQ29udHJhY3QuUG9pbnQsXG4gICAgcHJpdmF0ZSBfc2l6ZTogQ29udHJhY3QuU2l6ZSxcbiAgICBwcml2YXRlIF93b3Jrc2hlZXRJbXBsOiBXb3Jrc2hlZXRJbXBsIHwgdW5kZWZpbmVkLFxuICAgIHByaXZhdGUgX25hbWU6IHN0cmluZyxcbiAgICBwcml2YXRlIF9pc0Zsb2F0aW5nOiBib29sZWFuLFxuICAgIHByaXZhdGUgX2lzVmlzaWJsZTogYm9vbGVhbixcbiAgICBwcml2YXRlIF9pZDogbnVtYmVyLFxuICAgIHByaXZhdGUgX2ZpZWxkSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgKSB7fVxuXG4gIHB1YmxpYyBnZXQgZGFzaGJvYXJkSW1wbCgpOiBEYXNoYm9hcmRJbXBsIHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkSW1wbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdHlwZSgpOiBEYXNoYm9hcmRPYmplY3RUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fdHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcG9zaXRpb24oKTogQ29udHJhY3QuUG9pbnQge1xuICAgIHJldHVybiB0aGlzLl9wb3NpdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2l6ZSgpOiBDb250cmFjdC5TaXplIHtcbiAgICByZXR1cm4gdGhpcy5fc2l6ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgd29ya3NoZWV0SW1wbCgpOiBXb3Jrc2hlZXRJbXBsIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0Zsb2F0aW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc0Zsb2F0aW5nO1xuICB9XG5cbiAgcHVibGljIGdldCBpc1Zpc2libGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzVmlzaWJsZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5faWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZpZWxkSWQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJZDtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCAqIGFzIEludGVybmFsQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IENvbm5lY3Rpb25TdW1tYXJ5IH0gZnJvbSAnLi4vQ29ubmVjdGlvblN1bW1hcnknO1xuaW1wb3J0IHsgRmllbGQgfSBmcm9tICcuLi9GaWVsZCc7XG5pbXBvcnQgeyBMb2dpY2FsVGFibGUgfSBmcm9tICcuLi9Mb2dpY2FsVGFibGUnO1xuaW1wb3J0IHsgRGF0YVNvdXJjZVNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9EYXRhU291cmNlU2VydmljZSc7XG5pbXBvcnQgeyBHZXREYXRhU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0dldERhdGFTZXJ2aWNlJztcbmltcG9ydCB7IEFwaVNlcnZpY2VSZWdpc3RyeSwgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFRhYmxlU3VtbWFyeSB9IGZyb20gJy4uL1RhYmxlU3VtbWFyeSc7XG5pbXBvcnQgeyBFcnJvckhlbHBlcnMgfSBmcm9tICcuLi9VdGlscy9FcnJvckhlbHBlcnMnO1xuaW1wb3J0IHsgRmllbGRJbXBsIH0gZnJvbSAnLi9GaWVsZEltcGwnO1xuXG5leHBvcnQgY2xhc3MgRGF0YVNvdXJjZUltcGwge1xuICBwcml2YXRlIF9maWVsZHM6IEFycmF5PEZpZWxkPjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfZGF0YVNvdXJjZUluZm86IEludGVybmFsQ29udHJhY3QuRGF0YVNvdXJjZSwgcHJpdmF0ZSBfcmVnaXN0cnlJZDogbnVtYmVyKSB7XG4gICAgdGhpcy5fZmllbGRzID0gX2RhdGFTb3VyY2VJbmZvLmZpZWxkcy5tYXAoKGZpZWxkTW9kZWwpID0+IHtcbiAgICAgIGNvbnN0IGZpZWxkSW1wbCA9IG5ldyBGaWVsZEltcGwoZmllbGRNb2RlbCwgdGhpcyk7XG4gICAgICByZXR1cm4gbmV3IEZpZWxkKGZpZWxkSW1wbCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUluZm8ubmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUluZm8uaWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGV4dHJhY3RVcGRhdGVUaW1lKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbmZvLmV4dHJhY3RVcGRhdGVUaW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWVsZHMoKTogQXJyYXk8Q29udHJhY3QuRmllbGQ+IHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRzO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0V4dHJhY3QoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbmZvLmlzRXh0cmFjdDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNQdWJsaXNoZWQoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbmZvLmlzUHVibGlzaGVkO1xuICB9XG5cbiAgcHVibGljIHB1Ymxpc2hlZFVybCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW5mby5wdWJsaXNoZWRVcmw7XG4gIH1cblxuICBwdWJsaWMgZ2V0TWF4UGFnZVJvd0xpbWl0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIDEwMDAwO1xuICB9XG5cbiAgcHVibGljIHJlZnJlc2hBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBkYXRhU291cmNlU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxEYXRhU291cmNlU2VydmljZT4oU2VydmljZU5hbWVzLkRhdGFTb3VyY2VTZXJ2aWNlKTtcblxuICAgIHJldHVybiBkYXRhU291cmNlU2VydmljZS5yZWZyZXNoQXN5bmModGhpcy5fZGF0YVNvdXJjZUluZm8uaWQpO1xuICB9XG5cbiAgcHVibGljIGdldENvbm5lY3Rpb25TdW1tYXJpZXNBc3luYygpOiBQcm9taXNlPENvbnRyYWN0LkNvbm5lY3Rpb25TdW1tYXJ5W10+IHtcbiAgICBjb25zdCBkYXRhU291cmNlU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxEYXRhU291cmNlU2VydmljZT4oU2VydmljZU5hbWVzLkRhdGFTb3VyY2VTZXJ2aWNlKTtcblxuICAgIHJldHVybiBkYXRhU291cmNlU2VydmljZS5nZXRDb25uZWN0aW9uU3VtbWFyaWVzQXN5bmModGhpcy5fZGF0YVNvdXJjZUluZm8uaWQpLnRoZW48Q29udHJhY3QuQ29ubmVjdGlvblN1bW1hcnlbXT4oKHN1bW1hcmllcykgPT4ge1xuICAgICAgcmV0dXJuIHN1bW1hcmllcy5tYXAoKHN1bW1hcnkpID0+IG5ldyBDb25uZWN0aW9uU3VtbWFyeShzdW1tYXJ5KSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0QWN0aXZlVGFibGVzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5UYWJsZVN1bW1hcnk+PiB7XG4gICAgY29uc3QgZGF0YVNvdXJjZVNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RGF0YVNvdXJjZVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5EYXRhU291cmNlU2VydmljZSk7XG5cbiAgICByZXR1cm4gZGF0YVNvdXJjZVNlcnZpY2UuZ2V0QWN0aXZlVGFibGVzQXN5bmModGhpcy5fZGF0YVNvdXJjZUluZm8uaWQpLnRoZW48QXJyYXk8Q29udHJhY3QuVGFibGVTdW1tYXJ5Pj4oKHRhYmxlSW5mb3MpID0+IHtcbiAgICAgIHJldHVybiB0YWJsZUluZm9zLm1hcCgodGFibGVJbmZvKSA9PiBuZXcgVGFibGVTdW1tYXJ5KHRhYmxlSW5mbykpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldFVuZGVybHlpbmdEYXRhQXN5bmMob3B0aW9ucz86IENvbnRyYWN0LkRhdGFTb3VyY2VVbmRlcmx5aW5nRGF0YU9wdGlvbnMpOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT4ge1xuICAgIGNvbnN0IGdldERhdGFTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEdldERhdGFTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuR2V0RGF0YSk7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICByZXR1cm4gZ2V0RGF0YVNlcnZpY2UuZ2V0RGF0YVNvdXJjZURhdGFBc3luYyhcbiAgICAgIHRoaXMuaWQsXG4gICAgICAhIW9wdGlvbnMuaWdub3JlQWxpYXNlcyxcbiAgICAgIG9wdGlvbnMubWF4Um93cyB8fCAwLCAvLyAwIGFuZCBbXSBhcmUgZGVmYXVsdHNcbiAgICAgIG9wdGlvbnMuY29sdW1uc1RvSW5jbHVkZSB8fCBbXSxcbiAgICAgIG9wdGlvbnMuY29sdW1uc1RvSW5jbHVkZUJ5SWQgfHwgW10sXG4gICAgICBvcHRpb25zLmluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uIHx8IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLkFsbFZhbHVlcyxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdldExvZ2ljYWxUYWJsZURhdGFBc3luYyhsb2dpY2FsVGFibGVJZDogc3RyaW5nLCBvcHRpb25zPzogQ29udHJhY3QuRGF0YVNvdXJjZVVuZGVybHlpbmdEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgY29uc3QgZ2V0RGF0YVNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8R2V0RGF0YVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5HZXREYXRhKTtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIHJldHVybiBnZXREYXRhU2VydmljZS5nZXRMb2dpY2FsVGFibGVEYXRhQXN5bmMoXG4gICAgICB0aGlzLmlkLFxuICAgICAgbG9naWNhbFRhYmxlSWQsXG4gICAgICAhIW9wdGlvbnMuaWdub3JlQWxpYXNlcyxcbiAgICAgIG9wdGlvbnMubWF4Um93cyB8fCAwLCAvLyAwIGFuZCBbXSBhcmUgZGVmYXVsdHNcbiAgICAgIG9wdGlvbnMuY29sdW1uc1RvSW5jbHVkZSB8fCBbXSxcbiAgICAgIG9wdGlvbnMuY29sdW1uc1RvSW5jbHVkZUJ5SWQgfHwgW10sXG4gICAgICBvcHRpb25zLmluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uIHx8IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLkFsbFZhbHVlcyxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdldExvZ2ljYWxUYWJsZURhdGFSZWFkZXJBc3luYyhcbiAgICBsb2dpY2FsVGFibGVJZDogc3RyaW5nLFxuICAgIHBhZ2VSb3dDb3VudD86IG51bWJlcixcbiAgICBvcHRpb25zPzogQ29udHJhY3QuRGF0YVNvdXJjZVVuZGVybHlpbmdEYXRhT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGVSZWFkZXI+IHtcbiAgICBjb25zdCBnZXREYXRhU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgcmV0dXJuIGdldERhdGFTZXJ2aWNlLmdldExvZ2ljYWxUYWJsZURhdGFSZWFkZXJBc3luYyhcbiAgICAgIHRoaXMuaWQsXG4gICAgICBsb2dpY2FsVGFibGVJZCxcbiAgICAgIHBhZ2VSb3dDb3VudCB8fCB0aGlzLmdldE1heFBhZ2VSb3dMaW1pdCgpLFxuICAgICAgISFvcHRpb25zLmlnbm9yZUFsaWFzZXMsXG4gICAgICBvcHRpb25zLmNvbHVtbnNUb0luY2x1ZGVCeUlkIHx8IFtdLFxuICAgICAgb3B0aW9ucy5pbmNsdWRlRGF0YVZhbHVlc09wdGlvbiB8fCBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbi5BbGxWYWx1ZXMsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBpbml0aWFsaXplV2l0aFB1YmxpY0ludGVyZmFjZXMoZGF0YVNvdXJjZTogQ29udHJhY3QuRGF0YVNvdXJjZSk6IHZvaWQge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlJbnRlcm5hbFZhbHVlKGRhdGFTb3VyY2UsICdkYXRhU291cmNlJyk7XG5cbiAgICB0aGlzLl9maWVsZHMgPSB0aGlzLl9kYXRhU291cmNlSW5mby5maWVsZHMubWFwKChmaWVsZE1vZGVsKSA9PiB7XG4gICAgICBjb25zdCBmaWVsZEltcGwgPSBuZXcgRmllbGRJbXBsKGZpZWxkTW9kZWwsIGRhdGFTb3VyY2UpO1xuICAgICAgcmV0dXJuIG5ldyBGaWVsZChmaWVsZEltcGwpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldExvZ2ljYWxUYWJsZXNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkxvZ2ljYWxUYWJsZT4+IHtcbiAgICBjb25zdCBkYXRhU291cmNlU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxEYXRhU291cmNlU2VydmljZT4oU2VydmljZU5hbWVzLkRhdGFTb3VyY2VTZXJ2aWNlKTtcblxuICAgIHJldHVybiBkYXRhU291cmNlU2VydmljZS5nZXRMb2dpY2FsVGFibGVzQXN5bmModGhpcy5pZCkudGhlbjxBcnJheTxDb250cmFjdC5Mb2dpY2FsVGFibGU+PigobG9naWNhbFRhYmxlSW5mb3MpID0+IHtcbiAgICAgIHJldHVybiBsb2dpY2FsVGFibGVJbmZvcy5tYXAoKGxvZ2ljYWxUYWJsZUluZm8pID0+IG5ldyBMb2dpY2FsVGFibGUobG9naWNhbFRhYmxlSW5mbykpO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0ICogYXMgSW50ZXJuYWxDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzIH0gZnJvbSAnLi4vRW51bU1hcHBpbmdzL0ludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyc7XG5cbmV4cG9ydCBjbGFzcyBGaWVsZEltcGwge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfZmllbGRJbmZvOiBJbnRlcm5hbENvbnRyYWN0LkZpZWxkLCBwcml2YXRlIF9wYXJlbnREYXRhU291cmNlPzogQ29udHJhY3QuRGF0YVNvdXJjZSkge31cblxuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbmZvLm5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW5mby5pZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGVzY3JpcHRpb24oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbmZvLmRlc2NyaXB0aW9uO1xuICB9XG5cbiAgcHVibGljIGdldCBkYXRhVHlwZSgpOiBDb250cmFjdC5EYXRhVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW5mby5kYXRhVHlwZSA/PyBDb250cmFjdC5EYXRhVHlwZS5Vbmtub3duO1xuICB9XG5cbiAgcHVibGljIGdldCBhZ2dyZWdhdGlvbigpOiBDb250cmFjdC5GaWVsZEFnZ3JlZ2F0aW9uVHlwZSB7XG4gICAgcmV0dXJuIEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncy5maWVsZEFnZ3JlZ2F0aW9uVHlwZS5jb252ZXJ0KHRoaXMuX2ZpZWxkSW5mby5hZ2dyZWdhdGlvbik7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRhdGFTb3VyY2UoKTogQ29udHJhY3QuRGF0YVNvdXJjZSB7XG4gICAgaWYgKCF0aGlzLl9wYXJlbnREYXRhU291cmNlKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRGF0YSBzb3VyY2UgaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZSBmb3IgdGhpcyBmaWVsZC4gUGxlYXNlIHVzZSBnZXRGaWVsZEFzeW5jIG1ldGhvZCB0byBnZXQgZmllbGQncyBkYXRhIHNvdXJjZSBpbmZvcm1hdGlvbmAsXG4gICAgICApO1xuICAgIHJldHVybiB0aGlzLl9wYXJlbnREYXRhU291cmNlO1xuICB9XG5cbiAgcHVibGljIGdldCByb2xlKCk6IENvbnRyYWN0LkZpZWxkUm9sZVR5cGUge1xuICAgIHJldHVybiBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MuZmllbGRSb2xlVHlwZS5jb252ZXJ0KHRoaXMuX2ZpZWxkSW5mby5yb2xlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY29sdW1uVHlwZSgpOiBDb250cmFjdC5Db2x1bW5UeXBlIHtcbiAgICBsZXQgZGVmaW5lZFZhbHVlOiBJbnRlcm5hbENvbnRyYWN0LkNvbHVtblR5cGUgPSB0aGlzLl9maWVsZEluZm8uY29sdW1uVHlwZSB8fCBJbnRlcm5hbENvbnRyYWN0LkNvbHVtblR5cGUuVW5rbm93bjtcbiAgICByZXR1cm4gSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzLmNvbHVtblR5cGUuY29udmVydChkZWZpbmVkVmFsdWUpO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0NhbGN1bGF0ZWRGaWVsZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbmZvLmlzQ2FsY3VsYXRlZEZpZWxkO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0NvbWJpbmVkRmllbGQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW5mby5pc0NvbWJpbmVkRmllbGQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzR2VuZXJhdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEluZm8uaXNHZW5lcmF0ZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzR2Vvc3BhdGlhbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbmZvLmlzR2Vvc3BhdGlhbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNIaWRkZW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW5mby5pc0hpZGRlbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNQcmVzZW50T25QdWJsaXNoZWREYXRhc291cmNlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEluZm8uaXNQcmVzZW50T25QdWJsaXNoZWREYXRhc291cmNlO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGF0YVR5cGUsIFBhcmFtZXRlclZhbHVlVHlwZSwgUGVyaW9kVHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBQYXJhbWV0ZXJJbmZvIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyB9IGZyb20gJy4uL0VudW1NYXBwaW5ncy9JbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MnO1xuaW1wb3J0IHsgRGF0YVZhbHVlIH0gZnJvbSAnLi4vTW9kZWxzL0dldERhdGFNb2RlbHMnO1xuaW1wb3J0IHsgUGFyYW1ldGVyc1NlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9QYXJhbWV0ZXJzU2VydmljZSc7XG5pbXBvcnQgeyBBcGlTZXJ2aWNlUmVnaXN0cnksIFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBEYXRhVmFsdWVGYWN0b3J5IH0gZnJvbSAnLi4vVXRpbHMvRGF0YVZhbHVlRmFjdG9yeSc7XG5pbXBvcnQgeyBFcnJvckhlbHBlcnMgfSBmcm9tICcuLi9VdGlscy9FcnJvckhlbHBlcnMnO1xuaW1wb3J0IHsgUGFyYW0gfSBmcm9tICcuLi9VdGlscy9QYXJhbSc7XG5cbmV4cG9ydCBjbGFzcyBQYXJhbWV0ZXJJbXBsIHtcbiAgcHJpdmF0ZSBfYWxsb3dhYmxlVmFsdWVzOiBDb250cmFjdC5QYXJhbWV0ZXJEb21haW5SZXN0cmljdGlvbjtcbiAgcHJpdmF0ZSBfZ2xvYmFsRmllbGROYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgX3BhcmFtZXRlckluZm86IFBhcmFtZXRlckluZm87XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtZXRlckluZm86IFBhcmFtZXRlckluZm8sIHByaXZhdGUgX3JlZ2lzdHJ5SWQ6IG51bWJlcikge1xuICAgIHRoaXMuc2V0UGFyYW1ldGVySW5mbyhwYXJhbWV0ZXJJbmZvKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9wYXJhbWV0ZXJJbmZvLm5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGN1cnJlbnRWYWx1ZSgpOiBEYXRhVmFsdWUge1xuICAgIHJldHVybiBEYXRhVmFsdWVGYWN0b3J5Lk1ha2VQYXJhbWV0ZXJEYXRhVmFsdWUodGhpcy5fcGFyYW1ldGVySW5mby5jdXJyZW50VmFsdWUsIHRoaXMuX3BhcmFtZXRlckluZm8uZGF0YVR5cGUpO1xuICB9XG5cbiAgcHVibGljIGdldCBkYXRhVHlwZSgpOiBEYXRhVHlwZSB7XG4gICAgcmV0dXJuIEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncy5kYXRhVHlwZS5jb252ZXJ0KHRoaXMuX3BhcmFtZXRlckluZm8uZGF0YVR5cGUpO1xuICB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9nbG9iYWxGaWVsZE5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFsbG93YWJsZVZhbHVlcygpOiBDb250cmFjdC5QYXJhbWV0ZXJEb21haW5SZXN0cmljdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuX2FsbG93YWJsZVZhbHVlcztcbiAgfVxuXG4gIHB1YmxpYyBjaGFuZ2VWYWx1ZUFzeW5jKG5ld1ZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgRGF0ZSk6IFByb21pc2U8RGF0YVZhbHVlPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihuZXdWYWx1ZSwgJ25ld1ZhbHVlJyk7XG5cbiAgICBjb25zdCBjb2VyY2VkVmFsdWUgPSBQYXJhbS5zZXJpYWxpemVQYXJhbWV0ZXJWYWx1ZShuZXdWYWx1ZSk7XG4gICAgY29uc3QgcGFyYW1ldGVyc1NlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8UGFyYW1ldGVyc1NlcnZpY2U+KFNlcnZpY2VOYW1lcy5QYXJhbWV0ZXJzKTtcbiAgICByZXR1cm4gcGFyYW1ldGVyc1NlcnZpY2UuY2hhbmdlUGFyYW1ldGVyVmFsdWVBc3luYyh0aGlzLl9nbG9iYWxGaWVsZE5hbWUsIGNvZXJjZWRWYWx1ZSkudGhlbigocGFyYW1ldGVySW5mbykgPT4ge1xuICAgICAgdGhpcy5zZXRQYXJhbWV0ZXJJbmZvKHBhcmFtZXRlckluZm8pO1xuICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFZhbHVlO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRQYXJhbWV0ZXJJbmZvKHBhcmFtZXRlckluZm86IFBhcmFtZXRlckluZm8pOiB2b2lkIHtcbiAgICB0aGlzLl9wYXJhbWV0ZXJJbmZvID0gcGFyYW1ldGVySW5mbztcbiAgICB0aGlzLl9nbG9iYWxGaWVsZE5hbWUgPSBwYXJhbWV0ZXJJbmZvLmZpZWxkTmFtZTtcblxuICAgIGNvbnN0IHR5cGUgPSBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MuYWxsb3dhYmxlVmFsdWVzLmNvbnZlcnQocGFyYW1ldGVySW5mby5hbGxvd2FibGVWYWx1ZXNUeXBlKTtcbiAgICBsZXQgbGlzdFZhbHVlczogQXJyYXk8RGF0YVZhbHVlPiB8IHVuZGVmaW5lZDtcbiAgICBsZXQgbWluVmFsdWU6IERhdGFWYWx1ZSB8IHVuZGVmaW5lZDtcbiAgICBsZXQgbWF4VmFsdWU6IERhdGFWYWx1ZSB8IHVuZGVmaW5lZDtcbiAgICBsZXQgc3RlcFNpemU6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICBsZXQgZGF0ZVN0ZXBQZXJpb2Q6IFBlcmlvZFR5cGUgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAodHlwZSA9PT0gUGFyYW1ldGVyVmFsdWVUeXBlLkxpc3QpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHBhcmFtZXRlckluZm8uYWxsb3dhYmxlVmFsdWVzIHx8IFtdO1xuICAgICAgbGlzdFZhbHVlcyA9IHZhbHVlcy5tYXAoKHZhbCkgPT4gRGF0YVZhbHVlRmFjdG9yeS5NYWtlUGFyYW1ldGVyRGF0YVZhbHVlKHZhbCwgcGFyYW1ldGVySW5mby5kYXRhVHlwZSkpO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gUGFyYW1ldGVyVmFsdWVUeXBlLlJhbmdlKSB7XG4gICAgICBtaW5WYWx1ZSA9IHBhcmFtZXRlckluZm8ubWluVmFsdWUgJiYgRGF0YVZhbHVlRmFjdG9yeS5NYWtlUGFyYW1ldGVyRGF0YVZhbHVlKHBhcmFtZXRlckluZm8ubWluVmFsdWUsIHBhcmFtZXRlckluZm8uZGF0YVR5cGUpO1xuICAgICAgbWF4VmFsdWUgPSBwYXJhbWV0ZXJJbmZvLm1heFZhbHVlICYmIERhdGFWYWx1ZUZhY3RvcnkuTWFrZVBhcmFtZXRlckRhdGFWYWx1ZShwYXJhbWV0ZXJJbmZvLm1heFZhbHVlLCBwYXJhbWV0ZXJJbmZvLmRhdGFUeXBlKTtcbiAgICAgIHN0ZXBTaXplID0gcGFyYW1ldGVySW5mby5zdGVwU2l6ZTtcbiAgICAgIGRhdGVTdGVwUGVyaW9kID0gcGFyYW1ldGVySW5mby5kYXRlU3RlcFBlcmlvZCAmJiBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MuZGF0ZVN0ZXBQZXJpb2QuY29udmVydChwYXJhbWV0ZXJJbmZvLmRhdGVTdGVwUGVyaW9kKTtcbiAgICB9XG5cbiAgICB0aGlzLl9hbGxvd2FibGVWYWx1ZXMgPSB7XG4gICAgICB0eXBlOiB0eXBlLFxuICAgICAgYWxsb3dhYmxlVmFsdWVzOiBsaXN0VmFsdWVzLFxuICAgICAgbWluVmFsdWU6IG1pblZhbHVlLFxuICAgICAgbWF4VmFsdWU6IG1heFZhbHVlLFxuICAgICAgc3RlcFNpemU6IHN0ZXBTaXplLFxuICAgICAgZGF0ZVN0ZXBQZXJpb2Q6IGRhdGVTdGVwUGVyaW9kLFxuICAgIH07XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBTaGVldFBhdGggfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQ2xpZW50SW5mb1NlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9DbGllbnRJbmZvU2VydmljZSc7XG5pbXBvcnQgeyBQYXJhbWV0ZXJzU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL1BhcmFtZXRlcnNTZXJ2aWNlJztcbmltcG9ydCB7IEFwaVNlcnZpY2VSZWdpc3RyeSwgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFNpemVTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvU2l6ZVNlcnZpY2UnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vVGFibGVhdUVycm9yJztcbmltcG9ydCB7IEVycm9ySGVscGVycyB9IGZyb20gJy4uL1V0aWxzL0Vycm9ySGVscGVycyc7XG5pbXBvcnQgeyBQYXJhbSB9IGZyb20gJy4uL1V0aWxzL1BhcmFtJztcbmltcG9ydCB7IFNoZWV0VXRpbHMgfSBmcm9tICcuLi9VdGlscy9TaGVldFV0aWxzJztcbmltcG9ydCB7IFBhcmFtZXRlckltcGwgfSBmcm9tICcuL1BhcmFtZXRlckltcGwnO1xuaW1wb3J0IHsgU2hlZXRJbmZvSW1wbCB9IGZyb20gJy4vU2hlZXRJbmZvSW1wbCc7XG5cbmludGVyZmFjZSBQYXJ0aWFsU2hlZXRTaXplIHtcbiAgLyoqXG4gICAqIENvbnRhaW5zIGFuIGVudW1lcmF0aW9uIHZhbHVlIG9mIG9uZSBvZiB0aGUgZm9sbG93aW5nOiBBVVRPTUFUSUMsIEVYQUNUTFksIFJBTkdFLCBBVExFQVNULCBhbmQgQVRNT1NULlxuICAgKi9cbiAgcmVhZG9ubHkgYmVoYXZpb3I6IENvbnRyYWN0LlNoZWV0U2l6ZUJlaGF2aW9yO1xuXG4gIC8qKlxuICAgKiAgVGhpcyBpcyBvbmx5IGRlZmluZWQgd2hlbiBiZWhhdmlvciBpcyBFWEFDVExZLCBSQU5HRSwgb3IgQVRMRUFTVC5cbiAgICovXG4gIHJlYWRvbmx5IG1pblNpemU/OiBQYXJ0aWFsPENvbnRyYWN0LlNpemU+O1xuXG4gIC8qKlxuICAgKiAgVGhpcyBpcyBvbmx5IGRlZmluZWQgd2hlbiBiZWhhdmlvciBpcyBFWEFDVExZLCBSQU5HRSBvciBBVE1PU1QuXG4gICAqL1xuICByZWFkb25seSBtYXhTaXplPzogUGFydGlhbDxDb250cmFjdC5TaXplPjtcbn1cblxuZXhwb3J0IGNsYXNzIFNoZWV0SW1wbCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgX3NoZWV0SW5mb0ltcGw6IFNoZWV0SW5mb0ltcGwsIHByb3RlY3RlZCBfcmVnaXN0cnlJZDogbnVtYmVyKSB7fVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zaGVldEluZm9JbXBsLm5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNoZWV0VHlwZSgpOiBDb250cmFjdC5TaGVldFR5cGUge1xuICAgIHJldHVybiB0aGlzLl9zaGVldEluZm9JbXBsLnNoZWV0VHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2hlZXRQYXRoKCk6IFNoZWV0UGF0aCB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWV0SW5mb0ltcGwuc2hlZXRQYXRoO1xuICB9XG5cbiAgcHVibGljIGdldCBzaXplKCk6IENvbnRyYWN0LlNpemUgfCBDb250cmFjdC5TaGVldFNpemUge1xuICAgIHJldHVybiB0aGlzLl9zaGVldEluZm9JbXBsLnNoZWV0U2l6ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaGlkZGVuKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLl9zaGVldEluZm9JbXBsLmlzSGlkZGVuICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zaGVldEluZm9JbXBsLmlzSGlkZGVuO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVtYmVkZGluZ0Vycm9yQ29kZXMuSW1wbGVtZW50YXRpb25FcnJvciwgYGlzSGlkZGVuIG5vdCBpbXBsZW1lbnRlZGApO1xuICB9XG5cbiAgcHVibGljIGdldCBhY3RpdmUoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuX3NoZWV0SW5mb0ltcGwuaXNBY3RpdmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3NoZWV0SW5mb0ltcGwuaXNBY3RpdmU7XG4gICAgfVxuICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5JbXBsZW1lbnRhdGlvbkVycm9yLCBgYWN0aXZlIG5vdCBpbXBsZW1lbnRlZGApO1xuICB9XG5cbiAgcHVibGljIHNldCBhY3RpdmUoYWN0aXZlOiBib29sZWFuKSB7XG4gICAgaWYgKHRoaXMuX3NoZWV0SW5mb0ltcGwuaXNBY3RpdmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fc2hlZXRJbmZvSW1wbC5hY3RpdmUgPSBhY3RpdmU7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBpbmRleCgpOiBudW1iZXIge1xuICAgIGlmICh0aGlzLl9zaGVldEluZm9JbXBsLmluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zaGVldEluZm9JbXBsLmluZGV4O1xuICAgIH1cbiAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVtYmVkZGluZ0Vycm9yQ29kZXMuSW1wbGVtZW50YXRpb25FcnJvciwgYGluZGV4IG5vdCBpbXBsZW1lbnRlZGApO1xuICB9XG5cbiAgcHVibGljIGdldCB1cmwoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5fc2hlZXRJbmZvSW1wbC51cmwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3NoZWV0SW5mb0ltcGwudXJsO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVtYmVkZGluZ0Vycm9yQ29kZXMuSW1wbGVtZW50YXRpb25FcnJvciwgYHVybCBub3QgaW1wbGVtZW50ZWRgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2hlZXRTaXplKCk6IENvbnRyYWN0LlNoZWV0U2l6ZSB7XG4gICAgaWYgKCFTaGVldFV0aWxzLmlzVmFsaWRTaGVldFNpemUodGhpcy5zaXplKSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLkludGVybmFsRXJyb3IsICdzaXplIGlzIG5vdCBvZiB0eXBlIFNoZWV0U2l6ZScpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNpemU7XG4gIH1cblxuICBwdWJsaWMgZmluZFBhcmFtZXRlckFzeW5jKHBhcmFtZXRlck5hbWU6IHN0cmluZyk6IFByb21pc2U8UGFyYW1ldGVySW1wbCB8IHVuZGVmaW5lZD4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIocGFyYW1ldGVyTmFtZSwgJ3BhcmFtZXRlck5hbWUnKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8UGFyYW1ldGVyc1NlcnZpY2U+KFNlcnZpY2VOYW1lcy5QYXJhbWV0ZXJzKTtcbiAgICByZXR1cm4gc2VydmljZS5maW5kUGFyYW1ldGVyQnlOYW1lQXN5bmMocGFyYW1ldGVyTmFtZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0UGFyYW1ldGVyc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8UGFyYW1ldGVySW1wbD4+IHtcbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFBhcmFtZXRlcnNTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuUGFyYW1ldGVycyk7XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0UGFyYW1ldGVyc0ZvclNoZWV0QXN5bmModGhpcy5zaGVldFBhdGgpO1xuICB9XG5cbiAgcHVibGljIGNoYW5nZVNpemVBc3luYyhuZXdTaXplOiBDb250cmFjdC5TaGVldFNpemUpOiBQcm9taXNlPENvbnRyYWN0LlNoZWV0U2l6ZT4ge1xuICAgIGNvbnN0IGludmFsaWRTaXplRXJyb3IgPSBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVtYmVkZGluZ0Vycm9yQ29kZXMuSW52YWxpZFNpemUsICdJbnZhbGlkIHNoZWV0IHNpemUgcGFyYW1ldGVyJyk7XG4gICAgaWYgKCFuZXdTaXplIHx8ICFuZXdTaXplLmJlaGF2aW9yKSB7XG4gICAgICB0aHJvdyBpbnZhbGlkU2l6ZUVycm9yO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnRpYWxTaGVldFNpemUgPSB0aGlzLm5vcm1hbGl6ZVNoZWV0U2l6ZShuZXdTaXplKTtcblxuICAgIGNvbnN0IGlzQXV0b21hdGljID0gcGFydGlhbFNoZWV0U2l6ZS5iZWhhdmlvciA9PT0gQ29udHJhY3QuU2hlZXRTaXplQmVoYXZpb3IuQXV0b21hdGljO1xuICAgIGlmICghaXNBdXRvbWF0aWMgJiYgIXBhcnRpYWxTaGVldFNpemUubWluU2l6ZSAmJiAhcGFydGlhbFNoZWV0U2l6ZS5tYXhTaXplKSB7XG4gICAgICB0aHJvdyBpbnZhbGlkU2l6ZUVycm9yO1xuICAgIH1cblxuICAgIGlmICghaXNBdXRvbWF0aWMgJiYgdGhpcy5zaGVldFR5cGUgPT09IENvbnRyYWN0LlNoZWV0VHlwZS5Xb3Jrc2hlZXQpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoXG4gICAgICAgIENvbnRyYWN0LkVtYmVkZGluZ0Vycm9yQ29kZXMuSW52YWxpZFNpemVCZWhhdmlvck9uV29ya3NoZWV0LFxuICAgICAgICAnT25seSBTaGVldFNpemVCZWhhdmlvci5BdXRvbWF0aWMgaXMgYWxsb3dlZCBvbiBXb3Jrc2hlZXRzJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGlzQXV0b21hdGljICYmIHRoaXMuZ2V0U2hlZXRTaXplKCkuYmVoYXZpb3IgPT09IHBhcnRpYWxTaGVldFNpemUuYmVoYXZpb3IpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobmV3U2l6ZSk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvY2Vzc2VkTmV3U2l6ZSA9IHRoaXMucHJvY2Vzc05ld1NpemUocGFydGlhbFNoZWV0U2l6ZSk7XG5cbiAgICBjb25zdCBzaXplU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxTaXplU2VydmljZT4oU2VydmljZU5hbWVzLlNpemUpO1xuICAgIHJldHVybiBzaXplU2VydmljZS5jaGFuZ2VTaXplQXN5bmModGhpcy5uYW1lLCBwcm9jZXNzZWROZXdTaXplKS50aGVuKCgpID0+IHtcbiAgICAgIGNvbnN0IGNsaWVudEluZm9TZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPENsaWVudEluZm9TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuQ2xpZW50SW5mbyk7XG5cbiAgICAgIHJldHVybiBjbGllbnRJbmZvU2VydmljZS5nZXRDbGllbnRJbmZvQXN5bmMoKS50aGVuKChib290c3RyYXBJbmZvKSA9PiB7XG4gICAgICAgIGNvbnN0IHNoZWV0ID0gYm9vdHN0cmFwSW5mby5wdWJsaXNoZWRTaGVldHMuZmluZCgocykgPT4gcy5uYW1lID09PSB0aGlzLm5hbWUpO1xuICAgICAgICBpZiAoIXNoZWV0KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5TaGFyZWRFcnJvckNvZGVzLkludGVybmFsRXJyb3IsIGBDYW4ndCBmaW5kIHNoZWV0IHdpdGggbmFtZSAke3RoaXMubmFtZX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNoZWV0U2l6ZSA9IFNoZWV0VXRpbHMuZ2V0U2hlZXRTaXplRnJvbVNpemVDb25zdHJhaW50cyhzaGVldC5zaXplQ29uc3RyYWludCk7XG4gICAgICAgIHRoaXMuX3NoZWV0SW5mb0ltcGwuc2hlZXRTaXplID0gc2hlZXRTaXplO1xuXG4gICAgICAgIHJldHVybiBzaGVldFNpemU7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbm9ybWFsaXplU2hlZXRTaXplKG5ld1NpemU6IENvbnRyYWN0LlNoZWV0U2l6ZSk6IFBhcnRpYWxTaGVldFNpemUge1xuICAgIGNvbnN0IHsgYmVoYXZpb3IgfSA9IG5ld1NpemU7XG5cbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPENvbnRyYWN0LlNoZWV0U2l6ZUJlaGF2aW9yPihiZWhhdmlvciwgQ29udHJhY3QuU2hlZXRTaXplQmVoYXZpb3IsICdTaGVldFNpemVCZWhhdmlvcicpO1xuXG4gICAgY29uc3QgbWluU2l6ZSA9IFNoZWV0SW1wbC5wYXJzZURpbWVuc2lvbnMobmV3U2l6ZS5taW5TaXplKTtcbiAgICBjb25zdCBtYXhTaXplID0gU2hlZXRJbXBsLnBhcnNlRGltZW5zaW9ucyhuZXdTaXplLm1heFNpemUpO1xuXG4gICAgcmV0dXJuIHsgYmVoYXZpb3IsIG1pblNpemUsIG1heFNpemUgfTtcbiAgfVxuXG4gIHByaXZhdGUgcHJvY2Vzc05ld1NpemUobmV3U2l6ZTogUGFydGlhbFNoZWV0U2l6ZSk6IENvbnRyYWN0LlNoZWV0U2l6ZSB7XG4gICAgY29uc3QgeyBiZWhhdmlvciwgbWluU2l6ZTogbWluU2l6ZU1heWJlLCBtYXhTaXplOiBtYXhTaXplTWF5YmUgfSA9IG5ld1NpemU7XG5cbiAgICBjb25zdCBoYXNNaW5XaWR0aCA9ICFQYXJhbS5pc051bGxPclVuZGVmaW5lZChtaW5TaXplTWF5YmU/LndpZHRoKTtcbiAgICBjb25zdCBoYXNNaW5IZWlnaHQgPSAhUGFyYW0uaXNOdWxsT3JVbmRlZmluZWQobWluU2l6ZU1heWJlPy5oZWlnaHQpO1xuICAgIGNvbnN0IGhhc01heFdpZHRoID0gIVBhcmFtLmlzTnVsbE9yVW5kZWZpbmVkKG1heFNpemVNYXliZT8ud2lkdGgpO1xuICAgIGNvbnN0IGhhc01heEhlaWdodCA9ICFQYXJhbS5pc051bGxPclVuZGVmaW5lZChtYXhTaXplTWF5YmU/LmhlaWdodCk7XG4gICAgY29uc3QgaGFzVmFsaWRNaW5TaXplID0gaGFzTWluV2lkdGggJiYgaGFzTWluSGVpZ2h0O1xuICAgIGNvbnN0IGhhc1ZhbGlkTWF4U2l6ZSA9IGhhc01heFdpZHRoICYmIGhhc01heEhlaWdodDtcblxuICAgIHN3aXRjaCAoYmVoYXZpb3IpIHtcbiAgICAgIGNhc2UgQ29udHJhY3QuU2hlZXRTaXplQmVoYXZpb3IuQXV0b21hdGljOiB7XG4gICAgICAgIHJldHVybiB7IGJlaGF2aW9yIH07XG4gICAgICB9XG5cbiAgICAgIGNhc2UgQ29udHJhY3QuU2hlZXRTaXplQmVoYXZpb3IuQXRNb3N0OiB7XG4gICAgICAgIGlmICghbWF4U2l6ZU1heWJlIHx8ICFoYXNWYWxpZE1heFNpemUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVtYmVkZGluZ0Vycm9yQ29kZXMuTWlzc2luZ01heFNpemUsICdNaXNzaW5nIG1heFNpemUgZm9yIFNoZWV0U2l6ZUJlaGF2aW9yLkF0TW9zdCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbWF4U2l6ZSA9IHsgd2lkdGg6IG1heFNpemVNYXliZS53aWR0aCEsIGhlaWdodDogbWF4U2l6ZU1heWJlLmhlaWdodCEgfTtcbiAgICAgICAgaWYgKG1heFNpemUud2lkdGggPCAwIHx8IG1heFNpemUuaGVpZ2h0IDwgMCkge1xuICAgICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5JbnZhbGlkU2l6ZSwgJ1NpemUgdmFsdWUgY2Fubm90IGJlIGxlc3MgdGhhbiB6ZXJvJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyBiZWhhdmlvciwgbWF4U2l6ZSB9O1xuICAgICAgfVxuXG4gICAgICBjYXNlIENvbnRyYWN0LlNoZWV0U2l6ZUJlaGF2aW9yLkF0TGVhc3Q6IHtcbiAgICAgICAgaWYgKCFtaW5TaXplTWF5YmUgfHwgIWhhc1ZhbGlkTWluU2l6ZSkge1xuICAgICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5NaXNzaW5nTWluU2l6ZSwgJ01pc3NpbmcgbWluU2l6ZSBmb3IgU2hlZXRTaXplQmVoYXZpb3IuQXRMZWFzdCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbWluU2l6ZSA9IHsgd2lkdGg6IG1pblNpemVNYXliZS53aWR0aCEsIGhlaWdodDogbWluU2l6ZU1heWJlLmhlaWdodCEgfTtcbiAgICAgICAgaWYgKG1pblNpemUud2lkdGggPCAwIHx8IG1pblNpemUuaGVpZ2h0IDwgMCkge1xuICAgICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5JbnZhbGlkU2l6ZSwgJ1NpemUgdmFsdWUgY2Fubm90IGJlIGxlc3MgdGhhbiB6ZXJvJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyBiZWhhdmlvciwgbWluU2l6ZSB9O1xuICAgICAgfVxuXG4gICAgICBjYXNlIENvbnRyYWN0LlNoZWV0U2l6ZUJlaGF2aW9yLlJhbmdlOiB7XG4gICAgICAgIGlmICghbWluU2l6ZU1heWJlIHx8ICFtYXhTaXplTWF5YmUgfHwgIWhhc1ZhbGlkTWluU2l6ZSB8fCAhaGFzVmFsaWRNYXhTaXplKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLk1pc3NpbmdNaW5NYXhTaXplLCAnTWlzc2luZyBtaW5TaXplIG9yIG1heFNpemUgZm9yIFNoZWV0U2l6ZUJlaGF2aW9yLlJhbmdlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtaW5TaXplID0geyB3aWR0aDogbWluU2l6ZU1heWJlLndpZHRoISwgaGVpZ2h0OiBtaW5TaXplTWF5YmUuaGVpZ2h0ISB9O1xuICAgICAgICBjb25zdCBtYXhTaXplID0geyB3aWR0aDogbWF4U2l6ZU1heWJlLndpZHRoISwgaGVpZ2h0OiBtYXhTaXplTWF5YmUuaGVpZ2h0ISB9O1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBtaW5TaXplLndpZHRoIDwgMCB8fFxuICAgICAgICAgIG1pblNpemUuaGVpZ2h0IDwgMCB8fFxuICAgICAgICAgIG1heFNpemUud2lkdGggPCAwIHx8XG4gICAgICAgICAgbWF4U2l6ZS5oZWlnaHQgPCAwIHx8XG4gICAgICAgICAgbWluU2l6ZS53aWR0aCA+IG1heFNpemUud2lkdGggfHxcbiAgICAgICAgICBtaW5TaXplLmhlaWdodCA+IG1heFNpemUuaGVpZ2h0XG4gICAgICAgICkge1xuICAgICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5JbnZhbGlkU2l6ZSwgJ01pc3NpbmcgbWluU2l6ZSBvciBtYXhTaXplIGZvciBTaGVldFNpemVCZWhhdmlvci5SYW5nZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgYmVoYXZpb3IsIG1pblNpemUsIG1heFNpemUgfTtcbiAgICAgIH1cblxuICAgICAgY2FzZSBDb250cmFjdC5TaGVldFNpemVCZWhhdmlvci5FeGFjdGx5OiB7XG4gICAgICAgIGlmIChtaW5TaXplTWF5YmUgJiYgbWF4U2l6ZU1heWJlKSB7XG4gICAgICAgICAgaWYgKGhhc1ZhbGlkTWluU2l6ZSAmJiBoYXNWYWxpZE1heFNpemUpIHtcbiAgICAgICAgICAgIGNvbnN0IG1pblNpemUgPSB7IHdpZHRoOiBtaW5TaXplTWF5YmUud2lkdGghLCBoZWlnaHQ6IG1pblNpemVNYXliZS5oZWlnaHQhIH07XG4gICAgICAgICAgICBjb25zdCBtYXhTaXplID0geyB3aWR0aDogbWF4U2l6ZU1heWJlLndpZHRoISwgaGVpZ2h0OiBtYXhTaXplTWF5YmUuaGVpZ2h0ISB9O1xuXG4gICAgICAgICAgICBpZiAobWluU2l6ZS53aWR0aCAhPT0gbWF4U2l6ZS53aWR0aCB8fCBtaW5TaXplLmhlaWdodCAhPT0gbWF4U2l6ZS5oZWlnaHQpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLkludmFsaWRTaXplLCAnQ29uZmxpY3Rpbmcgc2l6ZSB2YWx1ZXMgZm9yIFNoZWV0U2l6ZUJlaGF2aW9yLkV4YWN0bHknKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHsgYmVoYXZpb3IsIG1pblNpemUsIG1heFNpemUgfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaGFzVmFsaWRNaW5TaXplKSB7XG4gICAgICAgICAgICBjb25zdCBtaW5TaXplID0geyB3aWR0aDogbWluU2l6ZU1heWJlLndpZHRoISwgaGVpZ2h0OiBtaW5TaXplTWF5YmUuaGVpZ2h0ISB9O1xuICAgICAgICAgICAgcmV0dXJuIHsgYmVoYXZpb3IsIG1pblNpemUsIG1heFNpemU6IG1pblNpemUgfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaGFzVmFsaWRNYXhTaXplKSB7XG4gICAgICAgICAgICBjb25zdCBtYXhTaXplID0geyB3aWR0aDogbWF4U2l6ZU1heWJlLndpZHRoISwgaGVpZ2h0OiBtYXhTaXplTWF5YmUuaGVpZ2h0ISB9O1xuICAgICAgICAgICAgcmV0dXJuIHsgYmVoYXZpb3IsIG1pblNpemU6IG1heFNpemUsIG1heFNpemUgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVtYmVkZGluZ0Vycm9yQ29kZXMuSW52YWxpZFNpemUsICdJbnZhbGlkIHNoZWV0IHNpemUgcGFyYW1ldGVyJyk7XG4gICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5TaGFyZWRFcnJvckNvZGVzLkludGVybmFsRXJyb3IsIGBVbnN1cHBvcnRlZCBzaGVldCBzaXplIGJlaGF2aW9yOiAke2JlaGF2aW9yfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHBhcnNlRGltZW5zaW9ucyA9IChzaXplOiBDb250cmFjdC5TaXplIHwgdW5kZWZpbmVkKTogUGFydGlhbDxDb250cmFjdC5TaXplPiA9PiB7XG4gICAgY29uc3QgZW1wdHkgPSB7IHdpZHRoOiB1bmRlZmluZWQsIGhlaWdodDogdW5kZWZpbmVkIH07XG5cbiAgICBpZiAoIXNpemUpIHtcbiAgICAgIHJldHVybiBlbXB0eTtcbiAgICB9XG5cbiAgICBjb25zdCB7IHN1Y2Nlc3M6IHdpZHRoUGFyc2VkLCBwYXJzZWQ6IHBhcnNlZFdpZHRoIH0gPSBQYXJhbS50cnlQYXJzZU51bWJlcihzaXplLndpZHRoKTtcbiAgICBjb25zdCB7IHN1Y2Nlc3M6IGhlaWdodFBhcnNlZCwgcGFyc2VkOiBwYXJzZWRIZWlnaHQgfSA9IFBhcmFtLnRyeVBhcnNlTnVtYmVyKHNpemUuaGVpZ2h0KTtcblxuICAgIGlmICh3aWR0aFBhcnNlZCAmJiBoZWlnaHRQYXJzZWQpIHtcbiAgICAgIHJldHVybiB7IHdpZHRoOiBwYXJzZWRXaWR0aCEsIGhlaWdodDogcGFyc2VkSGVpZ2h0ISB9O1xuICAgIH1cblxuICAgIGlmICh3aWR0aFBhcnNlZCkge1xuICAgICAgcmV0dXJuIHsgd2lkdGg6IHBhcnNlZFdpZHRoISB9O1xuICAgIH1cblxuICAgIGlmIChoZWlnaHRQYXJzZWQpIHtcbiAgICAgIHJldHVybiB7IGhlaWdodDogcGFyc2VkSGVpZ2h0ISB9O1xuICAgIH1cblxuICAgIHJldHVybiBlbXB0eTtcbiAgfTtcbn1cbiIsImltcG9ydCB7IFNoZWV0U2l6ZSBhcyBFbWJlZGRpbmdTaGVldFNpemUsIFNpemUgYXMgRXh0ZW5zaW9uU2hlZXRTaXplLCBTaGVldFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgU2hlZXRQYXRoIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuZXhwb3J0IGNsYXNzIFNoZWV0SW5mb0ltcGwge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfbmFtZTogc3RyaW5nLFxuICAgIHByaXZhdGUgX3NoZWV0VHlwZTogU2hlZXRUeXBlLFxuICAgIHByaXZhdGUgX3NoZWV0U2l6ZTogRXh0ZW5zaW9uU2hlZXRTaXplIHwgRW1iZWRkaW5nU2hlZXRTaXplLFxuICAgIHByaXZhdGUgX2luZGV4PzogbnVtYmVyLFxuICAgIHByaXZhdGUgX2lzQWN0aXZlPzogYm9vbGVhbixcbiAgICBwcml2YXRlIF9pc0hpZGRlbj86IGJvb2xlYW4sXG4gICAgcHJpdmF0ZSBfdXJsPzogc3RyaW5nLFxuICApIHt9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX25hbWU7XG4gIH1cblxuICBwdWJsaWMgc2V0IG5hbWUoc2hlZXROYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9uYW1lID0gc2hlZXROYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBzaGVldFNpemUoKTogRXh0ZW5zaW9uU2hlZXRTaXplIHwgRW1iZWRkaW5nU2hlZXRTaXplIHtcbiAgICByZXR1cm4gdGhpcy5fc2hlZXRTaXplO1xuICB9XG5cbiAgcHVibGljIHNldCBzaGVldFNpemUodmFsdWU6IEV4dGVuc2lvblNoZWV0U2l6ZSB8IEVtYmVkZGluZ1NoZWV0U2l6ZSkge1xuICAgIHRoaXMuX3NoZWV0U2l6ZSA9IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCBzaGVldFR5cGUoKTogU2hlZXRUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fc2hlZXRUeXBlO1xuICB9XG5cbiAgcHVibGljIGdldCBzaGVldFBhdGgoKTogU2hlZXRQYXRoIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2hlZXROYW1lOiB0aGlzLm5hbWUsXG4gICAgICBpc0Rhc2hib2FyZDogdGhpcy5zaGVldFR5cGUgPT09IFNoZWV0VHlwZS5EYXNoYm9hcmQsXG4gICAgICAvLyBUT0RPIC0gU3Rvcmllc1xuICAgIH07XG4gIH1cblxuICBwdWJsaWMgZ2V0IGluZGV4KCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2luZGV4O1xuICB9XG5cbiAgcHVibGljIGdldCBpc0FjdGl2ZSgpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5faXNBY3RpdmU7XG4gIH1cblxuICBwdWJsaWMgc2V0IGFjdGl2ZShhY3RpdmU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9pc0FjdGl2ZSA9IGFjdGl2ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNIaWRkZW4oKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2lzSGlkZGVuO1xuICB9XG5cbiAgcHVibGljIGdldCB1cmwoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fdXJsO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUV2ZW50VHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBTaW5nbGVFdmVudE1hbmFnZXIgfSBmcm9tICcuLi9TaW5nbGVFdmVudE1hbmFnZXInO1xuXG4vKipcbiAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgU2luZ2xlRXZlbnRNYW5hZ2VyIGludGVyZmFjZSBmb3IgYSBzaW5nbGUgdHlwZSBvZiBUYWJsZWF1IGV2ZW50XG4gKlxuICogQHRlbXBsYXRlIFRFdmVudFR5cGUgVGhlIFRhYmxlYXUgZXZlbnQgdHlwZSB0aGlzIGNsYXNzIHNwZWNpYWxpemVzXG4gKi9cbmV4cG9ydCBjbGFzcyBTaW5nbGVFdmVudE1hbmFnZXJJbXBsPFRFdmVudFR5cGUgZXh0ZW5kcyBDb250cmFjdC5UYWJsZWF1RXZlbnQ+IGltcGxlbWVudHMgU2luZ2xlRXZlbnRNYW5hZ2VyIHtcbiAgcHJpdmF0ZSBfZXZlbnRUeXBlOiBUYWJsZWF1RXZlbnRUeXBlO1xuICBwcml2YXRlIF9oYW5kbGVyczogQXJyYXk8KGV2ZW50T2JqOiBURXZlbnRUeXBlKSA9PiB2b2lkPjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoZXZlbnRUeXBlOiBUYWJsZWF1RXZlbnRUeXBlKSB7XG4gICAgdGhpcy5fZXZlbnRUeXBlID0gZXZlbnRUeXBlO1xuICAgIHRoaXMuX2hhbmRsZXJzID0gW107XG4gIH1cblxuICBwdWJsaWMgZ2V0IGV2ZW50VHlwZSgpOiBUYWJsZWF1RXZlbnRUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fZXZlbnRUeXBlO1xuICB9XG5cbiAgcHVibGljIGFkZEV2ZW50TGlzdGVuZXIoaGFuZGxlcjogKGV2ZW50T2JqOiBURXZlbnRUeXBlKSA9PiB2b2lkKTogQ29udHJhY3QuVGFibGVhdUV2ZW50VW5yZWdpc3RlckZuIHtcbiAgICB0aGlzLl9oYW5kbGVycy5wdXNoKGhhbmRsZXIpO1xuICAgIHJldHVybiAoKSA9PiB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoaGFuZGxlcik7XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlRXZlbnRMaXN0ZW5lcihoYW5kbGVyOiAoZXZlbnRPYmo6IFRFdmVudFR5cGUpID0+IHZvaWQpOiBib29sZWFuIHtcbiAgICBjb25zdCBiZWZvcmVDb3VudCA9IHRoaXMuX2hhbmRsZXJzLmxlbmd0aDtcbiAgICB0aGlzLl9oYW5kbGVycyA9IHRoaXMuX2hhbmRsZXJzLmZpbHRlcigoaCkgPT4gaCAhPT0gaGFuZGxlcik7XG4gICAgcmV0dXJuIGJlZm9yZUNvdW50ID4gdGhpcy5faGFuZGxlcnMubGVuZ3RoO1xuICB9XG5cbiAgcHVibGljIHRyaWdnZXJFdmVudChldmVudEdlbmVyYXRvcjogKCkgPT4gVEV2ZW50VHlwZSk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiB0aGlzLl9oYW5kbGVycykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZXZlbnRNb2RlbCA9IGV2ZW50R2VuZXJhdG9yKCk7XG4gICAgICAgIGhhbmRsZXIoZXZlbnRNb2RlbCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIFNpbmNlIHRoaXMgaGFuZGxlciBjb3VsZCBiZSBvdXRzaWRlIG91ciBjb250cm9sLCBqdXN0IGNhdGNoIGFueXRoaW5nIGl0IHRocm93cyBhbmQgY29udGludWUgb25cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgU2hlZXRJbmZvLCBTdG9yeU1vZGVsLCBTdG9yeVBvaW50TW9kZWwgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5LCBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgU3RvcnlBY3RpdmF0aW9uU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL1N0b3J5QWN0aXZhdGlvblNlcnZpY2UnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vVGFibGVhdUVycm9yJztcbmltcG9ydCB7IEVycm9ySGVscGVycyB9IGZyb20gJy4uL1V0aWxzL0Vycm9ySGVscGVycyc7XG5pbXBvcnQgeyBTaG9ydExpdmVkRGVmZXJyZWQgfSBmcm9tICcuLi9VdGlscy9TaG9ydExpdmVkRGVmZXJyZWQnO1xuaW1wb3J0IHsgU2hlZXRJbXBsIH0gZnJvbSAnLi9TaGVldEltcGwnO1xuaW1wb3J0IHsgU2hlZXRJbmZvSW1wbCB9IGZyb20gJy4vU2hlZXRJbmZvSW1wbCc7XG5pbXBvcnQgeyBTdG9yeVBvaW50SW1wbCB9IGZyb20gJy4vU3RvcnlQb2ludEltcGwnO1xuaW1wb3J0IHsgU3RvcnlQb2ludEluZm9JbXBsIH0gZnJvbSAnLi9TdG9yeVBvaW50SW5mb0ltcGwnO1xuXG5leHBvcnQgY2xhc3MgU3RvcnlJbXBsIGV4dGVuZHMgU2hlZXRJbXBsIHtcbiAgcHJpdmF0ZSBfYWN0aXZlU3RvcnlQb2ludEltcGw6IFN0b3J5UG9pbnRJbXBsO1xuICBwcml2YXRlIF9zdG9yeVBvaW50SW5mb0ltcGxzOiBBcnJheTxTdG9yeVBvaW50SW5mb0ltcGw+ID0gW107XG4gIHByaXZhdGUgX2RlZmVycmVkOiBTaG9ydExpdmVkRGVmZXJyZWQ8U3RvcnlQb2ludEltcGw+O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgX3NoZWV0SW5mb0ltcGw6IFNoZWV0SW5mb0ltcGwsXG4gICAgc3RvcnlNb2RlbDogU3RvcnlNb2RlbCxcbiAgICBwcml2YXRlIF9wdWJsaXNoZWRTaGVldEluZm9zOiBBcnJheTxTaGVldEluZm8+LFxuICAgIHByb3RlY3RlZCBfcmVnaXN0cnlJZDogbnVtYmVyLFxuICApIHtcbiAgICBzdXBlcihfc2hlZXRJbmZvSW1wbCwgX3JlZ2lzdHJ5SWQpO1xuICAgIHRoaXMuX2RlZmVycmVkID0gbmV3IFNob3J0TGl2ZWREZWZlcnJlZDxTdG9yeVBvaW50SW1wbD4oKTtcbiAgICB0aGlzLmluaXRpYWxpemVTdG9yeShzdG9yeU1vZGVsKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZVN0b3J5KHN0b3J5TW9kZWw6IFN0b3J5TW9kZWwpIHtcbiAgICBzdG9yeU1vZGVsLnN0b3J5UG9pbnRzLmZvckVhY2goKHN0b3J5UG9pbnRNb2RlbCkgPT4ge1xuICAgICAgY29uc3QgaXNBY3RpdmUgPSBzdG9yeVBvaW50TW9kZWwuaW5kZXggPT09IHN0b3J5TW9kZWwuYWN0aXZlU3RvcnlQb2ludEluZGV4O1xuICAgICAgY29uc3Qgc3RvcnlQb2ludEluZm9JbXBsID0gbmV3IFN0b3J5UG9pbnRJbmZvSW1wbChcbiAgICAgICAgc3RvcnlQb2ludE1vZGVsLmNhcHRpb24sXG4gICAgICAgIHN0b3J5UG9pbnRNb2RlbC5pbmRleCxcbiAgICAgICAgc3RvcnlQb2ludE1vZGVsLnN0b3J5UG9pbnRJZCxcbiAgICAgICAgaXNBY3RpdmUsXG4gICAgICAgIHN0b3J5UG9pbnRNb2RlbC51cGRhdGVkLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICAgIHRoaXMuX3N0b3J5UG9pbnRJbmZvSW1wbHMucHVzaChzdG9yeVBvaW50SW5mb0ltcGwpO1xuXG4gICAgICBpZiAoaXNBY3RpdmUpIHtcbiAgICAgICAgdGhpcy5fYWN0aXZlU3RvcnlQb2ludEltcGwgPSBuZXcgU3RvcnlQb2ludEltcGwoXG4gICAgICAgICAgc3RvcnlQb2ludEluZm9JbXBsLFxuICAgICAgICAgIHRoaXMuX3B1Ymxpc2hlZFNoZWV0SW5mb3MsXG4gICAgICAgICAgdGhpcy5fcmVnaXN0cnlJZCxcbiAgICAgICAgICBzdG9yeVBvaW50TW9kZWwuY29udGFpbmVkU2hlZXRJbmZvLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTdG9yeUluZm8oaW5kZXg6IG51bWJlciwgc3RvcnlQb2ludE1vZGVsOiBTdG9yeVBvaW50TW9kZWwpIHtcbiAgICBpZiAoIXRoaXMuX3N0b3J5UG9pbnRJbmZvSW1wbHMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgc3RvcnlJbmZvSW1wbCA9IHRoaXMuX3N0b3J5UG9pbnRJbmZvSW1wbHNbaW5kZXhdO1xuICAgIGlmIChzdG9yeUluZm9JbXBsLnN0b3J5UG9pbnRJZCAhPT0gc3RvcnlQb2ludE1vZGVsLnN0b3J5UG9pbnRJZCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihcbiAgICAgICAgQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5TdG9yeVBvaW50SWRNaXNtYXRjaCxcbiAgICAgICAgYFdlIHNob3VsZCBub3QgYmUgdXBkYXRpbmcgYSBzdG9yeSBwb2ludCB3aGVuIHRoZSBJRHMgZG9uJ3QgbWF0Y2guIEV4aXN0aW5nIHN0b3J5UG9pbnRJRD0ke3N0b3J5SW5mb0ltcGwuc3RvcnlQb2ludElkfSwgbmV3U3RvcnlQb2ludElEPSR7c3RvcnlQb2ludE1vZGVsLnN0b3J5UG9pbnRJZH1gLFxuICAgICAgKTtcbiAgICB9XG4gICAgc3RvcnlJbmZvSW1wbC5jYXB0aW9uID0gc3RvcnlQb2ludE1vZGVsLmNhcHRpb247XG4gICAgc3RvcnlJbmZvSW1wbC51cGRhdGVkID0gc3RvcnlQb2ludE1vZGVsLnVwZGF0ZWQ7XG5cbiAgICBpZiAodGhpcy5fYWN0aXZlU3RvcnlQb2ludEltcGwuc3RvcnlQb2ludElkID09PSBzdG9yeVBvaW50TW9kZWwuc3RvcnlQb2ludElkKSB7XG4gICAgICB0aGlzLl9hY3RpdmVTdG9yeVBvaW50SW1wbC51cGRhdGVkID0gc3RvcnlJbmZvSW1wbC51cGRhdGVkO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVTdG9yeShzdG9yeVBvaW50TW9kZWw6IFN0b3J5UG9pbnRNb2RlbCkge1xuICAgIGlmICghdGhpcy5fc3RvcnlQb2ludEluZm9JbXBscykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3N0b3J5UG9pbnRJbmZvSW1wbHMuZm9yRWFjaCgoc3RvcnlQb2ludEluZm9JbXBsKSA9PiB7XG4gICAgICBjb25zdCBpc0FjdGl2ZSA9IHN0b3J5UG9pbnRJbmZvSW1wbC5zdG9yeVBvaW50SWQgPT09IHN0b3J5UG9pbnRNb2RlbC5zdG9yeVBvaW50SWQ7XG4gICAgICBpZiAoaXNBY3RpdmUpIHtcbiAgICAgICAgLy8gdXBkYXRlIHRoZSBzdGF0ZVxuICAgICAgICBzdG9yeVBvaW50SW5mb0ltcGwuY2FwdGlvbiA9IHN0b3J5UG9pbnRNb2RlbC5jYXB0aW9uO1xuICAgICAgICBzdG9yeVBvaW50SW5mb0ltcGwuaW5kZXggPSBzdG9yeVBvaW50TW9kZWwuaW5kZXg7XG4gICAgICAgIHN0b3J5UG9pbnRJbmZvSW1wbC5hY3RpdmUgPSB0cnVlO1xuICAgICAgICBzdG9yeVBvaW50SW5mb0ltcGwudXBkYXRlZCA9IHN0b3J5UG9pbnRNb2RlbC51cGRhdGVkO1xuXG4gICAgICAgIC8vIHJlLWluaXRpYWxpemUgYWN0aXZlU3RvcnlQb2ludEltcGxcbiAgICAgICAgdGhpcy5fYWN0aXZlU3RvcnlQb2ludEltcGwgPSBuZXcgU3RvcnlQb2ludEltcGwoXG4gICAgICAgICAgc3RvcnlQb2ludEluZm9JbXBsLFxuICAgICAgICAgIHRoaXMuX3B1Ymxpc2hlZFNoZWV0SW5mb3MsXG4gICAgICAgICAgdGhpcy5fcmVnaXN0cnlJZCxcbiAgICAgICAgICBzdG9yeVBvaW50TW9kZWwuY29udGFpbmVkU2hlZXRJbmZvLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gc2V0IG9sZCBvbmVzIHRvIGZhbHNlXG4gICAgICAgIHN0b3J5UG9pbnRJbmZvSW1wbC5hY3RpdmUgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmFjdGl2ZVN0b3J5UG9pbnQpIHtcbiAgICAgIHRoaXMuX2RlZmVycmVkLnJlc29sdmUodGhpcy5hY3RpdmVTdG9yeVBvaW50KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFjdGl2ZVN0b3J5UG9pbnQoKTogU3RvcnlQb2ludEltcGwgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9hY3RpdmVTdG9yeVBvaW50SW1wbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc3RvcnlQb2ludHNJbmZvKCk6IEFycmF5PFN0b3J5UG9pbnRJbmZvSW1wbD4ge1xuICAgIHJldHVybiB0aGlzLl9zdG9yeVBvaW50SW5mb0ltcGxzO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0FjdGl2ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc2hlZXRJbmZvSW1wbC5hY3RpdmU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzSGlkZGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuX3NoZWV0SW5mb0ltcGwuaXNIaWRkZW47XG4gIH1cblxuICBwdWJsaWMgYWN0aXZhdGVOZXh0U3RvcnlQb2ludEFzeW5jKCk6IFByb21pc2U8U3RvcnlQb2ludEltcGw+IHtcbiAgICBpZiAodGhpcy5fYWN0aXZlU3RvcnlQb2ludEltcGwuaW5kZXggPT09IHRoaXMuX3N0b3J5UG9pbnRJbmZvSW1wbHMubGVuZ3RoIC0gMSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9hY3RpdmVTdG9yeVBvaW50SW1wbCk7XG4gICAgfVxuXG4gICAgbGV0IHByb21pc2UgPSB0aGlzLl9kZWZlcnJlZC5nZXROZXdQcm9taXNlT3JUaHJvd0lmQnVzeSgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxTdG9yeUFjdGl2YXRpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuU3RvcnlBY3RpdmF0aW9uKTtcbiAgICBzZXJ2aWNlLmFjdGl2YXRlTmV4dFN0b3J5UG9pbnRBc3luYygpO1xuICAgIHJldHVybiBwcm9taXNlO1xuICB9XG5cbiAgcHVibGljIGFjdGl2YXRlUHJldmlvdXNTdG9yeVBvaW50QXN5bmMoKTogUHJvbWlzZTxTdG9yeVBvaW50SW1wbD4ge1xuICAgIGlmICh0aGlzLl9hY3RpdmVTdG9yeVBvaW50SW1wbC5pbmRleCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9hY3RpdmVTdG9yeVBvaW50SW1wbCk7XG4gICAgfVxuXG4gICAgbGV0IHByb21pc2UgPSB0aGlzLl9kZWZlcnJlZC5nZXROZXdQcm9taXNlT3JUaHJvd0lmQnVzeSgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxTdG9yeUFjdGl2YXRpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuU3RvcnlBY3RpdmF0aW9uKTtcbiAgICBzZXJ2aWNlLmFjdGl2YXRlUHJldmlvdXNTdG9yeVBvaW50QXN5bmMoKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxuXG4gIHB1YmxpYyBhY3RpdmF0ZVN0b3J5UG9pbnRBc3luYyhpbmRleDogbnVtYmVyKTogUHJvbWlzZTxTdG9yeVBvaW50SW1wbD4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIoaW5kZXgsICdpbmRleCcpO1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXJUeXBlKGluZGV4LCAnbnVtYmVyJywgJ2luZGV4Jyk7XG5cbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMuX3N0b3J5UG9pbnRJbmZvSW1wbHMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVtYmVkZGluZ0Vycm9yQ29kZXMuSW5kZXhPdXRPZlJhbmdlLCAnVGhlIGluZGV4IHBhc3NlZCB0byB0aGlzIGNvbW1hbmQgaXMgb3V0IG9mIHJhbmdlLicpO1xuICAgIH1cblxuICAgIGlmIChpbmRleCA9PT0gdGhpcy5fYWN0aXZlU3RvcnlQb2ludEltcGwuaW5kZXgpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fYWN0aXZlU3RvcnlQb2ludEltcGwpO1xuICAgIH1cblxuICAgIGxldCBwcm9taXNlID0gdGhpcy5fZGVmZXJyZWQuZ2V0TmV3UHJvbWlzZU9yVGhyb3dJZkJ1c3koKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8U3RvcnlBY3RpdmF0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLlN0b3J5QWN0aXZhdGlvbik7XG4gICAgc2VydmljZS5hY3RpdmF0ZVN0b3J5UG9pbnRBc3luYyhpbmRleCk7XG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH1cblxuICBwdWJsaWMgcmV2ZXJ0U3RvcnlQb2ludEFzeW5jKGluZGV4OiBudW1iZXIpOiBQcm9taXNlPFN0b3J5UG9pbnRJbmZvSW1wbD4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIoaW5kZXgsICdpbmRleCcpO1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXJUeXBlKGluZGV4LCAnbnVtYmVyJywgJ2luZGV4Jyk7XG5cbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMuX3N0b3J5UG9pbnRJbmZvSW1wbHMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVtYmVkZGluZ0Vycm9yQ29kZXMuSW5kZXhPdXRPZlJhbmdlLCAnVGhlIGluZGV4IHBhc3NlZCB0byB0aGlzIGNvbW1hbmQgaXMgb3V0IG9mIHJhbmdlLicpO1xuICAgIH1cblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8U3RvcnlBY3RpdmF0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLlN0b3J5QWN0aXZhdGlvbik7XG5cbiAgICByZXR1cm4gc2VydmljZS5yZXZlcnRTdG9yeVBvaW50QXN5bmMoaW5kZXgpLnRoZW48U3RvcnlQb2ludEluZm9JbXBsPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHRoaXMudXBkYXRlU3RvcnlJbmZvKHJlc3BvbnNlLmluZGV4LCByZXNwb25zZSk7XG4gICAgICBjb25zdCBzdG9yeVBvaW50SW5mb0ltcGwgPSBuZXcgU3RvcnlQb2ludEluZm9JbXBsKFxuICAgICAgICByZXNwb25zZS5jYXB0aW9uLFxuICAgICAgICByZXNwb25zZS5pbmRleCxcbiAgICAgICAgcmVzcG9uc2Uuc3RvcnlQb2ludElkLFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgcmVzcG9uc2UudXBkYXRlZCxcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgICByZXR1cm4gc3RvcnlQb2ludEluZm9JbXBsO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGNsZWFyUGVuZGluZ1Byb21pc2VzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9kZWZlcnJlZCkge1xuICAgICAgdGhpcy5fZGVmZXJyZWQucmVqZWN0KCdBbGwgcGVuZGluZyBwcm9taXNlcyBjbGVhcmVkJyk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQ29udGFpbmVkU2hlZXRJbmZvTW9kZWwsIFNoZWV0SW5mbywgU2hlZXRQYXRoLCBWaXN1YWxJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgU2hlZXRVdGlscyB9IGZyb20gJy4uL1V0aWxzL1NoZWV0VXRpbHMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkSW1wbCB9IGZyb20gJy4vRGFzaGJvYXJkSW1wbCc7XG5pbXBvcnQgeyBTaGVldEltcGwgfSBmcm9tICcuL1NoZWV0SW1wbCc7XG5pbXBvcnQgeyBTaGVldEluZm9JbXBsIH0gZnJvbSAnLi9TaGVldEluZm9JbXBsJztcbmltcG9ydCB7IFN0b3J5SW1wbCB9IGZyb20gJy4vU3RvcnlJbXBsJztcbmltcG9ydCB7IFN0b3J5UG9pbnRJbmZvSW1wbCB9IGZyb20gJy4vU3RvcnlQb2ludEluZm9JbXBsJztcbmltcG9ydCB7IFdvcmtzaGVldEltcGwgfSBmcm9tICcuL1dvcmtzaGVldEltcGwnO1xuXG5leHBvcnQgY2xhc3MgU3RvcnlQb2ludEltcGwge1xuICBwcml2YXRlIF9jb250YWluZWRTaGVldEltcGw6IFNoZWV0SW1wbDtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfc3RvcnlQb2ludEluZm9JbXBsOiBTdG9yeVBvaW50SW5mb0ltcGwsXG4gICAgc2hlZXRJbmZvczogQXJyYXk8U2hlZXRJbmZvPixcbiAgICByZWdpc3RyeUlkOiBudW1iZXIsXG4gICAgY29udGFpbmVkU2hlZXRJbmZvPzogQ29udGFpbmVkU2hlZXRJbmZvTW9kZWwsXG4gICkge1xuICAgIGlmIChjb250YWluZWRTaGVldEluZm8pIHtcbiAgICAgIHRoaXMuX2NvbnRhaW5lZFNoZWV0SW1wbCA9IHRoaXMuY3JlYXRlQ29udGFpbmVkU2hlZXQoY29udGFpbmVkU2hlZXRJbmZvLCBzaGVldEluZm9zLCByZWdpc3RyeUlkKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IGluZGV4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3J5UG9pbnRJbmZvSW1wbC5pbmRleDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY2FwdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zdG9yeVBvaW50SW5mb0ltcGwuY2FwdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWN0aXZlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zdG9yeVBvaW50SW5mb0ltcGwuYWN0aXZlO1xuICB9XG5cbiAgcHVibGljIGdldCB1cGRhdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zdG9yeVBvaW50SW5mb0ltcGwudXBkYXRlZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgdXBkYXRlZCh1cGRhdGVkOiBib29sZWFuKSB7XG4gICAgdGhpcy5fc3RvcnlQb2ludEluZm9JbXBsLnVwZGF0ZWQgPSB1cGRhdGVkO1xuICB9XG5cbiAgcHVibGljIGdldCBwYXJlbnRTdG9yeSgpOiBTdG9yeUltcGwge1xuICAgIHJldHVybiB0aGlzLl9zdG9yeVBvaW50SW5mb0ltcGwucGFyZW50U3Rvcnk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvbnRhaW5lZFNoZWV0KCk6IFNoZWV0SW1wbCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbnRhaW5lZFNoZWV0SW1wbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc3RvcnlQb2ludElkKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3J5UG9pbnRJbmZvSW1wbC5zdG9yeVBvaW50SWQ7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUNvbnRhaW5lZFNoZWV0KGNvbnRhaW5lZFNoZWV0SW5mbzogQ29udGFpbmVkU2hlZXRJbmZvTW9kZWwsIHNoZWV0SW5mb3M6IEFycmF5PFNoZWV0SW5mbz4sIHJlZ2lzdHJ5SWQ6IG51bWJlcik6IFNoZWV0SW1wbCB7XG4gICAgY29uc3QgY29udGFpbmVkU2hlZXRJZHggPSAtMTtcblxuICAgIGNvbnN0IHB1Ymxpc2hlZFNoZWV0SW5mbyA9IFNoZWV0VXRpbHMuZ2V0UHVibGlzaGVkU2hlZXRJbmZvQnlOYW1lKGNvbnRhaW5lZFNoZWV0SW5mby5uYW1lLCBzaGVldEluZm9zKTtcbiAgICBjb25zdCBjb250YWluZWRTaGVldFNpemUgPSBTaGVldFV0aWxzLmNyZWF0ZUF1dG9tYXRpY1NpemUoKTtcbiAgICBjb25zdCBpc0NvbnRhaW5lZFNoZWV0SGlkZGVuID0gcHVibGlzaGVkU2hlZXRJbmZvID09PSB1bmRlZmluZWQ7XG4gICAgY29uc3QgY29udGFpbmVkU2hlZXRVcmwgPSBwdWJsaXNoZWRTaGVldEluZm8gPyBwdWJsaXNoZWRTaGVldEluZm8udXJsIDogJyc7XG4gICAgLy8gQ29udGFpbmVkIHNoZWV0cyBhcmVuJ3QgYWN0aXZlIC0gdGhlIGNvbnRhaW5pbmcgc2hlZXQgaXMgYWN0aXZlLlxuICAgIGNvbnN0IGNvbnRhaW5lZFNoZWV0QWN0aXZlID0gZmFsc2U7XG5cbiAgICBjb25zdCBjb250YWluZWRTaGVldEluZm9JbXBsID0gbmV3IFNoZWV0SW5mb0ltcGwoXG4gICAgICBjb250YWluZWRTaGVldEluZm8ubmFtZSxcbiAgICAgIFNoZWV0VXRpbHMuZ2V0U2hlZXRUeXBlRW51bShjb250YWluZWRTaGVldEluZm8uc2hlZXRUeXBlKSxcbiAgICAgIGNvbnRhaW5lZFNoZWV0U2l6ZSxcbiAgICAgIGNvbnRhaW5lZFNoZWV0SWR4LFxuICAgICAgY29udGFpbmVkU2hlZXRBY3RpdmUsXG4gICAgICBpc0NvbnRhaW5lZFNoZWV0SGlkZGVuLFxuICAgICAgY29udGFpbmVkU2hlZXRVcmwsXG4gICAgKTtcblxuICAgIGxldCBzaGVldEltcGw6IFNoZWV0SW1wbDtcbiAgICBzd2l0Y2ggKGNvbnRhaW5lZFNoZWV0SW5mb0ltcGwuc2hlZXRUeXBlKSB7XG4gICAgICBjYXNlIENvbnRyYWN0LlNoZWV0VHlwZS5Xb3Jrc2hlZXQ6IHtcbiAgICAgICAgY29uc3Qgdml6SWQ6IFZpc3VhbElkID0ge1xuICAgICAgICAgIHdvcmtzaGVldDogY29udGFpbmVkU2hlZXRJbmZvSW1wbC5uYW1lLFxuICAgICAgICB9O1xuXG4gICAgICAgIHNoZWV0SW1wbCA9IG5ldyBXb3Jrc2hlZXRJbXBsKGNvbnRhaW5lZFNoZWV0SW5mb0ltcGwsIHJlZ2lzdHJ5SWQsIHZpeklkLCBudWxsLCB0aGlzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIENvbnRyYWN0LlNoZWV0VHlwZS5EYXNoYm9hcmQ6IHtcbiAgICAgICAgY29uc3Qgc2hlZXRQYXRoOiBTaGVldFBhdGggPSB7XG4gICAgICAgICAgc2hlZXROYW1lOiBjb250YWluZWRTaGVldEluZm9JbXBsLm5hbWUsXG4gICAgICAgICAgaXNEYXNoYm9hcmQ6IHRydWUsXG4gICAgICAgIH07XG5cbiAgICAgICAgc2hlZXRJbXBsID0gbmV3IERhc2hib2FyZEltcGwoY29udGFpbmVkU2hlZXRJbmZvSW1wbCwgY29udGFpbmVkU2hlZXRJbmZvLmRhc2hib2FyZFpvbmVzLCBzaGVldFBhdGgsIHJlZ2lzdHJ5SWQsIHRoaXMpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5TaGFyZWRFcnJvckNvZGVzLlNlcnZlckVycm9yLCAnSW52YWxpZCBTaGVldFR5cGUnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc2hlZXRJbXBsO1xuICB9XG59XG4iLCJpbXBvcnQgeyBTdG9yeUltcGwgfSBmcm9tICcuL1N0b3J5SW1wbCc7XG5cbmV4cG9ydCBjbGFzcyBTdG9yeVBvaW50SW5mb0ltcGwge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfY2FwdGlvbjogc3RyaW5nLFxuICAgIHByaXZhdGUgX2luZGV4OiBudW1iZXIsXG4gICAgcHJpdmF0ZSBfc3RvcnlQb2ludElkOiBudW1iZXIsXG4gICAgcHJpdmF0ZSBfYWN0aXZlOiBib29sZWFuLFxuICAgIHByaXZhdGUgX3VwZGF0ZWQ6IGJvb2xlYW4sXG4gICAgcHJpdmF0ZSBfcGFyZW50U3RvcnlJbXBsOiBTdG9yeUltcGwsXG4gICkge31cblxuICBwdWJsaWMgZ2V0IGNhcHRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NhcHRpb247XG4gIH1cblxuICBwdWJsaWMgc2V0IGNhcHRpb24oY2FwdGlvbjogc3RyaW5nKSB7XG4gICAgdGhpcy5fY2FwdGlvbiA9IGNhcHRpb247XG4gIH1cblxuICBwdWJsaWMgZ2V0IGluZGV4KCkge1xuICAgIHJldHVybiB0aGlzLl9pbmRleDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaW5kZXgoaW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMuX2luZGV4ID0gaW5kZXg7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHN0b3J5UG9pbnRJZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RvcnlQb2ludElkO1xuICB9XG5cbiAgcHVibGljIGdldCBhY3RpdmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgYWN0aXZlKGlzQWN0aXZlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fYWN0aXZlID0gaXNBY3RpdmU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHVwZGF0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3VwZGF0ZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IHVwZGF0ZWQoaXNVcGRhdGVkOiBib29sZWFuKSB7XG4gICAgdGhpcy5fdXBkYXRlZCA9IGlzVXBkYXRlZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcGFyZW50U3RvcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudFN0b3J5SW1wbDtcbiAgfVxufVxuIiwiZXhwb3J0IGNsYXNzIFdvcmtib29rSW1wbCB7fVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIEFwaU1lbnVUeXBlLFxuICBDb250ZXh0TWVudU9wdGlvbnMsXG4gIERhdGVSYW5nZVR5cGUsXG4gIEVycm9yQ29kZXMsXG4gIEZpbHRlck51bGxPcHRpb24sXG4gIEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICBQZXJpb2RUeXBlLFxuICBTZWxlY3Rpb25VcGRhdGVUeXBlLFxuICBTaGFyZWRFcnJvckNvZGVzLFxuICBUb29sdGlwQ29udGV4dCxcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IERhdGFTY2hlbWEsIERhdGFTb3VyY2UgYXMgRGF0YVNvdXJjZUluZm8sIFZpc3VhbElkLCBXb3Jrc2hlZXREYXRhU291cmNlSW5mbyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXRhU291cmNlIH0gZnJvbSAnLi4vRGF0YVNvdXJjZSc7XG5pbXBvcnQgeyBMb2dpY2FsVGFibGUgfSBmcm9tICcuLi9Mb2dpY2FsVGFibGUnO1xuaW1wb3J0IHsgQWNjZXNzaWJpbGl0eVNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9BY2Nlc3NpYmlsaXR5U2VydmljZSc7XG5pbXBvcnQgeyBBbm5vdGF0aW9uU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0Fubm90YXRpb25TZXJ2aWNlJztcbmltcG9ydCB7IERhdGFTb3VyY2VTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvRGF0YVNvdXJjZVNlcnZpY2UnO1xuaW1wb3J0IHsgRXh0ZXJuYWxDb250ZXh0TWVudVNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9FeHRlcm5hbENvbnRleHRNZW51U2VydmljZSc7XG5pbXBvcnQgeyBGaWx0ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvRmlsdGVyU2VydmljZSc7XG5pbXBvcnQgeyBHZXREYXRhU2VydmljZSwgR2V0RGF0YVR5cGUgfSBmcm9tICcuLi9TZXJ2aWNlcy9HZXREYXRhU2VydmljZSc7XG5pbXBvcnQgeyBTZWxlY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvU2VsZWN0aW9uU2VydmljZSc7XG5pbXBvcnQgeyBBcGlTZXJ2aWNlUmVnaXN0cnksIFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBWaXN1YWxNb2RlbFNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9WaXN1YWxNb2RlbFNlcnZpY2UnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vVGFibGVhdUVycm9yJztcbmltcG9ydCB7IEVycm9ySGVscGVycyB9IGZyb20gJy4uL1V0aWxzL0Vycm9ySGVscGVycyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRJbXBsIH0gZnJvbSAnLi9EYXNoYm9hcmRJbXBsJztcbmltcG9ydCB7IERhdGFTb3VyY2VJbXBsIH0gZnJvbSAnLi9EYXRhU291cmNlSW1wbCc7XG5pbXBvcnQgeyBTaGVldEltcGwgfSBmcm9tICcuL1NoZWV0SW1wbCc7XG5pbXBvcnQgeyBTaGVldEluZm9JbXBsIH0gZnJvbSAnLi9TaGVldEluZm9JbXBsJztcbmltcG9ydCB7IFN0b3J5UG9pbnRJbXBsIH0gZnJvbSAnLi9TdG9yeVBvaW50SW1wbCc7XG5cbmV4cG9ydCBjbGFzcyBXb3Jrc2hlZXRJbXBsIGV4dGVuZHMgU2hlZXRJbXBsIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHNoZWV0SW5mb0ltcGw6IFNoZWV0SW5mb0ltcGwsXG4gICAgX3JlZ2lzdHJ5SWQ6IG51bWJlcixcbiAgICBwcml2YXRlIF92aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgcHJpdmF0ZSBfcGFyZW50RGFzaGJvYXJkSW1wbDogRGFzaGJvYXJkSW1wbCB8IG51bGwsXG4gICAgcHJpdmF0ZSBfcGFyZW50U3RvcnlQb2ludEltcGw6IFN0b3J5UG9pbnRJbXBsIHwgbnVsbCxcbiAgICBwcml2YXRlIF9iYWNrZ3JvdW5kQ29sb3I6IHN0cmluZyB8IG51bGwgPSBudWxsLFxuICAgIHByaXZhdGUgX2Zvcm1hdHRpbmc6IENvbnRyYWN0Lldvcmtib29rRm9ybWF0dGluZyB8IG51bGwgPSBudWxsLFxuICApIHtcbiAgICBzdXBlcihzaGVldEluZm9JbXBsLCBfcmVnaXN0cnlJZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBhcmVudERhc2hib2FyZCgpOiBEYXNoYm9hcmRJbXBsIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudERhc2hib2FyZEltcGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBhcmVudFN0b3J5UG9pbnQoKTogU3RvcnlQb2ludEltcGwgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50U3RvcnlQb2ludEltcGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHZpc3VhbElkKCk6IFZpc3VhbElkIHtcbiAgICByZXR1cm4gdGhpcy5fdmlzdWFsSWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0TWF4UGFnZVJvd0xpbWl0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIDEwMDAwO1xuICB9XG5cbiAgcHVibGljIGdldCBiYWNrZ3JvdW5kQ29sb3IoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2JhY2tncm91bmRDb2xvcjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZm9ybWF0dGluZygpOiBDb250cmFjdC5Xb3Jrc2hlZXRGb3JtYXR0aW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1hdHRpbmc7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlGaWx0ZXJBc3luYyhcbiAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZXM6IEFycmF5PHN0cmluZz4sXG4gICAgdXBkYXRlVHlwZTogQ29udHJhY3QuRmlsdGVyVXBkYXRlVHlwZSxcbiAgICBvcHRpb25zOiBDb250cmFjdC5GaWx0ZXJPcHRpb25zLFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlFbnVtVmFsdWU8Q29udHJhY3QuRmlsdGVyVXBkYXRlVHlwZT4odXBkYXRlVHlwZSwgQ29udHJhY3QuRmlsdGVyVXBkYXRlVHlwZSwgJ0NvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGUnKTtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEZpbHRlclNlcnZpY2U+KFNlcnZpY2VOYW1lcy5GaWx0ZXIpO1xuICAgIHJldHVybiBzZXJ2aWNlLmFwcGx5RmlsdGVyQXN5bmModGhpcy52aXN1YWxJZCwgZmllbGROYW1lLCB2YWx1ZXMsIHVwZGF0ZVR5cGUsIG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGFwcGx5UmFuZ2VGaWx0ZXJBc3luYyhmaWVsZE5hbWU6IHN0cmluZywgZmlsdGVyT3B0aW9uczogQ29udHJhY3QuUmFuZ2VGaWx0ZXJPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKGZpZWxkTmFtZSwgJ2ZpZWxkTmFtZScpO1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIoZmlsdGVyT3B0aW9ucywgJ2ZpbHRlck9wdGlvbnMnKTtcbiAgICBpZiAoZmlsdGVyT3B0aW9ucy5udWxsT3B0aW9uKSB7XG4gICAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPEZpbHRlck51bGxPcHRpb24+KGZpbHRlck9wdGlvbnMubnVsbE9wdGlvbiwgRmlsdGVyTnVsbE9wdGlvbiwgJ0ZpbHRlck51bGxPcHRpb24nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgRXJyb3JIZWxwZXJzLnZlcmlmeVJhbmdlUGFyYW1UeXBlKGZpbHRlck9wdGlvbnMubWluLCBmaWx0ZXJPcHRpb25zLm1heCk7XG4gICAgfVxuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RmlsdGVyU2VydmljZT4oU2VydmljZU5hbWVzLkZpbHRlcik7XG4gICAgcmV0dXJuIHNlcnZpY2UuYXBwbHlSYW5nZUZpbHRlckFzeW5jKHRoaXMudmlzdWFsSWQsIGZpZWxkTmFtZSwgZmlsdGVyT3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlIaWVyYXJjaGljYWxGaWx0ZXJBc3luYyhcbiAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZXM6IEFycmF5PHN0cmluZz4gfCBDb250cmFjdC5IaWVyYXJjaGljYWxMZXZlbHMsXG4gICAgdXBkYXRlVHlwZTogQ29udHJhY3QuRmlsdGVyVXBkYXRlVHlwZSxcbiAgICBvcHRpb25zOiBDb250cmFjdC5GaWx0ZXJPcHRpb25zLFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIoZmllbGROYW1lLCAnZmllbGROYW1lJyk7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcih2YWx1ZXMsICd2YWx1ZXMnKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPENvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGU+KHVwZGF0ZVR5cGUsIENvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGUsICdDb250cmFjdC5GaWx0ZXJVcGRhdGVUeXBlJyk7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlcykgJiYgIXZhbHVlcy5sZXZlbHMpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoXG4gICAgICAgIEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlcixcbiAgICAgICAgJ3ZhbHVlcyBwYXJhbWV0ZXIgZm9yIGFwcGx5SGllcmFyY2hpY2FsRmlsdGVyQXN5bmMgbXVzdCBiZSBhbiBhcnJheSBvciBjb250YWluIGEgbGV2ZWxzIGtleScsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEZpbHRlclNlcnZpY2U+KFNlcnZpY2VOYW1lcy5GaWx0ZXIpO1xuICAgIHJldHVybiBzZXJ2aWNlLmFwcGx5SGllcmFyY2hpY2FsRmlsdGVyQXN5bmModGhpcy52aXN1YWxJZCwgZmllbGROYW1lLCB2YWx1ZXMsIHVwZGF0ZVR5cGUsIG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGNsZWFyRmlsdGVyQXN5bmMoZmllbGROYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIoZmllbGROYW1lLCAnZmllbGROYW1lJyk7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxGaWx0ZXJTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRmlsdGVyKTtcbiAgICByZXR1cm4gc2VydmljZS5jbGVhckZpbHRlckFzeW5jKHRoaXMudmlzdWFsSWQsIGZpZWxkTmFtZSk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlSZWxhdGl2ZURhdGVGaWx0ZXJBc3luYyhmaWVsZE5hbWU6IHN0cmluZywgb3B0aW9uczogQ29udHJhY3QuUmVsYXRpdmVEYXRlRmlsdGVyT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVN0cmluZ1BhcmFtZXRlcihmaWVsZE5hbWUsICdmaWVsZE5hbWUnKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKG9wdGlvbnMsICdvcHRpb25zJyk7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUVudW1WYWx1ZTxQZXJpb2RUeXBlPihvcHRpb25zLnBlcmlvZFR5cGUsIFBlcmlvZFR5cGUsICdQZXJpb2RUeXBlJyk7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUVudW1WYWx1ZTxEYXRlUmFuZ2VUeXBlPihvcHRpb25zLnJhbmdlVHlwZSwgRGF0ZVJhbmdlVHlwZSwgJ0RhdGVSYW5nZVR5cGUnKTtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEZpbHRlclNlcnZpY2U+KFNlcnZpY2VOYW1lcy5GaWx0ZXIpO1xuICAgIHJldHVybiBzZXJ2aWNlLmFwcGx5UmVsYXRpdmVEYXRlRmlsdGVyQXN5bmModGhpcy52aXN1YWxJZCwgZmllbGROYW1lLCBvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXREYXRhU291cmNlc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuRGF0YVNvdXJjZT4+IHtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPERhdGFTb3VyY2VTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRGF0YVNvdXJjZVNlcnZpY2UpO1xuICAgIHJldHVybiBzZXJ2aWNlLmdldERhdGFTb3VyY2VzQXN5bmModGhpcy52aXN1YWxJZCkudGhlbjxBcnJheTxDb250cmFjdC5EYXRhU291cmNlPj4oKHJlc3VsdCkgPT4ge1xuICAgICAgY29uc3QgZGF0YVNjaGVtYTogRGF0YVNjaGVtYSA9IHJlc3VsdDtcbiAgICAgIGNvbnN0IHdvcmtzaGVldERhdGFTb3VyY2VJbmZvOiBXb3Jrc2hlZXREYXRhU291cmNlSW5mbyA9IGRhdGFTY2hlbWEud29ya3NoZWV0RGF0YVNjaGVtYU1hcFt0aGlzLm5hbWVdO1xuXG4gICAgICBjb25zdCBkYXRhU291cmNlczogQXJyYXk8Q29udHJhY3QuRGF0YVNvdXJjZT4gPSBbXTtcblxuICAgICAgLy8gRmlyc3QsIGFkZCB0aGUgcHJpbWFyeSBkYXRhc291cmNlLiAgQnkgY29udmVudGlvbiwgaXQgY29tZXMgZmlyc3QgaW4gdGhlIHJldHVybmVkIGFycmF5LlxuICAgICAgY29uc3QgcHJpbWFyeUlkOiBzdHJpbmcgPSB3b3Jrc2hlZXREYXRhU291cmNlSW5mby5wcmltYXJ5RGF0YVNvdXJjZTtcbiAgICAgIGRhdGFTb3VyY2VzLnB1c2godGhpcy5jcmVhdGVEYXRhU291cmNlRnJvbUluZm8oZGF0YVNjaGVtYS5kYXRhU291cmNlc1twcmltYXJ5SWRdKSk7XG5cbiAgICAgIC8vIFRoZW4sIGxvb3AgdGhyb3VnaCBhbnkgc2Vjb25kYXJ5IGRhdGEgc291cmNlcyBhbmQgYWRkIHRoZW0uXG4gICAgICBmb3IgKGNvbnN0IHNlY29uZGFyeUlkIG9mIHdvcmtzaGVldERhdGFTb3VyY2VJbmZvLnJlZmVyZW5jZWREYXRhU291cmNlTGlzdCkge1xuICAgICAgICBpZiAoc2Vjb25kYXJ5SWQgIT09IHByaW1hcnlJZCkge1xuICAgICAgICAgIGRhdGFTb3VyY2VzLnB1c2godGhpcy5jcmVhdGVEYXRhU291cmNlRnJvbUluZm8oZGF0YVNjaGVtYS5kYXRhU291cmNlc1tzZWNvbmRhcnlJZF0pKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGF0YVNvdXJjZXM7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RmlsdGVyc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuRmlsdGVyPj4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RmlsdGVyU2VydmljZT4oU2VydmljZU5hbWVzLkZpbHRlcik7XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0RmlsdGVyc0FzeW5jKHRoaXMudmlzdWFsSWQpO1xuICB9XG5cbiAgcHVibGljIGdldFNlbGVjdGVkTWFya3NBc3luYygpOiBQcm9taXNlPENvbnRyYWN0Lk1hcmtzQ29sbGVjdGlvbj4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8R2V0RGF0YVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5HZXREYXRhKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRTZWxlY3RlZE1hcmtzQXN5bmModGhpcy52aXN1YWxJZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0SGlnaGxpZ2h0ZWRNYXJrc0FzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuTWFya3NDb2xsZWN0aW9uPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIHJldHVybiBzZXJ2aWNlLmdldEhpZ2hsaWdodGVkTWFya3NBc3luYyh0aGlzLnZpc3VhbElkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTdW1tYXJ5RGF0YUFzeW5jKG9wdGlvbnM6IENvbnRyYWN0LkdldFN1bW1hcnlEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0VW5kZXJseWluZ0RhdGFBc3luYyhcbiAgICAgIHRoaXMudmlzdWFsSWQsXG4gICAgICBHZXREYXRhVHlwZS5TdW1tYXJ5LFxuICAgICAgISFvcHRpb25zLmlnbm9yZUFsaWFzZXMsXG4gICAgICAhIW9wdGlvbnMuaWdub3JlU2VsZWN0aW9uLFxuICAgICAgdHJ1ZSxcbiAgICAgIG9wdGlvbnMuY29sdW1uc1RvSW5jbHVkZUJ5SWQgfHwgW10sXG4gICAgICBvcHRpb25zLm1heFJvd3MgfHwgMCxcbiAgICAgIG9wdGlvbnMuaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gfHwgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uQWxsVmFsdWVzLFxuICAgICAgb3B0aW9ucy5hcHBseVdvcmtzaGVldEZvcm1hdHRpbmcgPz8gZmFsc2UsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTdW1tYXJ5RGF0YVJlYWRlckFzeW5jKHBhZ2VSb3dDb3VudDogbnVtYmVyLCBvcHRpb25zOiBDb250cmFjdC5HZXRTdW1tYXJ5RGF0YU9wdGlvbnMpOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZVJlYWRlcj4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8R2V0RGF0YVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5HZXREYXRhKTtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIHJldHVybiBzZXJ2aWNlLmdldFN1bW1hcnlEYXRhUmVhZGVyQXN5bmMoXG4gICAgICB0aGlzLnZpc3VhbElkLFxuICAgICAgcGFnZVJvd0NvdW50IHx8IHRoaXMuZ2V0TWF4UGFnZVJvd0xpbWl0KCksXG4gICAgICAhIW9wdGlvbnMuaWdub3JlQWxpYXNlcyxcbiAgICAgICEhb3B0aW9ucy5pZ25vcmVTZWxlY3Rpb24sXG4gICAgICB0cnVlLCAvLyBpbmNsdWRlQWxsQ29sdW1ucyAoY2FuIGJlIG92ZXJyaWRkZW4gYnkgY29sdW1uc1RvSW5jbHVkZUJ5SWQpXG4gICAgICBvcHRpb25zLmNvbHVtbnNUb0luY2x1ZGVCeUlkIHx8IFtdLFxuICAgICAgb3B0aW9ucy5pbmNsdWRlRGF0YVZhbHVlc09wdGlvbiB8fCBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbi5BbGxWYWx1ZXMsXG4gICAgICBvcHRpb25zLmFwcGx5V29ya3NoZWV0Rm9ybWF0dGluZyA/PyBmYWxzZSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdldFZpc3VhbFNwZWNpZmljYXRpb25Bc3luYygpOiBQcm9taXNlPENvbnRyYWN0LlZpc3VhbFNwZWNpZmljYXRpb24+IHtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFZpc3VhbE1vZGVsU2VydmljZT4oU2VydmljZU5hbWVzLlZpc3VhbE1vZGVsKTtcblxuICAgIHJldHVybiBzZXJ2aWNlLmdldFZpc3VhbFNwZWNpZmljYXRpb25Bc3luYyh0aGlzLnZpc3VhbElkKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRNYXJrc0NhcmRGaWVsZHNBc3luYyhcbiAgICBtYXJrc0NhcmRJbmRleDogbnVtYmVyLFxuICAgIGVuY29kaW5nVHlwZTogQ29udHJhY3QuRW5jb2RpbmdUeXBlLFxuICAgIGNvbHVtbnM6IEFycmF5PENvbnRyYWN0LkNvbHVtbj4sXG4gICAgc3RhcnRJbmRleDogbnVtYmVyLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFZpc3VhbE1vZGVsU2VydmljZT4oU2VydmljZU5hbWVzLlZpc3VhbE1vZGVsKTtcblxuICAgIHJldHVybiBzZXJ2aWNlLmFkZE1hcmtzQ2FyZEZpZWxkc0FzeW5jKHRoaXMudmlzdWFsSWQsIG1hcmtzQ2FyZEluZGV4LCBlbmNvZGluZ1R5cGUsIGNvbHVtbnMsIHN0YXJ0SW5kZXgpO1xuICB9XG5cbiAgcHVibGljIG1vdmVNYXJrc0NhcmRGaWVsZEFzeW5jKG1hcmtzQ2FyZEluZGV4OiBudW1iZXIsIGZyb21JbmRleDogbnVtYmVyLCB0b0luZGV4OiBudW1iZXIsIGZpZWxkQ291bnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8VmlzdWFsTW9kZWxTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuVmlzdWFsTW9kZWwpO1xuXG4gICAgcmV0dXJuIHNlcnZpY2UubW92ZU1hcmtzQ2FyZEZpZWxkQXN5bmModGhpcy52aXN1YWxJZCwgbWFya3NDYXJkSW5kZXgsIGZyb21JbmRleCwgdG9JbmRleCwgZmllbGRDb3VudCk7XG4gIH1cblxuICBwdWJsaWMgc3BsaWNlTWFya3NDYXJkRmllbGRzQXN5bmMoXG4gICAgbWFya3NDYXJkSW5kZXg6IG51bWJlcixcbiAgICBlbmNvZGluZ1R5cGU6IENvbnRyYWN0LkVuY29kaW5nVHlwZSxcbiAgICBzdGFydEluZGV4OiBudW1iZXIsXG4gICAgZGVsZXRlQ291bnQ6IG51bWJlcixcbiAgICBjb2x1bW5zOiBBcnJheTxDb250cmFjdC5Db2x1bW4+LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFZpc3VhbE1vZGVsU2VydmljZT4oU2VydmljZU5hbWVzLlZpc3VhbE1vZGVsKTtcblxuICAgIHJldHVybiBzZXJ2aWNlLnNwbGljZU1hcmtzQ2FyZEZpZWxkc0FzeW5jKHRoaXMudmlzdWFsSWQsIG1hcmtzQ2FyZEluZGV4LCBlbmNvZGluZ1R5cGUsIHN0YXJ0SW5kZXgsIGRlbGV0ZUNvdW50LCBjb2x1bW5zKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTdW1tYXJ5Q29sdW1uc0luZm9Bc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkNvbHVtbj4+IHtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEdldERhdGFTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuR2V0RGF0YSk7XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0U3VtbWFyeUNvbHVtbnNJbmZvQXN5bmModGhpcy52aXN1YWxJZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ0RhdGFBc3luYyhvcHRpb25zOiBDb250cmFjdC5HZXRVbmRlcmx5aW5nRGF0YU9wdGlvbnMpOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8R2V0RGF0YVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5HZXREYXRhKTtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRVbmRlcmx5aW5nRGF0YUFzeW5jKFxuICAgICAgdGhpcy52aXN1YWxJZCxcbiAgICAgIEdldERhdGFUeXBlLlVuZGVybHlpbmcsXG4gICAgICAhIW9wdGlvbnMuaWdub3JlQWxpYXNlcyxcbiAgICAgICEhb3B0aW9ucy5pZ25vcmVTZWxlY3Rpb24sXG4gICAgICAhIW9wdGlvbnMuaW5jbHVkZUFsbENvbHVtbnMsXG4gICAgICBvcHRpb25zLmNvbHVtbnNUb0luY2x1ZGVCeUlkIHx8IFtdLFxuICAgICAgb3B0aW9ucy5tYXhSb3dzIHx8IDAsXG4gICAgICBvcHRpb25zLmluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uIHx8IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLkFsbFZhbHVlcyxcbiAgICAgIG9wdGlvbnMuYXBwbHlXb3Jrc2hlZXRGb3JtYXR0aW5nID8/IGZhbHNlLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ1RhYmxlc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuTG9naWNhbFRhYmxlPj4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RGF0YVNvdXJjZVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5EYXRhU291cmNlU2VydmljZSk7XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0VW5kZXJseWluZ1RhYmxlc0FzeW5jKHRoaXMudmlzdWFsSWQpLnRoZW48QXJyYXk8Q29udHJhY3QuTG9naWNhbFRhYmxlPj4oKGxvZ2ljYWxUYWJsZUluZm9zKSA9PiB7XG4gICAgICByZXR1cm4gbG9naWNhbFRhYmxlSW5mb3MubWFwKChsb2dpY2FsVGFibGVJbmZvKSA9PiBuZXcgTG9naWNhbFRhYmxlKGxvZ2ljYWxUYWJsZUluZm8pKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmRlcmx5aW5nVGFibGVEYXRhQXN5bmMobG9naWNhbFRhYmxlSWQ6IHN0cmluZywgb3B0aW9ucz86IENvbnRyYWN0LkdldFVuZGVybHlpbmdEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIHJldHVybiBzZXJ2aWNlLmdldFVuZGVybHlpbmdUYWJsZURhdGFBc3luYyhcbiAgICAgIHRoaXMudmlzdWFsSWQsXG4gICAgICBsb2dpY2FsVGFibGVJZCxcbiAgICAgICEhb3B0aW9ucy5pZ25vcmVBbGlhc2VzLFxuICAgICAgISFvcHRpb25zLmlnbm9yZVNlbGVjdGlvbixcbiAgICAgICEhb3B0aW9ucy5pbmNsdWRlQWxsQ29sdW1ucyxcbiAgICAgIG9wdGlvbnMuY29sdW1uc1RvSW5jbHVkZUJ5SWQgfHwgW10sXG4gICAgICBvcHRpb25zLm1heFJvd3MgfHwgMCxcbiAgICAgIG9wdGlvbnMuaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gfHwgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uQWxsVmFsdWVzLFxuICAgICAgb3B0aW9ucy5hcHBseVdvcmtzaGVldEZvcm1hdHRpbmcgPz8gZmFsc2UsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmRlcmx5aW5nVGFibGVEYXRhUmVhZGVyQXN5bmMoXG4gICAgbG9naWNhbFRhYmxlSWQ6IHN0cmluZyxcbiAgICBwYWdlUm93Q291bnQ/OiBudW1iZXIsXG4gICAgb3B0aW9ucz86IENvbnRyYWN0LkdldFVuZGVybHlpbmdEYXRhT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGVSZWFkZXI+IHtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEdldERhdGFTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuR2V0RGF0YSk7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0VW5kZXJseWluZ1RhYmxlRGF0YVJlYWRlckFzeW5jKFxuICAgICAgdGhpcy52aXN1YWxJZCxcbiAgICAgIGxvZ2ljYWxUYWJsZUlkLFxuICAgICAgcGFnZVJvd0NvdW50IHx8IHRoaXMuZ2V0TWF4UGFnZVJvd0xpbWl0KCksXG4gICAgICAhIW9wdGlvbnMuaWdub3JlQWxpYXNlcyxcbiAgICAgICEhb3B0aW9ucy5pZ25vcmVTZWxlY3Rpb24sXG4gICAgICAhIW9wdGlvbnMuaW5jbHVkZUFsbENvbHVtbnMsXG4gICAgICBvcHRpb25zLmNvbHVtbnNUb0luY2x1ZGVCeUlkIHx8IFtdLFxuICAgICAgb3B0aW9ucy5pbmNsdWRlRGF0YVZhbHVlc09wdGlvbiB8fCBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbi5BbGxWYWx1ZXMsXG4gICAgICBvcHRpb25zLmFwcGx5V29ya3NoZWV0Rm9ybWF0dGluZyA/PyBmYWxzZSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGNsZWFyU2VsZWN0ZWRNYXJrc0FzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8U2VsZWN0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLlNlbGVjdGlvbik7XG4gICAgcmV0dXJuIHNlcnZpY2UuY2xlYXJTZWxlY3RlZE1hcmtzQXN5bmModGhpcy52aXN1YWxJZCk7XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0TWFya3NCeVZhbHVlQXN5bmMoc2VsZWN0aW9uczogQXJyYXk8Q29udHJhY3QuU2VsZWN0aW9uQ3JpdGVyaWE+LCBzZWxlY3Rpb25VcGRhdGVUeXBlOiBTZWxlY3Rpb25VcGRhdGVUeXBlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihzZWxlY3Rpb25zLCAnZmllbGROYW1lJyk7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUVudW1WYWx1ZTxTZWxlY3Rpb25VcGRhdGVUeXBlPihzZWxlY3Rpb25VcGRhdGVUeXBlLCBTZWxlY3Rpb25VcGRhdGVUeXBlLCAnU2VsZWN0aW9uVXBkYXRlVHlwZScpO1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8U2VsZWN0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLlNlbGVjdGlvbik7XG4gICAgcmV0dXJuIHNlcnZpY2Uuc2VsZWN0TWFya3NCeVZhbHVlQXN5bmModGhpcy52aXN1YWxJZCwgc2VsZWN0aW9ucywgc2VsZWN0aW9uVXBkYXRlVHlwZSk7XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0TWFya3NCeUlkQXN5bmMoc2VsZWN0aW9uczogQXJyYXk8Q29udHJhY3QuTWFya0luZm8+LCBzZWxlY3Rpb25VcGRhdGVUeXBlOiBTZWxlY3Rpb25VcGRhdGVUeXBlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihzZWxlY3Rpb25zLCAnZmllbGROYW1lJyk7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUVudW1WYWx1ZTxTZWxlY3Rpb25VcGRhdGVUeXBlPihzZWxlY3Rpb25VcGRhdGVUeXBlLCBTZWxlY3Rpb25VcGRhdGVUeXBlLCAnU2VsZWN0aW9uVXBkYXRlVHlwZScpO1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8U2VsZWN0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLlNlbGVjdGlvbik7XG4gICAgcmV0dXJuIHNlcnZpY2Uuc2VsZWN0TWFya3NCeUlkQXN5bmModGhpcy52aXN1YWxJZCwgc2VsZWN0aW9ucywgc2VsZWN0aW9uVXBkYXRlVHlwZSk7XG4gIH1cblxuICBwdWJsaWMgYW5ub3RhdGVNYXJrQXN5bmMobWFyazogQ29udHJhY3QuTWFya0luZm8sIGFubm90YXRpb25UZXh0OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKG1hcmssICdtYXJrJyk7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxBbm5vdGF0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLkFubm90YXRpb24pO1xuICAgIHJldHVybiBzZXJ2aWNlLmFubm90YXRlTWFya0FzeW5jKHRoaXMudmlzdWFsSWQsIG1hcmssIGFubm90YXRpb25UZXh0KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBbm5vdGF0aW9uc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuQW5ub3RhdGlvbj4+IHtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEFubm90YXRpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuQW5ub3RhdGlvbik7XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0QW5ub3RhdGlvbnNBc3luYyh0aGlzLnZpc3VhbElkKTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVBbm5vdGF0aW9uQXN5bmMoYW5ub3RhdGlvbjogQ29udHJhY3QuQW5ub3RhdGlvbikge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIoYW5ub3RhdGlvbiwgJ2Fubm90YXRpb24nKTtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEFubm90YXRpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuQW5ub3RhdGlvbik7XG4gICAgcmV0dXJuIHNlcnZpY2UucmVtb3ZlQW5ub3RhdGlvbkFzeW5jKHRoaXMudmlzdWFsSWQsIGFubm90YXRpb24pO1xuICB9XG5cbiAgcHVibGljIGFwcGVuZENvbnRleHRNZW51QXN5bmModGFyZ2V0TWVudTogQXBpTWVudVR5cGUsIGNvbmZpZzogQ29udGV4dE1lbnVPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEV4dGVybmFsQ29udGV4dE1lbnVTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRXh0ZXJuYWxDb250ZXh0TWVudSk7XG4gICAgcmV0dXJuIHNlcnZpY2UuYXBwZW5kQ29udGV4dE1lbnVBc3luYyh0aGlzLnZpc3VhbElkLndvcmtzaGVldCwgdGFyZ2V0TWVudSwgY29uZmlnKTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVDb250ZXh0TWVudUFzeW5jKHRhcmdldE1lbnU6IEFwaU1lbnVUeXBlLCBtZW51SXRlbUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEV4dGVybmFsQ29udGV4dE1lbnVTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRXh0ZXJuYWxDb250ZXh0TWVudSk7XG4gICAgcmV0dXJuIHNlcnZpY2UucmVtb3ZlQ29udGV4dE1lbnVBc3luYyh0aGlzLnZpc3VhbElkLndvcmtzaGVldCwgdGFyZ2V0TWVudSwgbWVudUl0ZW1JZCk7XG4gIH1cblxuICBwdWJsaWMgZXhlY3V0ZUNvbnRleHRNZW51QXN5bmModGFyZ2V0TWVudTogQXBpTWVudVR5cGUsIG1lbnVJdGVtSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RXh0ZXJuYWxDb250ZXh0TWVudVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5FeHRlcm5hbENvbnRleHRNZW51KTtcbiAgICByZXR1cm4gc2VydmljZS5leGVjdXRlQ29udGV4dE1lbnVBc3luYyh0aGlzLnZpc3VhbElkLndvcmtzaGVldCwgdGFyZ2V0TWVudSwgbWVudUl0ZW1JZCk7XG4gIH1cblxuICBwdWJsaWMgcmVuYW1lQ29udGV4dE1lbnVBc3luYyh0YXJnZXRNZW51OiBBcGlNZW51VHlwZSwgbWVudUhlYWRlcjogc3RyaW5nLCBtZW51RGVzY3JpcHRpb246IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RXh0ZXJuYWxDb250ZXh0TWVudVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5FeHRlcm5hbENvbnRleHRNZW51KTtcbiAgICByZXR1cm4gc2VydmljZS5yZW5hbWVDb250ZXh0TWVudUFzeW5jKHRoaXMudmlzdWFsSWQud29ya3NoZWV0LCB0YXJnZXRNZW51LCBtZW51SGVhZGVyLCBtZW51RGVzY3JpcHRpb24pO1xuICB9XG5cbiAgcHVibGljIGhvdmVyVHVwbGVBc3luYyhob3ZlcmVkVHVwbGU/OiBudW1iZXIsIHRvb2x0aXA/OiBUb29sdGlwQ29udGV4dCB8IG51bGwsIGFsbG93SG92ZXJBY3Rpb25zPzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmlzSW5zaWRlRGFzaGJvYXJkRXh0ZW5zaW9uKCkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcbiAgICAgICAgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5TaGFyZWRFcnJvckNvZGVzLkltcGxlbWVudGF0aW9uRXJyb3IsIGBob3ZlclR1cGxlQXN5bmMgaXMgbm90IHN1cHBvcnRlZCBpbiBkYXNoYm9hcmQgZXh0ZW5zaW9uc2ApLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFNlbGVjdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5TZWxlY3Rpb24pO1xuICAgIHJldHVybiBzZXJ2aWNlLmhvdmVyVHVwbGVBc3luYyh0aGlzLnZpc3VhbElkLCBob3ZlcmVkVHVwbGUsIHRvb2x0aXAsIGFsbG93SG92ZXJBY3Rpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RUdXBsZXNBc3luYyhzZWxlY3RlZFR1cGxlczogQXJyYXk8bnVtYmVyPiwgc2VsZWN0T3B0aW9uOiBDb250cmFjdC5TZWxlY3RPcHRpb25zLCB0b29sdGlwPzogVG9vbHRpcENvbnRleHQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pc0luc2lkZURhc2hib2FyZEV4dGVuc2lvbigpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXG4gICAgICAgIG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuU2hhcmVkRXJyb3JDb2Rlcy5JbXBsZW1lbnRhdGlvbkVycm9yLCBgc2VsZWN0VHVwbGVzQXN5bmMgaXMgbm90IHN1cHBvcnRlZCBpbiBkYXNoYm9hcmQgZXh0ZW5zaW9uc2ApLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFNlbGVjdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5TZWxlY3Rpb24pO1xuICAgIHJldHVybiBzZXJ2aWNlLnNlbGVjdFR1cGxlc0FzeW5jKHRoaXMudmlzdWFsSWQsIHNlbGVjdGVkVHVwbGVzLCBzZWxlY3RPcHRpb24sIHRvb2x0aXApO1xuICB9XG5cbiAgcHVibGljIGdldFRvb2x0aXBUZXh0QXN5bmModHVwbGVJZDogbnVtYmVyKTogUHJvbWlzZTxTdHJpbmc+IHtcbiAgICBpZiAodGhpcy5pc0luc2lkZURhc2hib2FyZEV4dGVuc2lvbigpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXG4gICAgICAgIG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuU2hhcmVkRXJyb3JDb2Rlcy5JbXBsZW1lbnRhdGlvbkVycm9yLCBgZ2V0VG9vbHRpcFRleHRBc3luYyBpcyBub3Qgc3VwcG9ydGVkIGluIGRhc2hib2FyZCBleHRlbnNpb25zYCksXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEFjY2Vzc2liaWxpdHlTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuQWNjZXNzaWJpbGl0eSk7XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0VG9vbHRpcFRleHRBc3luYyh0aGlzLnZpc3VhbElkLCB0dXBsZUlkKTtcbiAgfVxuXG4gIHB1YmxpYyBsZWF2ZU1hcmtOYXZpZ2F0aW9uQXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaXNJbnNpZGVEYXNoYm9hcmRFeHRlbnNpb24oKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KFxuICAgICAgICBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgICAgIENvbnRyYWN0LlNoYXJlZEVycm9yQ29kZXMuSW1wbGVtZW50YXRpb25FcnJvcixcbiAgICAgICAgICBgbGVhdmVNYXJrTmF2aWdhdGlvbkFzeW5jIGlzIG5vdCBzdXBwb3J0ZWQgaW4gZGFzaGJvYXJkIGV4dGVuc2lvbnNgLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxBY2Nlc3NpYmlsaXR5U2VydmljZT4oU2VydmljZU5hbWVzLkFjY2Vzc2liaWxpdHkpO1xuICAgIHJldHVybiBzZXJ2aWNlLmxlYXZlTWFya05hdmlnYXRpb25Bc3luYyh0aGlzLnZpc3VhbElkKTtcbiAgfVxuXG4gIHB1YmxpYyBlZGl0QWxpYXNlc0RpYWxvZ0FzeW5jKGZpZWxkTmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxWaXN1YWxNb2RlbFNlcnZpY2U+KFNlcnZpY2VOYW1lcy5WaXN1YWxNb2RlbCk7XG4gICAgcmV0dXJuIHNlcnZpY2UuZWRpdEFsaWFzZXNEaWFsb2dBc3luYyhmaWVsZE5hbWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVEYXRhU291cmNlRnJvbUluZm8oZGF0YVNvdXJjZUluZm86IERhdGFTb3VyY2VJbmZvKTogQ29udHJhY3QuRGF0YVNvdXJjZSB7XG4gICAgY29uc3QgZGF0YVNvdXJjZUltcGwgPSBuZXcgRGF0YVNvdXJjZUltcGwoZGF0YVNvdXJjZUluZm8sIHRoaXMuX3JlZ2lzdHJ5SWQpO1xuICAgIGNvbnN0IGRhdGFTb3VyY2UgPSBuZXcgRGF0YVNvdXJjZShkYXRhU291cmNlSW1wbCk7XG4gICAgZGF0YVNvdXJjZUltcGwuaW5pdGlhbGl6ZVdpdGhQdWJsaWNJbnRlcmZhY2VzKGRhdGFTb3VyY2UpO1xuICAgIHJldHVybiBkYXRhU291cmNlO1xuICB9XG5cbiAgcHJpdmF0ZSB2ZXJpZnlBY3RpdmVTaGVldCgpIHtcbiAgICBjb25zdCBpc1Jvb3RBbmRBY3RpdmVXb3Jrc2hlZXQgPSB0aGlzLmFjdGl2ZTtcbiAgICBjb25zdCBpc0luc2lkZUFjdGl2ZURhc2hib2FyZCA9IHRoaXMuaXNJbnNpZGVBY3RpdmVEYXNoYm9hcmQoKTtcbiAgICBjb25zdCBpc0luc2lkZUFjdGl2ZVN0b3J5UG9pbnQgPSB0aGlzLmlzSW5zaWRlQWN0aXZlU3RvcnlQb2ludCgpO1xuXG4gICAgaWYgKCFpc1Jvb3RBbmRBY3RpdmVXb3Jrc2hlZXQgJiYgIWlzSW5zaWRlQWN0aXZlRGFzaGJvYXJkICYmICFpc0luc2lkZUFjdGl2ZVN0b3J5UG9pbnQpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5Ob3RBY3RpdmVTaGVldCwgJ09wZXJhdGlvbiBub3QgYWxsb3dlZCBvbiBub24tYWN0aXZlIHNoZWV0Jyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpc0luc2lkZUFjdGl2ZVN0b3J5UG9pbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudFN0b3J5UG9pbnRJbXBsICYmIHRoaXMuX3BhcmVudFN0b3J5UG9pbnRJbXBsLmFjdGl2ZTtcbiAgfVxuXG4gIHByaXZhdGUgaXNJbnNpZGVBY3RpdmVEYXNoYm9hcmQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudERhc2hib2FyZEltcGwgJiYgdGhpcy5fcGFyZW50RGFzaGJvYXJkSW1wbC5hY3RpdmU7XG4gIH1cblxuICBwcml2YXRlIGlzSW5zaWRlRGFzaGJvYXJkRXh0ZW5zaW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9wYXJlbnREYXNoYm9hcmRJbXBsICE9PSBudWxsO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgTG9naWNhbFRhYmxlSW5mbyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgYSBsb2dpY2FsIHRhYmxlLlxuICogVGhpcyBkb2VzIG5vdCBmb2xsb3cgdGhlIEltcGwgcGF0dGVybiBhcyBpdCBpcyBqdXN0IGEgcHJvcGVydHkgYmFnLlxuICovXG5leHBvcnQgY2xhc3MgTG9naWNhbFRhYmxlIGltcGxlbWVudHMgQ29udHJhY3QuTG9naWNhbFRhYmxlIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2xvZ2ljYWxUYWJsZTogTG9naWNhbFRhYmxlSW5mbykge31cblxuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2xvZ2ljYWxUYWJsZS5pZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY2FwdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9sb2dpY2FsVGFibGUuY2FwdGlvbjtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVG9vbHRpcFRleHRSZXF1ZXN0LCBWaXN1YWxJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmV4cG9ydCBjbGFzcyBUb29sdGlwVGV4dFJlcXVlc3RNb2RlbCBpbXBsZW1lbnRzIFRvb2x0aXBUZXh0UmVxdWVzdCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgdmlzdWFsSWRQcmVzTW9kZWw6IFZpc3VhbElkLCBwdWJsaWMgdHVwbGVJZDogbnVtYmVyKSB7fVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IERhdGVSYW5nZVR5cGUsIEZpbHRlckRvbWFpblR5cGUsIEZpbHRlclR5cGUsIFBlcmlvZFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcy9saWIvc3JjL0V4dGVybmFsQ29udHJhY3QvU2hhcmVkL05hbWVzcGFjZXMvVGFibGVhdSc7XG5pbXBvcnQgeyBEYXRhU291cmNlU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0RhdGFTb3VyY2VTZXJ2aWNlJztcbmltcG9ydCB7IEZpbHRlclNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9GaWx0ZXJTZXJ2aWNlJztcbmltcG9ydCB7IEFwaVNlcnZpY2VSZWdpc3RyeSwgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IEVycm9ySGVscGVycyB9IGZyb20gJy4uL1V0aWxzL0Vycm9ySGVscGVycyc7XG5cbmV4cG9ydCBjbGFzcyBGaWx0ZXIgaW1wbGVtZW50cyBDb250cmFjdC5GaWx0ZXIge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIF93b3Jrc2hlZXROYW1lOiBzdHJpbmcsXG4gICAgcHJvdGVjdGVkIF9maWVsZE5hbWU6IHN0cmluZyxcbiAgICBwcm90ZWN0ZWQgX2ZpbHRlclR5cGU6IEZpbHRlclR5cGUsXG4gICAgcHJvdGVjdGVkIF9maWVsZElkOiBzdHJpbmcsXG4gICAgcHJvdGVjdGVkIF9yZWdpc3RyeUlkOiBudW1iZXIsXG4gICkge31cblxuICBwdWJsaWMgZ2V0IHdvcmtzaGVldE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0TmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmllbGROYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkTmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmllbGRJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9maWVsZElkO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWx0ZXJUeXBlKCk6IEZpbHRlclR5cGUge1xuICAgIHJldHVybiB0aGlzLl9maWx0ZXJUeXBlO1xuICB9XG5cbiAgcHVibGljIGdldEZpZWxkQXN5bmMoKTogUHJvbWlzZTxDb250cmFjdC5GaWVsZD4ge1xuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RGF0YVNvdXJjZVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5EYXRhU291cmNlU2VydmljZSk7XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0RmllbGRBc3luYyh0aGlzLl9maWVsZElkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBcHBsaWVkV29ya3NoZWV0c0FzeW5jKCk6IFByb21pc2U8QXJyYXk8c3RyaW5nPj4ge1xuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RmlsdGVyU2VydmljZT4oU2VydmljZU5hbWVzLkZpbHRlcik7XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0QXBwbGllZFdvcmtzaGVldHNBc3luYyh0aGlzLl93b3Jrc2hlZXROYW1lLCB0aGlzLl9maWVsZElkKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRBcHBsaWVkV29ya3NoZWV0c0FzeW5jKGFwcGx5VG9Xb3Jrc2hlZXRzOiBBcnJheTxzdHJpbmc+KTogUHJvbWlzZTxBcnJheTxzdHJpbmc+PiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihhcHBseVRvV29ya3NoZWV0cywgJ2FwcGx5VG9Xb3Jrc2hlZXRzJyk7XG4gICAgY29uc3QgdW5pcXVlV29ya3NoZWV0cyA9IG5ldyBTZXQoYXBwbHlUb1dvcmtzaGVldHMpO1xuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RmlsdGVyU2VydmljZT4oU2VydmljZU5hbWVzLkZpbHRlcik7XG4gICAgcmV0dXJuIHNlcnZpY2Uuc2V0QXBwbGllZFdvcmtzaGVldHNBc3luYyh0aGlzLl93b3Jrc2hlZXROYW1lLCB0aGlzLl9maWVsZE5hbWUsIHRoaXMuX2ZpZWxkSWQsIEFycmF5LmZyb20odW5pcXVlV29ya3NoZWV0cykpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDYXRlZ29yaWNhbEZpbHRlciBleHRlbmRzIEZpbHRlciBpbXBsZW1lbnRzIENvbnRyYWN0LkNhdGVnb3JpY2FsRmlsdGVyIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHdvcmtzaGVldE5hbWU6IHN0cmluZyxcbiAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICBmaWVsZElkOiBzdHJpbmcsXG4gICAgZmlsdGVyVHlwZTogRmlsdGVyVHlwZSxcbiAgICByZWdpc3RyeUlkOiBudW1iZXIsXG4gICAgcHJpdmF0ZSBfYXBwbGllZFZhbHVlczogQXJyYXk8Q29udHJhY3QuRGF0YVZhbHVlPixcbiAgICBwcml2YXRlIF9pc0V4Y2x1ZGVNb2RlOiBib29sZWFuLFxuICAgIHByaXZhdGUgX2lzQWxsU2VsZWN0ZWQ/OiBib29sZWFuLFxuICApIHtcbiAgICBzdXBlcih3b3Jrc2hlZXROYW1lLCBmaWVsZE5hbWUsIGZpbHRlclR5cGUsIGZpZWxkSWQsIHJlZ2lzdHJ5SWQpO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0FsbFNlbGVjdGVkKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9pc0FsbFNlbGVjdGVkO1xuICB9XG5cbiAgcHVibGljIGdldCBhcHBsaWVkVmFsdWVzKCk6IEFycmF5PENvbnRyYWN0LkRhdGFWYWx1ZT4ge1xuICAgIHJldHVybiB0aGlzLl9hcHBsaWVkVmFsdWVzO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0V4Y2x1ZGVNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc0V4Y2x1ZGVNb2RlO1xuICB9XG5cbiAgcHVibGljIGdldERvbWFpbkFzeW5jKGRvbWFpblR5cGU/OiBGaWx0ZXJEb21haW5UeXBlKTogUHJvbWlzZTxDb250cmFjdC5DYXRlZ29yaWNhbERvbWFpbj4ge1xuICAgIGlmICghZG9tYWluVHlwZSkge1xuICAgICAgZG9tYWluVHlwZSA9IEZpbHRlckRvbWFpblR5cGUuUmVsZXZhbnQ7XG4gICAgfVxuXG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUVudW1WYWx1ZTxGaWx0ZXJEb21haW5UeXBlPihkb21haW5UeXBlLCBGaWx0ZXJEb21haW5UeXBlLCAnRmlsdGVyRG9tYWluVHlwZScpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxGaWx0ZXJTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRmlsdGVyKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRDYXRlZ29yaWNhbERvbWFpbkFzeW5jKHRoaXMuX3dvcmtzaGVldE5hbWUsIHRoaXMuX2ZpZWxkSWQsIGRvbWFpblR5cGUpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBIaWVyYXJjaGljYWxEYXRhVmFsdWUgaW1wbGVtZW50cyBDb250cmFjdC5IaWVyYXJjaGljYWxGaWx0ZXJEYXRhVmFsdWUge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfdmFsdWU6IENvbnRyYWN0LkRhdGFWYWx1ZSwgcHJpdmF0ZSBfaGllcmFyY2hpY2FsUGF0aDogc3RyaW5nLCBwcml2YXRlIF9sZXZlbDogbnVtYmVyKSB7fVxuXG4gIHB1YmxpYyBnZXQgdmFsdWUoKTogQ29udHJhY3QuRGF0YVZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGhpZXJhcmNoaWNhbFBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5faGllcmFyY2hpY2FsUGF0aDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbGV2ZWwoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fbGV2ZWw7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEhpZXJhcmNoaWNhbExldmVsRGV0YWlsIGltcGxlbWVudHMgQ29udHJhY3QuSGllcmFyY2hpY2FsTGV2ZWxEZXRhaWwge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfbmFtZTogc3RyaW5nLCBwcml2YXRlIF9sZXZlbFNlbGVjdGlvblN0YXRlOiBIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlKSB7fVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBsZXZlbFNlbGVjdGlvblN0YXRlKCk6IEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUge1xuICAgIHJldHVybiB0aGlzLl9sZXZlbFNlbGVjdGlvblN0YXRlO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBIaWVyYXJjaGljYWxGaWx0ZXIgZXh0ZW5kcyBGaWx0ZXIgaW1wbGVtZW50cyBDb250cmFjdC5IaWVyYXJjaGljYWxGaWx0ZXIge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgd29ya3NoZWV0TmFtZTogc3RyaW5nLFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIGZpZWxkSWQ6IHN0cmluZyxcbiAgICBmaWx0ZXJUeXBlOiBGaWx0ZXJUeXBlLFxuICAgIHJlZ2lzdHJ5SWQ6IG51bWJlcixcbiAgICBwcml2YXRlIF9kaW1lbnNpb25OYW1lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBfaGllcmFyY2h5Q2FwdGlvbjogc3RyaW5nLFxuICAgIHByaXZhdGUgX251bWJlck9mTGV2ZWxzOiBudW1iZXIsXG4gICAgcHJpdmF0ZSBfbGV2ZWxEZXRhaWxzOiBBcnJheTxDb250cmFjdC5IaWVyYXJjaGljYWxMZXZlbERldGFpbD4sXG4gICAgcHJpdmF0ZSBfYXBwbGllZFZhbHVlczogQXJyYXk8Q29udHJhY3QuSGllcmFyY2hpY2FsRmlsdGVyRGF0YVZhbHVlPixcbiAgICBwcml2YXRlIF9pc0FsbFNlbGVjdGVkOiBib29sZWFuLFxuICApIHtcbiAgICBzdXBlcih3b3Jrc2hlZXROYW1lLCBmaWVsZE5hbWUsIGZpbHRlclR5cGUsIGZpZWxkSWQsIHJlZ2lzdHJ5SWQpO1xuICB9XG4gIGdldERvbWFpbkFzeW5jKGRvbWFpblR5cGU/OiBDb250cmFjdC5GaWx0ZXJEb21haW5UeXBlKTogUHJvbWlzZTxDb250cmFjdC5DYXRlZ29yaWNhbERvbWFpbj4ge1xuICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGltZW5zaW9uTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kaW1lbnNpb25OYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBoaWVyYXJjaHlDYXB0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2hpZXJhcmNoeUNhcHRpb247XG4gIH1cblxuICBwdWJsaWMgZ2V0IG51bWJlck9mTGV2ZWxzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX251bWJlck9mTGV2ZWxzO1xuICB9XG5cbiAgcHVibGljIGdldCBsZXZlbERldGFpbHMoKTogQ29udHJhY3QuSGllcmFyY2hpY2FsTGV2ZWxEZXRhaWxbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2xldmVsRGV0YWlscztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNBbGxTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNBbGxTZWxlY3RlZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYXBwbGllZFZhbHVlcygpOiBBcnJheTxDb250cmFjdC5IaWVyYXJjaGljYWxGaWx0ZXJEYXRhVmFsdWU+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBwbGllZFZhbHVlcztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmFuZ2VGaWx0ZXIgZXh0ZW5kcyBGaWx0ZXIgaW1wbGVtZW50cyBDb250cmFjdC5SYW5nZUZpbHRlciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICB3b3Jrc2hlZXROYW1lOiBzdHJpbmcsXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgZmllbGRJZDogc3RyaW5nLFxuICAgIGZpbHRlclR5cGU6IEZpbHRlclR5cGUsXG4gICAgcmVnaXN0cnlJZDogbnVtYmVyLFxuICAgIHByaXZhdGUgX21pbjogQ29udHJhY3QuRGF0YVZhbHVlLFxuICAgIHByaXZhdGUgX21heDogQ29udHJhY3QuRGF0YVZhbHVlLFxuICAgIHByaXZhdGUgX2luY2x1ZGVOdWxsVmFsdWVzOiBib29sZWFuLFxuICApIHtcbiAgICBzdXBlcih3b3Jrc2hlZXROYW1lLCBmaWVsZE5hbWUsIGZpbHRlclR5cGUsIGZpZWxkSWQsIHJlZ2lzdHJ5SWQpO1xuICB9XG5cbiAgcHVibGljIGdldCBtaW5WYWx1ZSgpOiBDb250cmFjdC5EYXRhVmFsdWUge1xuICAgIHJldHVybiB0aGlzLl9taW47XG4gIH1cblxuICBwdWJsaWMgZ2V0IG1heFZhbHVlKCk6IENvbnRyYWN0LkRhdGFWYWx1ZSB7XG4gICAgcmV0dXJuIHRoaXMuX21heDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW5jbHVkZU51bGxWYWx1ZXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2luY2x1ZGVOdWxsVmFsdWVzO1xuICB9XG5cbiAgcHVibGljIGdldERvbWFpbkFzeW5jKGRvbWFpblR5cGU/OiBGaWx0ZXJEb21haW5UeXBlKTogUHJvbWlzZTxDb250cmFjdC5SYW5nZURvbWFpbj4ge1xuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RmlsdGVyU2VydmljZT4oU2VydmljZU5hbWVzLkZpbHRlcik7XG4gICAgaWYgKCFkb21haW5UeXBlKSB7XG4gICAgICBkb21haW5UeXBlID0gRmlsdGVyRG9tYWluVHlwZS5SZWxldmFudDtcbiAgICB9XG5cbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPEZpbHRlckRvbWFpblR5cGU+KGRvbWFpblR5cGUsIEZpbHRlckRvbWFpblR5cGUsICdGaWx0ZXJEb21haW5UeXBlJyk7XG5cbiAgICByZXR1cm4gc2VydmljZS5nZXRSYW5nZURvbWFpbkFzeW5jKHRoaXMuX3dvcmtzaGVldE5hbWUsIHRoaXMuX2ZpZWxkSWQsIGRvbWFpblR5cGUpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZWxhdGl2ZURhdGVGaWx0ZXIgZXh0ZW5kcyBGaWx0ZXIgaW1wbGVtZW50cyBDb250cmFjdC5SZWxhdGl2ZURhdGVGaWx0ZXIge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgd29ya3NoZWV0TmFtZTogc3RyaW5nLFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIGZpZWxkSWQ6IHN0cmluZyxcbiAgICBmaWx0ZXJUeXBlOiBGaWx0ZXJUeXBlLFxuICAgIHJlZ2lzdHJ5SWQ6IG51bWJlcixcbiAgICBwcml2YXRlIF9hbmNob3JEYXRlOiBDb250cmFjdC5EYXRhVmFsdWUsXG4gICAgcHJpdmF0ZSBfcGVyaW9kVHlwZTogUGVyaW9kVHlwZSxcbiAgICBwcml2YXRlIF9yYW5nZVR5cGU6IERhdGVSYW5nZVR5cGUsXG4gICAgcHJpdmF0ZSBfcmFuZ2VOOiBudW1iZXIsXG4gICkge1xuICAgIHN1cGVyKHdvcmtzaGVldE5hbWUsIGZpZWxkTmFtZSwgZmlsdGVyVHlwZSwgZmllbGRJZCwgcmVnaXN0cnlJZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFuY2hvckRhdGUoKTogQ29udHJhY3QuRGF0YVZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5fYW5jaG9yRGF0ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcGVyaW9kVHlwZSgpOiBQZXJpb2RUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fcGVyaW9kVHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcmFuZ2VUeXBlKCk6IERhdGVSYW5nZVR5cGUge1xuICAgIHJldHVybiB0aGlzLl9yYW5nZVR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHJhbmdlTigpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9yYW5nZU47XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENhdGVnb3JpY2FsRG9tYWluIGltcGxlbWVudHMgQ29udHJhY3QuQ2F0ZWdvcmljYWxEb21haW4ge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfdmFsdWVzOiBBcnJheTxDb250cmFjdC5EYXRhVmFsdWU+LCBwcml2YXRlIF9kb21haW5UeXBlOiBGaWx0ZXJEb21haW5UeXBlKSB7fVxuXG4gIHB1YmxpYyBnZXQgdmFsdWVzKCk6IEFycmF5PENvbnRyYWN0LkRhdGFWYWx1ZT4ge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZXM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHR5cGUoKTogRmlsdGVyRG9tYWluVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX2RvbWFpblR5cGU7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJhbmdlRG9tYWluIGltcGxlbWVudHMgQ29udHJhY3QuUmFuZ2VEb21haW4ge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfbWluOiBDb250cmFjdC5EYXRhVmFsdWUsIHByaXZhdGUgX21heDogQ29udHJhY3QuRGF0YVZhbHVlLCBwcml2YXRlIF9kb21haW5UeXBlOiBGaWx0ZXJEb21haW5UeXBlKSB7fVxuXG4gIHB1YmxpYyBnZXQgdHlwZSgpOiBGaWx0ZXJEb21haW5UeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fZG9tYWluVHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbWluKCk6IENvbnRyYWN0LkRhdGFWYWx1ZSB7XG4gICAgcmV0dXJuIHRoaXMuX21pbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbWF4KCk6IENvbnRyYWN0LkRhdGFWYWx1ZSB7XG4gICAgcmV0dXJuIHRoaXMuX21heDtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IERhdGFUeXBlLCBNYXJrVHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmV4cG9ydCBjbGFzcyBEYXRhVGFibGUgaW1wbGVtZW50cyBDb250cmFjdC5EYXRhVGFibGUge1xuICBwcml2YXRlIF9uYW1lOiBzdHJpbmc7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX2RhdGE6IEFycmF5PEFycmF5PENvbnRyYWN0LkRhdGFWYWx1ZT4+LFxuICAgIHByaXZhdGUgX2NvbHVtbnM6IEFycmF5PENvbnRyYWN0LkNvbHVtbj4sXG4gICAgcHJpdmF0ZSBfdG90YWxSb3dDb3VudDogbnVtYmVyLFxuICAgIHByaXZhdGUgX2lzVG90YWxSb3dDb3VudExpbWl0ZWQ6IGJvb2xlYW4sXG4gICAgcHJpdmF0ZSBfaXNTdW1tYXJ5RGF0YTogYm9vbGVhbixcbiAgICBwcml2YXRlIF9tYXJrc0luZm8/OiBBcnJheTxNYXJrSW5mbz4sXG4gICkge1xuICAgIHRoaXMuX25hbWUgPSBfaXNTdW1tYXJ5RGF0YSA/ICdTdW1tYXJ5IERhdGEgVGFibGUnIDogJ1VuZGVybHlpbmcgRGF0YSBUYWJsZSc7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGF0YSgpOiBBcnJheTxBcnJheTxDb250cmFjdC5EYXRhVmFsdWU+PiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGE7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvbHVtbnMoKTogQXJyYXk8Q29udHJhY3QuQ29sdW1uPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbHVtbnM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG1hcmtzSW5mbygpOiBBcnJheTxDb250cmFjdC5NYXJrSW5mbz4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9tYXJrc0luZm87XG4gIH1cblxuICBwdWJsaWMgZ2V0IHRvdGFsUm93Q291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fdG90YWxSb3dDb3VudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNUb3RhbFJvd0NvdW50TGltaXRlZCgpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5faXNUb3RhbFJvd0NvdW50TGltaXRlZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNTdW1tYXJ5RGF0YSgpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5faXNTdW1tYXJ5RGF0YTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTWFya0luZm8gaW1wbGVtZW50cyBDb250cmFjdC5NYXJrSW5mbyB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF90eXBlOiBNYXJrVHlwZSwgcHJpdmF0ZSBfY29sb3I6IHN0cmluZywgcHJpdmF0ZSBfdHVwbGVJZD86IG51bWJlcikge31cblxuICBwdWJsaWMgZ2V0IHR5cGUoKTogTWFya1R5cGUge1xuICAgIHJldHVybiB0aGlzLl90eXBlO1xuICB9XG5cbiAgcHVibGljIGdldCBjb2xvcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jb2xvcjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdHVwbGVJZCgpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl90dXBsZUlkO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDb2x1bW4gaW1wbGVtZW50cyBDb250cmFjdC5Db2x1bW4ge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfZmllbGROYW1lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBfZmllbGRJZDogc3RyaW5nLFxuICAgIHByaXZhdGUgX2RhdGFUeXBlOiBEYXRhVHlwZSxcbiAgICBwcml2YXRlIF9pc1JlZmVyZW5jZWQ6IGJvb2xlYW4sXG4gICAgcHJpdmF0ZSBfaW5kZXg6IG51bWJlcixcbiAgKSB7fVxuXG4gIHB1YmxpYyBnZXQgZmllbGROYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkTmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmllbGRJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9maWVsZElkO1xuICB9XG5cbiAgcHVibGljIGdldCBkYXRhVHlwZSgpOiBEYXRhVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFUeXBlO1xuICB9XG5cbiAgcHVibGljIGdldCBpc1JlZmVyZW5jZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzUmVmZXJlbmNlZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW5kZXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5faW5kZXg7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIERhdGFWYWx1ZSBpbXBsZW1lbnRzIENvbnRyYWN0LkRhdGFWYWx1ZSB7XG4gIC8qIHRzbGludDpkaXNhYmxlOm5vLWFueSAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfdmFsdWU6IGFueSxcbiAgICBwcml2YXRlIF9uYXRpdmVWYWx1ZTogYW55LFxuICAgIHByaXZhdGUgX2Zvcm1hdHRlZFZhbHVlPzogc3RyaW5nLFxuICAgIHByaXZhdGUgX2FsaWFzVmFsdWU/OiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBfaGFzQWxpYXM/OiBib29sZWFuLFxuICApIHt9XG5cbiAgcHVibGljIGdldCB2YWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbmF0aXZlVmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5fbmF0aXZlVmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZvcm1hdHRlZFZhbHVlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1hdHRlZFZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCBhbGlhc1ZhbHVlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2FsaWFzVmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGhhc0FsaWFzKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9oYXNBbGlhcztcbiAgfVxuICAvKiB0c2xpbnQ6ZW5hYmxlOm5vLWFueSAqL1xufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEdldERhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvR2V0RGF0YVNlcnZpY2UnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5LCBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgRXJyb3JIZWxwZXJzIH0gZnJvbSAnLi4vVXRpbHMvRXJyb3JIZWxwZXJzJztcblxuZXhwb3J0IGNsYXNzIERhdGFUYWJsZVJlYWRlciBpbXBsZW1lbnRzIENvbnRyYWN0LkRhdGFUYWJsZVJlYWRlciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgX2lkOiBzdHJpbmcsIHByb3RlY3RlZCBfdG90YWxSb3dDb3VudDogbnVtYmVyLCBwcm90ZWN0ZWQgX3BhZ2VSb3dDb3VudCwgcHJpdmF0ZSBfcmVnaXN0cnlJZDogbnVtYmVyKSB7XG4gICAgdGhpcy5fcGFnZUNvdW50ID0gTWF0aC5jZWlsKF90b3RhbFJvd0NvdW50IC8gX3BhZ2VSb3dDb3VudCk7XG4gIH1cbiAgcHJvdGVjdGVkIF9wYWdlQ291bnQ6IG51bWJlcjtcblxuICBwdWJsaWMgZ2V0IHRvdGFsUm93Q291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fdG90YWxSb3dDb3VudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcGFnZUNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3BhZ2VDb3VudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRQYWdlQXN5bmMocGFnZU51bWJlcjogbnVtYmVyKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UmFuZ2UocGFnZU51bWJlciwgMCwgdGhpcy5fcGFnZUNvdW50KTtcbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEdldERhdGFTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuR2V0RGF0YSk7XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0UGFnZUFzeW5jKHRoaXMuX2lkLCBwYWdlTnVtYmVyLCB0aGlzLl9wYWdlUm93Q291bnQpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldEFsbFBhZ2VzQXN5bmMobWF4Um93cz86IG51bWJlcik6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgY29uc3QgZmlyc3RQYWdlOiBDb250cmFjdC5EYXRhVGFibGUgPSBhd2FpdCB0aGlzLmdldFBhZ2VBc3luYygwKTtcbiAgICBtYXhSb3dzID0gbWF4Um93cyB8fCB0aGlzLnRvdGFsUm93Q291bnQ7XG4gICAgY29uc3Qgcm93c1JlcXVlc3RlZCA9IE1hdGgubWluKG1heFJvd3MsIHRoaXMudG90YWxSb3dDb3VudCk7XG4gICAgY29uc3QgcGFnZXNSZXF1ZXN0ZWQgPSBNYXRoLmNlaWwocm93c1JlcXVlc3RlZCAvIHRoaXMuX3BhZ2VSb3dDb3VudCk7XG5cbiAgICAvLyBGZXRjaCB1cCB0byA0MDAgcGFnZXMsIHdpdGggYSBkZWZhdWx0IG9mIDEwLDAwMCBwYWdlUm93Q291bnQgdGhhdCBnaXZlcyB1cyA0LDAwMCwwMDAgcm93c1xuICAgIGNvbnN0IHBhZ2VzVG9GZXRjaCA9IE1hdGgubWluKHBhZ2VzUmVxdWVzdGVkLCA0MDApO1xuICAgIGNvbnN0IGlzRGF0YUxpbWl0ZWQgPSBwYWdlc1RvRmV0Y2ggPCBwYWdlc1JlcXVlc3RlZDtcbiAgICBsZXQgcmVtYWluaW5nRGF0YTogQXJyYXk8QXJyYXk8QXJyYXk8Q29udHJhY3QuRGF0YVZhbHVlPj4+ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBwYWdlc1RvRmV0Y2g7IGkrKykge1xuICAgICAgY29uc3QgcGFnZSA9IGF3YWl0IHRoaXMuZ2V0UGFnZUFzeW5jKGkpO1xuICAgICAgcmVtYWluaW5nRGF0YS5wdXNoKHBhZ2UuZGF0YSk7XG4gICAgfVxuXG4gICAgbGV0IGZ1bGxEYXRhID0gZmlyc3RQYWdlLmRhdGEuY29uY2F0KC4uLnJlbWFpbmluZ0RhdGEpO1xuICAgIC8vIFRoaXMgc2xpY2VzIHRoZSBhcnJheSBvbmx5IGlmIG1heFJvd3MgaGFzIGJlZW4gc2V0IGFuZCBpcyBsZXNzIHRoYW4gdG90YWxSb3dDb3VudFxuICAgIGZ1bGxEYXRhLmxlbmd0aCA9IHJvd3NSZXF1ZXN0ZWQ7XG5cbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogZmlyc3RQYWdlLm5hbWUsXG4gICAgICBkYXRhOiBmdWxsRGF0YSxcbiAgICAgIGNvbHVtbnM6IGZpcnN0UGFnZS5jb2x1bW5zLFxuICAgICAgdG90YWxSb3dDb3VudDogaXNEYXRhTGltaXRlZCA/IHBhZ2VzVG9GZXRjaCAqIHRoaXMuX3BhZ2VSb3dDb3VudCA6IHJvd3NSZXF1ZXN0ZWQsXG4gICAgICBpc1RvdGFsUm93Q291bnRMaW1pdGVkOiBpc0RhdGFMaW1pdGVkLFxuICAgICAgaXNTdW1tYXJ5RGF0YTogZmlyc3RQYWdlLmlzU3VtbWFyeURhdGEsXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyByZWxlYXNlQXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIHJldHVybiBzZXJ2aWNlLnJlbGVhc2VBc3luYyh0aGlzLl9pZCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFRvb2x0aXBDb250ZXh0IH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEhvdmVyVHVwbGVJbnRlcmFjdGlvbiwgU2VsZWN0T3B0aW9ucywgU2VsZWN0VHVwbGVzSW50ZXJhY3Rpb24sIFZpc3VhbElkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuLyoqXG4gKiBTZWxlY3Rpb24gTW9kZWwuXG4gKi9cbmV4cG9ydCBjbGFzcyBTZWxlY3Rpb25Nb2RlbCB7XG4gIHB1YmxpYyBxdWFsaWZpZWRGaWVsZENhcHRpb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBWYWx1ZSBiYXNlZCBzZWxlY3Rpb24gbW9kZWwuIE1lYW50IGZvciBoaWVyYXJjaGljYWwsIHJhbmdlIGFuZCBjYXRlZ29yaWNhbCBzZWxlY3Rpb25zLlxuICovXG5leHBvcnQgY2xhc3MgVmFsdWVTZWxlY3Rpb25Nb2RlbCBleHRlbmRzIFNlbGVjdGlvbk1vZGVsIHtcbiAgcHVibGljIHNlbGVjdFZhbHVlczogQXJyYXk8c3RyaW5nPiA9IFtdO1xufVxuXG4vKipcbiAqIEhpZXJhcmNoaWNhbCB2YWx1ZSBzZWxlY3Rpb24gbW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIEhpZXJhcmNoaWNhbFNlbGVjdGlvbk1vZGVsIGV4dGVuZHMgVmFsdWVTZWxlY3Rpb25Nb2RlbCB7fVxuXG4vKipcbiAqIFJhbmdlIGJhc2VkIHZhbHVlIHNlbGVjdGlvbiBtb2RlbFxuICovXG5leHBvcnQgY2xhc3MgUmFuZ2VTZWxlY3Rpb25Nb2RlbCBleHRlbmRzIFNlbGVjdGlvbk1vZGVsIHtcbiAgcHVibGljIG1pblZhbHVlOiBzdHJpbmc7XG4gIHB1YmxpYyBtYXhWYWx1ZTogc3RyaW5nO1xuICBwdWJsaWMgaW5jbHVkZWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBEaW1lbnNpb24gdmFsdWUgc2VsZWN0aW9uIG1vZGVsXG4gKi9cbmV4cG9ydCBjbGFzcyBEaW1lbnNpb25TZWxlY3Rpb25Nb2RlbCBleHRlbmRzIFZhbHVlU2VsZWN0aW9uTW9kZWwge31cbi8qKlxuICogVHVwbGUgYmFzZWQgc2VsZWN0aW9uIG1vZGVsXG4gKi9cbmV4cG9ydCBjbGFzcyBUdXBsZVNlbGVjdGlvbk1vZGVsIHtcbiAgcHVibGljIHNlbGVjdGlvblR5cGU6IHN0cmluZztcbiAgcHVibGljIG9iamVjdElkczogQXJyYXk8c3RyaW5nPiA9IFtdO1xufVxuXG4vKipcbiAqIENvbnRhaW5lciBjbGFzcyB0byBwb3B1bGF0ZSBhbGwgdGhlIHNlbGVjdGlvbiBtb2RlbHMgd2hlbiBwYXJzaW5nIGlucHV0XG4gKi9cbmV4cG9ydCBjbGFzcyBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIge1xuICBwdWJsaWMgaGllck1vZGVsQXJyOiBBcnJheTxIaWVyYXJjaGljYWxTZWxlY3Rpb25Nb2RlbD4gPSBbXTtcbiAgcHVibGljIGRpbU1vZGVsQXJyOiBBcnJheTxEaW1lbnNpb25TZWxlY3Rpb25Nb2RlbD4gPSBbXTtcbiAgcHVibGljIHF1YW50TW9kZWxBcnI6IEFycmF5PFJhbmdlU2VsZWN0aW9uTW9kZWw+ID0gW107XG4gIHB1YmxpYyBzZWxlY3Rpb246IFR1cGxlU2VsZWN0aW9uTW9kZWw7XG59XG5cbmV4cG9ydCBjbGFzcyBTZWxlY3RUdXBsZXNJbnRlcmFjdGlvbk1vZGVsIGltcGxlbWVudHMgU2VsZWN0VHVwbGVzSW50ZXJhY3Rpb24ge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHZpc3VhbElkUHJlc01vZGVsOiBWaXN1YWxJZCxcbiAgICBwdWJsaWMgdHVwbGVJZHM6IEFycmF5PG51bWJlcj4gPSBbXSxcbiAgICBwdWJsaWMgc2VsZWN0T3B0aW9uczogU2VsZWN0T3B0aW9ucyxcbiAgICBwdWJsaWMgdG9vbHRpcENvbnRleHQ/OiBUb29sdGlwQ29udGV4dCxcbiAgKSB7fVxufVxuXG5leHBvcnQgY2xhc3MgSG92ZXJUdXBsZUludGVyYWN0aW9uTW9kZWwgaW1wbGVtZW50cyBIb3ZlclR1cGxlSW50ZXJhY3Rpb24ge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHZpc3VhbElkUHJlc01vZGVsOiBWaXN1YWxJZCxcbiAgICBwdWJsaWMgdHVwbGVJZDogbnVtYmVyLFxuICAgIHB1YmxpYyB0b29sdGlwQ29udGV4dD86IFRvb2x0aXBDb250ZXh0IHwgbnVsbCxcbiAgICBwdWJsaWMgYWxsb3dIb3ZlckFjdGlvbnM/OiBib29sZWFuLFxuICApIHt9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuXG5leHBvcnQgY2xhc3MgUG9pbnQgaW1wbGVtZW50cyBDb250cmFjdC5Qb2ludCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF94OiBudW1iZXIsIHByaXZhdGUgX3k6IG51bWJlcikge31cblxuICBwdWJsaWMgZ2V0IHgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5feDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgeSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl95O1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVmlzdWFsSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQXBpU2VydmljZSB9IGZyb20gJy4vU2VydmljZVJlZ2lzdHJ5JztcblxuLyoqXG4gKiBEZWZpbmVzIHdoaWNoIHR5cGUgb2YgZ2V0RGF0YSBjYWxsIHRvIG1ha2UuXG4gKi9cbmV4cG9ydCBlbnVtIEdldERhdGFUeXBlIHtcbiAgU3VtbWFyeSA9ICdzdW1tYXJ5JyxcbiAgVW5kZXJseWluZyA9ICd1bmRlcmx5aW5nJyxcbn1cblxuLyoqXG4gKiBTZXJ2aWNlIGZvciBpbXBsZW1lbnRpbmcgdGhlIGxvZ2ljIGZvciB2YXJpb3VzIGdldERhdGEgY2FsbHNcbiAqXG4gKiBAaW50ZXJmYWNlIEdldERhdGFTZXJ2aWNlXG4gKiBAZXh0ZW5kcyB7QXBpU2VydmljZX1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXREYXRhU2VydmljZSBleHRlbmRzIEFwaVNlcnZpY2Uge1xuICAvKipcbiAgICogR2V0cyB0aGUgbGltaXQgb2Ygcm93cyBmb3IgZ2V0VW5kZXJseWluZ0RhdGFBc3luY1xuICAgKi9cbiAgZ2V0TWF4Um93TGltaXQoKTogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB1bmRlcmx5aW5nIGRhdGEgZm9yIGEgcGFydGljdWxhciB2aXN1YWxcbiAgICpcbiAgICogQHBhcmFtIHtWaXN1YWxJZH0gdmlzdWFsSWQgIFRoZSB2aXN1YWwgaWRcbiAgICogQHBhcmFtIHtHZXREYXRhVHlwZX0gZ2V0VHlwZSAgVGhlIHR5cGUgb2YgZ2V0RGF0YSBjYWxsIHRvIG1ha2VcbiAgICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVBbGlhc2VzICBXaGV0aGVyIG9yIG5vdCBhbGlhc2VzIHNob3VsZCBiZSBpZ25vcmVkXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaWdub3JlU2VsZWN0aW9uICBXaGV0aGVyIG9yIG5vdCBzZWxlY3Rpb24gc2hvdWxkIGJlIGlnbm9yZWRcbiAgICogQHBhcmFtIHtib29sZWFufSBpbmNsdWRlQWxsQ29sdW1ucyAgU2hvdWxkIGFsbCBjb2x1bW5zIGJlIGluY2x1ZGVkXG4gICAqIEBwYXJhbSB7QXJyYXl9IGNvbHVtbnNUb0luY2x1ZGVCeUlkIE92ZXJyaWRlcyBpbmNsdWRlQWxsQ29sdW1ucywgbGlzdHMgdGhlIGNvbHVtbnMgdG8gaW5jbHVkZS4gRW1wdHkgbWVhbnMgYWxsIGNvbHVtbnMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBtYXhSb3dzICBNYXhpbXVtIG51bWJlciBvZiByb3dzIHRvIHJldHVyblxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+fSAgRGF0YSB0YWJsZSB3aXRoIHRoZSByZXF1ZXN0ZWQgZGF0YVxuICAgKi9cbiAgZ2V0VW5kZXJseWluZ0RhdGFBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgZ2V0VHlwZTogR2V0RGF0YVR5cGUsXG4gICAgaWdub3JlQWxpYXNlczogYm9vbGVhbixcbiAgICBpZ25vcmVTZWxlY3Rpb246IGJvb2xlYW4sXG4gICAgaW5jbHVkZUFsbENvbHVtbnM6IGJvb2xlYW4sXG4gICAgY29sdW1uc1RvSW5jbHVkZUJ5SWQ6IEFycmF5PHN0cmluZz4sXG4gICAgbWF4Um93czogbnVtYmVyLFxuICAgIGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uOiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgICBhcHBseVdvcmtzaGVldEZvcm1hdHRpbmc6IGJvb2xlYW4sXG4gICk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPjtcblxuICAvKipcbiAgICogQHBhcmFtIHtWaXN1YWxJZH0gdmlzdWFsSWQgIFRoZSB2aXN1YWwgaWRcbiAgICogQHBhcmFtIHtudW1iZXJ9IHBhZ2VSb3dDb3VudCBUaGUgbnVtYmVyIG9mIHJvd3MgcGVyIHBhZ2UuIFRoZSBkZWZhdWx0IGFuZCBtYXhpbXVtIGlzIDEwLDAwMCByb3dzLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZUFsaWFzZXMgIFdoZXRoZXIgYWxpYXMgdmFsdWVzIHNob3VsZCBiZSBpZ25vcmVkIGluIHRoZSByZXR1cm5lZCBkYXRhXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaWdub3JlU2VsZWN0aW9uICBXaGV0aGVyIHNlbGVjdGlvbnMgaW4gdGhpcyB2aXogc2hvdWxkIGJlIGlnbm9yZWQgaW4gdGhlIHJldHVybmVkIGRhdGFcbiAgICogQHBhcmFtIHtib29sZWFufSBpbmNsdWRlQWxsQ29sdW1ucyAgU2hvdWxkIGFsbCBjb2x1bW5zIGJlIGluY2x1ZGVkXG4gICAqIEBwYXJhbSB7QXJyYXl9IGNvbHVtbnNUb0luY2x1ZGVCeUlkIE92ZXJyaWRlcyBpbmNsdWRlQWxsQ29sdW1ucywgbGlzdHMgdGhlIGNvbHVtbnMgdG8gaW5jbHVkZS4gRW1wdHkgbWVhbnMgYWxsIGNvbHVtbnNcbiAgICogQHJldHVybnMge1Byb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlUmVhZGVyPn0gIERhdGEgdGFibGUgcmVhZGVyIHRvIGFjY2VzcyB0aGUgdW5kZXJseWluZyBkYXRhXG4gICAqL1xuICBnZXRTdW1tYXJ5RGF0YVJlYWRlckFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBwYWdlUm93Q291bnQ6IG51bWJlcixcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIGlnbm9yZVNlbGVjdGlvbjogYm9vbGVhbixcbiAgICBpbmNsdWRlQWxsQ29sdW1uczogYm9vbGVhbixcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogQXJyYXk8c3RyaW5nPixcbiAgICBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gICAgYXBwbHlXb3Jrc2hlZXRGb3JtYXR0aW5nOiBib29sZWFuLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZVJlYWRlcj47XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBtYXJrcyBmb3IgYSBnaXZlbiB2aXN1YWxcbiAgICpcbiAgICogQHBhcmFtIHtWaXN1YWxJZH0gdmlzdWFsSWQgIFRoZSB2aXN1YWwgaWRcbiAgICogQHJldHVybnMge1Byb21pc2U8QWN0aXZlTWFya3M+fSAgQ29sbGVjdGlvbiBvZiBkYXRhIHRhYmxlcyB3aXRoIHRoZSBhY3RpdmUgbWFya3NcbiAgICovXG4gIGdldFNlbGVjdGVkTWFya3NBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQpOiBQcm9taXNlPENvbnRyYWN0Lk1hcmtzQ29sbGVjdGlvbj47XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGN1cnJlbnRseSBoaWdobGlnaHRlZCBtYXJrcyBmb3IgYSBnaXZlbiB2aXN1YWxcbiAgICpcbiAgICogQHBhcmFtIHtWaXN1YWxJZH0gdmlzdWFsSWQgIFRoZSB2aXN1YWwgaWRcbiAgICogQHJldHVybnMge1Byb21pc2U8QWN0aXZlTWFya3M+fSAgQ29sbGVjdGlvbiBvZiBkYXRhIHRhYmxlcyB3aXRoIHRoZSBhY3RpdmUgbWFya3NcbiAgICovXG4gIGdldEhpZ2hsaWdodGVkTWFya3NBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQpOiBQcm9taXNlPENvbnRyYWN0Lk1hcmtzQ29sbGVjdGlvbj47XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhc291cmNlSWQgIFRoZSBpZCBvZiB0aGUgZGF0YXNvdXJjZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZUFsaWFzZXMgIFdoZXRoZXIgYWxpYXMgdmFsdWVzIHNob3VsZCBiZSBpZ25vcmVkIGluIHRoZSByZXR1cm5lZCBkYXRhXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBtYXhSb3dzIFRoZSBtYXhpbXVtIG51bWJlciBvZiByb3dzIHRvIHJldHJpZXZlXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gY29sdW1uc1RvSW5jbHVkZSBDb2x1bW5zIHdoaWNoIHNob3VsZCBiZSByZXR1cm5lZCBzcGVjaWZpZWQgYnkgY2FwdGlvbi4gRW1wdHkgbWVhbnMgYWxsIGNvbHVtbnNcbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBjb2x1bW5zVG9JbmNsdWRlQnlJZCBDb2x1bW5zIHdoaWNoIHNob3VsZCBiZSByZXR1cm5lZCBzcGVjaWZpZWQgYnkgbmFtZS4gRW1wdHkgbWVhbnMgYWxsIGNvbHVtbnNcbiAgICogQHJldHVybnMge1Byb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPn0gIERhdGEgdGFibGUgd2l0aCB0aGUgcmVxdWVzdGVkIGRhdGFcbiAgICovXG4gIGdldERhdGFTb3VyY2VEYXRhQXN5bmMoXG4gICAgZGF0YXNvdXJjZUlkOiBzdHJpbmcsXG4gICAgaWdub3JlQWxpYXNlczogYm9vbGVhbixcbiAgICBtYXhSb3dzOiBudW1iZXIsXG4gICAgY29sdW1uc1RvSW5jbHVkZTogQXJyYXk8c3RyaW5nPixcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogQXJyYXk8c3RyaW5nPixcbiAgICBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gICk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPjtcblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGFzb3VyY2VJZCAgVGhlIGlkIG9mIHRoZSBkYXRhc291cmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsb2dpY2FsVGFibGVJZCAgVGhlIGlkIG9mIHRoZSBsb2djaWFsIHRhYmxlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaWdub3JlQWxpYXNlcyAgV2hldGhlciBhbGlhcyB2YWx1ZXMgc2hvdWxkIGJlIGlnbm9yZWQgaW4gdGhlIHJldHVybmVkIGRhdGFcbiAgICogQHBhcmFtIHtudW1iZXJ9IG1heFJvd3MgVGhlIG1heGltdW0gbnVtYmVyIG9mIHJvd3MgdG8gcmV0cmlldmVcbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBjb2x1bW5zVG9JbmNsdWRlIENvbHVtbnMgd2hpY2ggc2hvdWxkIGJlIHJldHVybmVkIHNwZWNpZmllZCBieSBjYXB0aW9uLiBFbXB0eSBtZWFucyBhbGwgY29sdW1uc1xuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGNvbHVtbnNUb0luY2x1ZGVCeUlkIENvbHVtbnMgd2hpY2ggc2hvdWxkIGJlIHJldHVybmVkIHNwZWNpZmllZCBieSBuYW1lLiBFbXB0eSBtZWFucyBhbGwgY29sdW1uc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+fSAgRGF0YSB0YWJsZSB3aXRoIHRoZSByZXF1ZXN0ZWQgZGF0YVxuICAgKi9cbiAgZ2V0TG9naWNhbFRhYmxlRGF0YUFzeW5jKFxuICAgIGRhdGFzb3VyY2VJZDogc3RyaW5nLFxuICAgIGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsXG4gICAgaWdub3JlQWxpYXNlczogYm9vbGVhbixcbiAgICBtYXhSb3dzOiBudW1iZXIsXG4gICAgY29sdW1uc1RvSW5jbHVkZTogQXJyYXk8c3RyaW5nPixcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogQXJyYXk8c3RyaW5nPixcbiAgICBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gICk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPjtcblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGFzb3VyY2VJZCAgVGhlIGlkIG9mIHRoZSBkYXRhc291cmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsb2dpY2FsVGFibGVJZCAgVGhlIGlkIG9mIHRoZSBsb2djaWFsIHRhYmxlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBwYWdlUm93Q291bnQgVGhlIG51bWJlciBvZiByb3dzIHBlciBwYWdlLiBUaGUgZGVmYXVsdCBhbmQgbWF4aW11bSBpcyAxMCwwMDAgcm93cy5cbiAgICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVBbGlhc2VzICBXaGV0aGVyIGFsaWFzIHZhbHVlcyBzaG91bGQgYmUgaWdub3JlZCBpbiB0aGUgcmV0dXJuZWQgZGF0YVxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGNvbHVtbnNUb0luY2x1ZGVCeUlkIENvbHVtbnMgd2hpY2ggc2hvdWxkIGJlIHJldHVybmVkIHNwZWNpZmllZCBieSBuYW1lLiBFbXB0eSBtZWFucyBhbGwgY29sdW1uc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+fSAgRGF0YSB0YWJsZSB3aXRoIHRoZSByZXF1ZXN0ZWQgZGF0YVxuICAgKi9cbiAgZ2V0TG9naWNhbFRhYmxlRGF0YVJlYWRlckFzeW5jKFxuICAgIGRhdGFzb3VyY2VJZDogc3RyaW5nLFxuICAgIGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsXG4gICAgcGFnZVJvd0NvdW50OiBudW1iZXIsXG4gICAgaWdub3JlQWxpYXNlczogYm9vbGVhbixcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogQXJyYXk8c3RyaW5nPixcbiAgICBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gICk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlUmVhZGVyPjtcblxuICAvKipcbiAgICogQHBhcmFtIHtWaXN1YWxJZH0gdmlzdWFsSWQgIFRoZSB2aXN1YWwgaWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxvZ2ljYWxUYWJsZUlkICBUaGUgaWQgb2YgdGhlIGxvZ2NpYWwgdGFibGVcbiAgICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVBbGlhc2VzICBXaGV0aGVyIGFsaWFzIHZhbHVlcyBzaG91bGQgYmUgaWdub3JlZCBpbiB0aGUgcmV0dXJuZWQgZGF0YVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZVNlbGVjdGlvbiAgV2hldGhlciBzZWxlY3Rpb25zIGluIHRoaXMgdml6IHNob3VsZCBiZSBpZ25vcmVkIGluIHRoZSByZXR1cm5lZCBkYXRhXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5jbHVkZUFsbENvbHVtbnMgIFdoZXRoZXIgdG8gaW5jbHVkZSBhbGwgY29sdW1ucyBvciBvbmx5IHRoZSByZWZlcmVuY2VkIGNvbHVtbnNcbiAgICogQHBhcmFtIHtBcnJheX0gY29sdW1uc1RvSW5jbHVkZUJ5SWQgT3ZlcnJpZGVzIGluY2x1ZGVBbGxDb2x1bW5zLCBsaXN0cyB0aGUgY29sdW1ucyB0byBpbmNsdWRlLiBFbXB0eSBtZWFucyBhbGwgY29sdW1ucy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IG1heFJvd3MgVGhlIG1heGltdW0gbnVtYmVyIG9mIHJvd3MgdG8gcmV0cmlldmVcbiAgICogQHJldHVybnMge1Byb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPn0gIERhdGEgdGFibGUgd2l0aCB0aGUgcmVxdWVzdGVkIGRhdGFcbiAgICovXG4gIGdldFVuZGVybHlpbmdUYWJsZURhdGFBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgbG9naWNhbFRhYmxlSWQ6IHN0cmluZyxcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIGlnbm9yZVNlbGVjdGlvbjogYm9vbGVhbixcbiAgICBpbmNsdWRlQWxsQ29sdW1uczogYm9vbGVhbixcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogQXJyYXk8c3RyaW5nPixcbiAgICBtYXhSb3dzOiBudW1iZXIsXG4gICAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb246IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICAgIGFwcGx5V29ya3NoZWV0Rm9ybWF0dGluZzogYm9vbGVhbixcbiAgKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1Zpc3VhbElkfSB2aXN1YWxJZCAgVGhlIHZpc3VhbCBpZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbG9naWNhbFRhYmxlSWQgIFRoZSBpZCBvZiB0aGUgbG9nY2lhbCB0YWJsZVxuICAgKiBAcGFyYW0ge251bWJlcn0gcGFnZVJvd0NvdW50IFRoZSBudW1iZXIgb2Ygcm93cyBwZXIgcGFnZS4gVGhlIGRlZmF1bHQgYW5kIG1heGltdW0gaXMgMTAsMDAwIHJvd3MuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaWdub3JlQWxpYXNlcyAgV2hldGhlciBhbGlhcyB2YWx1ZXMgc2hvdWxkIGJlIGlnbm9yZWQgaW4gdGhlIHJldHVybmVkIGRhdGFcbiAgICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVTZWxlY3Rpb24gIFdoZXRoZXIgc2VsZWN0aW9ucyBpbiB0aGlzIHZpeiBzaG91bGQgYmUgaWdub3JlZCBpbiB0aGUgcmV0dXJuZWQgZGF0YVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGluY2x1ZGVBbGxDb2x1bW5zICBXaGV0aGVyIHRvIGluY2x1ZGUgYWxsIGNvbHVtbnMgb3Igb25seSB0aGUgcmVmZXJlbmNlZCBjb2x1bW5zXG4gICAqIEBwYXJhbSB7QXJyYXl9IGNvbHVtbnNUb0luY2x1ZGVCeUlkIE92ZXJyaWRlcyBpbmNsdWRlQWxsQ29sdW1ucywgbGlzdHMgdGhlIGNvbHVtbnMgdG8gaW5jbHVkZS4gRW1wdHkgbWVhbnMgYWxsIGNvbHVtbnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT59ICBEYXRhIHRhYmxlIHdpdGggdGhlIHJlcXVlc3RlZCBkYXRhXG4gICAqL1xuICBnZXRVbmRlcmx5aW5nVGFibGVEYXRhUmVhZGVyQXN5bmMoXG4gICAgdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsXG4gICAgcGFnZVJvd0NvdW50OiBudW1iZXIsXG4gICAgaWdub3JlQWxpYXNlczogYm9vbGVhbixcbiAgICBpZ25vcmVTZWxlY3Rpb246IGJvb2xlYW4sXG4gICAgaW5jbHVkZUFsbENvbHVtbnM6IGJvb2xlYW4sXG4gICAgY29sdW1uc1RvSW5jbHVkZUJ5SWQ6IEFycmF5PHN0cmluZz4sXG4gICAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb246IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICAgIGFwcGx5V29ya3NoZWV0Rm9ybWF0dGluZyxcbiAgKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGVSZWFkZXI+O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1Zpc3VhbElkfSB2aXN1YWxJZCAgVGhlIHZpc3VhbCBpZFxuICAgKi9cbiAgZ2V0U3VtbWFyeUNvbHVtbnNJbmZvQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5Db2x1bW4+PjtcblxuICAvKipcbiAgICogQHBhcmFtIHRhYmxlSWQgICAgIFRoZSB0YWJsZSBpZCB1c2VkIHRvIGZldGNoIGRhdGEuXG4gICAqIEBwYXJhbSBwYWdlTnVtYmVyICBUaGUgcGFnZSBudW1iZXIgKHplcm8tYmFzZWQpLlxuICAgKiBAcGFyYW0gcGFnZVNpemUgICAgVGhlIHBhZ2Ugc2l6ZSBvZiB0aGUgb3duaW5nIERhdGFUYWJsZVJlYWRlclxuICAgKiBAcmV0dXJucyAgICAgICAgICAgQSBEYXRhVGFibGUgY29udGFpbmluZyB0aGUgcmVxdWVzdGVkIHBhZ2UuIFRoZSBudW1iZXIgb2Ygcm93cyByZXR1cm5lZFxuICAgKiAgICAgICAgICAgICAgICAgICAgY2FuIGJlIGxlc3MgdGhhbiByZXF1ZXN0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgZGF0YS5cbiAgICovXG4gIGdldFBhZ2VBc3luYyh0YWJsZUlkOiBzdHJpbmcsIHBhZ2VOdW1iZXI6IG51bWJlciwgcGFnZVNpemU6IG51bWJlcik6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPjtcblxuICAvKipcbiAgICogQHBhcmFtIHRhYmxlSWQgICAgIFRoZSB0YWJsZSBpZCB1c2VkIHRvIGZldGNoIGRhdGEuXG4gICAqL1xuICByZWxlYXNlQXN5bmModGFibGVJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcbn1cbiIsImltcG9ydCB7IEludGVybmFsQXBpRGlzcGF0Y2hlciB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBBcGlTZXJ2aWNlUmVnaXN0cnkgfSBmcm9tICcuL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBBY2Nlc3NpYmlsaXR5U2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvQWNjZXNzaWJpbGl0eVNlcnZpY2VJbXBsJztcbmltcG9ydCB7IEFuaW1hdGlvblNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL0FuaW1hdGlvblNlcnZpY2VJbXBsJztcbmltcG9ydCB7IEFubm90YXRpb25TZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9Bbm5vdGF0aW9uU2VydmljZUltcGwnO1xuaW1wb3J0IHsgRGF0YVNvdXJjZVNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL0RhdGFTb3VyY2VTZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBFeHBvcnRTZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9FeHBvcnRTZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBFeHRlcm5hbENvbnRleHRNZW51U2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvRXh0ZXJuYWxDb250ZXh0TWVudVNlcnZpY2VJbXBsJztcbmltcG9ydCB7IEZpbHRlclNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL0ZpbHRlclNlcnZpY2VJbXBsJztcbmltcG9ydCB7IEdldERhdGFTZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9HZXREYXRhU2VydmljZUltcGwnO1xuaW1wb3J0IHsgTm90aWZpY2F0aW9uU2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvTm90aWZpY2F0aW9uU2VydmljZUltcGwnO1xuaW1wb3J0IHsgUGFyYW1ldGVyc1NlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL1BhcmFtZXRlcnNTZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBTZWxlY3Rpb25TZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9TZWxlY3Rpb25TZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBTaXplU2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvU2l6ZVNlcnZpY2VJbXBsJztcbmltcG9ydCB7IFZpc3VhbE1vZGVsU2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvVmlzdWFsTW9kZWxTZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBWaXpTZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9WaXpTZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBab25lU2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvWm9uZVNlcnZpY2VJbXBsJztcblxuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyQWxsU2hhcmVkU2VydmljZXMoZGlzcGF0Y2hlcjogSW50ZXJuYWxBcGlEaXNwYXRjaGVyLCByZWdpc3RyeUlkOiBudW1iZXIpOiB2b2lkIHtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChyZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IEFuaW1hdGlvblNlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQpKTtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChyZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IERhdGFTb3VyY2VTZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCByZWdpc3RyeUlkKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBFeHBvcnRTZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCByZWdpc3RyeUlkKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBHZXREYXRhU2VydmljZUltcGwoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCkpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgRmlsdGVyU2VydmljZUltcGwoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCkpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgTm90aWZpY2F0aW9uU2VydmljZUltcGwoZGlzcGF0Y2hlcikpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgUGFyYW1ldGVyc1NlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQpKTtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChyZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IFNlbGVjdGlvblNlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQpKTtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChyZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IEFubm90YXRpb25TZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCByZWdpc3RyeUlkKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBab25lU2VydmljZUltcGwoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCkpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgU2l6ZVNlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQpKTtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChyZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IFZpc3VhbE1vZGVsU2VydmljZUltcGwoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCkpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgVml6U2VydmljZUltcGwoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCkpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgRXh0ZXJuYWxDb250ZXh0TWVudVNlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQpKTtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChyZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCByZWdpc3RyeUlkKSk7XG59XG4iLCJpbXBvcnQgeyBFcnJvckNvZGVzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uL1RhYmxlYXVFcnJvcic7XG5cbi8qKlxuICogQmFzZSBpbnRlcmZhY2UgZm9yIGFuIGFwaSBzZXJ2aWNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBpU2VydmljZSB7XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBuYW1lIGZvciB0aGlzIHNlcnZpY2UuXG4gICAqL1xuICByZWFkb25seSBzZXJ2aWNlTmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbGxlY3Rpb24gb2Ygc2VydmljZSBuYW1lIHdoaWNoIHdpbGwgYmUgcmVnaXN0ZXJlZCBpbiB0aGUgYXBpLXNoYXJlZCBwcm9qZWN0XG4gKi9cbmV4cG9ydCBjb25zdCBlbnVtIFNlcnZpY2VOYW1lcyB7XG4gIEFjY2Vzc2liaWxpdHkgPSAnYWNjZXNzaWJpbGl0eScsXG4gIEF1dGhlbnRpY2F0aW9uID0gJ2F1dGhlbnRpY2F0aW9uJyxcbiAgQ2xpZW50SW5mbyA9ICdjbGllbnQtaW5mby1zZXJ2aWNlJyxcbiAgRGF0YVNvdXJjZVNlcnZpY2UgPSAnZGF0YS1zb3VyY2Utc2VydmljZScsXG4gIEdldERhdGEgPSAnZ2V0LWRhdGEtc2VydmljZScsXG4gIEZpbHRlciA9ICdmaWx0ZXItc2VydmljZScsXG4gIE5vdGlmaWNhdGlvbiA9ICdub3RpZmljYXRpb24tc2VydmljZScsXG4gIFBhcmFtZXRlcnMgPSAncGFyYW1ldGVycy1zZXJ2aWNlJyxcbiAgU2VsZWN0aW9uID0gJ3NlbGVjdGlvbi1zZXJ2aWNlJyxcbiAgQW5ub3RhdGlvbiA9ICdhbm5vdGF0aW9uLXNlcnZpY2UnLFxuICBab25lID0gJ3pvbmUtc2VydmljZScsXG4gIEFuaW1hdGlvbiA9ICdhbmltYXRpb24tc2VydmljZScsXG4gIFZpeiA9ICd2aXotc2VydmljZScsXG4gIEV4dGVybmFsQ29udGV4dE1lbnUgPSAnZXh0ZXJuYWwtY29udGV4dC1tZW51LXNlcnZpY2UnLFxuICBJbml0aWFsaXphdGlvbiA9ICdpbml0aWFsaXphdGlvbi1zZXJ2aWNlJyxcbiAgU3RvcnlBY3RpdmF0aW9uID0gJ3N0b3J5LWFjdGl2YXRpb24tc2VydmljZScsXG4gIFNpemUgPSAnc2l6ZS1zZXJ2aWNlJyxcbiAgRXhwb3J0ID0gJ2V4cG9ydC1zZXJ2aWNlJyxcbiAgVmlzdWFsTW9kZWwgPSAndmlzdWFsLW1vZGVsLXNlcnZpY2UnLFxufVxuXG4vKipcbiAqIERvIHNvbWUgZ2xvYmFsIGRlY2xhcmF0aW9ucyBzbyB3ZSBjYW4gY3JlYXRlIGEgc2luZ2xldG9uIG9uIHRoZSB3aW5kb3cgb2JqZWN0XG4gKi9cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgX190YWJsZWF1QXBpU2VydmljZVJlZ2lzdHJ5OiB7IFtyZWdpc3RyeUlkOiBudW1iZXJdOiBTZXJ2aWNlUmVnaXN0cnkgfTtcbiAgfVxufVxuXG5pZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeSA9IHdpbmRvdy5fX3RhYmxlYXVBcGlTZXJ2aWNlUmVnaXN0cnkgfHwge307XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZVJlZ2lzdHJ5IHtcbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIG5ldyBzZXJ2aWNlIGludG8gdGhlIHNlcnZpY2UgcmVnaXN0cnkuIEFueSBleGlzdGluZyBvbmUgd2lsbFxuICAgKiBiZSBvdmVyd3JpdHRlbi4gdGhlIHNlcnZpY2UgaXMgcmVnaXN0ZXJlZCB1bmRlciBzZXJ2aWNlLnNlcnZpY2VOYW1lXG4gICAqXG4gICAqIEBwYXJhbSB7QXBpU2VydmljZX0gc2VydmljZSBUaGUgc2Vydml2ZSB0byByZWdpc3RlclxuICAgKi9cbiAgcmVnaXN0ZXJTZXJ2aWNlKHNlcnZpY2U6IEFwaVNlcnZpY2UpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIGdpdmVuIHNlcnZpY2UgZnJvbSB0aGUgcmVnaXN0cnkuIElmIHRoZXJlIGlzIG5vdCBhXG4gICAqIHNlcnZpY2UgcmVnaXN0ZXJlZCB1bmRlciB0aGF0IG5hbWUsIHRocm93cyBhbmQgZXJyb3JcbiAgICpcbiAgICogQHRlbXBsYXRlIFQgVGhlIHR5cGUgb2YgdGhlIHNlcnZpY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlcnZpY2VOYW1lIFRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlLlxuICAgKiBAcmV0dXJucyB7VH0gVGhlIHJlcXVlc3RlZCBzZXJ2aWNlXG4gICAqL1xuICBnZXRTZXJ2aWNlPFQgZXh0ZW5kcyBBcGlTZXJ2aWNlPihzZXJ2aWNlTmFtZTogc3RyaW5nKTogVDtcbn1cblxuY2xhc3MgU2VydmljZVJlZ2lzdHJ5SW1wbCBpbXBsZW1lbnRzIFNlcnZpY2VSZWdpc3RyeSB7XG4gIHByaXZhdGUgX3NlcnZpY2VzOiB7IFtzZXJ2aWNlTmFtZTogc3RyaW5nXTogQXBpU2VydmljZSB9O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLl9zZXJ2aWNlcyA9IHt9O1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyU2VydmljZShzZXJ2aWNlOiBBcGlTZXJ2aWNlKTogdm9pZCB7XG4gICAgdGhpcy5fc2VydmljZXNbc2VydmljZS5zZXJ2aWNlTmFtZV0gPSBzZXJ2aWNlO1xuICB9XG5cbiAgcHVibGljIGdldFNlcnZpY2U8VCBleHRlbmRzIEFwaVNlcnZpY2U+KHNlcnZpY2VOYW1lOiBzdHJpbmcpOiBUIHtcbiAgICBpZiAoIXRoaXMuX3NlcnZpY2VzLmhhc093blByb3BlcnR5KHNlcnZpY2VOYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludGVybmFsRXJyb3IsIGBTZXJ2aWNlIG5vdCByZWdpc3RlcmVkOiAke3NlcnZpY2VOYW1lfWApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9zZXJ2aWNlc1tzZXJ2aWNlTmFtZV0gYXMgVDtcbiAgfVxufVxuXG4vKipcbiAqIFN0YXRpYyBjbGFzcyB1c2VkIGZvciBnZXR0aW5nIGFjY2VzcyB0byB0aGUgc2luZ2xlIGluc3RhbmNlXG4gKiBvZiB0aGUgQXBpU2VydmljZVJlZ2lzdHJ5IGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVnaXN0cnlJZC5cbiAqXG4gKiBFeHRlbnNpb25zIGJ5IGRlc2lnbiBkb24ndCBuZWVkIHRvIHN0b3JlL2FjY2VzcyBtdWx0aXBsZSBzZXJ2aWNlIHJlZ2lzdHJpZXMuIFRoZWlyIHNpbmdsZSBpbnN0YW5jZSBvZiBTZXJ2aWNlUmVnaXN0cnkgaXNcbiAqIHN0b3JlZC9hY2Nlc3Mgd2l0aCByZWdpc3RyeUlkID0gMC5cbiAqXG4gKiBXaGVyZWFzIEVtYmVkZGluZyBuZWVkcyB0byBiZSBhd2FyZSBvZiB3aGljaCBTZXJ2aWNlUmVnaXN0cnkgdG8gdXNlIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIHZpenplcyBlbWJlZGRlZC5cbiAqIEFuIGV4YW1wbGUgb2YgaG93IHdpbmRvdy5fX3RhYmxlYXVBcGlTZXJ2aWNlUmVnaXN0cnkgd2lsbCBsb29rIHdoZW4gdGhlcmUgYXJlIHR3byB2aXp6ZXM6IHsgMCA6IFNlcnZpY2VSZWdpc3RyeSwgMSA6IFNlcnZpY2VSZWdpc3RyeX1cbiAqIHdoZXJlIHJlZ2lzdHJ5IElEIG9mIDAgJiAxIHJlZmVycyB0byB2aXoncyBpbnRlcm5hbCBpZGVudGlmaWVyICh3aGljaCBpcyBnZW5lcmF0ZWQgYnkgVml6TWFuYWdlcikuXG4gKi9cbmV4cG9ydCBjbGFzcyBBcGlTZXJ2aWNlUmVnaXN0cnkge1xuICAvKipcbiAgICogR2V0cyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBTZXJ2aWNlUmVnaXN0cnlcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0KHJlZ2lzdHJ5SWQ6IG51bWJlcik6IFNlcnZpY2VSZWdpc3RyeSB7XG4gICAgaWYgKCF3aW5kb3cuX190YWJsZWF1QXBpU2VydmljZVJlZ2lzdHJ5IHx8ICF3aW5kb3cuX190YWJsZWF1QXBpU2VydmljZVJlZ2lzdHJ5W3JlZ2lzdHJ5SWRdKSB7XG4gICAgICBBcGlTZXJ2aWNlUmVnaXN0cnkuc2V0SW5zdGFuY2UocmVnaXN0cnlJZCwgbmV3IFNlcnZpY2VSZWdpc3RyeUltcGwoKSk7XG4gICAgfVxuXG4gICAgaWYgKCF3aW5kb3cuX190YWJsZWF1QXBpU2VydmljZVJlZ2lzdHJ5W3JlZ2lzdHJ5SWRdKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ1NlcnZpY2UgcmVnaXN0cnkgZmFpbGVkJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHdpbmRvdy5fX3RhYmxlYXVBcGlTZXJ2aWNlUmVnaXN0cnlbcmVnaXN0cnlJZF07XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIG1ldGhvZCB0aGF0IHNldHMgdGhlIHNlcnZpY2UgcmVnaXN0cnkgaW5zdGFuY2UgZm9yIHRoZSBjb3JyZXNwb25kaW5nIHJlZ2lzdHJ5SWQuIENhbiBiZSB1c2VkIGJ5IHVuaXQgdGVzdHNcbiAgICpcbiAgICogQHBhcmFtIHtTZXJ2aWNlUmVnaXN0cnl9IHNlcnZpY2VSZWdpc3RyeSBUaGUgbmV3IHJlZ2lzdHJ5XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHNldEluc3RhbmNlKHJlZ2lzdHJ5SWQ6IG51bWJlciwgc2VydmljZVJlZ2lzdHJ5OiBTZXJ2aWNlUmVnaXN0cnkpOiB2b2lkIHtcbiAgICBpZiAoIXdpbmRvdy5fX3RhYmxlYXVBcGlTZXJ2aWNlUmVnaXN0cnkpIHtcbiAgICAgIHdpbmRvdy5fX3RhYmxlYXVBcGlTZXJ2aWNlUmVnaXN0cnkgPSB7fTtcbiAgICB9XG4gICAgd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeVtyZWdpc3RyeUlkXSA9IHNlcnZpY2VSZWdpc3RyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPbmx5IHVzZWQgYnkgdW5pdCB0ZXN0c1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjbGVhclJlZ2lzdHJ5KCk6IHZvaWQge1xuICAgIHdpbmRvdy5fX3RhYmxlYXVBcGlTZXJ2aWNlUmVnaXN0cnkgPSB7fTtcbiAgfVxuXG4gIC8vIFByaXZhdGUgdG8gYXZvaWQgYW55b25lIGNvbnN0cnVjdGluZyB0aGlzXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxufVxuIiwiaW1wb3J0IHsgRXhlY3V0ZVBhcmFtZXRlcnMsIFBhcmFtZXRlcklkLCBWZXJiSWQsIFZpc3VhbElkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRvb2x0aXBUZXh0UmVxdWVzdE1vZGVsIH0gZnJvbSAnLi4vLi4vTW9kZWxzL0FjY2Vzc2liaWxpdHlNb2RlbHMnO1xuaW1wb3J0IHsgQWNjZXNzaWJpbGl0eVNlcnZpY2UgfSBmcm9tICcuLi9BY2Nlc3NpYmlsaXR5U2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuXG5leHBvcnQgY2xhc3MgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgQWNjZXNzaWJpbGl0eVNlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5BY2Nlc3NpYmlsaXR5O1xuICB9XG5cbiAgcHVibGljIGdldFRvb2x0aXBUZXh0QXN5bmModmlzdWFsSWQ6IFZpc3VhbElkLCB0dXBsZUlkOiBudW1iZXIpOiBQcm9taXNlPFN0cmluZz4ge1xuICAgIGxldCB0b29sdGlwVGV4dFJlcXVlc3QgPSBuZXcgVG9vbHRpcFRleHRSZXF1ZXN0TW9kZWwodmlzdWFsSWQsIHR1cGxlSWQpO1xuXG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldFRvb2x0aXBUZXh0QXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlRvb2x0aXBUZXh0UmVxdWVzdF06IHRvb2x0aXBUZXh0UmVxdWVzdCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0VG9vbHRpcFRleHQsIHBhcmFtZXRlcnMpLnRoZW48U3RyaW5nPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybiByZXNwb25zZS5yZXN1bHQgYXMgU3RyaW5nO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGxlYXZlTWFya05hdmlnYXRpb25Bc3luYyh2aXN1YWxJZDogVmlzdWFsSWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnbGVhdmVNYXJrTmF2aWdhdGlvbkFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5SYWlzZUxlYXZlTWFya05hdk5vdGlmaWNhdGlvbiwgcGFyYW1ldGVycykudGhlbjx2b2lkPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgUmVwbGF5U3BlZWRUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFBhcmFtZXRlcklkLCBWZXJiSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzIGFzIEV4dGVybmFsRW51bUNvbnZlcnRlciB9IGZyb20gJy4uLy4uL0VudW1NYXBwaW5ncy9FeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MnO1xuaW1wb3J0IHsgRXJyb3JIZWxwZXJzIH0gZnJvbSAnLi4vLi4vVXRpbHMvRXJyb3JIZWxwZXJzJztcbmltcG9ydCB7IEFuaW1hdGlvblNlcnZpY2UgfSBmcm9tICcuLi9BbmltYXRpb25TZXJ2aWNlJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBBbmltYXRpb25TZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIEFuaW1hdGlvblNlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5BbmltYXRpb247XG4gIH1cblxuICBwdWJsaWMgcmVwbGF5QXN5bmMocmVwbGF5U3BlZWQ6IFJlcGxheVNwZWVkVHlwZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuUmVwbGF5U3BlZWRdOiAxLjAsXG4gICAgfTtcblxuICAgIEVycm9ySGVscGVycy52ZXJpZnlFbnVtVmFsdWU8UmVwbGF5U3BlZWRUeXBlPihyZXBsYXlTcGVlZCwgUmVwbGF5U3BlZWRUeXBlLCAnUmVwbGF5U3BlZWRUeXBlJyk7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5SZXBsYXlTcGVlZF0gPSBFeHRlcm5hbEVudW1Db252ZXJ0ZXIuc2V0UmVwbGF5U3BlZWRUeXBlLmNvbnZlcnQocmVwbGF5U3BlZWQpO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuUmVwbGF5QW5pbWF0aW9uLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQW5ub3RhdGVFbnVtLCBBbm5vdGF0aW9uLCBFeGVjdXRlUGFyYW1ldGVycywgUGFyYW1ldGVySWQsIFZlcmJJZCwgVmlzdWFsSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzIH0gZnJvbSAnLi4vLi4vRW51bU1hcHBpbmdzL0ludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyc7XG5pbXBvcnQgeyBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIsIFR1cGxlU2VsZWN0aW9uTW9kZWwgfSBmcm9tICcuLi8uLi9Nb2RlbHMvU2VsZWN0aW9uTW9kZWxzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uLy4uL1RhYmxlYXVFcnJvcic7XG5pbXBvcnQgeyBBbm5vdGF0aW9uU2VydmljZSB9IGZyb20gJy4uL0Fubm90YXRpb25TZXJ2aWNlJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBBbm5vdGF0aW9uU2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBBbm5vdGF0aW9uU2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLkFubm90YXRpb247XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIGFubm90YXRlIGEgbWFyayBvbiB0aGUgZ2l2ZW4gd29ya3NoZWV0LlxuICAgKlxuICAgKiBAcGFyYW0gdmlzdWFsSWRcbiAgICogQHBhcmFtIG1hcmtcbiAgICogQHBhcmFtIGFubm90YXRpb25UZXh0XG4gICAqL1xuICBwdWJsaWMgYW5ub3RhdGVNYXJrQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkLCBtYXJrOiBDb250cmFjdC5NYXJrSW5mbywgYW5ub3RhdGlvblRleHQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyOiBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIgPSB0aGlzLnBhcnNlTWFya1NlbGVjdGlvbklkcyhbbWFya10pO1xuICAgIGNvbnN0IGR1bW15VGFyZ2V0UG9pbnQgPSB7IHg6IDAsIHk6IDAgfTtcbiAgICBjb25zdCBmb3JtYXR0ZWRUZXh0ID0gYDxmb3JtYXR0ZWQtdGV4dD48cnVuPiR7YW5ub3RhdGlvblRleHR9PC9ydW4+PC9mb3JtYXR0ZWQtdGV4dD5gO1xuXG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2Fubm90YXRlTWFya0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkLFxuICAgICAgW1BhcmFtZXRlcklkLkFubm90YXRlRW51bV06IEFubm90YXRlRW51bS5NYXJrLFxuICAgICAgW1BhcmFtZXRlcklkLlRhcmdldFBvaW50XTogZHVtbXlUYXJnZXRQb2ludCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TZWxlY3Rpb25MaXN0XTogW3NlbGVjdGlvbk1vZGVsQ29udGFpbmVyLnNlbGVjdGlvbl0sXG4gICAgICBbUGFyYW1ldGVySWQuRm9ybWF0dGVkVGV4dF06IGZvcm1hdHRlZFRleHQsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5DcmVhdGVBbm5vdGF0aW9uLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgLy8gRXhwZWN0aW5nIGFuIGVtcHR5IG1vZGVsIGFuZCBoZW5jZSB0aGUgdm9pZCByZXNwb25zZS5cbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gcmV0cmlldmUgYW5ub3RhdGlvbnMgZm9yIHRoZSBnaXZlbiB3b3Jrc2hlZXQuXG4gICAqXG4gICAqIEBwYXJhbSB2aXN1YWxJZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBcnJheTxBbm5vdGF0aW9uPj59XG4gICAqL1xuICBwdWJsaWMgZ2V0QW5ub3RhdGlvbnNBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkFubm90YXRpb24+PiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldEFubm90YXRpb25zQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRBbm5vdGF0aW9ucywgcGFyYW1ldGVycykudGhlbjxBcnJheTxDb250cmFjdC5Bbm5vdGF0aW9uPj4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBhbm5vdGF0aW9uc0xpc3QgPSByZXNwb25zZS5yZXN1bHQgYXMgQXJyYXk8QW5ub3RhdGlvbj47XG4gICAgICByZXR1cm4gdGhpcy5hbm5vdGF0aW9uRmlsdGVyTWFwKGFubm90YXRpb25zTGlzdCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIHJlbW92ZSBhbiBhbm5vdGF0aW9uIGZyb20gYSBnaXZlbiB3b3Jrc2hlZXQuXG4gICAqXG4gICAqIEBwYXJhbSB2aXN1YWxJZFxuICAgKiBAcGFyYW0gYW5ub3RhdGlvblxuICAgKi9cbiAgcHVibGljIHJlbW92ZUFubm90YXRpb25Bc3luYyh2aXN1YWxJZDogVmlzdWFsSWQsIGFubm90YXRpb246IENvbnRyYWN0LkFubm90YXRpb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lcjogU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyID0gdGhpcy5wYXJzZUFubm90YXRpb25TZWxlY3Rpb25JZHMoW2Fubm90YXRpb25dKTtcblxuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdyZW1vdmVBbm5vdGF0aW9uQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQsXG4gICAgICBbUGFyYW1ldGVySWQuU2VsZWN0aW9uTGlzdF06IFtzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5zZWxlY3Rpb25dLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuUmVtb3ZlQW5ub3RhdGlvbiwgcGFyYW1ldGVycykudGhlbjx2b2lkPigocmVzcG9uc2UpID0+IHtcbiAgICAgIC8vIEV4cGVjdGluZyBhbiBlbXB0eSBtb2RlbCBhbmQgaGVuY2UgdGhlIHZvaWQgcmVzcG9uc2UuXG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIHByZXBhcmUgdGhlIHByZXMgbW9kZWxzIGZvciBzZWxlY3Rpb24gYnkgTWFya3NJbmZvXG4gICAqIEBwYXJhbSBtYXJrc1xuICAgKi9cbiAgcHJpdmF0ZSBwYXJzZU1hcmtTZWxlY3Rpb25JZHMobWFya3M6IEFycmF5PENvbnRyYWN0Lk1hcmtJbmZvPik6IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lciB7XG4gICAgY29uc3QgaWRzOiBBcnJheTxzdHJpbmc+ID0gW107XG4gICAgY29uc3Qgc2VsZWN0aW9uTW9kZWxDb250YWluZXI6IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lciA9IG5ldyBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIoKTtcbiAgICBtYXJrcy5mb3JFYWNoKChtYXJrKSA9PiB7XG4gICAgICBjb25zdCB0dXBsZUlkOiBudW1iZXIgfCB1bmRlZmluZWQgPSBtYXJrLnR1cGxlSWQ7XG4gICAgICBpZiAodHVwbGVJZCAhPT0gdW5kZWZpbmVkICYmIHR1cGxlSWQgIT09IG51bGwgJiYgdHVwbGVJZCA+IDApIHtcbiAgICAgICAgaWRzLnB1c2godHVwbGVJZC50b1N0cmluZygpKTsgLy8gY29sbGVjdCB0aGUgdHVwbGUgaWRzXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ2ludmFsaWQgdHVwbGVJZCcpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChpZHMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAvLyB0dXBsZSBpZHMgYmFzZWQgc2VsZWN0aW9uXG4gICAgICBjb25zdCB0dXBsZVNlbGVjdGlvbk1vZGVsOiBUdXBsZVNlbGVjdGlvbk1vZGVsID0gbmV3IFR1cGxlU2VsZWN0aW9uTW9kZWwoKTtcbiAgICAgIHR1cGxlU2VsZWN0aW9uTW9kZWwuc2VsZWN0aW9uVHlwZSA9ICd0dXBsZXMnO1xuICAgICAgdHVwbGVTZWxlY3Rpb25Nb2RlbC5vYmplY3RJZHMgPSBpZHM7XG4gICAgICBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5zZWxlY3Rpb24gPSB0dXBsZVNlbGVjdGlvbk1vZGVsO1xuICAgIH1cbiAgICByZXR1cm4gc2VsZWN0aW9uTW9kZWxDb250YWluZXI7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIHByZXBhcmUgdGhlIHByZXMgbW9kZWxzIGZvciBzZWxlY3Rpb24gYnkgTWFya0Fubm90YXRpb25JbmZvXG4gICAqIEBwYXJhbSBtYXJrc1xuICAgKi9cbiAgcHJpdmF0ZSBwYXJzZUFubm90YXRpb25TZWxlY3Rpb25JZHMoYW5ub3RhdGlvbnM6IEFycmF5PENvbnRyYWN0LkFubm90YXRpb24+KTogU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyIHtcbiAgICBjb25zdCBpZHM6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgICBjb25zdCBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lcjogU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyID0gbmV3IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lcigpO1xuICAgIGFubm90YXRpb25zLmZvckVhY2goKGFubm90YXRpb24pID0+IHtcbiAgICAgIGNvbnN0IGFubm90YXRpb25JZDogbnVtYmVyIHwgdW5kZWZpbmVkID0gYW5ub3RhdGlvbi5hbm5vdGF0aW9uSWQ7XG4gICAgICBpZiAoYW5ub3RhdGlvbklkICE9PSB1bmRlZmluZWQgJiYgYW5ub3RhdGlvbklkICE9PSBudWxsICYmIGFubm90YXRpb25JZCA+PSAwKSB7XG4gICAgICAgIGlkcy5wdXNoKGFubm90YXRpb25JZC50b1N0cmluZygpKTsgLy8gY29sbGVjdCB0aGUgYW5ub3RhdGlvbiBpZHNcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnaW52YWxpZCBhbm5vdGF0aW9uSWQnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoaWRzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgLy8gYW5ub3RhdGlvbiBpZHMgYmFzZWQgc2VsZWN0aW9uXG4gICAgICBjb25zdCB0dXBsZVNlbGVjdGlvbk1vZGVsOiBUdXBsZVNlbGVjdGlvbk1vZGVsID0gbmV3IFR1cGxlU2VsZWN0aW9uTW9kZWwoKTtcbiAgICAgIHR1cGxlU2VsZWN0aW9uTW9kZWwuc2VsZWN0aW9uVHlwZSA9ICdhbm5vdGF0aW9ucyc7XG4gICAgICB0dXBsZVNlbGVjdGlvbk1vZGVsLm9iamVjdElkcyA9IGlkcztcbiAgICAgIHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLnNlbGVjdGlvbiA9IHR1cGxlU2VsZWN0aW9uTW9kZWw7XG4gICAgfVxuICAgIHJldHVybiBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gbWFwIEFubm90YXRpb24gdG8gTWFya0Fubm90YXRpb25JbmZvXG4gICAqIEBwYXJhbSBhbm5vdGF0aW9uXG4gICAqIEByZXR1cm5zIHtBbm5vdGF0aW9ufVxuICAgKi9cbiAgcHJpdmF0ZSBtYXBBbm5vdGF0aW9uKGFubm90YXRpb246IEFubm90YXRpb24pOiBDb250cmFjdC5Bbm5vdGF0aW9uIHtcbiAgICByZXR1cm4ge1xuICAgICAgYW5ub3RhdGlvbkhUTUw6IGFubm90YXRpb24uYW5ub3RhdGlvblRleHQsXG4gICAgICBhbm5vdGF0aW9uSWQ6IGFubm90YXRpb24uYW5ub3RhdGlvbklkLFxuICAgICAgYW5ub3RhdGlvblRleHQ6IGFubm90YXRpb24uYW5ub3RhdGlvblBsYWluVGV4dCxcbiAgICAgIGFubm90YXRpb25UeXBlOiBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MuYW5ub3RhdGlvblR5cGUuY29udmVydChhbm5vdGF0aW9uLmFubm90YXRlRW51bSksXG4gICAgICB0dXBsZUlkOiBhbm5vdGF0aW9uLnR1cGxlSWQhLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVyIHRoZSBBbm5vdGF0aW9ucyB0byBNYXJrIEFubm90YXRpb25zLCBhbmQgbWFwIHRoZW0gdG8gTWFya0Fubm90YXRpb25JbmZvXG4gICAqIEBwYXJhbSBhbm5vdGF0aW9uc1xuICAgKiBAcmV0dXJucyB7QXJyYXk8QW5ub3RhdGlvbj59XG4gICAqL1xuICBwcml2YXRlIGFubm90YXRpb25GaWx0ZXJNYXAoYW5ub3RhdGlvbnM6IEFycmF5PEFubm90YXRpb24+KTogQXJyYXk8Q29udHJhY3QuQW5ub3RhdGlvbj4ge1xuICAgIGNvbnN0IGFubm90YXRpb25JbmZvcyA9IGFubm90YXRpb25zLm1hcCgoYW5ub3RhdGlvbikgPT4gdGhpcy5tYXBBbm5vdGF0aW9uKGFubm90YXRpb24pKTtcblxuICAgIHJldHVybiBhbm5vdGF0aW9uSW5mb3M7XG4gIH1cbn1cbiIsImltcG9ydCB7IEVtYmVkZGluZ0Jvb3RzdHJhcEluZm8sIEV4ZWN1dGVQYXJhbWV0ZXJzLCBQYXJhbWV0ZXJJZCwgVmVyYklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IENsaWVudEluZm9TZXJ2aWNlIH0gZnJvbSAnLi4vQ2xpZW50SW5mb1NlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vU2VydmljZUltcGxCYXNlJztcblxuZXhwb3J0IGNsYXNzIENsaWVudEluZm9TZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIENsaWVudEluZm9TZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTZXJ2aWNlTmFtZXMuQ2xpZW50SW5mbztcbiAgfVxuXG4gIHB1YmxpYyBnZXRDbGllbnRJbmZvQXN5bmMoKTogUHJvbWlzZTxFbWJlZGRpbmdCb290c3RyYXBJbmZvPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5HZXRFbWJlZGRpbmdDbGllbnRJbmZvO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRDbGllbnRJbmZvQXN5bmMnLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48RW1iZWRkaW5nQm9vdHN0cmFwSW5mbz4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBjbGllbnRJbmZvID0gcmVzcG9uc2UucmVzdWx0IGFzIEVtYmVkZGluZ0Jvb3RzdHJhcEluZm87XG4gICAgICByZXR1cm4gY2xpZW50SW5mbztcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEVycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0ICogYXMgSW50ZXJuYWxDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQ29ubmVjdGlvbkRlc2NyaXB0aW9uU3VtbWFyeSxcbiAgRGF0YVNjaGVtYSxcbiAgRXhlY3V0ZVBhcmFtZXRlcnMsXG4gIEludGVybmFsQXBpRGlzcGF0Y2hlcixcbiAgTG9naWNhbFRhYmxlSW5mbyxcbiAgUGFyYW1ldGVySWQsXG4gIFRhYmxlSW5mbyxcbiAgVGFibGVJbmZvcyxcbiAgVmVyYklkLFxuICBWaXN1YWxJZCxcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IERhdGFTb3VyY2UgfSBmcm9tICcuLi8uLi9EYXRhU291cmNlJztcbmltcG9ydCB7IEZpZWxkIH0gZnJvbSAnLi4vLi4vRmllbGQnO1xuaW1wb3J0IHsgRGF0YVNvdXJjZUltcGwgfSBmcm9tICcuLi8uLi9JbXBsL0RhdGFTb3VyY2VJbXBsJztcbmltcG9ydCB7IEZpZWxkSW1wbCB9IGZyb20gJy4uLy4uL0ltcGwvRmllbGRJbXBsJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uLy4uL1RhYmxlYXVFcnJvcic7XG5pbXBvcnQgeyBEYXRhU291cmNlU2VydmljZSB9IGZyb20gJy4uL0RhdGFTb3VyY2VTZXJ2aWNlJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5leHBvcnQgY2xhc3MgRGF0YVNvdXJjZVNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgRGF0YVNvdXJjZVNlcnZpY2Uge1xuICAvLyBTaW5jZSBPYmplY3QgTW9kZWwgaXMgc3VwcG9ydGVkIHNpbmNlIFRhYmxlYXUgMjAyMC4yLCBEYXRhU291cmNlU2VydmljZUltcGwgY2FuIGJlIGluaXRpYWxpemVkIHdpdGggdGhlXG4gIC8vIHBsYXRmb3JtIHZlcnNpb24gd2hlbiBPTSB3YXMgc3VwcG9ydGVkLiBPbmNlIHdlIGRyb3Agc3VwcG9ydCBmb3IgVGFibGVhdSB2ZXJzaW9ucyA8PSAyMDIwLjEsIGFsbCBhZGRpdGlvbmFsXG4gIC8vIGNvZGUgaW4gaGVyZSBmb3IgT2JqZWN0IE1vZGVsIGNhbiBiZSByZW1vdmVkLlxuICBwdWJsaWMgY29uc3RydWN0b3IoZGlzcGF0Y2hlcjogSW50ZXJuYWxBcGlEaXNwYXRjaGVyLCByZWdpc3RyeUlkOiBudW1iZXIpIHtcbiAgICBzdXBlcihkaXNwYXRjaGVyLCByZWdpc3RyeUlkKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5EYXRhU291cmNlU2VydmljZTtcbiAgfVxuXG4gIHB1YmxpYyByZWZyZXNoQXN5bmMoZGF0YVNvdXJjZUlkPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3JlZnJlc2hBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuRGVsdGFUaW1lTXNdOiAwLFxuICAgICAgW1BhcmFtZXRlcklkLlNob3VsZFJlZnJlc2hEU106IHRydWUsXG4gICAgfTtcblxuICAgIC8vIE9uIHNlcnZlcjogTm90IHBhc3NpbmcgdGhlIGRhdGFzb3VyY2UgaWQgd2lsbCByZWZyZXNoIGFsbCBkYXRhc291cmNlcy5cbiAgICBpZiAoZGF0YVNvdXJjZUlkKSB7XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkRhdGFTb3VyY2VJZF0gPSBkYXRhU291cmNlSWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuUmVmcmVzaERhdGFTb3VyY2UsIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0QWN0aXZlVGFibGVzQXN5bmMoZGF0YVNvdXJjZUlkOiBzdHJpbmcpOiBQcm9taXNlPEFycmF5PFRhYmxlSW5mbz4+IHtcbiAgICBjb25zdCBqb2luUGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldEFjdGl2ZVRhYmxlc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EYXRhU291cmNlSWRdOiBkYXRhU291cmNlSWQsXG4gICAgfTtcblxuICAgIC8vIEdldCB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHRhYmxlcyB1c2VkIGJ5IHRoaXMgY29ubmVjdGlvblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldEFjdGl2ZVRhYmxlcywgam9pblBhcmFtZXRlcnMpLnRoZW48QXJyYXk8VGFibGVJbmZvPj4oKGpvaW5SZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgdGFibGVJbmZvcyA9IGpvaW5SZXNwb25zZS5yZXN1bHQgYXMgVGFibGVJbmZvcztcblxuICAgICAgLy8gZ2V0QWN0aXZlVGFibGVzIGlzIHVuc3VwcG9ydGVkIGZvciBjdWJlcyBhbmQgR0EuIFdlIGRvIG5vdCBoYXZlIGEgY29ubmVjdGlvbiB0eXBlIHByb3BlcnR5XG4gICAgICAvLyBhdmFpbGFibGUgZnJvbSB0aGUgcGxhdGZvcm0gKGludGVudGlvbmFsbHksIHRvIHJlZHVjZSBjb2RlIGNodXJuIGFzIG5ldyBjb25uZWN0aW9ucyBhcmUgYWRkZWQpLlxuICAgICAgLy8gSW5zdGVhZCxqdXN0IGNoZWNrIGlmIGFueSB0YWJsZXMgYXJlIHJldHVybmVkLiBUaGlzIGFycmF5IHdpbGwgYmUgZW1wdHkgZm9yIGFueSBub24tdGFibGUgYmFzZWQgZGF0YXNvdXJjZS5cbiAgICAgIGlmICh0YWJsZUluZm9zLnRhYmxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLlVuc3VwcG9ydGVkTWV0aG9kRm9yRGF0YVNvdXJjZVR5cGUsIGBnZXRBY3RpdmVUYWJsZXMgaXMgbm90IHN1cHBvcnRlZCBmb3I6ICR7ZGF0YVNvdXJjZUlkfWApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGFibGVJbmZvcy50YWJsZXM7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RGF0YVNvdXJjZXNBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQpOiBQcm9taXNlPERhdGFTY2hlbWE+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0RGF0YVNvdXJjZXNBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldERhdGFTb3VyY2VzLCBwYXJhbWV0ZXJzKS50aGVuPERhdGFTY2hlbWE+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgZGF0YVNjaGVtYSA9IHJlc3BvbnNlLnJlc3VsdCBhcyBEYXRhU2NoZW1hO1xuICAgICAgcmV0dXJuIGRhdGFTY2hlbWE7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0QWxsRGF0YVNvdXJjZXNBc3luYygpOiBQcm9taXNlPERhdGFTY2hlbWE+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0QWxsRGF0YVNvdXJjZXNBc3luYycsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRBbGxEYXRhU291cmNlcywgcGFyYW1ldGVycykudGhlbjxEYXRhU2NoZW1hPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGRhdGFTY2hlbWEgPSByZXNwb25zZS5yZXN1bHQgYXMgRGF0YVNjaGVtYTtcbiAgICAgIHJldHVybiBkYXRhU2NoZW1hO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldENvbm5lY3Rpb25TdW1tYXJpZXNBc3luYyhkYXRhU291cmNlSWQ6IHN0cmluZyk6IFByb21pc2U8Q29ubmVjdGlvbkRlc2NyaXB0aW9uU3VtbWFyeVtdPiB7XG4gICAgY29uc3QgcGFyYW1zOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0Q29ubmVjdGlvblN1bW1hcmllc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EYXRhU291cmNlSWRdOiBkYXRhU291cmNlSWQsXG4gICAgfTtcblxuICAgIC8vIEdldCB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHRhYmxlcyB1c2VkIGJ5IHRoaXMgY29ubmVjdGlvblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldENvbm5lY3Rpb25EZXNjcmlwdGlvblN1bW1hcmllcywgcGFyYW1zKS50aGVuPENvbm5lY3Rpb25EZXNjcmlwdGlvblN1bW1hcnlbXT4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBkZXNjcmlwdGlvblN1bW1hcmllcyA9IHJlc3BvbnNlLnJlc3VsdCBhcyBDb25uZWN0aW9uRGVzY3JpcHRpb25TdW1tYXJ5W107XG4gICAgICByZXR1cm4gZGVzY3JpcHRpb25TdW1tYXJpZXM7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RmllbGRBc3luYyhnbG9iYWxmaWVsZE5hbWU6IHN0cmluZyk6IFByb21pc2U8Q29udHJhY3QuRmllbGQ+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkdldEZpZWxkQW5kRGF0YVNvdXJjZTtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0RmllbGRBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuRmllbGRJZF06IGdsb2JhbGZpZWxkTmFtZSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPENvbnRyYWN0LkZpZWxkPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGRhdGFTb3VyY2UgPSByZXNwb25zZS5yZXN1bHRbUGFyYW1ldGVySWQuRGF0YVNvdXJjZV0gYXMgSW50ZXJuYWxDb250cmFjdC5EYXRhU291cmNlO1xuICAgICAgY29uc3QgZmllbGQgPSByZXNwb25zZS5yZXN1bHRbUGFyYW1ldGVySWQuRmllbGRdIGFzIEZpZWxkO1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVydEZpZWxkKGZpZWxkLCB0aGlzLmNvbnZlcnREYXRhU291cmNlKGRhdGFTb3VyY2UpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMb2dpY2FsVGFibGVzQXN5bmMoZGF0YVNvdXJjZUlkOiBzdHJpbmcpOiBQcm9taXNlPEFycmF5PExvZ2ljYWxUYWJsZUluZm8+PiB7XG4gICAgY29uc3QgcGFyYW1zOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0TG9naWNhbFRhYmxlc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EYXRhU291cmNlSWRdOiBkYXRhU291cmNlSWQsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRMb2dpY2FsVGFibGVzLCBwYXJhbXMpLnRoZW48QXJyYXk8TG9naWNhbFRhYmxlSW5mbz4+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLnJlc3VsdCBhcyBBcnJheTxMb2dpY2FsVGFibGVJbmZvPjtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmRlcmx5aW5nVGFibGVzQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkKTogUHJvbWlzZTxBcnJheTxMb2dpY2FsVGFibGVJbmZvPj4ge1xuICAgIGNvbnN0IHBhcmFtczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldFVuZGVybHlpbmdUYWJsZXNBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldFVuZGVybHlpbmdUYWJsZXMsIHBhcmFtcykudGhlbjxBcnJheTxMb2dpY2FsVGFibGVJbmZvPj4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm4gcmVzcG9uc2UucmVzdWx0IGFzIEFycmF5PExvZ2ljYWxUYWJsZUluZm8+O1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0RmllbGQoZmllbGQ6IEludGVybmFsQ29udHJhY3QuRmllbGQsIGRhdGFTb3VyY2U6IENvbnRyYWN0LkRhdGFTb3VyY2UpOiBDb250cmFjdC5GaWVsZCB7XG4gICAgcmV0dXJuIG5ldyBGaWVsZChuZXcgRmllbGRJbXBsKGZpZWxkLCBkYXRhU291cmNlKSk7XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnREYXRhU291cmNlKGRhdGFTb3VyY2U6IEludGVybmFsQ29udHJhY3QuRGF0YVNvdXJjZSk6IENvbnRyYWN0LkRhdGFTb3VyY2Uge1xuICAgIHJldHVybiBuZXcgRGF0YVNvdXJjZShuZXcgRGF0YVNvdXJjZUltcGwoZGF0YVNvdXJjZSwgdGhpcy5fcmVnaXN0cnlJZCkpO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBFeGVjdXRlUGFyYW1ldGVycyxcbiAgRXhwb3J0Q3Jvc3N0YWJTaGVldE1hcCxcbiAgRXhwb3J0RmlsZSxcbiAgRXhwb3J0UERGT3B0aW9ucyBhcyBJbnRlcm5hbEV4cG9ydFBERk9wdGlvbnMsXG4gIFBhcmFtZXRlcklkLFxuICBWZXJiSWQsXG4gIFZpc3VhbElkLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQ3Jvc3N0YWJGaWxlRm9ybWF0LFxuICBFeHBvcnREYXRhT3B0aW9ucyxcbiAgRXhwb3J0UERGT3B0aW9ucyBhcyBFeHRlcm5hbEV4cG9ydFBERk9wdGlvbnMsXG4gIEV4cG9ydFNjZW5hcmlvc0ZvclBERkFuZFBvd2VyUG9pbnQsXG4gIFNoYXJlZEVycm9yQ29kZXMsXG4gIFNoZWV0VHlwZSBhcyBFeHRlcm5hbFNoZWV0VHlwZSxcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyB9IGZyb20gJy4uLy4uL0VudW1NYXBwaW5ncy9FeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MnO1xuaW1wb3J0IHsgRXhwb3J0SGVscGVycyB9IGZyb20gJy4uLy4uL1V0aWxzL0V4cG9ydEhlbHBlcnMnO1xuaW1wb3J0IHsgRXhwb3J0U2VydmljZSB9IGZyb20gJy4uL0V4cG9ydFNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IEVycm9ySGVscGVycyB9IGZyb20gJy4uLy4uL1V0aWxzL0Vycm9ySGVscGVycyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi8uLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuXG5leHBvcnQgY2xhc3MgRXhwb3J0U2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBFeHBvcnRTZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTZXJ2aWNlTmFtZXMuRXhwb3J0O1xuICB9XG5cbiAgcHVibGljIGdldEV4cG9ydENyb3NzdGFiU2hlZXRNYXBBc3luYyhjdXJyZW50U2hlZXRUeXBlOiBFeHRlcm5hbFNoZWV0VHlwZSk6IFByb21pc2U8RXhwb3J0Q3Jvc3N0YWJTaGVldE1hcD4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuR2V0RXhwb3J0Q3Jvc3N0YWJTaGVldE1hcDtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0RXhwb3J0Q3Jvc3N0YWJTaGVldE1hcEFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5DdXJyZW50U2hlZXRUeXBlXTogRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzLnNoZWV0VHlwZS5jb252ZXJ0KGN1cnJlbnRTaGVldFR5cGUpLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPEV4cG9ydENyb3NzdGFiU2hlZXRNYXA+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0IGFzIEV4cG9ydENyb3NzdGFiU2hlZXRNYXA7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGV4cG9ydENyb3NzdGFiQXN5bmMoXG4gICAgc2hlZXROYW1lOiBzdHJpbmcsXG4gICAgZm9ybWF0OiBDcm9zc3RhYkZpbGVGb3JtYXQsXG4gICAgZXhwb3J0YWJsZVdvcmtzaGVldE5hbWVzOiBBcnJheTxzdHJpbmc+LFxuICAgIGN1cnJlbnRTaGVldFR5cGU6IEV4dGVybmFsU2hlZXRUeXBlLFxuICApOiBQcm9taXNlPEV4cG9ydEZpbGU+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5U2hlZXROYW1lKGV4cG9ydGFibGVXb3Jrc2hlZXROYW1lcywgc2hlZXROYW1lKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPENyb3NzdGFiRmlsZUZvcm1hdD4oZm9ybWF0LCBDcm9zc3RhYkZpbGVGb3JtYXQsICdDcm9zc3RhYkZpbGVGb3JtYXQnKTtcblxuICAgIC8vIFRoZSBwcmVzIGxheWVyIGNvbW1hbmQgZm9yIGV4cG9ydGluZyBDcm9zc3RhYiB1c2VzIFNpbXBsZVNoZWV0SWRlbnRpZmllcnMgaW5zdGVhZCBvZiBzaGVldCBuYW1lcy5cbiAgICAvLyBUaGUgZXh0ZW5zaW9ucy1hbmQtZW1iZWRkaW5nLWFwaSBjdXJyZW50IGRvZXMgbm90IHN0b3JlIHJlZmVyZW5jZXMgdG8gdGhlIFNpbXBsZVNoZWV0SWRlbnRpZmllcnMgb2YgaXRzIHNoZWV0c1xuICAgIC8vIHNvIHdlIGNhbGwgYSBwcmVzIGxheWVyIGNvbW1hbmQgdGhhdCBnaXZlcyB1cyB0aGUgU2ltcGxlU2hlZXRJZGVudGlmaWVyIGZvciBlYWNoIHNoZWV0IG5hbWUgdGhhdCBhcHBlYXJzIGluIHRoZVxuICAgIC8vIGV4cG9ydCBDcm9zc3RhYiBkaWFsb2cgcG9wdXAuXG4gICAgY29uc3Qgc2hlZXROYW1lVG9JZE1hcCA9IGF3YWl0IHRoaXMuZ2V0RXhwb3J0Q3Jvc3N0YWJTaGVldE1hcEFzeW5jKGN1cnJlbnRTaGVldFR5cGUpO1xuICAgIGlmICghc2hlZXROYW1lVG9JZE1hcFtzaGVldE5hbWVdKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ21pc3Npbmcgc2hlZXQgZG9jIGlkIGZyb20gc2hlZXRNYXAnKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZXhwb3J0Q3Jvc3N0YWJBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuU2hlZXRJZGVudGlmaWVyXTogc2hlZXROYW1lVG9JZE1hcFtzaGVldE5hbWVdLFxuICAgICAgW1BhcmFtZXRlcklkLlNlbmROb3RpZmljYXRpb25zXTogdHJ1ZSwgLy8gc2VuZCBub3RpZmljYXRpb24gb24gcHJlcyBsYXllciB0aGF0IHRyaWdnZXJzIGZpbGUgZG93bmxvYWRcbiAgICB9O1xuXG4gICAgLy8gcHJlcyBsYXllciBjb21tYW5kIGludm9rZWQgZGVwZW5kcyBvbiB0aGUgY3Jvc3N0YWIgZmlsZSBmb3JtYXRcbiAgICBsZXQgdmVyYjtcbiAgICBzd2l0Y2ggKGZvcm1hdCkge1xuICAgICAgY2FzZSBDcm9zc3RhYkZpbGVGb3JtYXQuQ1NWOlxuICAgICAgICB2ZXJiID0gVmVyYklkLkV4cG9ydENyb3NzdGFiQ3N2RG93bmxvYWQ7XG4gICAgICAgIC8vIENTViBvbmx5IHBhcmFtZXRlcjogc2VlIGJyb3dzZXItY2xpZW50cy9leHBvcnQtY3Jvc3N0YWItb3B0aW9ucy1kaWFsb2cgcmVwb1xuICAgICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlVzZVRhYkRlbGltaXRlcnNdID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIENyb3NzdGFiRmlsZUZvcm1hdC5FeGNlbDpcbiAgICAgICAgdmVyYiA9IFZlcmJJZC5FeHBvcnRDcm9zc3RhYkV4Y2VsRG93bmxvYWQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludGVybmFsRXJyb3IsICd1bnN1cHBvcnRlZCBDcm9zc3RhYiBmaWxlIGZvcm1hdC4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpXG4gICAgICAudGhlbjxFeHBvcnRGaWxlPigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0IGFzIEV4cG9ydEZpbGU7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKCgpID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkNyb3NzdGFiQ3JlYXRpb25FcnJvciwgJ0FuIHVuZXhwZWN0ZWQgZXJyb3Igb2NjdXJyZWQgd2hpbGUgZ2VuZXJhdGluZyB0aGUgZG9jdW1lbnQuJyk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBleHBvcnREYXRhQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkLCBvcHRpb25zOiBFeHBvcnREYXRhT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlFeHBvcnREYXRhT3B0aW9ucyhvcHRpb25zKTtcblxuICAgIC8vIFJlbW92ZSBhbnkgZHVwbGljYXRlcyBmcm9tIHRoZSBpbnB1dCBhcnJheVxuICAgIGNvbnN0IGNvbHVtbnNBc1NldDogU2V0PHN0cmluZz4gPSBuZXcgU2V0KG9wdGlvbnMuY29sdW1uc1RvSW5jbHVkZUJ5SWQpO1xuICAgIGNvbnN0IGNvbHVtbnNUb0luY2x1ZGVCeUlkID0gQXJyYXkuZnJvbShjb2x1bW5zQXNTZXQpO1xuXG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5FeHBvcnREYXRhRG93bmxvYWQ7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2V4cG9ydERhdGFBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5JZ25vcmVBbGlhc2VzXTogb3B0aW9ucy5pZ25vcmVBbGlhc2VzID8/IGZhbHNlLFxuICAgICAgW1BhcmFtZXRlcklkLkNvbHVtbnNUb0luY2x1ZGVCeUlkXTogY29sdW1uc1RvSW5jbHVkZUJ5SWQsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycylcbiAgICAgIC50aGVuPHZvaWQ+KCgpID0+IHt9KVxuICAgICAgLmNhdGNoKCgpID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkRhdGFDcmVhdGlvbkVycm9yLCAnQW4gdW5leHBlY3RlZCBlcnJvciBvY2N1cnJlZCB3aGlsZSBnZW5lcmF0aW5nIHRoZSBkb2N1bWVudC4nKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGV4cG9ydFBvd2VyUG9pbnRBc3luYyhzaGVldE5hbWVzOiBBcnJheTxzdHJpbmc+LCBleHBvcnRTY2VuYXJpb3M6IEV4cG9ydFNjZW5hcmlvc0ZvclBERkFuZFBvd2VyUG9pbnQpOiBQcm9taXNlPEV4cG9ydEZpbGU+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5U2hlZXROYW1lc0ZvclBERkFuZFBQVChzaGVldE5hbWVzLCBleHBvcnRTY2VuYXJpb3MpO1xuXG4gICAgLy8gTm90ZTogdGhlIEV4cG9ydE9yaWdpblVybCBwYXJhbSBpcyBsaXN0ZWQgYXMgb3B0aW9uYWwgZm9yIHRoZSBwcmVzIGxheWVyIGNvbW1hbmQgd2UgYXJlIGludm9raW5nOyBob3dldmVyLFxuICAgIC8vIHJlY2VudCBjaGFuZ2VzIHdlcmUgbWFkZSB0aGF0IGVuZm9yY2VkIHRoZSB1c2Ugb2YgdGhlIGVtcHR5IHN0cmluZyB3aGVuIGludm9raW5nIHRoaXMgY29tbWFuZCB3aXRoIG5vIEV4cG9ydE9yaWdpblVybC5cbiAgICAvLyBzZWUgYnJvd3Nlci1jbGllbnRzL2V4cG9ydC1wb3dlcnBvaW50LW9wdGlvbnMtZGlhbG9nIHJlcG8uXG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5FeHBvcnRQb3dlcnBvaW50RG93bmxvYWQ7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2V4cG9ydFBvd2VyUG9pbnRBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuRXhwb3J0T3JpZ2luVXJsXTogJycsXG4gICAgICBbUGFyYW1ldGVySWQuU2VsZWN0ZWRTaGVldE5hbWVzXTogc2hlZXROYW1lcyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKVxuICAgICAgLnRoZW48RXhwb3J0RmlsZT4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBFeHBvcnRGaWxlO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoXG4gICAgICAgICAgU2hhcmVkRXJyb3JDb2Rlcy5Qb3dlclBvaW50Q3JlYXRpb25FcnJvcixcbiAgICAgICAgICAnQW4gZXJyb3Igb2NjdXJlZCB3aGlsZSBhdHRlbXB0aW5nIHRvIGdlbmVyYXRlIHRoZSBQb3dlclBvaW50IGZpbGUuJyxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGV4cG9ydFBERkFzeW5jKFxuICAgIHNoZWV0TmFtZXM6IEFycmF5PHN0cmluZz4sXG4gICAgZXh0ZXJuYWxFeHBvcnRQZGZPcHRpb25zOiBFeHRlcm5hbEV4cG9ydFBERk9wdGlvbnMsXG4gICAgZXhwb3J0U2NlbmFyaW9zOiBFeHBvcnRTY2VuYXJpb3NGb3JQREZBbmRQb3dlclBvaW50LFxuICApOiBQcm9taXNlPEV4cG9ydEZpbGU+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RXhwb3J0UERGT3B0aW9ucyhleHRlcm5hbEV4cG9ydFBkZk9wdGlvbnMpO1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlTaGVldE5hbWVzRm9yUERGQW5kUFBUKHNoZWV0TmFtZXMsIGV4cG9ydFNjZW5hcmlvcyk7XG5cbiAgICBjb25zdCBpbnRlcm5hbEV4cG9ydFBkZk9wdGlvbnM6IEludGVybmFsRXhwb3J0UERGT3B0aW9ucyA9IGF3YWl0IHRoaXMuZ2V0RXhwb3J0UERGT3B0aW9uc0FzeW5jKCk7XG4gICAgRXhwb3J0SGVscGVycy51cGRhdGVJbnRlcm5hbEV4cG9ydFBERk9wdGlvbnMoaW50ZXJuYWxFeHBvcnRQZGZPcHRpb25zLCBleHRlcm5hbEV4cG9ydFBkZk9wdGlvbnMsIHNoZWV0TmFtZXMpO1xuXG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5FeHBvcnRQZGZEb3dubG9hZDtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZXhwb3J0UERGQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkV4cG9ydFBkZk9wdGlvbnNdOiBpbnRlcm5hbEV4cG9ydFBkZk9wdGlvbnMsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycylcbiAgICAgIC50aGVuPEV4cG9ydEZpbGU+KChyZXNwb25zZSkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQgYXMgRXhwb3J0RmlsZTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKCkgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuUERGQ3JlYXRpb25FcnJvciwgJ1VuYWJsZSB0byBjcmVhdGUgUERGIGJlY2F1c2Ugc29tZXRoaW5nIHdlbnQgd3JvbmcuIFRyeSBhZ2Fpbi4nKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldEV4cG9ydFBERk9wdGlvbnNBc3luYygpOiBQcm9taXNlPEludGVybmFsRXhwb3J0UERGT3B0aW9ucz4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuR2V0RXhwb3J0UGRmT3B0aW9ucztcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0RXhwb3J0UGRmT3B0aW9uc0FzeW5jJyxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxJbnRlcm5hbEV4cG9ydFBERk9wdGlvbnM+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0IGFzIEludGVybmFsRXhwb3J0UERGT3B0aW9ucztcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEFwaU1lbnVUeXBlLCBDb250ZXh0TWVudU9wdGlvbnMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXhlY3V0ZVBhcmFtZXRlcnMsIFBhcmFtZXRlcklkLCBWZXJiSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXh0ZXJuYWxDb250ZXh0TWVudVNlcnZpY2UgfSBmcm9tICcuLi9FeHRlcm5hbENvbnRleHRNZW51U2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuXG5leHBvcnQgY2xhc3MgRXh0ZXJuYWxDb250ZXh0TWVudVNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgRXh0ZXJuYWxDb250ZXh0TWVudVNlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5FeHRlcm5hbENvbnRleHRNZW51O1xuICB9XG5cbiAgcHVibGljIGFwcGVuZENvbnRleHRNZW51QXN5bmMoc2hlZXROYW1lOiBzdHJpbmcsIHRhcmdldE1lbnU6IEFwaU1lbnVUeXBlLCBjb25maWc6IENvbnRleHRNZW51T3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5BcHBlbmRFeHRlcm5hbE1lbnVJdGVtO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdhcHBlbmRDb250ZXh0TWVudUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Xb3Jrc2hlZXROYW1lXTogc2hlZXROYW1lLFxuICAgICAgW1BhcmFtZXRlcklkLkV4dGVybmFsTWVudUl0ZW1EaXNwbGF5TmFtZV06IGNvbmZpZy5kaXNwbGF5TmFtZSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHN0cmluZz4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBuZXdNZW51SXRlbUlkID0gcmVzcG9uc2UucmVzdWx0IGFzIHN0cmluZztcbiAgICAgIHJldHVybiBuZXdNZW51SXRlbUlkO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUNvbnRleHRNZW51QXN5bmMoc2hlZXROYW1lOiBzdHJpbmcsIHRhcmdldE1lbnU6IEFwaU1lbnVUeXBlLCBtZW51SXRlbUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLlJlbW92ZUV4dGVybmFsTWVudUl0ZW07XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3JlbW92ZUNvbnRleHRNZW51QXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLldvcmtzaGVldE5hbWVdOiBzaGVldE5hbWUsXG4gICAgICBbUGFyYW1ldGVySWQuRXh0ZXJuYWxNZW51SXRlbUlkXTogbWVudUl0ZW1JZCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGV4ZWN1dGVDb250ZXh0TWVudUFzeW5jKHNoZWV0TmFtZTogc3RyaW5nLCB0YXJnZXRNZW51OiBBcGlNZW51VHlwZSwgbWVudUl0ZW1JZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5FeGVjdXRlRXh0ZXJuYWxNZW51SXRlbTtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZXhlY3V0ZUNvbnRleHRNZW51QXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLldvcmtzaGVldE5hbWVdOiBzaGVldE5hbWUsXG4gICAgICBbUGFyYW1ldGVySWQuRXh0ZXJuYWxNZW51SXRlbUlkXTogbWVudUl0ZW1JZCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHJlbmFtZUNvbnRleHRNZW51QXN5bmMoc2hlZXROYW1lOiBzdHJpbmcsIHRhcmdldE1lbnU6IEFwaU1lbnVUeXBlLCBtZW51SGVhZGVyOiBzdHJpbmcsIG1lbnVEZXNjcmlwdGlvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5SZW5hbWVFeHRlcm5hbE1lbnU7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3JlbmFtZUNvbnRleHRNZW51QXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLldvcmtzaGVldE5hbWVdOiBzaGVldE5hbWUsXG4gICAgICBbUGFyYW1ldGVySWQuRXh0ZXJuYWxNZW51SGVhZGVyXTogbWVudUhlYWRlcixcbiAgICAgIFtQYXJhbWV0ZXJJZC5FeHRlcm5hbE1lbnVEZXNjcmlwdGlvbl06IG1lbnVEZXNjcmlwdGlvbixcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgRGF0ZVJhbmdlVHlwZSxcbiAgRW1iZWRkaW5nRXJyb3JDb2RlcyxcbiAgRXJyb3JDb2RlcyxcbiAgRmlsdGVyRG9tYWluVHlwZSxcbiAgRmlsdGVyVHlwZSBhcyBFeHRlcm5hbEZpbHRlclR5cGUsXG4gIFNoYXJlZEVycm9yQ29kZXMsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgKiBhcyBJbnRlcm5hbENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgRmlsdGVyVHlwZSwgUGFyYW1ldGVySWQsIFZlcmJJZCwgVmlzdWFsSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vLi4vLi4vQXBpU2hhcmVkJztcbmltcG9ydCB7IEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyBhcyBFeHRlcm5hbEVudW1Db252ZXJ0ZXIgfSBmcm9tICcuLi8uLi9FbnVtTWFwcGluZ3MvRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzJztcbmltcG9ydCB7IEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyBhcyBJbnRlcm5hbEVudW1Db252ZXJ0ZXIgfSBmcm9tICcuLi8uLi9FbnVtTWFwcGluZ3MvSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzJztcbmltcG9ydCB7XG4gIENhdGVnb3JpY2FsRG9tYWluLFxuICBDYXRlZ29yaWNhbEZpbHRlcixcbiAgSGllcmFyY2hpY2FsRGF0YVZhbHVlLFxuICBIaWVyYXJjaGljYWxGaWx0ZXIsXG4gIEhpZXJhcmNoaWNhbExldmVsRGV0YWlsLFxuICBSYW5nZURvbWFpbixcbiAgUmFuZ2VGaWx0ZXIsXG4gIFJlbGF0aXZlRGF0ZUZpbHRlcixcbn0gZnJvbSAnLi4vLi4vTW9kZWxzL0ZpbHRlck1vZGVscyc7XG5pbXBvcnQgeyBEYXRhVmFsdWUgfSBmcm9tICcuLi8uLi9Nb2RlbHMvR2V0RGF0YU1vZGVscyc7XG5pbXBvcnQgeyBEYXRhVmFsdWVGYWN0b3J5IH0gZnJvbSAnLi4vLi4vVXRpbHMvRGF0YVZhbHVlRmFjdG9yeSc7XG5pbXBvcnQgeyBQYXJhbSB9IGZyb20gJy4uLy4uL1V0aWxzL1BhcmFtJztcbmltcG9ydCB7IEZpbHRlclNlcnZpY2UgfSBmcm9tICcuLi9GaWx0ZXJTZXJ2aWNlJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBGaWx0ZXJTZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIEZpbHRlclNlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5GaWx0ZXI7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlGaWx0ZXJBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgdmFsdWVzOiBBcnJheTxzdHJpbmc+LFxuICAgIHVwZGF0ZVR5cGU6IENvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGUsXG4gICAgZmlsdGVyT3B0aW9uczogQ29udHJhY3QuRmlsdGVyT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkFwcGx5Q2F0ZWdvcmljYWxGaWx0ZXI7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2FwcGx5RmlsdGVyQXN5bmMnLFxuICAgIH07XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5WaXN1YWxJZF0gPSB2aXN1YWxJZDtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpZWxkTmFtZV0gPSBmaWVsZE5hbWU7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlcykpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLCAndmFsdWVzIHBhcmFtZXRlciBmb3IgYXBwbHlGaWx0ZXJBc3luYyBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gICAgfVxuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmlsdGVyVmFsdWVzXSA9IHZhbHVlcztcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpbHRlclVwZGF0ZVR5cGVdID0gRXh0ZXJuYWxFbnVtQ29udmVydGVyLmZpbHRlclVwZGF0ZVR5cGUuY29udmVydCh1cGRhdGVUeXBlKTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLklzRXhjbHVkZU1vZGVdID1cbiAgICAgIGZpbHRlck9wdGlvbnMgPT09IHVuZGVmaW5lZCB8fCBmaWx0ZXJPcHRpb25zLmlzRXhjbHVkZU1vZGUgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogZmlsdGVyT3B0aW9ucy5pc0V4Y2x1ZGVNb2RlO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHN0cmluZz4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm4gZmllbGROYW1lO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFwcGx5UmFuZ2VGaWx0ZXJBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQsIGZpZWxkTmFtZTogc3RyaW5nLCBmaWx0ZXJPcHRpb25zOiBDb250cmFjdC5SYW5nZUZpbHRlck9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuQXBwbHlSYW5nZUZpbHRlcjtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYXBwbHlSYW5nZUZpbHRlckFzeW5jJyxcbiAgICB9O1xuXG4gICAgaWYgKGZpbHRlck9wdGlvbnMubWluICE9PSB1bmRlZmluZWQgJiYgZmlsdGVyT3B0aW9ucy5taW4gIT09IG51bGwpIHtcbiAgICAgIGxldCBtaW46IHN0cmluZyB8IG51bWJlcjtcbiAgICAgIGlmIChmaWx0ZXJPcHRpb25zLm1pbiBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgbWluID0gUGFyYW0uc2VyaWFsaXplRGF0ZUZvclBsYXRmb3JtKGZpbHRlck9wdGlvbnMubWluKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1pbiA9IGZpbHRlck9wdGlvbnMubWluO1xuICAgICAgfVxuICAgICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWx0ZXJSYW5nZU1pbl0gPSBtaW47XG4gICAgfVxuXG4gICAgaWYgKGZpbHRlck9wdGlvbnMubWF4ICE9PSB1bmRlZmluZWQgJiYgZmlsdGVyT3B0aW9ucy5tYXggIT09IG51bGwpIHtcbiAgICAgIGxldCBtYXg6IHN0cmluZyB8IG51bWJlcjtcbiAgICAgIGlmIChmaWx0ZXJPcHRpb25zLm1heCBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgbWF4ID0gUGFyYW0uc2VyaWFsaXplRGF0ZUZvclBsYXRmb3JtKGZpbHRlck9wdGlvbnMubWF4KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1heCA9IGZpbHRlck9wdGlvbnMubWF4O1xuICAgICAgfVxuICAgICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWx0ZXJSYW5nZU1heF0gPSBtYXg7XG4gICAgfVxuXG4gICAgLy8gVGhlIG51bGwgb3B0aW9uIGlzIHVzZWQgd2l0aCBtaW4rbWF4IGZvciAnaW5jbHVkZS1yYW5nZScgb3IgJ2luY2x1ZGUtcmFuZ2Utb3ItbnVsbCdcbiAgICBpZiAoZmlsdGVyT3B0aW9ucy5udWxsT3B0aW9uKSB7XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpbHRlclJhbmdlTnVsbE9wdGlvbl0gPSBFeHRlcm5hbEVudW1Db252ZXJ0ZXIubnVsbE9wdGlvbnMuY29udmVydChmaWx0ZXJPcHRpb25zLm51bGxPcHRpb24pO1xuICAgIH1cblxuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmllbGROYW1lXSA9IGZpZWxkTmFtZTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlZpc3VhbElkXSA9IHZpc3VhbElkO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHN0cmluZz4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICB0aGlzLmFwaUZpbHRlckhhbmRsZXJDaGVja0ZvckNvbW1hbmRFcnJvcihyZXNwb25zZS5yZXN1bHQgYXMgeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSk7XG4gICAgICByZXR1cm4gZmllbGROYW1lO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFwcGx5SGllcmFyY2hpY2FsRmlsdGVyQXN5bmMoXG4gICAgdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHZhbHVlczogQXJyYXk8c3RyaW5nPiB8IENvbnRyYWN0LkhpZXJhcmNoaWNhbExldmVscyxcbiAgICB1cGRhdGVUeXBlOiBDb250cmFjdC5GaWx0ZXJVcGRhdGVUeXBlLFxuICAgIGZpbHRlck9wdGlvbnM6IENvbnRyYWN0LkZpbHRlck9wdGlvbnMsXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5IaWVyYXJjaGljYWxGaWx0ZXI7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2FwcGx5SGllcmFyY2hpY2FsRmlsdGVyQXN5bmMnLFxuICAgIH07XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5WaXN1YWxJZF0gPSB2aXN1YWxJZDtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpZWxkTmFtZV0gPSBmaWVsZE5hbWU7XG5cbiAgICBjb25zdCBoaWVyYXJjaGljYWxMZXZlbHMgPSAodmFsdWVzIGFzIENvbnRyYWN0LkhpZXJhcmNoaWNhbExldmVscykubGV2ZWxzO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaGllcmFyY2hpY2FsTGV2ZWxzKSAmJiBoaWVyYXJjaGljYWxMZXZlbHMubGVuZ3RoID4gMCkge1xuICAgICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWx0ZXJMZXZlbHNdID0gaGllcmFyY2hpY2FsTGV2ZWxzO1xuICAgIH0gZWxzZSBpZiAoKHZhbHVlcyBhcyBBcnJheTxTdHJpbmc+KS5sZW5ndGggPiAwKSB7XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpbHRlclZhbHVlc10gPSB2YWx1ZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHRoZSBzZXJ2ZXIgY29tbWFuZCBleHBlY3RzIGVtcHR5IGxpc3QgZm9yIGNsZWFyaW5nIHRoZSBmaWx0ZXJcbiAgICAgIC8vIGl0IGFsc28gZXhwZWN0cyBlaXRoZXJzIEZpbHRlckxldmVscyBvciBGaWx0ZXJWYWx1ZXMgdG8gYmUgc2V0XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpbHRlckxldmVsc10gPSBbXTtcbiAgICB9XG5cbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpbHRlclVwZGF0ZVR5cGVdID0gRXh0ZXJuYWxFbnVtQ29udmVydGVyLmZpbHRlclVwZGF0ZVR5cGUuY29udmVydCh1cGRhdGVUeXBlKTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLklzRXhjbHVkZU1vZGVdID0gZmlsdGVyT3B0aW9ucyAmJiAhIWZpbHRlck9wdGlvbnMuaXNFeGNsdWRlTW9kZTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxzdHJpbmc+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuIGZpZWxkTmFtZTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhckZpbHRlckFzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCwgZmllbGROYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuQ2xlYXJGaWx0ZXI7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2NsZWFyRmlsdGVyQXN5bmMnLFxuICAgIH07XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5WaXN1YWxJZF0gPSB2aXN1YWxJZDtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpZWxkTmFtZV0gPSBmaWVsZE5hbWU7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHN0cmluZz4oKHJlc3Bvc25lKSA9PiB7XG4gICAgICByZXR1cm4gZmllbGROYW1lO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFwcGx5UmVsYXRpdmVEYXRlRmlsdGVyQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkLCBmaWVsZE5hbWU6IHN0cmluZywgb3B0aW9uczogQ29udHJhY3QuUmVsYXRpdmVEYXRlRmlsdGVyT3B0aW9ucykge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuQXBwbHlSZWxhdGl2ZURhdGVGaWx0ZXI7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2FwcGx5UmVsYXRpdmVEYXRlRmlsdGVyQXN5bmMnLFxuICAgIH07XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5WaXN1YWxJZF0gPSB2aXN1YWxJZDtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpZWxkTmFtZV0gPSBmaWVsZE5hbWU7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5QZXJpb2RUeXBlXSA9IEV4dGVybmFsRW51bUNvbnZlcnRlci5wZXJpb2RUeXBlLmNvbnZlcnQob3B0aW9ucy5wZXJpb2RUeXBlKTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkRhdGVSYW5nZVR5cGVdID0gRXh0ZXJuYWxFbnVtQ29udmVydGVyLmRhdGVSYW5nZVR5cGUuY29udmVydChvcHRpb25zLnJhbmdlVHlwZSk7XG4gICAgaWYgKG9wdGlvbnMucmFuZ2VUeXBlID09PSBEYXRlUmFuZ2VUeXBlLkxhc3ROIHx8IG9wdGlvbnMucmFuZ2VUeXBlID09PSBEYXRlUmFuZ2VUeXBlLk5leHROKSB7XG4gICAgICBpZiAob3B0aW9ucy5yYW5nZU4gPT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLnJhbmdlTiA9PT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgICAgIEVtYmVkZGluZ0Vycm9yQ29kZXMuTWlzc2luZ1JhbmdlTkZvclJlbGF0aXZlRGF0ZUZpbHRlcnMsXG4gICAgICAgICAgJ01pc3NpbmcgcmFuZ2VOIGZpZWxkIGZvciBhIHJlbGF0aXZlIGRhdGUgZmlsdGVyIG9mIExBU1ROIG9yIE5FWFROLicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlJhbmdlTl0gPSBvcHRpb25zLnJhbmdlTjtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5hbmNob3JEYXRlICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5hbmNob3JEYXRlICE9PSBudWxsKSB7XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkFuY2hvckRhdGVdID0gdGhpcy5jb252ZXJ0QW5jaG9yRGF0ZShvcHRpb25zLmFuY2hvckRhdGUpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxzdHJpbmc+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLnJlc3VsdCBhcyBzdHJpbmc7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RmlsdGVyc0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuRmlsdGVyPj4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuR2V0RmlsdGVycztcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0RmlsdGVyc0FzeW5jJyxcbiAgICB9O1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuVmlzdWFsSWRdID0gdmlzdWFsSWQ7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPEFycmF5PENvbnRyYWN0LkZpbHRlcj4+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgZmlsdGVycyA9IHJlc3BvbnNlLnJlc3VsdCBhcyBBcnJheTxJbnRlcm5hbENvbnRyYWN0LkZpbHRlcj47XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0RG9tYWluRmlsdGVycyhmaWx0ZXJzKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDYXRlZ29yaWNhbERvbWFpbkFzeW5jKFxuICAgIHdvcmtzaGVldE5hbWU6IHN0cmluZyxcbiAgICBmaWVsZElkOiBzdHJpbmcsXG4gICAgZG9tYWluVHlwZTogRmlsdGVyRG9tYWluVHlwZSxcbiAgKTogUHJvbWlzZTxDb250cmFjdC5DYXRlZ29yaWNhbERvbWFpbj4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuR2V0Q2F0ZWdvcmljYWxEb21haW47XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldENhdGVnb3JpY2FsRG9tYWluQXN5bmMnLFxuICAgIH07XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5WaXN1YWxJZF0gPSB7XG4gICAgICB3b3Jrc2hlZXQ6IHdvcmtzaGVldE5hbWUsXG4gICAgfTtcblxuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmllbGRJZF0gPSBmaWVsZElkO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRG9tYWluVHlwZV0gPSBFeHRlcm5hbEVudW1Db252ZXJ0ZXIuZmlsdGVyRG9tYWluVHlwZS5jb252ZXJ0KGRvbWFpblR5cGUpO1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxDb250cmFjdC5DYXRlZ29yaWNhbERvbWFpbj4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBkb21haW4gPSByZXNwb25zZS5yZXN1bHQgYXMgSW50ZXJuYWxDb250cmFjdC5DYXRlZ29yaWNhbERvbWFpbjtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRDYXRlZ29yaWNhbERvbWFpbihkb21haW4sIGRvbWFpblR5cGUpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldFJhbmdlRG9tYWluQXN5bmMod29ya3NoZWV0TmFtZTogc3RyaW5nLCBmaWVsZElkOiBzdHJpbmcsIGRvbWFpblR5cGU6IEZpbHRlckRvbWFpblR5cGUpOiBQcm9taXNlPENvbnRyYWN0LlJhbmdlRG9tYWluPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5HZXRSYW5nZURvbWFpbjtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0UmFuZ2VEb21haW5Bc3luYycsXG4gICAgfTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlZpc3VhbElkXSA9IHtcbiAgICAgIHdvcmtzaGVldDogd29ya3NoZWV0TmFtZSxcbiAgICB9O1xuXG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWVsZElkXSA9IGZpZWxkSWQ7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5Eb21haW5UeXBlXSA9IEV4dGVybmFsRW51bUNvbnZlcnRlci5maWx0ZXJEb21haW5UeXBlLmNvbnZlcnQoZG9tYWluVHlwZSk7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPENvbnRyYWN0LlJhbmdlRG9tYWluPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGRvbWFpbiA9IHJlc3BvbnNlLnJlc3VsdCBhcyBJbnRlcm5hbENvbnRyYWN0LlJhbmdlRG9tYWluO1xuXG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0UmFuZ2VEb21haW4oZG9tYWluLCBkb21haW5UeXBlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXREYXNoYm9hcmRGaWx0ZXJzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5GaWx0ZXI+PiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5HZXREYXNoYm9hcmRGaWx0ZXJzO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXREYXNoYm9hcmRGaWx0ZXJzQXN5bmMnLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPEFycmF5PENvbnRyYWN0LkZpbHRlcj4+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgZmlsdGVycyA9IHJlc3BvbnNlLnJlc3VsdCBhcyBBcnJheTxJbnRlcm5hbENvbnRyYWN0LkZpbHRlcj47XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0RG9tYWluRmlsdGVycyhmaWx0ZXJzKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseURhc2hib2FyZEZpbHRlckFzeW5jKFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHZhbHVlczogQXJyYXk8c3RyaW5nPixcbiAgICB1cGRhdGVUeXBlOiBDb250cmFjdC5GaWx0ZXJVcGRhdGVUeXBlLFxuICAgIGZpbHRlck9wdGlvbnM6IENvbnRyYWN0LkZpbHRlck9wdGlvbnMsXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5EYXNoYm9hcmRDYXRlZ29yaWNhbEZpbHRlcjtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYXBwbHlEYXNoYm9hcmRGaWx0ZXJBc3luYycsXG4gICAgfTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpZWxkTmFtZV0gPSBmaWVsZE5hbWU7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWx0ZXJWYWx1ZXNdID0gdmFsdWVzO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmlsdGVyVXBkYXRlVHlwZV0gPSBFeHRlcm5hbEVudW1Db252ZXJ0ZXIuZmlsdGVyVXBkYXRlVHlwZS5jb252ZXJ0KHVwZGF0ZVR5cGUpO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuSXNFeGNsdWRlTW9kZV0gPSBmaWx0ZXJPcHRpb25zICYmICEhZmlsdGVyT3B0aW9ucy5pc0V4Y2x1ZGVNb2RlO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHN0cmluZz4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm4gcmVzcG9uc2UucmVzdWx0IGFzIHN0cmluZztcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRBcHBsaWVkV29ya3NoZWV0c0FzeW5jKHdvcmtzaGVldE5hbWU6IHN0cmluZywgZmllbGRJZDogc3RyaW5nKTogUHJvbWlzZTxBcnJheTxzdHJpbmc+PiB7XG4gICAgY29uc3Qgc2hhcmVkRmlsdGVyTW9kZWwgPSBhd2FpdCB0aGlzLmV4ZWN1dGVHZXRBcHBsaWVkV29ya3NoZWV0cyh3b3Jrc2hlZXROYW1lLCBmaWVsZElkLCAnZ2V0QXBwbGllZFdvcmtzaGVldHNBc3luYycpO1xuICAgIGNvbnN0IHdvcmtzaGVldE5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIHNoYXJlZEZpbHRlck1vZGVsLndvcmtzaGVldHM/Lm1hcCgod29ya3NoZWV0SW5mbzogSW50ZXJuYWxDb250cmFjdC5TaGFyZWRGaWx0ZXJXb3Jrc2hlZXRNb2RlbCkgPT4ge1xuICAgICAgaWYgKHdvcmtzaGVldEluZm8uaXNTZWxlY3RlZCkge1xuICAgICAgICB3b3Jrc2hlZXROYW1lcy5wdXNoKHdvcmtzaGVldEluZm8ud29ya3NoZWV0TmFtZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHdvcmtzaGVldE5hbWVzO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHNldEFwcGxpZWRXb3Jrc2hlZXRzQXN5bmMoXG4gICAgd29ya3NoZWV0TmFtZTogc3RyaW5nLFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIGZpZWxkSWQ6IHN0cmluZyxcbiAgICBhcHBseVRvV29ya3NoZWV0czogQXJyYXk8c3RyaW5nPixcbiAgKTogUHJvbWlzZTxBcnJheTxzdHJpbmc+PiB7XG4gICAgY29uc3Qgc2hhcmVkRmlsdGVyTW9kZWwgPSBhd2FpdCB0aGlzLmV4ZWN1dGVHZXRBcHBsaWVkV29ya3NoZWV0cyh3b3Jrc2hlZXROYW1lLCBmaWVsZElkLCAnZ2V0QXBwbGllZFdvcmtzaGVldHNBc3luY0ludGVybmFsJyk7XG4gICAgaWYgKCFzaGFyZWRGaWx0ZXJNb2RlbCB8fCAhc2hhcmVkRmlsdGVyTW9kZWwud29ya3NoZWV0cykge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludGVybmFsRXJyb3IsICdUaGlzIGZpbHRlciBkb2VzIG5vdCBhcHBseSB0byBtdWx0aXBsZSB3b3Jrc2hlZXRzJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYWxsb3dlZFdvcmtzaGVldHM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IGFjdGl2ZVdvcmtzaGVldCA9ICcnO1xuICAgIHNoYXJlZEZpbHRlck1vZGVsLndvcmtzaGVldHMuZm9yRWFjaCgod29ya3NoZWV0KSA9PiB7XG4gICAgICAvLyBHZXQgYWN0aXZlIHdvcmtzaGVldFxuICAgICAgaWYgKHdvcmtzaGVldC5pc0FjdGl2ZSkge1xuICAgICAgICBhY3RpdmVXb3Jrc2hlZXQgPSB3b3Jrc2hlZXQud29ya3NoZWV0TmFtZTtcbiAgICAgIH1cblxuICAgICAgLy8gUG9wdWxhdGUgYWxsb3dlZCB3b3Jrc2hlZXRzXG4gICAgICBpZiAod29ya3NoZWV0LmlzU2VsZWN0ZWQgfHwgd29ya3NoZWV0LmlzRW5hYmxlZCkge1xuICAgICAgICBhbGxvd2VkV29ya3NoZWV0cy5wdXNoKHdvcmtzaGVldC53b3Jrc2hlZXROYW1lKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChhY3RpdmVXb3Jrc2hlZXQgPT09ICcnKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ05vIGFjdGl2ZSB3b3Jrc2hlZXQnKTtcbiAgICB9XG5cbiAgICBpZiAoIWFwcGx5VG9Xb3Jrc2hlZXRzLmluY2x1ZGVzKGFjdGl2ZVdvcmtzaGVldCkpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgJHthY3RpdmVXb3Jrc2hlZXR9IG11c3QgYmUgaW5jbHVkZWQgaW4gdGhlIGFwcGxpZWQgd29ya3NoZWV0c2ApO1xuICAgIH1cblxuICAgIGFwcGx5VG9Xb3Jrc2hlZXRzLmZvckVhY2goKHNoZWV0KSA9PiB7XG4gICAgICAvLyBjaGVjayBpZiBpdCdzIHByZXNlbnQgd2l0aGluIGNvbXBhdGlibGUgc2hlZXRzXG4gICAgICBpZiAoIWFsbG93ZWRXb3Jrc2hlZXRzLmluY2x1ZGVzKHNoZWV0KSkge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFRoZSBmaWVsZCAke2ZpZWxkTmFtZX0gaXNuJ3QgYXBwbGljYWJsZSB0byB0aGUgd29ya3NoZWV0ICR7c2hlZXR9YCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkNoYW5nZVNoYXJlZEZpbHRlcjtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHt9O1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXSA9ICdzZXRBcHBsaWVkV29ya3NoZWV0c0FzeW5jJztcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlZpc3VhbElkXSA9IHtcbiAgICAgIHdvcmtzaGVldDogd29ya3NoZWV0TmFtZSxcbiAgICB9O1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmllbGRJZF0gPSBmaWVsZElkO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuU2hhcmVkRmlsdGVyU2hlZXRzXSA9IGFwcGx5VG9Xb3Jrc2hlZXRzO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHN0cmluZ1tdPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybiBhcHBseVRvV29ya3NoZWV0cztcbiAgICB9KTtcbiAgfVxuXG4gIC8vIEhlbHBlciBNZXRob2RzXG5cbiAgcHJpdmF0ZSBleGVjdXRlR2V0QXBwbGllZFdvcmtzaGVldHMoXG4gICAgd29ya3NoZWV0TmFtZTogc3RyaW5nLFxuICAgIGZpZWxkSWQ6IHN0cmluZyxcbiAgICB0ZWxlbWV0cnlGdW5jdGlvbk5hbWU6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxJbnRlcm5hbENvbnRyYWN0LlNoYXJlZEZpbHRlck1vZGVsPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5HZXRTaGFyZWRGaWx0ZXI7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7fTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV0gPSB0ZWxlbWV0cnlGdW5jdGlvbk5hbWU7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5WaXN1YWxJZF0gPSB7XG4gICAgICB3b3Jrc2hlZXQ6IHdvcmtzaGVldE5hbWUsXG4gICAgfTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpZWxkSWRdID0gZmllbGRJZDtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxJbnRlcm5hbENvbnRyYWN0LlNoYXJlZEZpbHRlck1vZGVsPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHNoYXJlZEZpbHRlck1vZGVsID0gcmVzcG9uc2UucmVzdWx0IGFzIEludGVybmFsQ29udHJhY3QuU2hhcmVkRmlsdGVyTW9kZWw7XG4gICAgICByZXR1cm4gc2hhcmVkRmlsdGVyTW9kZWw7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnREb21haW5GaWx0ZXJzKGRvbWFpbkZpbHRlcnM6IEFycmF5PEludGVybmFsQ29udHJhY3QuRmlsdGVyPik6IEFycmF5PENvbnRyYWN0LkZpbHRlcj4ge1xuICAgIGNvbnN0IGZpbHRlcnM6IEFycmF5PENvbnRyYWN0LkZpbHRlcj4gPSBbXTtcbiAgICBkb21haW5GaWx0ZXJzLmZvckVhY2goKGRvbWFpbkZpbHRlcikgPT4ge1xuICAgICAgc3dpdGNoIChkb21haW5GaWx0ZXIuZmlsdGVyVHlwZSkge1xuICAgICAgICBjYXNlIEZpbHRlclR5cGUuQ2F0ZWdvcmljYWw6IHtcbiAgICAgICAgICBjb25zdCBmaWx0ZXIgPSBkb21haW5GaWx0ZXIgYXMgSW50ZXJuYWxDb250cmFjdC5DYXRlZ29yaWNhbEZpbHRlcjtcbiAgICAgICAgICBpZiAoZmlsdGVyKSB7XG4gICAgICAgICAgICBmaWx0ZXJzLnB1c2godGhpcy5jb252ZXJ0Q2F0ZWdvcmljYWxGaWx0ZXIoZmlsdGVyKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBDYXRlZ29yaWNhbCBGaWx0ZXInKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlIEZpbHRlclR5cGUuSGllcmFyY2hpY2FsOiB7XG4gICAgICAgICAgY29uc3QgZmlsdGVyID0gZG9tYWluRmlsdGVyIGFzIEludGVybmFsQ29udHJhY3QuSGllcmFyY2hpY2FsRmlsdGVyO1xuICAgICAgICAgIGlmIChmaWx0ZXIpIHtcbiAgICAgICAgICAgIGZpbHRlcnMucHVzaCh0aGlzLmNvbnZlcnRIaWVyYXJjaGljYWxGaWx0ZXIoZmlsdGVyKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBIaWVyYXJjaGljYWwgRmlsdGVyJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBGaWx0ZXJUeXBlLlJhbmdlOiB7XG4gICAgICAgICAgY29uc3QgZmlsdGVyID0gZG9tYWluRmlsdGVyIGFzIEludGVybmFsQ29udHJhY3QuUmFuZ2VGaWx0ZXI7XG4gICAgICAgICAgaWYgKGZpbHRlcikge1xuICAgICAgICAgICAgZmlsdGVycy5wdXNoKHRoaXMuY29udmVydFJhbmdlRmlsdGVyKGZpbHRlcikpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgUmFuZ2UgRmlsdGVyJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBGaWx0ZXJUeXBlLlJlbGF0aXZlRGF0ZToge1xuICAgICAgICAgIGNvbnN0IGZpbHRlciA9IGRvbWFpbkZpbHRlciBhcyBJbnRlcm5hbENvbnRyYWN0LlJlbGF0aXZlRGF0ZUZpbHRlcjtcbiAgICAgICAgICBpZiAoZmlsdGVyKSB7XG4gICAgICAgICAgICBmaWx0ZXJzLnB1c2godGhpcy5jb252ZXJ0UmVsYXRpdmVEYXRlRmlsdGVyKGZpbHRlcikpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgUmVsYXRpdmUgRGF0ZSBGaWx0ZXInKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZmlsdGVycztcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydENhdGVnb3JpY2FsRmlsdGVyKGRvbWFpbkZpbHRlcjogSW50ZXJuYWxDb250cmFjdC5DYXRlZ29yaWNhbEZpbHRlcik6IENvbnRyYWN0LkNhdGVnb3JpY2FsRmlsdGVyIHtcbiAgICBjb25zdCBhcHBsaWVkVmFsdWVzOiBBcnJheTxDb250cmFjdC5EYXRhVmFsdWU+ID0gZG9tYWluRmlsdGVyLnZhbHVlcy5tYXAoKGR2KSA9PiB7XG4gICAgICByZXR1cm4gRGF0YVZhbHVlRmFjdG9yeS5NYWtlRmlsdGVyRGF0YVZhbHVlKGR2KTtcbiAgICB9KTtcblxuICAgIHJldHVybiBuZXcgQ2F0ZWdvcmljYWxGaWx0ZXIoXG4gICAgICBkb21haW5GaWx0ZXIudmlzdWFsSWQud29ya3NoZWV0LFxuICAgICAgZG9tYWluRmlsdGVyLmZpZWxkQ2FwdGlvbixcbiAgICAgIGRvbWFpbkZpbHRlci5maWVsZE5hbWUsXG4gICAgICBGaWx0ZXJUeXBlLkNhdGVnb3JpY2FsLFxuICAgICAgdGhpcy5fcmVnaXN0cnlJZCxcbiAgICAgIGFwcGxpZWRWYWx1ZXMsXG4gICAgICBkb21haW5GaWx0ZXIuaXNFeGNsdWRlLFxuICAgICAgZG9tYWluRmlsdGVyLmlzQWxsU2VsZWN0ZWQsXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydEhpZXJhcmNoaWNhbEZpbHRlcihkb21haW5GaWx0ZXI6IEludGVybmFsQ29udHJhY3QuSGllcmFyY2hpY2FsRmlsdGVyKTogQ29udHJhY3QuSGllcmFyY2hpY2FsRmlsdGVyIHtcbiAgICBjb25zdCBhcHBsaWVkVmFsdWVzOiBBcnJheTxDb250cmFjdC5IaWVyYXJjaGljYWxGaWx0ZXJEYXRhVmFsdWU+ID0gZG9tYWluRmlsdGVyLnZhbHVlcy5tYXAoKGhpZXJhcmNoaWNhbERhdGFWYWx1ZSkgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBIaWVyYXJjaGljYWxEYXRhVmFsdWUoXG4gICAgICAgIERhdGFWYWx1ZUZhY3RvcnkuTWFrZUZpbHRlckRhdGFWYWx1ZShoaWVyYXJjaGljYWxEYXRhVmFsdWUudmFsdWUpLFxuICAgICAgICBoaWVyYXJjaGljYWxEYXRhVmFsdWUuaGllcmFyY2hpY2FsUGF0aCxcbiAgICAgICAgaGllcmFyY2hpY2FsRGF0YVZhbHVlLmxldmVsLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGxldmVsRGV0YWlsczogQXJyYXk8Q29udHJhY3QuSGllcmFyY2hpY2FsTGV2ZWxEZXRhaWw+ID0gZG9tYWluRmlsdGVyLmxldmVsSW5mby5tYXAoKGFMZXZlbCkgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBIaWVyYXJjaGljYWxMZXZlbERldGFpbChcbiAgICAgICAgYUxldmVsLm5hbWUsXG4gICAgICAgIEludGVybmFsRW51bUNvbnZlcnRlci5oaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlLmNvbnZlcnQoYUxldmVsLmxldmVsU2VsZWN0aW9uU3RhdGUpLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBuZXcgSGllcmFyY2hpY2FsRmlsdGVyKFxuICAgICAgZG9tYWluRmlsdGVyLnZpc3VhbElkLndvcmtzaGVldCxcbiAgICAgIGRvbWFpbkZpbHRlci5maWVsZENhcHRpb24sXG4gICAgICBkb21haW5GaWx0ZXIuZmllbGROYW1lLFxuICAgICAgRmlsdGVyVHlwZS5IaWVyYXJjaGljYWwsXG4gICAgICB0aGlzLl9yZWdpc3RyeUlkLFxuICAgICAgZG9tYWluRmlsdGVyLmRpbWVuc2lvbk5hbWUsXG4gICAgICBkb21haW5GaWx0ZXIuaGllcmFyY2h5Q2FwdGlvbixcbiAgICAgIGRvbWFpbkZpbHRlci5sZXZlbHMsXG4gICAgICBsZXZlbERldGFpbHMsXG4gICAgICBhcHBsaWVkVmFsdWVzLFxuICAgICAgZG9tYWluRmlsdGVyLmlzQWxsU2VsZWN0ZWQsXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydFJhbmdlRmlsdGVyKGRvbWFpbkZpbHRlcjogSW50ZXJuYWxDb250cmFjdC5SYW5nZUZpbHRlcik6IENvbnRyYWN0LlJhbmdlRmlsdGVyIHtcbiAgICBjb25zdCBtaW5WYWx1ZTogRGF0YVZhbHVlID0gRGF0YVZhbHVlRmFjdG9yeS5NYWtlRmlsdGVyRGF0YVZhbHVlKGRvbWFpbkZpbHRlci5taW4pO1xuICAgIGNvbnN0IG1heFZhbHVlOiBEYXRhVmFsdWUgPSBEYXRhVmFsdWVGYWN0b3J5Lk1ha2VGaWx0ZXJEYXRhVmFsdWUoZG9tYWluRmlsdGVyLm1heCk7XG4gICAgcmV0dXJuIG5ldyBSYW5nZUZpbHRlcihcbiAgICAgIGRvbWFpbkZpbHRlci52aXN1YWxJZC53b3Jrc2hlZXQsXG4gICAgICBkb21haW5GaWx0ZXIuZmllbGRDYXB0aW9uLFxuICAgICAgZG9tYWluRmlsdGVyLmZpZWxkTmFtZSxcbiAgICAgIEZpbHRlclR5cGUuUmFuZ2UsXG4gICAgICB0aGlzLl9yZWdpc3RyeUlkLFxuICAgICAgbWluVmFsdWUsXG4gICAgICBtYXhWYWx1ZSxcbiAgICAgIGRvbWFpbkZpbHRlci5pbmNsdWRlTnVsbFZhbHVlcyxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0UmVsYXRpdmVEYXRlRmlsdGVyKGRvbWFpbkZpbHRlcjogSW50ZXJuYWxDb250cmFjdC5SZWxhdGl2ZURhdGVGaWx0ZXIpOiBDb250cmFjdC5SZWxhdGl2ZURhdGVGaWx0ZXIge1xuICAgIGNvbnN0IGFuY2hvckRhdGVWYWx1ZTogRGF0YVZhbHVlID0gRGF0YVZhbHVlRmFjdG9yeS5NYWtlRmlsdGVyRGF0YVZhbHVlKGRvbWFpbkZpbHRlci5hbmNob3JEYXRlKTtcbiAgICByZXR1cm4gbmV3IFJlbGF0aXZlRGF0ZUZpbHRlcihcbiAgICAgIGRvbWFpbkZpbHRlci52aXN1YWxJZC53b3Jrc2hlZXQsXG4gICAgICBkb21haW5GaWx0ZXIuZmllbGRDYXB0aW9uLFxuICAgICAgZG9tYWluRmlsdGVyLmZpZWxkTmFtZSxcbiAgICAgIEV4dGVybmFsRmlsdGVyVHlwZS5SZWxhdGl2ZURhdGUsXG4gICAgICB0aGlzLl9yZWdpc3RyeUlkLFxuICAgICAgYW5jaG9yRGF0ZVZhbHVlLFxuICAgICAgSW50ZXJuYWxFbnVtQ29udmVydGVyLmRhdGVTdGVwUGVyaW9kLmNvbnZlcnQoZG9tYWluRmlsdGVyLnBlcmlvZFR5cGUpLFxuICAgICAgSW50ZXJuYWxFbnVtQ29udmVydGVyLmRhdGVSYW5nZVR5cGUuY29udmVydChkb21haW5GaWx0ZXIucmFuZ2VUeXBlKSxcbiAgICAgIGRvbWFpbkZpbHRlci5yYW5nZU4sXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydENhdGVnb3JpY2FsRG9tYWluKGRvbWFpbjogSW50ZXJuYWxDb250cmFjdC5DYXRlZ29yaWNhbERvbWFpbiwgZG9tYWluVHlwZTogRmlsdGVyRG9tYWluVHlwZSk6IENvbnRyYWN0LkNhdGVnb3JpY2FsRG9tYWluIHtcbiAgICBjb25zdCB2YWx1ZXM6IEFycmF5PERhdGFWYWx1ZT4gPSBkb21haW4udmFsdWVzLm1hcCgoZG9tYWluRHYpID0+IHtcbiAgICAgIHJldHVybiBEYXRhVmFsdWVGYWN0b3J5Lk1ha2VGaWx0ZXJEYXRhVmFsdWUoZG9tYWluRHYpO1xuICAgIH0pO1xuICAgIHJldHVybiBuZXcgQ2F0ZWdvcmljYWxEb21haW4odmFsdWVzLCBkb21haW5UeXBlKTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydFJhbmdlRG9tYWluKGRvbWFpbjogSW50ZXJuYWxDb250cmFjdC5SYW5nZURvbWFpbiwgZG9tYWluVHlwZTogRmlsdGVyRG9tYWluVHlwZSk6IENvbnRyYWN0LlJhbmdlRG9tYWluIHtcbiAgICBjb25zdCBtaW46IERhdGFWYWx1ZSA9IERhdGFWYWx1ZUZhY3RvcnkuTWFrZUZpbHRlckRhdGFWYWx1ZShkb21haW4ubWluKTtcbiAgICBjb25zdCBtYXg6IERhdGFWYWx1ZSA9IERhdGFWYWx1ZUZhY3RvcnkuTWFrZUZpbHRlckRhdGFWYWx1ZShkb21haW4ubWF4KTtcbiAgICByZXR1cm4gbmV3IFJhbmdlRG9tYWluKG1pbiwgbWF4LCBkb21haW5UeXBlKTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydEFuY2hvckRhdGUoYW5jaG9yRGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgLy8gQ29udmVydHMgYSBEYXRlIG9iamVjdCBpbnRvIGEgc3RyaW5nIGZvcm1hdCB0aGF0IHRoZSBzZXJ2ZXIgZXhwZWN0cyBmb3IgZGF0ZS90aW1lIHZhbHVlcy5cbiAgICAvLyBJZiBhbmNob3JEYXRlIGRvZXNuJ3QgcmVwcmVzZW50IGEgdmFsaWQgRGF0ZSBvYmplY3QsIGFueSBvZiB0aGVzZSB3b3VsZCBiZSBOYU4uXG4gICAgY29uc3QgeWVhciA9IGFuY2hvckRhdGUuZ2V0VVRDRnVsbFllYXIoKTtcbiAgICBjb25zdCBtb250aCA9IGFuY2hvckRhdGUuZ2V0VVRDTW9udGgoKSArIDE7XG4gICAgY29uc3QgZGF5ID0gYW5jaG9yRGF0ZS5nZXRVVENEYXRlKCk7XG4gICAgY29uc3QgaGggPSBhbmNob3JEYXRlLmdldFVUQ0hvdXJzKCk7XG4gICAgY29uc3QgbW0gPSBhbmNob3JEYXRlLmdldFVUQ01pbnV0ZXMoKTtcbiAgICBjb25zdCBzZWMgPSBhbmNob3JEYXRlLmdldFVUQ1NlY29uZHMoKTtcblxuICAgIGlmIChpc05hTih5ZWFyKSB8fCBpc05hTihtb250aCkgfHwgaXNOYU4oZGF5KSB8fCBpc05hTihoaCkgfHwgaXNOYU4obW0pIHx8IGlzTmFOKHNlYykpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRW1iZWRkaW5nRXJyb3JDb2Rlcy5JbnZhbGlkRGF0ZVBhcmFtZXRlciwgJ0ludmFsaWQgZGF0ZSBwYXJhbWV0ZXI6IGFuY2hvckRhdGUnKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBgJHt5ZWFyfS0ke21vbnRofS0ke2RheX0gJHtoaH06JHttbX06JHtzZWN9YDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBhcGlGaWx0ZXJIYW5kbGVyQ2hlY2tGb3JDb21tYW5kRXJyb3Ioc2VydmVyUG06IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0pIHtcbiAgICBpZiAoIXNlcnZlclBtW0ludGVybmFsQ29udHJhY3QuUGFyYW1ldGVySWQuUGFyYW1ldGVyRXJyb3JdKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChzZXJ2ZXJQbVtJbnRlcm5hbENvbnRyYWN0LlBhcmFtZXRlcklkLkludmFsaWRGaWVsZENhcHRpb25dKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW52YWxpZEZpbHRlckZpZWxkTmFtZSwgc2VydmVyUG1bSW50ZXJuYWxDb250cmFjdC5QYXJhbWV0ZXJJZC5JbnZhbGlkRmllbGRDYXB0aW9uXSk7XG4gICAgfVxuICAgIGlmIChzZXJ2ZXJQbVtJbnRlcm5hbENvbnRyYWN0LlBhcmFtZXRlcklkLkludmFsaWRWYWx1ZXNdKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW52YWxpZEZpbHRlckZpZWxkVmFsdWUsIHNlcnZlclBtW0ludGVybmFsQ29udHJhY3QuUGFyYW1ldGVySWQuSW52YWxpZFZhbHVlc10pO1xuICAgIH1cbiAgICBpZiAoc2VydmVyUG1bSW50ZXJuYWxDb250cmFjdC5QYXJhbWV0ZXJJZC5JbnZhbGlkQWdnRmllbGROYW1lXSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludmFsaWRBZ2dyZWdhdGlvbkZpZWxkTmFtZSwgc2VydmVyUG1bSW50ZXJuYWxDb250cmFjdC5QYXJhbWV0ZXJJZC5JbnZhbGlkQWdnRmllbGROYW1lXSk7XG4gICAgfVxuICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5TZXJ2ZXJFcnJvciwgJ1NlcnZlciBFcnJvcicpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXJyb3JDb2RlcywgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQXBpU2hvd0RhdGFUYWJsZUZvcm1hdCxcbiAgRGF0YVRhYmxlIGFzIERhdGFUYWJsZUludGVybmFsQ29udHJhY3QsXG4gIERhdGFUYWJsZVJlYWRlciBhcyBEYXRhVGFibGVSZWFkZXJJbnRlcm5hbENvbnRyYWN0LFxuICBFeGVjdXRlUGFyYW1ldGVycyxcbiAgSGlnaGxpZ2h0ZWRNYXJrc1RhYmxlLFxuICBQYXJhbWV0ZXJJZCxcbiAgU2VsZWN0ZWRNYXJrc1RhYmxlLFxuICBVbmRlcmx5aW5nRGF0YVRhYmxlLFxuICBWZXJiSWQsXG4gIFZpc3VhbElkLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgdjQgYXMgdXVpZHY0IH0gZnJvbSAndXVpZCc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi8uLi8uLi9BcGlTaGFyZWQnO1xuaW1wb3J0IHsgRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzIH0gZnJvbSAnLi4vLi4vRW51bU1hcHBpbmdzL0V4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyc7XG5pbXBvcnQgeyBDb2x1bW4sIERhdGFUYWJsZSwgTWFya0luZm8gfSBmcm9tICcuLi8uLi9Nb2RlbHMvR2V0RGF0YU1vZGVscyc7XG5pbXBvcnQgeyBEYXRhVGFibGVSZWFkZXIgfSBmcm9tICcuLi8uLi9Nb2RlbHMvR2V0RGF0YVRhYmxlUmVhZGVyTW9kZWxzJztcbmltcG9ydCB7IERhdGFWYWx1ZUZhY3RvcnkgfSBmcm9tICcuLi8uLi9VdGlscy9EYXRhVmFsdWVGYWN0b3J5JztcbmltcG9ydCB7IEdldERhdGFTZXJ2aWNlLCBHZXREYXRhVHlwZSB9IGZyb20gJy4uL0dldERhdGFTZXJ2aWNlJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBHZXREYXRhU2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBHZXREYXRhU2VydmljZSB7XG4gIC8vIFRoZSBleHRlbnNpb24vZW1iZWRkaW5nIGluc3RhbmNlIHVzZXMgdGhlIHNhbWUgY2FjaGUgZm9yIGFsbCBEYXRhVGFibGVSZWFkZXJzLlxuICBwcml2YXRlIHZpZXdEYXRhVGFibGVDYWNoZUlkOiBzdHJpbmcgPSB1dWlkdjQoKTtcblxuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5HZXREYXRhO1xuICB9XG5cbiAgcHVibGljIGdldE1heFJvd0xpbWl0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIDEwMDAwO1xuICB9XG5cbiAgcHVibGljIGdldFZpZXdEYXRhVGFibGVDYWNoZUlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudmlld0RhdGFUYWJsZUNhY2hlSWQ7XG4gIH1cblxuICBwcml2YXRlIGdldExpbWl0ZWRNYXhSb3dzKHJlcXVlc3RlZFJvd3M6IG51bWJlciwgcm93Q291bnRMaW1pdDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gcmVxdWVzdGVkUm93cyA+IDAgJiYgcmVxdWVzdGVkUm93cyA8IHJvd0NvdW50TGltaXQgPyByZXF1ZXN0ZWRSb3dzIDogcm93Q291bnRMaW1pdDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmRlcmx5aW5nRGF0YUFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBnZXRUeXBlOiBHZXREYXRhVHlwZSxcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIGlnbm9yZVNlbGVjdGlvbjogYm9vbGVhbixcbiAgICBpbmNsdWRlQWxsQ29sdW1uczogYm9vbGVhbixcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogQXJyYXk8c3RyaW5nPixcbiAgICBtYXhSb3dzOiBudW1iZXIsXG4gICAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb246IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICAgIGFwcGx5V29ya3NoZWV0Rm9ybWF0dGluZzogYm9vbGVhbixcbiAgKTogUHJvbWlzZTxEYXRhVGFibGU+IHtcbiAgICAvLyBDcmVhdGUgYWxsIG9mIG91ciBwYXJhbWV0ZXJzXG4gICAgY29uc3Qgc3VtbWFyeURhdGEgPSBnZXRUeXBlID09PSBHZXREYXRhVHlwZS5TdW1tYXJ5O1xuICAgIGNvbnN0IGZ1bmN0aW9uTmFtZSA9IHN1bW1hcnlEYXRhID8gJ2dldFN1bW1hcnlEYXRhQXN5bmMnIDogJ2dldFVuZGVybHlpbmdEYXRhQXN5bmMnO1xuICAgIGNvbnN0IHZlcmIgPSBzdW1tYXJ5RGF0YSA/IFZlcmJJZC5HZXREYXRhU3VtbWFyeURhdGEgOiBWZXJiSWQuR2V0VW5kZXJseWluZ0RhdGE7XG4gICAgY29uc3QgcmVxdWVzdE1heFJvd3MgPSB2ZXJiID09PSBWZXJiSWQuR2V0VW5kZXJseWluZ0RhdGEgPyB0aGlzLmdldExpbWl0ZWRNYXhSb3dzKG1heFJvd3MsIHRoaXMuZ2V0TWF4Um93TGltaXQoKSArIDEpIDogbWF4Um93cztcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiBmdW5jdGlvbk5hbWUsXG4gICAgfTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlZpc3VhbElkXSA9IHZpc3VhbElkO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuSWdub3JlQWxpYXNlc10gPSBpZ25vcmVBbGlhc2VzO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuSWdub3JlU2VsZWN0aW9uXSA9IGlnbm9yZVNlbGVjdGlvbjtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkluY2x1ZGVBbGxDb2x1bW5zXSA9IGluY2x1ZGVBbGxDb2x1bW5zO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuQ29sdW1uc1RvSW5jbHVkZUJ5SWRdID0gdGhpcy52ZXJpZnlJbmNsdWRlQ29sdW1uQXJyYXkoY29sdW1uc1RvSW5jbHVkZUJ5SWQpO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuTWF4Um93c10gPSByZXF1ZXN0TWF4Um93cztcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlNob3dEYXRhVGFibGVGb3JtYXRdID0gRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzLnNob3dEYXRhVGFibGVGb3JtYXRUeXBlLmNvbnZlcnQoaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24pO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuQXBwbHlXb3Jrc2hlZXRGb3JtYXR0aW5nXSA9IGFwcGx5V29ya3NoZWV0Rm9ybWF0dGluZztcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxEYXRhVGFibGU+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gcmVzcG9uc2UucmVzdWx0IGFzIFVuZGVybHlpbmdEYXRhVGFibGU7XG4gICAgICByZXR1cm4gdGhpcy5wcm9jZXNzUmVzdWx0c1RhYmxlKHJlc3BvbnNlRGF0YS5kYXRhLCByZXNwb25zZURhdGEuaXNTdW1tYXJ5KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTdW1tYXJ5RGF0YVJlYWRlckFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBwYWdlUm93Q291bnQ6IG51bWJlcixcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIGlnbm9yZVNlbGVjdGlvbjogYm9vbGVhbixcbiAgICBpbmNsdWRlQWxsQ29sdW1uczogYm9vbGVhbixcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogQXJyYXk8c3RyaW5nPixcbiAgICBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gICAgYXBwbHlXb3Jrc2hlZXRGb3JtYXR0aW5nOiBib29sZWFuLFxuICApOiBQcm9taXNlPERhdGFUYWJsZVJlYWRlcj4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRTdW1tYXJ5RGF0YVJlYWRlckFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaWV3RGF0YVRhYmxlQ2FjaGVJZF06IHRoaXMuZ2V0Vmlld0RhdGFUYWJsZUNhY2hlSWQoKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkLFxuICAgICAgW1BhcmFtZXRlcklkLlBhZ2VSb3dDb3VudF06IHBhZ2VSb3dDb3VudCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5JZ25vcmVBbGlhc2VzXTogaWdub3JlQWxpYXNlcyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5JZ25vcmVTZWxlY3Rpb25dOiBpZ25vcmVTZWxlY3Rpb24sXG4gICAgICBbUGFyYW1ldGVySWQuSW5jbHVkZUFsbENvbHVtbnNdOiBpbmNsdWRlQWxsQ29sdW1ucyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Db2x1bW5zVG9JbmNsdWRlQnlJZF06IHRoaXMudmVyaWZ5SW5jbHVkZUNvbHVtbkFycmF5KGNvbHVtbnNUb0luY2x1ZGVCeUlkKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TaG93RGF0YVRhYmxlRm9ybWF0XTogRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzLnNob3dEYXRhVGFibGVGb3JtYXRUeXBlLmNvbnZlcnQoaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24pLFxuICAgICAgW1BhcmFtZXRlcklkLkFwcGx5V29ya3NoZWV0Rm9ybWF0dGluZ106IGFwcGx5V29ya3NoZWV0Rm9ybWF0dGluZyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0RGF0YVN1bW1hcnlEYXRhUmVhZGVyLCBwYXJhbWV0ZXJzKS50aGVuPERhdGFUYWJsZVJlYWRlcj4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZURhdGEgPSByZXNwb25zZS5yZXN1bHQgYXMgRGF0YVRhYmxlUmVhZGVySW50ZXJuYWxDb250cmFjdDtcblxuICAgICAgcmV0dXJuIG5ldyBEYXRhVGFibGVSZWFkZXIocmVzcG9uc2VEYXRhLmlkLCByZXNwb25zZURhdGEudG90YWxSb3dDb3VudCwgcGFnZVJvd0NvdW50LCB0aGlzLl9yZWdpc3RyeUlkKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTdW1tYXJ5Q29sdW1uc0luZm9Bc3luYyh2aXN1YWxJZDogVmlzdWFsSWQpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkNvbHVtbj4+IHtcbiAgICAvLyBDcmVhdGUgYWxsIHRoZSBwYXJhbWV0ZXJzIGZvciBHZXREYXRhVHlwZSBvZiBTdW1tYXJ5IHdpdGggMSByb3csIGFuZCBvbmx5IG5hdGl2ZSB2YWx1ZXNcbiAgICAvLyBUaGVuIHJldHVybiBqdXN0IHRoZSBjb2x1bW5zXG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5HZXREYXRhU3VtbWFyeURhdGE7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldFN1bW1hcnlDb2x1bW5zSW5mb0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkLFxuICAgICAgW1BhcmFtZXRlcklkLklnbm9yZUFsaWFzZXNdOiB0cnVlLFxuICAgICAgW1BhcmFtZXRlcklkLklnbm9yZVNlbGVjdGlvbl06IHRydWUsXG4gICAgICBbUGFyYW1ldGVySWQuSW5jbHVkZUFsbENvbHVtbnNdOiB0cnVlLFxuICAgICAgW1BhcmFtZXRlcklkLk1heFJvd3NdOiAxLFxuICAgICAgW1BhcmFtZXRlcklkLlNob3dEYXRhVGFibGVGb3JtYXRdOiBBcGlTaG93RGF0YVRhYmxlRm9ybWF0Lk5hdGl2ZVZhbHVlc09ubHksXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxBcnJheTxDb250cmFjdC5Db2x1bW4+PigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHVuZGVybHlpbmdEYXRhVGFibGUgPSByZXNwb25zZS5yZXN1bHQgYXMgVW5kZXJseWluZ0RhdGFUYWJsZTtcbiAgICAgIGNvbnN0IGRhdGFUYWJsZSA9IHVuZGVybHlpbmdEYXRhVGFibGUuZGF0YTtcbiAgICAgIGNvbnN0IGNvbHVtbnMgPSBkYXRhVGFibGUuaGVhZGVycy5tYXAoKGgpID0+IG5ldyBDb2x1bW4oaC5maWVsZENhcHRpb24sIGguZmllbGROYW1lLCBoLmRhdGFUeXBlLCBoLmlzUmVmZXJlbmNlZCwgaC5pbmRleCkpO1xuICAgICAgcmV0dXJuIGNvbHVtbnM7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2VsZWN0ZWRNYXJrc0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8Q29udHJhY3QuTWFya3NDb2xsZWN0aW9uPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldFNlbGVjdGVkTWFya3NBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldFNlbGVjdGVkTWFya3MsIHBhcmFtZXRlcnMpLnRoZW48Q29udHJhY3QuTWFya3NDb2xsZWN0aW9uPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9IHJlc3BvbnNlLnJlc3VsdCBhcyBTZWxlY3RlZE1hcmtzVGFibGU7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXRhOiByZXNwb25zZURhdGEuZGF0YS5tYXAoKHRhYmxlKSA9PiB0aGlzLnByb2Nlc3NSZXN1bHRzVGFibGUodGFibGUsIHRydWUpKSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0SGlnaGxpZ2h0ZWRNYXJrc0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8Q29udHJhY3QuTWFya3NDb2xsZWN0aW9uPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldEhpZ2hsaWdodGVkTWFya3NBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldEhpZ2hsaWdodGVkTWFya3MsIHBhcmFtZXRlcnMpLnRoZW48Q29udHJhY3QuTWFya3NDb2xsZWN0aW9uPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9IHJlc3BvbnNlLnJlc3VsdCBhcyBIaWdobGlnaHRlZE1hcmtzVGFibGU7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXRhOiByZXNwb25zZURhdGEuZGF0YS5tYXAoKHRhYmxlKSA9PiB0aGlzLnByb2Nlc3NSZXN1bHRzVGFibGUodGFibGUsIHRydWUpKSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RGF0YVNvdXJjZURhdGFBc3luYyhcbiAgICBkYXRhU291cmNlSWQ6IHN0cmluZyxcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIG1heFJvd3M6IG51bWJlcixcbiAgICBjb2x1bW5zVG9JbmNsdWRlOiBBcnJheTxzdHJpbmc+LFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uOiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgKTogUHJvbWlzZTxEYXRhVGFibGU+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0RGF0YVNvdXJjZURhdGFBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuRGF0YVNvdXJjZUlkXTogZGF0YVNvdXJjZUlkLFxuICAgICAgW1BhcmFtZXRlcklkLklnbm9yZUFsaWFzZXNdOiBpZ25vcmVBbGlhc2VzLFxuICAgICAgW1BhcmFtZXRlcklkLk1heFJvd3NdOiB0aGlzLmdldExpbWl0ZWRNYXhSb3dzKG1heFJvd3MsIHRoaXMuZ2V0TWF4Um93TGltaXQoKSArIDEpLFxuICAgICAgW1BhcmFtZXRlcklkLkNvbHVtbnNUb0luY2x1ZGVdOiB0aGlzLnZlcmlmeUluY2x1ZGVDb2x1bW5BcnJheShjb2x1bW5zVG9JbmNsdWRlKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Db2x1bW5zVG9JbmNsdWRlQnlJZF06IHRoaXMudmVyaWZ5SW5jbHVkZUNvbHVtbkFycmF5KGNvbHVtbnNUb0luY2x1ZGVCeUlkKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TaG93RGF0YVRhYmxlRm9ybWF0XTogRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzLnNob3dEYXRhVGFibGVGb3JtYXRUeXBlLmNvbnZlcnQoaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24pLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXREYXRhU291cmNlRGF0YSwgcGFyYW1ldGVycykudGhlbjxEYXRhVGFibGU+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gcmVzcG9uc2UucmVzdWx0IGFzIFVuZGVybHlpbmdEYXRhVGFibGU7XG4gICAgICByZXR1cm4gdGhpcy5wcm9jZXNzUmVzdWx0c1RhYmxlKHJlc3BvbnNlRGF0YS5kYXRhLCBmYWxzZSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TG9naWNhbFRhYmxlRGF0YUFzeW5jKFxuICAgIGRhdGFzb3VyY2VJZDogc3RyaW5nLFxuICAgIGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsXG4gICAgaWdub3JlQWxpYXNlczogYm9vbGVhbixcbiAgICBtYXhSb3dzOiBudW1iZXIsXG4gICAgY29sdW1uc1RvSW5jbHVkZTogQXJyYXk8c3RyaW5nPixcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogQXJyYXk8c3RyaW5nPixcbiAgICBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gICk6IFByb21pc2U8RGF0YVRhYmxlPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldExvZ2ljYWxUYWJsZURhdGFBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuQ29sdW1uc1RvSW5jbHVkZV06IGNvbHVtbnNUb0luY2x1ZGUsXG4gICAgICBbUGFyYW1ldGVySWQuQ29sdW1uc1RvSW5jbHVkZUJ5SWRdOiB0aGlzLnZlcmlmeUluY2x1ZGVDb2x1bW5BcnJheShjb2x1bW5zVG9JbmNsdWRlQnlJZCksXG4gICAgICBbUGFyYW1ldGVySWQuRGF0YVNvdXJjZUlkXTogZGF0YXNvdXJjZUlkLFxuICAgICAgW1BhcmFtZXRlcklkLklnbm9yZUFsaWFzZXNdOiBpZ25vcmVBbGlhc2VzLFxuICAgICAgW1BhcmFtZXRlcklkLkxvZ2ljYWxUYWJsZUlkXTogbG9naWNhbFRhYmxlSWQsXG4gICAgICBbUGFyYW1ldGVySWQuTWF4Um93c106IHRoaXMuZ2V0TGltaXRlZE1heFJvd3MobWF4Um93cywgdGhpcy5nZXRNYXhSb3dMaW1pdCgpICsgMSksXG4gICAgICBbUGFyYW1ldGVySWQuU2hvd0RhdGFUYWJsZUZvcm1hdF06IEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncy5zaG93RGF0YVRhYmxlRm9ybWF0VHlwZS5jb252ZXJ0KGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uKSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0TG9naWNhbFRhYmxlRGF0YSwgcGFyYW1ldGVycykudGhlbjxEYXRhVGFibGU+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gcmVzcG9uc2UucmVzdWx0IGFzIFVuZGVybHlpbmdEYXRhVGFibGU7XG4gICAgICByZXR1cm4gdGhpcy5wcm9jZXNzUmVzdWx0c1RhYmxlKHJlc3BvbnNlRGF0YS5kYXRhLCBmYWxzZSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TG9naWNhbFRhYmxlRGF0YVJlYWRlckFzeW5jKFxuICAgIGRhdGFzb3VyY2VJZDogc3RyaW5nLFxuICAgIGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsXG4gICAgcGFnZVJvd0NvdW50OiBudW1iZXIsXG4gICAgaWdub3JlQWxpYXNlczogYm9vbGVhbixcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogQXJyYXk8c3RyaW5nPixcbiAgICBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gICk6IFByb21pc2U8RGF0YVRhYmxlUmVhZGVyPiB7XG4gICAgcGFnZVJvd0NvdW50ID0gdGhpcy5nZXRMaW1pdGVkTWF4Um93cyhwYWdlUm93Q291bnQsIHRoaXMuZ2V0TWF4Um93TGltaXQoKSk7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldExvZ2ljYWxUYWJsZURhdGFSZWFkZXJBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlld0RhdGFUYWJsZUNhY2hlSWRdOiB0aGlzLmdldFZpZXdEYXRhVGFibGVDYWNoZUlkKCksXG4gICAgICBbUGFyYW1ldGVySWQuRGF0YVNvdXJjZUlkXTogZGF0YXNvdXJjZUlkLFxuICAgICAgW1BhcmFtZXRlcklkLkxvZ2ljYWxUYWJsZUlkXTogbG9naWNhbFRhYmxlSWQsXG4gICAgICBbUGFyYW1ldGVySWQuUGFnZVJvd0NvdW50XTogcGFnZVJvd0NvdW50LFxuICAgICAgW1BhcmFtZXRlcklkLklnbm9yZUFsaWFzZXNdOiBpZ25vcmVBbGlhc2VzLFxuICAgICAgW1BhcmFtZXRlcklkLkNvbHVtbnNUb0luY2x1ZGVCeUlkXTogdGhpcy52ZXJpZnlJbmNsdWRlQ29sdW1uQXJyYXkoY29sdW1uc1RvSW5jbHVkZUJ5SWQpLFxuICAgICAgW1BhcmFtZXRlcklkLlNob3dEYXRhVGFibGVGb3JtYXRdOiBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3Muc2hvd0RhdGFUYWJsZUZvcm1hdFR5cGUuY29udmVydChpbmNsdWRlRGF0YVZhbHVlc09wdGlvbiksXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldExvZ2ljYWxUYWJsZURhdGFSZWFkZXIsIHBhcmFtZXRlcnMpLnRoZW48RGF0YVRhYmxlUmVhZGVyPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9IHJlc3BvbnNlLnJlc3VsdCBhcyBEYXRhVGFibGVSZWFkZXJJbnRlcm5hbENvbnRyYWN0O1xuXG4gICAgICByZXR1cm4gbmV3IERhdGFUYWJsZVJlYWRlcihyZXNwb25zZURhdGEuaWQsIHJlc3BvbnNlRGF0YS50b3RhbFJvd0NvdW50LCBwYWdlUm93Q291bnQsIHRoaXMuX3JlZ2lzdHJ5SWQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldFVuZGVybHlpbmdUYWJsZURhdGFBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgbG9naWNhbFRhYmxlSWQ6IHN0cmluZyxcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIGlnbm9yZVNlbGVjdGlvbjogYm9vbGVhbixcbiAgICBpbmNsdWRlQWxsQ29sdW1uczogYm9vbGVhbixcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogQXJyYXk8c3RyaW5nPixcbiAgICBtYXhSb3dzOiBudW1iZXIsXG4gICAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb246IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICAgIGFwcGx5V29ya3NoZWV0Rm9ybWF0dGluZzogYm9vbGVhbixcbiAgKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0VW5kZXJseWluZ1RhYmxlRGF0YUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkLFxuICAgICAgW1BhcmFtZXRlcklkLkxvZ2ljYWxUYWJsZUlkXTogbG9naWNhbFRhYmxlSWQsXG4gICAgICBbUGFyYW1ldGVySWQuSWdub3JlQWxpYXNlc106IGlnbm9yZUFsaWFzZXMsXG4gICAgICBbUGFyYW1ldGVySWQuSWdub3JlU2VsZWN0aW9uXTogaWdub3JlU2VsZWN0aW9uLFxuICAgICAgW1BhcmFtZXRlcklkLkluY2x1ZGVBbGxDb2x1bW5zXTogaW5jbHVkZUFsbENvbHVtbnMsXG4gICAgICBbUGFyYW1ldGVySWQuQ29sdW1uc1RvSW5jbHVkZUJ5SWRdOiB0aGlzLnZlcmlmeUluY2x1ZGVDb2x1bW5BcnJheShjb2x1bW5zVG9JbmNsdWRlQnlJZCksXG4gICAgICBbUGFyYW1ldGVySWQuTWF4Um93c106IHRoaXMuZ2V0TGltaXRlZE1heFJvd3MobWF4Um93cywgdGhpcy5nZXRNYXhSb3dMaW1pdCgpICsgMSksXG4gICAgICBbUGFyYW1ldGVySWQuU2hvd0RhdGFUYWJsZUZvcm1hdF06IEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncy5zaG93RGF0YVRhYmxlRm9ybWF0VHlwZS5jb252ZXJ0KGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5BcHBseVdvcmtzaGVldEZvcm1hdHRpbmddOiBhcHBseVdvcmtzaGVldEZvcm1hdHRpbmcsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldFVuZGVybHlpbmdUYWJsZURhdGEsIHBhcmFtZXRlcnMpLnRoZW48RGF0YVRhYmxlPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9IHJlc3BvbnNlLnJlc3VsdCBhcyBVbmRlcmx5aW5nRGF0YVRhYmxlO1xuICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc1Jlc3VsdHNUYWJsZShyZXNwb25zZURhdGEuZGF0YSwgZmFsc2UpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldFVuZGVybHlpbmdUYWJsZURhdGFSZWFkZXJBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgbG9naWNhbFRhYmxlSWQ6IHN0cmluZyxcbiAgICBwYWdlUm93Q291bnQ6IG51bWJlcixcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIGlnbm9yZVNlbGVjdGlvbjogYm9vbGVhbixcbiAgICBpbmNsdWRlQWxsQ29sdW1uczogYm9vbGVhbixcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogQXJyYXk8c3RyaW5nPixcbiAgICBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gICAgYXBwbHlXb3Jrc2hlZXRGb3JtYXR0aW5nOiBib29sZWFuLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZVJlYWRlcj4ge1xuICAgIHBhZ2VSb3dDb3VudCA9IHRoaXMuZ2V0TGltaXRlZE1heFJvd3MocGFnZVJvd0NvdW50LCB0aGlzLmdldE1heFJvd0xpbWl0KCkpO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRVbmRlcmx5aW5nVGFibGVEYXRhUmVhZGVyQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpZXdEYXRhVGFibGVDYWNoZUlkXTogdGhpcy5nZXRWaWV3RGF0YVRhYmxlQ2FjaGVJZCgpLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQsXG4gICAgICBbUGFyYW1ldGVySWQuTG9naWNhbFRhYmxlSWRdOiBsb2dpY2FsVGFibGVJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5JZ25vcmVBbGlhc2VzXTogaWdub3JlQWxpYXNlcyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5JZ25vcmVTZWxlY3Rpb25dOiBpZ25vcmVTZWxlY3Rpb24sXG4gICAgICBbUGFyYW1ldGVySWQuSW5jbHVkZUFsbENvbHVtbnNdOiBpbmNsdWRlQWxsQ29sdW1ucyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Db2x1bW5zVG9JbmNsdWRlQnlJZF06IHRoaXMudmVyaWZ5SW5jbHVkZUNvbHVtbkFycmF5KGNvbHVtbnNUb0luY2x1ZGVCeUlkKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TaG93RGF0YVRhYmxlRm9ybWF0XTogRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzLnNob3dEYXRhVGFibGVGb3JtYXRUeXBlLmNvbnZlcnQoaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24pLFxuICAgICAgW1BhcmFtZXRlcklkLlBhZ2VSb3dDb3VudF06IHBhZ2VSb3dDb3VudCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5BcHBseVdvcmtzaGVldEZvcm1hdHRpbmddOiBhcHBseVdvcmtzaGVldEZvcm1hdHRpbmcsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldFVuZGVybHlpbmdUYWJsZURhdGFSZWFkZXIsIHBhcmFtZXRlcnMpLnRoZW48RGF0YVRhYmxlUmVhZGVyPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9IHJlc3BvbnNlLnJlc3VsdCBhcyBEYXRhVGFibGVSZWFkZXJJbnRlcm5hbENvbnRyYWN0O1xuXG4gICAgICByZXR1cm4gbmV3IERhdGFUYWJsZVJlYWRlcihyZXNwb25zZURhdGEuaWQsIHJlc3BvbnNlRGF0YS50b3RhbFJvd0NvdW50LCBwYWdlUm93Q291bnQsIHRoaXMuX3JlZ2lzdHJ5SWQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgc3VtbWFyeVRhYmxlSWQgPSAnJztcblxuICBwdWJsaWMgZ2V0UGFnZUFzeW5jKHRhYmxlSWQ6IHN0cmluZywgcGFnZU51bWJlcjogbnVtYmVyLCBwYWdlU2l6ZTogbnVtYmVyKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0UGFnZUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaWV3RGF0YVRhYmxlQ2FjaGVJZF06IHRoaXMuZ2V0Vmlld0RhdGFUYWJsZUNhY2hlSWQoKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaWV3RGF0YVRhYmxlSWRdOiB0YWJsZUlkLFxuICAgICAgW1BhcmFtZXRlcklkLkRhdGFSb3dJbmRleF06IHBhZ2VOdW1iZXIgKiBwYWdlU2l6ZSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0RGF0YVRhYmxlUmVhZGVyUGFnZSwgcGFyYW1ldGVycykudGhlbjxEYXRhVGFibGU+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gcmVzcG9uc2UucmVzdWx0IGFzIERhdGFUYWJsZUludGVybmFsQ29udHJhY3Q7XG4gICAgICByZXR1cm4gdGhpcy5wcm9jZXNzUmVzdWx0c1BhZ2UocmVzcG9uc2VEYXRhLCB0YWJsZUlkID09PSBHZXREYXRhU2VydmljZUltcGwuc3VtbWFyeVRhYmxlSWQgPyB0cnVlIDogZmFsc2UpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHJlbGVhc2VBc3luYyh0YWJsZUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAncmVsZWFzZScsXG4gICAgICBbUGFyYW1ldGVySWQuVmlld0RhdGFUYWJsZUNhY2hlSWRdOiB0aGlzLmdldFZpZXdEYXRhVGFibGVDYWNoZUlkKCksXG4gICAgICBbUGFyYW1ldGVySWQuVmlld0RhdGFUYWJsZUlkXTogdGFibGVJZCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuUmVsZWFzZURhdGFUYWJsZVJlYWRlciwgcGFyYW1ldGVycykudGhlbjx2b2lkPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdmVyaWZ5SW5jbHVkZUNvbHVtbkFycmF5KGNvbHVtbnM6IEFycmF5PHN0cmluZz4pOiBBcnJheTxzdHJpbmc+IHtcbiAgICAvLyBjb2x1bW5zIG11c3QgYmUgYSB2YWxpZCBhcnJheVxuICAgIGlmICghQXJyYXkuaXNBcnJheShjb2x1bW5zKSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsICdjb2x1bW5zVG9JbmNsdWRlIGFuZCBjb2x1bW5zVG9JbmNsdWRlQnlJZCBtdXN0IGJlIHZhbGlkIGFycmF5cycpO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSBhbnkgZHVwbGljYXRlcyBmcm9tIHRoZSBpbnB1dCBhcnJheVxuICAgIGNvbnN0IGNvbHVtbnNBc1NldDogU2V0PHN0cmluZz4gPSBuZXcgU2V0KGNvbHVtbnMpO1xuICAgIHJldHVybiBBcnJheS5mcm9tKGNvbHVtbnNBc1NldCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcHJvY2Vzc1Jlc3VsdHNUYWJsZShyZXNwb25zZURhdGE6IERhdGFUYWJsZUludGVybmFsQ29udHJhY3QsIGlzU3VtbWFyeTogYm9vbGVhbik6IERhdGFUYWJsZSB7XG4gICAgY29uc3QgaGVhZGVycyA9IHJlc3BvbnNlRGF0YS5oZWFkZXJzLm1hcCgoaCkgPT4gbmV3IENvbHVtbihoLmZpZWxkQ2FwdGlvbiwgaC5maWVsZE5hbWUsIGguZGF0YVR5cGUsIGguaXNSZWZlcmVuY2VkLCBoLmluZGV4KSk7XG5cbiAgICAvLyBUT0RPIFRoaXMgc2hvdWxkIGJlIGNvbnRyb2xsZWQgYnkgYSBmbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGlzIGFwaSB3aWxsIHJlc3BvbmQgbWFya3MgaW5mbyBvciBub3RcbiAgICBsZXQgbWFya3M7XG4gICAgaWYgKHJlc3BvbnNlRGF0YS5tYXJrcykge1xuICAgICAgbWFya3MgPSByZXNwb25zZURhdGEubWFya3MubWFwKChoKSA9PiBuZXcgTWFya0luZm8oaC50eXBlLCBoLmNvbG9yLCBoLnR1cGxlSWQpKTtcbiAgICB9XG5cbiAgICAvLyBMaW1pdCsxIGlzIG91ciBzZW50aW5hbCB0aGF0IHVuZGVybHlpbmcgZGF0YSBjb250YWlucyBtb3JlIHJvd3MgdGhhbiB1c2VyIGlzIGFsbG93ZWQgdG8gZmV0Y2guXG4gICAgLy8gUmVtb3ZlIHRoZSBsYXN0IGVsZW1lbnQgc28gd2UgYWx3YXlzIHJldHVybiBNYXhSb3dMaW1pdFxuICAgIGNvbnN0IGlzVG90YWxSb3dDb3VudExpbWl0ZWQgPSBpc1N1bW1hcnkgPT09IGZhbHNlICYmIHJlc3BvbnNlRGF0YS5kYXRhVGFibGUubGVuZ3RoID09PSB0aGlzLmdldE1heFJvd0xpbWl0KCkgKyAxO1xuICAgIGlmIChpc1RvdGFsUm93Q291bnRMaW1pdGVkKSB7XG4gICAgICByZXNwb25zZURhdGEuZGF0YVRhYmxlLmxlbmd0aCAtPSAxO1xuICAgIH1cblxuICAgIGNvbnN0IHRhYmxlID0gcmVzcG9uc2VEYXRhLmRhdGFUYWJsZS5tYXAoKHJvdykgPT4ge1xuICAgICAgcmV0dXJuIHJvdy5tYXAoKGNlbGwsIGluZGV4KSA9PiB7XG4gICAgICAgIHJldHVybiBEYXRhVmFsdWVGYWN0b3J5Lk1ha2VUYWJsZURhdGFWYWx1ZShjZWxsLCBoZWFkZXJzW2luZGV4XS5kYXRhVHlwZSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGlmIChtYXJrcykge1xuICAgICAgcmV0dXJuIG5ldyBEYXRhVGFibGUodGFibGUsIGhlYWRlcnMsIHRhYmxlLmxlbmd0aCwgaXNUb3RhbFJvd0NvdW50TGltaXRlZCwgaXNTdW1tYXJ5LCBtYXJrcyk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRGF0YVRhYmxlKHRhYmxlLCBoZWFkZXJzLCB0YWJsZS5sZW5ndGgsIGlzVG90YWxSb3dDb3VudExpbWl0ZWQsIGlzU3VtbWFyeSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcHJvY2Vzc1Jlc3VsdHNQYWdlKHJlc3BvbnNlRGF0YTogRGF0YVRhYmxlSW50ZXJuYWxDb250cmFjdCwgaXNTdW1tYXJ5OiBib29sZWFuKTogRGF0YVRhYmxlIHtcbiAgICBjb25zdCBoZWFkZXJzID0gcmVzcG9uc2VEYXRhLmhlYWRlcnMubWFwKChoKSA9PiBuZXcgQ29sdW1uKGguZmllbGRDYXB0aW9uLCBoLmZpZWxkTmFtZSwgaC5kYXRhVHlwZSwgaC5pc1JlZmVyZW5jZWQsIGguaW5kZXgpKTtcblxuICAgIGxldCBtYXJrcztcbiAgICBpZiAocmVzcG9uc2VEYXRhLm1hcmtzKSB7XG4gICAgICBtYXJrcyA9IHJlc3BvbnNlRGF0YS5tYXJrcy5tYXAoKGgpID0+IG5ldyBNYXJrSW5mbyhoLnR5cGUsIGguY29sb3IsIGgudHVwbGVJZCkpO1xuICAgIH1cblxuICAgIGNvbnN0IHRhYmxlID0gcmVzcG9uc2VEYXRhLmRhdGFUYWJsZS5tYXAoKHJvdykgPT4ge1xuICAgICAgcmV0dXJuIHJvdy5tYXAoKGNlbGwsIGluZGV4KSA9PiB7XG4gICAgICAgIHJldHVybiBEYXRhVmFsdWVGYWN0b3J5Lk1ha2VUYWJsZURhdGFWYWx1ZShjZWxsLCBoZWFkZXJzW2luZGV4XS5kYXRhVHlwZSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGlmIChtYXJrcykge1xuICAgICAgcmV0dXJuIG5ldyBEYXRhVGFibGUodGFibGUsIGhlYWRlcnMsIHRhYmxlLmxlbmd0aCwgZmFsc2UsIGlzU3VtbWFyeSwgbWFya3MpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IERhdGFUYWJsZSh0YWJsZSwgaGVhZGVycywgdGFibGUubGVuZ3RoLCBmYWxzZSwgaXNTdW1tYXJ5KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTm90aWZpY2F0aW9uU2VydmljZSB9IGZyb20gJy4uL05vdGlmaWNhdGlvblNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IE5vdGlmaWNhdGlvblNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vTm90aWZpY2F0aW9uU2VydmljZUltcGxCYXNlJztcblxuZXhwb3J0IGNsYXNzIE5vdGlmaWNhdGlvblNlcnZpY2VJbXBsIGV4dGVuZHMgTm90aWZpY2F0aW9uU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgTm90aWZpY2F0aW9uU2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLk5vdGlmaWNhdGlvbjtcbiAgfVxufVxuIiwiaW1wb3J0IHsgSW50ZXJuYWxBcGlEaXNwYXRjaGVyLCBNb2RlbCwgTm90aWZpY2F0aW9uLCBOb3RpZmljYXRpb25JZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBVbnJlZ2lzdGVyRm4gfSBmcm9tICcuLi9Ob3RpZmljYXRpb25TZXJ2aWNlJztcblxuZXhwb3J0IGNsYXNzIFJlZ2lzdHJhdGlvbiB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9maWx0ZXJGbjogKG5vdGlmaWNhdGlvbk1vZGVsOiBNb2RlbCkgPT4gYm9vbGVhbiwgcHJpdmF0ZSBfY2FsbGJhY2tGbjogKG5vdGlmaWNhdGlvbk1vZGVsOiBNb2RlbCkgPT4gdm9pZCkge1xuICAgIC8vIE5vdGhpbmcgSGVyZVxuICB9XG5cbiAgcHVibGljIG9uTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbk1vZGVsOiBNb2RlbCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9maWx0ZXJGbihub3RpZmljYXRpb25Nb2RlbCkpIHtcbiAgICAgIHRoaXMuX2NhbGxiYWNrRm4obm90aWZpY2F0aW9uTW9kZWwpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTm90aWZpY2F0aW9uU2VydmljZUltcGxCYXNlIHtcbiAgcHJpdmF0ZSBfaGFuZGxlcnM6IHsgW25vdGlmaWNhdGlvbklkOiBzdHJpbmddOiBBcnJheTxSZWdpc3RyYXRpb24+IH07XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgZGlzcGF0Y2hlcjogSW50ZXJuYWxBcGlEaXNwYXRjaGVyKSB7XG4gICAgdGhpcy5faGFuZGxlcnMgPSB7fTtcbiAgICB0aGlzLmRpc3BhdGNoZXIucmVnaXN0ZXJOb3RpZmljYXRpb25IYW5kbGVyKHRoaXMub25Ob3RpZmljYXRpb24uYmluZCh0aGlzKSk7XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJIYW5kbGVyKGlkOiBOb3RpZmljYXRpb25JZCwgZmlsdGVyRm46IChtb2RlbDogTW9kZWwpID0+IGJvb2xlYW4sIGhhbmRsZXI6IChtb2RlbDogTW9kZWwpID0+IHZvaWQpOiBVbnJlZ2lzdGVyRm4ge1xuICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5faGFuZGxlcnNbaWRdIHx8IG5ldyBBcnJheTxSZWdpc3RyYXRpb24+KCk7XG4gICAgY29uc3QgcmVnaXN0cmF0aW9uID0gbmV3IFJlZ2lzdHJhdGlvbihmaWx0ZXJGbiwgaGFuZGxlcik7XG4gICAgaGFuZGxlcnMucHVzaChyZWdpc3RyYXRpb24pO1xuICAgIHRoaXMuX2hhbmRsZXJzW2lkXSA9IGhhbmRsZXJzO1xuICAgIHJldHVybiAoKSA9PiB0aGlzLnJlbW92ZVJlZ2lzdHJhdGlvbihpZCwgcmVnaXN0cmF0aW9uKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFzSGFuZGxlcnNGb3JOb3RpZmljYXRpb25UeXBlKGlkOiBOb3RpZmljYXRpb25JZCk6IGJvb2xlYW4ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICByZXR1cm4gdGhpcy5faGFuZGxlcnMuaGFzT3duUHJvcGVydHkoaWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBvbk5vdGlmaWNhdGlvbihub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbik6IHZvaWQge1xuICAgIGlmICghdGhpcy5oYXNIYW5kbGVyc0Zvck5vdGlmaWNhdGlvblR5cGUobm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbklkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEdvIHRocm91Z2ggYW5kIGNoZWNrIGZvciBhbGwgdGhlIGhhbmRsZXJzIG9mIHRoaXMgcGFydGljdWxhciBub3RpZmljYXRpb25cbiAgICB0aGlzLl9oYW5kbGVyc1tub3RpZmljYXRpb24ubm90aWZpY2F0aW9uSWRdLmZvckVhY2goKGgpID0+IGgub25Ob3RpZmljYXRpb24obm90aWZpY2F0aW9uLmRhdGEpKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlUmVnaXN0cmF0aW9uKGlkOiBOb3RpZmljYXRpb25JZCwgcmVnaXN0cmF0aW9uOiBSZWdpc3RyYXRpb24pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaGFzSGFuZGxlcnNGb3JOb3RpZmljYXRpb25UeXBlKGlkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2hhbmRsZXJzW2lkXSA9IHRoaXMuX2hhbmRsZXJzW2lkXS5maWx0ZXIoKHJlZykgPT4gcmVnICE9PSByZWdpc3RyYXRpb24pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBFcnJvckNvZGVzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBNb2RlbCwgUGFyYW1ldGVySWQsIFBhcmFtZXRlckluZm8sIFNoZWV0UGF0aCwgVmVyYklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFBhcmFtZXRlckltcGwgfSBmcm9tICcuLi8uLi9JbXBsL1BhcmFtZXRlckltcGwnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vLi4vVGFibGVhdUVycm9yJztcbmltcG9ydCB7IFBhcmFtZXRlcnNTZXJ2aWNlIH0gZnJvbSAnLi4vUGFyYW1ldGVyc1NlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vU2VydmljZUltcGxCYXNlJztcblxuZXhwb3J0IGNsYXNzIFBhcmFtZXRlcnNTZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIFBhcmFtZXRlcnNTZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTZXJ2aWNlTmFtZXMuUGFyYW1ldGVycztcbiAgfVxuXG4gIHB1YmxpYyBnZXRQYXJhbWV0ZXJzRm9yU2hlZXRBc3luYyhzaGVldFBhdGg6IFNoZWV0UGF0aCk6IFByb21pc2U8QXJyYXk8UGFyYW1ldGVySW1wbD4+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRQYXJhbWV0ZXJzRm9yU2hlZXRBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuU2hlZXRQYXRoXTogc2hlZXRQYXRoLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXJzQXN5bmMocGFyYW1ldGVycyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0QWxsUGFyYW1ldGVyc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8UGFyYW1ldGVySW1wbD4+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRQYXJhbWV0ZXJzRm9yU2hlZXRBc3luYycsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcnNBc3luYyhwYXJhbWV0ZXJzKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UGFyYW1ldGVyc0FzeW5jKGlucHV0UGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMpOiBQcm9taXNlPEFycmF5PFBhcmFtZXRlckltcGw+PiB7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0UGFyYW1ldGVyc0ZvclNoZWV0LCBpbnB1dFBhcmFtZXRlcnMpLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQgYXMgQXJyYXk8UGFyYW1ldGVySW5mbz47XG4gICAgICByZXR1cm4gcmVzdWx0Lm1hcCgocGFyYW1ldGVySW5mbykgPT4ge1xuICAgICAgICByZXR1cm4gbmV3IFBhcmFtZXRlckltcGwocGFyYW1ldGVySW5mbywgdGhpcy5fcmVnaXN0cnlJZCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBjaGFuZ2VQYXJhbWV0ZXJWYWx1ZUFzeW5jKGZpZWxkTmFtZTogc3RyaW5nLCBuZXdWYWx1ZTogc3RyaW5nKTogUHJvbWlzZTxQYXJhbWV0ZXJJbmZvPiB7XG4gICAgY29uc3QgcGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnY2hhbmdlUGFyYW1ldGVyVmFsdWVBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuUGFyYW1ldGVyRmllbGROYW1lXTogZmllbGROYW1lLFxuICAgICAgW1BhcmFtZXRlcklkLlBhcmFtZXRlclZhbHVlXTogbmV3VmFsdWUsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkNoYW5nZVBhcmFtZXRlclZhbHVlLCBwYXJhbWV0ZXJzKS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0IGFzIFBhcmFtZXRlckluZm87XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGZpbmRQYXJhbWV0ZXJCeU5hbWVBc3luYyhuYW1lOiBzdHJpbmcpOiBQcm9taXNlPFBhcmFtZXRlckltcGwgfCB1bmRlZmluZWQ+IHtcbiAgICByZXR1cm4gdGhpcy5maW5kUGFyYW1ldGVyQXN5bmMobmFtZSwgdW5kZWZpbmVkKTtcbiAgfVxuXG4gIHB1YmxpYyBmaW5kUGFyYW1ldGVyQnlHbG9iYWxGaWVsZE5hbWVBc3luYyhmaWVsZE5hbWU6IHN0cmluZyk6IFByb21pc2U8UGFyYW1ldGVySW1wbCB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiB0aGlzLmZpbmRQYXJhbWV0ZXJBc3luYyh1bmRlZmluZWQsIGZpZWxkTmFtZSk7XG4gIH1cblxuICBwcml2YXRlIGZpbmRQYXJhbWV0ZXJBc3luYyhuYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQsIGZpZWxkTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogUHJvbWlzZTxQYXJhbWV0ZXJJbXBsIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2ZpbmRQYXJhbWV0ZXJBc3luYycsXG4gICAgfTtcbiAgICBpZiAobmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlBhcmFtZXRlckNhcHRpb25dID0gbmFtZTtcbiAgICB9IGVsc2UgaWYgKGZpZWxkTmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlBhcmFtZXRlckZpZWxkTmFtZV0gPSBmaWVsZE5hbWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLCAnbmFtZSBvciBmaWVsZE5hbWUgbXVzdCBiZSBwcm92aWRlZCB0byBmaW5kIHBhcmFtZXRlcicpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkZpbmRQYXJhbWV0ZXIsIHBhcmFtZXRlcnMpLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBpbnN0YW5jZU9mUGFyYW1ldGVySW5mbyA9IChvYmplY3Q6IE1vZGVsKTogb2JqZWN0IGlzIFBhcmFtZXRlckluZm8gPT4ge1xuICAgICAgICByZXR1cm4gJ2ZpZWxkTmFtZScgaW4gb2JqZWN0O1xuICAgICAgfTtcblxuICAgICAgLy8gV2UgbmVlZCB0byBjaGVjayB0byBzZWUgaWYgd2UgZ290IGEgdmFsaWQgcmVzcG9uc2UgYmFjayBhZ2FpblxuICAgICAgaWYgKGluc3RhbmNlT2ZQYXJhbWV0ZXJJbmZvKHJlc3BvbnNlLnJlc3VsdCkpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0O1xuICAgICAgICByZXR1cm4gbmV3IFBhcmFtZXRlckltcGwocmVzdWx0LCB0aGlzLl9yZWdpc3RyeUlkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBFeGVjdXRlUGFyYW1ldGVycyxcbiAgUGFyYW1ldGVySWQsXG4gIFF1YW50aXRhdGl2ZUluY2x1ZGVkVmFsdWVzLFxuICBTZWxlY3Rpb25VcGRhdGVUeXBlIGFzIFNlbGVjdGlvblVwZGF0ZVR5cGVJbnRlcm5hbCxcbiAgVmVyYklkLFxuICBWaXN1YWxJZCxcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIERpbWVuc2lvblNlbGVjdGlvbk1vZGVsLFxuICBIaWVyYXJjaGljYWxTZWxlY3Rpb25Nb2RlbCxcbiAgSG92ZXJUdXBsZUludGVyYWN0aW9uTW9kZWwsXG4gIFJhbmdlU2VsZWN0aW9uTW9kZWwsXG4gIFNlbGVjdFR1cGxlc0ludGVyYWN0aW9uTW9kZWwsXG4gIFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lcixcbiAgVHVwbGVTZWxlY3Rpb25Nb2RlbCxcbiAgVmFsdWVTZWxlY3Rpb25Nb2RlbCxcbn0gZnJvbSAnLi4vLi4vTW9kZWxzL1NlbGVjdGlvbk1vZGVscyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi8uLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgUGFyYW0gfSBmcm9tICcuLi8uLi9VdGlscy9QYXJhbSc7XG5pbXBvcnQgeyBTZWxlY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vU2VsZWN0aW9uU2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuXG5leHBvcnQgY2xhc3MgU2VsZWN0aW9uU2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBTZWxlY3Rpb25TZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTZXJ2aWNlTmFtZXMuU2VsZWN0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byBjbGVhciBhbGwgdGhlIHNlbGVjdGVkIG1hcmtzIGZvciB0aGUgZ2l2ZW4gd29ya3NoZWV0LlxuICAgKlxuICAgKiBAcGFyYW0gdmlzdWFsSWRcbiAgICovXG4gIHB1YmxpYyBjbGVhclNlbGVjdGVkTWFya3NBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnY2xlYXJTZWxlY3RlZE1hcmtzQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5DbGVhclNlbGVjdGVkTWFya3MsIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm47IC8vIEV4cGVjdGluZyBhbiBlbXB0eSBtb2RlbCBhbmQgaGVuY2UgdGhlIHZvaWQgcmVzcG9uc2UuXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIHNlbGVjdCBtYXJrcyBmb3IgdGhlIGdpdmVuIHdvcmtzaGVldC5cbiAgICpcbiAgICogQHBhcmFtIHZpc3VhbElkXG4gICAqIEBwYXJhbSBzZWxlY3Rpb25Dcml0ZXJpYVxuICAgKiBAcGFyYW0gc2VsZWN0aW9uVXBkYXRlVHlwZVxuICAgKi9cbiAgcHVibGljIHNlbGVjdE1hcmtzQnlWYWx1ZUFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBzZWxlY3Rpb25Dcml0ZXJpYXM6IEFycmF5PENvbnRyYWN0LlNlbGVjdGlvbkNyaXRlcmlhPixcbiAgICBzZWxlY3Rpb25VcGRhdGVUeXBlOiBDb250cmFjdC5TZWxlY3Rpb25VcGRhdGVUeXBlLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoc2VsZWN0aW9uQ3JpdGVyaWFzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsICdTZWxlY3Rpb24gY3JpdGVyaWEgbWlzc2luZyBmb3Igc2VsZWN0aW5nIG1hcmtzIGJ5IHZhbHVlJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0aW9uVHlwZTogc3RyaW5nID0gdGhpcy52YWxpZGF0ZVNlbGVjdGlvblVwZGF0ZVR5cGUoc2VsZWN0aW9uVXBkYXRlVHlwZSk7XG4gICAgY29uc3Qgc2VsZWN0aW9uTW9kZWxDb250YWluZXI6IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lciA9IHRoaXMucGFyc2VTZWxlY3Rpb25NYXJrcyhzZWxlY3Rpb25Dcml0ZXJpYXMpO1xuXG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3NlbGVjdE1hcmtzQnlWYWx1ZUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkLFxuICAgICAgW1BhcmFtZXRlcklkLlNlbGVjdGlvblVwZGF0ZVR5cGVdOiBzZWxlY3Rpb25UeXBlLFxuICAgIH07XG5cbiAgICBpZiAoc2VsZWN0aW9uTW9kZWxDb250YWluZXIuaGllck1vZGVsQXJyICYmIHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLmhpZXJNb2RlbEFyci5sZW5ndGgpIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuSGllclZhbFNlbGVjdGlvbk1vZGVsc10gPSBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5oaWVyTW9kZWxBcnI7XG4gICAgfVxuICAgIGlmIChzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5xdWFudE1vZGVsQXJyICYmIHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLnF1YW50TW9kZWxBcnIubGVuZ3RoKSB7XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlF1YW50UmFuZ2VTZWxlY3Rpb25Nb2RlbHNdID0gc2VsZWN0aW9uTW9kZWxDb250YWluZXIucXVhbnRNb2RlbEFycjtcbiAgICB9XG4gICAgaWYgKHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLmRpbU1vZGVsQXJyICYmIHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLmRpbU1vZGVsQXJyLmxlbmd0aCkge1xuICAgICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5EaW1WYWxTZWxlY3Rpb25Nb2RlbHNdID0gc2VsZWN0aW9uTW9kZWxDb250YWluZXIuZGltTW9kZWxBcnI7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuU2VsZWN0QnlWYWx1ZSwgcGFyYW1ldGVycykudGhlbjx2b2lkPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHRoaXMuYXBpRmlsdGVySGFuZGxlckNoZWNrRm9yQ29tbWFuZEVycm9yKHJlc3BvbnNlLnJlc3VsdCBhcyB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gZXhlY3V0ZSBob3ZlciBhY3Rpb25zIGFuZCByZW5kZXIgdG9vbHRpcCBmb3IgYSBnaXZlbiB0dXBsZSByZXByZXNlbnRpbmcgYSBtYXJrIGluIHRoZSB2aXN1YWxpemF0aW9uLlxuICAgKiBJZiB0aGUgdG9vbHRpcCBwYXJhbWV0ZXIgaXMgaW5jbHVkZWQgaXQgd2lsbCBzaG93IHRoZSB0b29sdGlwIG9uIGhvdmVyLiBJZiBub3QsIG5vIHRvb2x0aXAgaXMgc2hvd24uXG4gICAqXG4gICAqIEBwYXJhbSB2aXN1YWxJZFxuICAgKiBAcGFyYW0gaG92ZXJlZFR1cGxlXG4gICAqIEBwYXJhbSB0b29sdGlwXG4gICAqIEByZXR1cm5zIGVtcHR5IHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBleHRlbnNpb24gaG9zdCBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gaW5mb3JtZWQgb2YgdGhlIHJlcXVlc3QgYW5kIHJlamVjdHMgb24gZXJyb3JcbiAgICovXG4gIHB1YmxpYyBob3ZlclR1cGxlQXN5bmMoXG4gICAgdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIGhvdmVyZWRUdXBsZT86IG51bWJlcixcbiAgICB0b29sdGlwPzogQ29udHJhY3QuVG9vbHRpcENvbnRleHQgfCBudWxsLFxuICAgIGFsbG93SG92ZXJBY3Rpb25zPzogYm9vbGVhbixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGludGVyYWN0aW9uTW9kZWwgPSBuZXcgSG92ZXJUdXBsZUludGVyYWN0aW9uTW9kZWwoXG4gICAgICB2aXN1YWxJZCxcbiAgICAgIHRoaXMuZW5zdXJlVHVwbGVJRElzTm9uTmVnYXRpdmUoaG92ZXJlZFR1cGxlKSxcbiAgICAgIHRvb2x0aXAsXG4gICAgICBhbGxvd0hvdmVyQWN0aW9ucyxcbiAgICApO1xuXG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2hvdmVyVHVwbGVBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuSG92ZXJUdXBsZUludGVyYWN0aW9uXTogaW50ZXJhY3Rpb25Nb2RlbCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuUmFpc2VIb3ZlclR1cGxlTm90aWZpY2F0aW9uLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byBtb2RpZnkgc2VsZWN0aW9uLCBleGVjdXRlIHNlbGVjdCBhY3Rpb25zIGFuZCByZW5kZXIgdG9vbHRpcCBmb3IgYSBnaXZlbiBsaXN0IG9mIHR1cGxlcyByZXByZXNlbnRpbmcgYSBtYXJrIG9yIG1hcmtzIGluIHRoZSB2aXN1YWxpemF0aW9uLlxuICAgKiBJZiB0aGUgdG9vbHRpcCBwYXJhbWV0ZXIgaXMgaW5jbHVkZWQgaXQgd2lsbCBzaG93IHRoZSB0b29sdGlwIG9uIHNlbGVjdC4gSWYgbm90LCBubyB0b29sdGlwIGlzIHNob3duLlxuICAgKlxuICAgKiBAcGFyYW0gdmlzdWFsSWRcbiAgICogQHBhcmFtIHNlbGVjdGVkVHVwbGVzXG4gICAqIEBwYXJhbSBzZWxlY3RPcHRpb25cbiAgICogQHBhcmFtIHRvb2x0aXBcbiAgICogQHJldHVybnMgZW1wdHkgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGV4dGVuc2lvbiBob3N0IGhhcyBzdWNjZXNzZnVsbHkgYmVlbiBpbmZvcm1lZCBvZiB0aGUgcmVxdWVzdCBhbmQgcmVqZWN0cyBvbiBlcnJvclxuICAgKi9cbiAgcHVibGljIHNlbGVjdFR1cGxlc0FzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBzZWxlY3RlZFR1cGxlczogQXJyYXk8bnVtYmVyPixcbiAgICBzZWxlY3RPcHRpb246IENvbnRyYWN0LlNlbGVjdE9wdGlvbnMsXG4gICAgdG9vbHRpcD86IENvbnRyYWN0LlRvb2x0aXBDb250ZXh0LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgaW50ZXJhY3Rpb25Nb2RlbCA9IG5ldyBTZWxlY3RUdXBsZXNJbnRlcmFjdGlvbk1vZGVsKHZpc3VhbElkLCBzZWxlY3RlZFR1cGxlcywgc2VsZWN0T3B0aW9uLCB0b29sdGlwKTtcblxuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdzZWxlY3RUdXBsZXNBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuU2VsZWN0VHVwbGVzSW50ZXJhY3Rpb25dOiBpbnRlcmFjdGlvbk1vZGVsLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5SYWlzZVNlbGVjdFR1cGxlc05vdGlmaWNhdGlvbiwgcGFyYW1ldGVycykudGhlbjx2b2lkPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXBpRmlsdGVySGFuZGxlckNoZWNrRm9yQ29tbWFuZEVycm9yKHNlcnZlclBtOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9KSB7XG4gICAgaWYgKCFzZXJ2ZXJQbVtQYXJhbWV0ZXJJZC5QYXJhbWV0ZXJFcnJvcl0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHNlcnZlclBtW1BhcmFtZXRlcklkLkludmFsaWRGaWVsZHNdKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LlNoYXJlZEVycm9yQ29kZXMuSW52YWxpZFNlbGVjdGlvbkZpZWxkTmFtZSwgc2VydmVyUG1bUGFyYW1ldGVySWQuSW52YWxpZEZpZWxkc10pO1xuICAgIH1cbiAgICBpZiAoc2VydmVyUG1bUGFyYW1ldGVySWQuSW52YWxpZFZhbHVlc10pIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkU2VsZWN0aW9uVmFsdWUsIHNlcnZlclBtW1BhcmFtZXRlcklkLkludmFsaWRWYWx1ZXNdKTtcbiAgICB9XG4gICAgaWYgKHNlcnZlclBtW1BhcmFtZXRlcklkLkludmFsaWREYXRlc10pIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkU2VsZWN0aW9uRGF0ZSwgc2VydmVyUG1bUGFyYW1ldGVySWQuSW52YWxpZERhdGVzXSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byBzZWxlY3QgbWFya3MgZm9yIHRoZSBnaXZlbiB3b3Jrc2hlZXQuXG4gICAqXG4gICAqIEBwYXJhbSB2aXN1YWxJZFxuICAgKiBAcGFyYW0gTWFya0luZm9cbiAgICogQHBhcmFtIHNlbGVjdGlvblVwZGF0ZVR5cGVcbiAgICovXG4gIHB1YmxpYyBzZWxlY3RNYXJrc0J5SWRBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgbWFya3M6IEFycmF5PENvbnRyYWN0Lk1hcmtJbmZvPixcbiAgICBzZWxlY3Rpb25VcGRhdGVUeXBlOiBDb250cmFjdC5TZWxlY3Rpb25VcGRhdGVUeXBlLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAobWFya3MubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgJ01hcmtzIGluZm8gbWlzc2luZyBmb3Igc2VsZWN0aW5nIG1hcmtzIGJ5IElkJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0aW9uVHlwZTogc3RyaW5nID0gdGhpcy52YWxpZGF0ZVNlbGVjdGlvblVwZGF0ZVR5cGUoc2VsZWN0aW9uVXBkYXRlVHlwZSk7XG4gICAgY29uc3Qgc2VsZWN0aW9uTW9kZWxDb250YWluZXI6IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lciA9IHRoaXMucGFyc2VTZWxlY3Rpb25JZHMobWFya3MpO1xuXG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3NlbGVjdE1hcmtzQnlJZEFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkLFxuICAgICAgW1BhcmFtZXRlcklkLlNlbGVjdGlvblVwZGF0ZVR5cGVdOiBzZWxlY3Rpb25UeXBlLFxuICAgICAgW1BhcmFtZXRlcklkLlNlbGVjdGlvbl06IHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLnNlbGVjdGlvbixcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlNlbGVjdEJ5VmFsdWUsIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAvLyBFeHBlY3RpbmcgYW4gZW1wdHkgbW9kZWwgYW5kIGhlbmNlIHRoZSB2b2lkIHJlc3BvbnNlLlxuICAgICAgcmV0dXJuO1xuICAgICAgLy8gVE9ETyBJbnZlc3RpZ2F0ZSB0aGUgZXJyb3IgcmVzcG9uc2Ugd2l0aCBtdWx0aXBsZSBvdXRwdXQgcGFyYW1zIGFuZCB0aHJvdyBlcnJvciBhY2NvcmRpbmdseS5cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gcHJlcGFyZSB0aGUgcHJlcyBtb2RlbHMgZm9yIHNlbGVjdGlvbiBieSBNYXJrc0luZm9cbiAgICogQHBhcmFtIG1hcmtzXG4gICAqL1xuICBwcml2YXRlIHBhcnNlU2VsZWN0aW9uSWRzKG1hcmtzOiBBcnJheTxDb250cmFjdC5NYXJrSW5mbz4pOiBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIge1xuICAgIGNvbnN0IGlkczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICAgIGNvbnN0IHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyOiBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIgPSBuZXcgU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyKCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXJrcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgdHVwbGVJZDogbnVtYmVyIHwgdW5kZWZpbmVkID0gbWFya3NbaV0udHVwbGVJZDtcbiAgICAgIGlmICh0dXBsZUlkICE9PSB1bmRlZmluZWQgJiYgdHVwbGVJZCAhPT0gbnVsbCkge1xuICAgICAgICAvLyBJZiB0dXBsZSBpZCBpcyBwcm92aWRlZCB1c2UgdGhhdCBpbnN0ZWFkIG9mIHBhaXJcbiAgICAgICAgaWRzLnB1c2godHVwbGVJZC50b1N0cmluZygpKTsgLy8gY29sbGVjdCB0aGUgdHVwbGUgaWRzXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ3R1cGxlSWQgcGFyc2luZyBlcnJvcicpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaWRzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgLy8gdHVwbGUgaWRzIGJhc2VkIHNlbGVjdGlvblxuICAgICAgY29uc3QgdHVwbGVTZWxlY3Rpb25Nb2RlbDogVHVwbGVTZWxlY3Rpb25Nb2RlbCA9IG5ldyBUdXBsZVNlbGVjdGlvbk1vZGVsKCk7XG4gICAgICB0dXBsZVNlbGVjdGlvbk1vZGVsLnNlbGVjdGlvblR5cGUgPSAndHVwbGVzJztcbiAgICAgIHR1cGxlU2VsZWN0aW9uTW9kZWwub2JqZWN0SWRzID0gaWRzO1xuICAgICAgc2VsZWN0aW9uTW9kZWxDb250YWluZXIuc2VsZWN0aW9uID0gdHVwbGVTZWxlY3Rpb25Nb2RlbDtcbiAgICB9XG4gICAgcmV0dXJuIHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byBwcmVwYXJlIHRoZSBwcmVzIG1vZGVscyBmb3Igc2VsZWN0aW9uIGJ5IHZhbHVlcy5cbiAgICpcbiAgICogU3VwcG9ydHMgMyB0eXBlcyBmb3Igc2VsZWN0aW9uOlxuICAgKiAxKSBIaWVyYXJjaGljYWwgdmFsdWUgYmFzZWQgc2VsZWN0aW9uXG4gICAqIDIpIFJhbmdlIHZhbHVlIGJhc2VkIHNlbGVjdGlvblxuICAgKiAzKSBEaW1lbnNpb24gdmFsdWUgYmFzZWQgc2VsZWN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSBtYXJrc1xuICAgKi9cbiAgcHJpdmF0ZSBwYXJzZVNlbGVjdGlvbk1hcmtzKHNlbGVjdGlvbkNyaXRlcmlhczogQXJyYXk8Q29udHJhY3QuU2VsZWN0aW9uQ3JpdGVyaWE+KTogU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyIHtcbiAgICBjb25zdCBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lcjogU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyID0gbmV3IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lcigpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3Rpb25Dcml0ZXJpYXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHN0ID0gc2VsZWN0aW9uQ3JpdGVyaWFzW2ldO1xuICAgICAgaWYgKCEoc3QuZmllbGROYW1lICYmIHN0LnZhbHVlICE9PSB1bmRlZmluZWQgJiYgc3QudmFsdWUgIT09IG51bGwpKSB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnU2VsZWN0aW9uIENyaXRlcmlhIHBhcnNpbmcgZXJyb3InKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2F0UmVnZXggPSBuZXcgUmVnRXhwKCcoW1tBLVphLXowLTldK10pLionLCAnZycpO1xuICAgICAgY29uc3QgcmFuZ2VPcHRpb24gPSBzdC52YWx1ZSBhcyBDb250cmFjdC5SYW5nZVZhbHVlO1xuICAgICAgaWYgKGNhdFJlZ2V4LnRlc3Qoc3QuZmllbGROYW1lKSkge1xuICAgICAgICAvLyBIaWVyYXJjaGljYWwgdmFsdWUgc2VsZWN0aW9uXG4gICAgICAgIGNvbnN0IGhpZXJNb2RlbDogSGllcmFyY2hpY2FsU2VsZWN0aW9uTW9kZWwgPSB0aGlzLmFkZFRvUGFyYW1zTGlzdChzdC5maWVsZE5hbWUsIHN0LnZhbHVlKSBhcyBIaWVyYXJjaGljYWxTZWxlY3Rpb25Nb2RlbDtcbiAgICAgICAgc2VsZWN0aW9uTW9kZWxDb250YWluZXIuaGllck1vZGVsQXJyLnB1c2goaGllck1vZGVsKTtcbiAgICAgIH0gZWxzZSBpZiAocmFuZ2VPcHRpb24ubWluICE9PSB1bmRlZmluZWQgJiYgcmFuZ2VPcHRpb24ubWF4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gUmFuZ2UgdmFsdWUgc2VsZWN0aW9uXG4gICAgICAgIGNvbnN0IHF1YW50TW9kZWw6IFJhbmdlU2VsZWN0aW9uTW9kZWwgPSB0aGlzLmFkZFRvUmFuZ2VQYXJhbXNMaXN0KHN0LmZpZWxkTmFtZSwgcmFuZ2VPcHRpb24pO1xuICAgICAgICBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5xdWFudE1vZGVsQXJyLnB1c2gocXVhbnRNb2RlbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBEaW1lbnNpb24gdmFsdWUgc2VsZWN0aW9uXG4gICAgICAgIGNvbnN0IGRpbU1vZGVsOiBEaW1lbnNpb25TZWxlY3Rpb25Nb2RlbCA9IHRoaXMuYWRkVG9QYXJhbXNMaXN0KHN0LmZpZWxkTmFtZSwgc3QudmFsdWUpIGFzIERpbWVuc2lvblNlbGVjdGlvbk1vZGVsO1xuICAgICAgICBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5kaW1Nb2RlbEFyci5wdXNoKGRpbU1vZGVsKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc2VsZWN0aW9uTW9kZWxDb250YWluZXI7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIHRyYW5zZm9ybSB0aGUga2V5IHZhbHVlIHBhaXIgaW50byB2YWx1ZSBiYXNlZCBwcmVzIG1vZGVsIG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlU2VsZWN0aW9uTW9kZWxcbiAgICogQHBhcmFtIGZpZWxkTmFtZVxuICAgKiBAcGFyYW0gdmFsdWVcbiAgICovXG4gIHByaXZhdGUgYWRkVG9QYXJhbXNMaXN0KGZpZWxkTmFtZTogc3RyaW5nLCB2YWx1ZTogQ29udHJhY3QuQ2F0ZWdvcmljYWxWYWx1ZSB8IENvbnRyYWN0LlJhbmdlVmFsdWUpOiBWYWx1ZVNlbGVjdGlvbk1vZGVsIHtcbiAgICBjb25zdCB2YWx1ZVNlbGVjdGlvbk1vZGVsOiBWYWx1ZVNlbGVjdGlvbk1vZGVsID0gbmV3IFZhbHVlU2VsZWN0aW9uTW9kZWwoKTtcbiAgICBjb25zdCBtYXJrVmFsdWVzOiBBcnJheTxzdHJpbmc+ID0gW107XG5cbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgY29uc3QgdmFsdWVBcnI6IEFycmF5PHN0cmluZz4gPSB2YWx1ZTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVBcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbWFya1ZhbHVlcy5wdXNoKFBhcmFtLnNlcmlhbGl6ZVBhcmFtZXRlclZhbHVlKHZhbHVlQXJyW2ldKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG1hcmtWYWx1ZXMucHVzaChQYXJhbS5zZXJpYWxpemVQYXJhbWV0ZXJWYWx1ZSh2YWx1ZSkpO1xuICAgIH1cblxuICAgIHZhbHVlU2VsZWN0aW9uTW9kZWwucXVhbGlmaWVkRmllbGRDYXB0aW9uID0gZmllbGROYW1lO1xuICAgIHZhbHVlU2VsZWN0aW9uTW9kZWwuc2VsZWN0VmFsdWVzID0gbWFya1ZhbHVlcztcbiAgICByZXR1cm4gdmFsdWVTZWxlY3Rpb25Nb2RlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gdHJhbnNmb3JtIHRoZSBrZXkgdmFsdWUgcGFpciBpbnRvIHJhbmdlIGJhc2VkIHNlbGVjdGlvbiBwcmVzIG1vZGVsLlxuICAgKlxuICAgKiBUT0RPOiBOZWVkIHRvIGhhbmRsZSB0aGUgcGFyc2luZyBvZiBkYXRlIHR5cGUgdmFsdWVzLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWVTZWxlY3Rpb25Nb2RlbFxuICAgKiBAcGFyYW0gZmllbGROYW1lXG4gICAqIEBwYXJhbSB2YWx1ZVxuICAgKi9cbiAgcHJpdmF0ZSBhZGRUb1JhbmdlUGFyYW1zTGlzdChmaWVsZE5hbWU6IHN0cmluZywgdmFsdWU6IENvbnRyYWN0LlJhbmdlVmFsdWUpOiBSYW5nZVNlbGVjdGlvbk1vZGVsIHtcbiAgICBjb25zdCByYW5nZVNlbGVjdGlvbk1vZGVsOiBSYW5nZVNlbGVjdGlvbk1vZGVsID0gbmV3IFJhbmdlU2VsZWN0aW9uTW9kZWwoKTtcbiAgICByYW5nZVNlbGVjdGlvbk1vZGVsLnF1YWxpZmllZEZpZWxkQ2FwdGlvbiA9IGZpZWxkTmFtZTtcbiAgICBpZiAodmFsdWUubWF4ICE9PSB1bmRlZmluZWQgJiYgdmFsdWUubWF4ICE9PSBudWxsKSB7XG4gICAgICByYW5nZVNlbGVjdGlvbk1vZGVsLm1heFZhbHVlID0gUGFyYW0uc2VyaWFsaXplUGFyYW1ldGVyVmFsdWUodmFsdWUubWF4KTtcbiAgICB9XG4gICAgaWYgKHZhbHVlLm1pbiAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLm1pbiAhPT0gbnVsbCkge1xuICAgICAgcmFuZ2VTZWxlY3Rpb25Nb2RlbC5taW5WYWx1ZSA9IFBhcmFtLnNlcmlhbGl6ZVBhcmFtZXRlclZhbHVlKHZhbHVlLm1pbik7XG4gICAgfVxuICAgIHJhbmdlU2VsZWN0aW9uTW9kZWwuaW5jbHVkZWQgPSB0aGlzLnZhbGlkYXRlTnVsbE9wdGlvblR5cGUodmFsdWUubnVsbE9wdGlvbik7XG4gICAgcmV0dXJuIHJhbmdlU2VsZWN0aW9uTW9kZWw7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIHZhbGlkYXRlIHRoZSBzZWxlY3Rpb24gdXBkYXRlIHR5cGUuXG4gICAqXG4gICAqIEBwYXJhbSBzZWxlY3Rpb25VcGRhdGVUeXBlXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlU2VsZWN0aW9uVXBkYXRlVHlwZShzZWxlY3Rpb25VcGRhdGVUeXBlOiBDb250cmFjdC5TZWxlY3Rpb25VcGRhdGVUeXBlKTogc3RyaW5nIHtcbiAgICBpZiAoc2VsZWN0aW9uVXBkYXRlVHlwZSA9PT0gQ29udHJhY3QuU2VsZWN0aW9uVXBkYXRlVHlwZS5SZXBsYWNlKSB7XG4gICAgICByZXR1cm4gU2VsZWN0aW9uVXBkYXRlVHlwZUludGVybmFsLlJlcGxhY2U7XG4gICAgfSBlbHNlIGlmIChzZWxlY3Rpb25VcGRhdGVUeXBlID09PSBDb250cmFjdC5TZWxlY3Rpb25VcGRhdGVUeXBlLkFkZCkge1xuICAgICAgcmV0dXJuIFNlbGVjdGlvblVwZGF0ZVR5cGVJbnRlcm5hbC5BZGQ7XG4gICAgfSBlbHNlIGlmIChzZWxlY3Rpb25VcGRhdGVUeXBlID09PSBDb250cmFjdC5TZWxlY3Rpb25VcGRhdGVUeXBlLlJlbW92ZSkge1xuICAgICAgcmV0dXJuIFNlbGVjdGlvblVwZGF0ZVR5cGVJbnRlcm5hbC5SZW1vdmU7XG4gICAgfVxuICAgIHJldHVybiBTZWxlY3Rpb25VcGRhdGVUeXBlSW50ZXJuYWwuUmVwbGFjZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gdmFsaWRhdGUgdGhlIGluY2x1ZGUgdHlwZSBmb3IgcmFuZ2Ugc2VsZWN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gbnVsbE9wdGlvblxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZU51bGxPcHRpb25UeXBlKG51bGxPcHRpb246IENvbnRyYWN0LkZpbHRlck51bGxPcHRpb24gfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICAgIGlmIChudWxsT3B0aW9uKSB7XG4gICAgICBpZiAobnVsbE9wdGlvbiA9PT0gQ29udHJhY3QuRmlsdGVyTnVsbE9wdGlvbi5OdWxsVmFsdWVzKSB7XG4gICAgICAgIHJldHVybiBRdWFudGl0YXRpdmVJbmNsdWRlZFZhbHVlcy5JbmNsdWRlTnVsbDtcbiAgICAgIH0gZWxzZSBpZiAobnVsbE9wdGlvbiA9PT0gQ29udHJhY3QuRmlsdGVyTnVsbE9wdGlvbi5Ob25OdWxsVmFsdWVzKSB7XG4gICAgICAgIHJldHVybiBRdWFudGl0YXRpdmVJbmNsdWRlZFZhbHVlcy5JbmNsdWRlTm9uTnVsbDtcbiAgICAgIH0gZWxzZSBpZiAobnVsbE9wdGlvbiA9PT0gQ29udHJhY3QuRmlsdGVyTnVsbE9wdGlvbi5BbGxWYWx1ZXMpIHtcbiAgICAgICAgcmV0dXJuIFF1YW50aXRhdGl2ZUluY2x1ZGVkVmFsdWVzLkluY2x1ZGVBbGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFF1YW50aXRhdGl2ZUluY2x1ZGVkVmFsdWVzLkluY2x1ZGVBbGw7XG4gIH1cblxuICBwcml2YXRlIGVuc3VyZVR1cGxlSURJc05vbk5lZ2F0aXZlKHR1cGxlSWQ/OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGlmICh0dXBsZUlkICYmIHR1cGxlSWQgPiAwKSB7XG4gICAgICByZXR1cm4gdHVwbGVJZDtcbiAgICB9XG5cbiAgICAvLyAwIHdpbGwgbm90IHJlZmVyIHRvIGEgdmFsaWQgdHVwbGUgKHNpbmNlIHR1cGxlIGlkcyBhcmUgMS1iYXNlZCksXG4gICAgLy8gYnV0IGNhbiBiZSB1c2VkIGZvciBjbGVhcmluZyB0aGUgY3VycmVudCBob3ZlciBvciBzZWxlY3Rpb25cbiAgICByZXR1cm4gMDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgRXhlY3V0ZVJlc3BvbnNlLCBJbnRlcm5hbEFwaURpc3BhdGNoZXIsIEludGVybmFsVGFibGVhdUVycm9yLCBWZXJiSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzIH0gZnJvbSAnLi4vLi4vRW51bU1hcHBpbmdzL0ludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi8uLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgU2hvdWxkVGhyb3cgfSBmcm9tICcuLi8uLi9VdGlscy9FbnVtQ29udmVydGVyJztcblxuLyoqXG4gKiBFYWNoIFNlcnZjZUltcGwgc2hvdWxkIGV4dGVuZCB0aGlzIGJhc2UgY2xhc3MgZm9yIHRoZSBzYWtlIG9mXG4gKiBwcm9wZXIgZXJyb3IgaGFuZGxpbmcuICBUaGlzIGJhc2UgaGFuZGxlcyB0aGUgY29udmVyc2lvblxuICogZnJvbSBpbnRlcm5hbCBlcnJvcnMgdG8gZXh0ZXJuYWwgZXJyb3JzIHRoYXQgd2UgdGhyb3cgdG8gZGV2ZWxvcGVyc1xuICovXG5leHBvcnQgY2xhc3MgU2VydmljZUltcGxCYXNlIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2Rpc3BhdGNoZXI6IEludGVybmFsQXBpRGlzcGF0Y2hlciwgcHJvdGVjdGVkIF9yZWdpc3RyeUlkOiBudW1iZXIpIHt9XG5cbiAgcHJvdGVjdGVkIGV4ZWN1dGUodmVyYjogVmVyYklkLCBwYXJhbXM6IEV4ZWN1dGVQYXJhbWV0ZXJzKTogUHJvbWlzZTxFeGVjdXRlUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5fZGlzcGF0Y2hlci5leGVjdXRlKHZlcmIsIHBhcmFtcykuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAvLyBBbnkgaW50ZXJuYWwgZXJyb3IgdGhhdCBjb21lcyBmcm9tIHRoZSBkaXNwYXRjaGVyIHNob3VsZCBiZSBjb252ZXJ0ZWRcbiAgICAgIC8vIHRvIGFuIGV4dGVybmFsIGVycm9yIHVzaW5nIHRoZSBlbnVtIG1hcHBlciBmb3IgZXJyb3IgY29kZXMuXG4gICAgICBjb25zdCBpbnRlcm5hbEVycm9yID0gZXJyb3IgYXMgSW50ZXJuYWxUYWJsZWF1RXJyb3I7XG4gICAgICBjb25zdCBleHRlcm5hbEVycm9yQ29kZTogRXJyb3JDb2RlcyA9IEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncy5lcnJvckNvZGUuY29udmVydChpbnRlcm5hbEVycm9yLmVycm9yQ29kZSwgU2hvdWxkVGhyb3cuTm8pO1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihleHRlcm5hbEVycm9yQ29kZSwgaW50ZXJuYWxFcnJvci5tZXNzYWdlKTtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgU2hlZXRTaXplIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBQYXJhbWV0ZXJJZCwgVmVyYklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBTaXplU2VydmljZSB9IGZyb20gJy4uL1NpemVTZXJ2aWNlJztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vU2VydmljZUltcGxCYXNlJztcblxuZXhwb3J0IGNsYXNzIFNpemVTZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIFNpemVTZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTZXJ2aWNlTmFtZXMuU2l6ZTtcbiAgfVxuXG4gIGNoYW5nZVNpemVBc3luYyhuYW1lOiBzdHJpbmcsIG5ld1NpemU6IFNoZWV0U2l6ZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdjaGFuZ2VTaXplQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlNoZWV0TmFtZV06IG5hbWUsXG4gICAgICBbUGFyYW1ldGVySWQuTWluSGVpZ2h0XTogbmV3U2l6ZS5taW5TaXplPy5oZWlnaHQgfHwgMCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5NaW5XaWR0aF06IG5ld1NpemUubWluU2l6ZT8ud2lkdGggfHwgMCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5NYXhIZWlnaHRdOiBuZXdTaXplLm1heFNpemU/LmhlaWdodCB8fCAwLFxuICAgICAgW1BhcmFtZXRlcklkLk1heFdpZHRoXTogbmV3U2l6ZS5tYXhTaXplPy53aWR0aCB8fCAwLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5TZXRTaGVldFNpemUsIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4oKF9yZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgUGFyYW1ldGVySWQsIFN0b3J5UG9pbnRNb2RlbCwgVmVyYklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBTdG9yeUFjdGl2YXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vU3RvcnlBY3RpdmF0aW9uU2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBTdG9yeUFjdGl2YXRpb25TZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIFN0b3J5QWN0aXZhdGlvblNlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5TdG9yeUFjdGl2YXRpb247XG4gIH1cblxuICBhY3RpdmF0ZU5leHRTdG9yeVBvaW50QXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5BY3RpdmF0ZU5leHRTdG9yeVBvaW50O1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdhY3RpdmF0ZU5leHRTdG9yeVBvaW50QXN5bmMnLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cblxuICBhY3RpdmF0ZVByZXZpb3VzU3RvcnlQb2ludEFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuQWN0aXZhdGVQcmV2aW91c1N0b3J5UG9pbnQ7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2FjdGl2YXRlUHJldmlvdXNTdG9yeVBvaW50QXN5bmMnLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cblxuICBhY3RpdmF0ZVN0b3J5UG9pbnRBc3luYyhpbmRleDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5BY3RpdmF0ZVN0b3J5UG9pbnQ7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2FjdGl2YXRlU3RvcnlQb2ludEFzeW5jJyxcbiAgICB9O1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuU3RvcnlQb2ludEluZGV4XSA9IGluZGV4O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgcmV2ZXJ0U3RvcnlQb2ludEFzeW5jKGluZGV4OiBudW1iZXIpOiBQcm9taXNlPFN0b3J5UG9pbnRNb2RlbD4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuUmV2ZXJ0U3RvcnlQb2ludDtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAncmV2ZXJ0U3RvcnlQb2ludEFzeW5jJyxcbiAgICB9O1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuU3RvcnlQb2ludEluZGV4XSA9IGluZGV4O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPFN0b3J5UG9pbnRNb2RlbD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm4gcmVzcG9uc2UucmVzdWx0IGFzIFN0b3J5UG9pbnRNb2RlbDtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBQYXJhbWV0ZXJJZCwgVmVyYklkLCBWaXN1YWxJZCwgVmlzdWFsU3BlY2lmaWNhdGlvbiB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgVmlzdWFsTW9kZWxTZXJ2aWNlIH0gZnJvbSAnLi4vVmlzdWFsTW9kZWxTZXJ2aWNlJztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vU2VydmljZUltcGxCYXNlJztcblxuZXhwb3J0IGNsYXNzIFZpc3VhbE1vZGVsU2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBWaXN1YWxNb2RlbFNlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5WaXN1YWxNb2RlbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRWaXN1YWxTcGVjaWZpY2F0aW9uQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkKTogUHJvbWlzZTxDb250cmFjdC5WaXN1YWxTcGVjaWZpY2F0aW9uPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldFZpc3VhbFNwZWNpZmljYXRpb25Bc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuV29ya3NoZWV0TmFtZV06IHZpc3VhbElkLndvcmtzaGVldCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0VmlzdWFsU3BlY2lmaWNhdGlvbiwgcGFyYW1ldGVycykudGhlbjxDb250cmFjdC5WaXN1YWxTcGVjaWZpY2F0aW9uPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBWaXN1YWxTcGVjaWZpY2F0aW9uO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRNYXJrc0NhcmRGaWVsZHNBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgbWFya3NDYXJkSW5kZXg6IG51bWJlcixcbiAgICBlbmNvZGluZ1R5cGU6IENvbnRyYWN0LkVuY29kaW5nVHlwZSxcbiAgICBjb2x1bW5zOiBBcnJheTxDb250cmFjdC5Db2x1bW4+LFxuICAgIHN0YXJ0SW5kZXg6IG51bWJlcixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2FkZE1hcmtzQ2FyZEZpZWxkc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Xb3Jrc2hlZXROYW1lXTogdmlzdWFsSWQud29ya3NoZWV0LFxuICAgICAgW1BhcmFtZXRlcklkLk1hcmtzQ2FyZEluZGV4XTogbWFya3NDYXJkSW5kZXgsXG4gICAgICBbUGFyYW1ldGVySWQuRW5jb2RpbmdUeXBlXTogZW5jb2RpbmdUeXBlLFxuICAgICAgW1BhcmFtZXRlcklkLkNvbHVtbnNdOiBjb2x1bW5zLFxuICAgICAgW1BhcmFtZXRlcklkLlN0YXJ0SW5kZXhdOiBzdGFydEluZGV4LFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuQWRkTWFya3NDYXJkRmllbGRzLCBwYXJhbWV0ZXJzKS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBtb3ZlTWFya3NDYXJkRmllbGRBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgbWFya3NDYXJkSW5kZXg6IG51bWJlcixcbiAgICBmcm9tSW5kZXg6IG51bWJlcixcbiAgICB0b0luZGV4OiBudW1iZXIsXG4gICAgZmllbGRDb3VudCA9IDEsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdhZGRNYXJrc0NhcmRGaWVsZHNBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuV29ya3NoZWV0TmFtZV06IHZpc3VhbElkLndvcmtzaGVldCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5NYXJrc0NhcmRJbmRleF06IG1hcmtzQ2FyZEluZGV4LFxuICAgICAgW1BhcmFtZXRlcklkLkZyb21JbmRleF06IGZyb21JbmRleCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Ub0luZGV4XTogdG9JbmRleCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5GaWVsZENvdW50XTogZmllbGRDb3VudCxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLk1vdmVNYXJrc0NhcmRGaWVsZCwgcGFyYW1ldGVycykudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc3BsaWNlTWFya3NDYXJkRmllbGRzQXN5bmMoXG4gICAgdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIG1hcmtzQ2FyZEluZGV4OiBudW1iZXIsXG4gICAgZW5jb2RpbmdUeXBlOiBDb250cmFjdC5FbmNvZGluZ1R5cGUsXG4gICAgc3RhcnRJbmRleDogbnVtYmVyLFxuICAgIGRlbGV0ZUNvdW50OiBudW1iZXIsXG4gICAgY29sdW1uczogQXJyYXk8Q29udHJhY3QuQ29sdW1uPixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3NwbGljZU1hcmtzQ2FyZEZpZWxkc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Xb3Jrc2hlZXROYW1lXTogdmlzdWFsSWQud29ya3NoZWV0LFxuICAgICAgW1BhcmFtZXRlcklkLk1hcmtzQ2FyZEluZGV4XTogbWFya3NDYXJkSW5kZXgsXG4gICAgICBbUGFyYW1ldGVySWQuRW5jb2RpbmdUeXBlXTogZW5jb2RpbmdUeXBlLFxuICAgICAgW1BhcmFtZXRlcklkLlN0YXJ0SW5kZXhdOiBzdGFydEluZGV4LFxuICAgICAgW1BhcmFtZXRlcklkLkRlbGV0ZUNvdW50XTogZGVsZXRlQ291bnQsXG4gICAgICBbUGFyYW1ldGVySWQuQ29sdW1uc106IGNvbHVtbnMsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5TcGxpY2VNYXJrc0NhcmRGaWVsZHMsIHBhcmFtZXRlcnMpLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgZWRpdEFsaWFzZXNEaWFsb2dBc3luYyhmaWVsZE5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdlZGl0QWxpYXNlc0RpYWxvZ0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5GaWVsZElkXTogZmllbGROYW1lLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuRWRpdEFsaWFzZXNEaWFsb2csIHBhcmFtZXRlcnMpLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBDdXN0b21WaWV3TW9kZWwsIEV4ZWN1dGVQYXJhbWV0ZXJzLCBQYXJhbWV0ZXJJZCwgVmVyYklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEN1c3RvbVZpZXdJbXBsIH0gZnJvbSAnLi4vLi4vSW1wbC9DdXN0b21WaWV3SW1wbCc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgVml6U2VydmljZSB9IGZyb20gJy4uL1ZpelNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuXG5leHBvcnQgY2xhc3MgVml6U2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBWaXpTZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTZXJ2aWNlTmFtZXMuVml6O1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZVZpekltYWdlQXN5bmMoaW5wdXRTcGVjOiBvYmplY3QpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdjcmVhdGVWaXpJbWFnZUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXpBUElJbnB1dEpzb25dOiBKU09OLnN0cmluZ2lmeShpbnB1dFNwZWMpLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5WaXpBUEksIHBhcmFtZXRlcnMpLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQgYXMgc3RyaW5nO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhY3RpdmF0ZVNoZWV0QXN5bmMobmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2FjdGl2YXRlU2hlZXRBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuU3dpdGNoVG9TaGVldE5hbWVdOiBuYW1lLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5BY3RpdmF0ZVNoZWV0LCBwYXJhbWV0ZXJzKS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDdXN0b21WaWV3c0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q3VzdG9tVmlld0ltcGw+PiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldEN1c3RvbVZpZXdzQXN5bmMnLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRDdXN0b21WaWV3cywgcGFyYW1ldGVycykudGhlbjxBcnJheTxDdXN0b21WaWV3SW1wbD4+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgY3VzdG9tVmlld3MgPSByZXNwb25zZS5yZXN1bHQgYXMgQXJyYXk8Q3VzdG9tVmlld01vZGVsPjtcbiAgICAgIHJldHVybiBjdXN0b21WaWV3cy5tYXAoKGN1c3RvbVZpZXc6IEN1c3RvbVZpZXdNb2RlbCkgPT4ge1xuICAgICAgICByZXR1cm4gbmV3IEN1c3RvbVZpZXdJbXBsKGN1c3RvbVZpZXcsIHRoaXMuX3JlZ2lzdHJ5SWQpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc2hvd0N1c3RvbVZpZXdBc3luYyhjdXN0b21WaWV3TmFtZT86IHN0cmluZyB8IG51bGwpOiBQcm9taXNlPEN1c3RvbVZpZXdJbXBsIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3Nob3dDdXN0b21WaWV3QXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkN1c3RvbVZpZXdOYW1lXTogY3VzdG9tVmlld05hbWUgfHwgJycsIC8vIGEgZmFsc2V5IHZhbHVlIG1lYW5zIFwic2hvdyBvcmlnaW5hbCB2aWV3XCJcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuU2hvd0N1c3RvbVZpZXcsIHBhcmFtZXRlcnMpLnRoZW48Q3VzdG9tVmlld0ltcGwgfCB1bmRlZmluZWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgY3VzdG9tVmlldyA9IHJlc3BvbnNlLnJlc3VsdCBhcyBDdXN0b21WaWV3TW9kZWw7XG4gICAgICByZXR1cm4gY3VzdG9tVmlldz8ubHVpZCA/IG5ldyBDdXN0b21WaWV3SW1wbChjdXN0b21WaWV3LCB0aGlzLl9yZWdpc3RyeUlkKSA6IHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVDdXN0b21WaWV3QXN5bmMoY3VzdG9tVmlld05hbWU6IHN0cmluZyk6IFByb21pc2U8Q3VzdG9tVmlld0ltcGw+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAncmVtb3ZlQ3VzdG9tVmlld0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5DdXN0b21WaWV3TmFtZV06IGN1c3RvbVZpZXdOYW1lLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5SZW1vdmVDdXN0b21WaWV3LCBwYXJhbWV0ZXJzKS50aGVuPEN1c3RvbVZpZXdJbXBsPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGN1c3RvbVZpZXcgPSByZXNwb25zZS5yZXN1bHQgYXMgQ3VzdG9tVmlld01vZGVsO1xuICAgICAgcmV0dXJuIG5ldyBDdXN0b21WaWV3SW1wbChjdXN0b21WaWV3LCB0aGlzLl9yZWdpc3RyeUlkKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzYXZlQ3VzdG9tVmlld0FzeW5jKGN1c3RvbVZpZXdOYW1lOiBzdHJpbmcpOiBQcm9taXNlPEN1c3RvbVZpZXdJbXBsPiB7XG4gICAgLy8gQ3VzdG9tVmlld0lzRGVmYXVsdCBpcyBhIHJlcXVpcmVkIHBhcmFtZXRlciwgYnV0IG91ciBBUEkgaGFzIG5vdCBiZWVuIHVwZGF0ZWQgdG8gYWxsb3cgaXQgdG8gYmUgc3BlY2lmaWVkIHlldC5cbiAgICAvLyBXZSBzaG91bGQgYWRkIGEgJ2RlZmF1bHQnIHBhcmFtZXRlciB0byB0aGUgaW50ZXJmYWNlLlxuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdzYXZlQ3VzdG9tVmlld0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5DdXN0b21WaWV3TmFtZV06IGN1c3RvbVZpZXdOYW1lLFxuICAgICAgW1BhcmFtZXRlcklkLkN1c3RvbVZpZXdJc0RlZmF1bHRdOiBmYWxzZSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuU2F2ZVdvcmtib29rQXNDdXN0b21WaWV3LCBwYXJhbWV0ZXJzKS50aGVuPEN1c3RvbVZpZXdJbXBsPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGN1c3RvbVZpZXcgPSByZXNwb25zZS5yZXN1bHQgYXMgQ3VzdG9tVmlld01vZGVsO1xuICAgICAgcmV0dXJuIG5ldyBDdXN0b21WaWV3SW1wbChjdXN0b21WaWV3LCB0aGlzLl9yZWdpc3RyeUlkKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRBY3RpdmVDdXN0b21WaWV3QXNEZWZhdWx0QXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3NldEFjdGl2ZUN1c3RvbVZpZXdBc0RlZmF1bHRBc3luYycsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlNldEFjdGl2ZUN1c3RvbVZpZXdBc0RlZmF1bHQsIHBhcmFtZXRlcnMpLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNhdmVBc3luYyhjdXN0b21WaWV3OiBDdXN0b21WaWV3SW1wbCk6IFByb21pc2U8Q3VzdG9tVmlld0ltcGw+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnc2F2ZUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5DdXN0b21WaWV3THVpZF06IGN1c3RvbVZpZXcubHVpZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5DdXN0b21WaWV3TmFtZV06IGN1c3RvbVZpZXcubmFtZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5DdXN0b21WaWV3SXNEZWZhdWx0XTogY3VzdG9tVmlldy5pc0RlZmF1bHQsXG4gICAgICBbUGFyYW1ldGVySWQuQ3VzdG9tVmlld0lzUHVibGljXTogY3VzdG9tVmlldy5zaGFyZWQsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlVwZGF0ZUN1c3RvbVZpZXcsIHBhcmFtZXRlcnMpLnRoZW48Q3VzdG9tVmlld0ltcGw+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgY3VzdG9tVmlldyA9IHJlc3BvbnNlLnJlc3VsdCBhcyBDdXN0b21WaWV3TW9kZWw7XG4gICAgICByZXR1cm4gbmV3IEN1c3RvbVZpZXdJbXBsKGN1c3RvbVZpZXcsIHRoaXMuX3JlZ2lzdHJ5SWQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldEN1cnJlbnRTcmNBc3luYygpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRDdXJyZW50U3JjQXN5bmMnLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRDdXJyZW50U3JjLCBwYXJhbWV0ZXJzKS50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UucmVzdWx0IGFzIHN0cmluZyk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5VHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBQYXJhbWV0ZXJJZCwgVmVyYklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyBhcyBFeHRlcm5hbEVudW1Db252ZXJ0ZXIgfSBmcm9tICcuLi8uLi9FbnVtTWFwcGluZ3MvRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzJztcbmltcG9ydCB7IERhc2hib2FyZE9iamVjdEltcGwgfSBmcm9tICcuLi8uLi9JbXBsL0Rhc2hib2FyZE9iamVjdEltcGwnO1xuaW1wb3J0IHsgRXJyb3JIZWxwZXJzIH0gZnJvbSAnLi4vLi4vVXRpbHMvRXJyb3JIZWxwZXJzJztcbmltcG9ydCB7IFBhcmFtIH0gZnJvbSAnLi4vLi4vVXRpbHMvUGFyYW0nO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFpvbmVTZXJ2aWNlIH0gZnJvbSAnLi4vWm9uZVNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuXG5leHBvcnQgY2xhc3MgWm9uZVNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgWm9uZVNlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5ab25lO1xuICB9XG5cbiAgcHVibGljIHNldFZpc2liaWxpdHlBc3luYyhcbiAgICBkYXNoYm9hcmQ6IHN0cmluZyxcbiAgICBkYXNoYm9hcmRab25lTWFwOiBNYXA8bnVtYmVyLCBEYXNoYm9hcmRPYmplY3RJbXBsPixcbiAgICB6b25lVmlzaWJpbGl0eU1hcDogQ29udHJhY3QuWm9uZVZpc2liaWxpdHlNYXAsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3NldFZpc2liaWxpdHlBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuRGFzaGJvYXJkXTogZGFzaGJvYXJkLFxuICAgICAgW1BhcmFtZXRlcklkLlpvbmVJZHNWaXNpYmlsaXR5TWFwXToge30sXG4gICAgfTtcblxuICAgIC8vIHpvbmVWaXNpYmlsaXR5TWFwIGNhbiBiZSBlaXRoZXIgYW4gb2JqZWN0IG9yIGEgTWFwIC0gY29udmVydCBpdCB0byBhIE1hcFxuICAgIGNvbnN0IHBhcmFtZXRlckFzTWFwID0gUGFyYW0uY29udmVydFBhcmFtZXRlclRvTWFwKHpvbmVWaXNpYmlsaXR5TWFwLCAnem9uZVZpc2liaWxpdHlNYXAnKTtcblxuICAgIHBhcmFtZXRlckFzTWFwLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgIEVycm9ySGVscGVycy52ZXJpZnlab25lSXNWYWxpZChkYXNoYm9hcmRab25lTWFwLCBOdW1iZXIucGFyc2VJbnQoa2V5LCAxMCkpO1xuICAgICAgRXJyb3JIZWxwZXJzLnZlcmlmeUVudW1WYWx1ZTxEYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5VHlwZT4odmFsdWUsIERhc2hib2FyZE9iamVjdFZpc2liaWxpdHlUeXBlLCAnRGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eVR5cGUnKTtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuWm9uZUlkc1Zpc2liaWxpdHlNYXBdW2tleV0gPSBFeHRlcm5hbEVudW1Db252ZXJ0ZXIuc2V0VmlzaWJpbGl0eVR5cGUuY29udmVydCh2YWx1ZSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5TZXRab25lVmlzaWJpbGl0eSwgcGFyYW1ldGVycykudGhlbjx2b2lkPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBtb3ZlQW5kUmVzaXplQXN5bmMoXG4gICAgZGFzaGJvYXJkOiBzdHJpbmcsXG4gICAgZGFzaGJvYXJkWm9uZU1hcDogTWFwPG51bWJlciwgRGFzaGJvYXJkT2JqZWN0SW1wbD4sXG4gICAgZGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlQXJyYXk6IENvbnRyYWN0LkRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUFycmF5LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkRhc2hib2FyZF06IGRhc2hib2FyZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGVMaXN0XTogZGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlQXJyYXksXG4gICAgfTtcblxuICAgIGRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUFycmF5LmZvckVhY2goKGRhc2hib2FyZE9iamVjdDogQ29udHJhY3QuRGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlKSA9PiB7XG4gICAgICBFcnJvckhlbHBlcnMudmVyaWZ5Wm9uZUlzVmFsaWRBbmRGbG9hdGluZyhkYXNoYm9hcmRab25lTWFwLCBkYXNoYm9hcmRPYmplY3QuZGFzaGJvYXJkT2JqZWN0SUQpO1xuICAgICAgRXJyb3JIZWxwZXJzLnZlcmlmeVdpZHRoQW5kSGVpZ2h0T2ZEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUoZGFzaGJvYXJkT2JqZWN0KTtcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLk1vdmVBbmRSZXNpemVab25lcywgcGFyYW1ldGVycykudGhlbjx2b2lkPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlSW5mbyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgYSB0YWJsZSBzdW1tYXJ5LlxuICogVGhpcyBkb2VzIG5vdCBmb2xsb3cgdGhlIEltcGwgcGF0dGVybiBhcyBpdCBpcyBqdXN0IGEgcHJvcGVydHkgYmFnLlxuICovXG5leHBvcnQgY2xhc3MgVGFibGVTdW1tYXJ5IGltcGxlbWVudHMgQ29udHJhY3QuVGFibGVTdW1tYXJ5IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX3RhYmxlSW5mbzogVGFibGVJbmZvKSB7fVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90YWJsZUluZm8ubmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fdGFibGVJbmZvLmlkO1xuICB9XG5cbiAgcHVibGljIGdldCBjb25uZWN0aW9uSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fdGFibGVJbmZvLmNvbm5lY3Rpb25JZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY3VzdG9tU1FMKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3RhYmxlSW5mby5jdXN0b21TUUw7XG4gIH1cbn1cbiIsImltcG9ydCB7IEVtYmVkZGluZ0Vycm9yQ29kZXMsIEVycm9yQ29kZXMsIFNoYXJlZEVycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuXG4vKipcbiAqIEN1c3RvbSBlcnJvciBjbGFzcyB0aGF0IGV4dGVuZHMgdGhlIGRlZmF1bHQgSmF2YVNjcmlwdCBFcnJvciBvYmplY3QuXG4gKiBUaGlzIGFsbG93cyB1cyB0byBwcm92aWRlIGEgZmllbGQgd2l0aCBhIHNwZWNpZmljIGVycm9yIGNvZGVcbiAqIHNvIHRoYXQgZGV2ZWxvcGVycyBjYW4gbW9yZSBlYXNpbHkgcHJvZ3JhbW1hdGljYWxseSByZXNwb25kXG4gKiB0byBlcnJvciBzY2VuYXJpb3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBUYWJsZWF1RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9lcnJvckNvZGU6IEVycm9yQ29kZXMgfCBFbWJlZGRpbmdFcnJvckNvZGVzIHwgU2hhcmVkRXJyb3JDb2RlcywgbWVzc2FnZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoYCR7X2Vycm9yQ29kZX06ICR7bWVzc2FnZX1gKTtcblxuICAgIC8qdHNsaW50OmRpc2FibGUtbmV4dC1saW5lICovXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9UeXBlU2NyaXB0LXdpa2kvYmxvYi9tYXN0ZXIvQnJlYWtpbmctQ2hhbmdlcy5tZCNleHRlbmRpbmctYnVpbHQtaW5zLWxpa2UtZXJyb3ItYXJyYXktYW5kLW1hcC1tYXktbm8tbG9uZ2VyLXdvcmtcbiAgICAvLyBFcnJvciBpbmhlcml0YW5jZSBkb2VzIG5vdCB3b3JrIHByb3BlcnRseSB3aGVuIGNvbXBpbGluZyB0byBFUzUsIHRoaXMgaXMgYSB3b3JrYXJvdW5kIHRvIGZvcmNlXG4gICAgLy8gdGhlIHByb3RvIGNoYWluIHRvIGJlIGJ1aWx0IGNvcnJlY3RseS4gIFNlZSB0aGUgZ2l0aHViIGxpbmsgYWJvdmUgZm9yIGRldGFpbHMuXG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIFRhYmxlYXVFcnJvci5wcm90b3R5cGUpO1xuICB9XG5cbiAgcHVibGljIGdldCBlcnJvckNvZGUoKTogRXJyb3JDb2RlcyB8IEVtYmVkZGluZ0Vycm9yQ29kZXMgfCBTaGFyZWRFcnJvckNvZGVzIHtcbiAgICByZXR1cm4gdGhpcy5fZXJyb3JDb2RlO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBJbnRlcm5hbENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXRhVmFsdWUgfSBmcm9tICcuLi9Nb2RlbHMvR2V0RGF0YU1vZGVscyc7XG5cbi8qKlxuICogSW4gdmVyc2lvbiAyIG9mIHRoZSBpbnRlcmZhY2UsIHdlIHNob3VsZCBjb2xsYXBzZSB2YWx1ZSBpbnRvIG5hdGl2ZVZhbHVlLCBhbmQgZG8gYWxsIHRoaXMgd29yayBvdmVyXG4gKiBpbiB0aGUgcGxhdGZvcm0uXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXRhVmFsdWVGYWN0b3J5IHtcbiAgcHVibGljIHN0YXRpYyBNYWtlUGFyYW1ldGVyRGF0YVZhbHVlKGludGVybmFsRGF0YVZhbHVlOiBJbnRlcm5hbENvbnRyYWN0LkRhdGFWYWx1ZSwgZGF0YVR5cGU6IEludGVybmFsQ29udHJhY3QuRGF0YVR5cGUpOiBEYXRhVmFsdWUge1xuICAgIC8vIFBhcmFtZXRlciB2YWx1ZXMgYXJlIGFsbCBzdHJpbmdzLCBjb252ZXJ0IGZyb20gc3RyaW5nIHRvIHZhbHVlXG4gICAgcmV0dXJuIG5ldyBEYXRhVmFsdWUoXG4gICAgICBpbnRlcm5hbERhdGFWYWx1ZS52YWx1ZSxcbiAgICAgIEludGVybmFsQ29udHJhY3QuRGF0YVR5cGVDb252ZXJ0ZXIuY29udmVydFN0cmluZ1ZhbHVlVG9OYXRpdmVWYWx1ZShpbnRlcm5hbERhdGFWYWx1ZS52YWx1ZSwgZGF0YVR5cGUpLFxuICAgICAgaW50ZXJuYWxEYXRhVmFsdWUuZm9ybWF0dGVkVmFsdWUsXG4gICAgICBpbnRlcm5hbERhdGFWYWx1ZS5hbGlhc2VkVmFsdWUsXG4gICAgICBpbnRlcm5hbERhdGFWYWx1ZS5oYXNBbGlhcyxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBNYWtlRmlsdGVyRGF0YVZhbHVlKGludGVybmFsRGF0YVZhbHVlOiBJbnRlcm5hbENvbnRyYWN0LkRhdGFWYWx1ZSk6IERhdGFWYWx1ZSB7XG4gICAgLy8gRmlsdGVycyBhbHJlYWR5IGhhdmUgbmF0aXZlIHR5cGUgaW4gdmFsdWUsIGp1c3QgdXNlIHRoYXQgZm9yIG5hdGl2ZVZhbHVlIGFsc29cbiAgICByZXR1cm4gbmV3IERhdGFWYWx1ZShpbnRlcm5hbERhdGFWYWx1ZS52YWx1ZSwgaW50ZXJuYWxEYXRhVmFsdWUudmFsdWUsIGludGVybmFsRGF0YVZhbHVlLmZvcm1hdHRlZFZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgTWFrZVRhYmxlRGF0YVZhbHVlKGludGVybmFsRGF0YVZhbHVlOiBJbnRlcm5hbENvbnRyYWN0LkRhdGFWYWx1ZSwgZGF0YVR5cGU6IEludGVybmFsQ29udHJhY3QuRGF0YVR5cGUpOiBEYXRhVmFsdWUge1xuICAgIC8vIERhdGFUYWJsZXMgY29udGFpbiBib29sZWFuIHwgbnVtYmVyIHwgc3RyaW5nIHwgZGF0ZSBhcyBzdHJpbmcgfCAnJW51bGwlXG4gICAgLy8gY29udmVydFZhbHVlVG9OYXRpdmVWYWx1ZSBjb252ZXJ0cyBkYXRlcyBhcyBzdHJpbmcgdG8gZGF0ZXMsIGFuZCBhbnkgc3BlY2lhbCB0byBudWxsXG4gICAgLy8gKGJvb2xlYW4sIG51bWJlcnMsIHN0cmluZ3MgYXJlIHBhc3NlZCB0aHJvdWdoKVxuICAgIC8vIEJlY2F1c2Ugb2YgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gLSB3ZSBjYW4gaGF2ZSB1bmRlZmluZWQgdmFsdWVzLCB3aGljaCBhcmUgZGlmZmVyZW50IHRoYW4gYW55IHNwZWNpYWxcbiAgICByZXR1cm4gbmV3IERhdGFWYWx1ZShcbiAgICAgIGludGVybmFsRGF0YVZhbHVlLnZhbHVlLFxuICAgICAgaW50ZXJuYWxEYXRhVmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IEludGVybmFsQ29udHJhY3QuRGF0YVR5cGVDb252ZXJ0ZXIuY29udmVydFZhbHVlVG9OYXRpdmVWYWx1ZShpbnRlcm5hbERhdGFWYWx1ZS52YWx1ZSwgZGF0YVR5cGUpXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgaW50ZXJuYWxEYXRhVmFsdWUuZm9ybWF0dGVkVmFsdWUsXG4gICAgKTtcbiAgfVxufVxuIiwiLyoqXG4gKiBBIFByb21pc2Ugd3JhcHBlciBjbGFzcyBhbGxvd2luZyBmb3IgcmVzb2x2aW5nL3JlamVjdGluZyB0aGUgUHJvbWlzZSBvdXRzaWRlIHRoZSBjb250ZXh0IG9mIGl0cyBjb25zdHJ1Y3Rvci5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAY2xhc3MgRGVmZXJyZWRcbiAqIEB0ZW1wbGF0ZSBUUmVzb2x2ZSBUaGUgdHlwZSB1c2VkIHRvIHJlc29sdmUgdGhlIHByb21pc2UuXG4gKiBAdGVtcGxhdGUgVFJlamVjdCBUaGUgdHlwZSB1c2VkIHRvIHJlamVjdCB0aGUgcHJvbWlzZS4gRGVmYXVsdHMgdG8gYW55LlxuICogQGxpbmsgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzM0NjM3NDM2XG4gKi9cbmV4cG9ydCBjbGFzcyBEZWZlcnJlZDxUUmVzb2x2ZSwgVFJlamVjdCA9IGFueT4ge1xuICBwcml2YXRlIF9wcm9taXNlOiBQcm9taXNlPFRSZXNvbHZlPjtcbiAgcHJpdmF0ZSBfcmVzb2x2ZTogKHJlc3BvbnNlOiBUUmVzb2x2ZSB8IFByb21pc2VMaWtlPFRSZXNvbHZlPikgPT4gdm9pZDtcbiAgcHJpdmF0ZSBfcmVqZWN0OiAocmVhc29uPzogVFJlamVjdCkgPT4gdm9pZDtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBEZWZlcnJlZC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX3Byb21pc2UgPSBuZXcgUHJvbWlzZTxUUmVzb2x2ZT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5fcmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICB0aGlzLl9yZWplY3QgPSByZWplY3Q7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgUHJvbWlzZS5cbiAgICpcbiAgICogQHJlYWRvbmx5XG4gICAqIEB0eXBlIHtQcm9taXNlPFRSZXNvbHZlPn1cbiAgICovXG4gIGdldCBwcm9taXNlKCk6IFByb21pc2U8VFJlc29sdmU+IHtcbiAgICByZXR1cm4gdGhpcy5fcHJvbWlzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgd3JhcHBlZCBQcm9taXNlLlxuICAgKlxuICAgKiBAcGFyYW0geyhUUmVzb2x2ZSB8IFByb21pc2VMaWtlPFRSZXNvbHZlPil9IHJlc3BvbnNlIFRoZSBhcmd1bWVudCB0byBiZSByZXNvbHZlZCBieSB0aGUgUHJvbWlzZS5cbiAgICogQHJldHVybnMgeyp9ICB7dm9pZH1cbiAgICovXG4gIHJlc29sdmUocmVzcG9uc2U6IFRSZXNvbHZlIHwgUHJvbWlzZUxpa2U8VFJlc29sdmU+KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9yZXNvbHZlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fcmVzb2x2ZShyZXNwb25zZSk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICpcbiAgICogQHBhcmFtIHtUUmVqZWN0fSBbcmVhc29uXSBUaGUgcmVhc29uIHdoeSB0aGUgUHJvbWlzZSByZWplY3RlZC5cbiAgICogQHJldHVybnMgeyp9ICB7dm9pZH1cbiAgICovXG4gIHJlamVjdChyZWFzb24/OiBUUmVqZWN0KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9yZWplY3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9yZWplY3QocmVhc29uKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgVW5yZWdpc3RlclRpbWVvdXRJbk1pbGxpc2Vjb25kcyA9IDMwMDAwO1xuIiwiaW1wb3J0IHsgRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuXG4vKipcbiAqIFRoaXMgY2xhc3MgY29udmVydHMgZnJvbSBhIHNvdXJjZSBlbnVtIHZhbHVlIHRvIGRlc3RpbmF0aW9uIGVudW1cbiAqIHZhbHVlIGdpdmVuIGEgbWFwcGluZyBmcm9tIHNvdXJjZSB0byBkZXN0aW5hdGlvbiB3aGVuIGNvbnN0cnVjdGVkLlxuICpcbiAqIE5vdGU6IFRoaXMgZXhhY3Qgc2FtZSBjbGFzcyBpcyBkZWZpbmVkIGluIGFwaS1jb3JlLiAgR2l2ZW4gaXRzIHNtYWxsXG4gKiBuYXR1cmUsIGl0IGlzIG5vdCB3b3J0aCBoYXZpbmcgaW4gYSBzZXBhcmF0ZSBwcm9qZWN0IHRvIHNoYXJlIHRoaXMgYmV0d2VlblxuICogYXBpLWNvcmUgYW5kIGFwaS1zaGFyZWQuICBJZiBtb3JlIHV0aWxpdHkgZnVuY3Rpb25hbGl0eSBpcyBhZGRlZCB0aGF0IGlzIHVzZWQgYnkgYXBpLWNvcmVcbiAqIGFuZCBhcGktc2hhcmVkIGJ1dCBoYXMgbm8gb3RoZXIgZGVwZW5kZWNpZXMsIGEgdXRpbHRpdHkgcHJvamVjdCBtaWdodCBiZSBtZXJpdGVkLFxuICogYW5kIHRoaXMgY2xhc3MgY291bGQgYmUgbW92ZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBFbnVtQ29udmVydGVyPFRTb3VyY2VUeXBlIGV4dGVuZHMgc3RyaW5nLCBURGVzdGluYXRpb25UeXBlPiB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9tYXBwaW5nczogeyBbZW51bVZhbDogc3RyaW5nXTogVERlc3RpbmF0aW9uVHlwZSB9LCBwcml2YXRlIF9kZWZhdWx0VmFsPzogVERlc3RpbmF0aW9uVHlwZSkge31cblxuICBwdWJsaWMgY29udmVydChlbnVtVmFsOiBUU291cmNlVHlwZSwgdGhyb3dJZk1pc3Npbmc6IFNob3VsZFRocm93ID0gU2hvdWxkVGhyb3cuWWVzKTogVERlc3RpbmF0aW9uVHlwZSB7XG4gICAgaWYgKHRoaXMuX21hcHBpbmdzLmhhc093blByb3BlcnR5KGVudW1WYWwpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fbWFwcGluZ3NbZW51bVZhbCBhcyBzdHJpbmddO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9kZWZhdWx0VmFsICE9PSB1bmRlZmluZWQgJiYgdGhyb3dJZk1pc3NpbmcgIT09IFNob3VsZFRocm93Llllcykge1xuICAgICAgcmV0dXJuIHRoaXMuX2RlZmF1bHRWYWw7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludGVybmFsRXJyb3IsIGBFbnVtIE1hcHBpbmcgbm90IGZvdW5kIGZvcjogJHtlbnVtVmFsfWApO1xuICB9XG59XG5cbmV4cG9ydCBlbnVtIFNob3VsZFRocm93IHtcbiAgWWVzID0gJ3llcycsXG4gIE5vID0gJ25vJyxcbn1cbiIsImltcG9ydCB7XG4gIERhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZSxcbiAgRXhwb3J0RGF0YU9wdGlvbnMsXG4gIEV4cG9ydFNjZW5hcmlvc0ZvclBERkFuZFBvd2VyUG9pbnQsXG4gIEV4cG9ydFBERk9wdGlvbnMgYXMgRXh0ZXJuYWxFeHBvcnRQREZPcHRpb25zLFxuICBQcmludE9yaWVudGF0aW9uLFxuICBQcmludFBhZ2VTaXplLFxuICBQcmludFNjYWxpbmcsXG4gIFJhbmdlRmlsdGVyT3B0aW9ucyxcbiAgU2hhcmVkRXJyb3JDb2Rlcyxcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IERhc2hib2FyZE9iamVjdEltcGwgfSBmcm9tICcuLi9JbXBsL0Rhc2hib2FyZE9iamVjdEltcGwnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vVGFibGVhdUVycm9yJztcbmltcG9ydCB7IFBhcmFtIH0gZnJvbSAnLi9QYXJhbSc7XG5cbmludGVyZmFjZSBFbnVtTGlrZSB7XG4gIHRvU3RyaW5nKCk6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gY29uc3RydWN0IGNvbW1vbiBlcnJvcnMgdGhyb3VnaG91dCB0aGUgZXh0ZXJuYWxcbiAqIHByb2plY3RzIChhcGktc2hhcmVkLCBleHRlbnNpb25zLWFwaSwgZXRjLikuICBJdCBoYXMgc29tZSBkdXBsaWNhdGlvbiB3aXRoXG4gKiB0aGUgRXJyb3JIZWxwZXJzIGNsYXNzIGluIGFwaS1jb3JlLCBidXQgaXMgc2VwYXJhdGUgZHVlIHRvIHRoZSBuZWVkIHRvIHRocm93XG4gKiBhbiBleHRlcm5hbCBUYWJsZWF1RXJyb3IgdnMuIGFuIEludGVybmFsVGFibGVhdUVycm9yLlxuICovXG5leHBvcnQgY2xhc3MgRXJyb3JIZWxwZXJzIHtcbiAgLyoqXG4gICAqIFRocm93cyB3aXRoIGNvZGUgSW50ZXJuYWxFcnJvci5cbiAgICpcbiAgICogQHBhcmFtIGFwaU5hbWUgbmFtZSBvZiBhcGkgdGhhdCB3YXMgY2FsbGVkLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBhcGlOb3RJbXBsZW1lbnRlZChhcGlOYW1lOiBzdHJpbmcpOiBUYWJsZWF1RXJyb3Ige1xuICAgIHJldHVybiBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYCR7YXBpTmFtZX0gQVBJIG5vdCB5ZXQgaW1wbGVtZW50ZWQuYCk7XG4gIH1cblxuICAvKipcbiAgICogVGhyb3dzIGFuIGludGVybmFsIGVycm9yIGlmIGFyZ3VtZW50IGlzIG51bGwgb3IgdW5kZWZpbmVkLlxuICAgKlxuICAgKiBAcGFyYW0gYXJndW1lbnRWYWx1ZSB2YWx1ZSB0byB2ZXJpZnlcbiAgICogQHBhcmFtIGFyZ3VtZW50TmFtZSBuYW1lIG9mIGFyZ3VtZW50IHRvIHZlcmlmeVxuICAgKi9cbiAgLyp0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlJbnRlcm5hbFZhbHVlKGFyZ3VtZW50VmFsdWU6IGFueSwgYXJndW1lbnROYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAoYXJndW1lbnRWYWx1ZSA9PT0gbnVsbCB8fCBhcmd1bWVudFZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgJHthcmd1bWVudFZhbHVlfSBpcyBpbnZhbGlkIHZhbHVlIGZvcjogJHthcmd1bWVudE5hbWV9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRocm93cyBhbiBJbnZhbGlkUGFyYW1ldGVyIGVycm9yIGlmIGFyZ3VtZW50IGlzIG51bGwgb3IgdW5kZWZpbmVkLlxuICAgKlxuICAgKiBAcGFyYW0gYXJndW1lbnRWYWx1ZSB2YWx1ZSB0byB2ZXJpZnlcbiAgICogQHBhcmFtIGFyZ3VtZW50TmFtZSBuYW1lIG9mIGFyZ3VtZW50IHRvIHZlcmlmeVxuICAgKi9cbiAgLyp0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlQYXJhbWV0ZXIoYXJndW1lbnRWYWx1ZTogYW55LCBhcmd1bWVudE5hbWU6IHN0cmluZykge1xuICAgIGlmIChhcmd1bWVudFZhbHVlID09PSBudWxsIHx8IGFyZ3VtZW50VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsIGAke2FyZ3VtZW50VmFsdWV9IGlzIGludmFsaWQgdmFsdWUgZm9yIHBhcmFtZXRlcjogJHthcmd1bWVudE5hbWV9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRocm93cyBhbiBJbnZhbGlkUGFyYW1ldGVyIGVycm9yIGlmIGFyZ3VtZW50IGlzIG5vdCB0aGUgc3BlY2lmaWVkIHR5cGUuXG4gICAqIEZvciBvYmplY3RzLCBpdCBqdXN0IHRlc3RzIHRoYXQgaXQgaXMgYW4gb2JqZWN0XG4gICAqXG4gICAqIEBwYXJhbSBhcmd1bWVudFZhbHVlIHZhbHVlIHRvIHZlcmlmeVxuICAgKiBAcGFyYW0gZXhwZWN0ZWRUeXBlIGV4cGVjdGVkIHJlc3VsdCBvZiB0eXBlb2ZcbiAgICogQHBhcmFtIGFyZ3VtZW50TmFtZSBuYW1lIG9mIGFyZ3VtZW50IHRvIHZlcmlmeVxuICAgKi9cbiAgLyp0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlQYXJhbWV0ZXJUeXBlKGFyZ3VtZW50VmFsdWU6IGFueSwgZXhwZWN0ZWRUeXBlOiBzdHJpbmcsIGFyZ3VtZW50TmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKHR5cGVvZiBhcmd1bWVudFZhbHVlICE9PSBleHBlY3RlZFR5cGUpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLCBgJHthcmd1bWVudFZhbHVlfSBoYXMgaW52YWxpZCB0eXBlIGZvciBwYXJhbWV0ZXI6ICR7YXJndW1lbnROYW1lfS5gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhyb3dzIGFuIEludmFsaWRQYXJhbWV0ZXIgZXJyb3IgaWYgYXJndW1lbnQgaXMgZW1wdHkgc3RyaW5nLCBudWxsIG9yIHVuZGVmaW5lZC5cbiAgICpcbiAgICogQHBhcmFtIGFyZ3VtZW50VmFsdWUgdmFsdWUgdG8gdmVyaWZ5XG4gICAqIEBwYXJhbSBhcmd1bWVudE5hbWUgbmFtZSBvZiBhcmd1bWVudCB0byB2ZXJpZnlcbiAgICovXG4gIC8qdHNsaW50OmRpc2FibGUtbmV4dC1saW5lICovXG4gIHB1YmxpYyBzdGF0aWMgdmVyaWZ5U3RyaW5nUGFyYW1ldGVyKGFyZ3VtZW50VmFsdWU6IHN0cmluZywgYXJndW1lbnROYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAoYXJndW1lbnRWYWx1ZSA9PT0gbnVsbCB8fCBhcmd1bWVudFZhbHVlID09PSB1bmRlZmluZWQgfHwgYXJndW1lbnRWYWx1ZSA9PT0gJycpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLCBgJHthcmd1bWVudFZhbHVlfSBpcyBpbnZhbGlkIHZhbHVlIGZvciBwYXJhbXRlcjogJHthcmd1bWVudE5hbWV9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHBhc3NlZCB2YWx1ZSBpcyBhIHZhbGlkIHZhbHVlIGZvciB0aGF0IGVudW0uXG4gICAqXG4gICAqIFN0cmluZyBlbnVtcyBhcmUge3N0cmluZyA6IHN0cmluZ30gZGljdGlvbmFyaWVzIHdoaWNoIGFyZSBub3QgcmV2ZXJzZSBtYXBwYWJsZVxuICAgKiBUaGlzIGlzIGFuIHVnbHkgd29ya2Fyb3VuZFxuICAgKlxuICAgKiBAcGFyYW0gZW51bVZhbHVlIHZhbHVlIHRvIHZlcmlmeVxuICAgKiBAcGFyYW0gZW51bVR5cGUgZW51bSB0byB2ZXJpZnkgYWdhaW5zdFxuICAgKi9cbiAgLyp0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgKi9cbiAgcHVibGljIHN0YXRpYyBpc1ZhbGlkRW51bVZhbHVlPEVudW1UeXBlIGV4dGVuZHMgRW51bUxpa2U+KGVudW1WYWx1ZTogRW51bVR5cGUsIGVudW1UeXBlOiBhbnkpOiBib29sZWFuIHtcbiAgICBsZXQgaXNWYWxpZCA9IGZhbHNlO1xuICAgIE9iamVjdC5rZXlzKGVudW1UeXBlKS5mb3JFYWNoKChlbnVtS2V5KSA9PiB7XG4gICAgICBpZiAoZW51bVR5cGVbZW51bUtleV0gPT09IGVudW1WYWx1ZS50b1N0cmluZygpKSB7XG4gICAgICAgIGlzVmFsaWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGlzVmFsaWQ7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgcGFzc2VkIHZhbHVlIGlzIGEgdmFsaWQgdmFsdWUgZm9yIHRoYXQgZW51bS5cbiAgICogVGhyb3dzIGFuIEludmFsaWRQYXJhbWV0ZXIgZXJyb3IgaWYgdGhlIGVudW0gdmFsdWUgaXMgbm90IHZhbGlkLlxuICAgKlxuICAgKiBTdHJpbmcgZW51bXMgYXJlIHtzdHJpbmcgOiBzdHJpbmd9IGRpY3Rpb25hcmllcyB3aGljaCBhcmUgbm90IHJldmVyc2UgbWFwcGFibGVcbiAgICogVGhpcyBpcyBhbiB1Z2x5IHdvcmthcm91bmRcbiAgICpcbiAgICogQHBhcmFtIGVudW1WYWx1ZSB2YWx1ZSB0byB2ZXJpZnlcbiAgICogQHBhcmFtIGVudW1UeXBlIGVudW0gdG8gdmVyaWZ5IGFnYWluc3RcbiAgICogQHBhcmFtIGVudW1OYW1lIGVudW0gbmFtZSBmb3IgY2xlYXIgZXJyb3IgbWVzc2FnZVxuICAgKi9cbiAgLyp0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlFbnVtVmFsdWU8RW51bVR5cGUgZXh0ZW5kcyBFbnVtTGlrZT4oZW51bVZhbHVlOiBFbnVtVHlwZSwgZW51bVR5cGU6IGFueSwgZW51bU5hbWU6IHN0cmluZykge1xuICAgIGlmICghRXJyb3JIZWxwZXJzLmlzVmFsaWRFbnVtVmFsdWUoZW51bVZhbHVlLCBlbnVtVHlwZSkpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLCBgJHtlbnVtVmFsdWV9IGlzIGludmFsaWQgdmFsdWUgZm9yIGVudW06ICR7ZW51bU5hbWV9LmApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyBwYXNzZWQgdmFsdWUgaXMgYmV0d2VlbiBbbWluLCBtYXgpIC4uLiBtaW4gPD0gdmFsdWUgPCBtYXhcbiAgICogVGhyb3dzIGFuIEludmFsaWRQYXJhbWV0ZXIgZXJyb3IgaWYgdGhlIHZhbHVlIGlzIG5vdCB2YWxpZC5cbiAgICpcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIHZhbHVlIHRvIHZlcmlmeVxuICAgKiBAcGFyYW0gbWluICAgdmFsdWUgbXVzdCBiZSA+PSBtaW5cbiAgICogQHBhcmFtIG1heCAgIHZhbHVlIG11c3QgYmUgPCBtYXhcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdmVyaWZ5UmFuZ2UodmFsdWU6IG51bWJlciwgbWluOiBudW1iZXIsIG1heDogbnVtYmVyKSB7XG4gICAgbGV0IGlzVmFsaWQgPSBtaW4gPD0gdmFsdWUgJiYgdmFsdWUgPCBtYXg7XG5cbiAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLCBgJHt2YWx1ZX0gaXMgaW52YWxpZCB2YWx1ZSBmb3IgcmFuZ2U6IFske21pbn0uLiR7bWF4fSlgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhlIHBhcmFtcyBtaW4gYW5kIG1heCBmb3IgYXBwbHlpbmcgcmFuZ2UgZmlsdGVyLlxuICAgKiBUaHJvd3Mgd2l0aCBlcnJvciBjb2RlIEludmFsaWRQYXJhbWV0ZXIgaWYgcmFuZ2UgaXMgaW52YWxpZC5cbiAgICpcbiAgICogQHBhcmFtIG1pbiByYW5nZSBtaW5cbiAgICogQHBhcmFtIG1heCByYW5nZSBtYXhcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdmVyaWZ5UmFuZ2VQYXJhbVR5cGUobWluOiBSYW5nZUZpbHRlck9wdGlvbnNbJ21pbiddLCBtYXg6IFJhbmdlRmlsdGVyT3B0aW9uc1snbWF4J10pOiB2b2lkIHtcbiAgICBjb25zdCBpc01pbkRlZmluZWQgPSBtaW4gIT09IHVuZGVmaW5lZDtcbiAgICBjb25zdCBpc01heERlZmluZWQgPSBtYXggIT09IHVuZGVmaW5lZDtcblxuICAgIGlmICghaXNNaW5EZWZpbmVkICYmICFpc01heERlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLCAnVW5leHBlY3RlZCBpbnZhbGlkIHBhcmFtIHZhbHVlLCBhdCBsZWFzdCBvbmUgb2YgbWluIG9yIG1heCBpcyByZXF1aXJlZC4nKTtcbiAgICB9XG5cbiAgICBpZiAoaXNNaW5EZWZpbmVkICYmICFQYXJhbS5pc1R5cGVOdW1iZXIobWluKSAmJiAhUGFyYW0uaXNUeXBlRGF0ZShtaW4pKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgICBTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsXG4gICAgICAgICdVbmV4cGVjdGVkIGludmFsaWQgcGFyYW0gdmFsdWUsIG9ubHkgRGF0ZSBhbmQgbnVtYmVyIGFyZSBhbGxvd2VkIGZvciBwYXJhbWV0ZXIgbWluLicsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChpc01heERlZmluZWQgJiYgIVBhcmFtLmlzVHlwZU51bWJlcihtYXgpICYmICFQYXJhbS5pc1R5cGVEYXRlKG1heCkpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoXG4gICAgICAgIFNoYXJlZEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlcixcbiAgICAgICAgJ1VuZXhwZWN0ZWQgaW52YWxpZCBwYXJhbSB2YWx1ZSwgb25seSBEYXRlIGFuZCBudW1iZXIgYXJlIGFsbG93ZWQgZm9yIHBhcmFtZXRlciBtYXguJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGlzTWluRGVmaW5lZCAmJiBpc01heERlZmluZWQgJiYgdHlwZW9mIG1pbiAhPT0gdHlwZW9mIG1heCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihcbiAgICAgICAgU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLFxuICAgICAgICAnVW5leHBlY3RlZCBpbnZhbGlkIHBhcmFtIHZhbHVlLCBwYXJhbWV0ZXJzIG1pbiBhbmQgbWF4IHNob3VsZCBiZSBvZiB0aGUgc2FtZSB0eXBlLicsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGF0IHRoZSB6b25lSWQgaXMgcHJlc2VudCBpbiB0aGUgY3VycmVudCBkYXNoYm9hcmQuXG4gICAqIFRocm93cyB3aXRoIGVycm9yIGNvZGUgSW52YWxpZFBhcmFtZXRlciBpZiBlaXRoZXIgY29uZGl0aW9uIGlzIGZhbHNlLlxuICAgKlxuICAgKiBAcGFyYW0gZGFzaGJvYXJkWm9uZU1hcCBBIG1hcCBvZiB6b25lSWQncyB0byB0aGUgY29ycmVzcG9uZGluZyBkYXNoYm9hcmQgb2JqZWN0LlxuICAgKiBAcGFyYW0gem9uZUlEIFpvbmVJZCB0byBiZSB2YWxpZGF0ZWRcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdmVyaWZ5Wm9uZUlzVmFsaWQoZGFzaGJvYXJkWm9uZU1hcDogTWFwPG51bWJlciwgRGFzaGJvYXJkT2JqZWN0SW1wbD4sIHpvbmVJRDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKGRhc2hib2FyZFpvbmVNYXAuaGFzKHpvbmVJRCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLFxuICAgICAgYFVuZXhwZWN0ZWQgaW52YWxpZCBwYXJhbSB2YWx1ZSwgRGFzaGJvYXJkIE9iamVjdCBJZDogJHt6b25lSUR9IGlzIG5vdCBwcmVzZW50IGluIGRhc2hib2FyZC5gLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhhdCB0aGUgem9uZSBpcyBwcmVzZW50IGFuZCBmbG9hdGluZyBpbiB0aGUgY3VycmVudCBkYXNoYm9hcmQuXG4gICAqIFRocm93cyB3aXRoIGVycm9yIGNvZGUgSW52YWxpZFBhcmFtZXRlciBpZiBlaXRoZXIgY29uZGl0aW9uIGlzIGZhbHNlLlxuICAgKlxuICAgKiBAcGFyYW0gZGFzaGJvYXJkWm9uZU1hcCBBIG1hcCBvZiB6b25lSWQncyB0byB0aGUgY29ycmVzcG9uZGluZyBkYXNoYm9hcmQgb2JqZWN0LlxuICAgKiBAcGFyYW0gem9uZUlEIFpvbmVJZCB0byBiZSB2YWxpZGF0ZWRcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdmVyaWZ5Wm9uZUlzVmFsaWRBbmRGbG9hdGluZyhkYXNoYm9hcmRab25lTWFwOiBNYXA8bnVtYmVyLCBEYXNoYm9hcmRPYmplY3RJbXBsPiwgem9uZUlEOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoZGFzaGJvYXJkWm9uZU1hcC5oYXMoem9uZUlEKSAmJiBkYXNoYm9hcmRab25lTWFwLmdldCh6b25lSUQpIS5pc0Zsb2F0aW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihcbiAgICAgIFNoYXJlZEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlcixcbiAgICAgIGBVbmV4cGVjdGVkIGludmFsaWQgcGFyYW0gdmFsdWUsIERhc2hib2FyZCBPYmplY3QgSWQ6ICR7em9uZUlEfSBpcyBub3QgcHJlc2VudCBvciBpcyBhIGZpeGVkIHpvbmUgaW4gdGhlIGRhc2hib2FyZC5gLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhhdCB3aWR0aCBhbmQgaGVpZ2h0IGFyZSA+IDAgZm9yIGVhY2ggRGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlIG9iamVjdC5cbiAgICogVGhyb3dzIHdpdGggZXJyb3IgY29kZSBJbnZhbGlkUGFyYW1ldGVyIGlmIGVpdGhlciBjb25kaXRpb24gaXMgZmFsc2UuXG4gICAqXG4gICAqIEBwYXJhbSBkYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUgRGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlIG9iamVjdCBmb3Igd2hpY2ggd2lkdGggYW5kIGhlaWdodCB3aWxsIGJlIHZhbGlkYXRlZFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlXaWR0aEFuZEhlaWdodE9mRGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlKFxuICAgIGRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZTogRGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlLFxuICApOiB2b2lkIHtcbiAgICBpZiAoZGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlLndpZHRoIDwgMCB8fCBkYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUuaGVpZ2h0IDwgMCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihcbiAgICAgICAgU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLFxuICAgICAgICBgVW5leHBlY3RlZCBpbnZhbGlkIHBhcmFtIHZhbHVlIGZvciBkYXNoYm9hcmQgb2JqZWN0IElEICR7ZGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlLmRhc2hib2FyZE9iamVjdElEfTpgICtcbiAgICAgICAgICBgIG5lZ2F0aXZlIHdpZHRocyBhbmQgaGVpZ2h0cyBhcmUgbm90IGFsbG93ZWQuYCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIGlzIHRoZSBnaXZlbiBzaGVldCBuYW1lIGlzIGluIHRoZSBsaXN0IG9mIHNoZWV0cyBuYW1lcyBhbGxvd2VkIGZvciBleHBvcnRpbmcuXG4gICAqIFRocm93cyB3aXRoIGVycm9yIGNvZGUgSW52YWxpZFBhcmFtZXRlciBpZiB0aGUgY29uZGl0aW9uIGFib3ZlIGlzIGZhbHNlLlxuICAgKlxuICAgKiBAcGFyYW0gZXhwb3J0YWJsZVNoZWV0TmFtZXMgQSBsaXN0IG9mIHNoZWV0IG5hbWVzIGFsbG93ZWQgZm9yIGV4cG9ydGluZ1xuICAgKiBAcGFyYW0gc2hlZXROYW1lIHRoZSBuYW1lIG9mIHRoZSBzaGVldCBzZWxlY3RlZCBmb3IgZXhwb3J0XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeVNoZWV0TmFtZShleHBvcnRhYmxlU2hlZXROYW1lczogQXJyYXk8c3RyaW5nPiwgc2hlZXROYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAoIWV4cG9ydGFibGVTaGVldE5hbWVzLmluY2x1ZGVzKHNoZWV0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoXG4gICAgICAgIFNoYXJlZEVycm9yQ29kZXMuSW52YWxpZFNlbGVjdGlvblNoZWV0LFxuICAgICAgICAnc2hlZXROYW1lIHBhcmFtZXRlciBtdXN0IGJlbG9uZyB0byBhIHdvcmtzaGVldCB3aXRoaW4gdGhlIGN1cnJlbnQgdmlldycsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGUgRXhwb3J0RGF0YU9wdGlvbnMgb2JqZWN0XG4gICAqIFRocm93cyB3aXRoIGVycm9yIGNvZGUgSW52YWxpZFBhcmFtZXRlciBpZiB0aGUgcGFyYW1ldGVyIGlzIG5vdCBvZiBFeHBvcnREYXRhT3B0aW9ucyB0eXBlLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgRXhwb3J0RGF0YU9wdGlvbnMgb2JqZWN0IHVzZWQgdG8gY29uZmlndXJlIHRoZSBvdXRwdXQgQ1NWIGZpbGUgZm9yIGV4cG9ydERhdGFBc3luYy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdmVyaWZ5RXhwb3J0RGF0YU9wdGlvbnMob3B0aW9uczogRXhwb3J0RGF0YU9wdGlvbnMpOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICAoIVBhcmFtLmlzTnVsbE9yVW5kZWZpbmVkKG9wdGlvbnMuaWdub3JlQWxpYXNlcykgJiYgIVBhcmFtLmlzVHlwZUJvb2wob3B0aW9ucy5pZ25vcmVBbGlhc2VzKSkgfHxcbiAgICAgICghUGFyYW0uaXNOdWxsT3JVbmRlZmluZWQob3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlQnlJZCkgJiYgIUFycmF5LmlzQXJyYXkob3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlQnlJZCkpXG4gICAgKVxuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsICdvcHRpb25zIHBhcmFtYXRlciBtdXN0IGJlIG9mIHR5cGUgRXhwb3J0RGF0YU9wdGlvbnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyBpZiB0aGUgc2hlZXQgbmFtZXMgYXJlIGluY2x1ZGVkIGluIGFueSBvZiB0aGUgZXhwb3J0IHNjZW5hcmlvcy5cbiAgICogVGhyb3dzIHdpdGggZXJyb3IgY29kZSBJbnZhbGlkUGFyYW1ldGVyIGlmIHRoZSBwYXJhbWV0ZXIgaXMgbm90IGFuIGFycmF5LlxuICAgKiBUaHJvd3Mgd2l0aCBlcnJvciBjb2RlIEludmFsaWRTZWxlY3Rpb25TaGVldCBpZiB0aGVyZSBhcmUgYXJyYXkgZW50cmllcyB0aGF0IGRvbnQgZXhpc3Qgb3IgaWYgdGhlcmUgaXMgbWl4aW5nIGJldHdlZW4gc2hlZXRzIGZyb20gdGhlIGRhc2hib2FyZCBhbmQgc2hlZXQgZnJvbSB0aGUgd29ya2Jvb2suXG4gICAqXG4gICAqIEBwYXJhbSBzaGVldE5hbWVzIExpc3Qgb2Ygc2hlZXQgbmFtZXMgc2VsZWN0ZWQgZm9yIGV4cG9ydGluZy5cbiAgICogQHBhcmFtIGV4cG9ydFNjZW5hcmlvcyBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgY3VycmVudCBzaGVldCBuYW1lLCBleHBvcnRhYmxlIHNoZWV0cyBmcm9tIHRoZSBkYXNoYm9hcmQsIGFuZCBleHBvcnRhYmxlIHNoZWV0cyBmcm9tIHRoZSB3b3JrYm9vay5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdmVyaWZ5U2hlZXROYW1lc0ZvclBERkFuZFBQVChzaGVldE5hbWVzOiBBcnJheTxzdHJpbmc+LCBleHBvcnRTY2VuYXJpb3M6IEV4cG9ydFNjZW5hcmlvc0ZvclBERkFuZFBvd2VyUG9pbnQpOiB2b2lkIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoc2hlZXROYW1lcykpIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLCAnc2hlZXROYW1lcyBwYXJhbWV0ZXIgbXVzdCBiZSBhbiBhcnJheScpO1xuICAgIGlmIChzaGVldE5hbWVzLmxlbmd0aCA9PT0gMCkgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludGVybmFsRXJyb3IsICdzaGVldE5hbWVzIHNob3VsZCBub3QgYmUgZW1wdHknKTtcblxuICAgIGNvbnN0IGlzSW5jbHVkZWRJbkRhc2hib2FyZCA9IHNoZWV0TmFtZXMuZXZlcnkoKHNoZWV0TmFtZTogc3RyaW5nKSA9PlxuICAgICAgZXhwb3J0U2NlbmFyaW9zLmV4cG9ydGFibGVTaGVldE5hbWVzRnJvbURhc2hib2FyZC5pbmNsdWRlcyhzaGVldE5hbWUpLFxuICAgICk7XG4gICAgaWYgKGlzSW5jbHVkZWRJbkRhc2hib2FyZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpc0luY2x1ZGVkSW5Xb3JrYm9vayA9IHNoZWV0TmFtZXMuZXZlcnkoKHNoZWV0TmFtZTogc3RyaW5nKSA9PlxuICAgICAgZXhwb3J0U2NlbmFyaW9zLmV4cG9ydGFibGVTaGVldE5hbWVzRnJvbVdvcmtib29rLmluY2x1ZGVzKHNoZWV0TmFtZSksXG4gICAgKTtcbiAgICBpZiAoaXNJbmNsdWRlZEluV29ya2Jvb2spIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaXNDdXJyZW50U2hlZXQgPSBzaGVldE5hbWVzLmxlbmd0aCA9PT0gMSAmJiBzaGVldE5hbWVzWzBdID09PSBleHBvcnRTY2VuYXJpb3MuY3VycmVudFNoZWV0TmFtZTtcbiAgICBpZiAoaXNDdXJyZW50U2hlZXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBFeHBvcnQgcmVxdWlyZW1lbnQ6IGFsbCBzaGVldCBuYW1lcyBtdXN0IGJlIGluY2x1ZGVkIGluIHRoZSBsaXN0IG9mIGV4cG9ydGFibGUgc2hlZXRzIGluIHRoZSBkYXNoYm9hcmQgb3JcbiAgICAvLyBhbGwgc2hlZXQgbmFtZXMgbXVzdCBiZSBpbmNsdWRlZCBpbiB0aGUgbGlzdCBvZiBleHBvcnRhYmxlIHNoZWV0cyBpbiB0aGUgd29ya2Jvb2ssIG9yIHRoZSBzaGVldCBuYW1lIGlzIHRoZSBjdXJyZW50IHNoZWV0XG4gICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihcbiAgICAgIFNoYXJlZEVycm9yQ29kZXMuSW52YWxpZFNlbGVjdGlvblNoZWV0LFxuICAgICAgJ3NoZWV0TmFtZXMgcGFyYW1ldGVyIG11c3QgaGF2ZSBhbGwgaXRzIGVudHJpZXMgYmUgZXhwb3J0YWJsZSBzaGVldCBuYW1lcyBmcm9tIHRoZSBkYXNoYm9hcmQgb3IgYWxsIGl0cyBlbnRyaWVzIGJlIGV4cG9ydGFibGUgc2hlZXQgbmFtZXMgZnJvbSB0aGUgd29ya2Jvb2snLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhlIGV4dGVybmFsIEV4cG9ydFBERk9wdGlvbnMgb2JqZWN0J3MgcHJvcGVydGllcy5cbiAgICogVGhyb3dzIHdpdGggZXJyb3IgY29kZSBJbnZhbGlkUGFyYW1ldGVyIGlmIHRoZSBwYXJhbWV0ZXIgaXMgbm90IG9mIGV4dGVybmFsIEV4cG9ydFBERk9wdGlvbnMgdHlwZS5cbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnMgVGhlIGV4dGVybmFsIHVzZXItZmFjaW5nIEV4cG9ydFBERk9wdGlvbnMgb2JqZWN0IHVzZWQgdG8gY29uZmlndXJlIHRoZSBvdXRwdXQgUERGIGZpbGUgZm9yIGV4cG9ydFBERkFzeW5jLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlFeHBvcnRQREZPcHRpb25zKG9wdGlvbnM6IEV4dGVybmFsRXhwb3J0UERGT3B0aW9ucykge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLnZlcmlmeUVudW1WYWx1ZTxQcmludE9yaWVudGF0aW9uPihvcHRpb25zLm9yaWVudGF0aW9uLCBQcmludE9yaWVudGF0aW9uLCAnUHJpbnRPcmllbnRhdGlvbicpO1xuICAgICAgdGhpcy52ZXJpZnlFbnVtVmFsdWU8UHJpbnRQYWdlU2l6ZT4ob3B0aW9ucy5wYWdlU2l6ZSwgUHJpbnRQYWdlU2l6ZSwgJ1ByaW50UGFnZVNpemUnKTtcbiAgICAgIHRoaXMudmVyaWZ5RW51bVZhbHVlPFByaW50U2NhbGluZz4ob3B0aW9ucy5zY2FsaW5nLCBQcmludFNjYWxpbmcsICdQcmludFNjYWxpbmcnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLCAnb3B0aW9ucyBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIEV4cG9ydFBERk9wdGlvbnMnKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEV4cG9ydExheW91dE9wdGlvbnMsXG4gIEV4cG9ydFBERk9wdGlvbnMgYXMgSW50ZXJuYWxFeHBvcnRQREZPcHRpb25zLFxuICBGaXRQYWdlcyxcbiAgUGFnZU9yaWVudGF0aW9uLFxuICBQYWdlU2NhbGluZ09wdGlvbixcbiAgUGFnZVNpemVPcHRpb24sXG4gIFNjYWxlTW9kZSxcbiAgU2NhbGluZ1NlbGVjdGlvbixcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIEV4cG9ydERhdGFPcHRpb25zLFxuICBFeHBvcnRQREZPcHRpb25zIGFzIEV4dGVybmFsRXhwb3J0UERGT3B0aW9ucyxcbiAgUHJpbnRPcmllbnRhdGlvbixcbiAgUHJpbnRQYWdlU2l6ZSxcbiAgUHJpbnRTY2FsaW5nLFxuICBTaGFyZWRFcnJvckNvZGVzLFxufSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vVGFibGVhdUVycm9yJztcblxuLyoqXG4gKiBIZWxwZXIgbWV0aG9kcyBmb3IgRXhwb3J0IEFQSXMuXG4gKlxuICogQGNsYXNzIEV4cG9ydEhlbHBlcnNcbiAqL1xuZXhwb3J0IGNsYXNzIEV4cG9ydEhlbHBlcnMge1xuICBwdWJsaWMgc3RhdGljIERlZmF1bHREYXRhT3B0aW9uczogRXhwb3J0RGF0YU9wdGlvbnMgPSB7XG4gICAgaWdub3JlQWxpYXNlczogZmFsc2UsXG4gICAgY29sdW1uc1RvSW5jbHVkZUJ5SWQ6IFtdLFxuICB9O1xuXG4gIHB1YmxpYyBzdGF0aWMgRGVmYXVsdFBERk9wdGlvbnM6IEV4dGVybmFsRXhwb3J0UERGT3B0aW9ucyA9IHtcbiAgICBzY2FsaW5nOiBQcmludFNjYWxpbmcuQXV0b21hdGljLFxuICAgIHBhZ2VTaXplOiBQcmludFBhZ2VTaXplLkxldHRlcixcbiAgICBvcmllbnRhdGlvbjogUHJpbnRPcmllbnRhdGlvbi5Qb3J0cmFpdCxcbiAgfTtcblxuICBwcml2YXRlIHN0YXRpYyBEZWZhdWx0TGF5b3V0T3B0aW9uczogRXhwb3J0TGF5b3V0T3B0aW9ucyA9IHtcbiAgICBpbWFnZUhlaWdodDogMCxcbiAgICBpbWFnZVdpZHRoOiAwLFxuICAgIHBhZ2VGaXRIb3Jpem9udGFsOiAxLFxuICAgIHBhZ2VGaXRWZXJ0aWNhbDogMSxcbiAgICBwYWdlT3JpZW50YXRpb25PcHRpb246IFBhZ2VPcmllbnRhdGlvbi5Qb3J0cmFpdCxcbiAgICBwYWdlU2NhbGVNb2RlOiBTY2FsZU1vZGUuU2NhbGVBdXRvLFxuICAgIHBhZ2VTY2FsZVBlcmNlbnQ6IDEwMCxcbiAgICBwYWdlU2l6ZU9wdGlvbjogUGFnZVNpemVPcHRpb24uTGV0dGVyLFxuICB9O1xuXG4gIC8qKlxuICAgKiBNb2RpZmllcyB0aGUgaW50ZXJuYWwgRXhwb3J0UERGT3B0aW9ucycgcHJvcGVydGllcyBiYXNlZCBvbiB0aGUgZ2l2ZW4gUERGIGV4cG9ydCBjb25maWd1cmF0aW9uLlxuICAgKiBUaGlzIG1ldGhvZCB3aWxsIGNvbnN0cnVjdCB0aGUgaW50ZXJuYWwgRXhwb3J0UERGT3B0aW9ucyBpZGVudGljYWxseSB0byBob3cgdGhlICdFeHBvcnQgUERGJyBkaWFsb2cgY29uc3RydWN0cyB0aGUgRXhwb3J0UGRmT3B0aW9uc1ByZXNNb2RlbC5cbiAgICogU2VlIHRoZSBoYW5kbGVFeHBvcnRDbGljayBtZXRob2QgaW4gQGJyb3dzZXItY2xpZW50cy9leHBvcnQtcGRmLW9wdGlvbnMtZGlhbG9nIGZvciByZWZlcmVuY2UuXG4gICAqXG4gICAqIEBwYXJhbSBpbnRlcm5hbEV4cG9ydFBkZk9wdGlvbnMgVGhlIGludGVybmFsIEV4cG9ydFBERk9wdGlvbnMgcHJlcyBtb2RlbCB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgb3V0cHV0IFBERiBmaWxlLlxuICAgKiBAcGFyYW0gZXh0ZXJuYWxFeHBvcnRQZGZPcHRpb25zIFRoZSBleHRlcm5hbCBFeHBvcnRQREZPcHRpb25zIHVzZXItZmFjaW5nIG9iamVjdCBwYXNzZWQgdG8gZXhwb3J0UERGQXN5bmMuXG4gICAqIEBwYXJhbSBzaGVldE5hbWVzIFRoZSBsaXN0IG9mIHNoZWV0cyBzZWxlY3RlZCBmb3IgZXhwb3J0LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB1cGRhdGVJbnRlcm5hbEV4cG9ydFBERk9wdGlvbnMoXG4gICAgaW50ZXJuYWxFeHBvcnRQZGZPcHRpb25zOiBJbnRlcm5hbEV4cG9ydFBERk9wdGlvbnMsXG4gICAgZXh0ZXJuYWxFeHBvcnRQZGZPcHRpb25zOiBFeHRlcm5hbEV4cG9ydFBERk9wdGlvbnMsXG4gICAgc2hlZXROYW1lczogQXJyYXk8c3RyaW5nPixcbiAgKTogdm9pZCB7XG4gICAgaW50ZXJuYWxFeHBvcnRQZGZPcHRpb25zLmN1cnJlbnRTaGVldCA9IHNoZWV0TmFtZXNbMF07XG4gICAgdGhpcy51cGRhdGVFeHBvcnRMYXlvdXRPcHRpb25zKGludGVybmFsRXhwb3J0UGRmT3B0aW9ucywgZXh0ZXJuYWxFeHBvcnRQZGZPcHRpb25zKTtcbiAgICB0aGlzLnVwZGF0ZVNoZWV0T3B0aW9ucyhpbnRlcm5hbEV4cG9ydFBkZk9wdGlvbnMsIHNoZWV0TmFtZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciBtZXRob2QgZm9yIHVwZGF0ZUludGVybmFsRXhwb3J0UERGT3B0aW9ucy5cbiAgICogTW9kaWZpZXMgdGhlIGV4cG9ydExheW91dE9wdGlvbnMgcHJvcGVydHkgb2YgdGhlIGludGVybmFsIEV4cG9ydFBERk9wdGlvbnMgYmFzZWQgb24gdGhlIGV4dGVybmFsIEV4cG9ydFBERk9wdGlvbnMuXG4gICAqIFNlZSB0aGUgZ2V0RXhwb3J0TGF5b3V0T3B0aW9ucyBtZXRob2QgaW4gQGJyb3dzZXItY2xpZW50cy9leHBvcnQtcGRmLW9wdGlvbnMtZGlhbG9nIGZvciByZWZlcmVuY2UuXG4gICAqXG4gICAqIEBwYXJhbSBpbnRlcm5hbEV4cG9ydFBkZk9wdGlvbnMgVGhlIGludGVybmFsIEV4cG9ydFBERk9wdGlvbnMgcHJlcyBtb2RlbCB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgb3V0cHV0IFBERiBmaWxlLlxuICAgKiBAcGFyYW0gZXh0ZXJuYWxFeHBvcnRQZGZPcHRpb25zIFRoZSBleHRlcm5hbCBFeHBvcnRQREZPcHRpb25zIHVzZXItZmFjaW5nIG9iamVjdCBwYXNzZWQgdG8gZXhwb3J0UERGQXN5bmMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHVwZGF0ZUV4cG9ydExheW91dE9wdGlvbnMoXG4gICAgaW50ZXJuYWxFeHBvcnRQZGZPcHRpb25zOiBJbnRlcm5hbEV4cG9ydFBERk9wdGlvbnMsXG4gICAgZXh0ZXJuYWxFeHBvcnRQZGZPcHRpb25zOiBFeHRlcm5hbEV4cG9ydFBERk9wdGlvbnMsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGV4cG9ydExheW91dE9wdGlvbnMgPSBpbnRlcm5hbEV4cG9ydFBkZk9wdGlvbnMuZXhwb3J0TGF5b3V0T3B0aW9ucztcblxuICAgIC8vIHNldHRpbmcgdGhlIGltYWdlIGhlaWdodCBhbmQgd2lkdGggcHJvcGVydGllcyB0byB0aGVpciBkZWZhdWx0IHZhbHVlc1xuICAgIGV4cG9ydExheW91dE9wdGlvbnMuaW1hZ2VIZWlnaHQgPSB0aGlzLkRlZmF1bHRMYXlvdXRPcHRpb25zLmltYWdlSGVpZ2h0O1xuICAgIGV4cG9ydExheW91dE9wdGlvbnMuaW1hZ2VXaWR0aCA9IHRoaXMuRGVmYXVsdExheW91dE9wdGlvbnMuaW1hZ2VXaWR0aDtcblxuICAgIC8vICBzZXR0aW5nIHRoZSBvcmllbnRhdGlvbiB2YWx1ZSBmb3IgdGhlIGV4cG9ydExheW91dE9wdGlvbnNcbiAgICBzd2l0Y2ggKGV4dGVybmFsRXhwb3J0UGRmT3B0aW9ucy5vcmllbnRhdGlvbikge1xuICAgICAgY2FzZSBQcmludE9yaWVudGF0aW9uLkxhbmRzY2FwZTpcbiAgICAgICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5wYWdlT3JpZW50YXRpb25PcHRpb24gPSBQYWdlT3JpZW50YXRpb24uTGFuZHNjYXBlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRPcmllbnRhdGlvbi5Qb3J0cmFpdDpcbiAgICAgICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5wYWdlT3JpZW50YXRpb25PcHRpb24gPSBQYWdlT3JpZW50YXRpb24uUG9ydHJhaXQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludGVybmFsRXJyb3IsICdpbnZhbGlkIG9yaWVudGF0aW9uIGZvciBFeHBvcnRQREZPcHRpb24nKTtcbiAgICB9XG5cbiAgICAvLyBzZXR0aW5nIHRoZSBwYWdlIHNpemUgdmFsdWUgZm9yIHRoZSBleHBvcnRMYXlvdXRPcHRpb25zXG4gICAgc3dpdGNoIChleHRlcm5hbEV4cG9ydFBkZk9wdGlvbnMucGFnZVNpemUpIHtcbiAgICAgIGNhc2UgUHJpbnRQYWdlU2l6ZS5BMzpcbiAgICAgICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5wYWdlU2l6ZU9wdGlvbiA9IFBhZ2VTaXplT3B0aW9uLkEzO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRQYWdlU2l6ZS5BNDpcbiAgICAgICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5wYWdlU2l6ZU9wdGlvbiA9IFBhZ2VTaXplT3B0aW9uLkE0O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRQYWdlU2l6ZS5BNTpcbiAgICAgICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5wYWdlU2l6ZU9wdGlvbiA9IFBhZ2VTaXplT3B0aW9uLkE1O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRQYWdlU2l6ZS5CNDpcbiAgICAgICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5wYWdlU2l6ZU9wdGlvbiA9IFBhZ2VTaXplT3B0aW9uLkI0O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRQYWdlU2l6ZS5CNTpcbiAgICAgICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5wYWdlU2l6ZU9wdGlvbiA9IFBhZ2VTaXplT3B0aW9uLkI1O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRQYWdlU2l6ZS5FeGVjdXRpdmU6XG4gICAgICAgIGV4cG9ydExheW91dE9wdGlvbnMucGFnZVNpemVPcHRpb24gPSBQYWdlU2l6ZU9wdGlvbi5FeGVjdXRpdmU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLkZvbGlvOlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VTaXplT3B0aW9uID0gUGFnZVNpemVPcHRpb24uRm9saW87XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLkxlZGdlcjpcbiAgICAgICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5wYWdlU2l6ZU9wdGlvbiA9IFBhZ2VTaXplT3B0aW9uLkxlZGdlcjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50UGFnZVNpemUuTGVnYWw6XG4gICAgICAgIGV4cG9ydExheW91dE9wdGlvbnMucGFnZVNpemVPcHRpb24gPSBQYWdlU2l6ZU9wdGlvbi5MZWdhbDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50UGFnZVNpemUuTGV0dGVyOlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VTaXplT3B0aW9uID0gUGFnZVNpemVPcHRpb24uTGV0dGVyO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRQYWdlU2l6ZS5Ob3RlOlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VTaXplT3B0aW9uID0gUGFnZVNpemVPcHRpb24uTm90ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50UGFnZVNpemUuUXVhcnRvOlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VTaXplT3B0aW9uID0gUGFnZVNpemVPcHRpb24uUXVhcnRvO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRQYWdlU2l6ZS5TdGF0ZW1lbnQ6XG4gICAgICAgIGV4cG9ydExheW91dE9wdGlvbnMucGFnZVNpemVPcHRpb24gPSBQYWdlU2l6ZU9wdGlvbi5TdGF0ZW1lbnQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLlRhYmxvaWQ6XG4gICAgICAgIGV4cG9ydExheW91dE9wdGlvbnMucGFnZVNpemVPcHRpb24gPSBQYWdlU2l6ZU9wdGlvbi5UYWJsb2lkO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRQYWdlU2l6ZS5VbnNwZWNpZmllZDpcbiAgICAgICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5wYWdlU2l6ZU9wdGlvbiA9IFBhZ2VTaXplT3B0aW9uLlVuc3BlY2lmaWVkO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnaW52YWxpZCBwYWdlU2l6ZSBmb3IgRXhwb3J0UERGT3B0aW9uJyk7XG4gICAgfVxuXG4gICAgLy8gc2V0dGluZyB0aGUgc2NhbGluZyB2YWx1ZXMgZm9yIHRoZSBleHBvcnRMYXlvdXRPcHRpb25zXG4gICAgc3dpdGNoIChleHRlcm5hbEV4cG9ydFBkZk9wdGlvbnMuc2NhbGluZykge1xuICAgICAgY2FzZSBQcmludFNjYWxpbmcuQXRNb3N0MVBhZ2VIaWdoOlxuICAgICAgICB0aGlzLnNldEZpdEFuZFNjYWxlVmFsdWVzKGV4cG9ydExheW91dE9wdGlvbnMsIEZpdFBhZ2VzLkZpdE9uZUhpZ2gpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRTY2FsaW5nLkF0TW9zdDFQYWdlV2lkZTpcbiAgICAgICAgdGhpcy5zZXRGaXRBbmRTY2FsZVZhbHVlcyhleHBvcnRMYXlvdXRPcHRpb25zLCBGaXRQYWdlcy5GaXRPbmVXaWRlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50U2NhbGluZy5BdE1vc3QyUGFnZXNIaWdoOlxuICAgICAgICB0aGlzLnNldEZpdEFuZFNjYWxlVmFsdWVzKGV4cG9ydExheW91dE9wdGlvbnMsIEZpdFBhZ2VzLkZpdFR3b0hpZ2gpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRTY2FsaW5nLkF0TW9zdDJQYWdlc1dpZGU6XG4gICAgICAgIHRoaXMuc2V0Rml0QW5kU2NhbGVWYWx1ZXMoZXhwb3J0TGF5b3V0T3B0aW9ucywgRml0UGFnZXMuRml0VHdvV2lkZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFNjYWxpbmcuQXV0b21hdGljOlxuICAgICAgICB0aGlzLnNldEZpdEFuZFNjYWxlVmFsdWVzKGV4cG9ydExheW91dE9wdGlvbnMsIFBhZ2VTY2FsaW5nT3B0aW9uLlNjYWxlUGN0QXV0byk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFNjYWxpbmcuUGVyYzEwMDpcbiAgICAgICAgdGhpcy5zZXRGaXRBbmRTY2FsZVZhbHVlcyhleHBvcnRMYXlvdXRPcHRpb25zLCBQYWdlU2NhbGluZ09wdGlvbi5TY2FsZVBjdDEwMCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFNjYWxpbmcuUGVyYzIwMDpcbiAgICAgICAgdGhpcy5zZXRGaXRBbmRTY2FsZVZhbHVlcyhleHBvcnRMYXlvdXRPcHRpb25zLCBQYWdlU2NhbGluZ09wdGlvbi5TY2FsZVBjdDIwMCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFNjYWxpbmcuUGVyYzI1OlxuICAgICAgICB0aGlzLnNldEZpdEFuZFNjYWxlVmFsdWVzKGV4cG9ydExheW91dE9wdGlvbnMsIFBhZ2VTY2FsaW5nT3B0aW9uLlNjYWxlUGN0MjUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRTY2FsaW5nLlBlcmM0MDA6XG4gICAgICAgIHRoaXMuc2V0Rml0QW5kU2NhbGVWYWx1ZXMoZXhwb3J0TGF5b3V0T3B0aW9ucywgUGFnZVNjYWxpbmdPcHRpb24uU2NhbGVQY3Q0MDApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRTY2FsaW5nLlBlcmM1MDpcbiAgICAgICAgdGhpcy5zZXRGaXRBbmRTY2FsZVZhbHVlcyhleHBvcnRMYXlvdXRPcHRpb25zLCBQYWdlU2NhbGluZ09wdGlvbi5TY2FsZVBjdDUwKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50U2NhbGluZy5QZXJjNjA6XG4gICAgICAgIHRoaXMuc2V0Rml0QW5kU2NhbGVWYWx1ZXMoZXhwb3J0TGF5b3V0T3B0aW9ucywgUGFnZVNjYWxpbmdPcHRpb24uU2NhbGVQY3Q2MCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFNjYWxpbmcuUGVyYzc1OlxuICAgICAgICB0aGlzLnNldEZpdEFuZFNjYWxlVmFsdWVzKGV4cG9ydExheW91dE9wdGlvbnMsIFBhZ2VTY2FsaW5nT3B0aW9uLlNjYWxlUGN0NzUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRTY2FsaW5nLlBlcmM4MDpcbiAgICAgICAgdGhpcy5zZXRGaXRBbmRTY2FsZVZhbHVlcyhleHBvcnRMYXlvdXRPcHRpb25zLCBQYWdlU2NhbGluZ09wdGlvbi5TY2FsZVBjdDgwKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50U2NhbGluZy5QZXJjOTA6XG4gICAgICAgIHRoaXMuc2V0Rml0QW5kU2NhbGVWYWx1ZXMoZXhwb3J0TGF5b3V0T3B0aW9ucywgUGFnZVNjYWxpbmdPcHRpb24uU2NhbGVQY3Q5MCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludGVybmFsRXJyb3IsICdpbnZhbGlkIHNjYWxpbmcgZm9yIEV4cG9ydFBERk9wdGlvbicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgbWV0aG9kIGZvciB1cGRhdGVJbnRlcm5hbEV4cG9ydFBERk9wdGlvbnMuXG4gICAqIE1vZGlmaWVzIHRoZSBzaGVldE9wdGlvbnMgcHJvcGVydHkgb2YgdGhlIGludGVybmFsIEV4cG9ydFBERk9wdGlvbnMgYmFzZWQgb24gdGhlIHNoZWV0cyBzZWxlY3RlZCBmb3IgZXhwb3J0LlxuICAgKiBTZWUgdGhlIGhhbmRsZUV4cG9ydENsaWNrIG1ldGhvZCBpbiBAYnJvd3Nlci1jbGllbnRzL2V4cG9ydC1wZGYtb3B0aW9ucy1kaWFsb2cgZm9yIHJlZmVyZW5jZS5cbiAgICpcbiAgICogQHBhcmFtIGludGVybmFsRXhwb3J0UGRmT3B0aW9ucyBUaGUgaW50ZXJuYWwgRXhwb3J0UERGT3B0aW9ucyBwcmVzIG1vZGVsIHVzZWQgdG8gY29uZmlndXJlIHRoZSBvdXRwdXQgUERGIGZpbGUuXG4gICAqIEBwYXJhbSBzaGVldE5hbWVzIFRoZSBsaXN0IG9mIHNoZWV0cyBzZWxlY3RlZCBmb3IgZXhwb3J0LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB1cGRhdGVTaGVldE9wdGlvbnMoaW50ZXJuYWxFeHBvcnRQZGZPcHRpb25zOiBJbnRlcm5hbEV4cG9ydFBERk9wdGlvbnMsIHNoZWV0TmFtZXM6IEFycmF5PHN0cmluZz4pOiB2b2lkIHtcbiAgICBjb25zdCB7IGV4cG9ydExheW91dE9wdGlvbnMsIHNoZWV0T3B0aW9ucyB9ID0gaW50ZXJuYWxFeHBvcnRQZGZPcHRpb25zO1xuICAgIC8vIHVwZGF0aW5nIHRoZSBleHBvcnQgbGF5b3V0cyBvcHRpb25zIGZvciBlYWNoIHNoZWV0IGFuZCBzZWxlY3Rpbmcgc2hlZXQgZm9yIGV4cG9ydCBpZiBpbmNsdWRlZCBpbiBsaXN0XG4gICAgZm9yIChjb25zdCBzaGVldE9wdGlvbiBvZiBzaGVldE9wdGlvbnMpIHtcbiAgICAgIHNoZWV0T3B0aW9uLmV4cG9ydExheW91dE9wdGlvbnMgPSBleHBvcnRMYXlvdXRPcHRpb25zO1xuICAgICAgc2hlZXRPcHRpb24uaXNTZWxlY3RlZCA9IHNoZWV0TmFtZXMuaW5jbHVkZXMoc2hlZXRPcHRpb24uc2hlZXQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgbWV0aG9kIGZvciB1cGRhdGVFeHBvcnRMYXlvdXRPcHRvbnMuXG4gICAqIFRoaXMgbWV0aG9kIGlzIGEgc3Bvb2Ygb2YgdGhlIGdldEZpdEFuZFNjYWxlVmFsdWVzIG1ldGhvZCB1c2VkIGluIEBicm93c2VyLWNsaWVudHMvZXhwb3J0LXBkZi1vcHRpb25zIHRvIHNldCB0aGUgZXhwb3J0TGF5b3V0T3B0aW9ucycgc2NhbGluZyBwcm9wZXJ0aWVzLlxuICAgKiBJbiB0aGUgZnV0dXJlLCB0aGlzIGZpbGUgc2hvdWxkIGJlIHJlZmFjdG9yZWQgdG8gaW1wb3J0IHRoZSBtZXRob2QgZGlyZWN0bHkgZnJvbSBAYnJvd3Nlci1jbGllbnRzL2V4cG9ydC1wZGYtb3B0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIHNjYWxpbmdTZWxlY3Rpb24gc3RyaW5nIHVzZWQgZm9yIHNldHRpbmcgdGhlIGV4cG9ydExheW91dE9wdGlvbnMgYmFzZWQgb24gdGhlIFByaW50U2NhbGluZyBwcm9wZXJ0eSBmcm9tIHRoZSBFeHRlcm5hbEV4cG9ydFBERk9wdGlvbnMuXG4gICAqIEBwYXJhbSBleHBvcnRMYXlvdXRPcHRpb25zIHRoZSBFeHBvcnRMYXlvdXRPcHRpb25zIHVzZWQgYnkgdGhlIGludGVybmFsIEV4cG9ydFBERk9wdGlvbnMgcHJlcyBtb2RlbC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgc2V0Rml0QW5kU2NhbGVWYWx1ZXMoZXhwb3J0TGF5b3V0T3B0aW9uczogRXhwb3J0TGF5b3V0T3B0aW9ucywgc2NhbGluZ1NlbGVjdGlvbjogU2NhbGluZ1NlbGVjdGlvbik6IHZvaWQge1xuICAgIGxldCB7IHBhZ2VGaXRIb3Jpem9udGFsLCBwYWdlRml0VmVydGljYWwsIHBhZ2VTY2FsZU1vZGUsIHBhZ2VTY2FsZVBlcmNlbnQgfSA9IHRoaXMuRGVmYXVsdExheW91dE9wdGlvbnM7XG5cbiAgICBjb25zdCBmaXRNYXRjaCA9IHRoaXMuZml0UmVnZXguZXhlYyhzY2FsaW5nU2VsZWN0aW9uKTtcbiAgICBjb25zdCBwZXJjZW50TWF0Y2ggPSB0aGlzLnBjdFJlZ2V4LmV4ZWMoc2NhbGluZ1NlbGVjdGlvbik7XG5cbiAgICBpZiAoZml0TWF0Y2gpIHtcbiAgICAgIFtwYWdlRml0SG9yaXpvbnRhbCwgcGFnZUZpdFZlcnRpY2FsXSA9IGZpdE1hdGNoLnNsaWNlKDEpLm1hcCgodmFsdWUpID0+IE51bWJlcih2YWx1ZSkpO1xuICAgICAgcGFnZVNjYWxlTW9kZSA9IFNjYWxlTW9kZS5TY2FsZUZpdFBhZ2VzO1xuICAgIH0gZWxzZSBpZiAocGVyY2VudE1hdGNoKSB7XG4gICAgICBbcGFnZVNjYWxlUGVyY2VudF0gPSBwZXJjZW50TWF0Y2guc2xpY2UoMSkubWFwKCh2YWx1ZSkgPT4gTnVtYmVyKHZhbHVlKSk7XG4gICAgICBwYWdlU2NhbGVNb2RlID0gU2NhbGVNb2RlLlNjYWxlUGVyY2VudGFnZTtcbiAgICB9XG5cbiAgICAvLyBnZXRGaXRBbmRTY2FsZVZhbHVlcyByZXR1cm5zIHRoZSBwcm9wZXJ0aWVzIGJlbG93LCBidXQgaW5zdGVhZCB0aGlzIG1ldGhvZCB3aWxsIHNldCB0aGVtLlxuICAgIGV4cG9ydExheW91dE9wdGlvbnMucGFnZUZpdEhvcml6b250YWwgPSBwYWdlRml0SG9yaXpvbnRhbDtcbiAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VGaXRWZXJ0aWNhbCA9IHBhZ2VGaXRWZXJ0aWNhbDtcbiAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VTY2FsZU1vZGUgPSBwYWdlU2NhbGVNb2RlO1xuICAgIGV4cG9ydExheW91dE9wdGlvbnMucGFnZVNjYWxlUGVyY2VudCA9IHBhZ2VTY2FsZVBlcmNlbnQ7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBmaXRSZWdleCA9IG5ldyBSZWdFeHAoJ2ZpdChbMC05XSspeChbMC05XSspJyk7XG4gIHByaXZhdGUgc3RhdGljIHBjdFJlZ2V4ID0gbmV3IFJlZ0V4cCgncGN0KFswLTldKyknKTtcbn1cbiIsImltcG9ydCB7IEVycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vVGFibGVhdUVycm9yJztcbmltcG9ydCB7IEVycm9ySGVscGVycyB9IGZyb20gJy4vRXJyb3JIZWxwZXJzJztcblxuZXhwb3J0IGNsYXNzIFBhcmFtIHtcbiAgLyoqXG4gICAqIHNlcmlhbGl6ZXMgdGhlIGRhdGUgaW50byB0aGUgZm9ybWF0IHRoYXQgdGhlIHNlcnZlciBleHBlY3RzLlxuICAgKiBAcGFyYW0gZGF0ZSB0aGUgZGF0ZSB0byBzZXJpYWxpemVcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplRGF0ZUZvclBsYXRmb3JtKGRhdGU6IERhdGUpOiBzdHJpbmcge1xuICAgIGNvbnN0IHllYXI6IG51bWJlciA9IGRhdGUuZ2V0VVRDRnVsbFllYXIoKTtcbiAgICBjb25zdCBtb250aDogbnVtYmVyID0gZGF0ZS5nZXRVVENNb250aCgpICsgMTtcbiAgICBjb25zdCBkYXk6IG51bWJlciA9IGRhdGUuZ2V0VVRDRGF0ZSgpO1xuICAgIGNvbnN0IGhoOiBudW1iZXIgPSBkYXRlLmdldFVUQ0hvdXJzKCk7XG4gICAgY29uc3QgbW06IG51bWJlciA9IGRhdGUuZ2V0VVRDTWludXRlcygpO1xuICAgIGNvbnN0IHNlYzogbnVtYmVyID0gZGF0ZS5nZXRVVENTZWNvbmRzKCk7XG4gICAgcmV0dXJuIGAke3llYXJ9LSR7bW9udGh9LSR7ZGF5fSAke2hofToke21tfToke3NlY31gO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBzZXJpYWxpemVCb29sZWFuRm9yUGxhdGZvcm0oYm9vbDogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGJvb2wgPyAndHJ1ZScgOiAnZmFsc2UnO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBzZXJpYWxpemVOdW1iZXJGb3JQbGF0Zm9ybShudW06IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIG51bS50b1N0cmluZygxMCk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhlIGlucHV0IGlzIGEgbnVtYmVyXG4gICAqL1xuICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55ICovXG4gIHB1YmxpYyBzdGF0aWMgaXNUeXBlTnVtYmVyKGlucHV0OiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHlwZW9mIGlucHV0ID09PSAnbnVtYmVyJyB8fCBpbnB1dCBpbnN0YW5jZW9mIE51bWJlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGUgaW5wdXQgaXMgYSBEYXRlXG4gICAqL1xuICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55ICovXG4gIHB1YmxpYyBzdGF0aWMgaXNUeXBlRGF0ZShpbnB1dDogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlucHV0IGluc3RhbmNlb2YgRGF0ZTtcbiAgfVxuXG4gIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnkgKi9cbiAgcHVibGljIHN0YXRpYyBpc1R5cGVTdHJpbmcoaW5wdXQ6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnIHx8IGlucHV0IGluc3RhbmNlb2YgU3RyaW5nO1xuICB9XG5cbiAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueSAqL1xuICBwdWJsaWMgc3RhdGljIGlzVHlwZUJvb2woaW5wdXQ6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0eXBlb2YgaW5wdXQgPT09ICdib29sZWFuJyB8fCBpbnB1dCBpbnN0YW5jZW9mIEJvb2xlYW47XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyBpZiB0aGUgaW5wdXQgaXMgbnVsbCBvciB1bmRlZmluZWRcbiAgICovXG4gIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnkgKi9cbiAgcHVibGljIHN0YXRpYyBpc051bGxPclVuZGVmaW5lZChpbnB1dDogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlucHV0ID09PSBudWxsIHx8IGlucHV0ID09PSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55ICovXG4gIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplUGFyYW1ldGVyVmFsdWUodmFsdWU6IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKFBhcmFtLmlzVHlwZU51bWJlcih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBQYXJhbS5zZXJpYWxpemVOdW1iZXJGb3JQbGF0Zm9ybSh2YWx1ZSBhcyBudW1iZXIpO1xuICAgIH0gZWxzZSBpZiAoUGFyYW0uaXNUeXBlRGF0ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBQYXJhbS5zZXJpYWxpemVEYXRlRm9yUGxhdGZvcm0odmFsdWUgYXMgRGF0ZSk7XG4gICAgfSBlbHNlIGlmIChQYXJhbS5pc1R5cGVCb29sKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIFBhcmFtLnNlcmlhbGl6ZUJvb2xlYW5Gb3JQbGF0Zm9ybSh2YWx1ZSBhcyBib29sZWFuKTtcbiAgICB9IGVsc2UgaWYgKFBhcmFtLmlzVHlwZVN0cmluZyh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludGVybmFsRXJyb3IsIGBVbmV4cGVjdGVkIGludmFsaWQgdmFsdWUgZm9yOiAke3ZhbHVlfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGF0IHRoZSBwYXJhbWV0ZXIgaXMgYWxyZWFkeSBhIE1hcCwgb3IgY29udmVydHMgYW4gb2JqZWN0IHRvIGEgTWFwLlxuICAgKiBJZiB0aGUgcGFyYW1ldGVyIGlzIGFuIG9iamVjdCwgd2UgY29udmVydCBpdCB0byBhIE1hcCB1c2luZyBPYmplY3QuZW50cmllcy5cbiAgICogQHRocm93cyBpZiB0aGUgcGFyYW1ldGVyIGlzIG5vdCBhbiBvYmplY3Qgb3IgTWFwXG4gICAqL1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gIHB1YmxpYyBzdGF0aWMgY29udmVydFBhcmFtZXRlclRvTWFwKHBhcmFtOiBvYmplY3QsIHBhcmFtTmFtZTogc3RyaW5nKTogTWFwPGFueSwgYW55PiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlclR5cGUocGFyYW0sICdvYmplY3QnLCBwYXJhbU5hbWUpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHBhcmFtKSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsIGBFeHBlY3Rpbmcgb2JqZWN0IG9yIE1hcCBmb3I6ICR7cGFyYW1OYW1lfS5gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyYW0gaW5zdGFuY2VvZiBNYXAgPyBwYXJhbSA6IG5ldyBNYXAoT2JqZWN0LmVudHJpZXMocGFyYW0pKTtcbiAgfVxuXG4gIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnkgKi9cbiAgcHVibGljIHN0YXRpYyB0cnlQYXJzZU51bWJlcih2YWx1ZTogYW55KTogeyBwYXJzZWQ/OiBudW1iZXI7IHN1Y2Nlc3M6IGJvb2xlYW4gfSB7XG4gICAgaWYgKFBhcmFtLmlzTnVsbE9yVW5kZWZpbmVkKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UgfTtcbiAgICB9XG5cbiAgICBpZiAoUGFyYW0uaXNUeXBlTnVtYmVyKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHsgcGFyc2VkOiB2YWx1ZSBhcyBudW1iZXIsIHN1Y2Nlc3M6IHRydWUgfTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZVN0cmluZyA9IHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgaWYgKHZhbHVlU3RyaW5nID09PSAnTmFOJykge1xuICAgICAgLy8gJ05hTicgcGFyc2VzIGFzIE5hTiB3aGljaCBpcyBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIGEgZmFpbGVkIHBhcnNlLlxuICAgICAgcmV0dXJuIHsgcGFyc2VkOiBOYU4sIHN1Y2Nlc3M6IHRydWUgfTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUZsb2F0KHZhbHVlU3RyaW5nKTtcbiAgICBpZiAoaXNOYU4ocGFyc2VkKSkge1xuICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBwYXJzZWQsIHN1Y2Nlc3M6IHRydWUgfTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFNoZWV0SW5mbywgU2hlZXRUeXBlLCBTaXplQ29uc3RyYWludCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuXG5leHBvcnQgY2xhc3MgU2hlZXRVdGlscyB7XG4gIC8vIFRoaXMgaXMgYSBkaXJlY3QgcG9ydCBmcm9tIFNoZWV0U2l6ZS5jcyAtIFNoZWV0U2l6ZUZhY3RvcnlcbiAgcHVibGljIHN0YXRpYyBnZXRTaGVldFNpemVGcm9tU2l6ZUNvbnN0cmFpbnRzKHNpemVDb25zdHJhaW50OiBTaXplQ29uc3RyYWludCk6IENvbnRyYWN0LlNoZWV0U2l6ZSB7XG4gICAgY29uc3QgeyBtaW5XaWR0aCwgbWluSGVpZ2h0LCBtYXhXaWR0aCwgbWF4SGVpZ2h0IH0gPSBzaXplQ29uc3RyYWludDtcblxuICAgIGlmIChtaW5IZWlnaHQgPT09IDAgJiYgbWluV2lkdGggPT09IDApIHtcbiAgICAgIGlmIChtYXhIZWlnaHQgPT09IDAgJiYgbWF4V2lkdGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBiZWhhdmlvcjogQ29udHJhY3QuU2hlZXRTaXplQmVoYXZpb3IuQXV0b21hdGljLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBiZWhhdmlvcjogQ29udHJhY3QuU2hlZXRTaXplQmVoYXZpb3IuQXRNb3N0LFxuICAgICAgICBtYXhTaXplOiB7IHdpZHRoOiBtYXhXaWR0aCwgaGVpZ2h0OiBtYXhIZWlnaHQgfSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKG1heEhlaWdodCA9PT0gMCAmJiBtYXhXaWR0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYmVoYXZpb3I6IENvbnRyYWN0LlNoZWV0U2l6ZUJlaGF2aW9yLkF0TGVhc3QsXG4gICAgICAgIG1pblNpemU6IHsgd2lkdGg6IG1pbldpZHRoLCBoZWlnaHQ6IG1pbkhlaWdodCB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAobWF4SGVpZ2h0ID09PSBtaW5IZWlnaHQgJiYgbWF4V2lkdGggPT09IG1pbldpZHRoICYmIG1pbldpZHRoID4gMCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYmVoYXZpb3I6IENvbnRyYWN0LlNoZWV0U2l6ZUJlaGF2aW9yLkV4YWN0bHksXG4gICAgICAgIG1pblNpemU6IHsgd2lkdGg6IG1pbldpZHRoLCBoZWlnaHQ6IG1pbkhlaWdodCB9LFxuICAgICAgICBtYXhTaXplOiB7IHdpZHRoOiBtaW5XaWR0aCwgaGVpZ2h0OiBtaW5IZWlnaHQgfSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gJ0ZpdCBXaWR0aCcgZm9yIGEgRFNEIGxheW91dFxuICAgIGNvbnN0IGlzRHNkTGF5b3V0ID0gbWluV2lkdGggPT09IDAgJiYgbWF4V2lkdGggPT09IDA7XG5cbiAgICByZXR1cm4ge1xuICAgICAgYmVoYXZpb3I6IENvbnRyYWN0LlNoZWV0U2l6ZUJlaGF2aW9yLlJhbmdlLFxuICAgICAgbWluU2l6ZTogeyB3aWR0aDogbWluV2lkdGgsIGhlaWdodDogbWluSGVpZ2h0IH0sXG4gICAgICBtYXhTaXplOiB7IHdpZHRoOiBpc0RzZExheW91dCA/IDIxNDc0ODM2NDcgOiBtYXhXaWR0aCwgaGVpZ2h0OiBtYXhIZWlnaHQgfSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBjcmVhdGVBdXRvbWF0aWNTaXplKCk6IENvbnRyYWN0LlNoZWV0U2l6ZSB7XG4gICAgbGV0IGJlaGF2aW9yID0gQ29udHJhY3QuU2hlZXRTaXplQmVoYXZpb3IuQXV0b21hdGljO1xuICAgIGxldCBtaW5TaXplID0geyB3aWR0aDogMCwgaGVpZ2h0OiAwIH07XG4gICAgbGV0IG1heFNpemUgPSB7IHdpZHRoOiAwLCBoZWlnaHQ6IDAgfTtcbiAgICByZXR1cm4geyBiZWhhdmlvciwgbWluU2l6ZSwgbWF4U2l6ZSB9O1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBnZXRQdWJsaXNoZWRTaGVldEluZm9CeU5hbWUobmFtZTogc3RyaW5nLCBzaGVldEluZm9zOiBBcnJheTxTaGVldEluZm8+KTogU2hlZXRJbmZvIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBzaGVldEluZm8gPSBzaGVldEluZm9zLmZpbmQoKHNoZWV0KSA9PiBzaGVldC5uYW1lID09PSBuYW1lKTtcbiAgICByZXR1cm4gc2hlZXRJbmZvO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBnZXRTaGVldFR5cGVFbnVtKGludGVybmFsU2hlZXRUeXBlOiBTaGVldFR5cGUpOiBDb250cmFjdC5TaGVldFR5cGUge1xuICAgIGxldCBzaGVldFR5cGU6IENvbnRyYWN0LlNoZWV0VHlwZTtcbiAgICBzd2l0Y2ggKGludGVybmFsU2hlZXRUeXBlKSB7XG4gICAgICBjYXNlIFNoZWV0VHlwZS5Xb3Jrc2hlZXQ6IHtcbiAgICAgICAgc2hlZXRUeXBlID0gQ29udHJhY3QuU2hlZXRUeXBlLldvcmtzaGVldDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFNoZWV0VHlwZS5EYXNoYm9hcmQ6IHtcbiAgICAgICAgc2hlZXRUeXBlID0gQ29udHJhY3QuU2hlZXRUeXBlLkRhc2hib2FyZDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFNoZWV0VHlwZS5TdG9yeToge1xuICAgICAgICBzaGVldFR5cGUgPSBDb250cmFjdC5TaGVldFR5cGUuU3Rvcnk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LlNoYXJlZEVycm9yQ29kZXMuU2VydmVyRXJyb3IsICdJbnZhbGlkIFNoZWV0VHlwZScpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc2hlZXRUeXBlO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc1ZhbGlkU2hlZXRTaXplKHNpemVPYmplY3Q6IENvbnRyYWN0LlNpemUgfCBDb250cmFjdC5TaGVldFNpemUpOiBzaXplT2JqZWN0IGlzIENvbnRyYWN0LlNoZWV0U2l6ZSB7XG4gICAgcmV0dXJuICg8Q29udHJhY3QuU2hlZXRTaXplPnNpemVPYmplY3QpLmJlaGF2aW9yICE9PSB1bmRlZmluZWQ7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgRGVmZXJyZWQsIFVucmVnaXN0ZXJUaW1lb3V0SW5NaWxsaXNlY29uZHMgfSBmcm9tICcuL0RlZmVycmVkJztcblxuLyoqXG4gKiBBIERlZmVycmVkIHdyYXBwZXIgY2xhc3MgYWRkaW5nIGZ1bmN0aW9uYWxpdHkgdG8gcmVqZWN0IHVucmVzcG9uc2l2ZSBwcm9taXNlcyBhZnRlciB0aW1lb3V0XG4gKlxuICogdGhpcyBjbGFzcyBoYW5kbGVzIHR3byB0aGluZ3M6XG5cbiAqICAgIDEuIEFkZHMgdGltZW91dCBsb2dpYyBmb3IgZGVmZXJyZWRcbiAqICAgIDIuIEl0IGJsb2NrcyBtdWx0aXBsZSBjYWxscyBmcm9tIGV4ZWN1dGluZyBhdCB0aGUgc2FtZSB0aW1lLlxuICpcbiAqIEBleHBvcnRcbiAqIEBjbGFzcyBTaG9ydExpdmVkRGVmZXJyZWRcbiAqIEB0ZW1wbGF0ZSBUUmVzb2x2ZSBUaGUgdHlwZSB1c2VkIHRvIHJlc29sdmUgdGhlIHByb21pc2UuXG4gKiBAdGVtcGxhdGUgVFJlamVjdCBUaGUgdHlwZSB1c2VkIHRvIHJlamVjdCB0aGUgcHJvbWlzZS4gRGVmYXVsdHMgdG8gYW55LlxuICpcbiAqL1xuZXhwb3J0IGNsYXNzIFNob3J0TGl2ZWREZWZlcnJlZDxUUmVzb2x2ZSwgVFJlamVjdCA9IGFueT4ge1xuICBwcml2YXRlIF9kZWZlcnJlZDogRGVmZXJyZWQ8VFJlc29sdmUsIFRSZWplY3Q+IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF90aW1lb3V0SWQ7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX3RpbWVvdXRJbk1pbGxpc2Vjb25kcyA9IFVucmVnaXN0ZXJUaW1lb3V0SW5NaWxsaXNlY29uZHMpIHt9XG5cbiAgcHVibGljIGdldE5ld1Byb21pc2VPclRocm93SWZCdXN5KCk6IFByb21pc2U8VFJlc29sdmU+IHtcbiAgICBpZiAodGhpcy5fZGVmZXJyZWQpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuU2hhcmVkRXJyb3JDb2Rlcy5BcGlFeGVjdXRpb25FcnJvciwgJ1RoaXMgYXBpIGNhbm5vdCBiZSBleGVjdXRlZCB0aWxsIHByZXZpb3VzIGNhbGwgaXMgcmVzb2x2ZWQuJyk7XG4gICAgfVxuICAgIHRoaXMuX2RlZmVycmVkID0gbmV3IERlZmVycmVkKCk7XG5cbiAgICB0aGlzLl90aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IFRhYmxlYXVFcnJvcihcbiAgICAgICAgQ29udHJhY3QuU2hhcmVkRXJyb3JDb2Rlcy5UaW1lb3V0LFxuICAgICAgICBgQXBpIGZhaWxlZCB0byBjb21wbGV0ZSBpbiAke3RoaXMuX3RpbWVvdXRJbk1pbGxpc2Vjb25kcyAvIDEwMDB9IHNlY29uZHNgLFxuICAgICAgKTtcbiAgICAgIHRoaXMucmVqZWN0KGVycm9yKTtcbiAgICB9LCB0aGlzLl90aW1lb3V0SW5NaWxsaXNlY29uZHMpO1xuXG4gICAgcmV0dXJuIHRoaXMuX2RlZmVycmVkLnByb21pc2U7XG4gIH1cblxuICBwdWJsaWMgcmVzb2x2ZShyZXNwb25zZTogVFJlc29sdmUgfCBQcm9taXNlTGlrZTxUUmVzb2x2ZT4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fZGVmZXJyZWQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0SWQpO1xuICAgICAgdGhpcy5fZGVmZXJyZWQucmVzb2x2ZShyZXNwb25zZSk7XG4gICAgICB0aGlzLl9kZWZlcnJlZCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVqZWN0KGVycm9yOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fZGVmZXJyZWQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0SWQpO1xuICAgICAgdGhpcy5fZGVmZXJyZWQucmVqZWN0KGVycm9yKTtcbiAgICAgIHRoaXMuX2RlZmVycmVkID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuL1RhYmxlYXVFcnJvcic7XG5pbXBvcnQgeyBWZXJzaW9uTnVtYmVyQ29udHJhY3QgfSBmcm9tICcuL1ZlcnNpb25OdW1iZXJDb250cmFjdCc7XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBleHRlbnNpb25zLCBlbWJlZGRpbmdcbiAqIGFuZCBleHRlbnNpb25zLWFwaS10eXBlcyBsaWJyYXJ5XG4gKi9cbmV4cG9ydCBjbGFzcyBWZXJzaW9uTnVtYmVyIGltcGxlbWVudHMgVmVyc2lvbk51bWJlckNvbnRyYWN0IHtcbiAgcHVibGljIG1ham9yOiBudW1iZXI7XG4gIHB1YmxpYyBtaW5vcjogbnVtYmVyO1xuICBwdWJsaWMgZml4OiBudW1iZXI7XG4gIHB1YmxpYyBidWlsZDogbnVtYmVyO1xuICBwdWJsaWMgaXNBbHBoYTogYm9vbGVhbjtcblxuICAvLyBwcml2YXRlIGNvbnN0cnVjdG9yIHNvIGV2ZXJ5b25lIHVzZXMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZVxuICAvLyBidWlsZCBudW1iZXJzIGhhdmUgdGhpcyBmb3JtOiBNLm0uZi1wcmUuTlxuICBwdWJsaWMgY29uc3RydWN0b3IodmVyc2lvblN0cmluZzogc3RyaW5nLCBpc0FscGhhOiBib29sZWFuKSB7XG4gICAgY29uc3QgcGFydFN0ciA9IHZlcnNpb25TdHJpbmcuc3BsaXQoJy0nKTtcbiAgICB0aGlzLmJ1aWxkID0gdGhpcy5nZXRCdWlsZE51bWJlcihwYXJ0U3RyWzFdKTtcbiAgICB2ZXJzaW9uU3RyaW5nID0gcGFydFN0clswXTtcblxuICAgIGNvbnN0IHBhcnRzID0gdmVyc2lvblN0cmluZy5zcGxpdCgnLicpLm1hcCgocCkgPT4gcGFyc2VJbnQocCwgMTApKTtcbiAgICBpZiAocGFydHMubGVuZ3RoICE9PSAzKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYEludmFsaWQgdmVyc2lvbiBudW1iZXI6ICR7dmVyc2lvblN0cmluZ31gKTtcbiAgICB9XG5cbiAgICB0aGlzLm1ham9yID0gcGFydHNbMF07XG4gICAgdGhpcy5taW5vciA9IHBhcnRzWzFdO1xuICAgIHRoaXMuZml4ID0gcGFydHNbMl07XG4gICAgdGhpcy5pc0FscGhhID0gaXNBbHBoYTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QnVpbGROdW1iZXIocHJlUmVsZWFzZVN0cmluZzogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBjb25zdCBub0J1aWxkTnVtYmVyID0gLTE7XG4gICAgaWYgKCFwcmVSZWxlYXNlU3RyaW5nKSB7XG4gICAgICByZXR1cm4gbm9CdWlsZE51bWJlcjtcbiAgICB9XG5cbiAgICAvLyBUaGUgcHJlUmVsZWFzZSBzdHJpbmcgaGFzIHRoaXMgZm9ybTogcHJlLk4sIGJ1dCB3ZSBkb24ndCBkZXBlbmQgb24gdGhlIGFjdHVhbCBzdHJpbmcgYmVpbmcgJ3ByZSdcbiAgICBjb25zdCBwYXJ0U3RyID0gcHJlUmVsZWFzZVN0cmluZy5zcGxpdCgnLicpO1xuICAgIHJldHVybiBwYXJ0U3RyWzFdID8gcGFyc2VJbnQocGFydFN0clsxXSwgMTApIDogbm9CdWlsZE51bWJlcjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZm9ybWF0dGVkVmFsdWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5tYWpvcn0uJHt0aGlzLm1pbm9yfS4ke3RoaXMuZml4fWA7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZ1bGxGb3JtYXR0ZWRWYWx1ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLm1ham9yfS4ke3RoaXMubWlub3J9LiR7dGhpcy5maXh9LXByZS4ke3RoaXMuYnVpbGR9YDtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgQ3JlYXRlRXh0ZXJuYWxDb21wYXRpYmxlVmVyc2lvbkNvbnZlcnRlcixcbiAgRXhlY3V0ZVBhcmFtZXRlcnMsXG4gIEV4ZWN1dGVSZXNwb25zZSxcbiAgRXh0ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXIsXG4gIEludGVybmFsQXBpRGlzcGF0Y2hlcixcbiAgSU5URVJOQUxfQ09OVFJBQ1RfVkVSU0lPTixcbiAgTm90aWZpY2F0aW9uLFxuICBOb3RpZmljYXRpb25IYW5kbGVyLFxuICBWZXJiSWQsXG4gIFZlcnNpb25MZXNzVGhhbixcbiAgVmVyc2lvbk51bWJlcixcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgSW50ZXJuYWxBcGlEaXNwYXRjaGVyIHdoaWNoIHN1cHBvcnRzIHVwZ3JhZGluZyBhbmQgZG93bmdyYWRpbmcgdGhlIGlucHV0XG4gKiBpbnRlcm5hbCBjb250cmFjdCB0byB0aGUgdmVyc2lvbiB0aGF0IHRoaXMgbW9kdWxlIGlzIGJ1aWx0IGFnYWluc3RcbiAqXG4gKiBAY2xhc3MgVmVyc2lvbmVkRXh0ZXJuYWxBcGlEaXNwYXRjaGVyXG4gKiBAaW1wbGVtZW50cyB7SW50ZXJuYWxBcGlEaXNwYXRjaGVyfVxuICovXG5leHBvcnQgY2xhc3MgVmVyc2lvbmVkRXh0ZXJuYWxBcGlEaXNwYXRjaGVyIGltcGxlbWVudHMgSW50ZXJuYWxBcGlEaXNwYXRjaGVyIHtcbiAgcHJpdmF0ZSBfdmVyc2lvbkNvbnZlcnRlcjogRXh0ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXI7XG4gIHByaXZhdGUgX25vdGlmaWNhdGlvbkhhbmRsZXJzOiBBcnJheTxOb3RpZmljYXRpb25IYW5kbGVyPjtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgVmVyc2lvbmVkRXh0ZXJuYWxBcGlEaXNwYXRjaGVyXG4gICAqIFdlIGhhdmUgbXVsdGlwbGUgdmVyc2lvbiBjb252ZXJ0aW5nIGRpc3BhdGNoZXJzIHRoYXQgd29yayB0b2dldGhlci5cbiAgICogSWYgbmVlZGVkLCB0aGUgVmVyc2lvbmVkRXh0ZXJuYWxBcGlEaXNwYXRjaGVyIHdyYXBzIGVpdGhlciB0aGUgSW50ZXJuYWxBcGlEaXNwYXRjaGVyIChkZXNrdG9wKVxuICAgKiBvciB0aGUgQ3Jvc3NGcmFtZURpc3BhdGNoZXIgKHNlcnZlcikuXG4gICAqIFRoZSBJbnRlcm5hbC9Dcm9zc0ZyYW1lIGRpc3BhdGNoZXJzIGhhbmRsZSBhbiB1cGRhdGVkIHBsYXRmb3JtIHdpdGggYW4gb2xkZXIgZXh0ZXJuYWwgbGlicmFyeS5cbiAgICogKFRoZSBDcm9zc0ZyYW1lRGlzcGF0Y2hlciBzZW5kcyBtZXNzYWdlcyBhY3Jvc3MgdGhlIGZyYW1lLCBhbmQgaXQgaXMgaGFuZGxlZCBieSB0aGUgUHJlc0xheWVySGFuZGxlci4pXG4gICAqIE1lYW53aGlsZSwgdGhlIFZlcnNpb25lZEV4dGVybmFsQXBpRGlzcGF0Y2hlciBoYW5kbGVzIGFuIHVwZGF0ZWQgZXh0ZXJuYWwgbGlicmFyeSB3aXRoIGFuIG9sZGVyIHBsYXRmb3JtLlxuXG4gICAqIEBwYXJhbSBfYXBpRGVsZWdhdGVEaXNwYXRjaGVyIFRoZSBkZWxlZ2F0ZSB0aGF0IGRvZXMgdGhlIGFjdHVhbCB3b3JrLlxuICAgKiBAcGFyYW0gcGxhdGZvcm1WZXJzaW9uTnVtYmVyIFRoZSB2ZXJzaW9uIG9mIHRoZSBpbnRlcm5hbCBjb250cmFjdCB3aGljaCB0aGUgcGxhdGZvcm0gbW9kdWxlIGlzIHVzaW5nLlxuICAgKiBUaGlzIG51bWJlciB3aWxsIGJlIHVzZWQgdG8gZmlndXJlIG91dCBob3cgdG8gZG93bmdyYWRlIGluY29taW5nIGNvbW1hbmRzIGFuZCB1cGdyYWRlIHRoZSByZXN1bHRzXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfYXBpRGVsZWdhdGVEaXNwYXRjaGVyOiBJbnRlcm5hbEFwaURpc3BhdGNoZXIsIHBsYXRmb3JtVmVyc2lvbk51bWJlcjogVmVyc2lvbk51bWJlcikge1xuICAgIHRoaXMuX3ZlcnNpb25Db252ZXJ0ZXIgPSBDcmVhdGVFeHRlcm5hbENvbXBhdGlibGVWZXJzaW9uQ29udmVydGVyKElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT04sIHBsYXRmb3JtVmVyc2lvbk51bWJlcik7XG5cbiAgICB0aGlzLl9ub3RpZmljYXRpb25IYW5kbGVycyA9IFtdO1xuICAgIF9hcGlEZWxlZ2F0ZURpc3BhdGNoZXIucmVnaXN0ZXJOb3RpZmljYXRpb25IYW5kbGVyKChub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbik6IHZvaWQgPT4ge1xuICAgICAgaWYgKHRoaXMuX25vdGlmaWNhdGlvbkhhbmRsZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCB1cGdyYWRlZE5vdGlmaWNhdGlvbiA9IHRoaXMuX3ZlcnNpb25Db252ZXJ0ZXIudXBncmFkZU5vdGlmaWNhdGlvbihub3RpZmljYXRpb24pO1xuICAgICAgdGhpcy5fbm90aWZpY2F0aW9uSGFuZGxlcnMuZm9yRWFjaCgoaGFuZGxlcikgPT4ge1xuICAgICAgICBoYW5kbGVyKHVwZ3JhZGVkTm90aWZpY2F0aW9uKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBuZWVkc1ZlcnNpb25Db252ZXJ0ZXIocGxhdGZvcm1WZXJzaW9uOiBWZXJzaW9uTnVtYmVyKTogYm9vbGVhbiB7XG4gICAgLy8gSWYgb3VyIHBsYXRmb3JtIGlzIGxlc3MgdGhhbiBleHRlcm5hbCBsaWJyYXJ5IHZlcnNpb24sIHRoZW4gd2UgbmVlZCBhIGNvbnZlcnRlclxuICAgIHJldHVybiBWZXJzaW9uTGVzc1RoYW4ocGxhdGZvcm1WZXJzaW9uLCBJTlRFUk5BTF9DT05UUkFDVF9WRVJTSU9OKTtcbiAgfVxuXG4gIHB1YmxpYyBleGVjdXRlKHZlcmI6IFZlcmJJZCwgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMpOiBQcm9taXNlPEV4ZWN1dGVSZXNwb25zZT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkb3duZ3JhZGVQYXJhbWV0ZXJzID0gdGhpcy5fdmVyc2lvbkNvbnZlcnRlci5kb3duZ3JhZGVFeGVjdXRlQ2FsbCh2ZXJiLCBwYXJhbWV0ZXJzKTtcbiAgICAgIHJldHVybiB0aGlzLl9hcGlEZWxlZ2F0ZURpc3BhdGNoZXIuZXhlY3V0ZShkb3duZ3JhZGVQYXJhbWV0ZXJzLnZlcmIsIGRvd25ncmFkZVBhcmFtZXRlcnMucGFyYW1ldGVycykudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgY29uc3QgdXBncmFkZVJlc3BvbnNlID0gdGhpcy5fdmVyc2lvbkNvbnZlcnRlci51cGdyYWRlRXhlY3V0ZVJldHVybihyZXNwb25zZSwgdmVyYiwgcGFyYW1ldGVycyk7XG4gICAgICAgIHJldHVybiB1cGdyYWRlUmVzcG9uc2U7XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyTm90aWZpY2F0aW9uSGFuZGxlcihoYW5kbGVyOiBOb3RpZmljYXRpb25IYW5kbGVyKTogdm9pZCB7XG4gICAgdGhpcy5fbm90aWZpY2F0aW9uSGFuZGxlcnMucHVzaChoYW5kbGVyKTtcbiAgfVxuXG4gIHB1YmxpYyB1bnJlZ2lzdGVyTm90aWZpY2F0aW9uSGFuZGxlcihoYW5kbGVyOiBOb3RpZmljYXRpb25IYW5kbGVyKTogdm9pZCB7XG4gICAgdGhpcy5fbm90aWZpY2F0aW9uSGFuZGxlcnMgPSB0aGlzLl9ub3RpZmljYXRpb25IYW5kbGVycy5maWx0ZXIoKGgpID0+IGggIT09IGhhbmRsZXIpO1xuICB9XG59XG4iLCJleHBvcnQgeyBkZWZhdWx0IGFzIHYxIH0gZnJvbSAnLi92MS5qcyc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHYzIH0gZnJvbSAnLi92My5qcyc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHY0IH0gZnJvbSAnLi92NC5qcyc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHY1IH0gZnJvbSAnLi92NS5qcyc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIE5JTCB9IGZyb20gJy4vbmlsLmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdmVyc2lvbiB9IGZyb20gJy4vdmVyc2lvbi5qcyc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHZhbGlkYXRlIH0gZnJvbSAnLi92YWxpZGF0ZS5qcyc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHN0cmluZ2lmeSB9IGZyb20gJy4vc3RyaW5naWZ5LmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgcGFyc2UgfSBmcm9tICcuL3BhcnNlLmpzJzsiLCIvKlxuICogQnJvd3Nlci1jb21wYXRpYmxlIEphdmFTY3JpcHQgTUQ1XG4gKlxuICogTW9kaWZpY2F0aW9uIG9mIEphdmFTY3JpcHQgTUQ1XG4gKiBodHRwczovL2dpdGh1Yi5jb20vYmx1ZWltcC9KYXZhU2NyaXB0LU1ENVxuICpcbiAqIENvcHlyaWdodCAyMDExLCBTZWJhc3RpYW4gVHNjaGFuXG4gKiBodHRwczovL2JsdWVpbXAubmV0XG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlOlxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVRcbiAqXG4gKiBCYXNlZCBvblxuICogQSBKYXZhU2NyaXB0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBSU0EgRGF0YSBTZWN1cml0eSwgSW5jLiBNRDUgTWVzc2FnZVxuICogRGlnZXN0IEFsZ29yaXRobSwgYXMgZGVmaW5lZCBpbiBSRkMgMTMyMS5cbiAqIFZlcnNpb24gMi4yIENvcHlyaWdodCAoQykgUGF1bCBKb2huc3RvbiAxOTk5IC0gMjAwOVxuICogT3RoZXIgY29udHJpYnV0b3JzOiBHcmVnIEhvbHQsIEFuZHJldyBLZXBlcnQsIFlkbmFyLCBMb3N0aW5ldFxuICogRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlXG4gKiBTZWUgaHR0cDovL3BhamhvbWUub3JnLnVrL2NyeXB0L21kNSBmb3IgbW9yZSBpbmZvLlxuICovXG5mdW5jdGlvbiBtZDUoYnl0ZXMpIHtcbiAgaWYgKHR5cGVvZiBieXRlcyA9PT0gJ3N0cmluZycpIHtcbiAgICB2YXIgbXNnID0gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KGJ5dGVzKSk7IC8vIFVURjggZXNjYXBlXG5cbiAgICBieXRlcyA9IG5ldyBVaW50OEFycmF5KG1zZy5sZW5ndGgpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyArK2kpIHtcbiAgICAgIGJ5dGVzW2ldID0gbXNnLmNoYXJDb2RlQXQoaSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1kNVRvSGV4RW5jb2RlZEFycmF5KHdvcmRzVG9NZDUoYnl0ZXNUb1dvcmRzKGJ5dGVzKSwgYnl0ZXMubGVuZ3RoICogOCkpO1xufVxuLypcbiAqIENvbnZlcnQgYW4gYXJyYXkgb2YgbGl0dGxlLWVuZGlhbiB3b3JkcyB0byBhbiBhcnJheSBvZiBieXRlc1xuICovXG5cblxuZnVuY3Rpb24gbWQ1VG9IZXhFbmNvZGVkQXJyYXkoaW5wdXQpIHtcbiAgdmFyIG91dHB1dCA9IFtdO1xuICB2YXIgbGVuZ3RoMzIgPSBpbnB1dC5sZW5ndGggKiAzMjtcbiAgdmFyIGhleFRhYiA9ICcwMTIzNDU2Nzg5YWJjZGVmJztcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDMyOyBpICs9IDgpIHtcbiAgICB2YXIgeCA9IGlucHV0W2kgPj4gNV0gPj4+IGkgJSAzMiAmIDB4ZmY7XG4gICAgdmFyIGhleCA9IHBhcnNlSW50KGhleFRhYi5jaGFyQXQoeCA+Pj4gNCAmIDB4MGYpICsgaGV4VGFiLmNoYXJBdCh4ICYgMHgwZiksIDE2KTtcbiAgICBvdXRwdXQucHVzaChoZXgpO1xuICB9XG5cbiAgcmV0dXJuIG91dHB1dDtcbn1cbi8qKlxuICogQ2FsY3VsYXRlIG91dHB1dCBsZW5ndGggd2l0aCBwYWRkaW5nIGFuZCBiaXQgbGVuZ3RoXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRPdXRwdXRMZW5ndGgoaW5wdXRMZW5ndGg4KSB7XG4gIHJldHVybiAoaW5wdXRMZW5ndGg4ICsgNjQgPj4+IDkgPDwgNCkgKyAxNCArIDE7XG59XG4vKlxuICogQ2FsY3VsYXRlIHRoZSBNRDUgb2YgYW4gYXJyYXkgb2YgbGl0dGxlLWVuZGlhbiB3b3JkcywgYW5kIGEgYml0IGxlbmd0aC5cbiAqL1xuXG5cbmZ1bmN0aW9uIHdvcmRzVG9NZDUoeCwgbGVuKSB7XG4gIC8qIGFwcGVuZCBwYWRkaW5nICovXG4gIHhbbGVuID4+IDVdIHw9IDB4ODAgPDwgbGVuICUgMzI7XG4gIHhbZ2V0T3V0cHV0TGVuZ3RoKGxlbikgLSAxXSA9IGxlbjtcbiAgdmFyIGEgPSAxNzMyNTg0MTkzO1xuICB2YXIgYiA9IC0yNzE3MzM4Nzk7XG4gIHZhciBjID0gLTE3MzI1ODQxOTQ7XG4gIHZhciBkID0gMjcxNzMzODc4O1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgeC5sZW5ndGg7IGkgKz0gMTYpIHtcbiAgICB2YXIgb2xkYSA9IGE7XG4gICAgdmFyIG9sZGIgPSBiO1xuICAgIHZhciBvbGRjID0gYztcbiAgICB2YXIgb2xkZCA9IGQ7XG4gICAgYSA9IG1kNWZmKGEsIGIsIGMsIGQsIHhbaV0sIDcsIC02ODA4NzY5MzYpO1xuICAgIGQgPSBtZDVmZihkLCBhLCBiLCBjLCB4W2kgKyAxXSwgMTIsIC0zODk1NjQ1ODYpO1xuICAgIGMgPSBtZDVmZihjLCBkLCBhLCBiLCB4W2kgKyAyXSwgMTcsIDYwNjEwNTgxOSk7XG4gICAgYiA9IG1kNWZmKGIsIGMsIGQsIGEsIHhbaSArIDNdLCAyMiwgLTEwNDQ1MjUzMzApO1xuICAgIGEgPSBtZDVmZihhLCBiLCBjLCBkLCB4W2kgKyA0XSwgNywgLTE3NjQxODg5Nyk7XG4gICAgZCA9IG1kNWZmKGQsIGEsIGIsIGMsIHhbaSArIDVdLCAxMiwgMTIwMDA4MDQyNik7XG4gICAgYyA9IG1kNWZmKGMsIGQsIGEsIGIsIHhbaSArIDZdLCAxNywgLTE0NzMyMzEzNDEpO1xuICAgIGIgPSBtZDVmZihiLCBjLCBkLCBhLCB4W2kgKyA3XSwgMjIsIC00NTcwNTk4Myk7XG4gICAgYSA9IG1kNWZmKGEsIGIsIGMsIGQsIHhbaSArIDhdLCA3LCAxNzcwMDM1NDE2KTtcbiAgICBkID0gbWQ1ZmYoZCwgYSwgYiwgYywgeFtpICsgOV0sIDEyLCAtMTk1ODQxNDQxNyk7XG4gICAgYyA9IG1kNWZmKGMsIGQsIGEsIGIsIHhbaSArIDEwXSwgMTcsIC00MjA2Myk7XG4gICAgYiA9IG1kNWZmKGIsIGMsIGQsIGEsIHhbaSArIDExXSwgMjIsIC0xOTkwNDA0MTYyKTtcbiAgICBhID0gbWQ1ZmYoYSwgYiwgYywgZCwgeFtpICsgMTJdLCA3LCAxODA0NjAzNjgyKTtcbiAgICBkID0gbWQ1ZmYoZCwgYSwgYiwgYywgeFtpICsgMTNdLCAxMiwgLTQwMzQxMTAxKTtcbiAgICBjID0gbWQ1ZmYoYywgZCwgYSwgYiwgeFtpICsgMTRdLCAxNywgLTE1MDIwMDIyOTApO1xuICAgIGIgPSBtZDVmZihiLCBjLCBkLCBhLCB4W2kgKyAxNV0sIDIyLCAxMjM2NTM1MzI5KTtcbiAgICBhID0gbWQ1Z2coYSwgYiwgYywgZCwgeFtpICsgMV0sIDUsIC0xNjU3OTY1MTApO1xuICAgIGQgPSBtZDVnZyhkLCBhLCBiLCBjLCB4W2kgKyA2XSwgOSwgLTEwNjk1MDE2MzIpO1xuICAgIGMgPSBtZDVnZyhjLCBkLCBhLCBiLCB4W2kgKyAxMV0sIDE0LCA2NDM3MTc3MTMpO1xuICAgIGIgPSBtZDVnZyhiLCBjLCBkLCBhLCB4W2ldLCAyMCwgLTM3Mzg5NzMwMik7XG4gICAgYSA9IG1kNWdnKGEsIGIsIGMsIGQsIHhbaSArIDVdLCA1LCAtNzAxNTU4NjkxKTtcbiAgICBkID0gbWQ1Z2coZCwgYSwgYiwgYywgeFtpICsgMTBdLCA5LCAzODAxNjA4Myk7XG4gICAgYyA9IG1kNWdnKGMsIGQsIGEsIGIsIHhbaSArIDE1XSwgMTQsIC02NjA0NzgzMzUpO1xuICAgIGIgPSBtZDVnZyhiLCBjLCBkLCBhLCB4W2kgKyA0XSwgMjAsIC00MDU1Mzc4NDgpO1xuICAgIGEgPSBtZDVnZyhhLCBiLCBjLCBkLCB4W2kgKyA5XSwgNSwgNTY4NDQ2NDM4KTtcbiAgICBkID0gbWQ1Z2coZCwgYSwgYiwgYywgeFtpICsgMTRdLCA5LCAtMTAxOTgwMzY5MCk7XG4gICAgYyA9IG1kNWdnKGMsIGQsIGEsIGIsIHhbaSArIDNdLCAxNCwgLTE4NzM2Mzk2MSk7XG4gICAgYiA9IG1kNWdnKGIsIGMsIGQsIGEsIHhbaSArIDhdLCAyMCwgMTE2MzUzMTUwMSk7XG4gICAgYSA9IG1kNWdnKGEsIGIsIGMsIGQsIHhbaSArIDEzXSwgNSwgLTE0NDQ2ODE0NjcpO1xuICAgIGQgPSBtZDVnZyhkLCBhLCBiLCBjLCB4W2kgKyAyXSwgOSwgLTUxNDAzNzg0KTtcbiAgICBjID0gbWQ1Z2coYywgZCwgYSwgYiwgeFtpICsgN10sIDE0LCAxNzM1MzI4NDczKTtcbiAgICBiID0gbWQ1Z2coYiwgYywgZCwgYSwgeFtpICsgMTJdLCAyMCwgLTE5MjY2MDc3MzQpO1xuICAgIGEgPSBtZDVoaChhLCBiLCBjLCBkLCB4W2kgKyA1XSwgNCwgLTM3ODU1OCk7XG4gICAgZCA9IG1kNWhoKGQsIGEsIGIsIGMsIHhbaSArIDhdLCAxMSwgLTIwMjI1NzQ0NjMpO1xuICAgIGMgPSBtZDVoaChjLCBkLCBhLCBiLCB4W2kgKyAxMV0sIDE2LCAxODM5MDMwNTYyKTtcbiAgICBiID0gbWQ1aGgoYiwgYywgZCwgYSwgeFtpICsgMTRdLCAyMywgLTM1MzA5NTU2KTtcbiAgICBhID0gbWQ1aGgoYSwgYiwgYywgZCwgeFtpICsgMV0sIDQsIC0xNTMwOTkyMDYwKTtcbiAgICBkID0gbWQ1aGgoZCwgYSwgYiwgYywgeFtpICsgNF0sIDExLCAxMjcyODkzMzUzKTtcbiAgICBjID0gbWQ1aGgoYywgZCwgYSwgYiwgeFtpICsgN10sIDE2LCAtMTU1NDk3NjMyKTtcbiAgICBiID0gbWQ1aGgoYiwgYywgZCwgYSwgeFtpICsgMTBdLCAyMywgLTEwOTQ3MzA2NDApO1xuICAgIGEgPSBtZDVoaChhLCBiLCBjLCBkLCB4W2kgKyAxM10sIDQsIDY4MTI3OTE3NCk7XG4gICAgZCA9IG1kNWhoKGQsIGEsIGIsIGMsIHhbaV0sIDExLCAtMzU4NTM3MjIyKTtcbiAgICBjID0gbWQ1aGgoYywgZCwgYSwgYiwgeFtpICsgM10sIDE2LCAtNzIyNTIxOTc5KTtcbiAgICBiID0gbWQ1aGgoYiwgYywgZCwgYSwgeFtpICsgNl0sIDIzLCA3NjAyOTE4OSk7XG4gICAgYSA9IG1kNWhoKGEsIGIsIGMsIGQsIHhbaSArIDldLCA0LCAtNjQwMzY0NDg3KTtcbiAgICBkID0gbWQ1aGgoZCwgYSwgYiwgYywgeFtpICsgMTJdLCAxMSwgLTQyMTgxNTgzNSk7XG4gICAgYyA9IG1kNWhoKGMsIGQsIGEsIGIsIHhbaSArIDE1XSwgMTYsIDUzMDc0MjUyMCk7XG4gICAgYiA9IG1kNWhoKGIsIGMsIGQsIGEsIHhbaSArIDJdLCAyMywgLTk5NTMzODY1MSk7XG4gICAgYSA9IG1kNWlpKGEsIGIsIGMsIGQsIHhbaV0sIDYsIC0xOTg2MzA4NDQpO1xuICAgIGQgPSBtZDVpaShkLCBhLCBiLCBjLCB4W2kgKyA3XSwgMTAsIDExMjY4OTE0MTUpO1xuICAgIGMgPSBtZDVpaShjLCBkLCBhLCBiLCB4W2kgKyAxNF0sIDE1LCAtMTQxNjM1NDkwNSk7XG4gICAgYiA9IG1kNWlpKGIsIGMsIGQsIGEsIHhbaSArIDVdLCAyMSwgLTU3NDM0MDU1KTtcbiAgICBhID0gbWQ1aWkoYSwgYiwgYywgZCwgeFtpICsgMTJdLCA2LCAxNzAwNDg1NTcxKTtcbiAgICBkID0gbWQ1aWkoZCwgYSwgYiwgYywgeFtpICsgM10sIDEwLCAtMTg5NDk4NjYwNik7XG4gICAgYyA9IG1kNWlpKGMsIGQsIGEsIGIsIHhbaSArIDEwXSwgMTUsIC0xMDUxNTIzKTtcbiAgICBiID0gbWQ1aWkoYiwgYywgZCwgYSwgeFtpICsgMV0sIDIxLCAtMjA1NDkyMjc5OSk7XG4gICAgYSA9IG1kNWlpKGEsIGIsIGMsIGQsIHhbaSArIDhdLCA2LCAxODczMzEzMzU5KTtcbiAgICBkID0gbWQ1aWkoZCwgYSwgYiwgYywgeFtpICsgMTVdLCAxMCwgLTMwNjExNzQ0KTtcbiAgICBjID0gbWQ1aWkoYywgZCwgYSwgYiwgeFtpICsgNl0sIDE1LCAtMTU2MDE5ODM4MCk7XG4gICAgYiA9IG1kNWlpKGIsIGMsIGQsIGEsIHhbaSArIDEzXSwgMjEsIDEzMDkxNTE2NDkpO1xuICAgIGEgPSBtZDVpaShhLCBiLCBjLCBkLCB4W2kgKyA0XSwgNiwgLTE0NTUyMzA3MCk7XG4gICAgZCA9IG1kNWlpKGQsIGEsIGIsIGMsIHhbaSArIDExXSwgMTAsIC0xMTIwMjEwMzc5KTtcbiAgICBjID0gbWQ1aWkoYywgZCwgYSwgYiwgeFtpICsgMl0sIDE1LCA3MTg3ODcyNTkpO1xuICAgIGIgPSBtZDVpaShiLCBjLCBkLCBhLCB4W2kgKyA5XSwgMjEsIC0zNDM0ODU1NTEpO1xuICAgIGEgPSBzYWZlQWRkKGEsIG9sZGEpO1xuICAgIGIgPSBzYWZlQWRkKGIsIG9sZGIpO1xuICAgIGMgPSBzYWZlQWRkKGMsIG9sZGMpO1xuICAgIGQgPSBzYWZlQWRkKGQsIG9sZGQpO1xuICB9XG5cbiAgcmV0dXJuIFthLCBiLCBjLCBkXTtcbn1cbi8qXG4gKiBDb252ZXJ0IGFuIGFycmF5IGJ5dGVzIHRvIGFuIGFycmF5IG9mIGxpdHRsZS1lbmRpYW4gd29yZHNcbiAqIENoYXJhY3RlcnMgPjI1NSBoYXZlIHRoZWlyIGhpZ2gtYnl0ZSBzaWxlbnRseSBpZ25vcmVkLlxuICovXG5cblxuZnVuY3Rpb24gYnl0ZXNUb1dvcmRzKGlucHV0KSB7XG4gIGlmIChpbnB1dC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICB2YXIgbGVuZ3RoOCA9IGlucHV0Lmxlbmd0aCAqIDg7XG4gIHZhciBvdXRwdXQgPSBuZXcgVWludDMyQXJyYXkoZ2V0T3V0cHV0TGVuZ3RoKGxlbmd0aDgpKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDg7IGkgKz0gOCkge1xuICAgIG91dHB1dFtpID4+IDVdIHw9IChpbnB1dFtpIC8gOF0gJiAweGZmKSA8PCBpICUgMzI7XG4gIH1cblxuICByZXR1cm4gb3V0cHV0O1xufVxuLypcbiAqIEFkZCBpbnRlZ2Vycywgd3JhcHBpbmcgYXQgMl4zMi4gVGhpcyB1c2VzIDE2LWJpdCBvcGVyYXRpb25zIGludGVybmFsbHlcbiAqIHRvIHdvcmsgYXJvdW5kIGJ1Z3MgaW4gc29tZSBKUyBpbnRlcnByZXRlcnMuXG4gKi9cblxuXG5mdW5jdGlvbiBzYWZlQWRkKHgsIHkpIHtcbiAgdmFyIGxzdyA9ICh4ICYgMHhmZmZmKSArICh5ICYgMHhmZmZmKTtcbiAgdmFyIG1zdyA9ICh4ID4+IDE2KSArICh5ID4+IDE2KSArIChsc3cgPj4gMTYpO1xuICByZXR1cm4gbXN3IDw8IDE2IHwgbHN3ICYgMHhmZmZmO1xufVxuLypcbiAqIEJpdHdpc2Ugcm90YXRlIGEgMzItYml0IG51bWJlciB0byB0aGUgbGVmdC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGJpdFJvdGF0ZUxlZnQobnVtLCBjbnQpIHtcbiAgcmV0dXJuIG51bSA8PCBjbnQgfCBudW0gPj4+IDMyIC0gY250O1xufVxuLypcbiAqIFRoZXNlIGZ1bmN0aW9ucyBpbXBsZW1lbnQgdGhlIGZvdXIgYmFzaWMgb3BlcmF0aW9ucyB0aGUgYWxnb3JpdGhtIHVzZXMuXG4gKi9cblxuXG5mdW5jdGlvbiBtZDVjbW4ocSwgYSwgYiwgeCwgcywgdCkge1xuICByZXR1cm4gc2FmZUFkZChiaXRSb3RhdGVMZWZ0KHNhZmVBZGQoc2FmZUFkZChhLCBxKSwgc2FmZUFkZCh4LCB0KSksIHMpLCBiKTtcbn1cblxuZnVuY3Rpb24gbWQ1ZmYoYSwgYiwgYywgZCwgeCwgcywgdCkge1xuICByZXR1cm4gbWQ1Y21uKGIgJiBjIHwgfmIgJiBkLCBhLCBiLCB4LCBzLCB0KTtcbn1cblxuZnVuY3Rpb24gbWQ1Z2coYSwgYiwgYywgZCwgeCwgcywgdCkge1xuICByZXR1cm4gbWQ1Y21uKGIgJiBkIHwgYyAmIH5kLCBhLCBiLCB4LCBzLCB0KTtcbn1cblxuZnVuY3Rpb24gbWQ1aGgoYSwgYiwgYywgZCwgeCwgcywgdCkge1xuICByZXR1cm4gbWQ1Y21uKGIgXiBjIF4gZCwgYSwgYiwgeCwgcywgdCk7XG59XG5cbmZ1bmN0aW9uIG1kNWlpKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHtcbiAgcmV0dXJuIG1kNWNtbihjIF4gKGIgfCB+ZCksIGEsIGIsIHgsIHMsIHQpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBtZDU7IiwiZXhwb3J0IGRlZmF1bHQgJzAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCc7IiwiaW1wb3J0IHZhbGlkYXRlIGZyb20gJy4vdmFsaWRhdGUuanMnO1xuXG5mdW5jdGlvbiBwYXJzZSh1dWlkKSB7XG4gIGlmICghdmFsaWRhdGUodXVpZCkpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ0ludmFsaWQgVVVJRCcpO1xuICB9XG5cbiAgdmFyIHY7XG4gIHZhciBhcnIgPSBuZXcgVWludDhBcnJheSgxNik7IC8vIFBhcnNlICMjIyMjIyMjLS4uLi4tLi4uLi0uLi4uLS4uLi4uLi4uLi4uLlxuXG4gIGFyclswXSA9ICh2ID0gcGFyc2VJbnQodXVpZC5zbGljZSgwLCA4KSwgMTYpKSA+Pj4gMjQ7XG4gIGFyclsxXSA9IHYgPj4+IDE2ICYgMHhmZjtcbiAgYXJyWzJdID0gdiA+Pj4gOCAmIDB4ZmY7XG4gIGFyclszXSA9IHYgJiAweGZmOyAvLyBQYXJzZSAuLi4uLi4uLi0jIyMjLS4uLi4tLi4uLi0uLi4uLi4uLi4uLi5cblxuICBhcnJbNF0gPSAodiA9IHBhcnNlSW50KHV1aWQuc2xpY2UoOSwgMTMpLCAxNikpID4+PiA4O1xuICBhcnJbNV0gPSB2ICYgMHhmZjsgLy8gUGFyc2UgLi4uLi4uLi4tLi4uLi0jIyMjLS4uLi4tLi4uLi4uLi4uLi4uXG5cbiAgYXJyWzZdID0gKHYgPSBwYXJzZUludCh1dWlkLnNsaWNlKDE0LCAxOCksIDE2KSkgPj4+IDg7XG4gIGFycls3XSA9IHYgJiAweGZmOyAvLyBQYXJzZSAuLi4uLi4uLi0uLi4uLS4uLi4tIyMjIy0uLi4uLi4uLi4uLi5cblxuICBhcnJbOF0gPSAodiA9IHBhcnNlSW50KHV1aWQuc2xpY2UoMTksIDIzKSwgMTYpKSA+Pj4gODtcbiAgYXJyWzldID0gdiAmIDB4ZmY7IC8vIFBhcnNlIC4uLi4uLi4uLS4uLi4tLi4uLi0uLi4uLSMjIyMjIyMjIyMjI1xuICAvLyAoVXNlIFwiL1wiIHRvIGF2b2lkIDMyLWJpdCB0cnVuY2F0aW9uIHdoZW4gYml0LXNoaWZ0aW5nIGhpZ2gtb3JkZXIgYnl0ZXMpXG5cbiAgYXJyWzEwXSA9ICh2ID0gcGFyc2VJbnQodXVpZC5zbGljZSgyNCwgMzYpLCAxNikpIC8gMHgxMDAwMDAwMDAwMCAmIDB4ZmY7XG4gIGFyclsxMV0gPSB2IC8gMHgxMDAwMDAwMDAgJiAweGZmO1xuICBhcnJbMTJdID0gdiA+Pj4gMjQgJiAweGZmO1xuICBhcnJbMTNdID0gdiA+Pj4gMTYgJiAweGZmO1xuICBhcnJbMTRdID0gdiA+Pj4gOCAmIDB4ZmY7XG4gIGFyclsxNV0gPSB2ICYgMHhmZjtcbiAgcmV0dXJuIGFycjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgcGFyc2U7IiwiZXhwb3J0IGRlZmF1bHQgL14oPzpbMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMS01XVswLTlhLWZdezN9LVs4OWFiXVswLTlhLWZdezN9LVswLTlhLWZdezEyfXwwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDApJC9pOyIsIi8vIFVuaXF1ZSBJRCBjcmVhdGlvbiByZXF1aXJlcyBhIGhpZ2ggcXVhbGl0eSByYW5kb20gIyBnZW5lcmF0b3IuIEluIHRoZSBicm93c2VyIHdlIHRoZXJlZm9yZVxuLy8gcmVxdWlyZSB0aGUgY3J5cHRvIEFQSSBhbmQgZG8gbm90IHN1cHBvcnQgYnVpbHQtaW4gZmFsbGJhY2sgdG8gbG93ZXIgcXVhbGl0eSByYW5kb20gbnVtYmVyXG4vLyBnZW5lcmF0b3JzIChsaWtlIE1hdGgucmFuZG9tKCkpLlxudmFyIGdldFJhbmRvbVZhbHVlcztcbnZhciBybmRzOCA9IG5ldyBVaW50OEFycmF5KDE2KTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJuZygpIHtcbiAgLy8gbGF6eSBsb2FkIHNvIHRoYXQgZW52aXJvbm1lbnRzIHRoYXQgbmVlZCB0byBwb2x5ZmlsbCBoYXZlIGEgY2hhbmNlIHRvIGRvIHNvXG4gIGlmICghZ2V0UmFuZG9tVmFsdWVzKSB7XG4gICAgLy8gZ2V0UmFuZG9tVmFsdWVzIG5lZWRzIHRvIGJlIGludm9rZWQgaW4gYSBjb250ZXh0IHdoZXJlIFwidGhpc1wiIGlzIGEgQ3J5cHRvIGltcGxlbWVudGF0aW9uLiBBbHNvLFxuICAgIC8vIGZpbmQgdGhlIGNvbXBsZXRlIGltcGxlbWVudGF0aW9uIG9mIGNyeXB0byAobXNDcnlwdG8pIG9uIElFMTEuXG4gICAgZ2V0UmFuZG9tVmFsdWVzID0gdHlwZW9mIGNyeXB0byAhPT0gJ3VuZGVmaW5lZCcgJiYgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyAmJiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzLmJpbmQoY3J5cHRvKSB8fCB0eXBlb2YgbXNDcnlwdG8gIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBtc0NyeXB0by5nZXRSYW5kb21WYWx1ZXMgPT09ICdmdW5jdGlvbicgJiYgbXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzLmJpbmQobXNDcnlwdG8pO1xuXG4gICAgaWYgKCFnZXRSYW5kb21WYWx1ZXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY3J5cHRvLmdldFJhbmRvbVZhbHVlcygpIG5vdCBzdXBwb3J0ZWQuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdXVpZGpzL3V1aWQjZ2V0cmFuZG9tdmFsdWVzLW5vdC1zdXBwb3J0ZWQnKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZ2V0UmFuZG9tVmFsdWVzKHJuZHM4KTtcbn0iLCIvLyBBZGFwdGVkIGZyb20gQ2hyaXMgVmVuZXNzJyBTSEExIGNvZGUgYXRcbi8vIGh0dHA6Ly93d3cubW92YWJsZS10eXBlLmNvLnVrL3NjcmlwdHMvc2hhMS5odG1sXG5mdW5jdGlvbiBmKHMsIHgsIHksIHopIHtcbiAgc3dpdGNoIChzKSB7XG4gICAgY2FzZSAwOlxuICAgICAgcmV0dXJuIHggJiB5IF4gfnggJiB6O1xuXG4gICAgY2FzZSAxOlxuICAgICAgcmV0dXJuIHggXiB5IF4gejtcblxuICAgIGNhc2UgMjpcbiAgICAgIHJldHVybiB4ICYgeSBeIHggJiB6IF4geSAmIHo7XG5cbiAgICBjYXNlIDM6XG4gICAgICByZXR1cm4geCBeIHkgXiB6O1xuICB9XG59XG5cbmZ1bmN0aW9uIFJPVEwoeCwgbikge1xuICByZXR1cm4geCA8PCBuIHwgeCA+Pj4gMzIgLSBuO1xufVxuXG5mdW5jdGlvbiBzaGExKGJ5dGVzKSB7XG4gIHZhciBLID0gWzB4NWE4Mjc5OTksIDB4NmVkOWViYTEsIDB4OGYxYmJjZGMsIDB4Y2E2MmMxZDZdO1xuICB2YXIgSCA9IFsweDY3NDUyMzAxLCAweGVmY2RhYjg5LCAweDk4YmFkY2ZlLCAweDEwMzI1NDc2LCAweGMzZDJlMWYwXTtcblxuICBpZiAodHlwZW9mIGJ5dGVzID09PSAnc3RyaW5nJykge1xuICAgIHZhciBtc2cgPSB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoYnl0ZXMpKTsgLy8gVVRGOCBlc2NhcGVcblxuICAgIGJ5dGVzID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1zZy5sZW5ndGg7ICsraSkge1xuICAgICAgYnl0ZXMucHVzaChtc2cuY2hhckNvZGVBdChpKSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKCFBcnJheS5pc0FycmF5KGJ5dGVzKSkge1xuICAgIC8vIENvbnZlcnQgQXJyYXktbGlrZSB0byBBcnJheVxuICAgIGJ5dGVzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYnl0ZXMpO1xuICB9XG5cbiAgYnl0ZXMucHVzaCgweDgwKTtcbiAgdmFyIGwgPSBieXRlcy5sZW5ndGggLyA0ICsgMjtcbiAgdmFyIE4gPSBNYXRoLmNlaWwobCAvIDE2KTtcbiAgdmFyIE0gPSBuZXcgQXJyYXkoTik7XG5cbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IE47ICsrX2kpIHtcbiAgICB2YXIgYXJyID0gbmV3IFVpbnQzMkFycmF5KDE2KTtcblxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgMTY7ICsraikge1xuICAgICAgYXJyW2pdID0gYnl0ZXNbX2kgKiA2NCArIGogKiA0XSA8PCAyNCB8IGJ5dGVzW19pICogNjQgKyBqICogNCArIDFdIDw8IDE2IHwgYnl0ZXNbX2kgKiA2NCArIGogKiA0ICsgMl0gPDwgOCB8IGJ5dGVzW19pICogNjQgKyBqICogNCArIDNdO1xuICAgIH1cblxuICAgIE1bX2ldID0gYXJyO1xuICB9XG5cbiAgTVtOIC0gMV1bMTRdID0gKGJ5dGVzLmxlbmd0aCAtIDEpICogOCAvIE1hdGgucG93KDIsIDMyKTtcbiAgTVtOIC0gMV1bMTRdID0gTWF0aC5mbG9vcihNW04gLSAxXVsxNF0pO1xuICBNW04gLSAxXVsxNV0gPSAoYnl0ZXMubGVuZ3RoIC0gMSkgKiA4ICYgMHhmZmZmZmZmZjtcblxuICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBOOyArK19pMikge1xuICAgIHZhciBXID0gbmV3IFVpbnQzMkFycmF5KDgwKTtcblxuICAgIGZvciAodmFyIHQgPSAwOyB0IDwgMTY7ICsrdCkge1xuICAgICAgV1t0XSA9IE1bX2kyXVt0XTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBfdCA9IDE2OyBfdCA8IDgwOyArK190KSB7XG4gICAgICBXW190XSA9IFJPVEwoV1tfdCAtIDNdIF4gV1tfdCAtIDhdIF4gV1tfdCAtIDE0XSBeIFdbX3QgLSAxNl0sIDEpO1xuICAgIH1cblxuICAgIHZhciBhID0gSFswXTtcbiAgICB2YXIgYiA9IEhbMV07XG4gICAgdmFyIGMgPSBIWzJdO1xuICAgIHZhciBkID0gSFszXTtcbiAgICB2YXIgZSA9IEhbNF07XG5cbiAgICBmb3IgKHZhciBfdDIgPSAwOyBfdDIgPCA4MDsgKytfdDIpIHtcbiAgICAgIHZhciBzID0gTWF0aC5mbG9vcihfdDIgLyAyMCk7XG4gICAgICB2YXIgVCA9IFJPVEwoYSwgNSkgKyBmKHMsIGIsIGMsIGQpICsgZSArIEtbc10gKyBXW190Ml0gPj4+IDA7XG4gICAgICBlID0gZDtcbiAgICAgIGQgPSBjO1xuICAgICAgYyA9IFJPVEwoYiwgMzApID4+PiAwO1xuICAgICAgYiA9IGE7XG4gICAgICBhID0gVDtcbiAgICB9XG5cbiAgICBIWzBdID0gSFswXSArIGEgPj4+IDA7XG4gICAgSFsxXSA9IEhbMV0gKyBiID4+PiAwO1xuICAgIEhbMl0gPSBIWzJdICsgYyA+Pj4gMDtcbiAgICBIWzNdID0gSFszXSArIGQgPj4+IDA7XG4gICAgSFs0XSA9IEhbNF0gKyBlID4+PiAwO1xuICB9XG5cbiAgcmV0dXJuIFtIWzBdID4+IDI0ICYgMHhmZiwgSFswXSA+PiAxNiAmIDB4ZmYsIEhbMF0gPj4gOCAmIDB4ZmYsIEhbMF0gJiAweGZmLCBIWzFdID4+IDI0ICYgMHhmZiwgSFsxXSA+PiAxNiAmIDB4ZmYsIEhbMV0gPj4gOCAmIDB4ZmYsIEhbMV0gJiAweGZmLCBIWzJdID4+IDI0ICYgMHhmZiwgSFsyXSA+PiAxNiAmIDB4ZmYsIEhbMl0gPj4gOCAmIDB4ZmYsIEhbMl0gJiAweGZmLCBIWzNdID4+IDI0ICYgMHhmZiwgSFszXSA+PiAxNiAmIDB4ZmYsIEhbM10gPj4gOCAmIDB4ZmYsIEhbM10gJiAweGZmLCBIWzRdID4+IDI0ICYgMHhmZiwgSFs0XSA+PiAxNiAmIDB4ZmYsIEhbNF0gPj4gOCAmIDB4ZmYsIEhbNF0gJiAweGZmXTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgc2hhMTsiLCJpbXBvcnQgdmFsaWRhdGUgZnJvbSAnLi92YWxpZGF0ZS5qcyc7XG4vKipcbiAqIENvbnZlcnQgYXJyYXkgb2YgMTYgYnl0ZSB2YWx1ZXMgdG8gVVVJRCBzdHJpbmcgZm9ybWF0IG9mIHRoZSBmb3JtOlxuICogWFhYWFhYWFgtWFhYWC1YWFhYLVhYWFgtWFhYWFhYWFhYWFhYXG4gKi9cblxudmFyIGJ5dGVUb0hleCA9IFtdO1xuXG5mb3IgKHZhciBpID0gMDsgaSA8IDI1NjsgKytpKSB7XG4gIGJ5dGVUb0hleC5wdXNoKChpICsgMHgxMDApLnRvU3RyaW5nKDE2KS5zdWJzdHIoMSkpO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnkoYXJyKSB7XG4gIHZhciBvZmZzZXQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IDA7XG4gIC8vIE5vdGU6IEJlIGNhcmVmdWwgZWRpdGluZyB0aGlzIGNvZGUhICBJdCdzIGJlZW4gdHVuZWQgZm9yIHBlcmZvcm1hbmNlXG4gIC8vIGFuZCB3b3JrcyBpbiB3YXlzIHlvdSBtYXkgbm90IGV4cGVjdC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS91dWlkanMvdXVpZC9wdWxsLzQzNFxuICB2YXIgdXVpZCA9IChieXRlVG9IZXhbYXJyW29mZnNldCArIDBdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMV1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAyXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDNdXSArICctJyArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgNF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA1XV0gKyAnLScgKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDZdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgN11dICsgJy0nICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA4XV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDldXSArICctJyArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTBdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTFdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTJdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTNdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTRdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTVdXSkudG9Mb3dlckNhc2UoKTsgLy8gQ29uc2lzdGVuY3kgY2hlY2sgZm9yIHZhbGlkIFVVSUQuICBJZiB0aGlzIHRocm93cywgaXQncyBsaWtlbHkgZHVlIHRvIG9uZVxuICAvLyBvZiB0aGUgZm9sbG93aW5nOlxuICAvLyAtIE9uZSBvciBtb3JlIGlucHV0IGFycmF5IHZhbHVlcyBkb24ndCBtYXAgdG8gYSBoZXggb2N0ZXQgKGxlYWRpbmcgdG9cbiAgLy8gXCJ1bmRlZmluZWRcIiBpbiB0aGUgdXVpZClcbiAgLy8gLSBJbnZhbGlkIGlucHV0IHZhbHVlcyBmb3IgdGhlIFJGQyBgdmVyc2lvbmAgb3IgYHZhcmlhbnRgIGZpZWxkc1xuXG4gIGlmICghdmFsaWRhdGUodXVpZCkpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ1N0cmluZ2lmaWVkIFVVSUQgaXMgaW52YWxpZCcpO1xuICB9XG5cbiAgcmV0dXJuIHV1aWQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHN0cmluZ2lmeTsiLCJpbXBvcnQgcm5nIGZyb20gJy4vcm5nLmpzJztcbmltcG9ydCBzdHJpbmdpZnkgZnJvbSAnLi9zdHJpbmdpZnkuanMnOyAvLyAqKmB2MSgpYCAtIEdlbmVyYXRlIHRpbWUtYmFzZWQgVVVJRCoqXG4vL1xuLy8gSW5zcGlyZWQgYnkgaHR0cHM6Ly9naXRodWIuY29tL0xpb3NLL1VVSUQuanNcbi8vIGFuZCBodHRwOi8vZG9jcy5weXRob24ub3JnL2xpYnJhcnkvdXVpZC5odG1sXG5cbnZhciBfbm9kZUlkO1xuXG52YXIgX2Nsb2Nrc2VxOyAvLyBQcmV2aW91cyB1dWlkIGNyZWF0aW9uIHRpbWVcblxuXG52YXIgX2xhc3RNU2VjcyA9IDA7XG52YXIgX2xhc3ROU2VjcyA9IDA7IC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdXVpZGpzL3V1aWQgZm9yIEFQSSBkZXRhaWxzXG5cbmZ1bmN0aW9uIHYxKG9wdGlvbnMsIGJ1Ziwgb2Zmc2V0KSB7XG4gIHZhciBpID0gYnVmICYmIG9mZnNldCB8fCAwO1xuICB2YXIgYiA9IGJ1ZiB8fCBuZXcgQXJyYXkoMTYpO1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIG5vZGUgPSBvcHRpb25zLm5vZGUgfHwgX25vZGVJZDtcbiAgdmFyIGNsb2Nrc2VxID0gb3B0aW9ucy5jbG9ja3NlcSAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5jbG9ja3NlcSA6IF9jbG9ja3NlcTsgLy8gbm9kZSBhbmQgY2xvY2tzZXEgbmVlZCB0byBiZSBpbml0aWFsaXplZCB0byByYW5kb20gdmFsdWVzIGlmIHRoZXkncmUgbm90XG4gIC8vIHNwZWNpZmllZC4gIFdlIGRvIHRoaXMgbGF6aWx5IHRvIG1pbmltaXplIGlzc3VlcyByZWxhdGVkIHRvIGluc3VmZmljaWVudFxuICAvLyBzeXN0ZW0gZW50cm9weS4gIFNlZSAjMTg5XG5cbiAgaWYgKG5vZGUgPT0gbnVsbCB8fCBjbG9ja3NlcSA9PSBudWxsKSB7XG4gICAgdmFyIHNlZWRCeXRlcyA9IG9wdGlvbnMucmFuZG9tIHx8IChvcHRpb25zLnJuZyB8fCBybmcpKCk7XG5cbiAgICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgICAvLyBQZXIgNC41LCBjcmVhdGUgYW5kIDQ4LWJpdCBub2RlIGlkLCAoNDcgcmFuZG9tIGJpdHMgKyBtdWx0aWNhc3QgYml0ID0gMSlcbiAgICAgIG5vZGUgPSBfbm9kZUlkID0gW3NlZWRCeXRlc1swXSB8IDB4MDEsIHNlZWRCeXRlc1sxXSwgc2VlZEJ5dGVzWzJdLCBzZWVkQnl0ZXNbM10sIHNlZWRCeXRlc1s0XSwgc2VlZEJ5dGVzWzVdXTtcbiAgICB9XG5cbiAgICBpZiAoY2xvY2tzZXEgPT0gbnVsbCkge1xuICAgICAgLy8gUGVyIDQuMi4yLCByYW5kb21pemUgKDE0IGJpdCkgY2xvY2tzZXFcbiAgICAgIGNsb2Nrc2VxID0gX2Nsb2Nrc2VxID0gKHNlZWRCeXRlc1s2XSA8PCA4IHwgc2VlZEJ5dGVzWzddKSAmIDB4M2ZmZjtcbiAgICB9XG4gIH0gLy8gVVVJRCB0aW1lc3RhbXBzIGFyZSAxMDAgbmFuby1zZWNvbmQgdW5pdHMgc2luY2UgdGhlIEdyZWdvcmlhbiBlcG9jaCxcbiAgLy8gKDE1ODItMTAtMTUgMDA6MDApLiAgSlNOdW1iZXJzIGFyZW4ndCBwcmVjaXNlIGVub3VnaCBmb3IgdGhpcywgc29cbiAgLy8gdGltZSBpcyBoYW5kbGVkIGludGVybmFsbHkgYXMgJ21zZWNzJyAoaW50ZWdlciBtaWxsaXNlY29uZHMpIGFuZCAnbnNlY3MnXG4gIC8vICgxMDAtbmFub3NlY29uZHMgb2Zmc2V0IGZyb20gbXNlY3MpIHNpbmNlIHVuaXggZXBvY2gsIDE5NzAtMDEtMDEgMDA6MDAuXG5cblxuICB2YXIgbXNlY3MgPSBvcHRpb25zLm1zZWNzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLm1zZWNzIDogRGF0ZS5ub3coKTsgLy8gUGVyIDQuMi4xLjIsIHVzZSBjb3VudCBvZiB1dWlkJ3MgZ2VuZXJhdGVkIGR1cmluZyB0aGUgY3VycmVudCBjbG9ja1xuICAvLyBjeWNsZSB0byBzaW11bGF0ZSBoaWdoZXIgcmVzb2x1dGlvbiBjbG9ja1xuXG4gIHZhciBuc2VjcyA9IG9wdGlvbnMubnNlY3MgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMubnNlY3MgOiBfbGFzdE5TZWNzICsgMTsgLy8gVGltZSBzaW5jZSBsYXN0IHV1aWQgY3JlYXRpb24gKGluIG1zZWNzKVxuXG4gIHZhciBkdCA9IG1zZWNzIC0gX2xhc3RNU2VjcyArIChuc2VjcyAtIF9sYXN0TlNlY3MpIC8gMTAwMDA7IC8vIFBlciA0LjIuMS4yLCBCdW1wIGNsb2Nrc2VxIG9uIGNsb2NrIHJlZ3Jlc3Npb25cblxuICBpZiAoZHQgPCAwICYmIG9wdGlvbnMuY2xvY2tzZXEgPT09IHVuZGVmaW5lZCkge1xuICAgIGNsb2Nrc2VxID0gY2xvY2tzZXEgKyAxICYgMHgzZmZmO1xuICB9IC8vIFJlc2V0IG5zZWNzIGlmIGNsb2NrIHJlZ3Jlc3NlcyAobmV3IGNsb2Nrc2VxKSBvciB3ZSd2ZSBtb3ZlZCBvbnRvIGEgbmV3XG4gIC8vIHRpbWUgaW50ZXJ2YWxcblxuXG4gIGlmICgoZHQgPCAwIHx8IG1zZWNzID4gX2xhc3RNU2VjcykgJiYgb3B0aW9ucy5uc2VjcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbnNlY3MgPSAwO1xuICB9IC8vIFBlciA0LjIuMS4yIFRocm93IGVycm9yIGlmIHRvbyBtYW55IHV1aWRzIGFyZSByZXF1ZXN0ZWRcblxuXG4gIGlmIChuc2VjcyA+PSAxMDAwMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcInV1aWQudjEoKTogQ2FuJ3QgY3JlYXRlIG1vcmUgdGhhbiAxME0gdXVpZHMvc2VjXCIpO1xuICB9XG5cbiAgX2xhc3RNU2VjcyA9IG1zZWNzO1xuICBfbGFzdE5TZWNzID0gbnNlY3M7XG4gIF9jbG9ja3NlcSA9IGNsb2Nrc2VxOyAvLyBQZXIgNC4xLjQgLSBDb252ZXJ0IGZyb20gdW5peCBlcG9jaCB0byBHcmVnb3JpYW4gZXBvY2hcblxuICBtc2VjcyArPSAxMjIxOTI5MjgwMDAwMDsgLy8gYHRpbWVfbG93YFxuXG4gIHZhciB0bCA9ICgobXNlY3MgJiAweGZmZmZmZmYpICogMTAwMDAgKyBuc2VjcykgJSAweDEwMDAwMDAwMDtcbiAgYltpKytdID0gdGwgPj4+IDI0ICYgMHhmZjtcbiAgYltpKytdID0gdGwgPj4+IDE2ICYgMHhmZjtcbiAgYltpKytdID0gdGwgPj4+IDggJiAweGZmO1xuICBiW2krK10gPSB0bCAmIDB4ZmY7IC8vIGB0aW1lX21pZGBcblxuICB2YXIgdG1oID0gbXNlY3MgLyAweDEwMDAwMDAwMCAqIDEwMDAwICYgMHhmZmZmZmZmO1xuICBiW2krK10gPSB0bWggPj4+IDggJiAweGZmO1xuICBiW2krK10gPSB0bWggJiAweGZmOyAvLyBgdGltZV9oaWdoX2FuZF92ZXJzaW9uYFxuXG4gIGJbaSsrXSA9IHRtaCA+Pj4gMjQgJiAweGYgfCAweDEwOyAvLyBpbmNsdWRlIHZlcnNpb25cblxuICBiW2krK10gPSB0bWggPj4+IDE2ICYgMHhmZjsgLy8gYGNsb2NrX3NlcV9oaV9hbmRfcmVzZXJ2ZWRgIChQZXIgNC4yLjIgLSBpbmNsdWRlIHZhcmlhbnQpXG5cbiAgYltpKytdID0gY2xvY2tzZXEgPj4+IDggfCAweDgwOyAvLyBgY2xvY2tfc2VxX2xvd2BcblxuICBiW2krK10gPSBjbG9ja3NlcSAmIDB4ZmY7IC8vIGBub2RlYFxuXG4gIGZvciAodmFyIG4gPSAwOyBuIDwgNjsgKytuKSB7XG4gICAgYltpICsgbl0gPSBub2RlW25dO1xuICB9XG5cbiAgcmV0dXJuIGJ1ZiB8fCBzdHJpbmdpZnkoYik7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHYxOyIsImltcG9ydCB2MzUgZnJvbSAnLi92MzUuanMnO1xuaW1wb3J0IG1kNSBmcm9tICcuL21kNS5qcyc7XG52YXIgdjMgPSB2MzUoJ3YzJywgMHgzMCwgbWQ1KTtcbmV4cG9ydCBkZWZhdWx0IHYzOyIsImltcG9ydCBzdHJpbmdpZnkgZnJvbSAnLi9zdHJpbmdpZnkuanMnO1xuaW1wb3J0IHBhcnNlIGZyb20gJy4vcGFyc2UuanMnO1xuXG5mdW5jdGlvbiBzdHJpbmdUb0J5dGVzKHN0cikge1xuICBzdHIgPSB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoc3RyKSk7IC8vIFVURjggZXNjYXBlXG5cbiAgdmFyIGJ5dGVzID0gW107XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICBieXRlcy5wdXNoKHN0ci5jaGFyQ29kZUF0KGkpKTtcbiAgfVxuXG4gIHJldHVybiBieXRlcztcbn1cblxuZXhwb3J0IHZhciBETlMgPSAnNmJhN2I4MTAtOWRhZC0xMWQxLTgwYjQtMDBjMDRmZDQzMGM4JztcbmV4cG9ydCB2YXIgVVJMID0gJzZiYTdiODExLTlkYWQtMTFkMS04MGI0LTAwYzA0ZmQ0MzBjOCc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAobmFtZSwgdmVyc2lvbiwgaGFzaGZ1bmMpIHtcbiAgZnVuY3Rpb24gZ2VuZXJhdGVVVUlEKHZhbHVlLCBuYW1lc3BhY2UsIGJ1Ziwgb2Zmc2V0KSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHZhbHVlID0gc3RyaW5nVG9CeXRlcyh2YWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBuYW1lc3BhY2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICBuYW1lc3BhY2UgPSBwYXJzZShuYW1lc3BhY2UpO1xuICAgIH1cblxuICAgIGlmIChuYW1lc3BhY2UubGVuZ3RoICE9PSAxNikge1xuICAgICAgdGhyb3cgVHlwZUVycm9yKCdOYW1lc3BhY2UgbXVzdCBiZSBhcnJheS1saWtlICgxNiBpdGVyYWJsZSBpbnRlZ2VyIHZhbHVlcywgMC0yNTUpJyk7XG4gICAgfSAvLyBDb21wdXRlIGhhc2ggb2YgbmFtZXNwYWNlIGFuZCB2YWx1ZSwgUGVyIDQuM1xuICAgIC8vIEZ1dHVyZTogVXNlIHNwcmVhZCBzeW50YXggd2hlbiBzdXBwb3J0ZWQgb24gYWxsIHBsYXRmb3JtcywgZS5nLiBgYnl0ZXMgPVxuICAgIC8vIGhhc2hmdW5jKFsuLi5uYW1lc3BhY2UsIC4uLiB2YWx1ZV0pYFxuXG5cbiAgICB2YXIgYnl0ZXMgPSBuZXcgVWludDhBcnJheSgxNiArIHZhbHVlLmxlbmd0aCk7XG4gICAgYnl0ZXMuc2V0KG5hbWVzcGFjZSk7XG4gICAgYnl0ZXMuc2V0KHZhbHVlLCBuYW1lc3BhY2UubGVuZ3RoKTtcbiAgICBieXRlcyA9IGhhc2hmdW5jKGJ5dGVzKTtcbiAgICBieXRlc1s2XSA9IGJ5dGVzWzZdICYgMHgwZiB8IHZlcnNpb247XG4gICAgYnl0ZXNbOF0gPSBieXRlc1s4XSAmIDB4M2YgfCAweDgwO1xuXG4gICAgaWYgKGJ1Zikge1xuICAgICAgb2Zmc2V0ID0gb2Zmc2V0IHx8IDA7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTY7ICsraSkge1xuICAgICAgICBidWZbb2Zmc2V0ICsgaV0gPSBieXRlc1tpXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGJ1ZjtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RyaW5naWZ5KGJ5dGVzKTtcbiAgfSAvLyBGdW5jdGlvbiNuYW1lIGlzIG5vdCBzZXR0YWJsZSBvbiBzb21lIHBsYXRmb3JtcyAoIzI3MClcblxuXG4gIHRyeSB7XG4gICAgZ2VuZXJhdGVVVUlELm5hbWUgPSBuYW1lOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZW1wdHlcbiAgfSBjYXRjaCAoZXJyKSB7fSAvLyBGb3IgQ29tbW9uSlMgZGVmYXVsdCBleHBvcnQgc3VwcG9ydFxuXG5cbiAgZ2VuZXJhdGVVVUlELkROUyA9IEROUztcbiAgZ2VuZXJhdGVVVUlELlVSTCA9IFVSTDtcbiAgcmV0dXJuIGdlbmVyYXRlVVVJRDtcbn0iLCJpbXBvcnQgcm5nIGZyb20gJy4vcm5nLmpzJztcbmltcG9ydCBzdHJpbmdpZnkgZnJvbSAnLi9zdHJpbmdpZnkuanMnO1xuXG5mdW5jdGlvbiB2NChvcHRpb25zLCBidWYsIG9mZnNldCkge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIHJuZHMgPSBvcHRpb25zLnJhbmRvbSB8fCAob3B0aW9ucy5ybmcgfHwgcm5nKSgpOyAvLyBQZXIgNC40LCBzZXQgYml0cyBmb3IgdmVyc2lvbiBhbmQgYGNsb2NrX3NlcV9oaV9hbmRfcmVzZXJ2ZWRgXG5cbiAgcm5kc1s2XSA9IHJuZHNbNl0gJiAweDBmIHwgMHg0MDtcbiAgcm5kc1s4XSA9IHJuZHNbOF0gJiAweDNmIHwgMHg4MDsgLy8gQ29weSBieXRlcyB0byBidWZmZXIsIGlmIHByb3ZpZGVkXG5cbiAgaWYgKGJ1Zikge1xuICAgIG9mZnNldCA9IG9mZnNldCB8fCAwO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCAxNjsgKytpKSB7XG4gICAgICBidWZbb2Zmc2V0ICsgaV0gPSBybmRzW2ldO1xuICAgIH1cblxuICAgIHJldHVybiBidWY7XG4gIH1cblxuICByZXR1cm4gc3RyaW5naWZ5KHJuZHMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB2NDsiLCJpbXBvcnQgdjM1IGZyb20gJy4vdjM1LmpzJztcbmltcG9ydCBzaGExIGZyb20gJy4vc2hhMS5qcyc7XG52YXIgdjUgPSB2MzUoJ3Y1JywgMHg1MCwgc2hhMSk7XG5leHBvcnQgZGVmYXVsdCB2NTsiLCJpbXBvcnQgUkVHRVggZnJvbSAnLi9yZWdleC5qcyc7XG5cbmZ1bmN0aW9uIHZhbGlkYXRlKHV1aWQpIHtcbiAgcmV0dXJuIHR5cGVvZiB1dWlkID09PSAnc3RyaW5nJyAmJiBSRUdFWC50ZXN0KHV1aWQpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB2YWxpZGF0ZTsiLCJpbXBvcnQgdmFsaWRhdGUgZnJvbSAnLi92YWxpZGF0ZS5qcyc7XG5cbmZ1bmN0aW9uIHZlcnNpb24odXVpZCkge1xuICBpZiAoIXZhbGlkYXRlKHV1aWQpKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKCdJbnZhbGlkIFVVSUQnKTtcbiAgfVxuXG4gIHJldHVybiBwYXJzZUludCh1dWlkLnN1YnN0cigxNCwgMSksIDE2KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdmVyc2lvbjsiLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5nID0gKGZ1bmN0aW9uKCkge1xuXHRpZiAodHlwZW9mIGdsb2JhbFRoaXMgPT09ICdvYmplY3QnKSByZXR1cm4gZ2xvYmFsVGhpcztcblx0dHJ5IHtcblx0XHRyZXR1cm4gdGhpcyB8fCBuZXcgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdGlmICh0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0JykgcmV0dXJuIHdpbmRvdztcblx0fVxufSkoKTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiLyoqXG4gKiBUaGlzIGlzIHlvdXIgbWFpbi4gVGhpcyBpcyB3aGVyZSB5b3UgcmUtZXhwb3J0IGV2ZXJ5dGhpbmcgeW91IHdhbnQgdG8gYmUgcHVibGljbHkgYXZhaWxhYmxlLlxuICpcbiAqIFRoZSBidWlsZCBlbmZvcmNlcyB0aGF0IHRoZSBmaWxlIGhhcyB0aGUgc2FtZSBuYW1lIGFzIHRoZSBnbG9iYWwgdmFyaWFibGUgdGhhdCBpcyBleHBvcnRlZC5cbiAqL1xuXG4vLyBUaGUgZm9sbG93aW5nIHBvbHlmaWxscyBhcmUgbmVlZGVkIGZvciBJRTExXG5cbmltcG9ydCB7IEFwaVZlcnNpb24gfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCAnY29yZS1qcy9lcy9hcnJheS9maW5kJztcbmltcG9ydCAnY29yZS1qcy9lcy9hcnJheS9mcm9tJztcbmltcG9ydCAnY29yZS1qcy9lcy9tYXAnO1xuaW1wb3J0ICdjb3JlLWpzL2VzL251bWJlci9pcy1pbnRlZ2VyJztcbmltcG9ydCAnY29yZS1qcy9lcy9udW1iZXIvaXMtbmFuJztcbmltcG9ydCAnY29yZS1qcy9lcy9udW1iZXIvcGFyc2UtZmxvYXQnO1xuaW1wb3J0ICdjb3JlLWpzL2VzL251bWJlci9wYXJzZS1pbnQnO1xuaW1wb3J0ICdjb3JlLWpzL2VzL29iamVjdC9hc3NpZ24nO1xuaW1wb3J0ICdjb3JlLWpzL2VzL29iamVjdC9lbnRyaWVzJztcbmltcG9ydCAnY29yZS1qcy9lcy9vYmplY3Qvc2V0LXByb3RvdHlwZS1vZic7XG5pbXBvcnQgJ2NvcmUtanMvZXMvcHJvbWlzZSc7XG4vLyBEdWUgdG8gdGhlIHdheSB3ZSBjb25maWd1cmVkIHdlYnBhY2ssIHdlIHNob3VsZCBiZSBleHBvcnRpbmcgdGhpbmdzIHdoaWNoIHdpbGwgYmUgdW5kZXJcbi8vIGEgZ2xvYmFsIHZhcmlhYmxlIGNhbGxlZCBcInRhYmxlYXVcIi4gRXhwb3J0IGV2ZXJ5dGhpbmcgd2Ugd2FudCB0byBiZSB2aXNpYmxlIHVuZGVyIHRhYmxlYXVcbi8vIGZyb20gdGhpcyBmaWxlLlxuaW1wb3J0IHsgRXh0ZW5zaW9uc0ltcGwgfSBmcm9tICcuL0V4dGVuc2lvbnNBcGkvSW1wbC9FeHRlbnNpb25zSW1wbCc7XG5pbXBvcnQgeyBFeHRlbnNpb25zIH0gZnJvbSAnLi9FeHRlbnNpb25zQXBpL05hbWVzcGFjZXMvRXh0ZW5zaW9ucyc7XG5cbmRlY2xhcmUgbGV0IFZFUlNJT05fSVNfQUxQSEE6IGJvb2xlYW47XG5jb25zdCBpc0FscGhhOiBib29sZWFuID0gdHlwZW9mIFZFUlNJT05fSVNfQUxQSEEgIT09ICd1bmRlZmluZWQnID8gVkVSU0lPTl9JU19BTFBIQSA6IGZhbHNlO1xuXG5kZWNsYXJlIGxldCBBUElfVkVSU0lPTl9OVU1CRVI6IHN0cmluZztcbkFwaVZlcnNpb24uU2V0VmVyc2lvbk51bWJlcih0eXBlb2YgQVBJX1ZFUlNJT05fTlVNQkVSICE9PSAndW5kZWZpbmVkJyA/IEFQSV9WRVJTSU9OX05VTUJFUiA6ICcwLjAuMCcsIGlzQWxwaGEpO1xuXG5jb25zdCBleHRlbnNpb25JbXBsID0gbmV3IEV4dGVuc2lvbnNJbXBsKCk7XG5leHBvcnQgY29uc3QgZXh0ZW5zaW9ucyA9IG5ldyBFeHRlbnNpb25zKGV4dGVuc2lvbkltcGwpO1xuXG4vLyBFeHBvcnQgRW51bXNcbi8vIFRoZXNlIHNob3cgdXAgdW5kZXIgdGhlIHRhYmxlYXUgb2JqZWN0LiBJLmUuIHRhYmxlYXUuRXh0ZW5zaW9uQ29udGV4dC5TZXJ2ZXJcbmV4cG9ydCB7XG4gIEFuYWx5dGljc09iamVjdFR5cGUsXG4gIEFubm90YXRpb25UeXBlLFxuICBDbGFzc05hbWVLZXksXG4gIENvbHVtblR5cGUsXG4gIERhc2hib2FyZExheW91dENoYW5nZSxcbiAgRGFzaGJvYXJkT2JqZWN0VHlwZSxcbiAgRGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eVR5cGUsXG4gIERhdGFUeXBlLFxuICBEYXRlUmFuZ2VUeXBlLFxuICBEaWFsb2dTdHlsZSxcbiAgRW5jb2RpbmdUeXBlLFxuICBFcnJvckNvZGVzLFxuICBFeHRlbnNpb25Db250ZXh0LFxuICBFeHRlbnNpb25Nb2RlLFxuICBGaWVsZEFnZ3JlZ2F0aW9uVHlwZSxcbiAgRmllbGRSb2xlVHlwZSxcbiAgRmlsdGVyRG9tYWluVHlwZSxcbiAgRmlsdGVyTnVsbE9wdGlvbixcbiAgRmlsdGVyVHlwZSxcbiAgRmlsdGVyVXBkYXRlVHlwZSxcbiAgSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZSxcbiAgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gIE1hcmtUeXBlLFxuICBQYXJhbWV0ZXJWYWx1ZVR5cGUsXG4gIFBlcmlvZFR5cGUsXG4gIFF1aWNrVGFibGVDYWxjVHlwZSxcbiAgUmVsYXRpdmVEYXRlRmlsdGVyT3B0aW9ucyxcbiAgUmVwbGF5U3BlZWRUeXBlLFxuICBTZWxlY3RPcHRpb25zLFxuICBTZWxlY3Rpb25VcGRhdGVUeXBlLFxuICBTaGVldFR5cGUsXG4gIFNvcnREaXJlY3Rpb24sXG4gIFRhYmxlYXVFdmVudFR5cGUsXG4gIFRyZW5kTGluZU1vZGVsVHlwZSxcbiAgVml6SW1hZ2VFbmNvZGluZ1R5cGUsXG4gIFZpekltYWdlUGFsZXR0ZVR5cGUsXG4gIFZpekltYWdlU2l6ZVNldHRpbmdBbGlnbm1lbnRUeXBlLFxuICBWaXpJbWFnZVNpemVTZXR0aW5nVHlwZSxcbiAgVml6SW1hZ2VTb3J0RGlyZWN0aW9uVHlwZSxcbiAgWm9uZVZpc2liaWxpdHlUeXBlLFxufSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGVhdS5leHRlbnNpb25zLjEuMTUuMC1wcmUuMTUuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7QUFDQSx3Q0FBd0MsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEdBQUc7O0FBRTNGO0FBQ0E7QUFDQSxrQkFBa0IsU0FBUztBQUMzQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHNEQUFzRDtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxLQUFLLEtBQTRCO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOzs7Ozs7Ozs7Ozs7OztBQzlERCx5SUFBOEQ7QUFDOUQsbUhBQThDO0FBRTlDLE1BQWEsMkJBQTRCLFNBQVEsMkJBQVk7SUFDM0QsWUFBMEIsNkJBQW9FO1FBQzVGLEtBQUssQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQURoQyxrQ0FBNkIsR0FBN0IsNkJBQTZCLENBQXVDO0lBRTlGLENBQUM7SUFFRCxJQUFXLDRCQUE0QjtRQUNyQyxPQUFPLElBQUksQ0FBQyw2QkFBNkIsQ0FBQztJQUM1QyxDQUFDO0NBQ0Y7QUFSRCxrRUFRQzs7Ozs7Ozs7Ozs7Ozs7QUNWRCwySkFBaUY7QUFDakYsbUhBQXNEO0FBQ3RELDhJQUFnRTtBQUVoRSxNQUFhLGtCQUFtQixTQUFRLDZDQUFxQjtJQUMzRCxZQUFtQixTQUFzQyxFQUFVLFVBQWtCLEVBQVUsUUFBaUI7UUFDOUcsS0FBSyxDQUFDLDJDQUFnQixDQUFDLGFBQWEsRUFBRSxTQUFTLENBQUMsQ0FBQztRQURnQixlQUFVLEdBQVYsVUFBVSxDQUFRO1FBQVUsYUFBUSxHQUFSLFFBQVEsQ0FBUztJQUVoSCxDQUFDO0lBRUQsSUFBVyxTQUFTO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDO0lBRUQsSUFBVyxPQUFPO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBRU0sY0FBYztRQUNuQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsZUFBZSxFQUFFLENBQUMsSUFBSSxDQUFrQixDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ3pFLDBFQUEwRTtZQUMxRSxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsT0FBTztnQkFDaEMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUM7Z0JBQ2pFLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsU0FBUyxLQUFLLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFFeEUsSUFBSSxDQUFDLGFBQWEsRUFBRTtnQkFDbEIseUVBQXlFO2dCQUN6RSw4QkFBOEI7Z0JBQzlCLE1BQU0sSUFBSSw0QkFBWSxDQUFDLHFDQUFVLENBQUMsYUFBYSxFQUFFLHVCQUF1QixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQzthQUM1RjtZQUVELE9BQU8sYUFBYSxDQUFDO1FBQ3ZCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBN0JELGdEQTZCQzs7Ozs7Ozs7Ozs7Ozs7QUNqQ0QsMkpBQXFFO0FBQ3JFLDhJQUFnRTtBQUVoRSxNQUFhLGtCQUFtQixTQUFRLDZDQUFxQjtJQUMzRCxZQUFtQixTQUFzQztRQUN2RCxLQUFLLENBQUMsMkNBQWdCLENBQUMsb0JBQW9CLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVNLGFBQWE7UUFDbEIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLHFCQUFxQixFQUFFLENBQUM7SUFDaEQsQ0FBQztDQUNGO0FBUkQsZ0RBUUM7Ozs7Ozs7Ozs7Ozs7O0FDWEQsMkpBQWlGO0FBQ2pGLG1IQUEyRztBQUMzRyxrSEFBZ0Q7QUFDaEQsb0pBQXVFO0FBQ3ZFLGtJQUF3RDtBQUV4RCxNQUFhLHFCQUFzQixTQUFRLHFDQUFpQjtJQUMxRCxZQUEyQixnQkFBd0IsRUFBRSxLQUE4QjtRQUNqRixLQUFLLENBQUMsMkNBQWdCLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFEdkIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFRO0lBRW5ELENBQUM7SUFFTSxpQkFBaUI7UUFDdEIsd0VBQXdFO1FBQ3hFLE1BQU0sT0FBTyxHQUFHLGtDQUFrQixDQUFDLEdBQUcsQ0FBQywwQ0FBb0IsQ0FBQyxDQUFDLFVBQVUsdUNBQTRDLENBQUM7UUFDcEgsT0FBTyxPQUFPLENBQUMsbUNBQW1DLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsYUFBYSxFQUFFLEVBQUU7WUFDL0YsSUFBSSxhQUFhLEtBQUssU0FBUyxFQUFFO2dCQUMvQixNQUFNLElBQUksNEJBQVksQ0FBQyxxQ0FBVSxDQUFDLGdCQUFnQixFQUFFLDBCQUEwQixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO2FBQ3hHO1lBRUQsT0FBTyxJQUFJLHFCQUFTLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQWhCRCxzREFnQkM7Ozs7Ozs7Ozs7Ozs7O0FDdEJELDJKQUFxRTtBQUNyRSw4SUFBZ0U7QUFFaEUsTUFBYSx1QkFBd0IsU0FBUSw2Q0FBcUI7SUFDaEUsWUFBbUIsU0FBc0M7UUFDdkQsS0FBSyxDQUFDLDJDQUFnQixDQUFDLGtCQUFrQixFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3hELENBQUM7Q0FDRjtBQUpELDBEQUlDOzs7Ozs7Ozs7Ozs7OztBQ0xELE1BQWEsWUFBWTtJQUd2QixZQUFtQixJQUFzQjtRQUN2QyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztJQUNwQixDQUFDO0lBRUQsSUFBVyxJQUFJO1FBQ2IsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7Q0FDRjtBQVZELG9DQVVDOzs7Ozs7Ozs7Ozs7OztBQ1hELG1IQUE4QztBQUU5QyxNQUFhLGlCQUFrQixTQUFRLDJCQUFZO0lBT2pELFlBQW1CLElBQXNCLEVBQUUsS0FBOEI7UUFDdkUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRVosSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFDdEIsQ0FBQztJQVJELElBQVcsS0FBSztRQUNkLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0NBT0Y7QUFaRCw4Q0FZQzs7Ozs7Ozs7Ozs7Ozs7QUNkRCxrSUFBd0Q7QUFFeEQsTUFBYSxxQkFBc0IsU0FBUSxxQ0FBaUI7SUFLMUQsWUFBbUIsSUFBc0IsRUFBWSxVQUF1QztRQUMxRixLQUFLLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBRDJCLGVBQVUsR0FBVixVQUFVLENBQTZCO0lBRTVGLENBQUM7SUFORCxJQUFXLFNBQVM7UUFDbEIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pCLENBQUM7Q0FLRjtBQVJELHNEQVFDOzs7Ozs7Ozs7Ozs7OztBQ1pELHlJQUE4RDtBQUM5RCxtSEFBOEM7QUFFOUMsTUFBYSw4QkFBK0IsU0FBUSwyQkFBWTtJQUM5RCxZQUEyQixXQUF3QztRQUNqRSxLQUFLLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLHlCQUF5QixDQUFDLENBQUM7UUFEbEMsZ0JBQVcsR0FBWCxXQUFXLENBQTZCO0lBRW5FLENBQUM7SUFFRCxJQUFXLFVBQVU7UUFDbkIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7Q0FDRjtBQVJELHdFQVFDOzs7Ozs7Ozs7Ozs7OztBQ1hELHlJQUE4RDtBQUM5RCw4SUFBZ0U7QUFFaEUsTUFBYSwrQkFBZ0MsU0FBUSw2Q0FBcUI7SUFDeEUsWUFBbUIsU0FBc0MsRUFBVSxXQUF5QztRQUMxRyxLQUFLLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLDBCQUEwQixFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRE4sZ0JBQVcsR0FBWCxXQUFXLENBQThCO0lBRTVHLENBQUM7SUFFRCxJQUFXLFVBQVU7UUFDbkIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7Q0FDRjtBQVJELDBFQVFDOzs7Ozs7Ozs7Ozs7OztBQ1RZLGdDQUF3QixHQUFHLGFBQWEsQ0FBQztBQUN6QyxzQ0FBOEIsR0FBRyxxQkFBcUIsQ0FBQztBQUV2RCxrQ0FBMEIsR0FBRyxrQkFBa0IsQ0FBQztBQUNoRCx3Q0FBZ0MsR0FBRyx5QkFBeUIsQ0FBQztBQUM3RCxzQ0FBOEIsR0FBRyxzQkFBc0IsQ0FBQztBQUN4RCw0Q0FBb0MsR0FBRyw2QkFBNkIsQ0FBQztBQUNyRSxtQ0FBMkIsR0FBRyxtQkFBbUIsQ0FBQztBQUNsRCxvQ0FBNEIsR0FBRyxvQkFBb0IsQ0FBQztBQUVwRCxvQ0FBNEIsR0FBWTtJQUNuRCxrQ0FBMEI7SUFDMUIsd0NBQWdDO0lBQ2hDLHNDQUE4QjtJQUM5Qiw0Q0FBb0M7SUFDcEMsbUNBQTJCO0lBQzNCLG9DQUE0QjtDQUM3QixDQUFDOzs7Ozs7Ozs7Ozs7OztBQ2pCRixNQUFhLGVBQWU7SUFDMUIsWUFDWSxPQUFnQixFQUNoQixPQUFnQixFQUNoQixjQUF1QixFQUN2QixXQUFvQjtRQUhwQixZQUFPLEdBQVAsT0FBTyxDQUFTO1FBQ2hCLFlBQU8sR0FBUCxPQUFPLENBQVM7UUFDaEIsbUJBQWMsR0FBZCxjQUFjLENBQVM7UUFDdkIsZ0JBQVcsR0FBWCxXQUFXLENBQVM7SUFDN0IsQ0FBQztJQUVKLElBQVcsTUFBTTtRQUNmLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBRUQsSUFBVyxNQUFNO1FBQ2YsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxJQUFXLGFBQWE7UUFDdEIsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQzdCLENBQUM7SUFFRCxJQUFXLFVBQVU7UUFDbkIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7Q0FDRjtBQXZCRCwwQ0F1QkM7Ozs7Ozs7Ozs7Ozs7O0FDdkJELG1IQUF1STtBQUN2SSxvSkFBdUU7QUFFdkUsTUFBYSxxQkFBc0IsU0FBUSw0QkFBWTtJQUM5QyxzQkFBc0I7UUFDM0IsTUFBTSxPQUFPLEdBQUcsa0NBQWtCLENBQUMsR0FBRyxDQUFDLDBDQUFvQixDQUFDLENBQUMsVUFBVSwrQ0FBbUQsQ0FBQztRQUUzSCxPQUFPLE9BQU8sQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLElBQUksQ0FBNkIsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUNsRixNQUFNLFVBQVUsR0FBZSxNQUFNLENBQUM7WUFDdEMsTUFBTSxXQUFXLEdBQStCLEVBQUUsQ0FBQztZQUVuRCw4Q0FBOEM7WUFDOUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUU7Z0JBQ25ELFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEQsQ0FBQyxDQUFDLENBQUM7WUFFSCxPQUFPLFdBQVcsQ0FBQztRQUNyQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyx3QkFBd0IsQ0FBQyxjQUE4QjtRQUM3RCxNQUFNLGNBQWMsR0FBRyxJQUFJLDhCQUFjLENBQUMsY0FBYyxFQUFFLDBDQUFvQixDQUFDLENBQUM7UUFDaEYsTUFBTSxVQUFVLEdBQUcsSUFBSSwwQkFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ2xELGNBQWMsQ0FBQyw4QkFBOEIsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMxRCxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0NBQ0Y7QUF2QkQsc0RBdUJDOzs7Ozs7Ozs7Ozs7OztBQzVCRCwySkFBMEU7QUFDMUUsZ0tBb0IyQztBQUMzQyxtSEFhZ0M7QUFDaEMsa0hBQWdEO0FBQ2hELCtHQUE4QztBQUM5QyxrSEFBZ0Q7QUFDaEQsK0lBQWtFO0FBQ2xFLGdJQUF3RDtBQUN4RCx1SEFBa0Q7QUFDbEQscUdBQXNDO0FBQ3RDLDBLQUFvRjtBQUNwRiwrSUFBa0U7QUFHbEUsa0xBQW9JO0FBQ3BJLG9KQUF1RTtBQUV2RSw4SkFVdUM7QUFDdkMsNElBQWdFO0FBQ2hFLGdMQUF3RjtBQUN4RixpSEFBOEM7QUFDOUMsaUtBY3dDO0FBQ3hDLCtGQUFrQztBQUlsQyxNQUFhLGNBQWM7SUFXbEIsZUFBZSxDQUFDLGlCQUEwQixFQUFFLG9CQUFrQztRQUNuRixJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFO1lBQ2hDLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLE9BQU8sQ0FBUyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTs7Z0JBQ3BFLE1BQU0sV0FBVyxHQUEwQixFQUFFLE9BQU8sRUFBRSwwQkFBVSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDcEYsdUdBQXVHO2dCQUN2RyxJQUFJLHFFQUFpQyxDQUFDLDhCQUE4QixDQUFDLFdBQVcsQ0FBQyxFQUFFO29CQUNqRixxRUFBcUU7b0JBQ3JFLE1BQU0sd0JBQXdCLEdBQUcscUVBQWlDLENBQUMsMkJBQTJCLENBQUMsV0FBVyxDQUFDLENBQUM7b0JBQzVHLDhCQUF3QiwwQ0FDcEIsSUFBSSxDQUFDLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxvQkFBb0IsQ0FBQyxFQUNsSCxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRTt3QkFDcEIsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO29CQUN2QixDQUFDLEVBQ0EsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7d0JBQ2YsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUNoQixDQUFDLEVBQUU7aUJBQ047cUJBQU07b0JBQ0wsZ0dBQWdHO29CQUNoRyxNQUFNLDRCQUE0QixHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzFFLHFDQUFxQixDQUFDLE1BQU0sRUFBRSxvREFBeUIsRUFBRSxXQUFXLENBQUM7eUJBQ2xFLElBQUksQ0FBQyxDQUFDLE9BQXFDLEVBQUUsRUFBRTt3QkFDOUMsT0FBTyw0QkFBNEIsQ0FBQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztvQkFDeEYsQ0FBQyxDQUFDO3lCQUNELElBQUksQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFO3dCQUNwQixPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7b0JBQ3ZCLENBQUMsQ0FBQzt5QkFDRCxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTt3QkFDZixNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ2hCLENBQUMsQ0FBQyxDQUFDO2lCQUNOO1lBQ0gsQ0FBQyxDQUFDLENBQUM7U0FDSjtRQUVELE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDO0lBQ3JDLENBQUM7SUFFTSxtQkFBbUIsQ0FBQyxTQUFpQjtRQUMxQyxNQUFNLFVBQVUsR0FBRyxrQ0FBa0IsQ0FBQyxHQUFHLENBQUMsMENBQW9CLENBQUMsQ0FBQyxVQUFVLHlCQUE4QixDQUFDO1FBRXpHLE9BQU8sVUFBVSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFTSxvQkFBb0IsQ0FBQyxtQkFBNEI7UUFDdEQsTUFBTSxTQUFTLEdBQUcsa0NBQWtCLENBQUMsR0FBRyxDQUFDLDBDQUFvQixDQUFDLENBQUMsVUFBVSw2QkFBNkMsQ0FBQztRQUV2SCxPQUFPLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDbkYsQ0FBQztJQUVPLDJCQUEyQixDQUFDLE9BQXlCO1FBQzNELE1BQU0seUJBQXlCLEdBQUcsT0FBb0MsQ0FBQztRQUN2RSxJQUFJLENBQUMseUJBQXlCLENBQUMsYUFBYSxFQUFFO1lBQzVDLE1BQU0sSUFBSSw0QkFBWSxDQUFDLHFDQUFVLENBQUMsYUFBYSxFQUFFLHlDQUF5QyxDQUFDLENBQUM7U0FDN0Y7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFTyxvQkFBb0IsQ0FDMUIsaUJBQStDLEVBQy9DLGlCQUEwQixFQUMxQixvQkFBa0M7UUFFbEMsSUFBSSxVQUFVLEdBQTBCLGlCQUFpQixDQUFDLG9EQUF5QixDQUFDLENBQUM7UUFFckYsb0ZBQW9GO1FBQ3BGLHdFQUF3QyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRXJELCtEQUErRDtRQUMvRCxNQUFNLHFCQUFxQixHQUFHLGtDQUFrQixDQUFDLEdBQUcsQ0FBQywwQ0FBb0IsQ0FBQyxDQUFDLFVBQVUscURBRXBGLENBQUM7UUFFRixNQUFNLGVBQWUsR0FBRyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDdEYsT0FBTyxxQkFBcUIsQ0FBQyxrQ0FBa0MsQ0FBQyxpQkFBaUIsRUFBRSxlQUFlLENBQUMsQ0FBQyxJQUFJLENBQVMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUMxSCxnR0FBZ0c7WUFDaEcsdUdBQXVHO1lBQ3ZHLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxlQUFlO2dCQUNqRSxDQUFDLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDLGVBQWU7Z0JBQzdDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFFbkMsaUdBQWlHO1lBQ2pHLElBQUksOENBQThCLENBQUMscUJBQXFCLENBQUMsZUFBZSxDQUFDLEVBQUU7Z0JBQ3pFLFVBQVUsR0FBRyxJQUFJLDhDQUE4QixDQUFDLFVBQVUsRUFBRSxlQUFlLENBQUMsQ0FBQzthQUM5RTtZQUNELG1GQUFtRjtZQUNuRiw4SEFBOEg7WUFDOUgseUNBQXlCLENBQUMsVUFBVSxFQUFFLDBDQUFvQixDQUFDLENBQUM7WUFDNUQsNkRBQTZCLENBQUMsVUFBVSxDQUFDLENBQUM7WUFFMUMsSUFBSSxNQUFNLENBQUMsc0JBQXNCLElBQUksSUFBSSxDQUFDLDJCQUEyQixDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsRUFBRTtnQkFDdkcsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQywwQkFBMEIsQ0FDckQsTUFBTSxDQUFDLHNCQUFzQixFQUM3QixNQUFNLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FDL0MsQ0FBQztnQkFDRixJQUFJLENBQUMsZUFBZSxHQUFHLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxlQUFlLENBQUM7YUFDdEU7WUFFRCxJQUFJLE1BQU0sQ0FBQyxzQkFBc0IsRUFBRTtnQkFDakMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxNQUFNLENBQUMsc0JBQXNCLENBQUMsQ0FBQzthQUN4RjtZQUVELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSx5QkFBVyxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1lBQ2hFLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1lBQ3RFLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxPQUFFLENBQUMsSUFBSSxlQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQy9CLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxtQkFBUSxDQUFDLElBQUksNkNBQXFCLEVBQUUsQ0FBQyxDQUFDO1lBRTFELElBQUksTUFBTSxDQUFDLG9CQUFvQixDQUFDLGtCQUFrQixFQUFFO2dCQUNsRCxJQUFJLENBQUMsc0JBQXNCLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO2dCQUN4RixJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDLGtCQUFrQixDQUFDLENBQUM7YUFDekU7WUFFRCxzRkFBc0Y7WUFDdEYscUVBQXFFO1lBQ3JFLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1lBRTFELHdEQUF3RDtZQUN4RCxJQUFJLENBQUMsZ0RBQWdELENBQUMsVUFBVSxDQUFDLENBQUM7WUFFbEUsK0dBQStHO1lBQy9HLDRHQUE0RztZQUM1Ryx5REFBeUQ7WUFDekQsT0FBTyxNQUFNLENBQUMsc0JBQXNCLENBQUM7UUFDdkMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sa0JBQWtCLENBQUMsZUFBK0M7UUFDdkUsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDdkIsSUFBSSxDQUFDLGFBQWEsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3JELElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxHQUFHLDhCQUE4QixDQUFDO1lBQ3ZELFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUMvQztRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUNqRCxPQUFPO1NBQ1I7UUFFRCxNQUFNLFVBQVUsR0FBa0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFzQixDQUFDO1FBQzVFLE9BQU8sVUFBVSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3JDLFVBQVUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDdkQ7UUFDRCxlQUFlLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsc0JBQXNCLEVBQUUsRUFBRTtZQUM5RCxJQUFJLENBQUMsZ0NBQWdDLENBQUMsc0JBQXNCLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDNUUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sZ0NBQWdDLENBQUMsc0JBQXVDLEVBQUUsVUFBeUI7UUFDekcsSUFBSSxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBRW5CLE1BQU0sYUFBYSxHQUFHLHNCQUFzQixDQUFDLGFBQWEsQ0FBQztRQUMzRCxJQUFJLGFBQWEsQ0FBQyxVQUFVLEVBQUU7WUFDNUIsU0FBUyxJQUFJLGVBQWUsR0FBRyxhQUFhLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQztTQUMzRTtRQUVELElBQUksYUFBYSxDQUFDLFFBQVEsRUFBRTtZQUMxQixTQUFTLElBQUksYUFBYSxHQUFHLGFBQWEsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLEdBQUcsSUFBSSxDQUFDO1NBQ3ZFO1FBRUQsSUFBSSxhQUFhLENBQUMsVUFBVSxFQUFFO1lBQzVCLFNBQVMsSUFBSSxlQUFlLEdBQUcsYUFBYSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsR0FBRyxJQUFJLENBQUM7U0FDM0U7UUFFRCxJQUFJLGFBQWEsQ0FBQyxTQUFTLEVBQUU7WUFDM0IsU0FBUyxJQUFJLGNBQWMsR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQztTQUN6RTtRQUVELElBQUksYUFBYSxDQUFDLGNBQWMsRUFBRTtZQUNoQyxTQUFTLElBQUksbUJBQW1CLEdBQUcsYUFBYSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsR0FBRyxJQUFJLENBQUM7U0FDbkY7UUFFRCxJQUFJLGFBQWEsQ0FBQyxLQUFLLEVBQUU7WUFDdkIsU0FBUyxJQUFJLFNBQVMsR0FBRyxhQUFhLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztTQUNyRDtRQUVELE1BQU0sUUFBUSxHQUFXLEdBQUcsR0FBRyxzQkFBc0IsQ0FBQyxZQUFZLENBQUM7UUFDbkUsTUFBTSxJQUFJLEdBQVcsUUFBUSxHQUFHLEtBQUssR0FBRyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ3pELFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVPLGdEQUFnRCxDQUFDLFVBQWlDO1FBQ3hGLE1BQU0sbUJBQW1CLEdBQXdCLGtDQUFrQixDQUFDLEdBQUcsQ0FBQywwQ0FBb0IsQ0FBQyxDQUFDLFVBQVUsMkNBRXZHLENBQUM7UUFDRixtRUFBbUU7UUFDbkUsbURBQW1EO1FBQ25ELG1CQUFtQixDQUFDLGVBQWUsQ0FDakMseUNBQWMsQ0FBQyx5QkFBeUIsRUFDeEMsR0FBRyxFQUFFLENBQUMsSUFBSSxFQUNWLENBQUMsZUFBbUMsRUFBRSxFQUFFO1lBQ3RDLElBQUksZUFBZSxFQUFFO2dCQUNuQixJQUFJLENBQUMsc0JBQXNCLENBQUMsVUFBVSxFQUFFLGVBQWUsQ0FBQyxDQUFDO2dCQUN6RCxJQUFJLENBQUMsa0JBQWtCLENBQUMsZUFBZSxDQUFDLENBQUM7YUFDMUM7UUFDSCxDQUFDLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTyxzQkFBc0IsQ0FBQyxVQUFpQyxFQUFFLGtCQUFzQztRQUN0RyxNQUFNLFNBQVMsR0FBWSxDQUFDLEdBQUcsMERBQTRCLEVBQUUsR0FBRyx3REFBeUIsQ0FBQyxDQUFDO1FBQzNGLGtCQUFrQixDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDLGVBQWUsRUFBRSxFQUFFO1lBQzlELElBQUksZUFBZSxDQUFDLGFBQWEsQ0FBQyxVQUFVLEVBQUU7Z0JBQzVDLFNBQVMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUMxRDtRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUN4QixNQUFNLFVBQVUsR0FBc0IsRUFBRSxDQUFDLHNDQUFXLENBQUMsaUJBQWlCLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQztZQUNyRixVQUFVO2lCQUNQLE9BQU8sQ0FBQyxpQ0FBTSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUM7aUJBQ3BDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO2dCQUNqQixJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxNQUFnQyxDQUFDLENBQUM7WUFDNUQsQ0FBQyxDQUFDO2lCQUNELEtBQUssRUFBRSxDQUFDO1NBQ1o7SUFDSCxDQUFDO0lBRU8sU0FBUyxDQUFDLEtBQTZCO1FBQzdDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxlQUFlLEVBQUUsRUFBRTtZQUNoQyxJQUFJLHdEQUF5QixDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLEVBQUU7Z0JBQ2hFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsQ0FBQzthQUN4QztpQkFBTSxJQUFJLDBEQUE0QixDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLEVBQUU7Z0JBQzFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxlQUFlLENBQUMsQ0FBQzthQUMzQztpQkFBTTtnQkFDTCxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLGVBQWUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO2FBQzVGO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sMEJBQTBCLENBQUMsSUFBNEIsRUFBRSxTQUFvQjtRQUNuRiwwQ0FBMEM7UUFDMUMsTUFBTSxhQUFhLEdBQUcsSUFBSSw2QkFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsb0NBQVMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3RJLE1BQU0sYUFBYSxHQUFHLElBQUksNkJBQWEsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsMENBQW9CLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQ3hJLE1BQU0sU0FBUyxHQUFHLElBQUkscUJBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMvQyxPQUFPLElBQUksbUNBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVPLDBCQUEwQixDQUFDLElBQTRCO1FBQzdELE1BQU0sYUFBYSxHQUFHLElBQUksNkJBQWEsQ0FDckMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQ3ZCLG9DQUFTLENBQUMsU0FBUyxFQUNuQixFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFDM0MsU0FBUyxFQUFFLHVDQUF1QztRQUNsRCxJQUFJLENBQ0wsQ0FBQztRQUVGLE1BQU0sYUFBYSxHQUFHLElBQUksNkJBQWEsQ0FDckMsYUFBYSxFQUNiLDBDQUFvQixFQUNwQixJQUFJLENBQUMsUUFBUSxFQUNiLElBQUksRUFBRSxtRUFBbUU7UUFDekUsSUFBSSxFQUFFLDhDQUE4QztRQUNwRCxJQUFJLENBQUMsZUFBZSxFQUNwQixxREFBeUIsQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQ3ZFLENBQUM7UUFDRixNQUFNLFNBQVMsR0FBRyxJQUFJLHFCQUFTLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDL0MsT0FBTyxJQUFJLG1DQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFTyxrQkFBa0IsQ0FBQyxZQUFtQztRQUM1RCxNQUFNLFlBQVksR0FBRyxJQUFJLDJCQUFZLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDcEQsT0FBTyxJQUFJLG1CQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVPLDhCQUE4QixDQUFDLG9CQUFrQztRQUN2RSxNQUFNLG1CQUFtQixHQUF3QixrQ0FBa0IsQ0FBQyxHQUFHLENBQUMsMENBQW9CLENBQUMsQ0FBQyxVQUFVLDJDQUV2RyxDQUFDO1FBRUYsbUVBQW1FO1FBQ25FLG1EQUFtRDtRQUNuRCxtQkFBbUIsQ0FBQyxlQUFlLENBQ2pDLHlDQUFjLENBQUMsZ0JBQWdCLEVBQy9CLEdBQUcsRUFBRTtZQUNILDZFQUE2RTtZQUM3RSxrQ0FBa0M7WUFDbEMsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDLEVBQ0QsQ0FBQyxLQUF1QixFQUFFLEVBQUU7WUFDMUIsNERBQTREO1lBQzVELElBQUksb0JBQW9CLEVBQUU7Z0JBQ3hCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEVBQUU7b0JBQ25DLE1BQU0sSUFBSSw0QkFBWSxDQUFDLHFDQUFVLENBQUMsYUFBYSxFQUFFLG1EQUFtRCxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztpQkFDakg7Z0JBRUQsb0JBQW9CLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7YUFDbEM7UUFDSCxDQUFDLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxlQUFnQztRQUN2RCxRQUFRLGVBQWUsQ0FBQyxRQUFRLEVBQUU7WUFDaEMsS0FBSyxzREFBdUI7Z0JBQzFCLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksUUFBUSxDQUFDLHdEQUF5QixFQUFFLGVBQWUsQ0FBQyxjQUFjLEVBQUUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ25JLE1BQU07WUFFUixLQUFLLHVEQUF3QjtnQkFDM0IsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxRQUFRLENBQUMseURBQTBCLEVBQUUsZUFBZSxDQUFDLGNBQWMsRUFBRSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDcEksTUFBTTtZQUVSLEtBQUsseURBQTBCO2dCQUM3QixRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FDaEIsSUFBSSxRQUFRLENBQUMsMkRBQTRCLEVBQUUsZUFBZSxDQUFDLGNBQWMsRUFBRSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQ2xILENBQUM7Z0JBQ0YsTUFBTTtZQUVSLEtBQUssMERBQTJCO2dCQUM5QixRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FDaEIsSUFBSSxRQUFRLENBQUMsNERBQTZCLEVBQUUsZUFBZSxDQUFDLGNBQWMsRUFBRSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQ25ILENBQUM7Z0JBQ0YsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxRQUFRLENBQUMsMkRBQTRCLEVBQUUsZUFBZSxDQUFDLGNBQWMsRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDcEksTUFBTTtZQUVSLEtBQUssc0RBQXVCO2dCQUMxQixRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLFFBQVEsQ0FBQyx3REFBeUIsRUFBRSxlQUFlLENBQUMsY0FBYyxFQUFFLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUNuSSxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLFFBQVEsQ0FBQyx3REFBeUIsRUFBRSxlQUFlLENBQUMsY0FBYyxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUNqSSxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLFFBQVEsQ0FBQywwREFBMkIsRUFBRSxlQUFlLENBQUMsY0FBYyxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUNuSSxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FDaEIsSUFBSSxRQUFRLENBQUMsNERBQTZCLEVBQUUsZUFBZSxDQUFDLGNBQWMsRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQ2pILENBQUM7Z0JBQ0YsTUFBTTtZQUVSLEtBQUssd0RBQXlCO2dCQUM1QixRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FDaEIsSUFBSSxRQUFRLENBQUMsMERBQTJCLEVBQUUsZUFBZSxDQUFDLGNBQWMsRUFBRSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQ2pILENBQUM7Z0JBQ0YsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxRQUFRLENBQUMseURBQTBCLEVBQUUsZUFBZSxDQUFDLGNBQWMsRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDbEksUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxRQUFRLENBQUMsd0RBQXlCLEVBQUUsZUFBZSxDQUFDLGNBQWMsRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDakksTUFBTTtZQUVSO2dCQUNFLE1BQU0sSUFBSSw0QkFBWSxDQUFDLHFDQUFVLENBQUMsYUFBYSxFQUFFLHdDQUF3QyxlQUFlLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQztTQUMxSDtJQUNILENBQUM7SUFFTyxtQkFBbUIsQ0FBQyxlQUFnQztRQUMxRCxRQUFRLGVBQWUsQ0FBQyxRQUFRLEVBQUU7WUFDaEMsS0FBSyx3REFBMEI7Z0JBQzdCLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksUUFBUSxDQUFDLHNEQUF3QixFQUFFLGVBQWUsQ0FBQyxjQUFjLEVBQUUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xJLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUNoQixJQUFJLFFBQVEsQ0FBQyw0REFBOEIsRUFBRSxlQUFlLENBQUMsY0FBYyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FDakgsQ0FBQztnQkFDRixNQUFNO1lBRVIsS0FBSyx5REFBMkI7Z0JBQzlCLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksUUFBUSxDQUFDLHNEQUF3QixFQUFFLGVBQWUsQ0FBQyxjQUFjLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQy9ILE1BQU07WUFFUixLQUFLLDBEQUE0QjtnQkFDL0IsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxRQUFRLENBQUMsc0RBQXdCLEVBQUUsZUFBZSxDQUFDLGNBQWMsRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDaEksUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQ2hCLElBQUksUUFBUSxDQUFDLDREQUE4QixFQUFFLGVBQWUsQ0FBQyxjQUFjLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUNsSCxDQUFDO2dCQUNGLE1BQU07WUFFUixLQUFLLDREQUE4QjtnQkFDakMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQ2hCLElBQUksUUFBUSxDQUFDLDREQUE4QixFQUFFLGVBQWUsQ0FBQyxjQUFjLEVBQUUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUNwSCxDQUFDO2dCQUNGLE1BQU07WUFFUixLQUFLLDhEQUFnQztnQkFDbkMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxRQUFRLENBQUMsc0RBQXdCLEVBQUUsZUFBZSxDQUFDLGNBQWMsRUFBRSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hILE1BQU07WUFFUixLQUFLLGtFQUFvQztnQkFDdkMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxRQUFRLENBQUMsNERBQThCLEVBQUUsZUFBZSxDQUFDLGNBQWMsRUFBRSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RILE1BQU07WUFFUjtnQkFDRSxNQUFNLElBQUksNEJBQVksQ0FBQyxxQ0FBVSxDQUFDLGFBQWEsRUFBRSx3Q0FBd0MsZUFBZSxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUM7U0FDMUg7SUFDSCxDQUFDO0NBQ0Y7QUE5WEQsd0NBOFhDOzs7Ozs7Ozs7Ozs7OztBQ2pkRCxnS0FBMkk7QUFFM0k7Ozs7Ozs7OztHQVNHO0FBQ0gsMkRBQTJEO0FBQzNELElBQWlCLGlDQUFpQyxDQTRCakQ7QUE1QkQsV0FBaUIsaUNBQWlDO0lBQ2hEOztPQUVHO0lBQ0gsU0FBZ0IsMkJBQTJCLENBQUMsT0FBK0I7O1FBQ3pFLElBQUksQ0FBQyxDQUFDLE9BQU8sSUFBSSxPQUFPLE9BQU8sQ0FBQyxPQUFPLEtBQUssV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxFQUFFO1lBQ25GLHNDQUFzQztZQUN0QyxPQUFPLENBQUMsSUFBSSxDQUFDLHNGQUFzRixDQUFDLENBQUM7WUFDckcsTUFBTSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7U0FDL0I7YUFBTSxJQUFJLGNBQU8sMENBQUUsT0FBTyxLQUFJLE1BQU0sQ0FBQywyQkFBMkIsRUFBRTtZQUNqRSxNQUFNLENBQUMsMEJBQTBCO2lCQUM5QixJQUFJLENBQUMsQ0FBQyxpQkFBaUIsRUFBRSxFQUFFO2dCQUMxQixNQUFNLFVBQVUsR0FBRyxpQkFBaUIsQ0FBQyxvREFBeUIsQ0FBQyxDQUFDO2dCQUNoRSxVQUFVLENBQUMsT0FBTyxDQUFDLGlDQUFNLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3hELENBQUMsQ0FBQztpQkFDRCxLQUFLLEVBQUUsQ0FBQztTQUNaO1FBRUQsMERBQTBEO1FBQzFELE9BQU8sTUFBTSxDQUFDLDBCQUEwQixDQUFDO0lBQzNDLENBQUM7SUFoQmUsNkRBQTJCLDhCQWdCMUM7SUFFRDs7T0FFRztJQUNILFNBQWdCLDhCQUE4QixDQUFDLE9BQStCO1FBQzVFLE9BQU8sQ0FBQyxDQUFDLDJCQUEyQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFGZSxnRUFBOEIsaUNBRTdDO0FBQ0gsQ0FBQyxFQTVCZ0IsaUNBQWlDLEdBQWpDLHlDQUFpQyxLQUFqQyx5Q0FBaUMsUUE0QmpEOzs7Ozs7Ozs7Ozs7OztBQ3pDRCx5SUFBOEQ7QUFDOUQsZ0tBQXlHO0FBQ3pHLG1IQVFnQztBQUNoQywySEFBc0Q7QUFFdEQsb0pBQXVFO0FBR3ZFLE1BQU0sb0JBQXFCLFNBQVEsMkJBQVk7SUFDN0MsWUFBMkIsWUFBdUM7UUFDaEUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUR4QixpQkFBWSxHQUFaLFlBQVksQ0FBMkI7SUFFbEUsQ0FBQztJQUVELElBQVcsV0FBVztRQUNwQixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDM0IsQ0FBQztDQUNGO0FBRUQsTUFBYSxZQUFZO0lBU3ZCLFlBQW1CLFlBQW1DO1FBSnRELHVFQUF1RTtRQUN2RSxvRkFBb0Y7UUFDNUUsb0JBQWUsR0FBRyxLQUFLLENBQUM7UUFHOUIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFTSxLQUFLLENBQUMsR0FBVztRQUN0Qiw0QkFBWSxDQUFDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFekMsc0RBQXNEO1FBQ3RELElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQzlCLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1lBRWpDLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1NBQ3pCO0lBQ0gsQ0FBQztJQUVNLEdBQUcsQ0FBQyxHQUFXO1FBQ3BCLDRCQUFZLENBQUMsZUFBZSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUV6QyxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRU0sTUFBTTtRQUNYLHlDQUF5QztRQUN6QyxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRCxJQUFXLFVBQVU7UUFDbkIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7SUFFTSxTQUFTO1FBQ2QsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7UUFFakMscURBQXFEO1FBQ3JELElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ3JCLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBcUIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7U0FDbkU7UUFFRCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztRQUU1QixtREFBbUQ7UUFDbkQsTUFBTSxlQUFlLEdBQUcsa0NBQWtCLENBQUMsR0FBRyxDQUFDLDBDQUFvQixDQUFDLENBQUMsVUFBVSx5Q0FFOUUsQ0FBQztRQUVGLE9BQU8sZUFBZSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLElBQUksQ0FDbEUsQ0FBQyxXQUFXLEVBQUUsRUFBRTtZQUNkLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO1lBQzdCLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1lBQ3pCLElBQUksSUFBSSxDQUFDLGdCQUFnQixLQUFLLFNBQVMsRUFBRTtnQkFDdkMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFdBQVcsQ0FBQzthQUNyQztpQkFBTTtnQkFDTCxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxXQUFXLENBQUMsQ0FBQzthQUNuRDtZQUNELE9BQU8sV0FBVyxDQUFDO1FBQ3JCLENBQUMsRUFDRCxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ1QsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7WUFDN0IsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hDLENBQUMsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVNLEdBQUcsQ0FBQyxHQUFXLEVBQUUsS0FBYTtRQUNuQyw0QkFBWSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLG9DQUFvQztRQUNwRiw0QkFBWSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxpQ0FBaUM7UUFDL0UsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7UUFFakMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUNuQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztJQUMxQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLGdCQUFnQjtRQUNyQixNQUFNLE9BQU8sR0FBRyxJQUFJLEtBQUssRUFBc0IsQ0FBQztRQUNoRCxJQUFJLG1CQUF3QyxDQUFDO1FBRTdDLElBQUk7WUFDRixtQkFBbUIsR0FBRyxrQ0FBa0IsQ0FBQyxHQUFHLENBQUMsMENBQW9CLENBQUMsQ0FBQyxVQUFVLDJDQUFnRCxDQUFDO1NBQy9IO1FBQUMsT0FBTyxDQUFDLEVBQUU7WUFDVix3REFBd0Q7WUFDeEQsT0FBTyxPQUFPLENBQUM7U0FDaEI7UUFFRCxNQUFNLG9CQUFvQixHQUFHLElBQUksc0NBQXNCLENBQXVCLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUN6SCxtQkFBbUIsQ0FBQyxlQUFlLENBQ2pDLHlDQUFjLENBQUMsZUFBZSxFQUM5QixHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQ1YsQ0FBQyxLQUFvQixFQUFFLEVBQUU7WUFDdkIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUM7WUFDMUMsb0JBQW9CLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksb0JBQW9CLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDdkYsQ0FBQyxDQUNGLENBQUM7UUFFRixPQUFPLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFFbkMsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVPLGtCQUFrQixDQUFDLFlBQW1DO1FBQzVELDRCQUFZLENBQUMsZUFBZSxDQUFDLFlBQVksRUFBRSxjQUFjLENBQUMsQ0FBQztRQUMzRCw0QkFBWSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsY0FBYyxFQUFFLDZCQUE2QixDQUFDLENBQUM7UUFFekYsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFlBQVksQ0FBQyxjQUFjLENBQUM7UUFFcEQsNEJBQTRCO1FBQzVCLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO0lBQzNCLENBQUM7SUFFRDs7O09BR0c7SUFDSyx5QkFBeUI7UUFDL0IsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ3hCLE1BQU0sSUFBSSw0QkFBWSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMscUJBQXFCLEVBQUUsWUFBWSxDQUFDLHNCQUFzQixDQUFDLENBQUM7U0FDeEc7SUFDSCxDQUFDOztBQW5JSCxvQ0FvSUM7QUFuSWdCLG1DQUFzQixHQUFHLDhEQUE4RCxDQUFDOzs7Ozs7Ozs7Ozs7OztBQ3pCNUYsaUNBQXlCLEdBQUcsY0FBYyxDQUFDO0FBQzNDLGtDQUEwQixHQUFHLGVBQWUsQ0FBQztBQUM3QyxvQ0FBNEIsR0FBRyxpQkFBaUIsQ0FBQztBQUNqRCxtQ0FBMkIsR0FBRyxnQkFBZ0IsQ0FBQztBQUMvQyxxQ0FBNkIsR0FBRyxrQkFBa0IsQ0FBQztBQUNuRCxpQ0FBeUIsR0FBRyxjQUFjLENBQUM7QUFFM0MsK0JBQXVCLEdBQUcsY0FBYyxDQUFDO0FBQ3pDLCtCQUF1QixHQUFHLGNBQWMsQ0FBQztBQUN6QyxnQ0FBd0IsR0FBRyxlQUFlLENBQUM7QUFDM0MsaUNBQXlCLEdBQUcsZ0JBQWdCLENBQUM7QUFDN0Msa0NBQTBCLEdBQUcsaUJBQWlCLENBQUM7QUFDL0MsbUNBQTJCLEdBQUcsbUJBQW1CLENBQUM7QUFFbEQsaUNBQXlCLEdBQVk7SUFDaEQsK0JBQXVCO0lBQ3ZCLCtCQUF1QjtJQUN2QixnQ0FBd0I7SUFDeEIsaUNBQXlCO0lBQ3pCLGtDQUEwQjtJQUMxQixtQ0FBMkI7Q0FDNUIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7QUN2QkYseUlBQThEO0FBQzlELDJKQUErRDtBQUMvRCxnS0FBd0k7QUFDeEksbUhBT2dDO0FBQ2hDLDJIQUFzRDtBQUV0RCxvSkFBdUU7QUFHdkUsTUFBYSxrQkFBbUIsU0FBUSwyQkFBWTtJQUNsRCxZQUFtQyxPQUFlO1FBQ2hELEtBQUssQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUR0QixZQUFPLEdBQVAsT0FBTyxDQUFRO0lBRWxELENBQUM7Q0FDRjtBQUpELGdEQUlDO0FBRUQsTUFBYSxNQUFNO0lBQ2pCLGdCQUFlLENBQUM7SUFFVCxrQkFBa0IsQ0FBQyxHQUFXLEVBQUUsT0FBZ0IsRUFBRSxPQUFnQztRQUN2RixNQUFNLFNBQVMsR0FBRyxrQ0FBa0IsQ0FBQyxHQUFHLENBQUMsMENBQW9CLENBQUMsQ0FBQyxVQUFVLDZCQUE2QyxDQUFDO1FBQ3ZILE1BQU0sbUJBQW1CLEdBQXdCLGtDQUFrQixDQUFDLEdBQUcsQ0FBQywwQ0FBb0IsQ0FBQyxDQUFDLFVBQVUsMkNBRXZHLENBQUM7UUFFRixPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3JDLFNBQVM7aUJBQ04sa0JBQWtCLENBQUMsR0FBRyxFQUFFLE9BQU8sSUFBSSxFQUFFLEVBQUUsT0FBTyxDQUFDO2lCQUMvQyxJQUFJLENBQUMsR0FBRyxFQUFFO2dCQUNULE1BQU0sWUFBWSxHQUFHLG1CQUFtQixDQUFDLGVBQWUsQ0FDdEQseUNBQWMsQ0FBQyxxQkFBcUIsRUFDcEMsR0FBRyxFQUFFO29CQUNILHNDQUFzQztvQkFDdEMsT0FBTyxJQUFJLENBQUM7Z0JBQ2QsQ0FBQyxFQUNELENBQUMsS0FBd0IsRUFBRSxFQUFFO29CQUMzQixJQUFJLEtBQUssQ0FBQyxZQUFZLEVBQUU7d0JBQ3RCLElBQUksS0FBSyxDQUFDLFlBQVksS0FBSyxTQUFTLEVBQUU7NEJBQ3BDLE1BQU0sSUFBSSw0QkFBWSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUFFLDJCQUEyQixDQUFDLENBQUM7eUJBQ3hGO3dCQUNELE9BQU8sQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7cUJBQzdCO3lCQUFNO3dCQUNMLE1BQU0sQ0FBQyxJQUFJLDRCQUFZLENBQUMscUNBQVUsQ0FBQyxrQkFBa0IsRUFBRSxrQ0FBa0MsQ0FBQyxDQUFDLENBQUM7cUJBQzdGO29CQUVELFlBQVksRUFBRSxDQUFDO2dCQUNqQixDQUFDLENBQ0YsQ0FBQztZQUNKLENBQUMsQ0FBQztpQkFDRCxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDZixNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDaEIsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxzQkFBc0IsQ0FBQyxPQUFlLEVBQUUsZUFBd0I7UUFDckUsTUFBTSxTQUFTLEdBQUcsa0NBQWtCLENBQUMsR0FBRyxDQUFDLDBDQUFvQixDQUFDLENBQUMsVUFBVSw2QkFBNkMsQ0FBQztRQUV2SCxTQUFTLENBQUMsc0JBQXNCLENBQUMsT0FBTyxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFTSxXQUFXLENBQUMsT0FBZ0I7UUFDakMsTUFBTSxTQUFTLEdBQUcsa0NBQWtCLENBQUMsR0FBRyxDQUFDLDBDQUFvQixDQUFDLENBQUMsVUFBVSw2QkFBNkMsQ0FBQztRQUV2SCxTQUFTLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksZ0JBQWdCO1FBQ3JCLE1BQU0sT0FBTyxHQUFHLElBQUksS0FBSyxFQUFzQixDQUFDO1FBQ2hELElBQUksbUJBQXdDLENBQUM7UUFFN0MsSUFBSTtZQUNGLG1CQUFtQixHQUFHLGtDQUFrQixDQUFDLEdBQUcsQ0FBQywwQ0FBb0IsQ0FBQyxDQUFDLFVBQVUsMkNBQWdELENBQUM7U0FDL0g7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNWLHdEQUF3RDtZQUN4RCxPQUFPLE9BQU8sQ0FBQztTQUNoQjtRQUVELE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxzQ0FBc0IsQ0FBOEIsUUFBUSxDQUFDLGdCQUFnQixDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDcEksbUJBQW1CLENBQUMsZUFBZSxDQUNqQyx5Q0FBYyxDQUFDLHNCQUFzQixFQUNyQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQ1YsQ0FBQyxLQUFpQyxFQUFFLEVBQUU7WUFDcEMsa0JBQWtCLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksa0JBQWtCLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDL0UsQ0FBQyxDQUNGLENBQUM7UUFFRixPQUFPLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFFakMsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztDQUNGO0FBaEZELHdCQWdGQzs7Ozs7Ozs7Ozs7Ozs7QUNyR0QsMkpBQXVIO0FBQ3ZILGdLQUF5RjtBQUN6RixtSEFTZ0M7QUFDaEMsd0tBQW9GO0FBQ3BGLGlMQUEwRjtBQUMxRixvSkFBdUU7QUFDdkUsNEhBQW9EO0FBQ3BELDhGQUFnQztBQUNoQywwR0FBd0M7QUFFeEMsTUFBYSxTQUFVLFNBQVEsYUFBSztJQUNsQyxZQUEyQixjQUE2QjtRQUN0RCxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUM7UUFERyxtQkFBYyxHQUFkLGNBQWMsQ0FBZTtRQUV0RCxjQUFjLENBQUMsOEJBQThCLEVBQUUsQ0FBQztRQUNoRCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRUQsSUFBVyxVQUFVO1FBQ25CLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsYUFBNEIsRUFBRSxFQUFFO1lBQzdFLE9BQU8sSUFBSSxxQkFBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3RDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELElBQVcsT0FBTztRQUNoQixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLG1CQUF3QyxFQUFFLEVBQUU7WUFDbEYsT0FBTyxJQUFJLGlDQUFlLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUNsRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxJQUFXLHVCQUF1QjtRQUNoQyxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsdUJBQXVCLENBQUM7SUFDckQsQ0FBQztJQUVELElBQVcsbUJBQW1CO1FBQzVCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsQ0FBQztJQUNqRCxDQUFDO0lBRU0sc0JBQXNCLENBQUMsaUJBQTZDO1FBQ3pFLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxpQ0FBaUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ2xGLENBQUM7SUFFTSxpQ0FBaUMsQ0FBQyw0QkFBbUU7UUFDMUcsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLGlDQUFpQyxDQUFDLDRCQUE0QixDQUFDLENBQUM7SUFDN0YsQ0FBQztJQUVNLHNCQUFzQixDQUFDLGlCQUF5QjtRQUNyRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLHNCQUFzQixDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDM0UsT0FBTyxJQUFJLElBQUksSUFBSSxpQ0FBZSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFTSxnQkFBZ0I7UUFDckIsTUFBTSxPQUFPLEdBQUcsSUFBSSxLQUFLLEVBQXNCLENBQUM7UUFFaEQsMkRBQTJEO1FBQzNELElBQUksbUJBQXdDLENBQUM7UUFFN0MsSUFBSTtZQUNGLG1CQUFtQixHQUFHLGtDQUFrQixDQUFDLEdBQUcsQ0FBQywwQ0FBb0IsQ0FBQyxDQUFDLFVBQVUsMkNBQWdELENBQUM7U0FDL0g7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNWLCtHQUErRztZQUMvRyxPQUFPLE9BQU8sQ0FBQztTQUNoQjtRQUVELE1BQU0sMkJBQTJCLEdBQUcsSUFBSSxzQ0FBc0IsQ0FBOEIsMkNBQWdCLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUNySSxtQkFBbUIsQ0FBQyxlQUFlLENBQ2pDLHlDQUFjLENBQUMsc0JBQXNCLEVBQ3JDLEdBQUcsRUFBRSxDQUFDLElBQUksRUFDVixDQUFDLEtBQTJCLEVBQUUsRUFBRTtZQUM5QixNQUFNLHNCQUFzQixHQUFpQyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FDMUYsS0FBSyxDQUFDLEtBQUssRUFDWCxLQUFLLENBQUMsWUFBWSxFQUNsQixLQUFLLENBQUMsbUJBQW1CLENBQzFCLENBQUM7WUFDRiwyQkFBMkIsQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSx5REFBMkIsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUM7UUFDMUcsQ0FBQyxDQUNGLENBQUM7UUFFRixPQUFPLENBQUMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFFMUMsTUFBTSw4QkFBOEIsR0FBRyxJQUFJLHNDQUFzQixDQUMvRCwyQ0FBZ0IsQ0FBQyx5QkFBeUIsQ0FDM0MsQ0FBQztRQUVGLG1CQUFtQixDQUFDLGVBQWUsQ0FDakMseUNBQWMsQ0FBQyx5QkFBeUIsRUFDeEMsR0FBRyxFQUFFLENBQUMsSUFBSSxFQUNWLENBQUMsZUFBbUMsRUFBRSxFQUFFO1lBQ3RDLDhCQUE4QixDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLCtEQUE4QixDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7UUFDekcsQ0FBQyxDQUNGLENBQUM7UUFFRixPQUFPLENBQUMsSUFBSSxDQUFDLDhCQUE4QixDQUFDLENBQUM7UUFFN0MsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVNLGtDQUFrQyxDQUN2Qyx5Q0FBNkY7UUFFN0YsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLGtDQUFrQyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7SUFDM0csQ0FBQztJQUVNLG9CQUFvQixDQUFDLFdBQXFDO1FBQy9ELE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRU0sZUFBZTtRQUNwQixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDL0MsQ0FBQztJQUVNLGdCQUFnQixDQUNyQixTQUFpQixFQUNqQixNQUFxQixFQUNyQixVQUFxQyxFQUNyQyxPQUErQjtRQUUvQixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDdEYsQ0FBQztDQUNGO0FBNUdELDhCQTRHQzs7Ozs7Ozs7Ozs7Ozs7QUM5SEQsMEdBQXdDO0FBQ3hDLDBHQUF3QztBQUV4Qzs7R0FFRztBQUNILE1BQWEsZUFBZTtJQUMxQixZQUEyQixvQkFBeUM7UUFBekMseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFxQjtJQUFHLENBQUM7SUFFeEUsSUFBVyxTQUFTO1FBQ2xCLE9BQU8sSUFBSSxxQkFBUyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRUQsSUFBVyxJQUFJO1FBQ2IsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDO0lBQ3hDLENBQUM7SUFFRCxJQUFXLFFBQVE7UUFDakIsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDO0lBQzVDLENBQUM7SUFFRCxJQUFXLElBQUk7UUFDYixPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUM7SUFDeEMsQ0FBQztJQUVELElBQVcsU0FBUztRQUNsQixJQUFJLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLEVBQUU7WUFDM0MsT0FBTyxJQUFJLHFCQUFTLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQy9EO1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVELElBQVcsSUFBSTtRQUNiLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQztJQUN4QyxDQUFDO0lBRUQsSUFBVyxVQUFVO1FBQ25CLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLFVBQVUsQ0FBQztJQUM5QyxDQUFDO0lBRUQsSUFBVyxTQUFTO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQztJQUM3QyxDQUFDO0lBRUQsSUFBVyxFQUFFO1FBQ1gsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsRUFBRSxDQUFDO0lBQ3RDLENBQUM7SUFFRCxJQUFXLE9BQU87UUFDaEIsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDO0lBQzNDLENBQUM7Q0FDRjtBQTdDRCwwQ0E2Q0M7Ozs7Ozs7Ozs7Ozs7O0FDckRELHlJQUE4RDtBQUM5RCxnS0FBbUU7QUFDbkUsbUhBU2dDO0FBQ2hDLHNKQUF3RTtBQUN4RSxvSkFBdUU7QUFFdkU7OztHQUdHO0FBQ0gsTUFBYSxTQUFVLFNBQVEsb0NBQW9CO0lBQ2pELFlBQTJCLGFBQTRCLEVBQUUsS0FBOEI7UUFDckYsS0FBSyxFQUFFLENBQUM7UUFEaUIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFHckQsK0NBQStDO1FBQy9DLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBRUQsSUFBVyxJQUFJO1FBQ2IsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQztJQUNqQyxDQUFDO0lBRUQsSUFBVyxZQUFZO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUM7SUFDekMsQ0FBQztJQUVELElBQVcsUUFBUTtRQUNqQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDO0lBQ3JDLENBQUM7SUFFRCxJQUFXLGVBQWU7UUFDeEIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQztJQUM1QyxDQUFDO0lBRUQsSUFBVyxFQUFFO1FBQ1gsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRU0sZ0JBQWdCLENBQUMsUUFBMEM7UUFDaEUsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksZ0JBQWdCLENBQUMsS0FBOEI7UUFDcEQsNEJBQVksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFakQsTUFBTSxPQUFPLEdBQUcsSUFBSSxLQUFLLEVBQXNCLENBQUM7UUFDaEQsSUFBSSxtQkFBd0MsQ0FBQztRQUU3QyxJQUFJO1lBQ0YsbUJBQW1CLEdBQUcsa0NBQWtCLENBQUMsR0FBRyxDQUFDLDBDQUFvQixDQUFDLENBQUMsVUFBVSwyQ0FBZ0QsQ0FBQztTQUMvSDtRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ1Ysd0RBQXdEO1lBQ3hELE9BQU8sT0FBTyxDQUFDO1NBQ2hCO1FBRUQsNEVBQTRFO1FBQzVFLE1BQU0sY0FBYyxHQUFHLElBQUksc0NBQXNCLENBQXdCLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3JILG1CQUFtQixDQUFDLGVBQWUsQ0FDakMseUNBQWMsQ0FBQyxnQkFBZ0IsRUFDL0IsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNSLE1BQU0sU0FBUyxHQUFHLEtBQWUsQ0FBQztZQUNsQyxPQUFPLFNBQVMsS0FBSyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztRQUM3QyxDQUFDLEVBQ0QsQ0FBQyxTQUFpQixFQUFFLEVBQUU7WUFDcEIsY0FBYyxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLDZDQUFxQixDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ2pGLENBQUMsQ0FDRixDQUFDO1FBRUYsT0FBTyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUU3QixPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0NBQ0Y7QUF0RUQsOEJBc0VDOzs7Ozs7Ozs7Ozs7OztBQ3pGRCx5SUFBOEQ7QUFDOUQsbUhBQXVGO0FBQ3ZGLDBHQUF3QztBQUV4QyxNQUFhLEtBQU0sU0FBUSxvQ0FBb0I7SUFDN0MsWUFBMkIsVUFBcUI7UUFDOUMsS0FBSyxFQUFFLENBQUM7UUFEaUIsZUFBVSxHQUFWLFVBQVUsQ0FBVztJQUVoRCxDQUFDO0lBRUQsSUFBVyxJQUFJO1FBQ2IsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQztJQUM5QixDQUFDO0lBRUQsSUFBVyxTQUFTO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUM7SUFDbkMsQ0FBQztJQUVELElBQVcsSUFBSTtRQUNiLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzFDLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUM7U0FDN0I7UUFFRCxNQUFNLElBQUksNEJBQVksQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztJQUNuRyxDQUFDO0lBRU8sV0FBVyxDQUFDLElBQVM7UUFDM0IsTUFBTSxRQUFRLEdBQUcsSUFBcUIsQ0FBQztRQUN2QyxJQUFJLFFBQVEsQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFO1lBQ2pFLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFTSxrQkFBa0IsQ0FBQyxhQUFxQjtRQUM3QyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsYUFBYSxFQUFFLEVBQUU7WUFDOUUsSUFBSSxhQUFhLEVBQUU7Z0JBQ2pCLE9BQU8sSUFBSSxPQUFPLENBQXFCLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxxQkFBUyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDbEc7aUJBQU07Z0JBQ0wsT0FBTyxJQUFJLE9BQU8sQ0FBWSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7YUFDaEU7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxrQkFBa0I7UUFDdkIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLGtCQUFrQixFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsY0FBYyxFQUFFLEVBQUU7WUFDbEUsT0FBTyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsYUFBYSxFQUFFLEVBQUU7Z0JBQzFDLE9BQU8sSUFBSSxxQkFBUyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUM1QyxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBL0NELHNCQStDQzs7Ozs7Ozs7Ozs7Ozs7QUNoREQsTUFBYSxRQUFRO0lBQ25CLFlBQTJCLGFBQW9DO1FBQXBDLGtCQUFhLEdBQWIsYUFBYSxDQUF1QjtJQUFHLENBQUM7SUFFNUQsc0JBQXNCO1FBQzNCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0lBQ3JELENBQUM7Q0FDRjtBQU5ELDRCQU1DOzs7Ozs7Ozs7Ozs7OztBQ1RELHlJQUE4RDtBQUM5RCwySkFPMkM7QUFDM0MsZ0tBQXNJO0FBQ3RJLG1IQVFnQztBQUNoQyw2SUFBa0U7QUFDbEUsNklBQWtFO0FBQ2xFLDRKQUE0RTtBQUM1RSxvTEFBNEY7QUFDNUYsb0pBQXVFO0FBQ3ZFLDBHQUF3QztBQUN4Qyw4RkFBZ0M7QUFFaEMsTUFBYSxTQUFVLFNBQVEsYUFBSztJQUNsQyxZQUE2QixjQUE2QjtRQUN4RCxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUM7UUFESyxtQkFBYyxHQUFkLGNBQWMsQ0FBZTtRQUd4RCw4RkFBOEY7UUFDOUYsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVELElBQVcsZUFBZTtRQUN4QixzRkFBc0Y7UUFDdEYsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLGVBQWUsSUFBSSxJQUFJLEVBQUU7WUFDL0MsTUFBTSxJQUFJLDRCQUFZLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixFQUFFLGtDQUFrQyxDQUFDLENBQUM7U0FDM0c7UUFFRCxPQUFPLElBQUkscUJBQVMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFRCxJQUFXLGVBQWU7UUFDeEIsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLGVBQWUsSUFBSSxJQUFJLEVBQUU7WUFDL0MsTUFBTSxJQUFJLDRCQUFZLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixFQUFFLDZDQUE2QyxDQUFDLENBQUM7U0FDdEg7UUFFRCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDO0lBQzdDLENBQUM7SUFFRCxJQUFXLFVBQVU7UUFDbkIsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsSUFBSSxJQUFJLEVBQUU7WUFDMUMsTUFBTSxJQUFJLDRCQUFZLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixFQUFFLG1EQUFtRCxDQUFDLENBQUM7U0FDNUg7UUFFRCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksZ0JBQWdCO1FBQ3JCLE1BQU0sT0FBTyxHQUFHLElBQUksS0FBSyxFQUFzQixDQUFDO1FBQ2hELElBQUksbUJBQXdDLENBQUM7UUFFN0MsSUFBSTtZQUNGLG1CQUFtQixHQUFHLGtDQUFrQixDQUFDLEdBQUcsQ0FBQywwQ0FBb0IsQ0FBQyxDQUFDLFVBQVUsMkNBQWdELENBQUM7U0FDL0g7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNWLHdEQUF3RDtZQUN4RCxPQUFPLE9BQU8sQ0FBQztTQUNoQjtRQUVELDRFQUE0RTtRQUM1RSxNQUFNLFVBQVUsR0FBRyxJQUFJLHNDQUFzQixDQUFxQiwyQ0FBZ0IsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQ3pHLG1CQUFtQixDQUFDLGVBQWUsQ0FDakMseUNBQWMsQ0FBQyxvQkFBb0IsRUFDbkMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNSLE1BQU0sUUFBUSxHQUFHLEtBQWlCLENBQUM7WUFDbkMsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDeEUsQ0FBQyxFQUNELEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSx1Q0FBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUNsRSxDQUFDO1FBRUYsTUFBTSxXQUFXLEdBQUcsSUFBSSxzQ0FBc0IsQ0FBcUIsMkNBQWdCLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDbkcsbUJBQW1CLENBQUMsZUFBZSxDQUNqQyx5Q0FBYyxDQUFDLGFBQWEsRUFDNUIsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNSLE1BQU0sbUJBQW1CLEdBQUcsS0FBb0IsQ0FBQztZQUNqRCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLFNBQVMsS0FBSyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDO1FBQzNGLENBQUMsRUFDRCxDQUFDLEtBQWtCLEVBQUUsRUFBRTtZQUNyQixXQUFXLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksdUNBQWtCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDL0YsQ0FBQyxDQUNGLENBQUM7UUFFRixNQUFNLGdCQUFnQixHQUFHLElBQUksc0NBQXNCLENBQTBCLDJDQUFnQixDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDbEgsbUJBQW1CLENBQUMsZUFBZSxDQUNqQyx5Q0FBYyxDQUFDLGtCQUFrQixFQUNqQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ1IsTUFBTSx3QkFBd0IsR0FBRyxLQUF5QixDQUFDO1lBQzNELE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsU0FBUyxLQUFLLHdCQUF3QixDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUM7UUFDaEcsQ0FBQyxFQUNELENBQUMsS0FBdUIsRUFBRSxFQUFFO1lBQzFCLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLGlEQUF1QixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDekUsQ0FBQyxDQUNGLENBQUM7UUFFRixNQUFNLCtCQUErQixHQUFHLElBQUksc0NBQXNCLENBQ2hFLDJDQUFnQixDQUFDLDBCQUEwQixDQUM1QyxDQUFDO1FBRUYsbUJBQW1CLENBQUMsZUFBZSxDQUNqQyx5Q0FBYyxDQUFDLDBCQUEwQixFQUN6QyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ1IsTUFBTSwrQkFBK0IsR0FBRyxLQUFpQyxDQUFDO1lBQzFFLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsU0FBUyxLQUFLLCtCQUErQixDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUM7UUFDdkcsQ0FBQyxFQUNELENBQUMsZUFBb0MsRUFBRSxFQUFFO1lBQ3ZDLCtCQUErQixDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLGlFQUErQixDQUFDLElBQUksRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDO1FBQ2pILENBQUMsQ0FDRixDQUFDO1FBRUYsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN6QixPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzFCLE9BQU8sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUMvQixPQUFPLENBQUMsSUFBSSxDQUFDLCtCQUErQixDQUFDLENBQUM7UUFFOUMsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVNLGdCQUFnQixDQUNyQixTQUFpQixFQUNqQixNQUFxQixFQUNyQixVQUE0QixFQUM1QixPQUErQjtRQUUvQixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDdEYsQ0FBQztJQUVNLHFCQUFxQixDQUFDLFNBQWlCLEVBQUUsYUFBMEM7UUFDeEYsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLHFCQUFxQixDQUFDLFNBQVMsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBRU0sNEJBQTRCLENBQ2pDLFNBQWlCLEVBQ2pCLE1BQXFCLEVBQ3JCLFVBQXFDLEVBQ3JDLE9BQStCO1FBRS9CLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyw0QkFBNEIsQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNsRyxDQUFDO0lBRU0sNEJBQTRCLENBQUMsU0FBaUIsRUFBRSxPQUEyQztRQUNoRyxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsNEJBQTRCLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzlFLENBQUM7SUFFTSxnQkFBZ0IsQ0FBQyxTQUFpQjtRQUN2QyxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVNLG1CQUFtQjtRQUN4QixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUNuRCxDQUFDO0lBRU0sZUFBZTtRQUNwQixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDL0MsQ0FBQztJQUVNLHFCQUFxQjtRQUMxQixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMscUJBQXFCLEVBQUUsQ0FBQztJQUNyRCxDQUFDO0lBRU0sd0JBQXdCO1FBQzdCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO0lBQ3hELENBQUM7SUFFTSxtQkFBbUIsQ0FBQyxPQUF1QztRQUNoRSxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVNLHlCQUF5QixDQUFDLFlBQW9CLEVBQUUsT0FBdUM7UUFDNUYsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLHlCQUF5QixDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBRU0sMEJBQTBCO1FBQy9CLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQywwQkFBMEIsRUFBRSxDQUFDO0lBQzFELENBQUM7SUFFTSxzQkFBc0IsQ0FBQyxPQUEwQztRQUN0RSxPQUFPLENBQUMsSUFBSSxDQUNWLDZEQUE2RDtZQUMzRCw4RUFBOEUsQ0FDakYsQ0FBQztRQUNGLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRU0sd0JBQXdCO1FBQzdCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO0lBQ3hELENBQUM7SUFFTSwyQkFBMkIsQ0FBQyxjQUFzQixFQUFFLE9BQTBDO1FBQ25HLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQywyQkFBMkIsQ0FBQyxjQUFjLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDbEYsQ0FBQztJQUVNLGlDQUFpQyxDQUN0QyxjQUFzQixFQUN0QixZQUFvQixFQUNwQixPQUEwQztRQUUxQyxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsaUNBQWlDLENBQUMsY0FBYyxFQUFFLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN0RyxDQUFDO0lBRU0sMkJBQTJCO1FBQ2hDLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQywyQkFBMkIsRUFBRSxDQUFDO0lBQzNELENBQUM7SUFFTSx1QkFBdUIsQ0FDNUIsY0FBc0IsRUFDdEIsWUFBbUMsRUFDbkMsT0FBK0IsRUFDL0IsVUFBa0I7UUFFbEIsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLHVCQUF1QixDQUFDLGNBQWMsRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3hHLENBQUM7SUFFTSx1QkFBdUIsQ0FBQyxjQUFzQixFQUFFLFNBQWlCLEVBQUUsT0FBZSxFQUFFLFVBQVUsR0FBRyxDQUFDO1FBQ3ZHLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyx1QkFBdUIsQ0FBQyxjQUFjLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztJQUNyRyxDQUFDO0lBRU0sMEJBQTBCLENBQy9CLGNBQXNCLEVBQ3RCLFlBQW1DLEVBQ25DLFVBQWtCLEVBQ2xCLFdBQW1CLEVBQ25CLE9BQStCO1FBRS9CLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQywwQkFBMEIsQ0FBQyxjQUFjLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDeEgsQ0FBQztJQUVNLHVCQUF1QjtRQUM1QixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztJQUN2RCxDQUFDO0lBRU0sb0JBQW9CLENBQUMsU0FBbUMsRUFBRSxVQUErQjtRQUM5RixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsb0JBQW9CLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFFTSx1QkFBdUIsQ0FBQyxVQUE2QyxFQUFFLG1CQUF3QztRQUNwSCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsdUJBQXVCLENBQUMsVUFBVSxFQUFFLG1CQUFtQixDQUFDLENBQUM7SUFDdEYsQ0FBQztJQUVNLG9CQUFvQixDQUFDLFVBQW9DLEVBQUUsbUJBQXdDO1FBQ3hHLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztJQUNuRixDQUFDO0lBRU0saUJBQWlCLENBQUMsSUFBdUIsRUFBRSxjQUFzQjtRQUN0RSxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFFTSxtQkFBbUI7UUFDeEIsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDbkQsQ0FBQztJQUVNLHFCQUFxQixDQUFDLFVBQStCO1FBQzFELE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRU0sZUFBZSxDQUFDLFlBQXFCLEVBQUUsT0FBK0IsRUFBRSxpQkFBaUIsR0FBRyxJQUFJO1FBQ3JHLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsWUFBWSxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFFTSxpQkFBaUIsQ0FBQyxjQUE2QixFQUFFLFlBQW9DLEVBQUUsT0FBd0I7UUFDcEgsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLGlCQUFpQixDQUFDLGNBQWMsRUFBRSxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDdEYsQ0FBQztJQUVNLG1CQUFtQixDQUFDLE9BQWU7UUFDeEMsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFTSx3QkFBd0I7UUFDN0IsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLHdCQUF3QixFQUFFLENBQUM7SUFDeEQsQ0FBQztJQUVNLHNCQUFzQixDQUFDLFNBQWlCO1FBQzdDLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRU8saUJBQWlCLENBQUMsQ0FBVyxFQUFFLENBQVc7UUFDaEQsT0FBTyxDQUNMLENBQUM7WUFDRCxDQUFDO1lBQ0QsQ0FBQyxDQUFDLFNBQVMsS0FBSyxDQUFDLENBQUMsU0FBUztZQUMzQixDQUFDLENBQUMsU0FBUyxLQUFLLENBQUMsQ0FBQyxTQUFTO1lBQzNCLENBQUMsQ0FBQyxVQUFVLEtBQUssQ0FBQyxDQUFDLFVBQVU7WUFDN0IsQ0FBQyxDQUFDLFlBQVksS0FBSyxDQUFDLENBQUMsWUFBWSxDQUNsQyxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBclJELDhCQXFSQzs7Ozs7Ozs7Ozs7Ozs7QUM5U0Q7Ozs7R0FJRztBQUNILE1BQWEsZ0JBQWdCO0lBQzNCLFlBQTJCLFVBQXVDO1FBQXZDLGVBQVUsR0FBVixVQUFVLENBQTZCO0lBQUcsQ0FBQztJQUV0RSxJQUFXLFNBQVM7UUFDbEIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pCLENBQUM7Q0FDRjtBQU5ELDRDQU1DOzs7Ozs7Ozs7Ozs7OztBQ1hELG1IQUFvRztBQUNwRyxnSUFBMEQ7QUFDMUQsOEpBQXdFO0FBRXhFOzs7OztHQUtHO0FBQ0gsTUFBYSxXQUFXO0lBb0J0QixZQUFtQixvQkFBMEM7UUFDM0QsSUFBSSxDQUFDLFdBQVcsR0FBRywwQkFBVSxDQUFDLFFBQVEsSUFBSSwwQkFBVSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyx5QkFBeUI7UUFDdkcsSUFBSSxDQUFDLFFBQVEsR0FBRyw4Q0FBWSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzdGLElBQUksQ0FBQyxXQUFXLEdBQUcscURBQXlCLENBQUMsMkJBQTJCLENBQUMsb0JBQW9CLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUNsSCxJQUFJLENBQUMsU0FBUyxHQUFHLG9CQUFvQixDQUFDLGlCQUFpQixDQUFDO1FBQ3hELElBQUksQ0FBQyxRQUFRLEdBQUcsb0JBQW9CLENBQUMsZ0JBQWdCLENBQUM7UUFDdEQsSUFBSSxDQUFDLE9BQU8sR0FBRyxvQkFBb0IsQ0FBQyxlQUFlLENBQUM7UUFDcEQsSUFBSSxDQUFDLEtBQUssR0FBRyw4Q0FBWSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDcEYsSUFBSSxDQUFDLGdCQUFnQixHQUFHLG9CQUFvQixDQUFDLGVBQWUsQ0FBQztRQUM3RCxJQUFJLENBQUMsZUFBZSxHQUFHLG9CQUFvQixDQUFDLGNBQWMsQ0FBQztRQUMzRCxJQUFJLENBQUMsYUFBYSxHQUFHLG9CQUFvQixDQUFDLFlBQVksQ0FBQztRQUV2RCwyREFBMkQ7UUFDM0QsSUFBSSxvQkFBb0IsQ0FBQyxNQUFNLEVBQUU7WUFDL0IsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLGlDQUFlLENBQ3hDLG9CQUFvQixDQUFDLE1BQU0sRUFDM0Isb0JBQW9CLENBQUMsTUFBTSxFQUMzQixvQkFBb0IsQ0FBQyxhQUFhLEVBQ2xDLG9CQUFvQixDQUFDLFVBQVUsQ0FDaEMsQ0FBQztZQUVGLElBQUksQ0FBQyxZQUFZLEdBQUcsb0JBQW9CLENBQUMsWUFBWSxDQUFDO1NBQ3ZEO0lBQ0gsQ0FBQztJQUVELElBQVcsVUFBVTtRQUNuQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQVcsT0FBTztRQUNoQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVELElBQVcsa0JBQWtCO1FBQzNCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBVyxRQUFRO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDO0lBRUQsSUFBVyxPQUFPO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBRUQsSUFBVyxNQUFNO1FBQ2YsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxJQUFXLElBQUk7UUFDYixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQUVELElBQVcsZUFBZTtRQUN4QixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztJQUMvQixDQUFDO0lBRUQsSUFBVyxjQUFjO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQztJQUM5QixDQUFDO0lBRUQsSUFBVyxZQUFZO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM1QixDQUFDO0NBQ0Y7QUFwRkQsa0NBb0ZDOzs7Ozs7Ozs7Ozs7OztBQzdGRDs7R0FFRztBQUNILE1BQWEsVUFBVTtJQUNyQixZQUEyQixhQUE2QjtRQUE3QixrQkFBYSxHQUFiLGFBQWEsQ0FBZ0I7UUFDdEQsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7SUFDckMsQ0FBQztJQUVELElBQVcsZ0JBQWdCO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQztJQUM3QyxDQUFDO0lBRUQsSUFBVyxnQkFBZ0I7UUFDekIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDO0lBQzdDLENBQUM7SUFFRCxJQUFXLFdBQVc7UUFDcEIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQztJQUN4QyxDQUFDO0lBRUQsSUFBVyxRQUFRO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUM7SUFDckMsQ0FBQztJQUVELElBQVcsRUFBRTtRQUNYLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVELElBQVcsUUFBUTtRQUNqQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDO0lBQ3JDLENBQUM7SUFFRCxJQUFXLGlCQUFpQjtRQUMxQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDO0lBQzVDLENBQUM7SUFFTSxlQUFlLENBQUMsb0JBQWtDO1FBQ3ZELE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLG9CQUFvQixDQUFDLENBQUMsSUFBSSxFQUFRLENBQUM7SUFDdEYsQ0FBQztJQUVNLHFCQUFxQjtRQUMxQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFTSxtQkFBbUIsQ0FBQyxTQUFpQjtRQUMxQyxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVNLG9CQUFvQixDQUFDLG1CQUE0QjtRQUN0RCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUN0RSxDQUFDO0NBQ0Y7QUFoREQsZ0NBZ0RDOzs7Ozs7Ozs7Ozs7OztBQ3JERCxtSEFBOEQ7QUFJOUQ7O0dBRUc7QUFDSCxNQUFhLFFBQVMsU0FBUSxvQ0FBb0I7SUFDaEQsWUFBMkIsYUFBMkI7UUFDcEQsS0FBSyxFQUFFLENBQUM7UUFEaUIsa0JBQWEsR0FBYixhQUFhLENBQWM7UUFHcEQsK0NBQStDO1FBQy9DLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNoRixDQUFDO0lBRU0sS0FBSyxDQUFDLEdBQVc7UUFDdEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVNLEdBQUcsQ0FBQyxHQUFXO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVNLE1BQU07UUFDWCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDckMsQ0FBQztJQUVELElBQVcsVUFBVTtRQUNuQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDO0lBQ3ZDLENBQUM7SUFFTSxTQUFTO1FBQ2QsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3hDLENBQUM7SUFFTSxHQUFHLENBQUMsR0FBVyxFQUFFLEtBQWE7UUFDbkMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3JDLENBQUM7Q0FDRjtBQS9CRCw0QkErQkM7Ozs7Ozs7Ozs7Ozs7O0FDdENELG1IQUE4RDtBQUc5RDs7R0FFRztBQUNILE1BQWEsRUFBRyxTQUFRLG9DQUFvQjtJQUMxQyxZQUEyQixLQUFhO1FBQ3RDLEtBQUssRUFBRSxDQUFDO1FBRGlCLFVBQUssR0FBTCxLQUFLLENBQVE7UUFHdEMsK0NBQStDO1FBQy9DLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBRU0sa0JBQWtCLENBQUMsR0FBVyxFQUFFLE9BQWdCLEVBQUUsT0FBZ0M7UUFDdkYsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVNLHNCQUFzQixDQUFDLE9BQWUsRUFBRSxlQUF3QjtRQUNyRSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsc0JBQXNCLENBQUMsT0FBTyxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFFTSxXQUFXLENBQUMsT0FBZ0I7UUFDakMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbEMsQ0FBQztDQUNGO0FBbkJELGdCQW1CQzs7Ozs7Ozs7Ozs7Ozs7QUN6QkQsbUhBQXdGO0FBR3hGLE1BQWEseUJBQXlCO0lBQzdCLE1BQU0sQ0FBQywyQkFBMkIsQ0FBQyx1QkFBNEM7UUFDcEYsSUFBSSxDQUFDLHVCQUF1QixFQUFFO1lBQzVCLE9BQU8sU0FBUyxDQUFDO1NBQ2xCO2FBQU07WUFDTCxNQUFNLGFBQWEsR0FBb0MsdUJBQXVCLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsc0JBQXNCLEVBQUUsRUFBRTtnQkFDN0gsTUFBTSxlQUFlLEdBQTZCO29CQUNoRCxZQUFZLEVBQUUsOENBQVksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLHNCQUFzQixDQUFDLFlBQVksQ0FBQztvQkFDcEYsYUFBYSxFQUFFLGdCQUFnQixDQUFDLHNCQUFzQixDQUFDLFlBQVksRUFBRSxzQkFBc0IsQ0FBQyxhQUFhLENBQUM7aUJBQzNHLENBQUM7Z0JBQ0YsT0FBTyxlQUFlLENBQUM7WUFDekIsQ0FBQyxDQUFDLENBQUM7WUFDSCxNQUFNLE1BQU0sR0FBZ0M7Z0JBQzFDLGdCQUFnQixFQUFFLGFBQWE7YUFDaEMsQ0FBQztZQUNGLE9BQU8sTUFBTSxDQUFDO1NBQ2Y7SUFDSCxDQUFDO0NBQ0Y7QUFsQkQsOERBa0JDO0FBRUQsU0FBUyxnQkFBZ0IsQ0FBQyxZQUEwQixFQUFFLGFBQWtDO0lBQ3RGLElBQUksWUFBWSw2Q0FBNkIsSUFBSSxZQUFZLG1EQUFnQyxFQUFFO1FBQzdGLE9BQU87WUFDTCxXQUFXLEVBQUUsYUFBYSxDQUFDLFdBQVc7WUFDdEMsV0FBVyxFQUFFLGFBQWEsQ0FBQyxXQUFXO1lBQ3RDLFdBQVcsRUFBRSxhQUFhLENBQUMsV0FBVztTQUNoQixDQUFDO0tBQzFCO0lBRUQsT0FBTztRQUNMLFVBQVUsRUFBRSxhQUFhLENBQUMsVUFBVTtRQUNwQyxRQUFRLEVBQUUsYUFBYSxDQUFDLFFBQVE7UUFDaEMsVUFBVSxFQUFFLGFBQWEsQ0FBQyxVQUFVO1FBQ3BDLFNBQVMsRUFBRSxhQUFhLENBQUMsU0FBUztRQUNsQyxjQUFjLEVBQUUsYUFBYSxDQUFDLGNBQWM7UUFDNUMsS0FBSyxFQUFFLGFBQWEsQ0FBQyxLQUFLO0tBQzNCLENBQUM7QUFDSixDQUFDOzs7Ozs7Ozs7Ozs7OztBQ3ZDRDs7OztHQUlHO0FBQ0gsTUFBYSxnQkFBZ0I7SUFDM0IsWUFBMkIsVUFBdUM7UUFBdkMsZUFBVSxHQUFWLFVBQVUsQ0FBNkI7SUFBRyxDQUFDO0lBRXRFLElBQVcsU0FBUztRQUNsQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDekIsQ0FBQztDQUNGO0FBTkQsNENBTUM7Ozs7Ozs7Ozs7Ozs7O0FDYkQsZ0tBQW1IO0FBQ25ILG1IQUF5RDtBQUl6RCxNQUFhLHlCQUEwQixTQUFRLCtCQUFlO0lBQzVELElBQVcsV0FBVztRQUNwQiwyREFBb0Q7SUFDdEQsQ0FBQztJQUVNLGtDQUFrQyxDQUFDLGlCQUEwQixFQUFFLGNBQXdCO1FBQzVGLE1BQU0sTUFBTSxHQUFzQjtZQUNoQyxDQUFDLHNDQUFXLENBQUMsWUFBWSxDQUFDLEVBQUUsb0NBQW9DO1lBQ2hFLENBQUMsc0NBQVcsQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFLGNBQWM7WUFDckQsQ0FBQyxzQ0FBVyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsaUJBQWlCO1NBQ25ELENBQUM7UUFFRixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsaUNBQU0sQ0FBQyxtQkFBbUIsRUFBRSxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQXlCLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDaEcsK0JBQStCO1lBRS9CLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFnQyxDQUFDO1lBQ3pELE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBbkJELDhEQW1CQzs7Ozs7Ozs7Ozs7Ozs7QUN4QkQsMkpBQStEO0FBQy9ELGdLQUFrSDtBQUNsSCxtSEFBdUU7QUFJdkUsTUFBYSxtQkFBb0IsU0FBUSwrQkFBZTtJQUN0RCxJQUFXLFdBQVc7UUFDcEIsK0NBQThDO0lBQ2hELENBQUM7SUFFTSxpQkFBaUIsQ0FBQyxRQUE0QjtRQUNuRCxNQUFNLFVBQVUsR0FBc0I7WUFDcEMsQ0FBQyxzQ0FBVyxDQUFDLFlBQVksQ0FBQyxFQUFFLG1CQUFtQjtZQUMvQyxDQUFDLHNDQUFXLENBQUMsY0FBYyxDQUFDLEVBQUUsUUFBUTtTQUN2QyxDQUFDO1FBRUYsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGlDQUFNLENBQUMscUJBQXFCLEVBQUUsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFxQixDQUFDLEtBQUssRUFBRSxFQUFFO1lBQy9GLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUErQixDQUFDO1lBRXJELElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFO2dCQUNyQyxNQUFNLElBQUksNEJBQVksQ0FBQyxxQ0FBVSxDQUFDLGFBQWEsRUFBRSxvQ0FBb0MsQ0FBQyxDQUFDO2FBQ3hGO1lBRUQsT0FBTyxNQUFNLENBQUMsY0FBYyxDQUFDO1FBQy9CLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBckJELGtEQXFCQzs7Ozs7Ozs7Ozs7Ozs7QUMzQkQsMkpBQTJGO0FBQzNGLGdLQUFrSDtBQUNsSCxtSEFBcUg7QUFJckgsTUFBTSxxQkFBcUIsR0FBRyxHQUFHLENBQUMsQ0FBQyxZQUFZO0FBQy9DLE1BQU0sb0JBQW9CLEdBQUcsR0FBRyxDQUFDLENBQUMsWUFBWTtBQUM5QyxNQUFNLG9CQUFvQixHQUFnQixzQ0FBVyxDQUFDLE1BQU0sQ0FBQztBQUU3RCxNQUFhLGFBQWMsU0FBUSwrQkFBZTtJQUNoRCxJQUFXLFdBQVc7UUFDcEIsbUNBQXdDO0lBQzFDLENBQUM7SUFFTSxrQkFBa0IsQ0FBQyxHQUFXLEVBQUUsT0FBZSxFQUFFLE9BQXVCO1FBQzdFLE1BQU0sVUFBVSxHQUFzQjtZQUNwQyxDQUFDLHNDQUFXLENBQUMsWUFBWSxDQUFDLEVBQUUsb0JBQW9CO1lBQ2hELENBQUMsc0NBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUc7WUFDckMsQ0FBQyxzQ0FBVyxDQUFDLHNCQUFzQixDQUFDLEVBQUUsT0FBTztTQUM5QyxDQUFDO1FBRUYsTUFBTSxDQUFDLEdBQVcsT0FBTyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDO1FBQ3JGLE1BQU0sQ0FBQyxHQUFXLE9BQU8sSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQztRQUNsRixNQUFNLFdBQVcsR0FBZ0IsT0FBTyxJQUFJLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDO1FBRTdHLG1GQUFtRjtRQUNuRiw2RkFBNkY7UUFDN0Ysb0RBQW9EO1FBQ3BELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3BCLE1BQU0sSUFBSSw0QkFBWSxDQUFDLHFDQUFVLENBQUMsZ0JBQWdCLEVBQUUseURBQXlELENBQUMsQ0FBQztTQUNoSDtRQUVELFVBQVUsQ0FBQyxzQ0FBVyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzdDLFVBQVUsQ0FBQyxzQ0FBVyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzdDLDRCQUFZLENBQUMsZUFBZSxDQUFjLFdBQVcsRUFBRSxzQ0FBVyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ25GLFVBQVUsQ0FBQyxzQ0FBVyxDQUFDLG9CQUFvQixDQUFDLEdBQUcsOENBQThCLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUVoSCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsaUNBQU0sQ0FBQyxhQUFhLEVBQUUsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDdEUsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLE1BQStCLENBQUM7WUFDOUQsUUFBUSxZQUFZLEVBQUU7Z0JBQ3BCLEtBQUssZ0RBQXFCLENBQUMsaUJBQWlCO29CQUMxQyxNQUFNLElBQUksNEJBQVksQ0FBQyxxQ0FBVSxDQUFDLGlCQUFpQixFQUFFLHlEQUF5RCxDQUFDLENBQUM7Z0JBQ2xILEtBQUssZ0RBQXFCLENBQUMsYUFBYTtvQkFDdEMsTUFBTSxJQUFJLDRCQUFZLENBQ3BCLHFDQUFVLENBQUMsbUJBQW1CLEVBQzlCLCtFQUErRSxDQUNoRixDQUFDO2dCQUNKO29CQUNFLGVBQWU7b0JBQ2YsT0FBTzthQUNWO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sV0FBVyxDQUFDLE9BQWdCO1FBQ2pDLE1BQU0sVUFBVSxHQUFzQjtZQUNwQyxDQUFDLHNDQUFXLENBQUMsWUFBWSxDQUFDLEVBQUUsYUFBYTtTQUMxQyxDQUFDO1FBRUYsSUFBSSxPQUFPLEVBQUU7WUFDWCxVQUFVLENBQUMsc0NBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLE9BQU8sQ0FBQztTQUMxRDtRQUVELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQ0FBTSxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQzVELE9BQU87UUFDVCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxzQkFBc0IsQ0FBQyxPQUFlLEVBQUUsZUFBd0I7UUFDOUQsTUFBTSxVQUFVLEdBQXNCO1lBQ3BDLENBQUMsc0NBQVcsQ0FBQyxZQUFZLENBQUMsRUFBRSxtQkFBbUI7WUFDL0MsQ0FBQyxzQ0FBVyxDQUFDLHNCQUFzQixDQUFDLEVBQUUsT0FBTztTQUM5QyxDQUFDO1FBRUYsSUFBSSxlQUFlLEVBQUU7WUFDbkIsVUFBVSxDQUFDLHNDQUFXLENBQUMsa0JBQWtCLENBQUMsR0FBRyxlQUFlLENBQUM7U0FDOUQ7UUFFRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsaUNBQU0sQ0FBQyxpQkFBaUIsRUFBRSxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ2xFLE9BQU87UUFDVCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxvQkFBb0IsQ0FBQyxtQkFBNEIsRUFBRSxlQUF1QjtRQUMvRSw0QkFBWSxDQUFDLG1CQUFtQixDQUFDLG1CQUFtQixFQUFFLFNBQVMsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO1FBRXhGLElBQUksZUFBZSxLQUFLLFNBQVMsSUFBSSxlQUFlLElBQUksQ0FBQyxFQUFFO1lBQ3pELE1BQU0sSUFBSSw0QkFBWSxDQUFDLHFDQUFVLENBQUMsYUFBYSxFQUFFLDBCQUEwQixDQUFDLENBQUM7U0FDOUU7UUFFRCxNQUFNLFVBQVUsR0FBc0I7WUFDcEMsQ0FBQyxzQ0FBVyxDQUFDLGVBQWUsQ0FBQyxFQUFFLGVBQWU7WUFDOUMsQ0FBQyxzQ0FBVyxDQUFDLG1CQUFtQixDQUFDLEVBQUUsbUJBQW1CO1NBQ3ZELENBQUM7UUFFRixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsaUNBQU0sQ0FBQyxlQUFlLEVBQUUsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNoRSxPQUFPO1FBQ1QsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUExRkQsc0NBMEZDOzs7Ozs7Ozs7Ozs7OztBQ25HRCxtSEFBNEQ7QUFDNUQsc0tBQTZFO0FBQzdFLG9KQUFpRTtBQUNqRSxrSUFBcUQ7QUFDckQsMElBQTZEO0FBRTdELFNBQWdCLDZCQUE2QixDQUFDLFVBQWlDO0lBQzdFLGtDQUFrQixDQUFDLEdBQUcsQ0FBQywwQ0FBb0IsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxJQUFJLHlDQUFtQixDQUFDLFVBQVUsRUFBRSwwQ0FBb0IsQ0FBQyxDQUFDLENBQUM7SUFDeEgsa0NBQWtCLENBQUMsR0FBRyxDQUFDLDBDQUFvQixDQUFDLENBQUMsZUFBZSxDQUFDLElBQUksNkJBQWEsQ0FBQyxVQUFVLEVBQUUsMENBQW9CLENBQUMsQ0FBQyxDQUFDO0FBQ3BILENBQUM7QUFIRCxzRUFHQztBQUVELFNBQWdCLHdDQUF3QyxDQUFDLFVBQWlDO0lBQ3hGLGtDQUFrQixDQUFDLEdBQUcsQ0FBQywwQ0FBb0IsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxJQUFJLHFEQUF5QixDQUFDLFVBQVUsRUFBRSwwQ0FBb0IsQ0FBQyxDQUFDLENBQUM7QUFDaEksQ0FBQztBQUZELDRGQUVDOzs7Ozs7Ozs7Ozs7OztBQ2RZLDRCQUFvQixHQUFHLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7OztBQ0F0Qyx1RkFBdUY7Ozs7O0FBRXZGLDJLQUErRDtBQUMvRCx1SkFnQjRDO0FBZjFDLHlDQUFXO0FBQ1gsdURBQWtCO0FBQ2xCLHVDQUFVO0FBQ1YseURBQW1CO0FBQ25CLDREQUFnQixDQUE2QjtBQUM3Qyx5Q0FBVztBQUNYLG1EQUFnQjtBQUNoQiw2Q0FBYTtBQUNiLDJDQUFZO0FBQ1oseUVBQTJCO0FBQzNCLHlDQUFXO0FBQ1gsdURBQWtCO0FBQ2xCLHFEQUFpQjtBQUNqQixxREFBaUI7QUFDakIsaUNBQU87QUEyQlQsdUtBQTZEO0FBZ0I3RCxtS0FBMkQ7QUFDM0QscUxBQW9FO0FBTXBFLHFJQUE0Qzs7Ozs7Ozs7Ozs7OztBQ3BFNUMsdUZBQXVGOzs7OztBQU92RixxTEFVMEQ7QUFUeEQseUNBQVU7QUFDVixxREFBZ0I7QUFDaEIsK0NBQWE7QUFDYixxREFBZ0I7QUFDaEIsNkRBQW9CO0FBQ3BCLDJEQUFtQjtBQUNuQixxRkFBZ0M7QUFDaEMsbUVBQXVCO0FBQ3ZCLHVFQUF5QjtBQWtCM0IscUlBQTRDOzs7Ozs7Ozs7Ozs7O0FDbEM1Qzs7OztHQUlHOzs7OztBQUVILDJJQUErQztBQUMvQyw2SUFBZ0Q7Ozs7Ozs7Ozs7Ozs7O0FDTGhEOzs7O0dBSUc7QUFDSCxJQUFZLGlCQU1YO0FBTkQsV0FBWSxpQkFBaUI7SUFDM0Isc0NBQWlCO0lBQ2pCLDZDQUF3QjtJQUN4Qix5Q0FBb0I7SUFDcEIsMkNBQXNCO0lBQ3RCLDZDQUF3QjtBQUMxQixDQUFDLEVBTlcsaUJBQWlCLEdBQWpCLHlCQUFpQixLQUFqQix5QkFBaUIsUUFNNUI7Ozs7Ozs7Ozs7Ozs7QUNiRCwwREFBMEQ7QUFDMUQsOENBQThDO0FBQzlDLDZEQUE2RDtBQUM3RCxvRUFBb0U7O0FBRXBFOztHQUVHO0FBQ0gsSUFBWSxrQkFHWDtBQUhELFdBQVksa0JBQWtCO0lBQzVCLGlDQUFXO0lBQ1gsb0NBQWM7QUFDaEIsQ0FBQyxFQUhXLGtCQUFrQixHQUFsQiwwQkFBa0IsS0FBbEIsMEJBQWtCLFFBRzdCO0FBRUQ7O0dBRUc7QUFDSCxJQUFZLFVBS1g7QUFMRCxXQUFZLFVBQVU7SUFDcEIsaUNBQW1CO0lBQ25CLGlDQUFtQjtJQUNuQiwrQkFBaUI7SUFDakIsNkJBQWU7QUFDakIsQ0FBQyxFQUxXLFVBQVUsR0FBVixrQkFBVSxLQUFWLGtCQUFVLFFBS3JCO0FBRUQ7O0dBRUc7QUFDSCxJQUFZLG1CQTZKWDtBQTdKRCxXQUFZLG1CQUFtQjtJQUM3Qjs7T0FFRztJQUNILGlEQUEwQjtJQUMxQjs7T0FFRztJQUNILGdFQUF5QztJQUN6Qzs7T0FFRztJQUNILG1GQUE0RDtJQUM1RDs7T0FFRztJQUNILDZFQUFzRDtJQUN0RDs7T0FFRztJQUNILDZEQUFzQztJQUN0Qzs7T0FFRztJQUNILHVEQUFnQztJQUNoQzs7T0FFRztJQUNILHlFQUFrRDtJQUNsRDs7T0FFRztJQUNILHNFQUErQztJQUMvQzs7O09BR0c7SUFDSCxrRkFBMkQ7SUFDM0Q7OztPQUdHO0lBQ0gsNkRBQXNDO0lBQ3RDOztPQUVHO0lBQ0gsc0VBQStDO0lBQy9DOztPQUVHO0lBQ0gsbURBQTRCO0lBQzVCOzs7T0FHRztJQUNILDhEQUF1QztJQUN2Qzs7T0FFRztJQUNILG9FQUE2QztJQUM3Qzs7O09BR0c7SUFDSCw0RkFBcUU7SUFDckU7O09BRUc7SUFDSCxpREFBMEI7SUFDMUI7O09BRUc7SUFDSCwwREFBbUM7SUFDbkM7O09BRUc7SUFDSCwwREFBbUM7SUFDbkM7O09BRUc7SUFDSCxpRUFBMEM7SUFDMUM7O09BRUc7SUFDSCw2REFBc0M7SUFDdEM7O09BRUc7SUFDSCx3R0FBaUY7SUFDakY7O09BRUc7SUFDSCw4RUFBdUQ7SUFDdkQ7O09BRUc7SUFDSCwwRkFBbUU7SUFDbkU7O09BRUc7SUFDSCwwREFBbUM7SUFDbkM7O09BRUc7SUFDSCx1RUFBZ0Q7SUFDaEQ7O09BRUc7SUFDSCxtRUFBNEM7SUFDNUM7O09BRUc7SUFDSCxrRUFBMkM7SUFDM0M7O09BRUc7SUFDSCw4REFBdUM7SUFDdkM7O09BRUc7SUFDSCxzRUFBK0M7SUFDL0M7O09BRUc7SUFDSCxxRUFBOEM7SUFDOUM7O09BRUc7SUFDSCxtRUFBNEM7SUFDNUM7O09BRUc7SUFDSCx5REFBa0M7SUFDbEM7O09BRUc7SUFDSCw4RUFBdUQ7SUFDdkQ7O09BRUc7SUFDSCw4RUFBdUQ7SUFFdkQ7O09BRUc7SUFDSCxnRUFBeUM7SUFFekM7OztPQUdHO0lBQ0gsdUZBQWdFO0lBRWhFOztPQUVHO0lBQ0gsc0VBQStDO0FBQ2pELENBQUMsRUE3SlcsbUJBQW1CLEdBQW5CLDJCQUFtQixLQUFuQiwyQkFBbUIsUUE2SjlCO0FBRUQ7O0dBRUc7QUFDSCxJQUFZLFdBR1g7QUFIRCxXQUFZLFdBQVc7SUFDckIsMEJBQVc7SUFDWCwwQkFBVztBQUNiLENBQUMsRUFIVyxXQUFXLEdBQVgsbUJBQVcsS0FBWCxtQkFBVyxRQUd0QjtBQUVELElBQVksZ0JBR1g7QUFIRCxXQUFZLGdCQUFnQjtJQUMxQix5Q0FBcUI7SUFDckIsMkNBQXVCO0FBQ3pCLENBQUMsRUFIVyxnQkFBZ0IsR0FBaEIsd0JBQWdCLEtBQWhCLHdCQUFnQixRQUczQjtBQUVELElBQVksYUFnQlg7QUFoQkQsV0FBWSxhQUFhO0lBQ3ZCLGtDQUFpQjtJQUNqQixnQ0FBZTtJQUNmLDhCQUFhO0lBQ2IsZ0NBQWU7SUFDZixvQ0FBbUI7SUFDbkIsa0NBQWlCO0lBQ2pCLHdDQUF1QjtJQUN2Qix3Q0FBdUI7SUFDdkIsMEJBQVM7SUFDVCwwQkFBUztJQUNULDBCQUFTO0lBQ1QsMEJBQVM7SUFDVCwwQkFBUztJQUNULGtDQUFpQjtJQUNqQiw0Q0FBMkI7QUFDN0IsQ0FBQyxFQWhCVyxhQUFhLEdBQWIscUJBQWEsS0FBYixxQkFBYSxRQWdCeEI7QUFFRCxJQUFZLFlBZVg7QUFmRCxXQUFZLFlBQVk7SUFDdEIsdUNBQXVCO0lBQ3ZCLDhCQUFjO0lBQ2QsOEJBQWM7SUFDZCw4QkFBYztJQUNkLDhCQUFjO0lBQ2QsOEJBQWM7SUFDZCw4QkFBYztJQUNkLGdDQUFnQjtJQUNoQixnQ0FBZ0I7SUFDaEIsZ0NBQWdCO0lBQ2hCLHVEQUF1QztJQUN2Qyx5REFBeUM7SUFDekMsdURBQXVDO0lBQ3ZDLHlEQUF5QztBQUMzQyxDQUFDLEVBZlcsWUFBWSxHQUFaLG9CQUFZLEtBQVosb0JBQVksUUFldkI7QUFFRCxJQUFZLGtCQU1YO0FBTkQsV0FBWSxrQkFBa0I7SUFDNUIsaUNBQVc7SUFDWCxtQ0FBYTtJQUNiLHlDQUFtQjtJQUNuQixxQ0FBZTtJQUNmLHlDQUFtQjtBQUNyQixDQUFDLEVBTlcsa0JBQWtCLEdBQWxCLDBCQUFrQixLQUFsQiwwQkFBa0IsUUFNN0I7QUFFRCxJQUFZLGNBT1g7QUFQRCxXQUFZLGNBQWM7SUFDeEIsbUNBQWlCO0lBQ2pCLHFDQUFtQjtJQUNuQiw2Q0FBMkI7SUFDM0IsNkNBQTJCO0lBQzNCLGlDQUFlO0lBQ2YseUNBQXVCO0FBQ3pCLENBQUMsRUFQVyxjQUFjLEdBQWQsc0JBQWMsS0FBZCxzQkFBYyxRQU96QjtBQUVELElBQVksT0FJWDtBQUpELFdBQVksT0FBTztJQUNqQixzQkFBVztJQUNYLDRCQUFpQjtJQUNqQiw0QkFBaUI7QUFDbkIsQ0FBQyxFQUpXLE9BQU8sR0FBUCxlQUFPLEtBQVAsZUFBTyxRQUlsQjtBQUVELElBQVksaUJBTVg7QUFORCxXQUFZLGlCQUFpQjtJQUMzQiw0Q0FBdUI7SUFDdkIsd0NBQW1CO0lBQ25CLG9DQUFlO0lBQ2Ysd0NBQW1CO0lBQ25CLHNDQUFpQjtBQUNuQixDQUFDLEVBTlcsaUJBQWlCLEdBQWpCLHlCQUFpQixLQUFqQix5QkFBaUIsUUFNNUI7QUFFRCxJQUFZLFdBSVg7QUFKRCxXQUFZLFdBQVc7SUFDckIsa0NBQW1CO0lBQ25CLDRCQUFhO0lBQ2IsMEJBQVc7QUFDYixDQUFDLEVBSlcsV0FBVyxHQUFYLG1CQUFXLEtBQVgsbUJBQVcsUUFJdEI7QUFFRCxJQUFZLGtCQVdYO0FBWEQsV0FBWSxrQkFBa0I7SUFDNUIscUNBQWU7SUFDZiw2Q0FBdUI7SUFDdkIsK0NBQXlCO0lBQ3pCLDJDQUFxQjtJQUNyQixpREFBMkI7SUFDM0IsNkNBQXVCO0lBQ3ZCLHFEQUErQjtJQUMvQixpREFBMkI7SUFDM0IsK0NBQXlCO0lBQ3pCLDJDQUFxQjtBQUN2QixDQUFDLEVBWFcsa0JBQWtCLEdBQWxCLDBCQUFrQixLQUFsQiwwQkFBa0IsUUFXN0I7QUFFRCxJQUFZLDJCQUlYO0FBSkQsV0FBWSwyQkFBMkI7SUFDckMsa0RBQW1CO0lBQ25CLGdEQUFpQjtJQUNqQix3REFBeUI7QUFDM0IsQ0FBQyxFQUpXLDJCQUEyQixHQUEzQixtQ0FBMkIsS0FBM0IsbUNBQTJCLFFBSXRDO0FBRUQ7OztHQUdHO0FBRUg7O0dBRUc7QUFDSCxJQUFZLGdCQXVNWDtBQXZNRCxXQUFZLGdCQUFnQjtJQUMxQjs7OztPQUlHO0lBQ0gseURBQXFDO0lBRXJDOzs7O09BSUc7SUFDSCwyREFBdUM7SUFFdkM7Ozs7T0FJRztJQUNILHVEQUFtQztJQUVuQzs7OztPQUlHO0lBQ0gsaUVBQTZDO0lBRTdDOzs7T0FHRztJQUNILDJEQUF1QztJQUV2Qzs7O09BR0c7SUFDSCw2RUFBeUQ7SUFFekQ7OztPQUdHO0lBQ0gsbURBQStCO0lBRS9COzs7T0FHRztJQUNILDJEQUF1QztJQUV2Qzs7O09BR0c7SUFDSCx5REFBcUM7SUFFckM7OztPQUdHO0lBQ0gsd0VBQW9EO0lBRXBEOzs7T0FHRztJQUNILGlFQUE2QztJQUU3Qzs7O09BR0c7SUFDSCx5REFBcUM7SUFFckM7OztPQUdHO0lBQ0gsK0RBQTJDO0lBRTNDOzs7T0FHRztJQUNILGlFQUE2QztJQUU3Qzs7O09BR0c7SUFDSCwyREFBdUM7SUFFdkM7OztPQUdHO0lBQ0gsK0RBQTJDO0lBRTNDOzs7O09BSUc7SUFDSCwyQ0FBdUI7SUFFdkI7Ozs7T0FJRztJQUNILCtDQUEyQjtJQUMzQjs7Ozs7T0FLRztJQUNILDZEQUF5QztJQUN6Qzs7Ozs7T0FLRztJQUNILGlEQUE2QjtJQUM3Qjs7OztPQUlHO0lBQ0gseURBQXFDO0lBRXJDOzs7O09BSUc7SUFDSCw2REFBeUM7SUFFekM7Ozs7OztPQU1HO0lBQ0gsdUVBQW1EO0lBRW5EOzs7O09BSUc7SUFDSCwyRUFBdUQ7SUFFdkQ7Ozs7T0FJRztJQUNILDZDQUF5QjtJQUV6Qjs7OztPQUlHO0lBQ0gsK0RBQTJDO0lBRTNDOzs7O09BSUc7SUFDSCxxRUFBaUQ7SUFFakQ7Ozs7T0FJRztJQUNILHFFQUFpRDtJQUVqRDs7OztPQUlHO0lBQ0gsMkVBQXVEO0lBRXZEOzs7O09BSUc7SUFDSCx1REFBbUM7QUFDckMsQ0FBQyxFQXZNVyxnQkFBZ0IsR0FBaEIsd0JBQWdCLEtBQWhCLHdCQUFnQixRQXVNM0I7QUFFRDs7R0FFRztBQUNILElBQVksV0FHWDtBQUhELFdBQVksV0FBVztJQUNyQiw0REFBNEQ7SUFDNUQsa0NBQW1CO0FBQ3JCLENBQUMsRUFIVyxXQUFXLEdBQVgsbUJBQVcsS0FBWCxtQkFBVyxRQUd0QjtBQUVELHVEQUF1RDtBQUN2RCxJQUFZLGlCQXlCWDtBQXpCRCxXQUFZLGlCQUFpQjtJQUMzQjs7T0FFRztJQUNILDZDQUF3QjtJQUN4Qjs7T0FFRztJQUNILDJEQUFzQztJQUN0Qzs7T0FFRztJQUNILCtDQUEwQjtJQUMxQjs7T0FFRztJQUNILHdEQUFtQztJQUNuQzs7T0FFRztJQUNILHVEQUFrQztJQUNsQzs7T0FFRztJQUNILG9DQUFlO0FBQ2pCLENBQUMsRUF6QlcsaUJBQWlCLEdBQWpCLHlCQUFpQixLQUFqQix5QkFBaUIsUUF5QjVCOzs7Ozs7Ozs7Ozs7OztBQy9nQkQ7OztHQUdHO0FBQ0gsSUFBWSxlQWFYO0FBYkQsV0FBWSxlQUFlO0lBQ3pCLGtFQUErQztJQUMvQyxvQ0FBaUI7SUFDakIsNERBQXlDO0lBQ3pDLDhFQUEyRDtJQUMzRCxtREFBZ0M7SUFDaEMsa0VBQStDO0lBQy9DLHdFQUFxRDtJQUNyRCx3RUFBcUQ7SUFDckQsOEVBQTJEO0lBQzNELDBEQUF1QztJQUN2QyxtREFBZ0M7SUFDaEMsbURBQWdDO0FBQ2xDLENBQUMsRUFiVyxlQUFlLEdBQWYsdUJBQWUsS0FBZix1QkFBZSxRQWExQjtBQWtHRDs7R0FFRztBQUNILElBQVksa0JBZVg7QUFmRCxXQUFZLGtCQUFrQjtJQUM1Qjs7T0FFRztJQUNILGtEQUE0QjtJQUU1Qjs7T0FFRztJQUNILHdEQUFrQztJQUVsQzs7T0FFRztJQUNILGtEQUE0QjtBQUM5QixDQUFDLEVBZlcsa0JBQWtCLEdBQWxCLDBCQUFrQixLQUFsQiwwQkFBa0IsUUFlN0I7QUFzQkQ7O0dBRUc7QUFDSCxJQUFZLDJCQUtYO0FBTEQsV0FBWSwyQkFBMkI7SUFDckMsNENBQWE7SUFDYiw4Q0FBZTtJQUNmLDhDQUFlO0lBQ2YsNENBQWE7QUFDZixDQUFDLEVBTFcsMkJBQTJCLEdBQTNCLG1DQUEyQixLQUEzQixtQ0FBMkIsUUFLdEM7Ozs7Ozs7Ozs7Ozs7O0FDMUpEOzs7R0FHRztBQUNILElBQVksbUJBUVg7QUFSRCxXQUFZLG1CQUFtQjtJQUM3Qix1REFBZ0M7SUFDaEMsOEVBQXVEO0lBQ3ZELHFGQUE4RDtJQUM5RCxvRUFBNkM7SUFDN0Msb0ZBQTZEO0lBQzdELGtFQUEyQztJQUMzQyxnRUFBeUM7QUFDM0MsQ0FBQyxFQVJXLG1CQUFtQixHQUFuQiwyQkFBbUIsS0FBbkIsMkJBQW1CLFFBUTlCO0FBRUQ7OztHQUdHO0FBQ0gsSUFBWSxhQXNCWDtBQXRCRCxXQUFZLGFBQWE7SUFDdkIsZ0VBQStDO0lBQy9DLHVDQUFzQjtJQUN0QixvQ0FBbUI7SUFDbkIsMkRBQTBDO0lBQzFDLGtDQUFpQjtJQUNqQixvREFBbUM7SUFDbkMsNERBQTJDO0lBQzNDLG9EQUFtQztJQUNuQyw4RUFBNkQ7SUFDN0Qsa0VBQWlEO0lBQ2pELDBEQUF5QztJQUN6QyxnRUFBK0M7SUFDL0MsNENBQTJCO0lBQzNCLGdEQUErQjtJQUMvQiwwREFBeUM7SUFDekMsNERBQTJDO0lBQzNDLHdEQUF1QztJQUN2QyxrRUFBaUQ7SUFDakQsOERBQTZDO0lBQzdDLDhEQUE2QztJQUM3Qyx3RUFBdUQ7QUFDekQsQ0FBQyxFQXRCVyxhQUFhLEdBQWIscUJBQWEsS0FBYixxQkFBYSxRQXNCeEI7QUFFRDs7O0dBR0c7QUFDSCxJQUFZLHNCQUtYO0FBTEQsV0FBWSxzQkFBc0I7SUFDaEMscUVBQTJDO0lBQzNDLHlFQUErQztJQUMvQywyRUFBaUQ7SUFDakQsK0RBQXFDO0FBQ3ZDLENBQUMsRUFMVyxzQkFBc0IsR0FBdEIsOEJBQXNCLEtBQXRCLDhCQUFzQixRQUtqQztBQUVEOztHQUVHO0FBQ0gsSUFBWSxnQkFvQlg7QUFwQkQsV0FBWSxnQkFBZ0I7SUFDMUI7O09BRUc7SUFDSCw0Q0FBd0I7SUFFeEI7O09BRUc7SUFDSCxrREFBOEI7SUFFOUI7O09BRUc7SUFDSCx3REFBb0M7SUFFcEM7O09BRUc7SUFDSCxnREFBNEI7QUFDOUIsQ0FBQyxFQXBCVyxnQkFBZ0IsR0FBaEIsd0JBQWdCLEtBQWhCLHdCQUFnQixRQW9CM0I7QUFFRCxJQUFZLHlCQUlYO0FBSkQsV0FBWSx5QkFBeUI7SUFDbkMsNENBQWU7SUFDZiw0Q0FBZTtJQUNmLDBDQUFhO0FBQ2YsQ0FBQyxFQUpXLHlCQUF5QixHQUF6QixpQ0FBeUIsS0FBekIsaUNBQXlCLFFBSXBDOzs7Ozs7Ozs7Ozs7OztBQ09EOzs7R0FHRztBQUNILElBQVksc0JBU1g7QUFURCxXQUFZLHNCQUFzQjtJQUNoQyxxQ0FBVztJQUNYLHlDQUFlO0lBQ2YsMkNBQWlCO0lBQ2pCLHlDQUFlO0lBQ2YseUNBQWU7SUFDZixvREFBMEI7SUFDMUIsMkRBQWlDO0lBQ2pDLDZEQUFtQztBQUNyQyxDQUFDLEVBVFcsc0JBQXNCLEdBQXRCLDhCQUFzQixLQUF0Qiw4QkFBc0IsUUFTakM7QUFFRDs7O0dBR0c7QUFDSCxJQUFZLHdCQUlYO0FBSkQsV0FBWSx3QkFBd0I7SUFDbEMsMkRBQStCO0lBQy9CLHVEQUEyQjtJQUMzQix1REFBMkI7QUFDN0IsQ0FBQyxFQUpXLHdCQUF3QixHQUF4QixnQ0FBd0IsS0FBeEIsZ0NBQXdCLFFBSW5DO0FBRUQ7OztHQUdHO0FBQ0gsSUFBWSx5QkFVWDtBQVZELFdBQVkseUJBQXlCO0lBQ25DOztPQUVHO0lBQ0gsaUVBQW9DO0lBRXBDOztPQUVHO0lBQ0gseURBQTRCO0FBQzlCLENBQUMsRUFWVyx5QkFBeUIsR0FBekIsaUNBQXlCLEtBQXpCLGlDQUF5QixRQVVwQztBQUVELElBQVksa0NBSVg7QUFKRCxXQUFZLGtDQUFrQztJQUM1QyxxREFBZTtJQUNmLHFEQUFlO0lBQ2YsbURBQWE7QUFDZixDQUFDLEVBSlcsa0NBQWtDLEdBQWxDLDBDQUFrQyxLQUFsQywwQ0FBa0MsUUFJN0M7Ozs7Ozs7Ozs7Ozs7QUNwSkQsMkRBQTJEO0FBQzNELDhDQUE4QztBQUk5QyxJQUFVLE9BQU8sQ0FzS2hCO0FBdEtELFdBQVUsT0FBTztJQUVmOztPQUVHO0lBQ0gsSUFBWSxVQXFEWDtJQXJERCxXQUFZLFVBQVU7UUFDcEI7O1dBRUc7UUFDSCx1REFBeUM7UUFDekM7O1dBRUc7UUFDSCxrREFBb0M7UUFDcEM7O1dBRUc7UUFDSCx1REFBeUM7UUFDekM7O1dBRUc7UUFDSCwwREFBNEM7UUFDNUM7O1dBRUc7UUFDSCw4Q0FBZ0M7UUFDaEM7O1dBRUc7UUFDSCwyREFBNkM7UUFDN0M7O1dBRUc7UUFDSCxvREFBc0M7UUFDdEM7O1dBRUc7UUFDSCw4Q0FBZ0M7UUFDaEM7O1dBRUc7UUFDSCxvREFBc0M7UUFDdEM7O1dBRUc7UUFDSCwwQ0FBNEI7UUFDNUI7O1dBRUc7UUFDSCxnRUFBa0Q7UUFDbEQ7O1dBRUc7UUFDSCw2REFBK0M7UUFDL0M7O1dBRUc7UUFDSCw0RkFBOEU7SUFDaEYsQ0FBQyxFQXJEVyxVQUFVLEdBQVYsa0JBQVUsS0FBVixrQkFBVSxRQXFEckI7SUFFRDs7T0FFRztJQUNILElBQVksZ0JBTVg7SUFORCxXQUFZLGdCQUFnQjtRQUMxQix1Q0FBbUI7UUFDbkIscUNBQWlCO1FBQ2pCLG1DQUFlO1FBQ2YsNENBQXdCO1FBQ3hCLG9EQUFnQztJQUNsQyxDQUFDLEVBTlcsZ0JBQWdCLEdBQWhCLHdCQUFnQixLQUFoQix3QkFBZ0IsUUFNM0I7SUFFRDs7T0FFRztJQUNILElBQVksYUFHWDtJQUhELFdBQVksYUFBYTtRQUN2Qix3Q0FBdUI7UUFDdkIsb0NBQW1CO0lBQ3JCLENBQUMsRUFIVyxhQUFhLEdBQWIscUJBQWEsS0FBYixxQkFBYSxRQUd4QjtJQUVEOztPQUVHO0lBQ0gsSUFBWSxnQkFxQ1g7SUFyQ0QsV0FBWSxnQkFBZ0I7UUFDMUI7O21IQUUyRztRQUMzRyxxRUFBaUQ7UUFFakQsbUlBQW1JO1FBQ25JLG9EQUFnQztRQUVoQztpR0FDeUY7UUFDekYsbUVBQStDO1FBRS9DO2dHQUN3RjtRQUN4RiwrREFBMkM7UUFFM0Msc0dBQXNHO1FBQ3RHLDBEQUFzQztRQUV0Qyw0R0FBNEc7UUFDNUcsd0RBQW9DO1FBRXBDOztXQUVHO1FBQ0gsdUVBQW1EO1FBRW5EOztXQUVHO1FBQ0gsNkVBQXlEO1FBRXpEOztXQUVHO1FBQ0gsK0VBQTJEO0lBQzdELENBQUMsRUFyQ1csZ0JBQWdCLEdBQWhCLHdCQUFnQixLQUFoQix3QkFBZ0IsUUFxQzNCO0lBRUQ7OztPQUdHO0lBQ0gsSUFBWSxvQkFHWDtJQUhELFdBQVksb0JBQW9CO1FBQzlCLDZDQUFxQjtRQUNyQixpREFBeUI7SUFDM0IsQ0FBQyxFQUhXLG9CQUFvQixHQUFwQiw0QkFBb0IsS0FBcEIsNEJBQW9CLFFBRy9CO0lBRUQ7OztPQUdHO0lBQ0gsSUFBWSx5QkFHWDtJQUhELFdBQVkseUJBQXlCO1FBQ25DLG9EQUF1QjtRQUN2QixzREFBeUI7SUFDM0IsQ0FBQyxFQUhXLHlCQUF5QixHQUF6QixpQ0FBeUIsS0FBekIsaUNBQXlCLFFBR3BDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBWSxtQkFHWDtJQUhELFdBQVksbUJBQW1CO1FBQzdCLDJEQUFvQztRQUNwQyw2REFBc0M7SUFDeEMsQ0FBQyxFQUhXLG1CQUFtQixHQUFuQiwyQkFBbUIsS0FBbkIsMkJBQW1CLFFBRzlCO0lBRUQ7OztPQUdHO0lBQ0gsSUFBWSx1QkFHWDtJQUhELFdBQVksdUJBQXVCO1FBQ2pDLDBDQUFlO1FBQ2YsNENBQWlCO0lBQ25CLENBQUMsRUFIVyx1QkFBdUIsR0FBdkIsK0JBQXVCLEtBQXZCLCtCQUF1QixRQUdsQztJQUVEOzs7T0FHRztJQUNILElBQVksZ0NBSVg7SUFKRCxXQUFZLGdDQUFnQztRQUMxQyxtREFBZTtRQUNmLGlEQUFhO1FBQ2IscURBQWlCO0lBQ25CLENBQUMsRUFKVyxnQ0FBZ0MsR0FBaEMsd0NBQWdDLEtBQWhDLHdDQUFnQyxRQUkzQztBQUNILENBQUMsRUF0S1MsT0FBTyxLQUFQLE9BQU8sUUFzS2hCO0FBQ0QsaUJBQVMsT0FBTyxDQUFDOzs7Ozs7Ozs7Ozs7OztBQzVLakIsSUFBWSxnQkEwRVg7QUExRUQsV0FBWSxnQkFBZ0I7SUFDMUI7O09BRUc7SUFDSCxxRUFBaUQ7SUFDakQ7O09BRUc7SUFDSCw2REFBeUM7SUFDekM7OztPQUdHO0lBQ0gsa0ZBQThEO0lBQzlEOztPQUVHO0lBQ0gsa0VBQThDO0lBQzlDOztPQUVHO0lBQ0gseUVBQXFEO0lBQ3JEOztPQUVHO0lBQ0gsbUVBQStDO0lBQy9DOztPQUVHO0lBQ0gsNkVBQXlEO0lBQ3pEOztPQUVHO0lBQ0gscUVBQWlEO0lBQ2pEOztPQUVHO0lBQ0gscUVBQWlEO0lBQ2pEOztPQUVHO0lBQ0gsb0RBQWdDO0lBQ2hDOztPQUVHO0lBQ0gsMERBQXNDO0lBQ3RDOztPQUVHO0lBQ0gsMkRBQXVDO0lBQ3ZDOztPQUVHO0lBQ0gseUVBQXFEO0lBQ3JEOztPQUVHO0lBQ0gsdURBQW1DO0lBQ25DOztPQUVHO0lBQ0gsZ0VBQTRDO0lBQzVDOztPQUVHO0lBQ0gsNkRBQXlDO0lBQ3pDOztPQUVHO0lBQ0gsZ0RBQTRCO0lBQzVCOztPQUVHO0lBQ0gsdUNBQW1CO0FBQ3JCLENBQUMsRUExRVcsZ0JBQWdCLEdBQWhCLHdCQUFnQixLQUFoQix3QkFBZ0IsUUEwRTNCOzs7Ozs7Ozs7Ozs7O0FDMUVEOzs7R0FHRztBQUNILElBQVUsT0FBTyxDQWlaaEI7QUFqWkQsV0FBVSxPQUFPO0lBQ2YsSUFBWSxtQkFJWDtJQUpELFdBQVksbUJBQW1CO1FBQzdCLDBDQUFtQjtRQUNuQiw0Q0FBcUI7UUFDckIsK0NBQXdCO0lBQzFCLENBQUMsRUFKVyxtQkFBbUIsR0FBbkIsMkJBQW1CLEtBQW5CLDJCQUFtQixRQUk5QjtJQUVELElBQVksY0FJWDtJQUpELFdBQVksY0FBYztRQUN4QiwrQkFBYTtRQUNiLGlDQUFlO1FBQ2YsK0JBQWE7SUFDZixDQUFDLEVBSlcsY0FBYyxHQUFkLHNCQUFjLEtBQWQsc0JBQWMsUUFJekI7SUFFRCxJQUFZLFVBSVg7SUFKRCxXQUFZLFVBQVU7UUFDcEIsbUNBQXFCO1FBQ3JCLHVDQUF5QjtRQUN6QixpQ0FBbUI7SUFDckIsQ0FBQyxFQUpXLFVBQVUsR0FBVixrQkFBVSxLQUFWLGtCQUFVLFFBSXJCO0lBRUQsSUFBWSxZQVNYO0lBVEQsV0FBWSxZQUFZO1FBQ3RCLDBEQUEwQztRQUMxQywrQ0FBK0I7UUFDL0IsMkNBQTJCO1FBQzNCLGtEQUFrQztRQUNsQywwREFBMEM7UUFDMUMscUNBQXFCO1FBQ3JCLG9EQUFvQztRQUNwQywwREFBMEM7SUFDNUMsQ0FBQyxFQVRXLFlBQVksR0FBWixvQkFBWSxLQUFaLG9CQUFZLFFBU3ZCO0lBRUQ7O09BRUc7SUFDSCxJQUFZLG1CQVlYO0lBWkQsV0FBWSxtQkFBbUI7UUFDN0Isc0NBQWU7UUFDZiw4Q0FBdUI7UUFDdkIsbURBQTRCO1FBQzVCLDZEQUFzQztRQUN0QyxpREFBMEI7UUFDMUIsd0NBQWlCO1FBQ2pCLHNDQUFlO1FBQ2Ysb0NBQWE7UUFDYixzQ0FBZTtRQUNmLDJDQUFvQjtRQUNwQiw4Q0FBdUI7SUFDekIsQ0FBQyxFQVpXLG1CQUFtQixHQUFuQiwyQkFBbUIsS0FBbkIsMkJBQW1CLFFBWTlCO0lBRUQ7OztPQUdHO0lBQ0gsSUFBWSw2QkFNWDtJQU5ELFdBQVksNkJBQTZCO1FBQ3ZDLCtEQUErRDtRQUMvRCw4Q0FBYTtRQUViLGdFQUFnRTtRQUNoRSw4Q0FBYTtJQUNmLENBQUMsRUFOVyw2QkFBNkIsR0FBN0IscUNBQTZCLEtBQTdCLHFDQUE2QixRQU14QztJQUVEOztPQUVHO0lBQ0gsSUFBWSxRQVNYO0lBVEQsV0FBWSxRQUFRO1FBQ2xCLDZCQUFpQjtRQUNqQix1QkFBVztRQUNYLDJCQUFlO1FBQ2YseUJBQWE7UUFDYix5QkFBYTtRQUNiLGtDQUFzQjtRQUN0QiwrQkFBbUI7UUFDbkIsK0JBQW1CO0lBQ3JCLENBQUMsRUFUVyxRQUFRLEdBQVIsZ0JBQVEsS0FBUixnQkFBUSxRQVNuQjtJQUVEOztPQUVHO0lBQ0gsSUFBWSxxQkE4Qlg7SUE5QkQsV0FBWSxxQkFBcUI7UUFDL0IsbUNBQW1DO1FBQ25DLHdDQUFlO1FBRWYscUNBQXFDO1FBQ3JDLDRDQUFtQjtRQUVuQixrREFBa0Q7UUFDbEQsa0VBQXlDO1FBRXpDLDhDQUE4QztRQUM5QyxnRUFBdUM7UUFFdkMsNENBQTRDO1FBQzVDLDZEQUFvQztRQUVwQyx3Q0FBd0M7UUFDeEMscURBQTRCO1FBRTVCLHFDQUFxQztRQUNyQyxxREFBNEI7UUFFNUIscUNBQXFDO1FBQ3JDLDhDQUFxQjtRQUVyQix1Q0FBdUM7UUFDdkMsa0RBQXlCO1FBRXpCLG9DQUFvQztRQUNwQywrREFBc0M7SUFDeEMsQ0FBQyxFQTlCVyxxQkFBcUIsR0FBckIsNkJBQXFCLEtBQXJCLDZCQUFxQixRQThCaEM7SUFFRDs7T0FFRztJQUNILElBQVksYUFPWDtJQVBELFdBQVksYUFBYTtRQUN2Qiw4QkFBYTtRQUNiLGlDQUFnQjtRQUNoQiw4QkFBYTtRQUNiLGlDQUFnQjtRQUNoQixvQ0FBbUI7UUFDbkIsbUNBQWtCO0lBQ3BCLENBQUMsRUFQVyxhQUFhLEdBQWIscUJBQWEsS0FBYixxQkFBYSxRQU94QjtJQUVEOztPQUVHO0lBQ0gsSUFBWSxXQUlYO0lBSkQsV0FBWSxXQUFXO1FBQ3JCLGdDQUFpQjtRQUNqQiw4QkFBZTtRQUNmLG9DQUFxQjtJQUN2QixDQUFDLEVBSlcsV0FBVyxHQUFYLG1CQUFXLEtBQVgsbUJBQVcsUUFJdEI7SUFFRCxJQUFZLFlBaUJYO0lBakJELFdBQVksWUFBWTtRQUN0QixpQ0FBaUI7UUFDakIsMkJBQVc7UUFDWCw2QkFBYTtRQUNiLGlDQUFpQjtRQUNqQix3Q0FBd0I7UUFDeEIsZ0RBQWdDO1FBQ2hDLCtCQUFlO1FBQ2YsNkJBQWE7UUFDYiwrQkFBZTtRQUNmLGlDQUFpQjtRQUNqQixtQ0FBbUI7UUFDbkIsK0JBQWU7UUFDZiw2QkFBYTtRQUNiLCtCQUFlO1FBQ2YscUNBQXFCO1FBQ3JCLGlDQUFpQjtJQUNuQixDQUFDLEVBakJXLFlBQVksR0FBWixvQkFBWSxLQUFaLG9CQUFZLFFBaUJ2QjtJQUVEOztPQUVHO0lBQ0gsSUFBWSxvQkF5Q1g7SUF6Q0QsV0FBWSxvQkFBb0I7UUFDOUIsbUNBQVc7UUFDWCxtQ0FBVztRQUNYLG1DQUFXO1FBQ1gsbUNBQVc7UUFDWCx1Q0FBZTtRQUNmLHlDQUFpQjtRQUNqQixtQ0FBVztRQUNYLHFDQUFhO1FBQ2IsMkNBQW1CO1FBQ25CLHVDQUFlO1FBQ2YseUNBQWlCO1FBQ2pCLHlDQUFpQjtRQUNqQixxQ0FBYTtRQUNiLHFDQUFhO1FBQ2IscUNBQWE7UUFDYixtQ0FBVztRQUNYLHVDQUFlO1FBQ2YsbUNBQVc7UUFDWCxxQ0FBYTtRQUNiLHlDQUFpQjtRQUNqQix5Q0FBaUI7UUFDakIscUNBQWE7UUFDYiwyQ0FBbUI7UUFDbkIsZ0RBQXdCO1FBQ3hCLG1DQUFXO1FBQ1gsbUNBQVc7UUFDWCxnREFBd0I7UUFDeEIsOENBQXNCO1FBQ3RCLGtEQUEwQjtRQUMxQixnREFBd0I7UUFDeEIsOENBQXNCO1FBQ3RCLGdEQUF3QjtRQUN4QixvREFBNEI7UUFDNUIsb0RBQTRCO1FBQzVCLHlDQUFpQjtRQUNqQix5Q0FBaUI7UUFDakIsNkNBQXFCO1FBQ3JCLDZDQUFxQjtRQUNyQix3Q0FBZ0I7UUFDaEIscUNBQWE7SUFDZixDQUFDLEVBekNXLG9CQUFvQixHQUFwQiw0QkFBb0IsS0FBcEIsNEJBQW9CLFFBeUMvQjtJQUVEOztPQUVHO0lBQ0gsSUFBWSxhQUlYO0lBSkQsV0FBWSxhQUFhO1FBQ3ZCLHdDQUF1QjtRQUN2QixvQ0FBbUI7UUFDbkIsb0NBQW1CO0lBQ3JCLENBQUMsRUFKVyxhQUFhLEdBQWIscUJBQWEsS0FBYixxQkFBYSxRQUl4QjtJQUVEOztPQUVHO0lBQ0gsSUFBWSxVQUtYO0lBTEQsV0FBWSxVQUFVO1FBQ3BCLHlDQUEyQjtRQUMzQiw2QkFBZTtRQUNmLDJDQUE2QjtRQUM3Qiw0Q0FBOEI7SUFDaEMsQ0FBQyxFQUxXLFVBQVUsR0FBVixrQkFBVSxLQUFWLGtCQUFVLFFBS3JCO0lBRUQ7O09BRUc7SUFDSCxJQUFZLGdCQUtYO0lBTEQsV0FBWSxnQkFBZ0I7UUFDMUIsK0JBQVc7UUFDWCwrQkFBVztRQUNYLHVDQUFtQjtRQUNuQixxQ0FBaUI7SUFDbkIsQ0FBQyxFQUxXLGdCQUFnQixHQUFoQix3QkFBZ0IsS0FBaEIsd0JBQWdCLFFBSzNCO0lBRUQ7O09BRUc7SUFDSCxJQUFZLGdCQVVYO0lBVkQsV0FBWSxnQkFBZ0I7UUFDMUI7OztXQUdHO1FBQ0gseUNBQXFCO1FBQ3JCOztXQUVHO1FBQ0gseUNBQXFCO0lBQ3ZCLENBQUMsRUFWVyxnQkFBZ0IsR0FBaEIsd0JBQWdCLEtBQWhCLHdCQUFnQixRQVUzQjtJQUVEOzs7T0FHRztJQUNILElBQVksZ0JBSVg7SUFKRCxXQUFZLGdCQUFnQjtRQUMxQiw4Q0FBMEI7UUFDMUIscURBQWlDO1FBQ2pDLDRDQUF3QjtJQUMxQixDQUFDLEVBSlcsZ0JBQWdCLEdBQWhCLHdCQUFnQixLQUFoQix3QkFBZ0IsUUFJM0I7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsSUFBWSx1QkFTWDtJQVRELFdBQVksdUJBQXVCO1FBQ2pDLDZDQUE2QztRQUM3QyxtREFBd0I7UUFFeEIsb0VBQW9FO1FBQ3BFLGtFQUF1QztRQUV2Qyw4REFBOEQ7UUFDOUQsd0VBQTZDO0lBQy9DLENBQUMsRUFUVyx1QkFBdUIsR0FBdkIsK0JBQXVCLEtBQXZCLCtCQUF1QixRQVNsQztJQUVEOztPQUVHO0lBQ0gsSUFBWSxRQWNYO0lBZEQsV0FBWSxRQUFRO1FBQ2xCLHVCQUFXO1FBQ1gseUJBQWE7UUFDYix5QkFBYTtRQUNiLDZCQUFpQjtRQUNqQiw2QkFBaUI7UUFDakIsMkJBQWU7UUFDZix5QkFBYTtRQUNiLHVCQUFXO1FBQ1gsdUJBQVc7UUFDWCxrQ0FBc0I7UUFDdEIsK0JBQW1CO1FBQ25CLCtCQUFtQjtRQUNuQiwwQ0FBOEI7SUFDaEMsQ0FBQyxFQWRXLFFBQVEsR0FBUixnQkFBUSxLQUFSLGdCQUFRLFFBY25CO0lBRUQ7OztPQUdHO0lBQ0gsSUFBWSxrQkFJWDtJQUpELFdBQVksa0JBQWtCO1FBQzVCLGlDQUFXO1FBQ1gsbUNBQWE7UUFDYixxQ0FBZTtJQUNqQixDQUFDLEVBSlcsa0JBQWtCLEdBQWxCLDBCQUFrQixLQUFsQiwwQkFBa0IsUUFJN0I7SUFFRDs7T0FFRztJQUNILElBQVksVUFTWDtJQVRELFdBQVksVUFBVTtRQUNwQiw2QkFBZTtRQUNmLG1DQUFxQjtRQUNyQiwrQkFBaUI7UUFDakIsNkJBQWU7UUFDZiwyQkFBYTtRQUNiLDZCQUFlO1FBQ2YsaUNBQW1CO1FBQ25CLGlDQUFtQjtJQUNyQixDQUFDLEVBVFcsVUFBVSxHQUFWLGtCQUFVLEtBQVYsa0JBQVUsUUFTckI7SUFFRCxJQUFZLGtCQWFYO0lBYkQsV0FBWSxrQkFBa0I7UUFDNUIsb0RBQThCO1FBQzlCLCtDQUF5QjtRQUN6Qiw4REFBd0M7UUFDeEMseURBQW1DO1FBQ25DLG1DQUFhO1FBQ2IsK0NBQXlCO1FBQ3pCLHNEQUFnQztRQUNoQyw0Q0FBc0I7UUFDdEIsaUVBQTJDO1FBQzNDLGtFQUE0QztRQUM1Qyw4Q0FBd0I7UUFDeEIsNkNBQXVCO0lBQ3pCLENBQUMsRUFiVyxrQkFBa0IsR0FBbEIsMEJBQWtCLEtBQWxCLDBCQUFrQixRQWE3QjtJQUVEOztPQUVHO0lBQ0gsSUFBWSxtQkFJWDtJQUpELFdBQVksbUJBQW1CO1FBQzdCLGlEQUEwQjtRQUMxQix5Q0FBa0I7UUFDbEIsK0NBQXdCO0lBQzFCLENBQUMsRUFKVyxtQkFBbUIsR0FBbkIsMkJBQW1CLEtBQW5CLDJCQUFtQixRQUk5QjtJQUVEOztPQUVHO0lBQ0gsSUFBWSxhQVNYO0lBVEQsV0FBWSxhQUFhO1FBQ3ZCOztXQUVHO1FBQ0gsaURBQWdDO1FBQ2hDOztXQUVHO1FBQ0gsaURBQWdDO0lBQ2xDLENBQUMsRUFUVyxhQUFhLEdBQWIscUJBQWEsS0FBYixxQkFBYSxRQVN4QjtJQUVEOztPQUVHO0lBQ0gsSUFBWSxTQUlYO0lBSkQsV0FBWSxTQUFTO1FBQ25CLG9DQUF1QjtRQUN2Qiw0QkFBZTtRQUNmLG9DQUF1QjtJQUN6QixDQUFDLEVBSlcsU0FBUyxHQUFULGlCQUFTLEtBQVQsaUJBQVMsUUFJcEI7SUFFRCxJQUFZLGFBR1g7SUFIRCxXQUFZLGFBQWE7UUFDdkIsMENBQXlCO1FBQ3pCLDBDQUF5QjtJQUMzQixDQUFDLEVBSFcsYUFBYSxHQUFiLHFCQUFhLEtBQWIscUJBQWEsUUFHeEI7SUFFRCxJQUFZLGtCQUtYO0lBTEQsV0FBWSxrQkFBa0I7UUFDNUIsdUNBQWlCO1FBQ2pCLGlEQUEyQjtRQUMzQixpREFBMkI7UUFDM0IsK0NBQXlCO0lBQzNCLENBQUMsRUFMVyxrQkFBa0IsR0FBbEIsMEJBQWtCLEtBQWxCLDBCQUFrQixRQUs3QjtJQUVEOzs7T0FHRztJQUNILElBQVksZUFTWDtJQVRELFdBQVksZUFBZTtRQUN6QixnRUFBZ0U7UUFDaEUsZ0NBQWE7UUFFYixnRUFBZ0U7UUFDaEUsb0NBQWlCO1FBRWpCLGdFQUFnRTtRQUNoRSxnQ0FBYTtJQUNmLENBQUMsRUFUVyxlQUFlLEdBQWYsdUJBQWUsS0FBZix1QkFBZSxRQVMxQjtJQUVEOzs7T0FHRztJQUNILElBQVksK0JBS1g7SUFMRCxXQUFZLCtCQUErQjtRQUN6QywrREFBNEI7UUFDNUIsaUVBQThCO1FBQzlCLGlFQUE4QjtRQUM5Qix1RUFBb0M7SUFDdEMsQ0FBQyxFQUxXLCtCQUErQixHQUEvQix1Q0FBK0IsS0FBL0IsdUNBQStCLFFBSzFDO0lBT1ksMEJBQWtCLHFCQUFRLDZCQUE2QixDQUFFLENBQUM7QUFDekUsQ0FBQyxFQWpaUyxPQUFPLEtBQVAsT0FBTyxRQWlaaEI7QUFDRCxpQkFBUyxPQUFPLENBQUM7Ozs7Ozs7Ozs7Ozs7QUN0WmpCLG1GQUFtRjs7Ozs7QUFLbkYsNklBQWdEO0FBR2hELDZLQStCc0Q7QUE5QnBELDJEQUFtQjtBQUNuQixpREFBYztBQUNkLDZDQUFZO0FBQ1oseUNBQVU7QUFDViwrREFBcUI7QUFDckIsMkRBQW1CO0FBQ25CLCtFQUE2QjtBQUM3QixxQ0FBUTtBQUNSLCtDQUFhO0FBQ2IsMkNBQVc7QUFDWCw2Q0FBWTtBQUNaLDZEQUFvQjtBQUNwQiwrQ0FBYTtBQUNiLHFEQUFnQjtBQUNoQixxREFBZ0I7QUFDaEIseUNBQVU7QUFDVixxREFBZ0I7QUFDaEIsbUZBQStCO0FBQy9CLG1FQUF1QjtBQUN2QixxQ0FBUTtBQUNSLHlEQUFrQjtBQUNsQix5Q0FBVTtBQUNWLHlEQUFrQjtBQUNsQixtREFBZTtBQUNmLCtDQUFhO0FBQ2IsMkRBQW1CO0FBQ25CLHVDQUFTO0FBQ1QsK0NBQWE7QUFDYix5REFBa0I7QUFDbEIseURBQWtCOzs7Ozs7Ozs7Ozs7O0FDdENwQjs7OztHQUlHOzs7OztBQUVILHlFQUF5RTtBQUN6RSw0RUFBNEU7QUFDNUUsOERBQThEO0FBQzlELCtKQUE2RTtBQUNoRSxpQ0FBeUIsR0FBRyx1QkFBdUIsQ0FBQztBQUVqRSx1SUFBNkM7QUFDN0MsK0dBQWlDO0FBRWpDLCtIQUF5QztBQUN6Qyx5SEFBc0M7QUFDdEMsK0dBQWlDO0FBQ2pDLHVJQUE2QztBQUc3QyxtSUFBMkM7QUFFM0MsK0hBQXlDO0FBQ3pDLDZJQUFnRDtBQUdoRCxtSkFBbUQ7QUFJbkQsMkxBQXVFO0FBQ3ZFLHlMQUFzRTtBQUV0RSx1SkFBcUQ7QUFFckQsK0RBQStEO0FBQy9ELHlGQUF5RjtBQUM1RSx5QkFBaUIsR0FBRztJQUMvQixLQUFLLEVBQUUsQ0FBQztJQUNSLEtBQUssRUFBRSxDQUFDO0lBQ1IsR0FBRyxFQUFFLENBQUM7Q0FDUCxDQUFDOzs7Ozs7Ozs7Ozs7OztBQzFDRiw0R0FBbUM7QUFFbkMsTUFBYSxpQkFBaUI7SUFDcEIsTUFBTSxDQUFDLFNBQVMsQ0FBQyxhQUFxQjtRQUM1QyxnRUFBZ0U7UUFDaEUsa0RBQWtEO1FBQ2xELG9GQUFvRjtRQUNwRixnRUFBZ0U7UUFDaEUsK0JBQStCO1FBRS9CLElBQUksYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksYUFBYSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxhQUFhLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUU7WUFDM0csT0FBTyxJQUFJLENBQUM7U0FDYjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUlELGtDQUFrQztJQUMxQixNQUFNLENBQUMsWUFBWSxDQUFDLGFBQXFCO1FBQy9DLDhDQUE4QztRQUM5QyxNQUFNLGlCQUFpQixHQUFXLGFBQWEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUM5RCxPQUFPLGlCQUFpQixLQUFLLE1BQU0sSUFBSSxpQkFBaUIsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLEtBQUssTUFBTSxDQUFDO0lBQ25JLENBQUM7SUFFRCxrQ0FBa0M7SUFDMUIsTUFBTSxDQUFDLFdBQVcsQ0FBQyxhQUFxQjtRQUM5QyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDcEMsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQzNELENBQUM7SUFFTyxNQUFNLENBQUMsU0FBUyxDQUFDLFlBQW9CO1FBQzNDLDBEQUEwRDtRQUMxRCxtRUFBbUU7UUFDbkUsa0VBQWtFO1FBQ2xFLE1BQU0sS0FBSyxHQUFHLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3JDLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDdEQsQ0FBQztJQUVPLE1BQU0sQ0FBQyxhQUFhLENBQUMsWUFBb0I7UUFDL0MsOENBQThDO1FBQzlDLGlEQUFpRDtRQUNqRCxzRkFBc0Y7UUFDdEYsaUdBQWlHO1FBQ2pHLDBGQUEwRjtRQUMxRixNQUFNLG1CQUFtQixHQUFXLFlBQVksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMvRSxNQUFNLEtBQUssR0FBRyxJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQzVDLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDdEQsQ0FBQztJQUVELGdIQUFnSDtJQUN6RyxNQUFNLENBQUMsMkJBQTJCLENBQUMsYUFBcUIsRUFBRSxJQUFjO1FBQzdFLHFFQUFxRTtRQUNyRSxnRkFBZ0Y7UUFDaEYsaUdBQWlHO1FBQ2pHLCtGQUErRjtRQUMvRixzREFBc0Q7UUFDdEQsNkNBQTZDO1FBQzdDLG1DQUFtQztRQUVuQyx5RUFBeUU7UUFDekUsSUFBSSxhQUFhLEtBQUssU0FBUyxJQUFJLGFBQWEsS0FBSyxJQUFJLEVBQUU7WUFDekQsT0FBTyxTQUFTLENBQUM7U0FDbEI7UUFFRCxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLEVBQUU7WUFDakMsT0FBTyxhQUFhLENBQUM7U0FDdEI7UUFFRCxRQUFRLElBQUksRUFBRTtZQUNaLEtBQUssZ0JBQVEsQ0FBQyxJQUFJO2dCQUNoQixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUM7WUFFMUMsS0FBSyxnQkFBUSxDQUFDLEdBQUcsQ0FBQztZQUNsQixLQUFLLGdCQUFRLENBQUMsS0FBSztnQkFDakIsNERBQTREO2dCQUM1RCxxRkFBcUY7Z0JBQ3JGLHNCQUFzQjtnQkFDdEIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBRXpDLEtBQUssZ0JBQVEsQ0FBQyxJQUFJO2dCQUNoQixzRkFBc0Y7Z0JBQ3RGLG9DQUFvQztnQkFDcEMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUM7WUFFN0YsS0FBSyxnQkFBUSxDQUFDLFFBQVE7Z0JBQ3BCLHNGQUFzRjtnQkFDdEYsbUNBQW1DO2dCQUNuQyxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQztZQUVqRyxLQUFLLGdCQUFRLENBQUMsT0FBTyxDQUFDO1lBQ3RCLEtBQUssZ0JBQVEsQ0FBQyxNQUFNLENBQUM7WUFDckI7Z0JBQ0UsT0FBTyxhQUFhLENBQUM7U0FDeEI7SUFDSCxDQUFDO0lBRUQsa0NBQWtDO0lBQzNCLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxLQUFVLEVBQUUsSUFBYztRQUNoRSwwRkFBMEY7UUFDMUYsNERBQTREO1FBQzVELDREQUE0RDtRQUM1RCxtRkFBbUY7UUFFbkYsaUdBQWlHO1FBQ2pHLElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFO1lBQ3pDLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCxRQUFRLElBQUksRUFBRTtZQUNaLEtBQUssZ0JBQVEsQ0FBQyxJQUFJO2dCQUNoQixPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7WUFFbEQsS0FBSyxnQkFBUSxDQUFDLEdBQUcsQ0FBQztZQUNsQixLQUFLLGdCQUFRLENBQUMsS0FBSztnQkFDakIsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1lBRWxELEtBQUssZ0JBQVEsQ0FBQyxJQUFJO2dCQUNoQixxRkFBcUY7Z0JBQ3JGLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUUvQixLQUFLLGdCQUFRLENBQUMsUUFBUTtnQkFDcEIscUZBQXFGO2dCQUNyRixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFbkMsS0FBSyxnQkFBUSxDQUFDLE1BQU07Z0JBQ2xCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7WUFFOUMsS0FBSyxnQkFBUSxDQUFDLE9BQU8sQ0FBQztZQUN0QjtnQkFDRSxPQUFPLEtBQUssQ0FBQztTQUNoQjtJQUNILENBQUM7SUFFRCxrQ0FBa0M7SUFDM0IsTUFBTSxDQUFDLCtCQUErQixDQUFDLEtBQWEsRUFBRSxJQUFjO1FBQ3pFLGlGQUFpRjtRQUNqRixPQUFPLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsMkJBQTJCLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzdGLENBQUM7O0FBeElILDhDQXlJQztBQTNIZ0IsdUNBQXFCLEdBQUcsUUFBUSxDQUFDOzs7Ozs7Ozs7Ozs7OztBQ2hCbEQsSUFBWSxnQkFPWDtBQVBELFdBQVksZ0JBQWdCO0lBQzFCLHVDQUFtQjtJQUNuQixxQ0FBaUI7SUFDakIsdUNBQW1CO0lBQ25CLG1DQUFlO0lBQ2YsNENBQXdCO0lBQ3hCLG9EQUFnQztBQUNsQyxDQUFDLEVBUFcsZ0JBQWdCLEdBQWhCLHdCQUFnQixLQUFoQix3QkFBZ0IsUUFPM0I7QUFFRCxJQUFZLGFBSVg7QUFKRCxXQUFZLGFBQWE7SUFDdkIsd0NBQXVCO0lBQ3ZCLG9DQUFtQjtJQUNuQixvQ0FBbUI7QUFDckIsQ0FBQyxFQUpXLGFBQWEsR0FBYixxQkFBYSxLQUFiLHFCQUFhLFFBSXhCO0FBRUQsSUFBWSxZQUlYO0FBSkQsV0FBWSxZQUFZO0lBQ3RCLDZCQUFhO0lBQ2IsK0JBQWU7SUFDZiw2QkFBYTtBQUNmLENBQUMsRUFKVyxZQUFZLEdBQVosb0JBQVksS0FBWixvQkFBWSxRQUl2QjtBQUVELElBQVksVUFJWDtBQUpELFdBQVksVUFBVTtJQUNwQixtQ0FBcUI7SUFDckIsdUNBQXlCO0lBQ3pCLGlDQUFtQjtBQUNyQixDQUFDLEVBSlcsVUFBVSxHQUFWLGtCQUFVLEtBQVYsa0JBQVUsUUFJckI7QUFFRCxJQUFZLG1CQVlYO0FBWkQsV0FBWSxtQkFBbUI7SUFDN0Isc0NBQWU7SUFDZiw4Q0FBdUI7SUFDdkIsbURBQTRCO0lBQzVCLDZEQUFzQztJQUN0QyxpREFBMEI7SUFDMUIsd0NBQWlCO0lBQ2pCLHNDQUFlO0lBQ2Ysb0NBQWE7SUFDYixzQ0FBZTtJQUNmLDJDQUFvQjtJQUNwQiw4Q0FBdUI7QUFDekIsQ0FBQyxFQVpXLG1CQUFtQixHQUFuQiwyQkFBbUIsS0FBbkIsMkJBQW1CLFFBWTlCO0FBRUQsSUFBWSxRQVNYO0FBVEQsV0FBWSxRQUFRO0lBQ2xCLDZCQUFpQjtJQUNqQix1QkFBVztJQUNYLDJCQUFlO0lBQ2YseUJBQWE7SUFDYix5QkFBYTtJQUNiLGtDQUFzQjtJQUN0QiwrQkFBbUI7SUFDbkIsK0JBQW1CO0FBQ3JCLENBQUMsRUFUVyxRQUFRLEdBQVIsZ0JBQVEsS0FBUixnQkFBUSxRQVNuQjtBQUVELElBQVksV0FJWDtBQUpELFdBQVksV0FBVztJQUNyQixnQ0FBaUI7SUFDakIsOEJBQWU7SUFDZixvQ0FBcUI7QUFDdkIsQ0FBQyxFQUpXLFdBQVcsR0FBWCxtQkFBVyxLQUFYLG1CQUFXLFFBSXRCO0FBRUQsSUFBWSxlQUtYO0FBTEQsV0FBWSxlQUFlO0lBQ3pCLG9DQUFpQjtJQUNqQixvQ0FBaUI7SUFDakIsZ0NBQWE7SUFDYixzQ0FBbUI7QUFDckIsQ0FBQyxFQUxXLGVBQWUsR0FBZix1QkFBZSxLQUFmLHVCQUFlLFFBSzFCO0FBRUQsSUFBWSxVQVVYO0FBVkQsV0FBWSxVQUFVO0lBQ3BCLDJEQUE2QztJQUM3QywrQ0FBaUM7SUFDakMsMkRBQTZDO0lBQzdDLHFEQUF1QztJQUN2QyxxREFBdUM7SUFDdkMsbUVBQXFEO0lBQ3JELCtEQUFpRDtJQUNqRCxtREFBcUM7SUFDckMsaURBQW1DO0FBQ3JDLENBQUMsRUFWVyxVQUFVLEdBQVYsa0JBQVUsS0FBVixrQkFBVSxRQVVyQjtBQUVELElBQVksb0JBeUNYO0FBekNELFdBQVksb0JBQW9CO0lBQzlCLG1DQUFXO0lBQ1gsbUNBQVc7SUFDWCxtQ0FBVztJQUNYLG1DQUFXO0lBQ1gsdUNBQWU7SUFDZix5Q0FBaUI7SUFDakIsbUNBQVc7SUFDWCxxQ0FBYTtJQUNiLDJDQUFtQjtJQUNuQix1Q0FBZTtJQUNmLHlDQUFpQjtJQUNqQix5Q0FBaUI7SUFDakIscUNBQWE7SUFDYixxQ0FBYTtJQUNiLHFDQUFhO0lBQ2IsbUNBQVc7SUFDWCx1Q0FBZTtJQUNmLG1DQUFXO0lBQ1gscUNBQWE7SUFDYix5Q0FBaUI7SUFDakIseUNBQWlCO0lBQ2pCLHFDQUFhO0lBQ2IsMkNBQW1CO0lBQ25CLGdEQUF3QjtJQUN4QixtQ0FBVztJQUNYLG1DQUFXO0lBQ1gsZ0RBQXdCO0lBQ3hCLDhDQUFzQjtJQUN0QixrREFBMEI7SUFDMUIsZ0RBQXdCO0lBQ3hCLDhDQUFzQjtJQUN0QixnREFBd0I7SUFDeEIsb0RBQTRCO0lBQzVCLG9EQUE0QjtJQUM1Qix5Q0FBaUI7SUFDakIseUNBQWlCO0lBQ2pCLDZDQUFxQjtJQUNyQiw2Q0FBcUI7SUFDckIsd0NBQWdCO0lBQ2hCLHFDQUFhO0FBQ2YsQ0FBQyxFQXpDVyxvQkFBb0IsR0FBcEIsNEJBQW9CLEtBQXBCLDRCQUFvQixRQXlDL0I7QUFFRCxJQUFZLGFBSVg7QUFKRCxXQUFZLGFBQWE7SUFDdkIsd0NBQXVCO0lBQ3ZCLG9DQUFtQjtJQUNuQixvQ0FBbUI7QUFDckIsQ0FBQyxFQUpXLGFBQWEsR0FBYixxQkFBYSxLQUFiLHFCQUFhLFFBSXhCO0FBRUQ7O0dBRUc7QUFDSCxJQUFZLGdCQUtYO0FBTEQsV0FBWSxnQkFBZ0I7SUFDMUIsK0JBQVc7SUFDWCwrQkFBVztJQUNYLHVDQUFtQjtJQUNuQixxQ0FBaUI7QUFDbkIsQ0FBQyxFQUxXLGdCQUFnQixHQUFoQix3QkFBZ0IsS0FBaEIsd0JBQWdCLFFBSzNCO0FBRUQsSUFBWSxTQUlYO0FBSkQsV0FBWSxTQUFTO0lBQ25CLG9DQUF1QjtJQUN2Qiw0QkFBZTtJQUNmLG9DQUF1QjtBQUN6QixDQUFDLEVBSlcsU0FBUyxHQUFULGlCQUFTLEtBQVQsaUJBQVMsUUFJcEI7QUFFRCxJQUFZLHFCQUlYO0FBSkQsV0FBWSxxQkFBcUI7SUFDL0Isb0NBQVc7SUFDWCxzQ0FBYTtJQUNiLHdDQUFlO0FBQ2pCLENBQUMsRUFKVyxxQkFBcUIsR0FBckIsNkJBQXFCLEtBQXJCLDZCQUFxQixRQUloQztBQUVELElBQVksY0FTWDtBQVRELFdBQVksY0FBYztJQUN4QixpQ0FBZTtJQUNmLHVDQUFxQjtJQUNyQixtQ0FBaUI7SUFDakIsaUNBQWU7SUFDZiwrQkFBYTtJQUNiLGlDQUFlO0lBQ2YscUNBQW1CO0lBQ25CLHFDQUFtQjtBQUNyQixDQUFDLEVBVFcsY0FBYyxHQUFkLHNCQUFjLEtBQWQsc0JBQWMsUUFTekI7QUFFRDs7R0FFRztBQUNILElBQVksZ0JBSVg7QUFKRCxXQUFZLGdCQUFnQjtJQUMxQiw2Q0FBeUI7SUFDekIsbURBQStCO0lBQy9CLDJDQUF1QjtBQUN6QixDQUFDLEVBSlcsZ0JBQWdCLEdBQWhCLHdCQUFnQixLQUFoQix3QkFBZ0IsUUFJM0I7QUFFRDs7R0FFRztBQUNILElBQVksZ0JBR1g7QUFIRCxXQUFZLGdCQUFnQjtJQUMxQix5Q0FBcUI7SUFDckIseUNBQXFCO0FBQ3ZCLENBQUMsRUFIVyxnQkFBZ0IsR0FBaEIsd0JBQWdCLEtBQWhCLHdCQUFnQixRQUczQjtBQUVEOztHQUVHO0FBQ0gsSUFBWSxtQkFJWDtBQUpELFdBQVksbUJBQW1CO0lBQzdCLGlEQUEwQjtJQUMxQix5Q0FBa0I7SUFDbEIsK0NBQXdCO0FBQzFCLENBQUMsRUFKVyxtQkFBbUIsR0FBbkIsMkJBQW1CLEtBQW5CLDJCQUFtQixRQUk5QjtBQUVEOztHQUVHO0FBQ0gsSUFBWSxhQU1YO0FBTkQsV0FBWSxhQUFhO0lBQ3ZCLGlEQUFnQztJQUNoQyxpREFBZ0M7SUFDaEMsNkNBQTRCO0lBQzVCLCtDQUE4QjtJQUM5QixpREFBZ0M7QUFDbEMsQ0FBQyxFQU5XLGFBQWEsR0FBYixxQkFBYSxLQUFiLHFCQUFhLFFBTXhCO0FBRUQ7O0dBRUc7QUFDSCxJQUFZLDBCQUlYO0FBSkQsV0FBWSwwQkFBMEI7SUFDcEMsMERBQTRCO0lBQzVCLGlFQUFtQztJQUNuQyx3REFBMEI7QUFDNUIsQ0FBQyxFQUpXLDBCQUEwQixHQUExQixrQ0FBMEIsS0FBMUIsa0NBQTBCLFFBSXJDO0FBRUQ7O0dBRUc7QUFDSCxJQUFZLCtCQUtYO0FBTEQsV0FBWSwrQkFBK0I7SUFDekMsK0RBQTRCO0lBQzVCLGlFQUE4QjtJQUM5QixpRUFBOEI7SUFDOUIsdUVBQW9DO0FBQ3RDLENBQUMsRUFMVywrQkFBK0IsR0FBL0IsdUNBQStCLEtBQS9CLHVDQUErQixRQUsxQztBQUVEOztHQUVHO0FBQ0gsSUFBWSxRQWNYO0FBZEQsV0FBWSxRQUFRO0lBQ2xCLHVCQUFXO0lBQ1gseUJBQWE7SUFDYix5QkFBYTtJQUNiLDZCQUFpQjtJQUNqQiw2QkFBaUI7SUFDakIsMkJBQWU7SUFDZix5QkFBYTtJQUNiLHVCQUFXO0lBQ1gsdUJBQVc7SUFDWCxrQ0FBc0I7SUFDdEIsK0JBQW1CO0lBQ25CLCtCQUFtQjtJQUNuQiwwQ0FBOEI7QUFDaEMsQ0FBQyxFQWRXLFFBQVEsR0FBUixnQkFBUSxLQUFSLGdCQUFRLFFBY25CO0FBRUQ7O0dBRUc7QUFDSCxJQUFZLFVBS1g7QUFMRCxXQUFZLFVBQVU7SUFDcEIseUNBQTJCO0lBQzNCLDZCQUFlO0lBQ2YsMkNBQTZCO0lBQzdCLDJDQUE2QjtBQUMvQixDQUFDLEVBTFcsVUFBVSxHQUFWLGtCQUFVLEtBQVYsa0JBQVUsUUFLckI7QUFFRDs7R0FFRztBQUNILElBQVksYUF5Qlg7QUF6QkQsV0FBWSxhQUFhO0lBQ3ZCOztPQUVHO0lBQ0gsOEJBQWE7SUFDYjs7T0FFRztJQUNILGdDQUFlO0lBQ2Y7O09BRUc7SUFDSCw4QkFBYTtJQUNiOztPQUVHO0lBQ0gsZ0NBQWU7SUFDZjs7T0FFRztJQUNILG9DQUFtQjtJQUNuQjs7T0FFRztJQUNILGtDQUFpQjtBQUNuQixDQUFDLEVBekJXLGFBQWEsR0FBYixxQkFBYSxLQUFiLHFCQUFhLFFBeUJ4QjtBQUVEOztHQUVHO0FBQ0gsSUFBWSxxQkFJWDtBQUpELFdBQVkscUJBQXFCO0lBQy9CLGtFQUF5QztJQUN6Qyx5REFBZ0M7SUFDaEMsNENBQW1CO0FBQ3JCLENBQUMsRUFKVyxxQkFBcUIsR0FBckIsNkJBQXFCLEtBQXJCLDZCQUFxQixRQUloQztBQUVEOzs7R0FHRztBQUNILElBQVksc0JBSVg7QUFKRCxXQUFZLHNCQUFzQjtJQUNoQyxpRUFBdUM7SUFDdkMsdUVBQTZDO0lBQzdDLGtGQUF3RDtBQUMxRCxDQUFDLEVBSlcsc0JBQXNCLEdBQXRCLDhCQUFzQixLQUF0Qiw4QkFBc0IsUUFJakM7QUFnQkQ7O0dBRUc7QUFDSCxJQUFZLGNBZ0JYO0FBaEJELFdBQVksY0FBYztJQUN4QixtQ0FBaUI7SUFDakIsaUNBQWU7SUFDZiwrQkFBYTtJQUNiLGlDQUFlO0lBQ2YscUNBQW1CO0lBQ25CLG1DQUFpQjtJQUNqQix5Q0FBdUI7SUFDdkIseUNBQXVCO0lBQ3ZCLDJCQUFTO0lBQ1QsMkJBQVM7SUFDVCwyQkFBUztJQUNULDJCQUFTO0lBQ1QsMkJBQVM7SUFDVCxtQ0FBaUI7SUFDakIsNkNBQTJCO0FBQzdCLENBQUMsRUFoQlcsY0FBYyxHQUFkLHNCQUFjLEtBQWQsc0JBQWMsUUFnQnpCO0FBRUQ7O0dBRUc7QUFDSCxJQUFZLGVBSVg7QUFKRCxXQUFZLGVBQWU7SUFDekIsc0NBQW1CO0lBQ25CLHdDQUFxQjtJQUNyQiwwQ0FBdUI7QUFDekIsQ0FBQyxFQUpXLGVBQWUsR0FBZix1QkFBZSxLQUFmLHVCQUFlLFFBSTFCO0FBRUQ7O0dBRUc7QUFDSCxJQUFZLFNBSVg7QUFKRCxXQUFZLFNBQVM7SUFDbkIsK0JBQWtCO0lBQ2xCLHdDQUEyQjtJQUMzQix3Q0FBMkI7QUFDN0IsQ0FBQyxFQUpXLFNBQVMsR0FBVCxpQkFBUyxLQUFULGlCQUFTLFFBSXBCO0FBRUQ7O0dBRUc7QUFDSCxJQUFZLGlCQVdYO0FBWEQsV0FBWSxpQkFBaUI7SUFDM0IsMENBQXFCO0lBQ3JCLDJDQUFzQjtJQUN0QiwyQ0FBc0I7SUFDdEIsMkNBQXNCO0lBQ3RCLHlDQUFvQjtJQUNwQix5Q0FBb0I7SUFDcEIseUNBQW9CO0lBQ3BCLHlDQUFvQjtJQUNwQix5Q0FBb0I7SUFDcEIseUNBQW9CO0FBQ3RCLENBQUMsRUFYVyxpQkFBaUIsR0FBakIseUJBQWlCLEtBQWpCLHlCQUFpQixRQVc1QjtBQUVEOztHQUVHO0FBQ0gsSUFBWSxRQUtYO0FBTEQsV0FBWSxRQUFRO0lBQ2xCLGlDQUFxQjtJQUNyQixpQ0FBcUI7SUFDckIsaUNBQXFCO0lBQ3JCLGlDQUFxQjtBQUN2QixDQUFDLEVBTFcsUUFBUSxHQUFSLGdCQUFRLEtBQVIsZ0JBQVEsUUFLbkI7QUFFRDs7R0FFRztBQUNILElBQVksWUFXWDtBQVhELFdBQVksWUFBWTtJQUN0QiwrQkFBZTtJQUNmLDZCQUFhO0lBQ2IsK0JBQWU7SUFDZixpQ0FBaUI7SUFDakIsbUNBQW1CO0lBQ25CLCtCQUFlO0lBQ2YsNkJBQWE7SUFDYiwrQkFBZTtJQUNmLHFDQUFxQjtJQUNyQixpQ0FBaUI7QUFDbkIsQ0FBQyxFQVhXLFlBQVksR0FBWixvQkFBWSxLQUFaLG9CQUFZLFFBV3ZCO0FBRUQsSUFBWSxrQkFXWDtBQVhELFdBQVksa0JBQWtCO0lBQzVCLHFDQUFlO0lBQ2YsNkNBQXVCO0lBQ3ZCLCtDQUF5QjtJQUN6QiwyQ0FBcUI7SUFDckIsaURBQTJCO0lBQzNCLDZDQUF1QjtJQUN2QixxREFBK0I7SUFDL0IsaURBQTJCO0lBQzNCLCtDQUF5QjtJQUN6QiwyQ0FBcUI7QUFDdkIsQ0FBQyxFQVhXLGtCQUFrQixHQUFsQiwwQkFBa0IsS0FBbEIsMEJBQWtCLFFBVzdCO0FBRUQsSUFBWSwyQkFJWDtBQUpELFdBQVksMkJBQTJCO0lBQ3JDLGtEQUFtQjtJQUNuQixnREFBaUI7SUFDakIsd0RBQXlCO0FBQzNCLENBQUMsRUFKVywyQkFBMkIsR0FBM0IsbUNBQTJCLEtBQTNCLG1DQUEyQixRQUl0Qzs7Ozs7Ozs7Ozs7Ozs7QUNyWkQsSUFBWSxjQXVDWDtBQXZDRCxXQUFZLGNBQWM7SUFDeEIsbUZBQWlFO0lBQ2pFLHlEQUF1QztJQUN2QywyREFBeUM7SUFDekMsdURBQXFDO0lBQ3JDLGtFQUFnRDtJQUNoRCwyREFBeUM7SUFDekMscUVBQW1EO0lBQ25ELDJEQUF5QztJQUN6QywrRUFBNkQ7SUFDN0QsbUVBQWlEO0lBQ2pELHFFQUFtRDtJQUNuRCxrREFBZ0M7SUFDaEMsNERBQTBDO0lBQzFDLDZFQUEyRDtJQUMzRCx3REFBc0M7SUFDdEMsNENBQTBCO0lBQzFCLCtEQUE2QztJQUM3QyxzRUFBb0Q7SUFDcEQscUVBQW1EO0lBQ25ELHdEQUFzQztJQUN0Qyw0RUFBMEQ7SUFDMUQsdURBQXFDO0lBQ3JDLGlFQUErQztJQUMvQyxzREFBb0M7SUFDcEMsNkRBQTJDO0lBQzNDLDZFQUEyRDtJQUMzRCwrREFBNkM7SUFDN0Msb0RBQWtDO0lBQ2xDLDZEQUEyQztJQUMzQyxrRUFBZ0Q7SUFDaEQsMkVBQXlEO0lBQ3pELDBEQUF3QztJQUN4QywrREFBNkM7SUFDN0MsNkVBQTJEO0lBQzNELDBDQUF3QjtJQUN4Qiw4Q0FBNEI7SUFDNUIsNkRBQTJDO0lBQzNDLHlFQUF1RDtBQUN6RCxDQUFDLEVBdkNXLGNBQWMsR0FBZCxzQkFBYyxLQUFkLHNCQUFjLFFBdUN6Qjs7Ozs7Ozs7Ozs7Ozs7QUN2Q0Qsb0dBQW9HO0FBQ3BHLGlDQUFpQztBQUNqQyxJQUFZLFdBa0xYO0FBbExELFdBQVksV0FBVztJQUNyQixzREFBdUM7SUFDdkMseUNBQTBCO0lBQzFCLDZDQUE4QjtJQUM5QixpREFBa0M7SUFDbEMsc0VBQXVEO0lBRXZELHVEQUF3QztJQUN4Qyw0REFBNkM7SUFDN0Msa0NBQW1CO0lBQ25CLHNEQUF1QztJQUN2QyxnRUFBaUQ7SUFDakQsa0ZBQW1FO0lBQ25FLHNEQUF1QztJQUN2Qyx5Q0FBMEI7SUFDMUIsNkRBQThDO0lBQzlDLDJEQUE0QztJQUM1QyxrREFBbUM7SUFDbkMsa0RBQW1DO0lBQ25DLDJDQUE0QjtJQUU1QixzQ0FBdUI7SUFDdkIscURBQXNDO0lBQ3RDLDBDQUEyQjtJQUMzQixpR0FBa0Y7SUFDbEYsMEdBQTJGO0lBQzNGLDhDQUErQjtJQUMvQix5Q0FBMEI7SUFDMUIseUNBQTBCO0lBQzFCLDZEQUE4QztJQUM5Qyw4Q0FBK0I7SUFDL0Isa0RBQW1DO0lBQ25DLHVDQUF3QjtJQUN4QixvREFBcUM7SUFDckMsZ0RBQWlDO0lBQ2pDLDJDQUE0QjtJQUM1Qiw0Q0FBNkI7SUFDN0Isc0VBQXVEO0lBQ3ZELHlDQUEwQjtJQUUxQixrRUFBbUQ7SUFDbkQsa0VBQW1EO0lBQ25ELDZDQUE4QjtJQUM5QixtRUFBb0Q7SUFDcEQseUNBQTBCO0lBQzFCLG9EQUFxQztJQUNyQyxzREFBdUM7SUFDdkMsa0VBQW1EO0lBQ25ELHFFQUFzRDtJQUN0RCwyREFBNEM7SUFDNUMsa0VBQW1EO0lBQ25ELGtFQUFtRDtJQUNuRCxnRUFBaUQ7SUFDakQsOERBQStDO0lBQy9DLDBEQUEyQztJQUMzQywwREFBMkM7SUFDM0MscURBQXNDO0lBQ3RDLGdFQUFpRDtJQUNqRCxvREFBcUM7SUFDckMsb0VBQXFEO0lBQ3JELDBEQUEyQztJQUMzQyw4RUFBK0Q7SUFDL0QsMkRBQTRDO0lBRTVDLDhCQUFlO0lBQ2YseUNBQTBCO0lBQzFCLG1DQUFvQjtJQUNwQix1Q0FBd0I7SUFDeEIsNkNBQThCO0lBQzlCLGtEQUFtQztJQUNuQyxrREFBbUM7SUFDbkMsaUVBQWtEO0lBQ2xELHNEQUF1QztJQUN2Qyw2Q0FBOEI7SUFDOUIseURBQTBDO0lBQzFDLCtDQUFnQztJQUNoQyw2Q0FBOEI7SUFDOUIsdUNBQXdCO0lBRXhCLDBFQUEyRDtJQUMzRCxtREFBb0M7SUFDcEMsZ0VBQWlEO0lBRWpELCtDQUFnQztJQUNoQyxtREFBb0M7SUFDcEMsd0RBQXlDO0lBQ3pDLDZEQUE4QztJQUM5Qyw2Q0FBOEI7SUFDOUIsNERBQTZDO0lBQzdDLCtDQUFnQztJQUNoQywrQ0FBZ0M7SUFDaEMsaUZBQWtFO0lBQ2xFLDJDQUE0QjtJQUM1Qix3REFBeUM7SUFDekMsdURBQXdDO0lBRXhDLG1EQUFvQztJQUVwQyxrREFBbUM7SUFDbkMsK0RBQWdEO0lBRWhELGtEQUFtQztJQUNuQyx1Q0FBd0I7SUFDeEIsbUNBQW9CO0lBQ3BCLHFDQUFzQjtJQUN0Qix1Q0FBd0I7SUFDeEIscUNBQXNCO0lBRXRCLDhDQUErQjtJQUMvQixxREFBc0M7SUFDdEMsaURBQWtDO0lBQ2xDLDBEQUEyQztJQUMzQywrQ0FBZ0M7SUFDaEMsaURBQWtDO0lBQ2xDLGlEQUFrQztJQUNsQyx5Q0FBMEI7SUFDMUIsMkNBQTRCO0lBQzVCLDZDQUE4QjtJQUM5QixtREFBb0M7SUFDcEMseURBQTBDO0lBQzFDLHlDQUEwQjtJQUMxQixtREFBb0M7SUFDcEMsdUNBQXdCO0lBQ3hCLG1EQUFvQztJQUVwQyx3REFBeUM7SUFDekMsMkVBQTREO0lBRTVELGlDQUFrQjtJQUNsQiwyQ0FBNEI7SUFFNUIsNkNBQThCO0lBQzlCLDBEQUEyQztJQUMzQyxzQ0FBdUI7SUFDdkIsK0NBQWdDO0lBQ2hDLDBEQUEyQztJQUMzQyxvRUFBcUQ7SUFDckQsdURBQXdDO0lBQ3hDLGlEQUFrQztJQUNsQywwREFBMkM7SUFDM0Msd0RBQXlDO0lBQ3pDLG1EQUFvQztJQUNwQyx1Q0FBd0I7SUFDeEIsdUNBQXdCO0lBQ3hCLG9EQUFxQztJQUNyQyw2REFBOEM7SUFDOUMseUNBQTBCO0lBQzFCLDhCQUFlO0lBQ2Ysb0RBQXFDO0lBQ3JDLGtEQUFtQztJQUNuQyx5REFBMEM7SUFFMUMsMkNBQTRCO0lBQzVCLG9FQUFxRDtJQUNyRCxzQ0FBdUI7SUFDdkIsbUNBQW9CO0lBQ3BCLGlEQUFrQztJQUNsQywwREFBMkM7SUFDM0MsMkNBQTRCO0lBRTVCLDREQUE2QztJQUM3QywyRUFBNEQ7SUFDNUQsMEJBQVc7SUFDWCxzREFBdUM7SUFFdkMsZ0VBQWlEO0lBQ2pELHFEQUFzQztJQUN0QyxxQ0FBc0I7SUFDdEIsMkRBQTRDO0lBQzVDLG9EQUFxQztJQUNyQyx3RUFBeUQ7SUFDekQsaUVBQWtEO0lBQ2xELHVDQUF3QjtJQUV4QiwrQ0FBZ0M7SUFDaEMscURBQXNDO0lBRXRDLCtEQUFnRDtBQUNsRCxDQUFDLEVBbExXLFdBQVcsR0FBWCxtQkFBVyxLQUFYLG1CQUFXLFFBa0x0Qjs7Ozs7Ozs7Ozs7Ozs7QUNwTEQsOEZBQThGO0FBQzlGLEVBQUU7QUFDRixvR0FBb0c7QUFDcEcsaUNBQWlDO0FBQ2pDLElBQVksTUFrSVg7QUFsSUQsV0FBWSxNQUFNO0lBQ2hCLDhEQUFvRDtJQUNwRCxzRUFBNEQ7SUFDNUQseUNBQStCO0lBQy9CLHFEQUEyQztJQUMzQyxzREFBNEM7SUFDNUMsOERBQW9EO0lBQ3BELHVEQUE2QztJQUM3QyxtREFBeUM7SUFDekMsZ0VBQXNEO0lBQ3RELDJDQUFpQztJQUNqQyxnRUFBc0Q7SUFDdEQsdUNBQTZCO0lBRTdCLDRDQUFrQztJQUVsQyx5REFBK0M7SUFDL0MscURBQTJDO0lBQzNDLDBEQUFnRDtJQUNoRCxzQ0FBNEI7SUFDNUIsbURBQXlDO0lBQ3pDLHFEQUEyQztJQUMzQyxzQ0FBNEI7SUFDNUIsZ0RBQXNDO0lBRXRDLHFFQUEyRDtJQUMzRCwwQ0FBZ0M7SUFDaEMsZ0RBQXNDO0lBRXRDLG1EQUF5QztJQUN6QyxnRUFBc0Q7SUFDdEQsNENBQWtDO0lBQ2xDLG9FQUEwRDtJQUMxRCx3RUFBOEQ7SUFDOUQsb0NBQTBCO0lBQzFCLHFEQUEyQztJQUMzQyxzQ0FBNEI7SUFDNUIsa0NBQXdCO0lBQ3hCLG1EQUF5QztJQUN6QyxnREFBc0M7SUFDdEMsaUVBQXVEO0lBRXZELDBDQUFnQztJQUVoQywrQ0FBcUM7SUFDckMsb0RBQTBDO0lBQzFDLDRDQUFrQztJQUNsQyx5REFBK0M7SUFDL0Msb0ZBQTBFO0lBQzFFLDJDQUFpQztJQUNqQyw2Q0FBbUM7SUFDbkMsdURBQTZDO0lBQzdDLDBDQUFnQztJQUNoQyxtREFBeUM7SUFDekMsNkNBQW1DO0lBQ25DLGlEQUF1QztJQUN2Qyw4REFBb0Q7SUFDcEQsK0RBQXFEO0lBQ3JELGlHQUF1RjtJQUN2Riw4REFBb0Q7SUFDcEQsb0VBQTBEO0lBQzFELHFFQUEyRDtJQUMzRCx3REFBOEM7SUFDOUMsZ0NBQXNCO0lBQ3RCLDREQUFrRDtJQUNsRCw2REFBbUQ7SUFDbkQsb0NBQTBCO0lBQzFCLGdDQUFzQjtJQUN0Qix1REFBNkM7SUFDN0MscURBQTJDO0lBQzNDLHdEQUE4QztJQUM5QyxxRUFBMkQ7SUFDM0QsaURBQXVDO0lBQ3ZDLDREQUFrRDtJQUNsRCxvRUFBMEQ7SUFDMUQsK0NBQXFDO0lBQ3JDLDREQUFrRDtJQUNsRCw2Q0FBbUM7SUFDbkMsaURBQXVDO0lBQ3ZDLCtDQUFxQztJQUNyQyw2Q0FBbUM7SUFDbkMsbURBQXlDO0lBQ3pDLDhEQUFvRDtJQUNwRCwyRUFBaUU7SUFDakUsdURBQTZDO0lBRTdDLG1EQUF5QztJQUV6QyxzREFBNEM7SUFDNUMsNEVBQWtFO0lBRWxFLGlFQUF1RDtJQUV2RCxzREFBNEM7SUFDNUMsc0RBQTRDO0lBRTVDLDZFQUFtRTtJQUNuRSx3RUFBOEQ7SUFDOUQsNEVBQWtFO0lBQ2xFLHVCQUFhO0lBQ2IsbURBQXlDO0lBQ3pDLDhEQUFvRDtJQUNwRCxnREFBc0M7SUFDdEMsaURBQXVDO0lBQ3ZDLDhEQUFvRDtJQUNwRCxxREFBMkM7SUFDM0MsOENBQW9DO0lBQ3BDLGlEQUF1QztJQUN2Qyw0Q0FBa0M7SUFFbEMsMkRBQWlEO0lBQ2pELG1FQUF5RDtJQUN6RCwyQ0FBaUM7SUFDakMsNEVBQWtFO0lBQ2xFLDJDQUFpQztJQUNqQywrQ0FBcUM7SUFDckMsbURBQXlDO0lBQ3pDLG9FQUEwRDtJQUMxRCx5Q0FBK0I7SUFDL0IsbURBQXlDO0lBQ3pDLHlCQUFlO0lBQ2YsNkNBQW1DO0lBQ25DLDREQUFrRDtJQUVsRCxxREFBMkM7SUFFM0MsdUJBQWE7SUFDYixpREFBdUM7SUFFdkMsNEJBQWtCO0FBQ3BCLENBQUMsRUFsSVcsTUFBTSxHQUFOLGNBQU0sS0FBTixjQUFNLFFBa0lqQjs7Ozs7Ozs7Ozs7Ozs7QUN0SUQsSUFBWSxrQkFZWDtBQVpELFdBQVksa0JBQWtCO0lBQzVCLHFDQUFlO0lBQ2YsdUNBQWlCO0lBQ2pCLDZDQUF1QjtJQUN2Qix5Q0FBbUI7SUFDbkIsMkNBQXFCO0lBQ3JCLDZDQUF1QjtJQUN2Qix3Q0FBa0I7SUFDbEIsc0NBQWdCO0lBQ2hCLGdFQUEwQztJQUMxQyxnRUFBMEM7SUFDMUMsa0VBQTRDO0FBQzlDLENBQUMsRUFaVyxrQkFBa0IsR0FBbEIsMEJBQWtCLEtBQWxCLDBCQUFrQixRQVk3Qjs7Ozs7Ozs7Ozs7Ozs7QUNaRCxJQUFZLGdCQVNYO0FBVEQsV0FBWSxnQkFBZ0I7SUFDMUIsbUNBQWU7SUFDZixtQ0FBZTtJQUNmLGlFQUE2QztJQUM3QywyQ0FBdUI7SUFDdkIseUNBQXFCO0lBQ3JCLDhEQUEwQztJQUMxQyw4REFBMEM7SUFDMUMsNERBQXdDO0FBQzFDLENBQUMsRUFUVyxnQkFBZ0IsR0FBaEIsd0JBQWdCLEtBQWhCLHdCQUFnQixRQVMzQjs7Ozs7Ozs7Ozs7Ozs7QUNURDs7Ozs7O0lBTUk7QUFDSixJQUFLLGlCQTBPSjtBQTFPRCxXQUFLLGlCQUFpQjtJQUNwQiw4QkFBUztJQUNULHVDQUFrQjtJQUNsQixvQ0FBZTtJQUNmLHlFQUFvRDtJQUNwRCxnR0FBMkU7SUFDM0Usc0NBQWlCO0lBQ2pCLGlDQUFZO0lBQ1osOENBQXlCO0lBQ3pCLHdDQUFtQjtJQUNuQiwrREFBMEM7SUFDMUMsNENBQXVCO0lBQ3ZCLHNEQUFpQztJQUNqQyw4Q0FBeUI7SUFDekIsbURBQThCO0lBQzlCLGtDQUFhO0lBQ2IsdUVBQWtEO0lBQ2xELHdFQUFtRDtJQUNuRCxnRUFBMkM7SUFDM0MsOEVBQXlEO0lBQ3pELHdDQUFtQjtJQUNuQix5REFBb0M7SUFDcEMsNENBQXVCO0lBQ3ZCLDZDQUF3QjtJQUN4QixpREFBNEI7SUFDNUIsNkNBQXdCO0lBQ3hCLHlFQUFvRDtJQUNwRCxtREFBOEI7SUFDOUIsMkNBQXNCO0lBQ3RCLDhEQUF5QztJQUN6Qyx3RUFBbUQ7SUFDbkQsOENBQXlCO0lBQ3pCLDREQUF1QztJQUN2QyxpREFBNEI7SUFDNUIsMkNBQXNCO0lBQ3RCLGdDQUFXO0lBQ1gsa0RBQTZCO0lBQzdCLCtCQUFVO0lBQ1YsbUNBQWM7SUFDZCw4REFBeUM7SUFDekMsa0RBQTZCO0lBQzdCLDhDQUF5QjtJQUN6QixxQ0FBZ0I7SUFDaEIscUNBQWdCO0lBQ2hCLG9DQUFlO0lBQ2YsNENBQXVCO0lBQ3ZCLDREQUF1QztJQUN2QywrREFBMEM7SUFDMUMsK0NBQTBCO0lBQzFCLHlFQUFvRDtJQUNwRCw0RUFBdUQ7SUFDdkQsNENBQXVCO0lBQ3ZCLHlEQUFvQztJQUNwQyxxREFBZ0M7SUFDaEMseURBQW9DO0lBQ3BDLG1FQUE4QztJQUM5QyxrREFBNkI7SUFDN0IsMERBQXFDO0lBQ3JDLHFFQUFnRDtJQUNoRCxtRUFBOEM7SUFDOUMsd0NBQW1CO0lBQ25CLHNDQUFpQjtJQUNqQix3Q0FBbUI7SUFDbkIsOEJBQVM7SUFDVCw4QkFBUztJQUNULHVEQUFrQztJQUNsQyxxQ0FBZ0I7SUFDaEIsMENBQXFCO0lBQ3JCLDRDQUF1QjtJQUN2QixpRUFBNEM7SUFDNUMsaUVBQTRDO0lBQzVDLHdDQUFtQjtJQUNuQixxREFBZ0M7SUFDaEMsNENBQXVCO0lBQ3ZCLDhDQUF5QjtJQUN6Qiw0Q0FBdUI7SUFDdkIsa0NBQWE7SUFDYix3REFBbUM7SUFDbkMsOEJBQVM7SUFDVCxvQ0FBZTtJQUNmLGdEQUEyQjtJQUMzQixzQ0FBaUI7SUFDakIseUVBQW9EO0lBQ3BELHlDQUFvQjtJQUNwQiwrREFBMEM7SUFDMUMseURBQW9DO0lBQ3BDLG1DQUFjO0lBQ2QsNEJBQU87SUFDUCxzQ0FBaUI7SUFDakIsMkRBQXNDO0lBQ3RDLHlEQUFvQztJQUNwQyw2RUFBd0Q7SUFDeEQsMENBQXFCO0lBQ3JCLHdEQUFtQztJQUNuQyw4RUFBeUQ7SUFDekQseUVBQW9EO0lBQ3BELDhCQUFTO0lBQ1QseUNBQW9CO0lBQ3BCLHVGQUFrRTtJQUNsRSx5RUFBb0Q7SUFDcEQsa0RBQTZCO0lBQzdCLDRDQUF1QjtJQUN2Qix5Q0FBb0I7SUFDcEIsa0NBQWE7SUFDYiw0Q0FBdUI7SUFDdkIsMENBQXFCO0lBQ3JCLGdDQUFXO0lBQ1gsMENBQXFCO0lBQ3JCLHFEQUFnQztJQUNoQywrQ0FBMEI7SUFDMUIsbURBQThCO0lBQzlCLGlFQUE0QztJQUM1QyxnREFBMkI7SUFDM0Isc0NBQWlCO0lBQ2pCLCtDQUEwQjtJQUMxQixtREFBOEI7SUFDOUIsdURBQWtDO0lBQ2xDLHdDQUFtQjtJQUNuQix1Q0FBa0I7SUFDbEIseUNBQW9CO0lBQ3BCLHNDQUFpQjtJQUNqQixzQ0FBaUI7SUFDakIsMENBQXFCO0lBQ3JCLGtDQUFhO0lBQ2IseUNBQW9CO0lBQ3BCLHVDQUFrQjtJQUNsQixtREFBOEI7SUFDOUIsa0RBQTZCO0lBQzdCLCtFQUEwRDtJQUMxRCw2Q0FBd0I7SUFDeEIsNkRBQXdDO0lBQ3hDLGtEQUE2QjtJQUM3QixrRUFBNkM7SUFDN0Msa0RBQTZCO0lBQzdCLHVDQUFrQjtJQUNsQix5Q0FBb0I7SUFDcEIsNEJBQU87SUFDUCxrQ0FBYTtJQUNiLHNEQUFpQztJQUNqQyxzREFBaUM7SUFDakMsb0NBQWU7SUFDZiw0Q0FBdUI7SUFDdkIsMENBQXFCO0lBQ3JCLHdDQUFtQjtJQUNuQixnREFBMkI7SUFDM0IsdUNBQWtCO0lBQ2xCLHlDQUFvQjtJQUNwQixnRUFBMkM7SUFDM0Msd0NBQW1CO0lBQ25CLDBDQUFxQjtJQUNyQix1Q0FBa0I7SUFDbEIsb0NBQWU7SUFDZiw0QkFBTztJQUNQLDhDQUF5QjtJQUN6Qiw4Q0FBeUI7SUFDekIsNkVBQXdEO0lBQ3hELCtEQUEwQztJQUMxQyx1RUFBa0Q7SUFDbEQscUZBQWdFO0lBQ2hFLHlDQUFvQjtJQUNwQiw2REFBd0M7SUFDeEMsc0NBQWlCO0lBQ2pCLDJFQUFzRDtJQUN0RCx1Q0FBa0I7SUFDbEIscUVBQWdEO0lBQ2hELHFDQUFnQjtJQUNoQixvQ0FBZTtJQUNmLG9EQUErQjtJQUMvQix1Q0FBa0I7SUFDbEIsNERBQXVDO0lBQ3ZDLDBDQUFxQjtJQUNyQiwwQ0FBcUI7SUFDckIsb0RBQStCO0lBQy9CLDZEQUF3QztJQUN4QyxrREFBNkI7SUFDN0IsMENBQXFCO0lBQ3JCLHNDQUFpQjtJQUNqQix3Q0FBbUI7SUFDbkIsdURBQWtDO0lBQ2xDLG1EQUE4QjtJQUM5QiwrQ0FBMEI7SUFDMUIsNkRBQXdDO0lBQ3hDLG1DQUFjO0lBQ2Qsc0NBQWlCO0lBQ2pCLG9DQUFlO0lBQ2YsNERBQXVDO0lBQ3ZDLHFEQUFnQztJQUNoQyx3Q0FBbUI7SUFDbkIsb0ZBQStEO0lBQy9ELG1EQUE4QjtJQUM5Qiw4REFBeUM7SUFDekMsbUNBQWM7SUFDZCxzQ0FBaUI7SUFDakIsZ0RBQTJCO0lBQzNCLHlDQUFvQjtJQUNwQix5Q0FBb0I7SUFDcEIsOEJBQVM7SUFDVCxnRUFBMkM7SUFDM0MsMEVBQXFEO0lBQ3JELGdEQUEyQjtJQUMzQiw0Q0FBdUI7SUFDdkIsNERBQXVDO0lBQ3ZDLDRDQUF1QjtJQUN2QiwwQ0FBcUI7SUFDckIsb0NBQWU7SUFDZixpREFBNEI7SUFDNUIseUNBQW9CO0lBQ3BCLHdEQUFtQztJQUNuQywrQkFBVTtJQUNWLDRCQUFPO0lBQ1AsOERBQXlDO0lBQ3pDLDRDQUF1QjtJQUN2QiwyREFBc0M7SUFDdEMsK0JBQVU7SUFDVixvQ0FBZTtJQUNmLDRCQUFPO0lBQ1AsNEJBQU87SUFDUCxnQ0FBVztJQUNYLHdDQUFtQjtJQUNuQiwwREFBcUM7SUFDckMsb0RBQStCO0lBQy9CLHdEQUFtQztJQUNuQyx3Q0FBbUI7SUFDbkIsb0NBQWU7SUFDZixzQ0FBaUI7SUFFakIsd0JBQXdCO0lBQ3hCLDJDQUFzQjtJQUN0QiwyQ0FBc0I7SUFDdEIsaURBQTRCO0lBQzVCLDJDQUFzQjtJQUN0QixpREFBNEI7SUFDNUIsMkNBQXNCO0lBQ3RCLDJDQUFzQjtBQUN4QixDQUFDLEVBMU9JLGlCQUFpQixLQUFqQixpQkFBaUIsUUEwT3JCO0FBRUQ7OztHQUdHO0FBQ0gsSUFBSyxvQkFHSjtBQUhELFdBQUssb0JBQW9CO0lBQ3ZCLHNEQUE4QjtJQUM5QixxQkFBcUI7QUFDdkIsQ0FBQyxFQUhJLG9CQUFvQixLQUFwQixvQkFBb0IsUUFHeEI7QUFFRDs7OztHQUlHO0FBQ0gsSUFBWSxjQXdCWDtBQXhCRCxXQUFZLGNBQWM7SUFDeEIsbUNBQW1DO0lBQ25DLGdDQUE2QjtJQUM3QixrQ0FBK0I7SUFDL0IsNERBQTJEO0lBQzNELDREQUEyRDtJQUMzRCw4Q0FBZ0Q7SUFDaEQsc0NBQW1DO0lBQ25DLGtFQUFpRTtJQUNqRSxxQ0FBb0M7SUFDcEMsbUNBQWtDO0lBQ2xDLG9DQUFpQztJQUNqQyxrQ0FBZ0M7SUFFaEMsc0VBQXNFO0lBQ3RFLG9DQUFpQztJQUNqQyxzQ0FBbUM7SUFDbkMsb0NBQXNDO0lBQ3RDLDRDQUFpRDtJQUNqRCwwQ0FBd0M7SUFDeEMsb0RBQW1EO0lBQ25ELHNFQUF1RTtJQUN2RSw4RUFBOEU7SUFDOUUsc0RBQXFEO0FBQ3ZELENBQUMsRUF4QlcsY0FBYyxHQUFkLHNCQUFjLEtBQWQsc0JBQWMsUUF3QnpCOzs7Ozs7Ozs7Ozs7OztBQ3pSRCxnRkFBNkI7QUFDN0Isb0pBQXNJO0FBRXRJLHlLQUF3RTtBQUN4RSxpSkFPNkI7QUFRN0Isc0pBUWtDO0FBSWxDOzs7OztHQUtHO0FBQ0gsTUFBYSxtQkFBbUI7SUFROUI7Ozs7Ozs7OztPQVNHO0lBQ0gsWUFBMkIsVUFBa0IsRUFBVSxXQUFvQixFQUFVLGlCQUEwQjtRQUFwRixlQUFVLEdBQVYsVUFBVSxDQUFRO1FBQVUsZ0JBQVcsR0FBWCxXQUFXLENBQVM7UUFBVSxzQkFBaUIsR0FBakIsaUJBQWlCLENBQVM7UUFDN0csbUNBQW1DO0lBQ3JDLENBQUM7SUFFRCxvQ0FBb0M7SUFFN0IsY0FBYztRQUNuQix3RUFBd0U7UUFDeEUsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtZQUM1QixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3ZELElBQUksQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNoRSxJQUFJLENBQUMsa0JBQWtCLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ3BHO0lBQ0gsQ0FBQztJQUVNLGFBQWE7UUFDbEIsOENBQThDO1FBQzlDLElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFO1lBQzNCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxTQUFTLENBQUM7U0FDckM7SUFDSCxDQUFDO0lBRU0sMkJBQTJCLENBQUMsT0FBa0M7UUFDbkUsSUFBSSxDQUFDLHdCQUF3QixHQUFHLE9BQU8sQ0FBQztJQUMxQyxDQUFDO0lBRU0sZ0NBQWdDLENBQUMsT0FBdUM7UUFDN0UsSUFBSSxDQUFDLDZCQUE2QixHQUFHLE9BQU8sQ0FBQztJQUMvQyxDQUFDO0lBRU0sd0JBQXdCLENBQUMsT0FBK0I7UUFDN0QsSUFBSSxDQUFDLHFCQUFxQixHQUFHLE9BQU8sQ0FBQztJQUN2QyxDQUFDO0lBRU0sNkJBQTZCLENBQUMsT0FBb0M7UUFDdkUsSUFBSSxDQUFDLDBCQUEwQixHQUFHLE9BQU8sQ0FBQztJQUM1QyxDQUFDO0lBRU0sMEJBQTBCLENBQUMsT0FBaUM7UUFDakUsSUFBSSxDQUFDLHVCQUF1QixHQUFHLE9BQU8sQ0FBQztJQUN6QyxDQUFDO0lBRUQsc0NBQXNDO0lBRXRDOzs7OztPQUtHO0lBQ0ksNEJBQTRCLENBQ2pDLFVBQXlCLEVBQ3pCLGlCQUFnQyxFQUNoQyxPQUErQjtRQUUvQixNQUFNLE9BQU8sR0FBc0I7WUFDakMsT0FBTyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDbkIsT0FBTyxFQUFFLDBCQUFXLENBQUMsVUFBVTtZQUMvQixpQkFBaUIsRUFBRSxpQkFBaUI7WUFDcEMsVUFBVSxFQUFFLFVBQVU7WUFDdEIsT0FBTyxFQUFFLE9BQU87U0FDakIsQ0FBQztRQUVGLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRU0scUJBQXFCLENBQUMsTUFBYyxFQUFFLFVBQTZCO1FBQ3hFLE1BQU0sT0FBTyxHQUFtQjtZQUM5QixPQUFPLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNuQixPQUFPLEVBQUUsMEJBQVcsQ0FBQyxPQUFPO1lBQzVCLE1BQU0sRUFBRSxNQUFNO1lBQ2QsVUFBVSxFQUFFLFVBQVU7U0FDdkIsQ0FBQztRQUVGLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRU0sNkJBQTZCLENBQUMsV0FBbUIsRUFBRSxJQUF1QixFQUFFLEtBQXdCO1FBQ3pHLE1BQU0sT0FBTyxHQUEyQjtZQUN0QyxPQUFPLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNuQixPQUFPLEVBQUUsMEJBQVcsQ0FBQyxlQUFlO1lBQ3BDLFdBQVcsRUFBRSxXQUFXO1lBQ3hCLElBQUksRUFBRSxJQUFJO1lBQ1YsS0FBSyxFQUFFLEtBQUs7U0FDYixDQUFDO1FBRUYsSUFBSSxLQUFLLEVBQUU7WUFDVCx5R0FBeUc7WUFDekcsT0FBTyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztTQUNuRDtRQUVELE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRU0sMEJBQTBCLENBQUMsY0FBOEIsRUFBRSxJQUFXO1FBQzNFLE1BQU0sT0FBTyxHQUF3QjtZQUNuQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNuQixPQUFPLEVBQUUsMEJBQVcsQ0FBQyxZQUFZO1lBQ2pDLGNBQWMsRUFBRSxjQUFjO1lBQzlCLElBQUksRUFBRSxJQUFJO1NBQ1gsQ0FBQztRQUVGLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRU0saUJBQWlCO1FBQ3RCLE1BQU0sT0FBTyxHQUFxQjtZQUNoQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNuQixPQUFPLEVBQUUsMEJBQVcsQ0FBQyxHQUFHO1lBQ3hCLGVBQWUsRUFBRSxpREFBeUI7U0FDM0MsQ0FBQztRQUVGLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxjQUFjLENBQUMsR0FBWTtRQUNqQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUNoRCxNQUFNLHdEQUF3RCxDQUFDO1NBQ2hFO1FBRUQsTUFBTSxlQUFlLEdBQUcsSUFBSSxxREFBeUIsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNyRyxPQUFPLGVBQWUsQ0FBQztJQUN6QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxpQkFBaUIsQ0FBQyxLQUFtQjtRQUMzQyxnRkFBZ0Y7UUFDaEYsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUN6RCxPQUFPO1NBQ1I7UUFFRCxxRkFBcUY7UUFDckYsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUU7WUFDZixPQUFPO1NBQ1I7UUFFRCxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO1FBQzNCLElBQUksQ0FBQyw2QkFBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ3ZCLE9BQU87U0FDUjtRQUVELHNHQUFzRztRQUN0RyxRQUFRLE9BQU8sQ0FBQyxPQUFPLEVBQUU7WUFDdkIsS0FBSywwQkFBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUMzQixJQUFJLENBQUMsaUNBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsRUFBRTtvQkFDN0QsT0FBTztpQkFDUjtnQkFFRCxJQUFJLENBQUMsd0JBQXdCLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDckQsTUFBTTthQUNQO1lBQ0QsS0FBSywwQkFBVyxDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUNoQyxJQUFJLENBQUMsNENBQXdCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsNkJBQTZCLEVBQUU7b0JBQzdFLE9BQU87aUJBQ1I7Z0JBRUQsSUFBSSxDQUFDLDZCQUE2QixDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQzFELE1BQU07YUFDUDtZQUNELEtBQUssMEJBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDeEIsSUFBSSxDQUFDLG9DQUFnQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFO29CQUM3RCxPQUFPO2lCQUNSO2dCQUVELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNsRCxNQUFNO2FBQ1A7WUFDRCxLQUFLLDBCQUFXLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQzdCLElBQUksQ0FBQyx5Q0FBcUIsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQywwQkFBMEIsRUFBRTtvQkFDdkUsT0FBTztpQkFDUjtnQkFFRCxJQUFJLENBQUMsMEJBQTBCLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDdkQsTUFBTTthQUNQO1lBQ0QsS0FBSywwQkFBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUMxQixJQUFJLENBQUMsc0NBQWtCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLEVBQUU7b0JBQ2pFLE9BQU87aUJBQ1I7Z0JBRUQsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3BELE1BQU07YUFDUDtZQUNELFFBQVE7WUFDUixzRUFBc0U7U0FDdkU7SUFDSCxDQUFDO0lBRU0sY0FBYyxDQUFDLFdBQW1CO1FBQ3ZDLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO0lBQ2pDLENBQUM7SUFFTSxvQkFBb0IsQ0FBQyxNQUFjO1FBQ3hDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxNQUFNLENBQUM7SUFDbEMsQ0FBQztDQUNGO0FBak9ELGtEQWlPQzs7Ozs7Ozs7Ozs7Ozs7QUNuUUQ7OztHQUdHO0FBQ0gsTUFBYSx5QkFBeUI7SUFDcEM7Ozs7O09BS0c7SUFDSCxZQUEyQixRQUFpQixFQUFVLE9BQWUsRUFBVSxPQUFlO1FBQW5FLGFBQVEsR0FBUixRQUFRLENBQVM7UUFBVSxZQUFPLEdBQVAsT0FBTyxDQUFRO1FBQVUsWUFBTyxHQUFQLE9BQU8sQ0FBUTtJQUFHLENBQUM7SUFFbEcsSUFBVyxXQUFXO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7SUFDL0IsQ0FBQztJQUVNLElBQUk7UUFDVCxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN0RCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7Q0FDRjtBQWpCRCw4REFpQkM7Ozs7Ozs7Ozs7Ozs7O0FDeEJELGdGQUE2QjtBQUM3Qiw4SUFBMkQ7QUFFM0Qsc0pBUWtDO0FBRWxDLE1BQU0sMEJBQTBCLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDekMsOEJBQWMsQ0FBQyxpQkFBaUI7SUFDaEMsOEJBQWMsQ0FBQywwQkFBMEI7SUFDekMsOEJBQWMsQ0FBQyxpQkFBaUI7SUFDaEMsOEJBQWMsQ0FBQyxvQkFBb0I7SUFDbkMsOEJBQWMsQ0FBQyx1QkFBdUI7Q0FDdkMsQ0FBQyxDQUFDO0FBRUgsMkJBQTJCO0FBQzNCLFNBQWdCLFNBQVMsQ0FBQyxJQUFtQjtJQUMzQyxJQUFJLENBQUMsSUFBSSxFQUFFO1FBQ1QsT0FBTyxLQUFLLENBQUM7S0FDZDtJQUVELE1BQU0sT0FBTyxHQUFHLElBQWUsQ0FBQztJQUNoQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUU7UUFDcEQsT0FBTyxLQUFLLENBQUM7S0FDZDtJQUVELElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUNqQyxPQUFPLEtBQUssQ0FBQztLQUNkO0lBRUQsSUFBSSxPQUFPLE9BQU8sQ0FBQyxPQUFPLEtBQUssUUFBUSxFQUFFO1FBQ3ZDLE9BQU8sS0FBSyxDQUFDO0tBQ2Q7SUFFRCxNQUFNLFlBQVksR0FBa0I7UUFDbEMsMEJBQVcsQ0FBQyxPQUFPO1FBQ25CLDBCQUFXLENBQUMsZUFBZTtRQUMzQiwwQkFBVyxDQUFDLFVBQVU7UUFDdEIsMEJBQVcsQ0FBQyxZQUFZO1FBQ3hCLDBCQUFXLENBQUMsU0FBUztLQUN0QixDQUFDO0lBRUYsSUFBSSxZQUFZLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFDN0MsT0FBTyxLQUFLLENBQUM7S0FDZDtJQUVELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQS9CRCw4QkErQkM7QUFFRCxTQUFnQixTQUFTLENBQUMsYUFBa0M7SUFDMUQsSUFBSSxDQUFDLGFBQWEsRUFBRTtRQUNsQixPQUFPLEtBQUssQ0FBQztLQUNkO0lBRUQsTUFBTSxDQUFDLEdBQUcsYUFBOEIsQ0FBQztJQUV6QyxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsRUFBRTtRQUN6QixPQUFPLEtBQUssQ0FBQztLQUNkO0lBRUQsSUFBSSxPQUFPLENBQUMsQ0FBQyxHQUFHLEtBQUssUUFBUSxJQUFJLE9BQU8sQ0FBQyxDQUFDLEtBQUssS0FBSyxRQUFRLElBQUksT0FBTyxDQUFDLENBQUMsS0FBSyxLQUFLLFFBQVEsRUFBRTtRQUMzRixPQUFPLEtBQUssQ0FBQztLQUNkO0lBRUQsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBaEJELDhCQWdCQztBQUVELFNBQWdCLGFBQWEsQ0FBQyxPQUFnQztJQUM1RCxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQ3ZCLE9BQU8sS0FBSyxDQUFDO0tBQ2Q7SUFFRCxNQUFNLFdBQVcsR0FBRyxPQUE0QixDQUFDO0lBQ2pELElBQUksV0FBVyxDQUFDLE9BQU8sS0FBSywwQkFBVyxDQUFDLFVBQVUsRUFBRTtRQUNsRCxPQUFPLEtBQUssQ0FBQztLQUNkO0lBRUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxFQUFFO1FBQ2pFLE9BQU8sS0FBSyxDQUFDO0tBQ2Q7SUFFRCxJQUFJLENBQUMsV0FBVyxDQUFDLGlCQUFpQixJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFO1FBQy9FLE9BQU8sS0FBSyxDQUFDO0tBQ2Q7SUFFRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFuQkQsc0NBbUJDO0FBRUQsU0FBZ0Isd0JBQXdCLENBQUMsT0FBcUM7SUFDNUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUN2QixPQUFPLEtBQUssQ0FBQztLQUNkO0lBRUQsTUFBTSxTQUFTLEdBQUcsT0FBaUMsQ0FBQztJQUNwRCxJQUFJLFNBQVMsQ0FBQyxPQUFPLEtBQUssMEJBQVcsQ0FBQyxlQUFlLEVBQUU7UUFDckQsT0FBTyxLQUFLLENBQUM7S0FDZDtJQUVELElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsRUFBRTtRQUN2QyxPQUFPLEtBQUssQ0FBQztLQUNkO0lBRUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFO1FBQ3ZDLE9BQU8sS0FBSyxDQUFDO0tBQ2Q7SUFFRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFuQkQsNERBbUJDO0FBRUQsU0FBZ0IsZ0JBQWdCLENBQUMsT0FBNkI7SUFDNUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUN2QixPQUFPLEtBQUssQ0FBQztLQUNkO0lBRUQsTUFBTSxjQUFjLEdBQUcsT0FBeUIsQ0FBQztJQUNqRCxJQUFJLGNBQWMsQ0FBQyxPQUFPLEtBQUssMEJBQVcsQ0FBQyxPQUFPLEVBQUU7UUFDbEQsT0FBTyxLQUFLLENBQUM7S0FDZDtJQUVELElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxJQUFJLE9BQU8sY0FBYyxDQUFDLFVBQVUsS0FBSyxRQUFRLEVBQUU7UUFDL0UsT0FBTyxLQUFLLENBQUM7S0FDZDtJQUVELElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxJQUFJLE9BQU8sY0FBYyxDQUFDLE1BQU0sS0FBSyxRQUFRLEVBQUU7UUFDdkUsT0FBTyxLQUFLLENBQUM7S0FDZDtJQUVELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQW5CRCw0Q0FtQkM7QUFFRCxTQUFnQixxQkFBcUIsQ0FBQyxPQUFrQztJQUN0RSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQ3ZCLE9BQU8sS0FBSyxDQUFDO0tBQ2Q7SUFFRCxNQUFNLG1CQUFtQixHQUFHLE9BQThCLENBQUM7SUFDM0QsSUFBSSxtQkFBbUIsQ0FBQyxPQUFPLEtBQUssMEJBQVcsQ0FBQyxZQUFZLEVBQUU7UUFDNUQsT0FBTyxLQUFLLENBQUM7S0FDZDtJQUVELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsY0FBYyxDQUFDLEVBQUU7UUFDcEcsT0FBTyxLQUFLLENBQUM7S0FDZDtJQUVELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxjQUFjLElBQUksT0FBTyxtQkFBbUIsQ0FBQyxjQUFjLEtBQUssUUFBUSxFQUFFO1FBQ2pHLE9BQU8sS0FBSyxDQUFDO0tBQ2Q7SUFFRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFuQkQsc0RBbUJDO0FBRUQsU0FBZ0Isa0JBQWtCLENBQUMsT0FBK0I7SUFDaEUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUN2QixPQUFPLEtBQUssQ0FBQztLQUNkO0lBRUQsTUFBTSxnQkFBZ0IsR0FBRyxPQUEyQixDQUFDO0lBQ3JELElBQUksZ0JBQWdCLENBQUMsT0FBTyxLQUFLLDBCQUFXLENBQUMsU0FBUyxFQUFFO1FBQ3RELE9BQU8sS0FBSyxDQUFDO0tBQ2Q7SUFFRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFYRCxnREFXQzs7Ozs7Ozs7Ozs7Ozs7QUNyS0Q7O0dBRUc7QUFDSCxJQUFZLFdBT1g7QUFQRCxXQUFZLFdBQVc7SUFDckIsd0NBQXlCO0lBQ3pCLDRDQUE2QjtJQUM3QixrQ0FBbUI7SUFDbkIsbURBQW9DO0lBQ3BDLHdDQUF5QjtJQUN6Qiw0QkFBYTtBQUNmLENBQUMsRUFQVyxXQUFXLEdBQVgsbUJBQVcsS0FBWCxtQkFBVyxRQU90Qjs7Ozs7Ozs7Ozs7Ozs7QUNWRCx3QkFBd0I7QUFFeEI7OztHQUdHO0FBQ0gsTUFBYSx3QkFBd0I7SUFDNUIsa0JBQWtCLENBQUMsSUFBUyxFQUFFLFVBQWU7UUFDbEQsT0FBTztZQUNMLElBQUksRUFBRSxJQUFjO1lBQ3BCLFVBQVUsRUFBRSxVQUErQjtTQUM1QyxDQUFDO0lBQ0osQ0FBQztJQUVNLHNCQUFzQixDQUFDLGVBQWdDO1FBQzVELE9BQU8sZUFBZSxDQUFDO0lBQ3pCLENBQUM7SUFFTSxxQkFBcUIsQ0FBQyxZQUEwQjtRQUNyRCxPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDO0NBQ0Y7QUFmRCw0REFlQzs7Ozs7Ozs7Ozs7Ozs7QUNwQkQsd0JBQXdCO0FBRXhCOzs7Ozs7O0dBT0c7QUFDSCxNQUFhLHdCQUF3QjtJQTBCbkM7Ozs7Ozs7O09BUUc7SUFDSCxZQUNVLHFCQUE2QixFQUM3QixxQkFBNkIsRUFDN0IsMkJBQW1FLEVBQ25FLDZCQUF5RSxFQUN6RSxrQ0FBNkU7UUFKN0UsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUFRO1FBQzdCLDBCQUFxQixHQUFyQixxQkFBcUIsQ0FBUTtRQUM3QixnQ0FBMkIsR0FBM0IsMkJBQTJCLENBQXdDO1FBQ25FLGtDQUE2QixHQUE3Qiw2QkFBNkIsQ0FBNEM7UUFDekUsdUNBQWtDLEdBQWxDLGtDQUFrQyxDQUEyQztRQUVyRixJQUFJLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUU7WUFDM0QsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsSUFBSSxDQUFDLHFCQUFxQixRQUFRLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLENBQUM7U0FDNUg7SUFDSCxDQUFDO0lBNUNEOzs7Ozs7OztPQVFHO0lBQ0ksTUFBTSxDQUFDLFFBQVEsQ0FDcEIsZUFBOEIsRUFDOUIsZUFBOEIsRUFDOUIsMEJBQWtFLEVBQ2xFLDRCQUF3RSxFQUN4RSxpQ0FBNEU7UUFFNUUsT0FBTyxJQUFJLElBQUksQ0FDYixlQUFlLENBQUMsS0FBSyxFQUNyQixlQUFlLENBQUMsS0FBSyxFQUNyQiwwQkFBMEIsRUFDMUIsNEJBQTRCLEVBQzVCLGlDQUFpQyxDQUNsQyxDQUFDO0lBQ0osQ0FBQztJQXVCTSxrQkFBa0IsQ0FBQyxJQUFTLEVBQUUsVUFBZTtRQUNsRCxxRkFBcUY7UUFDckYsSUFBSSxRQUFRLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsQ0FBQztRQUN0RCxLQUFLLE1BQU0sa0JBQWtCLElBQUksSUFBSSxDQUFDLDJCQUEyQixFQUFFO1lBQ2pFLFFBQVEsR0FBRyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUNuRTtRQUVELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFTSxzQkFBc0IsQ0FBQyxlQUFnQztRQUM1RCxrRUFBa0U7UUFDbEUsSUFBSSxVQUFVLEdBQUcsZUFBZSxDQUFDO1FBQ2pDLEtBQUssTUFBTSxvQkFBb0IsSUFBSSxJQUFJLENBQUMsNkJBQTZCLEVBQUU7WUFDckUsVUFBVSxHQUFHLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQy9DO1FBRUQsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVNLHFCQUFxQixDQUFDLFlBQTBCO1FBQ3JELHNFQUFzRTtRQUN0RSxJQUFJLFVBQVUsR0FBRyxZQUFZLENBQUM7UUFDOUIsS0FBSyxNQUFNLG9CQUFvQixJQUFJLElBQUksQ0FBQyxrQ0FBa0MsRUFBRTtZQUMxRSxVQUFVLEdBQUcsb0JBQW9CLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDL0M7UUFFRCxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0NBQ0Y7QUE1RUQsNERBNEVDOzs7Ozs7Ozs7Ozs7OztBQ3pGRCx1S0FBc0U7QUFFdEUsdUtBQXNFO0FBRXRFLHdKQU0rQjtBQUUvQjs7OztHQUlHO0FBQ0gsU0FBZ0IsZUFBZSxDQUFDLEdBQWtCLEVBQUUsR0FBa0I7SUFDcEUsSUFBSSxHQUFHLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLEVBQUU7UUFDekIsT0FBTyxLQUFLLENBQUM7S0FDZDtJQUNELElBQUksR0FBRyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxFQUFFO1FBQ3pCLE9BQU8sSUFBSSxDQUFDO0tBQ2I7SUFDRCxPQUFPLEdBQUcsQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQztBQUMvQixDQUFDO0FBUkQsMENBUUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBZ0IsY0FBYyxDQUFDLEdBQWtCLEVBQUUsR0FBa0I7SUFDbkUsT0FBTyxHQUFHLENBQUMsS0FBSyxLQUFLLEdBQUcsQ0FBQyxLQUFLLElBQUksR0FBRyxDQUFDLEtBQUssS0FBSyxHQUFHLENBQUMsS0FBSyxDQUFDO0FBQzVELENBQUM7QUFGRCx3Q0FFQztBQU1ELGdIQUFnSDtBQUNoSCwrRkFBK0Y7QUFDL0YsOEdBQThHO0FBQzlHLDJHQUEyRztBQUMzRyxvSEFBb0g7QUFDcEgsbUdBQW1HO0FBQ3RGLDRCQUFvQixHQUEyRDtJQUMxRixDQUFDLEVBQUU7UUFDRCxDQUFDLEVBQUUsRUFBRTtLQUNOO0NBQ0YsQ0FBQztBQUVXLDhCQUFzQixHQUErRDtJQUNoRyxDQUFDLEVBQUU7UUFDRCxDQUFDLEVBQUUsQ0FBQyw2Q0FBdUIsQ0FBQztRQUM1QixDQUFDLEVBQUUsRUFBRTtRQUNMLEdBQUcsRUFBRSxDQUFDLG9EQUE4QixDQUFDO1FBQ3JDLEdBQUcsRUFBRSxDQUFDLDBEQUFvQyxDQUFDO0tBQzVDO0NBQ0YsQ0FBQztBQUVXLG1DQUEyQixHQUE4RDtJQUNwRyxDQUFDLEVBQUU7UUFDRCxDQUFDLEVBQUUsRUFBRTtRQUNMLEVBQUUsRUFBRSxDQUFDLDhDQUF3QixDQUFDO1FBQzlCLEdBQUcsRUFBRSxDQUFDLGdFQUEwQyxDQUFDO0tBQ2xEO0NBQ0YsQ0FBQztBQUVGOzs7Ozs7OztHQVFHO0FBQ0gsU0FBZ0Isc0JBQXNCLENBQUMsZUFBOEIsRUFBRSxlQUE4QjtJQUNuRyxPQUFPLHFDQUFxQyxDQUMxQyxlQUFlLEVBQ2YsZUFBZSxFQUNmLDRCQUFvQixFQUNwQiw4QkFBc0IsRUFDdEIsbUNBQTJCLENBQzVCLENBQUM7QUFDSixDQUFDO0FBUkQsd0RBUUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxTQUFnQixxQ0FBcUMsQ0FDbkQsZUFBOEIsRUFDOUIsZUFBOEIsRUFDOUIsUUFBZ0UsRUFDaEUsVUFBc0UsRUFDdEUsc0JBQWlGO0lBRWpGLE1BQU0sb0JBQW9CLEdBQVcsZUFBZSxDQUFDLEtBQUssQ0FBQztJQUMzRCxNQUFNLG9CQUFvQixHQUFXLGVBQWUsQ0FBQyxLQUFLLENBQUM7SUFDM0QsTUFBTSxvQkFBb0IsR0FBVyxlQUFlLENBQUMsS0FBSyxDQUFDO0lBRTNELElBQUksb0JBQW9CLEdBQUcsb0JBQW9CLEVBQUU7UUFDL0MsTUFBTSxJQUFJLEtBQUssQ0FBQzsyQkFDTyxvQkFBb0IseUJBQXlCLG9CQUFvQixFQUFFLENBQUMsQ0FBQztLQUM3RjtJQUVELHlGQUF5RjtJQUN6RixJQUFJLGNBQWMsQ0FBQyxlQUFlLEVBQUUsZUFBZSxDQUFDLEVBQUU7UUFDcEQsT0FBTyxJQUFJLG1EQUF3QixFQUFFLENBQUM7S0FDdkM7SUFFRCxtR0FBbUc7SUFDbkcsTUFBTSxxQkFBcUIsR0FBMkMscUJBQXFCLENBQ3pGLG9CQUFvQixFQUNwQixvQkFBb0IsRUFDcEIsb0JBQW9CLEVBQ3BCLFFBQVEsQ0FDVCxDQUFDO0lBRUYsTUFBTSx1QkFBdUIsR0FBK0MscUJBQXFCLENBQy9GLG9CQUFvQixFQUNwQixvQkFBb0IsRUFDcEIsb0JBQW9CLEVBQ3BCLFVBQVUsQ0FDWCxDQUFDO0lBRUYsTUFBTSw0QkFBNEIsR0FBOEMscUJBQXFCLENBQ25HLG9CQUFvQixFQUNwQixvQkFBb0IsRUFDcEIsb0JBQW9CLEVBQ3BCLHNCQUFzQixDQUN2QixDQUFDO0lBRUYsd0ZBQXdGO0lBQ3hGLHVCQUF1QixDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2xDLDRCQUE0QixDQUFDLE9BQU8sRUFBRSxDQUFDO0lBRXZDLE9BQU8sbURBQXdCLENBQUMsUUFBUSxDQUN0QyxlQUFlLEVBQ2YsZUFBZSxFQUNmLHFCQUFxQixFQUNyQix1QkFBdUIsRUFDdkIsNEJBQTRCLENBQzdCLENBQUM7QUFDSixDQUFDO0FBdERELHNGQXNEQztBQUVELFNBQVMscUJBQXFCLENBQzVCLG9CQUE0QixFQUM1QixvQkFBNEIsRUFDNUIsb0JBQTRCLEVBQzVCLHFCQUErQztJQUUvQyxNQUFNLGtCQUFrQixHQUFhLEVBQUUsQ0FBQztJQUV4QyxLQUFLLElBQUksS0FBSyxHQUFHLG9CQUFvQixFQUFFLEtBQUssSUFBSSxvQkFBb0IsRUFBRSxLQUFLLEVBQUUsRUFBRTtRQUM3RSxJQUFJLEtBQUssSUFBSSxxQkFBcUIsRUFBRTtZQUNsQyxNQUFNLEtBQUssR0FBRyxLQUFLLEtBQUssb0JBQW9CLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEUsTUFBTSxtQkFBbUIsR0FBRyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1RixLQUFLLElBQUksS0FBSyxHQUFHLEtBQUssRUFBRSxLQUFLLElBQUksbUJBQW1CLEVBQUUsS0FBSyxFQUFFLEVBQUU7Z0JBQzdELElBQUksS0FBSyxJQUFJLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxFQUFFO29CQUN6QyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2lCQUNqRTthQUNGO1NBQ0Y7S0FDRjtJQUVELE9BQU8sa0JBQWtCLENBQUM7QUFDNUIsQ0FBQztBQUVELFNBQWdCLG9CQUFvQixDQUFDLGFBQTRCO0lBQy9ELE9BQU8sYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0UsQ0FBQztBQUZELG9EQUVDOzs7Ozs7Ozs7Ozs7OztBQ3BMRCxvSkFRa0M7QUFFbEMsOElBQTJEO0FBYTNELG9FQUFvRTtBQUNwRSw2RkFBNkY7QUFDN0YsbUdBQW1HO0FBRW5HLHFCQUFxQjtBQUNyQixrRUFBa0U7QUFDbEUsOERBQThEO0FBRTlELHVCQUF1QjtBQUN2QixrRUFBa0U7QUFDbEUsOERBQThEO0FBRTlELFNBQWdCLHVCQUF1QixDQUFDLGVBQWdDO0lBQ3RFLHdFQUF3RTtJQUN4RSx3RUFBd0U7SUFDeEUsMERBQTBEO0lBRTFELE1BQU0sYUFBYSxHQUFHLGVBQWUsQ0FBQyxNQUFnQyxDQUFDO0lBQ3ZFLElBQUksYUFBYSxDQUFDLHNCQUFzQixLQUFLLFNBQVMsRUFBRTtRQUN0RCxhQUFhLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQzFELElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtnQkFDbEIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQzthQUNqQztRQUNILENBQUMsQ0FBQyxDQUFDO0tBQ0o7SUFFRCxPQUFPLGVBQWUsQ0FBQztBQUN6QixDQUFDO0FBZkQsMERBZUM7QUFFRCxTQUFnQix3QkFBd0IsQ0FBQyxZQUEwQjtJQUNqRSwyRkFBMkY7SUFDM0YsMkZBQTJGO0lBRTNGLElBQUksWUFBWSxDQUFDLGNBQWMsS0FBSyw4QkFBYyxDQUFDLG9CQUFvQixFQUFFO1FBQ3ZFLE1BQU0sV0FBVyxHQUFHLFlBQVksQ0FBQyxJQUFnQixDQUFDO1FBQ2xELElBQUksV0FBVyxDQUFDLGVBQWUsS0FBSyxTQUFTLEVBQUU7WUFDN0MsV0FBVyxDQUFDLGVBQWUsR0FBRyxDQUFDLENBQUM7U0FDakM7S0FDRjtJQUVELE9BQU8sWUFBWSxDQUFDO0FBQ3RCLENBQUM7QUFaRCw0REFZQztBQUVELHlFQUF5RTtBQUN6RSxTQUFTLDRCQUE0QixDQUFDLGVBQWdDLEVBQUUsVUFBMEI7O0lBQ2hHLE1BQU0sYUFBYSxHQUFHLGVBQWUsQ0FBQyxNQUFnQyxDQUFDO0lBRXZFLGdCQUFJLGFBQWEsMENBQUUsc0JBQXNCLDBDQUFFLFVBQVU7UUFDbkQsYUFBYSxDQUFDLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxnQkFBZ0I7WUFDOUQsYUFBYSxDQUFDLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztJQUN6SCxPQUFPLGVBQWUsQ0FBQztBQUN6QixDQUFDO0FBRUQseUVBQXlFO0FBQ3pFLHlFQUF5RTtBQUN6RSxTQUFTLHdDQUF3QyxDQUFDLFlBQTBCLEVBQUUsVUFBMEI7SUFDdEcsSUFBSSxZQUFZLENBQUMsY0FBYyxLQUFLLDhCQUFjLENBQUMsMEJBQTBCLEVBQUU7UUFDN0UsTUFBTSxVQUFVLEdBQUcsWUFBWSxDQUFDLElBQTBCLENBQUM7UUFDM0QsWUFBWSxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7S0FDckc7SUFFRCxPQUFPLFlBQVksQ0FBQztBQUN0QixDQUFDO0FBRUQsZ0hBQWdIO0FBQ2hILE1BQU0sd0JBQXdCLEdBQUcscUhBQTBFLENBQUM7QUFFL0Ysc0NBQThCLEdBQUcsQ0FBQyxRQUF5QixFQUFFLEVBQUUsQ0FDMUUsNEJBQTRCLENBQUMsUUFBUSxFQUFFLHdCQUF3QixDQUFDLENBQUM7QUFDdEQsa0RBQTBDLEdBQUcsQ0FBQyxZQUEwQixFQUFFLEVBQUUsQ0FDdkYsd0NBQXdDLENBQUMsWUFBWSxFQUFFLHdCQUF3QixDQUFDLENBQUM7QUFFbkYsU0FBZ0Isb0NBQW9DLENBQUMsZUFBZ0M7SUFDbkYsNkZBQTZGO0lBQzdGLCtEQUErRDtJQUMvRCxNQUFNLGFBQWEsR0FBRyxlQUFlLENBQUMsTUFBZ0MsQ0FBQztJQUV2RSxJQUFJLGFBQWEsQ0FBQyxvQkFBb0IsS0FBSyxTQUFTLEVBQUU7UUFDcEQsTUFBTSxPQUFPLEdBQUcsYUFBYSxDQUFDLG9CQUFvQixDQUFDLGdCQUFnQixDQUFDO1FBQ3BFLElBQUksT0FBTyxLQUFLLHdDQUFnQixDQUFDLFNBQVMsSUFBSSxPQUFPLEtBQUssd0NBQWdCLENBQUMsS0FBSyxFQUFFO1lBQ2hGLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxnQkFBZ0IsR0FBRyx3Q0FBZ0IsQ0FBQyxNQUFNLENBQUM7U0FDL0U7YUFBTSxJQUFJLE9BQU8sS0FBSyx3Q0FBZ0IsQ0FBQyxhQUFhLEVBQUU7WUFDckQsYUFBYSxDQUFDLG9CQUFvQixDQUFDLGdCQUFnQixHQUFHLHdDQUFnQixDQUFDLE9BQU8sQ0FBQztTQUNoRjtLQUNGO0lBRUQsT0FBTyxlQUFlLENBQUM7QUFDekIsQ0FBQztBQWZELG9GQWVDOzs7Ozs7Ozs7Ozs7OztBQzNHRCx3QkFBd0I7QUFFeEI7OztHQUdHO0FBQ0gsTUFBYSxnQ0FBZ0M7SUFDcEMsb0JBQW9CLENBQUMsSUFBUyxFQUFFLFVBQWU7UUFDcEQsT0FBTztZQUNMLElBQUksRUFBRSxJQUFjO1lBQ3BCLFVBQVUsRUFBRSxVQUErQjtTQUM1QyxDQUFDO0lBQ0osQ0FBQztJQUVNLG9CQUFvQixDQUFDLGVBQWdDLEVBQUUsSUFBWSxFQUFFLFVBQTZCO1FBQ3ZHLE9BQU8sZUFBZSxDQUFDO0lBQ3pCLENBQUM7SUFFTSxtQkFBbUIsQ0FBQyxZQUEwQjtRQUNuRCxPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDO0NBQ0Y7QUFmRCw0RUFlQzs7Ozs7Ozs7Ozs7Ozs7QUNwQkQsd0JBQXdCO0FBQ3hCOzs7Ozs7R0FNRztBQUNILE1BQWEsZ0NBQWdDO0lBQzNDOzs7Ozs7OztPQVFHO0lBQ0gsWUFDVSxnQkFBK0IsRUFDL0IsZ0JBQStCLEVBQy9CLGlDQUEyRSxFQUMzRSxpQ0FBMkUsRUFDM0UsZ0NBQXlFO1FBSnpFLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBZTtRQUMvQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWU7UUFDL0Isc0NBQWlDLEdBQWpDLGlDQUFpQyxDQUEwQztRQUMzRSxzQ0FBaUMsR0FBakMsaUNBQWlDLENBQTBDO1FBQzNFLHFDQUFnQyxHQUFoQyxnQ0FBZ0MsQ0FBeUM7UUFFakYsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUU7WUFDN0QsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUs7WUFDaEYsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7U0FDdEM7SUFDSCxDQUFDO0lBRU0sb0JBQW9CLENBQUMsSUFBUyxFQUFFLFVBQWU7UUFDcEQsdUZBQXVGO1FBQ3ZGLElBQUksVUFBVSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLENBQUM7UUFDeEQsS0FBSyxNQUFNLG9CQUFvQixJQUFJLElBQUksQ0FBQyxpQ0FBaUMsRUFBRTtZQUN6RSxVQUFVLEdBQUcsb0JBQW9CLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDM0U7UUFFRCxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0lBRU0sb0JBQW9CLENBQUMsZUFBZ0MsRUFBRSxJQUFZLEVBQUUsVUFBNkI7UUFDdkcsK0VBQStFO1FBQy9FLElBQUksUUFBUSxHQUFHLGVBQWUsQ0FBQztRQUMvQixLQUFLLE1BQU0sa0JBQWtCLElBQUksSUFBSSxDQUFDLGlDQUFpQyxFQUFFO1lBQ3ZFLFFBQVEsR0FBRyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1NBQzNEO1FBRUQsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVNLG1CQUFtQixDQUFDLFlBQTBCO1FBQ25ELCtFQUErRTtRQUMvRSxJQUFJLFFBQVEsR0FBRyxZQUFZLENBQUM7UUFDNUIsS0FBSyxNQUFNLG1CQUFtQixJQUFJLElBQUksQ0FBQyxnQ0FBZ0MsRUFBRTtZQUN2RSxRQUFRLEdBQUcsbUJBQW1CLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDMUM7UUFFRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0NBQ0Y7QUFwREQsNEVBb0RDOzs7Ozs7Ozs7Ozs7OztBQy9ERCxxS0FBeUc7QUFFekcsd01BQXNGO0FBQ3RGLHdNQUFzRjtBQUd0RiwrR0FBK0c7QUFDL0csMkVBQTJFO0FBQzNFLDRHQUE0RztBQUM1Ryx3QkFBd0I7QUFDeEIsb0hBQW9IO0FBQ3BILG1HQUFtRztBQUN0Rix5Q0FBaUMsR0FBcUU7SUFDakgsQ0FBQyxFQUFFO1FBQ0QsQ0FBQyxFQUFFLEVBQUU7S0FDTjtDQUNGLENBQUM7QUFFVyx5Q0FBaUMsR0FBcUU7SUFDakgsQ0FBQyxFQUFFO1FBQ0QsQ0FBQyxFQUFFLEVBQUU7S0FDTjtDQUNGLENBQUM7QUFFVyx1Q0FBK0IsR0FBb0U7SUFDOUcsQ0FBQyxFQUFFO1FBQ0QsQ0FBQyxFQUFFLEVBQUU7S0FDTjtDQUNGLENBQUM7QUFFRjs7Ozs7Ozs7R0FRRztBQUNILFNBQWdCLHdDQUF3QyxDQUN0RCxlQUE4QixFQUM5QixlQUE4QjtJQUU5QixPQUFPLHVEQUF1RCxDQUM1RCxlQUFlLEVBQ2YsZUFBZSxFQUNmLHlDQUFpQyxFQUNqQyx5Q0FBaUMsRUFDakMsdUNBQStCLENBQ2hDLENBQUM7QUFDSixDQUFDO0FBWEQsNEZBV0M7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQWdCLHVEQUF1RCxDQUNyRSxlQUE4QixFQUM5QixlQUE4QixFQUM5QixVQUE0RSxFQUM1RSxRQUEwRSxFQUMxRSxvQkFBcUY7SUFFckYsTUFBTSxvQkFBb0IsR0FBVyxlQUFlLENBQUMsS0FBSyxDQUFDO0lBQzNELE1BQU0sb0JBQW9CLEdBQVcsZUFBZSxDQUFDLEtBQUssQ0FBQztJQUMzRCxNQUFNLG9CQUFvQixHQUFXLGVBQWUsQ0FBQyxLQUFLLENBQUM7SUFFM0QsMEZBQTBGO0lBQzFGLG1FQUFtRTtJQUNuRSxJQUFJLG9CQUFvQixHQUFHLG9CQUFvQixFQUFFO1FBQy9DLE1BQU0sSUFBSSxLQUFLLENBQUM7MkJBQ08sb0JBQW9CLHlCQUF5QixvQkFBb0IsRUFBRSxDQUFDLENBQUM7S0FDN0Y7SUFFRCxJQUFJLG9CQUFvQixHQUFHLG9CQUFvQixJQUFJLHdDQUFjLENBQUMsZUFBZSxFQUFFLGVBQWUsQ0FBQyxFQUFFO1FBQ25HLE9BQU8sSUFBSSxtRUFBZ0MsRUFBRSxDQUFDO0tBQy9DO0lBRUQsbUdBQW1HO0lBQ25HLE1BQU0sMEJBQTBCLEdBQXFELDZCQUE2QixDQUNoSCxvQkFBb0IsRUFDcEIsb0JBQW9CLEVBQ3BCLFVBQVUsQ0FDWCxDQUFDO0lBRUYsTUFBTSwyQkFBMkIsR0FBcUQsNkJBQTZCLENBQ2pILG9CQUFvQixFQUNwQixvQkFBb0IsRUFDcEIsUUFBUSxDQUNULENBQUM7SUFFRixNQUFNLDBCQUEwQixHQUFvRCw2QkFBNkIsQ0FDL0csb0JBQW9CLEVBQ3BCLG9CQUFvQixFQUNwQixvQkFBb0IsQ0FDckIsQ0FBQztJQUVGLGdIQUFnSDtJQUNoSCwwQkFBMEIsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNyQyxPQUFPLElBQUksbUVBQWdDLENBQ3pDLGVBQWUsRUFDZixlQUFlLEVBQ2YsMEJBQTBCLEVBQzFCLDJCQUEyQixFQUMzQiwwQkFBMEIsQ0FDM0IsQ0FBQztBQUNKLENBQUM7QUFsREQsMEhBa0RDO0FBRUQsU0FBUyw2QkFBNkIsQ0FDcEMsb0JBQTRCLEVBQzVCLG9CQUE0QixFQUM1QixxQkFBK0M7SUFFL0MsTUFBTSxrQkFBa0IsR0FBYSxFQUFFLENBQUM7SUFFeEMsSUFBSSxvQkFBb0IsSUFBSSxxQkFBcUIsRUFBRTtRQUNqRCxNQUFNLEtBQUssR0FBRyxvQkFBb0IsQ0FBQztRQUNuQyxNQUFNLG1CQUFtQixHQUFHLDhDQUFvQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0csS0FBSyxJQUFJLEtBQUssR0FBRyxLQUFLLEVBQUUsS0FBSyxJQUFJLG1CQUFtQixFQUFFLEtBQUssRUFBRSxFQUFFO1lBQzdELElBQUksS0FBSyxJQUFJLHFCQUFxQixDQUFDLG9CQUFvQixDQUFDLEVBQUU7Z0JBQ3hELGtCQUFrQixDQUFDLElBQUksQ0FBQyxHQUFHLHFCQUFxQixDQUFDLG9CQUFvQixDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQzthQUNoRjtTQUNGO0tBQ0Y7SUFFRCxPQUFPLGtCQUFrQixDQUFDO0FBQzVCLENBQUM7Ozs7Ozs7Ozs7Ozs7QUNwSUQsdUVBQXVFOzs7OztBQUV2RSx5SEFBb0Q7QUFBM0MsNENBQVU7QUFDbkIsd0pBQTJEO0FBQzNELDZLQUFtRjtBQUExRSwwRUFBb0I7QUFDN0IseUhBQW9EO0FBQTNDLDRDQUFVO0FBQ25CLCtNQUF5RztBQUFoRyx3R0FBOEI7QUFDdkMsK01BQXlHO0FBQWhHLHdHQUE4QjtBQUN2Qyx1SkFBd0U7QUFBL0QsMEVBQW9CO0FBQzdCLDBHQUEwQztBQUFqQyw2QkFBSztBQUNkLCtJQUFpRTtBQUF4RCx3REFBYztBQUN2Qiw0SUFBK0Q7QUFBdEQscURBQWE7QUFDdEIsOEpBQTJFO0FBQWxFLHVFQUFtQjtBQUM1QiwrSUFBaUU7QUFBeEQsd0RBQWM7QUFDdkIsNElBQStEO0FBQXRELHFEQUFhO0FBQ3RCLGdJQUF1RDtBQUE5Qyx5Q0FBUztBQUNsQiw0SUFBK0Q7QUFBdEQscURBQWE7QUFDdEIsdUtBQWlGO0FBQXhFLGdGQUFzQjtBQUMvQixnSUFBdUQ7QUFBOUMseUNBQVM7QUFDbEIsK0lBQWlFO0FBQXhELHdEQUFjO0FBQ3ZCLDJKQUF5RTtBQUFoRSxvRUFBa0I7QUFDM0IseUlBQTZEO0FBQXBELGtEQUFZO0FBQ3JCLDRJQUErRDtBQUF0RCxxREFBYTtBQUN0QiwwR0FBMEM7QUFBakMsNkJBQUs7QUFRZCxnS0FBK0Q7QUFFL0QsNElBQXFEO0FBSXJELHNMQUF3RjtBQUEvRSw2RUFBcUI7QUFDOUIsNExBQTRGO0FBQW5GLG1GQUF1QjtBQUNoQyx3TUFBa0g7QUFBekcsK0ZBQTJCO0FBQUUsaUVBQVk7QUFDbEQsb0tBQTRFO0FBQW5FLDJEQUFlO0FBQ3hCLG9LQUE0RTtBQUFuRSwyREFBZTtBQUN4QixxTUFBa0c7QUFBekYsNEZBQTBCO0FBRW5DLCtIQUF3RDtBQUEvQyxrREFBWTtBQUNyQiwrSEFBc0Q7QUFBN0Msc0NBQVE7QUFDakIsMklBQThEO0FBQXJELGtEQUFZO0FBQ3JCLDhJQUFnRTtBQUF2RCxxREFBYTtBQUN0QixxSUFBMEQ7QUFBakQsNENBQVU7QUFDbkIsa0lBQTBEO0FBQWpELHFEQUFhO0FBQ3RCLGlLQUFrRjtBQUF6RSx3R0FBOEI7Ozs7Ozs7Ozs7Ozs7O0FDbER2QywwSEFBZ0Q7QUFHaEQ7O0dBRUc7QUFDSCxNQUFhLFVBQVU7SUFJckI7O09BRUc7SUFDSSxNQUFNLEtBQUssUUFBUTtRQUN4QixPQUFPLFVBQVUsQ0FBQyxTQUFTLENBQUM7SUFDOUIsQ0FBQztJQUVNLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFpQixFQUFFLE9BQWdCO1FBQ2hFLFVBQVUsQ0FBQyxTQUFTLEdBQUcsSUFBSSw2QkFBYSxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMvRCxDQUFDO0NBQ0Y7QUFkRCxnQ0FjQzs7Ozs7Ozs7Ozs7Ozs7QUNqQkQ7OztHQUdHO0FBQ0gsTUFBYSxpQkFBaUI7SUFDNUIsWUFBMkIsZUFBNkM7UUFBN0Msb0JBQWUsR0FBZixlQUFlLENBQThCO0lBQUcsQ0FBQztJQUU1RSxJQUFXLElBQUk7UUFDYixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDO0lBQ25DLENBQUM7SUFFRCxJQUFXLEVBQUU7UUFDWCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFFRCxJQUFXLFNBQVM7UUFDbEIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQztJQUN4QyxDQUFDO0lBRUQsSUFBVyxJQUFJO1FBQ2IsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQztJQUNuQyxDQUFDO0NBQ0Y7QUFsQkQsOENBa0JDOzs7Ozs7Ozs7Ozs7OztBQ3hCRCxnS0FLMkM7QUFDM0MsMEpBQThEO0FBRTlELHFHQUFxRztBQUNyRyxTQUFTLFFBQVEsQ0FBQyxVQUFrQjtJQUNsQyxJQUFJO1FBQ0YsT0FBTyxVQUFVLENBQUMsSUFBSSxLQUFLLFVBQVUsQ0FBQyxNQUFNLENBQUM7S0FDOUM7SUFBQyxPQUFPLENBQUMsRUFBRTtRQUNWLE9BQU8sSUFBSSxDQUFDO0tBQ2I7QUFDSCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IscUJBQXFCLENBQ25DLFVBQWtCLEVBQ2xCLHVCQUErQyxFQUMvQyxPQUE4QjtJQUU5QixPQUFPLElBQUksT0FBTyxDQUF3QyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUM1RSxJQUFJLE1BQWMsQ0FBQztRQUVuQix1RUFBdUU7UUFDdkUsaUZBQWlGO1FBQ2pGLDBGQUEwRjtRQUMxRixJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ3pCLE1BQU0sR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDO1NBQzVCO2FBQU07WUFDTCxNQUFNLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQztTQUM1QjtRQUVELElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDWCxNQUFNLENBQUMsa0dBQWtHLENBQUMsQ0FBQztTQUM1RztRQUVELHlGQUF5RjtRQUN6Riw4RkFBOEY7UUFDOUYsdUZBQXVGO1FBQ3ZGLE1BQU0sU0FBUyxHQUFHLElBQUksOENBQW1CLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztRQUVuRSxnRUFBZ0U7UUFDaEUsTUFBTSxxQkFBcUIsR0FBRyxTQUFTLENBQUMsNEJBQTRCLENBQUMsdUJBQXVCLEVBQUUsNENBQW1CLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFNUgsMEdBQTBHO1FBQzFHLGdFQUFnRTtRQUNoRSxTQUFTLENBQUMsZ0NBQWdDLENBQUMsVUFBVSxHQUEyQjtZQUM5RSwrREFBK0Q7WUFDL0QsSUFBSSxHQUFHLENBQUMsV0FBVyxLQUFLLHFCQUFxQixDQUFDLFdBQVcsRUFBRTtnQkFDekQsK0VBQStFO2dCQUMvRSwwRUFBMEU7Z0JBQzFFLE1BQU0saUJBQWlCLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSwyQ0FBb0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDcEUsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUM7YUFDNUI7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILHVGQUF1RjtRQUN2RixTQUFTLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDM0IscUJBQXFCLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDL0IsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBN0NELHNEQTZDQzs7Ozs7Ozs7Ozs7Ozs7QUN0RUQsMkpBQXdFO0FBY3hFOzs7O0dBSUc7QUFDSCxNQUFhLG9CQUFvQjtJQVMvQjs7O09BR0c7SUFDSCxZQUEyQixVQUFxQjtRQUFyQixlQUFVLEdBQVYsVUFBVSxDQUFXO1FBWmhELHlIQUF5SDtRQUN6SCxvREFBb0Q7UUFDNUMscUJBQWdCLEdBQ3RCLEVBQUUsQ0FBQztRQUVMLDBGQUEwRjtRQUNsRiwwQkFBcUIsR0FBK0IsRUFBRSxDQUFDO1FBTzdELElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ3BCLE1BQU0sMEJBQTBCLENBQUM7U0FDbEM7UUFFRCwrRkFBK0Y7UUFDL0YsSUFBSSxDQUFDLFVBQVUsQ0FBQyxnQ0FBZ0MsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDcEYsSUFBSSxDQUFDLFVBQVUsQ0FBQyw2QkFBNkIsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ2hGLENBQUM7SUFFRCxpREFBaUQ7SUFFMUMsT0FBTyxDQUFDLElBQVksRUFBRSxVQUE2QjtRQUN4RCxtRkFBbUY7UUFDbkYsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDaEYsTUFBTSxPQUFPLEdBQUcsSUFBSSxPQUFPLENBQWtCLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQy9ELDJGQUEyRjtZQUMzRixrRUFBa0U7WUFDbEUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDO1FBQzVGLENBQUMsQ0FBQyxDQUFDO1FBRUgsbURBQW1EO1FBQ25ELGVBQWUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN2QixPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRU0sMkJBQTJCLENBQUMsT0FBNEI7UUFDN0QsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRU0sNkJBQTZCLENBQUMsT0FBNEI7UUFDL0QsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxPQUFPLENBQUMsQ0FBQztJQUN2RixDQUFDO0lBRUQsK0NBQStDO0lBRXZDLGlCQUFpQixDQUFDLFFBQWdDO1FBQ3hELDJFQUEyRTtRQUMzRSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDeEUsT0FBTyxDQUFDLDJEQUEyRDtTQUNwRTtRQUVELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFbkUsa0RBQWtEO1FBQ2xELElBQUksUUFBUSxDQUFDLEtBQUssRUFBRTtZQUNsQixjQUFjLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN2QztRQUVELCtDQUErQztRQUMvQyxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUU7WUFDakIsY0FBYyxDQUFDLE9BQU8sQ0FBQyxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztTQUNuRDtRQUVELHVDQUF1QztRQUN2QyxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVPLGNBQWMsQ0FBQyxtQkFBd0M7UUFDN0QsbUdBQW1HO1FBQ25HLEtBQUssTUFBTSxPQUFPLElBQUksSUFBSSxDQUFDLHFCQUFxQixFQUFFO1lBQ2hELElBQUk7Z0JBQ0YsT0FBTyxDQUFDLEVBQUUsY0FBYyxFQUFFLG1CQUFtQixDQUFDLGNBQWMsRUFBRSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQzthQUNqRztZQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUNWLDREQUE0RDtnQkFDNUQsSUFBSyxDQUFrQixDQUFDLFNBQVMsS0FBSyw4Q0FBbUIsQ0FBQyx3QkFBd0IsRUFBRTtvQkFDbEYsTUFBTSxDQUFDLENBQUM7aUJBQ1Q7Z0JBQ0QsMEVBQTBFO2FBQzNFO1NBQ0Y7SUFDSCxDQUFDO0NBQ0Y7QUFyRkQsb0RBcUZDOzs7Ozs7Ozs7Ozs7OztBQ3JHRCxNQUFhLFVBQVU7SUFDckIsWUFBMkIsZUFBK0I7UUFBL0Isb0JBQWUsR0FBZixlQUFlLENBQWdCO0lBQUcsQ0FBQztJQUU5RCxJQUFXLElBQUk7UUFDYixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDO0lBQ25DLENBQUM7SUFFRCxJQUFXLEVBQUU7UUFDWCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFFRCxJQUFXLE1BQU07UUFDZixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDO0lBQ3JDLENBQUM7SUFFRCxJQUFXLGlCQUFpQjtRQUMxQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUM7SUFDaEQsQ0FBQztJQUVELElBQVcsU0FBUztRQUNsQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDO0lBQ3hDLENBQUM7SUFFRCxJQUFXLFdBQVc7UUFDcEIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQztJQUMxQyxDQUFDO0lBRU0sWUFBWTtRQUNqQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDN0MsQ0FBQztJQUVNLFlBQVk7UUFDakIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzdDLENBQUM7SUFFTSxvQkFBb0I7UUFDekIsT0FBTyxDQUFDLElBQUksQ0FBQyw2RkFBNkYsQ0FBQyxDQUFDO1FBQzVHLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQ3JELENBQUM7SUFFTSwyQkFBMkI7UUFDaEMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLDJCQUEyQixFQUFFLENBQUM7SUFDNUQsQ0FBQztJQUVNLHNCQUFzQixDQUFDLE9BQWtEO1FBQzlFLE9BQU8sQ0FBQyxJQUFJLENBQ1YsOERBQThEO1lBQzVELDJFQUEyRSxDQUM5RSxDQUFDO1FBQ0YsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFTSxxQkFBcUI7UUFDMUIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLHFCQUFxQixFQUFFLENBQUM7SUFDdEQsQ0FBQztJQUVNLHdCQUF3QixDQUFDLGNBQXNCLEVBQUUsT0FBa0Q7UUFDeEcsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLHdCQUF3QixDQUFDLGNBQWMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNoRixDQUFDO0lBRU0sOEJBQThCLENBQ25DLGNBQXNCLEVBQ3RCLFlBQXFCLEVBQ3JCLE9BQWtEO1FBRWxELE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyw4QkFBOEIsQ0FBQyxjQUFjLEVBQUUsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3BHLENBQUM7Q0FDRjtBQW5FRCxnQ0FtRUM7Ozs7Ozs7Ozs7Ozs7O0FDdEVELDJKQVcyQztBQUMzQyxnS0FTMkM7QUFDM0MsdUlBQXVEO0FBRXZELHdGQUF3RjtBQUN4Rjs7O0dBR0c7QUFDSCxNQUFhLDhCQUE4Qjs7QUFBM0Msd0VBcUVDO0FBcEVlLCtDQUFnQixHQUFHLElBQUksNkJBQWEsQ0FBeUM7SUFDekYsQ0FBQywyQ0FBa0IsQ0FBQyxRQUFRLENBQUMsRUFBRSwyQ0FBa0IsQ0FBQyxRQUFRO0lBQzFELENBQUMsMkNBQWtCLENBQUMsUUFBUSxDQUFDLEVBQUUsMkNBQWtCLENBQUMsUUFBUTtDQUMzRCxDQUFDLENBQUM7QUFFVywwQ0FBVyxHQUFHLElBQUksNkJBQWEsQ0FBeUM7SUFDcEYsQ0FBQywyQ0FBa0IsQ0FBQyxTQUFTLENBQUMsRUFBRSwyQ0FBa0IsQ0FBQyxTQUFTO0lBQzVELENBQUMsMkNBQWtCLENBQUMsYUFBYSxDQUFDLEVBQUUsMkNBQWtCLENBQUMsYUFBYTtJQUNwRSxDQUFDLDJDQUFrQixDQUFDLFVBQVUsQ0FBQyxFQUFFLDJDQUFrQixDQUFDLFVBQVU7Q0FDL0QsQ0FBQyxDQUFDO0FBRVcsK0NBQWdCLEdBQUcsSUFBSSw2QkFBYSxDQUFxRDtJQUNyRyxDQUFDLDJDQUF3QixDQUFDLEdBQUcsQ0FBQyxFQUFFLDJDQUF3QixDQUFDLEdBQUc7SUFDNUQsQ0FBQywyQ0FBd0IsQ0FBQyxHQUFHLENBQUMsRUFBRSwyQ0FBd0IsQ0FBQyxHQUFHO0lBQzVELENBQUMsMkNBQXdCLENBQUMsTUFBTSxDQUFDLEVBQUUsMkNBQXdCLENBQUMsTUFBTTtJQUNsRSxDQUFDLDJDQUF3QixDQUFDLE9BQU8sQ0FBQyxFQUFFLDJDQUF3QixDQUFDLE9BQU87Q0FDckUsQ0FBQyxDQUFDO0FBRVcsZ0RBQWlCLEdBQUcsSUFBSSw2QkFBYSxDQUE4QjtJQUMvRSxDQUFDLDZDQUFrQixDQUFDLElBQUksQ0FBQyxFQUFFLElBQUk7SUFDL0IsQ0FBQyw2Q0FBa0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLO0NBQ2pDLENBQUMsQ0FBQztBQUVXLGlEQUFrQixHQUFHLElBQUksNkJBQWEsQ0FBMEI7SUFDNUUseUNBQXlDO0lBQ3pDLHNGQUFzRjtJQUN0RixDQUFDLDBDQUFlLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRztJQUMzQixDQUFDLDBDQUFlLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRztJQUM3QixDQUFDLDBDQUFlLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRztDQUM1QixDQUFDLENBQUM7QUFFVyx3Q0FBUyxHQUFHLElBQUksNkJBQWEsQ0FBdUM7SUFDaEYsQ0FBQyxvQ0FBaUIsQ0FBQyxTQUFTLENBQUMsRUFBRSxvQ0FBaUIsQ0FBQyxTQUFTO0lBQzFELENBQUMsb0NBQWlCLENBQUMsU0FBUyxDQUFDLEVBQUUsb0NBQWlCLENBQUMsU0FBUztJQUMxRCxDQUFDLG9DQUFpQixDQUFDLEtBQUssQ0FBQyxFQUFFLG9DQUFpQixDQUFDLEtBQUs7Q0FDbkQsQ0FBQyxDQUFDO0FBRVcsc0RBQXVCLEdBQUcsSUFBSSw2QkFBYSxDQUFrRDtJQUN6RyxDQUFDLGtEQUF1QixDQUFDLFNBQVMsQ0FBQyxFQUFFLGlEQUFzQixDQUFDLHdCQUF3QjtJQUNwRixDQUFDLGtEQUF1QixDQUFDLGdCQUFnQixDQUFDLEVBQUUsaURBQXNCLENBQUMsZ0JBQWdCO0lBQ25GLENBQUMsa0RBQXVCLENBQUMsbUJBQW1CLENBQUMsRUFBRSxpREFBc0IsQ0FBQyxtQkFBbUI7Q0FDMUYsQ0FBQyxDQUFDO0FBRVcseUNBQVUsR0FBRyxJQUFJLDZCQUFhLENBQTZCO0lBQ3ZFLENBQUMscUNBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRSx5Q0FBYyxDQUFDLEtBQUs7SUFDeEMsQ0FBQyxxQ0FBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLHlDQUFjLENBQUMsUUFBUTtJQUM5QyxDQUFDLHFDQUFVLENBQUMsTUFBTSxDQUFDLEVBQUUseUNBQWMsQ0FBQyxNQUFNO0lBQzFDLENBQUMscUNBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRSx5Q0FBYyxDQUFDLEtBQUs7SUFDeEMsQ0FBQyxxQ0FBVSxDQUFDLElBQUksQ0FBQyxFQUFFLHlDQUFjLENBQUMsSUFBSTtJQUN0QyxDQUFDLHFDQUFVLENBQUMsS0FBSyxDQUFDLEVBQUUseUNBQWMsQ0FBQyxLQUFLO0lBQ3hDLENBQUMscUNBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSx5Q0FBYyxDQUFDLE9BQU87SUFDNUMsQ0FBQyxxQ0FBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLHlDQUFjLENBQUMsT0FBTztDQUM3QyxDQUFDLENBQUM7QUFFVyw0Q0FBYSxHQUFHLElBQUksNkJBQWEsQ0FBK0M7SUFDNUYsQ0FBQyx3Q0FBcUIsQ0FBQyxJQUFJLENBQUMsRUFBRSx3Q0FBcUIsQ0FBQyxJQUFJO0lBQ3hELENBQUMsd0NBQXFCLENBQUMsS0FBSyxDQUFDLEVBQUUsd0NBQXFCLENBQUMsS0FBSztJQUMxRCxDQUFDLHdDQUFxQixDQUFDLElBQUksQ0FBQyxFQUFFLHdDQUFxQixDQUFDLElBQUk7SUFDeEQsQ0FBQyx3Q0FBcUIsQ0FBQyxLQUFLLENBQUMsRUFBRSx3Q0FBcUIsQ0FBQyxLQUFLO0lBQzFELENBQUMsd0NBQXFCLENBQUMsT0FBTyxDQUFDLEVBQUUsd0NBQXFCLENBQUMsT0FBTztJQUM5RCxDQUFDLHdDQUFxQixDQUFDLE1BQU0sQ0FBQyxFQUFFLHdDQUFxQixDQUFDLE1BQU07Q0FDN0QsQ0FBQyxDQUFDO0FBRVcsMkNBQVksR0FBRyxJQUFJLDZCQUFhLENBQTJDO0lBQ3ZGLENBQUMsc0NBQW1CLENBQUMsTUFBTSxDQUFDLEVBQUUsc0NBQW1CLENBQUMsTUFBTTtJQUN4RCxDQUFDLHNDQUFtQixDQUFDLEtBQUssQ0FBQyxFQUFFLHNDQUFtQixDQUFDLEtBQUs7SUFDdEQsQ0FBQyxzQ0FBbUIsQ0FBQyxRQUFRLENBQUMsRUFBRSxzQ0FBbUIsQ0FBQyxRQUFRO0NBQzdELENBQUMsQ0FBQztBQUVMLDJCQUEyQjs7Ozs7Ozs7Ozs7Ozs7QUNuRzNCLDJKQW1CMkM7QUFDM0MsZ0tBbUIyQztBQUMzQyx1SUFBdUQ7QUFFdkQsd0ZBQXdGO0FBQ3hGOzs7R0FHRztBQUNILE1BQWEsOEJBQThCOztBQUEzQyx3RUE0TUM7QUEzTWUsK0NBQWdCLEdBQUcsSUFBSSw2QkFBYSxDQUF1RDtJQUN2RyxDQUFDLDJDQUF5QixDQUFDLE9BQU8sQ0FBQyxFQUFFLDJDQUF5QixDQUFDLE9BQU87SUFDdEUsQ0FBQywyQ0FBeUIsQ0FBQyxNQUFNLENBQUMsRUFBRSwyQ0FBeUIsQ0FBQyxNQUFNO0lBQ3BFLENBQUMsMkNBQXlCLENBQUMsU0FBUyxDQUFDLEVBQUUsMkNBQXlCLENBQUMsU0FBUztJQUMxRSxDQUFDLDJDQUF5QixDQUFDLGFBQWEsQ0FBQyxFQUFFLDJDQUF5QixDQUFDLGFBQWE7SUFDbEYsQ0FBQywyQ0FBeUIsQ0FBQyxLQUFLLENBQUMsRUFBRSwyQ0FBeUIsQ0FBQyxLQUFLO0NBQ25FLENBQUMsQ0FBQztBQUVXLDRDQUFhLEdBQUcsSUFBSSw2QkFBYSxDQUFpRDtJQUM5RixDQUFDLHdDQUFzQixDQUFDLFNBQVMsQ0FBQyxFQUFFLHdDQUFzQixDQUFDLFNBQVM7SUFDcEUsQ0FBQyx3Q0FBc0IsQ0FBQyxPQUFPLENBQUMsRUFBRSx3Q0FBc0IsQ0FBQyxPQUFPO0NBQ2pFLENBQUMsQ0FBQztBQUVXLHlDQUFVLEdBQUcsSUFBSSw2QkFBYSxDQUF5QztJQUNuRixDQUFDLHFDQUFrQixDQUFDLFVBQVUsQ0FBQyxFQUFFLHFDQUFrQixDQUFDLFVBQVU7SUFDOUQsQ0FBQyxxQ0FBa0IsQ0FBQyxRQUFRLENBQUMsRUFBRSxxQ0FBa0IsQ0FBQyxRQUFRO0lBQzFELENBQUMscUNBQWtCLENBQUMsT0FBTyxDQUFDLEVBQUUscUNBQWtCLENBQUMsT0FBTztDQUN6RCxDQUFDLENBQUM7QUFFVyxtREFBb0IsR0FBRyxJQUFJLDZCQUFhLENBQTZEO0lBQ2pILENBQUMsK0NBQTRCLENBQUMsSUFBSSxDQUFDLEVBQUUsK0NBQTRCLENBQUMsSUFBSTtJQUN0RSxDQUFDLCtDQUE0QixDQUFDLEdBQUcsQ0FBQyxFQUFFLCtDQUE0QixDQUFDLEdBQUc7SUFDcEUsQ0FBQywrQ0FBNEIsQ0FBQyxPQUFPLENBQUMsRUFBRSwrQ0FBNEIsQ0FBQyxPQUFPO0lBQzVFLENBQUMsK0NBQTRCLENBQUMsS0FBSyxDQUFDLEVBQUUsK0NBQTRCLENBQUMsS0FBSztJQUN4RSxDQUFDLCtDQUE0QixDQUFDLE1BQU0sQ0FBQyxFQUFFLCtDQUE0QixDQUFDLE1BQU07SUFDMUUsQ0FBQywrQ0FBNEIsQ0FBQyxHQUFHLENBQUMsRUFBRSwrQ0FBNEIsQ0FBQyxHQUFHO0lBQ3BFLENBQUMsK0NBQTRCLENBQUMsR0FBRyxDQUFDLEVBQUUsK0NBQTRCLENBQUMsR0FBRztJQUNwRSxDQUFDLCtDQUE0QixDQUFDLElBQUksQ0FBQyxFQUFFLCtDQUE0QixDQUFDLElBQUk7SUFDdEUsQ0FBQywrQ0FBNEIsQ0FBQyxLQUFLLENBQUMsRUFBRSwrQ0FBNEIsQ0FBQyxLQUFLO0lBQ3hFLENBQUMsK0NBQTRCLENBQUMsUUFBUSxDQUFDLEVBQUUsK0NBQTRCLENBQUMsUUFBUTtJQUM5RSxDQUFDLCtDQUE0QixDQUFDLEdBQUcsQ0FBQyxFQUFFLCtDQUE0QixDQUFDLEdBQUc7SUFDcEUsQ0FBQywrQ0FBNEIsQ0FBQyxHQUFHLENBQUMsRUFBRSwrQ0FBNEIsQ0FBQyxHQUFHO0lBQ3BFLENBQUMsK0NBQTRCLENBQUMsTUFBTSxDQUFDLEVBQUUsK0NBQTRCLENBQUMsTUFBTTtJQUMxRSxDQUFDLCtDQUE0QixDQUFDLEdBQUcsQ0FBQyxFQUFFLCtDQUE0QixDQUFDLEdBQUc7SUFDcEUsQ0FBQywrQ0FBNEIsQ0FBQyxNQUFNLENBQUMsRUFBRSwrQ0FBNEIsQ0FBQyxNQUFNO0lBQzFFLENBQUMsK0NBQTRCLENBQUMsU0FBUyxDQUFDLEVBQUUsK0NBQTRCLENBQUMsU0FBUztJQUNoRixDQUFDLCtDQUE0QixDQUFDLElBQUksQ0FBQyxFQUFFLCtDQUE0QixDQUFDLElBQUk7SUFDdEUsQ0FBQywrQ0FBNEIsQ0FBQyxHQUFHLENBQUMsRUFBRSwrQ0FBNEIsQ0FBQyxHQUFHO0lBQ3BFLENBQUMsK0NBQTRCLENBQUMsTUFBTSxDQUFDLEVBQUUsK0NBQTRCLENBQUMsTUFBTTtJQUMxRSxDQUFDLCtDQUE0QixDQUFDLE1BQU0sQ0FBQyxFQUFFLCtDQUE0QixDQUFDLE1BQU07SUFDMUUsQ0FBQywrQ0FBNEIsQ0FBQyxNQUFNLENBQUMsRUFBRSwrQ0FBNEIsQ0FBQyxNQUFNO0lBQzFFLENBQUMsK0NBQTRCLENBQUMsUUFBUSxDQUFDLEVBQUUsK0NBQTRCLENBQUMsUUFBUTtJQUM5RSxDQUFDLCtDQUE0QixDQUFDLEtBQUssQ0FBQyxFQUFFLCtDQUE0QixDQUFDLEtBQUs7SUFDeEUsQ0FBQywrQ0FBNEIsQ0FBQyxNQUFNLENBQUMsRUFBRSwrQ0FBNEIsQ0FBQyxNQUFNO0lBQzFFLENBQUMsK0NBQTRCLENBQUMsR0FBRyxDQUFDLEVBQUUsK0NBQTRCLENBQUMsR0FBRztJQUNwRSxDQUFDLCtDQUE0QixDQUFDLFFBQVEsQ0FBQyxFQUFFLCtDQUE0QixDQUFDLFFBQVE7SUFDOUUsQ0FBQywrQ0FBNEIsQ0FBQyxTQUFTLENBQUMsRUFBRSwrQ0FBNEIsQ0FBQyxTQUFTO0lBQ2hGLENBQUMsK0NBQTRCLENBQUMsV0FBVyxDQUFDLEVBQUUsK0NBQTRCLENBQUMsV0FBVztJQUNwRixDQUFDLCtDQUE0QixDQUFDLFVBQVUsQ0FBQyxFQUFFLCtDQUE0QixDQUFDLFVBQVU7SUFDbEYsQ0FBQywrQ0FBNEIsQ0FBQyxRQUFRLENBQUMsRUFBRSwrQ0FBNEIsQ0FBQyxRQUFRO0lBQzlFLENBQUMsK0NBQTRCLENBQUMsV0FBVyxDQUFDLEVBQUUsK0NBQTRCLENBQUMsV0FBVztJQUNwRixDQUFDLCtDQUE0QixDQUFDLFNBQVMsQ0FBQyxFQUFFLCtDQUE0QixDQUFDLFNBQVM7SUFDaEYsQ0FBQywrQ0FBNEIsQ0FBQyxTQUFTLENBQUMsRUFBRSwrQ0FBNEIsQ0FBQyxTQUFTO0lBQ2hGLENBQUMsK0NBQTRCLENBQUMsSUFBSSxDQUFDLEVBQUUsK0NBQTRCLENBQUMsSUFBSTtJQUN0RSxDQUFDLCtDQUE0QixDQUFDLEdBQUcsQ0FBQyxFQUFFLCtDQUE0QixDQUFDLEdBQUc7SUFDcEUsQ0FBQywrQ0FBNEIsQ0FBQyxJQUFJLENBQUMsRUFBRSwrQ0FBNEIsQ0FBQyxJQUFJO0lBQ3RFLENBQUMsK0NBQTRCLENBQUMsSUFBSSxDQUFDLEVBQUUsK0NBQTRCLENBQUMsSUFBSTtJQUN0RSxDQUFDLCtDQUE0QixDQUFDLE9BQU8sQ0FBQyxFQUFFLCtDQUE0QixDQUFDLE9BQU87SUFDNUUsQ0FBQywrQ0FBNEIsQ0FBQyxJQUFJLENBQUMsRUFBRSwrQ0FBNEIsQ0FBQyxJQUFJO0NBQ3ZFLENBQUMsQ0FBQztBQUVXLDRDQUFhLEdBQUcsSUFBSSw2QkFBYSxDQUErQztJQUM1RixDQUFDLHdDQUFxQixDQUFDLFNBQVMsQ0FBQyxFQUFFLHdDQUFxQixDQUFDLFNBQVM7SUFDbEUsQ0FBQyx3Q0FBcUIsQ0FBQyxPQUFPLENBQUMsRUFBRSx3Q0FBcUIsQ0FBQyxPQUFPO0lBQzlELENBQUMsd0NBQXFCLENBQUMsT0FBTyxDQUFDLEVBQUUsd0NBQXFCLENBQUMsT0FBTztDQUMvRCxDQUFDLENBQUM7QUFFVyx3Q0FBUyxHQUFHLElBQUksNkJBQWEsQ0FBdUM7SUFDaEYsQ0FBQyxvQ0FBaUIsQ0FBQyxTQUFTLENBQUMsRUFBRSxvQ0FBaUIsQ0FBQyxTQUFTO0lBQzFELENBQUMsb0NBQWlCLENBQUMsS0FBSyxDQUFDLEVBQUUsb0NBQWlCLENBQUMsS0FBSztJQUNsRCxDQUFDLG9DQUFpQixDQUFDLFNBQVMsQ0FBQyxFQUFFLG9DQUFpQixDQUFDLFNBQVM7Q0FDM0QsQ0FBQyxDQUFDO0FBRVcsa0RBQW1CLEdBQUcsSUFBSSw2QkFBYSxDQUEyRDtJQUM5RyxDQUFDLDhDQUEyQixDQUFDLFNBQVMsQ0FBQyxFQUFFLDhDQUEyQixDQUFDLFNBQVM7SUFDOUUsQ0FBQyw4Q0FBMkIsQ0FBQyxLQUFLLENBQUMsRUFBRSw4Q0FBMkIsQ0FBQyxLQUFLO0lBQ3RFLENBQUMsOENBQTJCLENBQUMsS0FBSyxDQUFDLEVBQUUsOENBQTJCLENBQUMsS0FBSztJQUN0RSxDQUFDLDhDQUEyQixDQUFDLE1BQU0sQ0FBQyxFQUFFLDhDQUEyQixDQUFDLE1BQU07SUFDeEUsQ0FBQyw4Q0FBMkIsQ0FBQyxVQUFVLENBQUMsRUFBRSw4Q0FBMkIsQ0FBQyxVQUFVO0lBQ2hGLENBQUMsOENBQTJCLENBQUMsZ0JBQWdCLENBQUMsRUFBRSw4Q0FBMkIsQ0FBQyxnQkFBZ0I7SUFDNUYsQ0FBQyw4Q0FBMkIsQ0FBQyxXQUFXLENBQUMsRUFBRSw4Q0FBMkIsQ0FBQyxXQUFXO0lBQ2xGLENBQUMsOENBQTJCLENBQUMsSUFBSSxDQUFDLEVBQUUsOENBQTJCLENBQUMsSUFBSTtJQUNwRSxDQUFDLDhDQUEyQixDQUFDLEtBQUssQ0FBQyxFQUFFLDhDQUEyQixDQUFDLEtBQUs7SUFDdEUsQ0FBQyw4Q0FBMkIsQ0FBQyxPQUFPLENBQUMsRUFBRSw4Q0FBMkIsQ0FBQyxPQUFPO0lBQzFFLENBQUMsOENBQTJCLENBQUMsU0FBUyxDQUFDLEVBQUUsOENBQTJCLENBQUMsU0FBUztDQUMvRSxDQUFDLENBQUM7QUFFVyx1Q0FBUSxHQUFHLElBQUksNkJBQWEsQ0FBcUM7SUFDN0UsQ0FBQyxtQ0FBZ0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxtQ0FBZ0IsQ0FBQyxJQUFJO0lBQzlDLENBQUMsbUNBQWdCLENBQUMsSUFBSSxDQUFDLEVBQUUsbUNBQWdCLENBQUMsSUFBSTtJQUM5QyxDQUFDLG1DQUFnQixDQUFDLFFBQVEsQ0FBQyxFQUFFLG1DQUFnQixDQUFDLFFBQVE7SUFDdEQsQ0FBQyxtQ0FBZ0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxtQ0FBZ0IsQ0FBQyxLQUFLO0lBQ2hELENBQUMsbUNBQWdCLENBQUMsR0FBRyxDQUFDLEVBQUUsbUNBQWdCLENBQUMsR0FBRztJQUM1QyxDQUFDLG1DQUFnQixDQUFDLE9BQU8sQ0FBQyxFQUFFLG1DQUFnQixDQUFDLE9BQU87SUFDcEQsQ0FBQyxtQ0FBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxtQ0FBZ0IsQ0FBQyxNQUFNO0NBQ25ELENBQUMsQ0FBQztBQUVXLCtDQUFnQixHQUFHLElBQUksNkJBQWEsQ0FBcUQ7SUFDckcsQ0FBQywyQ0FBd0IsQ0FBQyxHQUFHLENBQUMsRUFBRSwyQ0FBd0IsQ0FBQyxHQUFHO0lBQzVELENBQUMsMkNBQXdCLENBQUMsR0FBRyxDQUFDLEVBQUUsMkNBQXdCLENBQUMsR0FBRztJQUM1RCxDQUFDLDJDQUF3QixDQUFDLE1BQU0sQ0FBQyxFQUFFLDJDQUF3QixDQUFDLE1BQU07SUFDbEUsQ0FBQywyQ0FBd0IsQ0FBQyxPQUFPLENBQUMsRUFBRSwyQ0FBd0IsQ0FBQyxPQUFPO0NBQ3JFLENBQUMsQ0FBQztBQUVXLDhDQUFlLEdBQUcsSUFBSSw2QkFBYSxDQUE0RDtJQUMzRyxDQUFDLGdEQUE2QixDQUFDLEdBQUcsQ0FBQyxFQUFFLDZDQUEwQixDQUFDLEdBQUc7SUFDbkUsQ0FBQyxnREFBNkIsQ0FBQyxJQUFJLENBQUMsRUFBRSw2Q0FBMEIsQ0FBQyxJQUFJO0lBQ3JFLENBQUMsZ0RBQTZCLENBQUMsS0FBSyxDQUFDLEVBQUUsNkNBQTBCLENBQUMsS0FBSztDQUN4RSxDQUFDLENBQUM7QUFFVyw2Q0FBYyxHQUFHLElBQUksNkJBQWEsQ0FBNkM7SUFDM0YsQ0FBQyx5Q0FBc0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxxQ0FBa0IsQ0FBQyxLQUFLO0lBQ3hELENBQUMseUNBQXNCLENBQUMsUUFBUSxDQUFDLEVBQUUscUNBQWtCLENBQUMsUUFBUTtJQUM5RCxDQUFDLHlDQUFzQixDQUFDLE1BQU0sQ0FBQyxFQUFFLHFDQUFrQixDQUFDLE1BQU07SUFDMUQsQ0FBQyx5Q0FBc0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxxQ0FBa0IsQ0FBQyxLQUFLO0lBQ3hELENBQUMseUNBQXNCLENBQUMsSUFBSSxDQUFDLEVBQUUscUNBQWtCLENBQUMsSUFBSTtJQUN0RCxDQUFDLHlDQUFzQixDQUFDLEtBQUssQ0FBQyxFQUFFLHFDQUFrQixDQUFDLEtBQUs7SUFDeEQsQ0FBQyx5Q0FBc0IsQ0FBQyxPQUFPLENBQUMsRUFBRSxxQ0FBa0IsQ0FBQyxPQUFPO0lBQzVELENBQUMseUNBQXNCLENBQUMsT0FBTyxDQUFDLEVBQUUscUNBQWtCLENBQUMsT0FBTztDQUM3RCxDQUFDLENBQUM7QUFFVyw0Q0FBYSxHQUFHLElBQUksNkJBQWEsQ0FBK0M7SUFDNUYsQ0FBQyx3Q0FBcUIsQ0FBQyxPQUFPLENBQUMsRUFBRSx3Q0FBcUIsQ0FBQyxPQUFPO0lBQzlELENBQUMsd0NBQXFCLENBQUMsSUFBSSxDQUFDLEVBQUUsd0NBQXFCLENBQUMsSUFBSTtJQUN4RCxDQUFDLHdDQUFxQixDQUFDLEtBQUssQ0FBQyxFQUFFLHdDQUFxQixDQUFDLEtBQUs7SUFDMUQsQ0FBQyx3Q0FBcUIsQ0FBQyxJQUFJLENBQUMsRUFBRSx3Q0FBcUIsQ0FBQyxJQUFJO0lBQ3hELENBQUMsd0NBQXFCLENBQUMsS0FBSyxDQUFDLEVBQUUsd0NBQXFCLENBQUMsS0FBSztJQUMxRCxDQUFDLHdDQUFxQixDQUFDLE1BQU0sQ0FBQyxFQUFFLHdDQUFxQixDQUFDLE1BQU07Q0FDN0QsQ0FBQyxDQUFDO0FBRVcsd0NBQVMsR0FBRyxJQUFJLDZCQUFhLENBQ3pDO0lBQ0UsQ0FBQyxxQ0FBa0IsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLHFDQUFrQixDQUFDLGFBQWE7SUFDM0UsQ0FBQyxxQ0FBa0IsQ0FBQyxjQUFjLENBQUMsRUFBRSxxQ0FBa0IsQ0FBQyxhQUFhO0lBQ3JFLENBQUMscUNBQWtCLENBQUMsb0JBQW9CLENBQUMsRUFBRSxxQ0FBa0IsQ0FBQyxhQUFhO0lBQzNFLENBQUMscUNBQWtCLENBQUMsaUJBQWlCLENBQUMsRUFBRSxxQ0FBa0IsQ0FBQyxhQUFhO0lBQ3hFLENBQUMscUNBQWtCLENBQUMsaUJBQWlCLENBQUMsRUFBRSxxQ0FBa0IsQ0FBQyxhQUFhO0lBQ3hFLENBQUMscUNBQWtCLENBQUMsd0JBQXdCLENBQUMsRUFBRSxxQ0FBa0IsQ0FBQyxhQUFhO0lBQy9FLENBQUMscUNBQWtCLENBQUMsZUFBZSxDQUFDLEVBQUUscUNBQWtCLENBQUMsYUFBYTtJQUN0RSxDQUFDLHFDQUFrQixDQUFDLHNCQUFzQixDQUFDLEVBQUUscUNBQWtCLENBQUMsaUJBQWlCO0lBQ2pGLENBQUMscUNBQWtCLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxxQ0FBa0IsQ0FBQyxlQUFlO0NBQzFFLEVBQ0QscUNBQWtCLENBQUMsYUFBYSxDQUNqQyxDQUFDO0FBRVkseUNBQVUsR0FBRyxJQUFJLDZCQUFhLENBQXlDO0lBQ25GLENBQUMscUNBQWtCLENBQUMsV0FBVyxDQUFDLEVBQUUscUNBQWtCLENBQUMsV0FBVztJQUNoRSxDQUFDLHFDQUFrQixDQUFDLEtBQUssQ0FBQyxFQUFFLHFDQUFrQixDQUFDLEtBQUs7SUFDcEQsQ0FBQyxxQ0FBa0IsQ0FBQyxZQUFZLENBQUMsRUFBRSxxQ0FBa0IsQ0FBQyxZQUFZO0lBQ2xFLENBQUMscUNBQWtCLENBQUMsWUFBWSxDQUFDLEVBQUUscUNBQWtCLENBQUMsWUFBWTtDQUNuRSxDQUFDLENBQUM7QUFFVywyQ0FBWSxHQUFHLElBQUksNkJBQWEsQ0FBNkM7SUFDekYsZ0RBQXFDLEVBQUUsdUNBQW9CLENBQUMsY0FBYztJQUMxRSx3Q0FBaUMsRUFBRSx1Q0FBb0IsQ0FBQyxVQUFVO0lBQ2xFLGlDQUE4QixFQUFFLHVDQUFvQixDQUFDLE9BQU87SUFDNUQscUNBQWdDLEVBQUUsdUNBQW9CLENBQUMsU0FBUztJQUNoRSxnREFBcUMsRUFBRSx1Q0FBb0IsQ0FBQyxjQUFjO0lBQzFFLDJCQUEyQixFQUFFLHVDQUFvQixDQUFDLElBQUk7SUFDdEQsMENBQWtDLEVBQUUsdUNBQW9CLENBQUMsV0FBVztJQUNwRSxnREFBcUMsRUFBRSx1Q0FBb0IsQ0FBQyxjQUFjO0lBQzFFLHdHQUF3RztJQUN4RyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsdUNBQW9CLENBQUMsY0FBYztJQUN4RCxDQUFDLGFBQWEsQ0FBQyxFQUFFLHVDQUFvQixDQUFDLFVBQVU7SUFDaEQsQ0FBQyxTQUFTLENBQUMsRUFBRSx1Q0FBb0IsQ0FBQyxPQUFPO0lBQ3pDLENBQUMsV0FBVyxDQUFDLEVBQUUsdUNBQW9CLENBQUMsU0FBUztJQUM3QyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsdUNBQW9CLENBQUMsY0FBYztJQUN4RCxDQUFDLE1BQU0sQ0FBQyxFQUFFLHVDQUFvQixDQUFDLElBQUk7SUFDbkMsQ0FBQyxjQUFjLENBQUMsRUFBRSx1Q0FBb0IsQ0FBQyxXQUFXO0lBQ2xELENBQUMsaUJBQWlCLENBQUMsRUFBRSx1Q0FBb0IsQ0FBQyxjQUFjO0NBQ3pELENBQUMsQ0FBQztBQUVXLDhEQUErQixHQUFHLElBQUksNkJBQWEsQ0FHL0Q7SUFDQSxDQUFDLDBEQUF1QyxDQUFDLFdBQVcsQ0FBQyxFQUFFLDBEQUF1QyxDQUFDLFdBQVc7SUFDMUcsQ0FBQywwREFBdUMsQ0FBQyxZQUFZLENBQUMsRUFBRSwwREFBdUMsQ0FBQyxZQUFZO0lBQzVHLENBQUMsMERBQXVDLENBQUMsWUFBWSxDQUFDLEVBQUUsMERBQXVDLENBQUMsWUFBWTtJQUM1RyxDQUFDLDBEQUF1QyxDQUFDLGVBQWUsQ0FBQyxFQUFFLDBEQUF1QyxDQUFDLGVBQWU7Q0FDbkgsQ0FBQyxDQUFDO0FBRVcsNkNBQWMsR0FBRyxJQUFJLDZCQUFhLENBQWlEO0lBQy9GLENBQUMsdUNBQXNCLENBQUMsSUFBSSxDQUFDLEVBQUUseUNBQXNCLENBQUMsSUFBSTtJQUMxRCxDQUFDLHVDQUFzQixDQUFDLElBQUksQ0FBQyxFQUFFLHlDQUFzQixDQUFDLElBQUk7SUFDMUQsQ0FBQyx1Q0FBc0IsQ0FBQyxLQUFLLENBQUMsRUFBRSx5Q0FBc0IsQ0FBQyxLQUFLO0NBQzdELENBQUMsQ0FBQztBQUVXLHVDQUFRLEdBQUcsSUFBSSw2QkFBYSxDQUFxQztJQUM3RSxDQUFDLG1DQUFnQixDQUFDLElBQUksQ0FBQyxFQUFFLG1DQUFnQixDQUFDLElBQUk7SUFDOUMsQ0FBQyxtQ0FBZ0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxtQ0FBZ0IsQ0FBQyxHQUFHO0lBQzVDLENBQUMsbUNBQWdCLENBQUMsTUFBTSxDQUFDLEVBQUUsbUNBQWdCLENBQUMsTUFBTTtJQUNsRCxDQUFDLG1DQUFnQixDQUFDLFFBQVEsQ0FBQyxFQUFFLG1DQUFnQixDQUFDLFFBQVE7SUFDdEQsQ0FBQyxtQ0FBZ0IsQ0FBQyxPQUFPLENBQUMsRUFBRSxtQ0FBZ0IsQ0FBQyxPQUFPO0lBQ3BELENBQUMsbUNBQWdCLENBQUMsSUFBSSxDQUFDLEVBQUUsbUNBQWdCLENBQUMsSUFBSTtJQUM5QyxDQUFDLG1DQUFnQixDQUFDLEdBQUcsQ0FBQyxFQUFFLG1DQUFnQixDQUFDLEdBQUc7SUFDNUMsQ0FBQyxtQ0FBZ0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxtQ0FBZ0IsQ0FBQyxHQUFHO0lBQzVDLENBQUMsbUNBQWdCLENBQUMsT0FBTyxDQUFDLEVBQUUsbUNBQWdCLENBQUMsT0FBTztJQUNwRCxDQUFDLG1DQUFnQixDQUFDLEtBQUssQ0FBQyxFQUFFLG1DQUFnQixDQUFDLEtBQUs7SUFDaEQsQ0FBQyxtQ0FBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxtQ0FBZ0IsQ0FBQyxNQUFNO0lBQ2xELENBQUMsbUNBQWdCLENBQUMsSUFBSSxDQUFDLEVBQUUsbUNBQWdCLENBQUMsSUFBSTtJQUM5QyxDQUFDLG1DQUFnQixDQUFDLFlBQVksQ0FBQyxFQUFFLG1DQUFnQixDQUFDLFlBQVk7Q0FDL0QsQ0FBQyxDQUFDO0FBRUwsMkJBQTJCOzs7Ozs7Ozs7Ozs7OztBQzNQM0IsMkpBQWlGO0FBRWpGLHVIQUE4QztBQUU5Qzs7O0dBR0c7QUFDSCxNQUFhLG9CQUFvQjtJQUcvQjtRQUNFLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUVNLGdCQUFnQixDQUFDLFNBQTJCLEVBQUUsT0FBdUM7UUFDMUYsSUFBSSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDMUQsTUFBTSxJQUFJLDJCQUFZLENBQUMscUNBQVUsQ0FBQyxvQkFBb0IsRUFBRSw2Q0FBNkMsU0FBUyxFQUFFLENBQUMsQ0FBQztTQUNuSDtRQUVELE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFFTSxtQkFBbUIsQ0FBQyxTQUEyQixFQUFFLE9BQXVDO1FBQzdGLElBQUksQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQzFELE1BQU0sSUFBSSwyQkFBWSxDQUFDLHFDQUFVLENBQUMsb0JBQW9CLEVBQUUsZ0RBQWdELFNBQVMsRUFBRSxDQUFDLENBQUM7U0FDdEg7UUFFRCxPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBRVMsZUFBZSxDQUFDLFlBQWdDO1FBQ3hELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLEdBQUcsWUFBWSxDQUFDO0lBQ3JFLENBQUM7Q0FDRjtBQTFCRCxvREEwQkM7Ozs7Ozs7Ozs7Ozs7O0FDL0JELE1BQWEsS0FBSztJQUNoQixZQUEyQixVQUFxQjtRQUFyQixlQUFVLEdBQVYsVUFBVSxDQUFXO0lBQUcsQ0FBQztJQUVwRCxJQUFXLElBQUk7UUFDYixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDO0lBQzlCLENBQUM7SUFFRCxJQUFXLEVBQUU7UUFDWCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxJQUFXLFdBQVc7UUFDcEIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQztJQUNyQyxDQUFDO0lBRUQsSUFBVyxRQUFRO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUM7SUFDbEMsQ0FBQztJQUVELElBQVcsV0FBVztRQUNwQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDO0lBQ3JDLENBQUM7SUFFRCxJQUFXLFVBQVU7UUFDbkIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQztJQUNwQyxDQUFDO0lBRUQsSUFBVyxJQUFJO1FBQ2IsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQztJQUM5QixDQUFDO0lBRUQsSUFBVyxVQUFVO1FBQ25CLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUM7SUFDcEMsQ0FBQztJQUVELElBQVcsaUJBQWlCO1FBQzFCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQztJQUMzQyxDQUFDO0lBRUQsSUFBVyxlQUFlO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUM7SUFDekMsQ0FBQztJQUVELElBQVcsV0FBVztRQUNwQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDO0lBQ3JDLENBQUM7SUFFRCxJQUFXLFlBQVk7UUFDckIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQztJQUN0QyxDQUFDO0lBRUQsSUFBVyxRQUFRO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUM7SUFDbEMsQ0FBQztJQUVELElBQVcsOEJBQThCO1FBQ3ZDLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyw4QkFBOEIsQ0FBQztJQUN4RCxDQUFDO0NBQ0Y7QUExREQsc0JBMERDOzs7Ozs7Ozs7Ozs7OztBQzdERCx3R0FBK0U7QUFDL0UsTUFBYSxjQUFjO0lBT3pCLFlBQW1CLGVBQWdDLEVBQVUsV0FBbUI7UUFBbkIsZ0JBQVcsR0FBWCxXQUFXLENBQVE7UUFDOUUsSUFBSSxDQUFDLEtBQUssR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxLQUFLLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBQztRQUNsQyxJQUFJLENBQUMsT0FBTyxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUM7UUFDdEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxlQUFlLENBQUMsU0FBUyxDQUFDO1FBQzVDLElBQUksQ0FBQyxVQUFVLEdBQUcsZUFBZSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQztRQUN6RCxJQUFJLENBQUMsSUFBSSxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUM7SUFDbEMsQ0FBQztJQUVELElBQVcsSUFBSTtRQUNiLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0lBRUQsSUFBVyxJQUFJO1FBQ2IsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFFRCxJQUFXLElBQUksQ0FBQyxJQUFZO1FBQzFCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0lBQ3BCLENBQUM7SUFFRCxJQUFXLE1BQU07UUFDZixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQUVELElBQVcsTUFBTSxDQUFDLE1BQWU7UUFDL0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7SUFDeEIsQ0FBQztJQUVELElBQVcsU0FBUztRQUNsQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDekIsQ0FBQztJQUVELElBQVcsU0FBUyxDQUFDLFNBQWtCO1FBQ3JDLElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO0lBQzlCLENBQUM7SUFFRCxJQUFXLFNBQVM7UUFDbEIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxJQUFXLEdBQUc7UUFDWixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUVNLFNBQVM7UUFDZCxNQUFNLE9BQU8sR0FBRyw4QkFBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLFVBQVUseUJBQThCLENBQUM7UUFDbEcsT0FBTyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pDLENBQUM7Q0FDRjtBQXhERCx3Q0F3REM7Ozs7Ozs7Ozs7Ozs7O0FDMURELHlJQUE4RDtBQUM5RCwySkFNMkM7QUFDM0MsZ0tBQTRHO0FBQzVHLHdNQUFnRztBQUNoRyxtR0FBaUM7QUFHakMsbUpBQStFO0FBRS9FLHdIQUErQztBQUMvQyxvSUFBcUQ7QUFDckQsaUpBQTREO0FBQzVELG1IQUF3QztBQUN4QywrSEFBZ0Q7QUFFaEQsK0hBQWdEO0FBRWhELE1BQWEsYUFBYyxTQUFRLHFCQUFTO0lBSzFDLFlBQ0UsVUFBeUIsRUFDakIsTUFBNEIsRUFDNUIsVUFBcUIsRUFDN0IsV0FBbUIsRUFDWCxxQkFBNEMsRUFDNUMsMkJBQW1DLENBQUM7UUFFNUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQztRQU52QixXQUFNLEdBQU4sTUFBTSxDQUFzQjtRQUM1QixlQUFVLEdBQVYsVUFBVSxDQUFXO1FBRXJCLDBCQUFxQixHQUFyQixxQkFBcUIsQ0FBdUI7UUFDNUMsNkJBQXdCLEdBQXhCLHdCQUF3QixDQUFZO0lBRzlDLENBQUM7SUFFRCxJQUFXLGNBQWM7UUFDdkIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQzlCLENBQUM7SUFFRCxJQUFXLE9BQU87UUFDaEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxJQUFXLGdCQUFnQjtRQUN6QixPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQztJQUNwQyxDQUFDO0lBRUQsSUFBVyx1QkFBdUI7UUFDaEMsT0FBTyxJQUFJLENBQUMsd0JBQXdCLENBQUM7SUFDdkMsQ0FBQztJQUVELElBQVcsbUJBQW1CO1FBQzVCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUM7SUFDbkMsQ0FBQztJQUVNLDhCQUE4QjtRQUNuQyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksS0FBSyxFQUFpQixDQUFDO1FBQ2xELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxLQUFLLEVBQXVCLENBQUM7UUFDakQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBK0IsQ0FBQztRQUV0RCw4REFBOEQ7UUFDOUQsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQzlCLElBQUksYUFBYSxHQUE4QixTQUFTLENBQUM7WUFFekQsTUFBTSxRQUFRLEdBQWtCLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUMzRSw2RUFBNkU7WUFDN0UsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDO1lBRXZCLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyw4Q0FBbUIsQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyw4Q0FBbUIsQ0FBQyxXQUFXLEVBQUU7Z0JBQ3hHLElBQUksYUFBYSxHQUFHLEVBQUUsQ0FBQztnQkFDdkIsSUFBSSxZQUFZLEdBQUcsRUFBRSxDQUFDO2dCQUN0QixJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUM7Z0JBQ3JCLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtvQkFDbEIsc0VBQXNFO29CQUN0RSxhQUFhLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUM7b0JBRXBDLGdEQUFnRDtvQkFDaEQsWUFBWSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQztvQkFDeEMseUNBQXlDO29CQUN6QyxRQUFRLEdBQUcsWUFBWSxLQUFLLEVBQUUsQ0FBQztpQkFDaEM7cUJBQU07b0JBQ0wsYUFBYSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7aUJBQzNCO2dCQUNELHNGQUFzRjtnQkFDdEYsbUdBQW1HO2dCQUNuRyxNQUFNLGFBQWEsR0FBRyxJQUFJLDZCQUFhLENBQ3JDLGFBQWEsRUFDYixvQ0FBUyxDQUFDLFNBQVMsRUFDbkIsUUFBUSxFQUNSLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUMzQixRQUFRLEVBQ1IsUUFBUSxFQUNSLFlBQVksQ0FDYixDQUFDO2dCQUVGLE1BQU0sS0FBSyxHQUFhO29CQUN0QixTQUFTLEVBQUUsYUFBYTtvQkFDeEIsU0FBUyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSTtvQkFDbkMsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVTtvQkFDdEMsZUFBZSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsZUFBZTtvQkFDaEQsWUFBWSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWTtpQkFDM0MsQ0FBQztnQkFFRixhQUFhLEdBQUcsSUFBSSw2QkFBYSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUM7Z0JBQzVHLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyw4Q0FBbUIsQ0FBQyxTQUFTLEVBQUU7b0JBQ25ELElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2lCQUMxQzthQUNGO1lBRUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxhQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFNUMsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLHlDQUFtQixDQUNqRCxJQUFJLEVBQ0osK0RBQThCLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFDekUsU0FBUyxFQUNULFFBQVEsRUFDUixhQUFhLEVBQ2IsSUFBSSxDQUFDLElBQUksRUFDVCxJQUFJLENBQUMsVUFBVSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLDZEQUE2RDtZQUN0SCxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLDJEQUEyRDtZQUNqSCxJQUFJLENBQUMsTUFBTSxFQUNYLElBQUksQ0FBQyxPQUFPLENBQ2IsQ0FBQztZQUVGLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFDeEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1NBQ3BEO0lBQ0gsQ0FBQztJQUVNLGlDQUFpQyxDQUFDLDRCQUE0RTtRQUNuSCxNQUFNLFdBQVcsR0FBRyxvQ0FBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLFVBQVUsMkJBQWdDLENBQUM7UUFFeEcsT0FBTyxXQUFXLENBQUMsa0JBQWtCLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLDRCQUE0QixDQUFDLENBQUM7SUFDbEgsQ0FBQztJQUVNLHNCQUFzQixDQUFDLGlCQUF5QjtRQUNyRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVNLFdBQVcsQ0FBQyxRQUE4QixFQUFFLGVBQWUsR0FBRyxDQUFDLEVBQUUsc0JBQXNCLEdBQUcsRUFBRTtRQUNqRywrRUFBK0U7UUFDL0UsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQzFDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDaEMsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDO1FBQ3RELE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUM7UUFDekQsdURBQXVEO1FBQ3ZELElBQUksQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxlQUFlLENBQUM7UUFDaEQsSUFBSSxzQkFBc0IsRUFBRTtZQUMxQixJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsR0FBRyxzQkFBc0IsQ0FBQztZQUNuRCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksR0FBRyxzQkFBc0IsQ0FBQztTQUNuRDtRQUNELElBQUksQ0FBQyw4QkFBOEIsRUFBRSxDQUFDO1FBQ3RDLGdDQUFnQztRQUNoQyxNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDMUMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUNoQywrQkFBK0I7UUFDL0IsTUFBTSxXQUFXLEdBQWlDLElBQUksR0FBRyxFQUFFLENBQUM7UUFFNUQsZ0RBQWdEO1FBQ2hELG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFO1lBQ3hDLE1BQU0sS0FBSyxHQUFXLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFFbkMsK0JBQStCO1lBQy9CLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUMxQixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsZ0RBQXFCLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ2xFLE9BQU87YUFDUjtZQUVELE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDeEMsSUFBSSxTQUFTLENBQUMsVUFBVSxLQUFLLFNBQVUsQ0FBQyxVQUFVLEVBQUU7Z0JBQ2xELElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxnREFBcUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2FBQzdFO1lBRUQsSUFBSSxTQUFTLENBQUMsU0FBUyxLQUFLLFNBQVUsQ0FBQyxTQUFTLEVBQUU7Z0JBQ2hELElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxnREFBcUIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2FBQzVFO1lBRUQsSUFBSSxTQUFTLENBQUMsSUFBSSxLQUFLLFNBQVUsQ0FBQyxJQUFJLEVBQUU7Z0JBQ3RDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxnREFBcUIsQ0FBQyxXQUFXLENBQUMsQ0FBQzthQUN2RTtZQUVELElBQUksU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssU0FBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssU0FBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3BHLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxnREFBcUIsQ0FBQyxlQUFlLENBQUMsQ0FBQzthQUMzRTtZQUVELElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssU0FBVSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssU0FBVSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7Z0JBQ3RHLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxnREFBcUIsQ0FBQyxXQUFXLENBQUMsQ0FBQzthQUN2RTtRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsK0JBQStCO1FBQy9CLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFO1lBQ3hDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBRTtnQkFDakMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLFdBQVcsRUFBRSxnREFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUN4RTtRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgseUNBQXlDO1FBQ3pDLElBQUksZUFBZSxLQUFLLGVBQWUsRUFBRTtZQUN2QyxJQUFJLGVBQWUsS0FBSyxDQUFDLEVBQUU7Z0JBQ3pCLElBQUksQ0FBQyxTQUFTLENBQUMsZUFBZSxFQUFFLFdBQVcsRUFBRSxnREFBcUIsQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUM5RTtZQUNELElBQUksZUFBZSxLQUFLLENBQUMsRUFBRTtnQkFDekIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxlQUFlLEVBQUUsV0FBVyxFQUFFLGdEQUFxQixDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQ2hGO1NBQ0Y7UUFFRCw0Q0FBNEM7UUFDNUMsSUFBSSxzQkFBc0IsSUFBSSxzQkFBc0IsS0FBSyxzQkFBc0IsRUFBRTtZQUMvRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsZ0RBQXFCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztTQUN4RTtRQUVELE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUM7SUFFTyxTQUFTLENBQUMsTUFBYyxFQUFFLFdBQXlDLEVBQUUsTUFBNkI7UUFDeEcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDNUIsV0FBVyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7U0FDN0I7UUFFRCxXQUFXLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRU0sa0NBQWtDLENBQ3ZDLHlDQUE2RjtRQUU3RixNQUFNLFdBQVcsR0FBRyxvQ0FBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLFVBQVUsMkJBQWdDLENBQUM7UUFFeEcsT0FBTyxXQUFXLENBQUMsa0JBQWtCLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLHlDQUF5QyxDQUFDLENBQUM7SUFDL0gsQ0FBQztJQUVNLG9CQUFvQixDQUFDLFdBQXFDO1FBQy9ELE1BQU0sZ0JBQWdCLEdBQUcsb0NBQWtCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxVQUFVLHFDQUEwQyxDQUFDO1FBRXZILE9BQU8sZ0JBQWdCLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFTSxlQUFlO1FBQ3BCLElBQUksQ0FBQyw2Q0FBNkMsRUFBRSxDQUFDO1FBRXJELE1BQU0sT0FBTyxHQUFHLG9DQUFrQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsVUFBVSwrQkFBb0MsQ0FBQztRQUN4RyxPQUFPLE9BQU8sQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO0lBQzVDLENBQUM7SUFFTSxnQkFBZ0IsQ0FDckIsU0FBaUIsRUFDakIsTUFBcUIsRUFDckIsVUFBcUMsRUFDckMsT0FBK0I7UUFFL0IsMkJBQVksQ0FBQyxlQUFlLENBQTRCLFVBQVUsRUFBRSxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztRQUNuSCwyQkFBWSxDQUFDLHFCQUFxQixDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUMxQixNQUFNLElBQUksMkJBQVksQ0FBQyxxQ0FBVSxDQUFDLGdCQUFnQixFQUFFLGlFQUFpRSxDQUFDLENBQUM7U0FDeEg7UUFDRCxJQUFJLENBQUMsNkNBQTZDLEVBQUUsQ0FBQztRQUVyRCxNQUFNLE9BQU8sR0FBRyxvQ0FBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLFVBQVUsK0JBQW9DLENBQUM7UUFDeEcsT0FBTyxPQUFPLENBQUMseUJBQXlCLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDbkYsQ0FBQztJQUVELHFHQUFxRztJQUNyRyxvSEFBb0g7SUFDN0csMEJBQTBCO1FBQy9CLE1BQU0sY0FBYyxHQUFhLEVBQUUsQ0FBQztRQUNwQyxLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDOUIsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLDhDQUFtQixDQUFDLFNBQVMsRUFBRTtnQkFDbkQsU0FBUzthQUNWO1lBQ0Qsc0VBQXNFO1lBQ3RFLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQ3ZFLGNBQWMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7U0FDcEM7UUFFRCxPQUFPLGNBQWMsQ0FBQztJQUN4QixDQUFDO0lBRU8sNkNBQTZDO1FBQ25ELE1BQU0sd0JBQXdCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUM3QyxNQUFNLHdCQUF3QixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQztRQUMvRixJQUFJLENBQUMsd0JBQXdCLElBQUksQ0FBQyx3QkFBd0IsRUFBRTtZQUMxRCxNQUFNLElBQUksMkJBQVksQ0FBQywyQ0FBZ0IsQ0FBQyxjQUFjLEVBQUUsMkNBQTJDLENBQUMsQ0FBQztTQUN0RztJQUNILENBQUM7Q0FDRjtBQTFRRCxzQ0EwUUM7Ozs7Ozs7Ozs7Ozs7O0FDNVJEOzs7R0FHRztBQUNILE1BQWEsbUJBQW1CO0lBQzlCLFlBQ1UsY0FBNkIsRUFDN0IsS0FBMEIsRUFDMUIsU0FBeUIsRUFDekIsS0FBb0IsRUFDcEIsY0FBeUMsRUFDekMsS0FBYSxFQUNiLFdBQW9CLEVBQ3BCLFVBQW1CLEVBQ25CLEdBQVcsRUFDWCxRQUE0QjtRQVQ1QixtQkFBYyxHQUFkLGNBQWMsQ0FBZTtRQUM3QixVQUFLLEdBQUwsS0FBSyxDQUFxQjtRQUMxQixjQUFTLEdBQVQsU0FBUyxDQUFnQjtRQUN6QixVQUFLLEdBQUwsS0FBSyxDQUFlO1FBQ3BCLG1CQUFjLEdBQWQsY0FBYyxDQUEyQjtRQUN6QyxVQUFLLEdBQUwsS0FBSyxDQUFRO1FBQ2IsZ0JBQVcsR0FBWCxXQUFXLENBQVM7UUFDcEIsZUFBVSxHQUFWLFVBQVUsQ0FBUztRQUNuQixRQUFHLEdBQUgsR0FBRyxDQUFRO1FBQ1gsYUFBUSxHQUFSLFFBQVEsQ0FBb0I7SUFDbkMsQ0FBQztJQUVKLElBQVcsYUFBYTtRQUN0QixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDN0IsQ0FBQztJQUVELElBQVcsSUFBSTtRQUNiLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0lBRUQsSUFBVyxRQUFRO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDO0lBRUQsSUFBVyxJQUFJO1FBQ2IsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFFRCxJQUFXLGFBQWE7UUFDdEIsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQzdCLENBQUM7SUFFRCxJQUFXLElBQUk7UUFDYixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQUVELElBQVcsVUFBVTtRQUNuQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQVcsU0FBUztRQUNsQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDekIsQ0FBQztJQUVELElBQVcsRUFBRTtRQUNYLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUNsQixDQUFDO0lBRUQsSUFBVyxPQUFPO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0NBQ0Y7QUFyREQsa0RBcURDOzs7Ozs7Ozs7Ozs7OztBQzdERCwySkFBNEU7QUFFNUUsdUlBQXlEO0FBQ3pELG1HQUFpQztBQUNqQyx3SEFBK0M7QUFHL0MsbUpBQStFO0FBQy9FLHdIQUErQztBQUMvQyxvSUFBcUQ7QUFDckQsbUhBQXdDO0FBRXhDLE1BQWEsY0FBYztJQUd6QixZQUEyQixlQUE0QyxFQUFVLFdBQW1CO1FBQXpFLG9CQUFlLEdBQWYsZUFBZSxDQUE2QjtRQUFVLGdCQUFXLEdBQVgsV0FBVyxDQUFRO1FBQ2xHLElBQUksQ0FBQyxPQUFPLEdBQUcsZUFBZSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRTtZQUN2RCxNQUFNLFNBQVMsR0FBRyxJQUFJLHFCQUFTLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ2xELE9BQU8sSUFBSSxhQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDOUIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsSUFBVyxJQUFJO1FBQ2IsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQztJQUNuQyxDQUFDO0lBRUQsSUFBVyxFQUFFO1FBQ1gsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBRUQsSUFBVyxpQkFBaUI7UUFDMUIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLGlCQUFpQixDQUFDO0lBQ2hELENBQUM7SUFFRCxJQUFXLE1BQU07UUFDZixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQUVELElBQVcsU0FBUztRQUNsQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDO0lBQ3hDLENBQUM7SUFFRCxJQUFXLFdBQVc7UUFDcEIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQztJQUMxQyxDQUFDO0lBRU0sWUFBWTtRQUNqQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDO0lBQzNDLENBQUM7SUFFTSxrQkFBa0I7UUFDdkIsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRU0sWUFBWTtRQUNqQixNQUFNLGlCQUFpQixHQUFHLG9DQUFrQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsVUFBVSwrQ0FBbUQsQ0FBQztRQUVqSSxPQUFPLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFTSwyQkFBMkI7UUFDaEMsTUFBTSxpQkFBaUIsR0FBRyxvQ0FBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLFVBQVUsK0NBQW1ELENBQUM7UUFFakksT0FBTyxpQkFBaUIsQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBK0IsQ0FBQyxTQUFTLEVBQUUsRUFBRTtZQUM3SCxPQUFPLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLElBQUkscUNBQWlCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUNwRSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxvQkFBb0I7UUFDekIsTUFBTSxpQkFBaUIsR0FBRyxvQ0FBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLFVBQVUsK0NBQW1ELENBQUM7UUFFakksT0FBTyxpQkFBaUIsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBK0IsQ0FBQyxVQUFVLEVBQUUsRUFBRTtZQUN2SCxPQUFPLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLElBQUksMkJBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ3BFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLHNCQUFzQixDQUFDLE9BQWtEO1FBQzlFLE1BQU0sY0FBYyxHQUFHLG9DQUFrQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsVUFBVSxrQ0FBc0MsQ0FBQztRQUNqSCxPQUFPLEdBQUcsT0FBTyxJQUFJLEVBQUUsQ0FBQztRQUV4QixPQUFPLGNBQWMsQ0FBQyxzQkFBc0IsQ0FDMUMsSUFBSSxDQUFDLEVBQUUsRUFDUCxDQUFDLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFDdkIsT0FBTyxDQUFDLE9BQU8sSUFBSSxDQUFDLEVBQUUsd0JBQXdCO1FBQzlDLE9BQU8sQ0FBQyxnQkFBZ0IsSUFBSSxFQUFFLEVBQzlCLE9BQU8sQ0FBQyxvQkFBb0IsSUFBSSxFQUFFLEVBQ2xDLE9BQU8sQ0FBQyx1QkFBdUIsSUFBSSxrREFBdUIsQ0FBQyxTQUFTLENBQ3JFLENBQUM7SUFDSixDQUFDO0lBRU0sd0JBQXdCLENBQUMsY0FBc0IsRUFBRSxPQUFrRDtRQUN4RyxNQUFNLGNBQWMsR0FBRyxvQ0FBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLFVBQVUsa0NBQXNDLENBQUM7UUFDakgsT0FBTyxHQUFHLE9BQU8sSUFBSSxFQUFFLENBQUM7UUFFeEIsT0FBTyxjQUFjLENBQUMsd0JBQXdCLENBQzVDLElBQUksQ0FBQyxFQUFFLEVBQ1AsY0FBYyxFQUNkLENBQUMsQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUN2QixPQUFPLENBQUMsT0FBTyxJQUFJLENBQUMsRUFBRSx3QkFBd0I7UUFDOUMsT0FBTyxDQUFDLGdCQUFnQixJQUFJLEVBQUUsRUFDOUIsT0FBTyxDQUFDLG9CQUFvQixJQUFJLEVBQUUsRUFDbEMsT0FBTyxDQUFDLHVCQUF1QixJQUFJLGtEQUF1QixDQUFDLFNBQVMsQ0FDckUsQ0FBQztJQUNKLENBQUM7SUFFTSw4QkFBOEIsQ0FDbkMsY0FBc0IsRUFDdEIsWUFBcUIsRUFDckIsT0FBa0Q7UUFFbEQsTUFBTSxjQUFjLEdBQUcsb0NBQWtCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxVQUFVLGtDQUFzQyxDQUFDO1FBQ2pILE9BQU8sR0FBRyxPQUFPLElBQUksRUFBRSxDQUFDO1FBRXhCLE9BQU8sY0FBYyxDQUFDLDhCQUE4QixDQUNsRCxJQUFJLENBQUMsRUFBRSxFQUNQLGNBQWMsRUFDZCxZQUFZLElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFLEVBQ3pDLENBQUMsQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUN2QixPQUFPLENBQUMsb0JBQW9CLElBQUksRUFBRSxFQUNsQyxPQUFPLENBQUMsdUJBQXVCLElBQUksa0RBQXVCLENBQUMsU0FBUyxDQUNyRSxDQUFDO0lBQ0osQ0FBQztJQUVNLDhCQUE4QixDQUFDLFVBQStCO1FBQ25FLDJCQUFZLENBQUMsbUJBQW1CLENBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBRTNELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUU7WUFDNUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxxQkFBUyxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUN4RCxPQUFPLElBQUksYUFBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzlCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLHFCQUFxQjtRQUMxQixNQUFNLGlCQUFpQixHQUFHLG9DQUFrQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsVUFBVSwrQ0FBbUQsQ0FBQztRQUVqSSxPQUFPLGlCQUFpQixDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQStCLENBQUMsaUJBQWlCLEVBQUUsRUFBRTtZQUMvRyxPQUFPLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDLGdCQUFnQixFQUFFLEVBQUUsQ0FBQyxJQUFJLDJCQUFZLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO1FBQ3pGLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBL0hELHdDQStIQzs7Ozs7Ozs7Ozs7Ozs7QUM1SUQseUlBQThEO0FBQzlELHNKQUFzRTtBQUN0RSx3TUFBZ0c7QUFFaEcsTUFBYSxTQUFTO0lBQ3BCLFlBQTJCLFVBQWtDLEVBQVUsaUJBQXVDO1FBQW5GLGVBQVUsR0FBVixVQUFVLENBQXdCO1FBQVUsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFzQjtJQUFHLENBQUM7SUFFbEgsSUFBVyxJQUFJO1FBQ2IsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQztJQUM5QixDQUFDO0lBRUQsSUFBVyxFQUFFO1FBQ1gsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRUQsSUFBVyxXQUFXO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUM7SUFDckMsQ0FBQztJQUVELElBQVcsUUFBUTs7UUFDakIsWUFBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsdUNBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUM7SUFDL0QsQ0FBQztJQUVELElBQVcsV0FBVztRQUNwQixPQUFPLCtEQUE4QixDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ2xHLENBQUM7SUFFRCxJQUFXLFVBQVU7UUFDbkIsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUI7WUFDekIsTUFBTSxJQUFJLEtBQUssQ0FDYixpSUFBaUksQ0FDbEksQ0FBQztRQUNKLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDO0lBQ2hDLENBQUM7SUFFRCxJQUFXLElBQUk7UUFDYixPQUFPLCtEQUE4QixDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwRixDQUFDO0lBRUQsSUFBVyxVQUFVO1FBQ25CLElBQUksWUFBWSxHQUFnQyxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsSUFBSSxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDO1FBQ2xILE9BQU8sK0RBQThCLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRUQsSUFBVyxpQkFBaUI7UUFDMUIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDO0lBQzNDLENBQUM7SUFFRCxJQUFXLGVBQWU7UUFDeEIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQztJQUN6QyxDQUFDO0lBRUQsSUFBVyxXQUFXO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUM7SUFDckMsQ0FBQztJQUVELElBQVcsWUFBWTtRQUNyQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDO0lBQ3RDLENBQUM7SUFFRCxJQUFXLFFBQVE7UUFDakIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQztJQUNsQyxDQUFDO0lBRUQsSUFBVyw4QkFBOEI7UUFDdkMsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLDhCQUE4QixDQUFDO0lBQ3hELENBQUM7Q0FDRjtBQS9ERCw4QkErREM7Ozs7Ozs7Ozs7Ozs7O0FDbEVELDJKQUE2RjtBQUU3Rix3TUFBZ0c7QUFHaEcsbUpBQStFO0FBQy9FLGdKQUE2RDtBQUM3RCxvSUFBcUQ7QUFDckQsK0dBQXVDO0FBRXZDLE1BQWEsYUFBYTtJQUt4QixZQUFtQixhQUE0QixFQUFVLFdBQW1CO1FBQW5CLGdCQUFXLEdBQVgsV0FBVyxDQUFRO1FBQzFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsSUFBVyxJQUFJO1FBQ2IsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQztJQUNsQyxDQUFDO0lBRUQsSUFBVyxZQUFZO1FBQ3JCLE9BQU8sbUNBQWdCLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNqSCxDQUFDO0lBRUQsSUFBVyxRQUFRO1FBQ2pCLE9BQU8sK0RBQThCLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFFRCxJQUFXLEVBQUU7UUFDWCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztJQUMvQixDQUFDO0lBRUQsSUFBVyxlQUFlO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDO0lBQy9CLENBQUM7SUFFTSxnQkFBZ0IsQ0FBQyxRQUEwQztRQUNoRSwyQkFBWSxDQUFDLGVBQWUsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFFbkQsTUFBTSxZQUFZLEdBQUcsYUFBSyxDQUFDLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzdELE1BQU0saUJBQWlCLEdBQUcsb0NBQWtCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxVQUFVLHVDQUE0QyxDQUFDO1FBQzFILE9BQU8saUJBQWlCLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLGFBQWEsRUFBRSxFQUFFO1lBQzdHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUNyQyxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDM0IsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sZ0JBQWdCLENBQUMsYUFBNEI7UUFDbkQsSUFBSSxDQUFDLGNBQWMsR0FBRyxhQUFhLENBQUM7UUFDcEMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGFBQWEsQ0FBQyxTQUFTLENBQUM7UUFFaEQsTUFBTSxJQUFJLEdBQUcsK0RBQThCLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUN2RyxJQUFJLFVBQXdDLENBQUM7UUFDN0MsSUFBSSxRQUErQixDQUFDO1FBQ3BDLElBQUksUUFBK0IsQ0FBQztRQUNwQyxJQUFJLFFBQTRCLENBQUM7UUFDakMsSUFBSSxjQUFzQyxDQUFDO1FBRTNDLElBQUksSUFBSSxLQUFLLDZDQUFrQixDQUFDLElBQUksRUFBRTtZQUNwQyxNQUFNLE1BQU0sR0FBRyxhQUFhLENBQUMsZUFBZSxJQUFJLEVBQUUsQ0FBQztZQUNuRCxVQUFVLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsbUNBQWdCLENBQUMsc0JBQXNCLENBQUMsR0FBRyxFQUFFLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1NBQ3hHO2FBQU0sSUFBSSxJQUFJLEtBQUssNkNBQWtCLENBQUMsS0FBSyxFQUFFO1lBQzVDLFFBQVEsR0FBRyxhQUFhLENBQUMsUUFBUSxJQUFJLG1DQUFnQixDQUFDLHNCQUFzQixDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzdILFFBQVEsR0FBRyxhQUFhLENBQUMsUUFBUSxJQUFJLG1DQUFnQixDQUFDLHNCQUFzQixDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzdILFFBQVEsR0FBRyxhQUFhLENBQUMsUUFBUSxDQUFDO1lBQ2xDLGNBQWMsR0FBRyxhQUFhLENBQUMsY0FBYyxJQUFJLCtEQUE4QixDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1NBQ3RJO1FBRUQsSUFBSSxDQUFDLGdCQUFnQixHQUFHO1lBQ3RCLElBQUksRUFBRSxJQUFJO1lBQ1YsZUFBZSxFQUFFLFVBQVU7WUFDM0IsUUFBUSxFQUFFLFFBQVE7WUFDbEIsUUFBUSxFQUFFLFFBQVE7WUFDbEIsUUFBUSxFQUFFLFFBQVE7WUFDbEIsY0FBYyxFQUFFLGNBQWM7U0FDL0IsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQXRFRCxzQ0FzRUM7Ozs7Ozs7Ozs7Ozs7O0FDakZELHlJQUE4RDtBQUk5RCxtSkFBK0U7QUFFL0Usd0hBQStDO0FBQy9DLG9JQUFxRDtBQUNyRCwrR0FBdUM7QUFDdkMsOEhBQWlEO0FBcUJqRCxNQUFhLFNBQVM7SUFDcEIsWUFBNkIsY0FBNkIsRUFBWSxXQUFtQjtRQUE1RCxtQkFBYyxHQUFkLGNBQWMsQ0FBZTtRQUFZLGdCQUFXLEdBQVgsV0FBVyxDQUFRO0lBQUcsQ0FBQztJQUU3RixJQUFXLElBQUk7UUFDYixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxJQUFXLFNBQVM7UUFDbEIsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsSUFBVyxTQUFTO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUM7SUFDdkMsQ0FBQztJQUVELElBQVcsSUFBSTtRQUNiLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUM7SUFDdkMsQ0FBQztJQUVELElBQVcsTUFBTTtRQUNmLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFO1lBQzlDLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUM7U0FDckM7UUFDRCxNQUFNLElBQUksMkJBQVksQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CLEVBQUUsMEJBQTBCLENBQUMsQ0FBQztJQUN2RyxDQUFDO0lBRUQsSUFBVyxNQUFNO1FBQ2YsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsS0FBSyxTQUFTLEVBQUU7WUFDOUMsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQztTQUNyQztRQUNELE1BQU0sSUFBSSwyQkFBWSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsRUFBRSx3QkFBd0IsQ0FBQyxDQUFDO0lBQ3JHLENBQUM7SUFFRCxJQUFXLE1BQU0sQ0FBQyxNQUFlO1FBQy9CLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFO1lBQzlDLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztTQUNyQztJQUNILENBQUM7SUFFRCxJQUFXLEtBQUs7UUFDZCxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxLQUFLLFNBQVMsRUFBRTtZQUMzQyxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDO1NBQ2xDO1FBQ0QsTUFBTSxJQUFJLDJCQUFZLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLG1CQUFtQixFQUFFLHVCQUF1QixDQUFDLENBQUM7SUFDcEcsQ0FBQztJQUVELElBQVcsR0FBRztRQUNaLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEtBQUssU0FBUyxFQUFFO1lBQ3pDLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUM7U0FDaEM7UUFDRCxNQUFNLElBQUksMkJBQVksQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CLEVBQUUscUJBQXFCLENBQUMsQ0FBQztJQUNsRyxDQUFDO0lBRU8sWUFBWTtRQUNsQixJQUFJLENBQUMsdUJBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDM0MsTUFBTSxJQUFJLDJCQUFZLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsRUFBRSwrQkFBK0IsQ0FBQyxDQUFDO1NBQ3JHO1FBRUQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ25CLENBQUM7SUFFTSxrQkFBa0IsQ0FBQyxhQUFxQjtRQUM3QywyQkFBWSxDQUFDLGVBQWUsQ0FBQyxhQUFhLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFFN0QsTUFBTSxPQUFPLEdBQUcsb0NBQWtCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxVQUFVLHVDQUE0QyxDQUFDO1FBQ2hILE9BQU8sT0FBTyxDQUFDLHdCQUF3QixDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFTSxrQkFBa0I7UUFDdkIsTUFBTSxPQUFPLEdBQUcsb0NBQWtCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxVQUFVLHVDQUE0QyxDQUFDO1FBQ2hILE9BQU8sT0FBTyxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRU0sZUFBZSxDQUFDLE9BQTJCO1FBQ2hELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSwyQkFBWSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsOEJBQThCLENBQUMsQ0FBQztRQUNwSCxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRTtZQUNqQyxNQUFNLGdCQUFnQixDQUFDO1NBQ3hCO1FBRUQsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFMUQsTUFBTSxXQUFXLEdBQUcsZ0JBQWdCLENBQUMsUUFBUSxLQUFLLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUM7UUFDdkYsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRTtZQUMxRSxNQUFNLGdCQUFnQixDQUFDO1NBQ3hCO1FBRUQsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLFFBQVEsQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFO1lBQ25FLE1BQU0sSUFBSSwyQkFBWSxDQUNwQixRQUFRLENBQUMsbUJBQW1CLENBQUMsOEJBQThCLEVBQzNELDJEQUEyRCxDQUM1RCxDQUFDO1NBQ0g7UUFFRCxJQUFJLFdBQVcsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsUUFBUSxLQUFLLGdCQUFnQixDQUFDLFFBQVEsRUFBRTtZQUM3RSxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDakM7UUFFRCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUUvRCxNQUFNLFdBQVcsR0FBRyxvQ0FBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLFVBQVUsMkJBQWdDLENBQUM7UUFDeEcsT0FBTyxXQUFXLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ3hFLE1BQU0saUJBQWlCLEdBQUcsb0NBQWtCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxVQUFVLHdDQUE0QyxDQUFDO1lBRTFILE9BQU8saUJBQWlCLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxhQUFhLEVBQUUsRUFBRTtnQkFDbkUsTUFBTSxLQUFLLEdBQUcsYUFBYSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM5RSxJQUFJLENBQUMsS0FBSyxFQUFFO29CQUNWLE1BQU0sSUFBSSwyQkFBWSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsOEJBQThCLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO2lCQUM1RztnQkFFRCxNQUFNLFNBQVMsR0FBRyx1QkFBVSxDQUFDLCtCQUErQixDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDbkYsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO2dCQUUxQyxPQUFPLFNBQVMsQ0FBQztZQUNuQixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLGtCQUFrQixDQUFDLE9BQTJCO1FBQ3BELE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxPQUFPLENBQUM7UUFFN0IsMkJBQVksQ0FBQyxlQUFlLENBQTZCLFFBQVEsRUFBRSxRQUFRLENBQUMsaUJBQWlCLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUVwSCxNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMzRCxNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUUzRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0lBRU8sY0FBYyxDQUFDLE9BQXlCOztRQUM5QyxNQUFNLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxHQUFHLE9BQU8sQ0FBQztRQUUzRSxNQUFNLFdBQVcsR0FBRyxDQUFDLGFBQUssQ0FBQyxpQkFBaUIsT0FBQyxZQUFZLDBDQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2xFLE1BQU0sWUFBWSxHQUFHLENBQUMsYUFBSyxDQUFDLGlCQUFpQixPQUFDLFlBQVksMENBQUUsTUFBTSxDQUFDLENBQUM7UUFDcEUsTUFBTSxXQUFXLEdBQUcsQ0FBQyxhQUFLLENBQUMsaUJBQWlCLE9BQUMsWUFBWSwwQ0FBRSxLQUFLLENBQUMsQ0FBQztRQUNsRSxNQUFNLFlBQVksR0FBRyxDQUFDLGFBQUssQ0FBQyxpQkFBaUIsT0FBQyxZQUFZLDBDQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sZUFBZSxHQUFHLFdBQVcsSUFBSSxZQUFZLENBQUM7UUFDcEQsTUFBTSxlQUFlLEdBQUcsV0FBVyxJQUFJLFlBQVksQ0FBQztRQUVwRCxRQUFRLFFBQVEsRUFBRTtZQUNoQixLQUFLLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDekMsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDO2FBQ3JCO1lBRUQsS0FBSyxRQUFRLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3RDLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxlQUFlLEVBQUU7b0JBQ3JDLE1BQU0sSUFBSSwyQkFBWSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxjQUFjLEVBQUUsOENBQThDLENBQUMsQ0FBQztpQkFDckg7Z0JBRUQsTUFBTSxPQUFPLEdBQUcsRUFBRSxLQUFLLEVBQUUsWUFBWSxDQUFDLEtBQU0sRUFBRSxNQUFNLEVBQUUsWUFBWSxDQUFDLE1BQU8sRUFBRSxDQUFDO2dCQUM3RSxJQUFJLE9BQU8sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUMzQyxNQUFNLElBQUksMkJBQVksQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsV0FBVyxFQUFFLHFDQUFxQyxDQUFDLENBQUM7aUJBQ3pHO2dCQUVELE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUM7YUFDOUI7WUFFRCxLQUFLLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDdkMsSUFBSSxDQUFDLFlBQVksSUFBSSxDQUFDLGVBQWUsRUFBRTtvQkFDckMsTUFBTSxJQUFJLDJCQUFZLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLGNBQWMsRUFBRSwrQ0FBK0MsQ0FBQyxDQUFDO2lCQUN0SDtnQkFFRCxNQUFNLE9BQU8sR0FBRyxFQUFFLEtBQUssRUFBRSxZQUFZLENBQUMsS0FBTSxFQUFFLE1BQU0sRUFBRSxZQUFZLENBQUMsTUFBTyxFQUFFLENBQUM7Z0JBQzdFLElBQUksT0FBTyxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQzNDLE1BQU0sSUFBSSwyQkFBWSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUscUNBQXFDLENBQUMsQ0FBQztpQkFDekc7Z0JBRUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQzthQUM5QjtZQUVELEtBQUssUUFBUSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNyQyxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsZUFBZSxJQUFJLENBQUMsZUFBZSxFQUFFO29CQUMxRSxNQUFNLElBQUksMkJBQVksQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsaUJBQWlCLEVBQUUsd0RBQXdELENBQUMsQ0FBQztpQkFDbEk7Z0JBRUQsTUFBTSxPQUFPLEdBQUcsRUFBRSxLQUFLLEVBQUUsWUFBWSxDQUFDLEtBQU0sRUFBRSxNQUFNLEVBQUUsWUFBWSxDQUFDLE1BQU8sRUFBRSxDQUFDO2dCQUM3RSxNQUFNLE9BQU8sR0FBRyxFQUFFLEtBQUssRUFBRSxZQUFZLENBQUMsS0FBTSxFQUFFLE1BQU0sRUFBRSxZQUFZLENBQUMsTUFBTyxFQUFFLENBQUM7Z0JBRTdFLElBQ0UsT0FBTyxDQUFDLEtBQUssR0FBRyxDQUFDO29CQUNqQixPQUFPLENBQUMsTUFBTSxHQUFHLENBQUM7b0JBQ2xCLE9BQU8sQ0FBQyxLQUFLLEdBQUcsQ0FBQztvQkFDakIsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDO29CQUNsQixPQUFPLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLO29CQUM3QixPQUFPLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQy9CO29CQUNBLE1BQU0sSUFBSSwyQkFBWSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsd0RBQXdELENBQUMsQ0FBQztpQkFDNUg7Z0JBRUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUM7YUFDdkM7WUFFRCxLQUFLLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDdkMsSUFBSSxZQUFZLElBQUksWUFBWSxFQUFFO29CQUNoQyxJQUFJLGVBQWUsSUFBSSxlQUFlLEVBQUU7d0JBQ3RDLE1BQU0sT0FBTyxHQUFHLEVBQUUsS0FBSyxFQUFFLFlBQVksQ0FBQyxLQUFNLEVBQUUsTUFBTSxFQUFFLFlBQVksQ0FBQyxNQUFPLEVBQUUsQ0FBQzt3QkFDN0UsTUFBTSxPQUFPLEdBQUcsRUFBRSxLQUFLLEVBQUUsWUFBWSxDQUFDLEtBQU0sRUFBRSxNQUFNLEVBQUUsWUFBWSxDQUFDLE1BQU8sRUFBRSxDQUFDO3dCQUU3RSxJQUFJLE9BQU8sQ0FBQyxLQUFLLEtBQUssT0FBTyxDQUFDLEtBQUssSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLE9BQU8sQ0FBQyxNQUFNLEVBQUU7NEJBQ3hFLE1BQU0sSUFBSSwyQkFBWSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsdURBQXVELENBQUMsQ0FBQzt5QkFDM0g7d0JBRUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUM7cUJBQ3ZDO29CQUVELElBQUksZUFBZSxFQUFFO3dCQUNuQixNQUFNLE9BQU8sR0FBRyxFQUFFLEtBQUssRUFBRSxZQUFZLENBQUMsS0FBTSxFQUFFLE1BQU0sRUFBRSxZQUFZLENBQUMsTUFBTyxFQUFFLENBQUM7d0JBQzdFLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQztxQkFDaEQ7b0JBRUQsSUFBSSxlQUFlLEVBQUU7d0JBQ25CLE1BQU0sT0FBTyxHQUFHLEVBQUUsS0FBSyxFQUFFLFlBQVksQ0FBQyxLQUFNLEVBQUUsTUFBTSxFQUFFLFlBQVksQ0FBQyxNQUFPLEVBQUUsQ0FBQzt3QkFDN0UsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDO3FCQUNoRDtpQkFDRjtnQkFFRCxNQUFNLElBQUksMkJBQVksQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsV0FBVyxFQUFFLDhCQUE4QixDQUFDLENBQUM7YUFDbEc7WUFFRCxPQUFPLENBQUMsQ0FBQztnQkFDUCxNQUFNLElBQUksMkJBQVksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxFQUFFLG9DQUFvQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO2FBQ2pIO1NBQ0Y7SUFDSCxDQUFDOztBQTlOSCw4QkF3UEM7QUF4QmdCLHlCQUFlLEdBQUcsQ0FBQyxJQUErQixFQUEwQixFQUFFO0lBQzNGLE1BQU0sS0FBSyxHQUFHLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUM7SUFFdEQsSUFBSSxDQUFDLElBQUksRUFBRTtRQUNULE9BQU8sS0FBSyxDQUFDO0tBQ2Q7SUFFRCxNQUFNLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLEdBQUcsYUFBSyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkYsTUFBTSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxHQUFHLGFBQUssQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRTFGLElBQUksV0FBVyxJQUFJLFlBQVksRUFBRTtRQUMvQixPQUFPLEVBQUUsS0FBSyxFQUFFLFdBQVksRUFBRSxNQUFNLEVBQUUsWUFBYSxFQUFFLENBQUM7S0FDdkQ7SUFFRCxJQUFJLFdBQVcsRUFBRTtRQUNmLE9BQU8sRUFBRSxLQUFLLEVBQUUsV0FBWSxFQUFFLENBQUM7S0FDaEM7SUFFRCxJQUFJLFlBQVksRUFBRTtRQUNoQixPQUFPLEVBQUUsTUFBTSxFQUFFLFlBQWEsRUFBRSxDQUFDO0tBQ2xDO0lBRUQsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7O0FDclJKLDJKQUEySDtBQUczSCxNQUFhLGFBQWE7SUFDeEIsWUFDVSxLQUFhLEVBQ2IsVUFBcUIsRUFDckIsVUFBbUQsRUFDbkQsTUFBZSxFQUNmLFNBQW1CLEVBQ25CLFNBQW1CLEVBQ25CLElBQWE7UUFOYixVQUFLLEdBQUwsS0FBSyxDQUFRO1FBQ2IsZUFBVSxHQUFWLFVBQVUsQ0FBVztRQUNyQixlQUFVLEdBQVYsVUFBVSxDQUF5QztRQUNuRCxXQUFNLEdBQU4sTUFBTSxDQUFTO1FBQ2YsY0FBUyxHQUFULFNBQVMsQ0FBVTtRQUNuQixjQUFTLEdBQVQsU0FBUyxDQUFVO1FBQ25CLFNBQUksR0FBSixJQUFJLENBQVM7SUFDcEIsQ0FBQztJQUVKLElBQVcsSUFBSTtRQUNiLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0lBRUQsSUFBVyxJQUFJLENBQUMsU0FBaUI7UUFDL0IsSUFBSSxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUM7SUFDekIsQ0FBQztJQUVELElBQVcsU0FBUztRQUNsQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDekIsQ0FBQztJQUVELElBQVcsU0FBUyxDQUFDLEtBQThDO1FBQ2pFLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO0lBQzFCLENBQUM7SUFFRCxJQUFXLFNBQVM7UUFDbEIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxJQUFXLFNBQVM7UUFDbEIsT0FBTztZQUNMLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNwQixXQUFXLEVBQUUsSUFBSSxDQUFDLFNBQVMsS0FBSyxvQ0FBUyxDQUFDLFNBQVM7U0FFcEQsQ0FBQztJQUNKLENBQUM7SUFFRCxJQUFXLEtBQUs7UUFDZCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQztJQUVELElBQVcsUUFBUTtRQUNqQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQUVELElBQVcsTUFBTSxDQUFDLE1BQWU7UUFDL0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQVcsUUFBUTtRQUNqQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQUVELElBQVcsR0FBRztRQUNaLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztJQUNuQixDQUFDO0NBQ0Y7QUExREQsc0NBMERDOzs7Ozs7Ozs7Ozs7OztBQ3pERDs7OztHQUlHO0FBQ0gsTUFBYSxzQkFBc0I7SUFJakMsWUFBbUIsU0FBMkI7UUFDNUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7UUFDNUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVELElBQVcsU0FBUztRQUNsQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDekIsQ0FBQztJQUVNLGdCQUFnQixDQUFDLE9BQXVDO1FBQzdELElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzdCLE9BQU8sR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFTSxtQkFBbUIsQ0FBQyxPQUF1QztRQUNoRSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQztRQUMxQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssT0FBTyxDQUFDLENBQUM7UUFDN0QsT0FBTyxXQUFXLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7SUFDN0MsQ0FBQztJQUVNLFlBQVksQ0FBQyxjQUFnQztRQUNsRCxLQUFLLE1BQU0sT0FBTyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDcEMsSUFBSTtnQkFDRixNQUFNLFVBQVUsR0FBRyxjQUFjLEVBQUUsQ0FBQztnQkFDcEMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQ3JCO1lBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQ1YsaUdBQWlHO2dCQUNqRyxTQUFTO2FBQ1Y7U0FDRjtJQUNILENBQUM7Q0FDRjtBQW5DRCx3REFtQ0M7Ozs7Ozs7Ozs7Ozs7O0FDNUNELHlJQUE4RDtBQUU5RCxtSkFBK0U7QUFFL0Usd0hBQStDO0FBQy9DLG9JQUFxRDtBQUNyRCxzSkFBaUU7QUFDakUsbUhBQXdDO0FBRXhDLGtJQUFrRDtBQUNsRCw4SUFBMEQ7QUFFMUQsTUFBYSxTQUFVLFNBQVEscUJBQVM7SUFLdEMsWUFDWSxjQUE2QixFQUN2QyxVQUFzQixFQUNkLG9CQUFzQyxFQUNwQyxXQUFtQjtRQUU3QixLQUFLLENBQUMsY0FBYyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBTHpCLG1CQUFjLEdBQWQsY0FBYyxDQUFlO1FBRS9CLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBa0I7UUFDcEMsZ0JBQVcsR0FBWCxXQUFXLENBQVE7UUFQdkIseUJBQW9CLEdBQThCLEVBQUUsQ0FBQztRQVUzRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksdUNBQWtCLEVBQWtCLENBQUM7UUFDMUQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRU8sZUFBZSxDQUFDLFVBQXNCO1FBQzVDLFVBQVUsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsZUFBZSxFQUFFLEVBQUU7WUFDakQsTUFBTSxRQUFRLEdBQUcsZUFBZSxDQUFDLEtBQUssS0FBSyxVQUFVLENBQUMscUJBQXFCLENBQUM7WUFDNUUsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLHVDQUFrQixDQUMvQyxlQUFlLENBQUMsT0FBTyxFQUN2QixlQUFlLENBQUMsS0FBSyxFQUNyQixlQUFlLENBQUMsWUFBWSxFQUM1QixRQUFRLEVBQ1IsZUFBZSxDQUFDLE9BQU8sRUFDdkIsSUFBSSxDQUNMLENBQUM7WUFDRixJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFFbkQsSUFBSSxRQUFRLEVBQUU7Z0JBQ1osSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksK0JBQWMsQ0FDN0Msa0JBQWtCLEVBQ2xCLElBQUksQ0FBQyxvQkFBb0IsRUFDekIsSUFBSSxDQUFDLFdBQVcsRUFDaEIsZUFBZSxDQUFDLGtCQUFrQixDQUNuQyxDQUFDO2FBQ0g7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxlQUFlLENBQUMsS0FBYSxFQUFFLGVBQWdDO1FBQ3JFLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUU7WUFDOUIsT0FBTztTQUNSO1FBRUQsSUFBSSxhQUFhLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JELElBQUksYUFBYSxDQUFDLFlBQVksS0FBSyxlQUFlLENBQUMsWUFBWSxFQUFFO1lBQy9ELE1BQU0sSUFBSSwyQkFBWSxDQUNwQixRQUFRLENBQUMsbUJBQW1CLENBQUMsb0JBQW9CLEVBQ2pELDJGQUEyRixhQUFhLENBQUMsWUFBWSxxQkFBcUIsZUFBZSxDQUFDLFlBQVksRUFBRSxDQUN6SyxDQUFDO1NBQ0g7UUFDRCxhQUFhLENBQUMsT0FBTyxHQUFHLGVBQWUsQ0FBQyxPQUFPLENBQUM7UUFDaEQsYUFBYSxDQUFDLE9BQU8sR0FBRyxlQUFlLENBQUMsT0FBTyxDQUFDO1FBRWhELElBQUksSUFBSSxDQUFDLHFCQUFxQixDQUFDLFlBQVksS0FBSyxlQUFlLENBQUMsWUFBWSxFQUFFO1lBQzVFLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQztTQUM1RDtJQUNILENBQUM7SUFFTSxXQUFXLENBQUMsZUFBZ0M7UUFDakQsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtZQUM5QixPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUMsa0JBQWtCLEVBQUUsRUFBRTtZQUN2RCxNQUFNLFFBQVEsR0FBRyxrQkFBa0IsQ0FBQyxZQUFZLEtBQUssZUFBZSxDQUFDLFlBQVksQ0FBQztZQUNsRixJQUFJLFFBQVEsRUFBRTtnQkFDWixtQkFBbUI7Z0JBQ25CLGtCQUFrQixDQUFDLE9BQU8sR0FBRyxlQUFlLENBQUMsT0FBTyxDQUFDO2dCQUNyRCxrQkFBa0IsQ0FBQyxLQUFLLEdBQUcsZUFBZSxDQUFDLEtBQUssQ0FBQztnQkFDakQsa0JBQWtCLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztnQkFDakMsa0JBQWtCLENBQUMsT0FBTyxHQUFHLGVBQWUsQ0FBQyxPQUFPLENBQUM7Z0JBRXJELHFDQUFxQztnQkFDckMsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksK0JBQWMsQ0FDN0Msa0JBQWtCLEVBQ2xCLElBQUksQ0FBQyxvQkFBb0IsRUFDekIsSUFBSSxDQUFDLFdBQVcsRUFDaEIsZUFBZSxDQUFDLGtCQUFrQixDQUNuQyxDQUFDO2FBQ0g7aUJBQU07Z0JBQ0wsd0JBQXdCO2dCQUN4QixrQkFBa0IsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO2FBQ25DO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUN6QixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztTQUMvQztJQUNILENBQUM7SUFFRCxJQUFXLGdCQUFnQjtRQUN6QixPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQztJQUNwQyxDQUFDO0lBRUQsSUFBVyxlQUFlO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDO0lBQ25DLENBQUM7SUFFRCxJQUFXLFFBQVE7UUFDakIsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQztJQUNwQyxDQUFDO0lBRUQsSUFBVyxRQUFRO1FBQ2pCLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDO0lBQ3hDLENBQUM7SUFFTSwyQkFBMkI7UUFDaEMsSUFBSSxJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQzdFLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztTQUNwRDtRQUVELElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztRQUUxRCxNQUFNLE9BQU8sR0FBRyxvQ0FBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLFVBQVUsa0RBQXNELENBQUM7UUFDMUgsT0FBTyxDQUFDLDJCQUEyQixFQUFFLENBQUM7UUFDdEMsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVNLCtCQUErQjtRQUNwQyxJQUFJLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLEtBQUssQ0FBQyxFQUFFO1lBQzFDLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztTQUNwRDtRQUVELElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztRQUUxRCxNQUFNLE9BQU8sR0FBRyxvQ0FBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLFVBQVUsa0RBQXNELENBQUM7UUFDMUgsT0FBTyxDQUFDLCtCQUErQixFQUFFLENBQUM7UUFDMUMsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVNLHVCQUF1QixDQUFDLEtBQWE7UUFDMUMsMkJBQVksQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzdDLDJCQUFZLENBQUMsbUJBQW1CLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUUzRCxJQUFJLEtBQUssR0FBRyxDQUFDLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLEVBQUU7WUFDMUQsTUFBTSxJQUFJLDJCQUFZLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLGVBQWUsRUFBRSxtREFBbUQsQ0FBQyxDQUFDO1NBQzNIO1FBRUQsSUFBSSxLQUFLLEtBQUssSUFBSSxDQUFDLHFCQUFxQixDQUFDLEtBQUssRUFBRTtZQUM5QyxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUM7U0FDcEQ7UUFFRCxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLDBCQUEwQixFQUFFLENBQUM7UUFFMUQsTUFBTSxPQUFPLEdBQUcsb0NBQWtCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxVQUFVLGtEQUFzRCxDQUFDO1FBQzFILE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2QyxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRU0scUJBQXFCLENBQUMsS0FBYTtRQUN4QywyQkFBWSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDN0MsMkJBQVksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRTNELElBQUksS0FBSyxHQUFHLENBQUMsSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sRUFBRTtZQUMxRCxNQUFNLElBQUksMkJBQVksQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsZUFBZSxFQUFFLG1EQUFtRCxDQUFDLENBQUM7U0FDM0g7UUFFRCxNQUFNLE9BQU8sR0FBRyxvQ0FBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLFVBQVUsa0RBQXNELENBQUM7UUFFMUgsT0FBTyxPQUFPLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFxQixDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQ2hGLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztZQUMvQyxNQUFNLGtCQUFrQixHQUFHLElBQUksdUNBQWtCLENBQy9DLFFBQVEsQ0FBQyxPQUFPLEVBQ2hCLFFBQVEsQ0FBQyxLQUFLLEVBQ2QsUUFBUSxDQUFDLFlBQVksRUFDckIsS0FBSyxFQUNMLFFBQVEsQ0FBQyxPQUFPLEVBQ2hCLElBQUksQ0FDTCxDQUFDO1lBQ0YsT0FBTyxrQkFBa0IsQ0FBQztRQUM1QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxvQkFBb0I7UUFDekIsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2xCLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLDhCQUE4QixDQUFDLENBQUM7U0FDdkQ7SUFDSCxDQUFDO0NBQ0Y7QUFwTEQsOEJBb0xDOzs7Ozs7Ozs7Ozs7OztBQ2hNRCx5SUFBOEQ7QUFFOUQsd0hBQStDO0FBQy9DLDhIQUFpRDtBQUNqRCwrSEFBZ0Q7QUFFaEQsK0hBQWdEO0FBR2hELCtIQUFnRDtBQUVoRCxNQUFhLGNBQWM7SUFFekIsWUFDVSxtQkFBdUMsRUFDL0MsVUFBNEIsRUFDNUIsVUFBa0IsRUFDbEIsa0JBQTRDO1FBSHBDLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBb0I7UUFLL0MsSUFBSSxrQkFBa0IsRUFBRTtZQUN0QixJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGtCQUFrQixFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztTQUNsRztJQUNILENBQUM7SUFFRCxJQUFXLEtBQUs7UUFDZCxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUM7SUFDeEMsQ0FBQztJQUVELElBQVcsT0FBTztRQUNoQixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUM7SUFDMUMsQ0FBQztJQUVELElBQVcsTUFBTTtRQUNmLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQztJQUN6QyxDQUFDO0lBRUQsSUFBVyxPQUFPO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQztJQUMxQyxDQUFDO0lBRUQsSUFBVyxPQUFPLENBQUMsT0FBZ0I7UUFDakMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7SUFDN0MsQ0FBQztJQUVELElBQVcsV0FBVztRQUNwQixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUM7SUFDOUMsQ0FBQztJQUVELElBQVcsY0FBYztRQUN2QixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztJQUNsQyxDQUFDO0lBRUQsSUFBVyxZQUFZO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLFlBQVksQ0FBQztJQUMvQyxDQUFDO0lBRU8sb0JBQW9CLENBQUMsa0JBQTJDLEVBQUUsVUFBNEIsRUFBRSxVQUFrQjtRQUN4SCxNQUFNLGlCQUFpQixHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRTdCLE1BQU0sa0JBQWtCLEdBQUcsdUJBQVUsQ0FBQywyQkFBMkIsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDdkcsTUFBTSxrQkFBa0IsR0FBRyx1QkFBVSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDNUQsTUFBTSxzQkFBc0IsR0FBRyxrQkFBa0IsS0FBSyxTQUFTLENBQUM7UUFDaEUsTUFBTSxpQkFBaUIsR0FBRyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDM0UsbUVBQW1FO1FBQ25FLE1BQU0sb0JBQW9CLEdBQUcsS0FBSyxDQUFDO1FBRW5DLE1BQU0sc0JBQXNCLEdBQUcsSUFBSSw2QkFBYSxDQUM5QyxrQkFBa0IsQ0FBQyxJQUFJLEVBQ3ZCLHVCQUFVLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLEVBQ3pELGtCQUFrQixFQUNsQixpQkFBaUIsRUFDakIsb0JBQW9CLEVBQ3BCLHNCQUFzQixFQUN0QixpQkFBaUIsQ0FDbEIsQ0FBQztRQUVGLElBQUksU0FBb0IsQ0FBQztRQUN6QixRQUFRLHNCQUFzQixDQUFDLFNBQVMsRUFBRTtZQUN4QyxLQUFLLFFBQVEsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ2pDLE1BQU0sS0FBSyxHQUFhO29CQUN0QixTQUFTLEVBQUUsc0JBQXNCLENBQUMsSUFBSTtpQkFDdkMsQ0FBQztnQkFFRixTQUFTLEdBQUcsSUFBSSw2QkFBYSxDQUFDLHNCQUFzQixFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUNyRixNQUFNO2FBQ1A7WUFDRCxLQUFLLFFBQVEsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ2pDLE1BQU0sU0FBUyxHQUFjO29CQUMzQixTQUFTLEVBQUUsc0JBQXNCLENBQUMsSUFBSTtvQkFDdEMsV0FBVyxFQUFFLElBQUk7aUJBQ2xCLENBQUM7Z0JBRUYsU0FBUyxHQUFHLElBQUksNkJBQWEsQ0FBQyxzQkFBc0IsRUFBRSxrQkFBa0IsQ0FBQyxjQUFjLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDdEgsTUFBTTthQUNQO1lBQ0QsT0FBTyxDQUFDLENBQUM7Z0JBQ1AsTUFBTSxJQUFJLDJCQUFZLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO2FBQ3BGO1NBQ0Y7UUFFRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0NBQ0Y7QUEzRkQsd0NBMkZDOzs7Ozs7Ozs7Ozs7OztBQ3BHRCxNQUFhLGtCQUFrQjtJQUM3QixZQUNVLFFBQWdCLEVBQ2hCLE1BQWMsRUFDZCxhQUFxQixFQUNyQixPQUFnQixFQUNoQixRQUFpQixFQUNqQixnQkFBMkI7UUFMM0IsYUFBUSxHQUFSLFFBQVEsQ0FBUTtRQUNoQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2Qsa0JBQWEsR0FBYixhQUFhLENBQVE7UUFDckIsWUFBTyxHQUFQLE9BQU8sQ0FBUztRQUNoQixhQUFRLEdBQVIsUUFBUSxDQUFTO1FBQ2pCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBVztJQUNsQyxDQUFDO0lBRUosSUFBVyxPQUFPO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBRUQsSUFBVyxPQUFPLENBQUMsT0FBZTtRQUNoQyxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBVyxLQUFLO1FBQ2QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxJQUFXLEtBQUssQ0FBQyxLQUFhO1FBQzVCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxJQUFXLFlBQVk7UUFDckIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzVCLENBQUM7SUFFRCxJQUFXLE1BQU07UUFDZixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQUVELElBQVcsTUFBTSxDQUFDLFFBQWlCO1FBQ2pDLElBQUksQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDO0lBQzFCLENBQUM7SUFFRCxJQUFXLE9BQU87UUFDaEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxJQUFXLE9BQU8sQ0FBQyxTQUFrQjtRQUNuQyxJQUFJLENBQUMsUUFBUSxHQUFHLFNBQVMsQ0FBQztJQUM1QixDQUFDO0lBRUQsSUFBVyxXQUFXO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDO0lBQy9CLENBQUM7Q0FDRjtBQWpERCxnREFpREM7Ozs7Ozs7Ozs7Ozs7O0FDbkRELE1BQWEsWUFBWTtDQUFHO0FBQTVCLG9DQUE0Qjs7Ozs7Ozs7Ozs7Ozs7QUNBNUIseUlBQThEO0FBQzlELDJKQVcyQztBQUUzQyxrSEFBMkM7QUFDM0Msd0hBQStDO0FBTS9DLGdKQUF5RTtBQUV6RSxtSkFBK0U7QUFFL0Usd0hBQStDO0FBQy9DLG9JQUFxRDtBQUVyRCxrSUFBa0Q7QUFDbEQsbUhBQXdDO0FBSXhDLE1BQWEsYUFBYyxTQUFRLHFCQUFTO0lBQzFDLFlBQ0UsYUFBNEIsRUFDNUIsV0FBbUIsRUFDWCxTQUFtQixFQUNuQixvQkFBMEMsRUFDMUMscUJBQTRDLEVBQzVDLG1CQUFrQyxJQUFJLEVBQ3RDLGNBQWtELElBQUk7UUFFOUQsS0FBSyxDQUFDLGFBQWEsRUFBRSxXQUFXLENBQUMsQ0FBQztRQU4xQixjQUFTLEdBQVQsU0FBUyxDQUFVO1FBQ25CLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBc0I7UUFDMUMsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUF1QjtRQUM1QyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQXNCO1FBQ3RDLGdCQUFXLEdBQVgsV0FBVyxDQUEyQztJQUdoRSxDQUFDO0lBRUQsSUFBVyxlQUFlO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDO0lBQ25DLENBQUM7SUFFRCxJQUFXLGdCQUFnQjtRQUN6QixPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQztJQUNwQyxDQUFDO0lBRUQsSUFBVyxRQUFRO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDO0lBRU0sa0JBQWtCO1FBQ3ZCLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELElBQVcsZUFBZTtRQUN4QixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztJQUMvQixDQUFDO0lBRUQsSUFBVyxVQUFVO1FBQ25CLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBRU0sZ0JBQWdCLENBQ3JCLFNBQWlCLEVBQ2pCLE1BQXFCLEVBQ3JCLFVBQXFDLEVBQ3JDLE9BQStCO1FBRS9CLDJCQUFZLENBQUMsZUFBZSxDQUE0QixVQUFVLEVBQUUsUUFBUSxDQUFDLGdCQUFnQixFQUFFLDJCQUEyQixDQUFDLENBQUM7UUFDNUgsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFFekIsTUFBTSxPQUFPLEdBQUcsb0NBQWtCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxVQUFVLCtCQUFvQyxDQUFDO1FBQ3hHLE9BQU8sT0FBTyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDekYsQ0FBQztJQUVNLHFCQUFxQixDQUFDLFNBQWlCLEVBQUUsYUFBMEM7UUFDeEYsMkJBQVksQ0FBQyxlQUFlLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ3JELDJCQUFZLENBQUMsZUFBZSxDQUFDLGFBQWEsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUM3RCxJQUFJLGFBQWEsQ0FBQyxVQUFVLEVBQUU7WUFDNUIsMkJBQVksQ0FBQyxlQUFlLENBQW1CLGFBQWEsQ0FBQyxVQUFVLEVBQUUsMkNBQWdCLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztTQUNoSDthQUFNO1lBQ0wsMkJBQVksQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFFLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUN6RTtRQUNELElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBRXpCLE1BQU0sT0FBTyxHQUFHLG9DQUFrQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsVUFBVSwrQkFBb0MsQ0FBQztRQUN4RyxPQUFPLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUNoRixDQUFDO0lBRU0sNEJBQTRCLENBQ2pDLFNBQWlCLEVBQ2pCLE1BQW1ELEVBQ25ELFVBQXFDLEVBQ3JDLE9BQStCO1FBRS9CLDJCQUFZLENBQUMsZUFBZSxDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUNyRCwyQkFBWSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDL0MsMkJBQVksQ0FBQyxlQUFlLENBQTRCLFVBQVUsRUFBRSxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsMkJBQTJCLENBQUMsQ0FBQztRQUM1SCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUU7WUFDNUMsTUFBTSxJQUFJLDJCQUFZLENBQ3BCLHFDQUFVLENBQUMsZ0JBQWdCLEVBQzNCLDRGQUE0RixDQUM3RixDQUFDO1NBQ0g7UUFDRCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUV6QixNQUFNLE9BQU8sR0FBRyxvQ0FBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLFVBQVUsK0JBQW9DLENBQUM7UUFDeEcsT0FBTyxPQUFPLENBQUMsNEJBQTRCLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNyRyxDQUFDO0lBRU0sZ0JBQWdCLENBQUMsU0FBaUI7UUFDdkMsMkJBQVksQ0FBQyxlQUFlLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBRXpCLE1BQU0sT0FBTyxHQUFHLG9DQUFrQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsVUFBVSwrQkFBb0MsQ0FBQztRQUN4RyxPQUFPLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFTSw0QkFBNEIsQ0FBQyxTQUFpQixFQUFFLE9BQTJDO1FBQ2hHLDJCQUFZLENBQUMscUJBQXFCLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQzNELDJCQUFZLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNqRCwyQkFBWSxDQUFDLGVBQWUsQ0FBYSxPQUFPLENBQUMsVUFBVSxFQUFFLHFDQUFVLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDdkYsMkJBQVksQ0FBQyxlQUFlLENBQWdCLE9BQU8sQ0FBQyxTQUFTLEVBQUUsd0NBQWEsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUMvRixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUV6QixNQUFNLE9BQU8sR0FBRyxvQ0FBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLFVBQVUsK0JBQW9DLENBQUM7UUFDeEcsT0FBTyxPQUFPLENBQUMsNEJBQTRCLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDakYsQ0FBQztJQUVNLG1CQUFtQjtRQUN4QixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUV6QixNQUFNLE9BQU8sR0FBRyxvQ0FBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLFVBQVUsK0NBQW1ELENBQUM7UUFDdkgsT0FBTyxPQUFPLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBNkIsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUM1RixNQUFNLFVBQVUsR0FBZSxNQUFNLENBQUM7WUFDdEMsTUFBTSx1QkFBdUIsR0FBNEIsVUFBVSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUV0RyxNQUFNLFdBQVcsR0FBK0IsRUFBRSxDQUFDO1lBRW5ELDJGQUEyRjtZQUMzRixNQUFNLFNBQVMsR0FBVyx1QkFBdUIsQ0FBQyxpQkFBaUIsQ0FBQztZQUNwRSxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUVuRiw4REFBOEQ7WUFDOUQsS0FBSyxNQUFNLFdBQVcsSUFBSSx1QkFBdUIsQ0FBQyx3QkFBd0IsRUFBRTtnQkFDMUUsSUFBSSxXQUFXLEtBQUssU0FBUyxFQUFFO29CQUM3QixXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDdEY7YUFDRjtZQUVELE9BQU8sV0FBVyxDQUFDO1FBQ3JCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLGVBQWU7UUFDcEIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFFekIsTUFBTSxPQUFPLEdBQUcsb0NBQWtCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxVQUFVLCtCQUFvQyxDQUFDO1FBQ3hHLE9BQU8sT0FBTyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVNLHFCQUFxQjtRQUMxQixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUV6QixNQUFNLE9BQU8sR0FBRyxvQ0FBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLFVBQVUsa0NBQXNDLENBQUM7UUFDMUcsT0FBTyxPQUFPLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFTSx3QkFBd0I7UUFDN0IsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFFekIsTUFBTSxPQUFPLEdBQUcsb0NBQWtCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxVQUFVLGtDQUFzQyxDQUFDO1FBQzFHLE9BQU8sT0FBTyxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRU0sbUJBQW1CLENBQUMsT0FBdUM7O1FBQ2hFLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBRXpCLE1BQU0sT0FBTyxHQUFHLG9DQUFrQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsVUFBVSxrQ0FBc0MsQ0FBQztRQUMxRyxPQUFPLEdBQUcsT0FBTyxJQUFJLEVBQUUsQ0FBQztRQUV4QixPQUFPLE9BQU8sQ0FBQyxzQkFBc0IsQ0FDbkMsSUFBSSxDQUFDLFFBQVEsRUFDYiw0QkFBVyxDQUFDLE9BQU8sRUFDbkIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQ3ZCLENBQUMsQ0FBQyxPQUFPLENBQUMsZUFBZSxFQUN6QixJQUFJLEVBQ0osT0FBTyxDQUFDLG9CQUFvQixJQUFJLEVBQUUsRUFDbEMsT0FBTyxDQUFDLE9BQU8sSUFBSSxDQUFDLEVBQ3BCLE9BQU8sQ0FBQyx1QkFBdUIsSUFBSSxrREFBdUIsQ0FBQyxTQUFTLFFBQ3BFLE9BQU8sQ0FBQyx3QkFBd0IsdUNBQUksS0FBSyxHQUMxQyxDQUFDO0lBQ0osQ0FBQztJQUVNLHlCQUF5QixDQUFDLFlBQW9CLEVBQUUsT0FBdUM7O1FBQzVGLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBRXpCLE1BQU0sT0FBTyxHQUFHLG9DQUFrQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsVUFBVSxrQ0FBc0MsQ0FBQztRQUMxRyxPQUFPLEdBQUcsT0FBTyxJQUFJLEVBQUUsQ0FBQztRQUV4QixPQUFPLE9BQU8sQ0FBQyx5QkFBeUIsQ0FDdEMsSUFBSSxDQUFDLFFBQVEsRUFDYixZQUFZLElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFLEVBQ3pDLENBQUMsQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUN2QixDQUFDLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFDekIsSUFBSSxFQUFFLGdFQUFnRTtRQUN0RSxPQUFPLENBQUMsb0JBQW9CLElBQUksRUFBRSxFQUNsQyxPQUFPLENBQUMsdUJBQXVCLElBQUksa0RBQXVCLENBQUMsU0FBUyxRQUNwRSxPQUFPLENBQUMsd0JBQXdCLHVDQUFJLEtBQUssR0FDMUMsQ0FBQztJQUNKLENBQUM7SUFFTSwyQkFBMkI7UUFDaEMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFFekIsTUFBTSxPQUFPLEdBQUcsb0NBQWtCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxVQUFVLDBDQUE4QyxDQUFDO1FBRWxILE9BQU8sT0FBTyxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRU0sdUJBQXVCLENBQzVCLGNBQXNCLEVBQ3RCLFlBQW1DLEVBQ25DLE9BQStCLEVBQy9CLFVBQWtCO1FBRWxCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBRXpCLE1BQU0sT0FBTyxHQUFHLG9DQUFrQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsVUFBVSwwQ0FBOEMsQ0FBQztRQUVsSCxPQUFPLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQzNHLENBQUM7SUFFTSx1QkFBdUIsQ0FBQyxjQUFzQixFQUFFLFNBQWlCLEVBQUUsT0FBZSxFQUFFLFVBQWtCO1FBQzNHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBRXpCLE1BQU0sT0FBTyxHQUFHLG9DQUFrQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsVUFBVSwwQ0FBOEMsQ0FBQztRQUVsSCxPQUFPLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3hHLENBQUM7SUFFTSwwQkFBMEIsQ0FDL0IsY0FBc0IsRUFDdEIsWUFBbUMsRUFDbkMsVUFBa0IsRUFDbEIsV0FBbUIsRUFDbkIsT0FBK0I7UUFFL0IsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFFekIsTUFBTSxPQUFPLEdBQUcsb0NBQWtCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxVQUFVLDBDQUE4QyxDQUFDO1FBRWxILE9BQU8sT0FBTyxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzNILENBQUM7SUFFTSwwQkFBMEI7UUFDL0IsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFFekIsTUFBTSxPQUFPLEdBQUcsb0NBQWtCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxVQUFVLGtDQUFzQyxDQUFDO1FBQzFHLE9BQU8sT0FBTyxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRU0sc0JBQXNCLENBQUMsT0FBMEM7O1FBQ3RFLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBRXpCLE1BQU0sT0FBTyxHQUFHLG9DQUFrQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsVUFBVSxrQ0FBc0MsQ0FBQztRQUMxRyxPQUFPLEdBQUcsT0FBTyxJQUFJLEVBQUUsQ0FBQztRQUN4QixPQUFPLE9BQU8sQ0FBQyxzQkFBc0IsQ0FDbkMsSUFBSSxDQUFDLFFBQVEsRUFDYiw0QkFBVyxDQUFDLFVBQVUsRUFDdEIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQ3ZCLENBQUMsQ0FBQyxPQUFPLENBQUMsZUFBZSxFQUN6QixDQUFDLENBQUMsT0FBTyxDQUFDLGlCQUFpQixFQUMzQixPQUFPLENBQUMsb0JBQW9CLElBQUksRUFBRSxFQUNsQyxPQUFPLENBQUMsT0FBTyxJQUFJLENBQUMsRUFDcEIsT0FBTyxDQUFDLHVCQUF1QixJQUFJLGtEQUF1QixDQUFDLFNBQVMsUUFDcEUsT0FBTyxDQUFDLHdCQUF3Qix1Q0FBSSxLQUFLLEdBQzFDLENBQUM7SUFDSixDQUFDO0lBRU0sd0JBQXdCO1FBQzdCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBRXpCLE1BQU0sT0FBTyxHQUFHLG9DQUFrQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsVUFBVSwrQ0FBbUQsQ0FBQztRQUN2SCxPQUFPLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUErQixDQUFDLGlCQUFpQixFQUFFLEVBQUU7WUFDOUcsT0FBTyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLENBQUMsSUFBSSwyQkFBWSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztRQUN6RixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSwyQkFBMkIsQ0FBQyxjQUFzQixFQUFFLE9BQTJDOztRQUNwRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUV6QixNQUFNLE9BQU8sR0FBRyxvQ0FBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLFVBQVUsa0NBQXNDLENBQUM7UUFDMUcsT0FBTyxHQUFHLE9BQU8sSUFBSSxFQUFFLENBQUM7UUFDeEIsT0FBTyxPQUFPLENBQUMsMkJBQTJCLENBQ3hDLElBQUksQ0FBQyxRQUFRLEVBQ2IsY0FBYyxFQUNkLENBQUMsQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUN2QixDQUFDLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFDekIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsRUFDM0IsT0FBTyxDQUFDLG9CQUFvQixJQUFJLEVBQUUsRUFDbEMsT0FBTyxDQUFDLE9BQU8sSUFBSSxDQUFDLEVBQ3BCLE9BQU8sQ0FBQyx1QkFBdUIsSUFBSSxrREFBdUIsQ0FBQyxTQUFTLFFBQ3BFLE9BQU8sQ0FBQyx3QkFBd0IsdUNBQUksS0FBSyxHQUMxQyxDQUFDO0lBQ0osQ0FBQztJQUVNLGlDQUFpQyxDQUN0QyxjQUFzQixFQUN0QixZQUFxQixFQUNyQixPQUEyQzs7UUFFM0MsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFFekIsTUFBTSxPQUFPLEdBQUcsb0NBQWtCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxVQUFVLGtDQUFzQyxDQUFDO1FBQzFHLE9BQU8sR0FBRyxPQUFPLElBQUksRUFBRSxDQUFDO1FBQ3hCLE9BQU8sT0FBTyxDQUFDLGlDQUFpQyxDQUM5QyxJQUFJLENBQUMsUUFBUSxFQUNiLGNBQWMsRUFDZCxZQUFZLElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFLEVBQ3pDLENBQUMsQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUN2QixDQUFDLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFDekIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsRUFDM0IsT0FBTyxDQUFDLG9CQUFvQixJQUFJLEVBQUUsRUFDbEMsT0FBTyxDQUFDLHVCQUF1QixJQUFJLGtEQUF1QixDQUFDLFNBQVMsUUFDcEUsT0FBTyxDQUFDLHdCQUF3Qix1Q0FBSSxLQUFLLEdBQzFDLENBQUM7SUFDSixDQUFDO0lBRU0sdUJBQXVCO1FBQzVCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBRXpCLE1BQU0sT0FBTyxHQUFHLG9DQUFrQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsVUFBVSxxQ0FBMEMsQ0FBQztRQUM5RyxPQUFPLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVNLHVCQUF1QixDQUFDLFVBQTZDLEVBQUUsbUJBQXdDO1FBQ3BILDJCQUFZLENBQUMsZUFBZSxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUN0RCwyQkFBWSxDQUFDLGVBQWUsQ0FBc0IsbUJBQW1CLEVBQUUsOENBQW1CLEVBQUUscUJBQXFCLENBQUMsQ0FBQztRQUNuSCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUV6QixNQUFNLE9BQU8sR0FBRyxvQ0FBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLFVBQVUscUNBQTBDLENBQUM7UUFDOUcsT0FBTyxPQUFPLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztJQUN6RixDQUFDO0lBRU0sb0JBQW9CLENBQUMsVUFBb0MsRUFBRSxtQkFBd0M7UUFDeEcsMkJBQVksQ0FBQyxlQUFlLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ3RELDJCQUFZLENBQUMsZUFBZSxDQUFzQixtQkFBbUIsRUFBRSw4Q0FBbUIsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO1FBQ25ILElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBRXpCLE1BQU0sT0FBTyxHQUFHLG9DQUFrQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsVUFBVSxxQ0FBMEMsQ0FBQztRQUM5RyxPQUFPLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0lBQ3RGLENBQUM7SUFFTSxpQkFBaUIsQ0FBQyxJQUF1QixFQUFFLGNBQXNCO1FBQ3RFLDJCQUFZLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUV6QixNQUFNLE9BQU8sR0FBRyxvQ0FBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLFVBQVUsdUNBQTRDLENBQUM7UUFDaEgsT0FBTyxPQUFPLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVNLG1CQUFtQjtRQUN4QixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUV6QixNQUFNLE9BQU8sR0FBRyxvQ0FBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLFVBQVUsdUNBQTRDLENBQUM7UUFDaEgsT0FBTyxPQUFPLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFTSxxQkFBcUIsQ0FBQyxVQUErQjtRQUMxRCwyQkFBWSxDQUFDLGVBQWUsQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFFekIsTUFBTSxPQUFPLEdBQUcsb0NBQWtCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxVQUFVLHVDQUE0QyxDQUFDO1FBQ2hILE9BQU8sT0FBTyxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVNLHNCQUFzQixDQUFDLFVBQXVCLEVBQUUsTUFBMEI7UUFDL0UsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFFekIsTUFBTSxPQUFPLEdBQUcsb0NBQWtCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxVQUFVLDJEQUE4RCxDQUFDO1FBQ2xJLE9BQU8sT0FBTyxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNyRixDQUFDO0lBRU0sc0JBQXNCLENBQUMsVUFBdUIsRUFBRSxVQUFrQjtRQUN2RSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUV6QixNQUFNLE9BQU8sR0FBRyxvQ0FBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLFVBQVUsMkRBQThELENBQUM7UUFDbEksT0FBTyxPQUFPLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3pGLENBQUM7SUFFTSx1QkFBdUIsQ0FBQyxVQUF1QixFQUFFLFVBQWtCO1FBQ3hFLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBRXpCLE1BQU0sT0FBTyxHQUFHLG9DQUFrQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsVUFBVSwyREFBOEQsQ0FBQztRQUNsSSxPQUFPLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDMUYsQ0FBQztJQUVNLHNCQUFzQixDQUFDLFVBQXVCLEVBQUUsVUFBa0IsRUFBRSxlQUF1QjtRQUNoRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUV6QixNQUFNLE9BQU8sR0FBRyxvQ0FBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLFVBQVUsMkRBQThELENBQUM7UUFDbEksT0FBTyxPQUFPLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxlQUFlLENBQUMsQ0FBQztJQUMxRyxDQUFDO0lBRU0sZUFBZSxDQUFDLFlBQXFCLEVBQUUsT0FBK0IsRUFBRSxpQkFBMkI7UUFDeEcsSUFBSSxJQUFJLENBQUMsMEJBQTBCLEVBQUUsRUFBRTtZQUNyQyxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQ25CLElBQUksMkJBQVksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsbUJBQW1CLEVBQUUsMERBQTBELENBQUMsQ0FDNUgsQ0FBQztTQUNIO1FBRUQsTUFBTSxPQUFPLEdBQUcsb0NBQWtCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxVQUFVLHFDQUEwQyxDQUFDO1FBQzlHLE9BQU8sT0FBTyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztJQUMxRixDQUFDO0lBRU0saUJBQWlCLENBQUMsY0FBNkIsRUFBRSxZQUFvQyxFQUFFLE9BQXdCO1FBQ3BILElBQUksSUFBSSxDQUFDLDBCQUEwQixFQUFFLEVBQUU7WUFDckMsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUNuQixJQUFJLDJCQUFZLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixFQUFFLDREQUE0RCxDQUFDLENBQzlILENBQUM7U0FDSDtRQUVELE1BQU0sT0FBTyxHQUFHLG9DQUFrQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsVUFBVSxxQ0FBMEMsQ0FBQztRQUM5RyxPQUFPLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDekYsQ0FBQztJQUVNLG1CQUFtQixDQUFDLE9BQWU7UUFDeEMsSUFBSSxJQUFJLENBQUMsMEJBQTBCLEVBQUUsRUFBRTtZQUNyQyxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQ25CLElBQUksMkJBQVksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsbUJBQW1CLEVBQUUsOERBQThELENBQUMsQ0FDaEksQ0FBQztTQUNIO1FBQ0QsTUFBTSxPQUFPLEdBQUcsb0NBQWtCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxVQUFVLHFDQUFrRCxDQUFDO1FBQ3RILE9BQU8sT0FBTyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVNLHdCQUF3QjtRQUM3QixJQUFJLElBQUksQ0FBQywwQkFBMEIsRUFBRSxFQUFFO1lBQ3JDLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FDbkIsSUFBSSwyQkFBWSxDQUNkLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsRUFDN0MsbUVBQW1FLENBQ3BFLENBQ0YsQ0FBQztTQUNIO1FBQ0QsTUFBTSxPQUFPLEdBQUcsb0NBQWtCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxVQUFVLHFDQUFrRCxDQUFDO1FBQ3RILE9BQU8sT0FBTyxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRU0sc0JBQXNCLENBQUMsU0FBaUI7UUFDN0MsTUFBTSxPQUFPLEdBQUcsb0NBQWtCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxVQUFVLDBDQUE4QyxDQUFDO1FBQ2xILE9BQU8sT0FBTyxDQUFDLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFTyx3QkFBd0IsQ0FBQyxjQUE4QjtRQUM3RCxNQUFNLGNBQWMsR0FBRyxJQUFJLCtCQUFjLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM1RSxNQUFNLFVBQVUsR0FBRyxJQUFJLHVCQUFVLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDbEQsY0FBYyxDQUFDLDhCQUE4QixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzFELE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFFTyxpQkFBaUI7UUFDdkIsTUFBTSx3QkFBd0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzdDLE1BQU0sdUJBQXVCLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDL0QsTUFBTSx3QkFBd0IsR0FBRyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUVqRSxJQUFJLENBQUMsd0JBQXdCLElBQUksQ0FBQyx1QkFBdUIsSUFBSSxDQUFDLHdCQUF3QixFQUFFO1lBQ3RGLE1BQU0sSUFBSSwyQkFBWSxDQUFDLDJDQUFnQixDQUFDLGNBQWMsRUFBRSwyQ0FBMkMsQ0FBQyxDQUFDO1NBQ3RHO0lBQ0gsQ0FBQztJQUVPLHdCQUF3QjtRQUM5QixPQUFPLElBQUksQ0FBQyxxQkFBcUIsSUFBSSxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDO0lBQ3pFLENBQUM7SUFFTyx1QkFBdUI7UUFDN0IsT0FBTyxJQUFJLENBQUMsb0JBQW9CLElBQUksSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQztJQUN2RSxDQUFDO0lBRU8sMEJBQTBCO1FBQ2hDLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixLQUFLLElBQUksQ0FBQztJQUM1QyxDQUFDO0NBQ0Y7QUExY0Qsc0NBMGNDOzs7Ozs7Ozs7Ozs7OztBQ3hlRDs7O0dBR0c7QUFDSCxNQUFhLFlBQVk7SUFDdkIsWUFBMkIsYUFBK0I7UUFBL0Isa0JBQWEsR0FBYixhQUFhLENBQWtCO0lBQUcsQ0FBQztJQUU5RCxJQUFXLEVBQUU7UUFDWCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFRCxJQUFXLE9BQU87UUFDaEIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQztJQUNwQyxDQUFDO0NBQ0Y7QUFWRCxvQ0FVQzs7Ozs7Ozs7Ozs7Ozs7QUNmRCxNQUFhLHVCQUF1QjtJQUNsQyxZQUEwQixpQkFBMkIsRUFBUyxPQUFlO1FBQW5ELHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBVTtRQUFTLFlBQU8sR0FBUCxPQUFPLENBQVE7SUFBRyxDQUFDO0NBQ2xGO0FBRkQsMERBRUM7Ozs7Ozs7Ozs7Ozs7O0FDSEQsMkpBQTRHO0FBSTVHLG1KQUErRTtBQUMvRSxvSUFBcUQ7QUFFckQsTUFBYSxNQUFNO0lBQ2pCLFlBQ1ksY0FBc0IsRUFDdEIsVUFBa0IsRUFDbEIsV0FBdUIsRUFDdkIsUUFBZ0IsRUFDaEIsV0FBbUI7UUFKbkIsbUJBQWMsR0FBZCxjQUFjLENBQVE7UUFDdEIsZUFBVSxHQUFWLFVBQVUsQ0FBUTtRQUNsQixnQkFBVyxHQUFYLFdBQVcsQ0FBWTtRQUN2QixhQUFRLEdBQVIsUUFBUSxDQUFRO1FBQ2hCLGdCQUFXLEdBQVgsV0FBVyxDQUFRO0lBQzVCLENBQUM7SUFFSixJQUFXLGFBQWE7UUFDdEIsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQzdCLENBQUM7SUFFRCxJQUFXLFNBQVM7UUFDbEIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxJQUFXLE9BQU87UUFDaEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxJQUFXLFVBQVU7UUFDbkIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7SUFFTSxhQUFhO1FBQ2xCLE1BQU0sT0FBTyxHQUFHLG9DQUFrQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsVUFBVSwrQ0FBbUQsQ0FBQztRQUN2SCxPQUFPLE9BQU8sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFTSx5QkFBeUI7UUFDOUIsTUFBTSxPQUFPLEdBQUcsb0NBQWtCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxVQUFVLCtCQUFvQyxDQUFDO1FBQ3hHLE9BQU8sT0FBTyxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQy9FLENBQUM7SUFFTSx5QkFBeUIsQ0FBQyxpQkFBZ0M7UUFDL0QsMkJBQVksQ0FBQyxlQUFlLENBQUMsaUJBQWlCLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUNyRSxNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDcEQsTUFBTSxPQUFPLEdBQUcsb0NBQWtCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxVQUFVLCtCQUFvQyxDQUFDO1FBQ3hHLE9BQU8sT0FBTyxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO0lBQzlILENBQUM7Q0FDRjtBQXpDRCx3QkF5Q0M7QUFFRCxNQUFhLGlCQUFrQixTQUFRLE1BQU07SUFDM0MsWUFDRSxhQUFxQixFQUNyQixTQUFpQixFQUNqQixPQUFlLEVBQ2YsVUFBc0IsRUFDdEIsVUFBa0IsRUFDVixjQUF5QyxFQUN6QyxjQUF1QixFQUN2QixjQUF3QjtRQUVoQyxLQUFLLENBQUMsYUFBYSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBSnpELG1CQUFjLEdBQWQsY0FBYyxDQUEyQjtRQUN6QyxtQkFBYyxHQUFkLGNBQWMsQ0FBUztRQUN2QixtQkFBYyxHQUFkLGNBQWMsQ0FBVTtJQUdsQyxDQUFDO0lBRUQsSUFBVyxhQUFhO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUM3QixDQUFDO0lBRUQsSUFBVyxhQUFhO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUM3QixDQUFDO0lBRUQsSUFBVyxhQUFhO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUM3QixDQUFDO0lBRU0sY0FBYyxDQUFDLFVBQTZCO1FBQ2pELElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDZixVQUFVLEdBQUcsMkNBQWdCLENBQUMsUUFBUSxDQUFDO1NBQ3hDO1FBRUQsMkJBQVksQ0FBQyxlQUFlLENBQW1CLFVBQVUsRUFBRSwyQ0FBZ0IsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1FBRWpHLE1BQU0sT0FBTyxHQUFHLG9DQUFrQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsVUFBVSwrQkFBb0MsQ0FBQztRQUN4RyxPQUFPLE9BQU8sQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDM0YsQ0FBQztDQUNGO0FBcENELDhDQW9DQztBQUVELE1BQWEscUJBQXFCO0lBQ2hDLFlBQTJCLE1BQTBCLEVBQVUsaUJBQXlCLEVBQVUsTUFBYztRQUFyRixXQUFNLEdBQU4sTUFBTSxDQUFvQjtRQUFVLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBUTtRQUFVLFdBQU0sR0FBTixNQUFNLENBQVE7SUFBRyxDQUFDO0lBRXBILElBQVcsS0FBSztRQUNkLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0lBRUQsSUFBVyxnQkFBZ0I7UUFDekIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUM7SUFDaEMsQ0FBQztJQUVELElBQVcsS0FBSztRQUNkLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0NBQ0Y7QUFkRCxzREFjQztBQUVELE1BQWEsdUJBQXVCO0lBQ2xDLFlBQTJCLEtBQWEsRUFBVSxvQkFBcUQ7UUFBNUUsVUFBSyxHQUFMLEtBQUssQ0FBUTtRQUFVLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBaUM7SUFBRyxDQUFDO0lBRTNHLElBQVcsSUFBSTtRQUNiLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0lBRUQsSUFBVyxtQkFBbUI7UUFDNUIsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUM7SUFDbkMsQ0FBQztDQUNGO0FBVkQsMERBVUM7QUFFRCxNQUFhLGtCQUFtQixTQUFRLE1BQU07SUFDNUMsWUFDRSxhQUFxQixFQUNyQixTQUFpQixFQUNqQixPQUFlLEVBQ2YsVUFBc0IsRUFDdEIsVUFBa0IsRUFDVixjQUFzQixFQUN0QixpQkFBeUIsRUFDekIsZUFBdUIsRUFDdkIsYUFBc0QsRUFDdEQsY0FBMkQsRUFDM0QsY0FBdUI7UUFFL0IsS0FBSyxDQUFDLGFBQWEsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztRQVB6RCxtQkFBYyxHQUFkLGNBQWMsQ0FBUTtRQUN0QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQVE7UUFDekIsb0JBQWUsR0FBZixlQUFlLENBQVE7UUFDdkIsa0JBQWEsR0FBYixhQUFhLENBQXlDO1FBQ3RELG1CQUFjLEdBQWQsY0FBYyxDQUE2QztRQUMzRCxtQkFBYyxHQUFkLGNBQWMsQ0FBUztJQUdqQyxDQUFDO0lBQ0QsY0FBYyxDQUFDLFVBQXNDO1FBQ25ELE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQsSUFBVyxhQUFhO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUM3QixDQUFDO0lBRUQsSUFBVyxnQkFBZ0I7UUFDekIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUM7SUFDaEMsQ0FBQztJQUVELElBQVcsY0FBYztRQUN2QixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDOUIsQ0FBQztJQUVELElBQVcsWUFBWTtRQUNyQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDNUIsQ0FBQztJQUVELElBQVcsYUFBYTtRQUN0QixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDN0IsQ0FBQztJQUVELElBQVcsYUFBYTtRQUN0QixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDN0IsQ0FBQztDQUNGO0FBM0NELGdEQTJDQztBQUVELE1BQWEsV0FBWSxTQUFRLE1BQU07SUFDckMsWUFDRSxhQUFxQixFQUNyQixTQUFpQixFQUNqQixPQUFlLEVBQ2YsVUFBc0IsRUFDdEIsVUFBa0IsRUFDVixJQUF3QixFQUN4QixJQUF3QixFQUN4QixrQkFBMkI7UUFFbkMsS0FBSyxDQUFDLGFBQWEsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUp6RCxTQUFJLEdBQUosSUFBSSxDQUFvQjtRQUN4QixTQUFJLEdBQUosSUFBSSxDQUFvQjtRQUN4Qix1QkFBa0IsR0FBbEIsa0JBQWtCLENBQVM7SUFHckMsQ0FBQztJQUVELElBQVcsUUFBUTtRQUNqQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUVELElBQVcsUUFBUTtRQUNqQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUVELElBQVcsaUJBQWlCO1FBQzFCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDO0lBQ2pDLENBQUM7SUFFTSxjQUFjLENBQUMsVUFBNkI7UUFDakQsTUFBTSxPQUFPLEdBQUcsb0NBQWtCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxVQUFVLCtCQUFvQyxDQUFDO1FBQ3hHLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDZixVQUFVLEdBQUcsMkNBQWdCLENBQUMsUUFBUSxDQUFDO1NBQ3hDO1FBRUQsMkJBQVksQ0FBQyxlQUFlLENBQW1CLFVBQVUsRUFBRSwyQ0FBZ0IsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1FBRWpHLE9BQU8sT0FBTyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUNyRixDQUFDO0NBQ0Y7QUFwQ0Qsa0NBb0NDO0FBRUQsTUFBYSxrQkFBbUIsU0FBUSxNQUFNO0lBQzVDLFlBQ0UsYUFBcUIsRUFDckIsU0FBaUIsRUFDakIsT0FBZSxFQUNmLFVBQXNCLEVBQ3RCLFVBQWtCLEVBQ1YsV0FBK0IsRUFDL0IsV0FBdUIsRUFDdkIsVUFBeUIsRUFDekIsT0FBZTtRQUV2QixLQUFLLENBQUMsYUFBYSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBTHpELGdCQUFXLEdBQVgsV0FBVyxDQUFvQjtRQUMvQixnQkFBVyxHQUFYLFdBQVcsQ0FBWTtRQUN2QixlQUFVLEdBQVYsVUFBVSxDQUFlO1FBQ3pCLFlBQU8sR0FBUCxPQUFPLENBQVE7SUFHekIsQ0FBQztJQUVELElBQVcsVUFBVTtRQUNuQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQVcsVUFBVTtRQUNuQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQVcsU0FBUztRQUNsQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDekIsQ0FBQztJQUVELElBQVcsTUFBTTtRQUNmLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0NBQ0Y7QUE5QkQsZ0RBOEJDO0FBRUQsTUFBYSxpQkFBaUI7SUFDNUIsWUFBMkIsT0FBa0MsRUFBVSxXQUE2QjtRQUF6RSxZQUFPLEdBQVAsT0FBTyxDQUEyQjtRQUFVLGdCQUFXLEdBQVgsV0FBVyxDQUFrQjtJQUFHLENBQUM7SUFFeEcsSUFBVyxNQUFNO1FBQ2YsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxJQUFXLElBQUk7UUFDYixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztDQUNGO0FBVkQsOENBVUM7QUFFRCxNQUFhLFdBQVc7SUFDdEIsWUFBMkIsSUFBd0IsRUFBVSxJQUF3QixFQUFVLFdBQTZCO1FBQWpHLFNBQUksR0FBSixJQUFJLENBQW9CO1FBQVUsU0FBSSxHQUFKLElBQUksQ0FBb0I7UUFBVSxnQkFBVyxHQUFYLFdBQVcsQ0FBa0I7SUFBRyxDQUFDO0lBRWhJLElBQVcsSUFBSTtRQUNiLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBVyxHQUFHO1FBQ1osT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ25CLENBQUM7SUFFRCxJQUFXLEdBQUc7UUFDWixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQztDQUNGO0FBZEQsa0NBY0M7Ozs7Ozs7Ozs7Ozs7O0FDL1BELE1BQWEsU0FBUztJQUdwQixZQUNVLEtBQXVDLEVBQ3ZDLFFBQWdDLEVBQ2hDLGNBQXNCLEVBQ3RCLHVCQUFnQyxFQUNoQyxjQUF1QixFQUN2QixVQUE0QjtRQUw1QixVQUFLLEdBQUwsS0FBSyxDQUFrQztRQUN2QyxhQUFRLEdBQVIsUUFBUSxDQUF3QjtRQUNoQyxtQkFBYyxHQUFkLGNBQWMsQ0FBUTtRQUN0Qiw0QkFBdUIsR0FBdkIsdUJBQXVCLENBQVM7UUFDaEMsbUJBQWMsR0FBZCxjQUFjLENBQVM7UUFDdkIsZUFBVSxHQUFWLFVBQVUsQ0FBa0I7UUFFcEMsSUFBSSxDQUFDLEtBQUssR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQztJQUMvRSxDQUFDO0lBRUQsSUFBVyxJQUFJO1FBQ2IsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFFRCxJQUFXLElBQUk7UUFDYixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQUVELElBQVcsT0FBTztRQUNoQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVELElBQVcsU0FBUztRQUNsQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDekIsQ0FBQztJQUVELElBQVcsYUFBYTtRQUN0QixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDN0IsQ0FBQztJQUVELElBQVcsc0JBQXNCO1FBQy9CLE9BQU8sSUFBSSxDQUFDLHVCQUF1QixDQUFDO0lBQ3RDLENBQUM7SUFFRCxJQUFXLGFBQWE7UUFDdEIsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQzdCLENBQUM7Q0FDRjtBQXpDRCw4QkF5Q0M7QUFFRCxNQUFhLFFBQVE7SUFDbkIsWUFBMkIsS0FBZSxFQUFVLE1BQWMsRUFBVSxRQUFpQjtRQUFsRSxVQUFLLEdBQUwsS0FBSyxDQUFVO1FBQVUsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUFVLGFBQVEsR0FBUixRQUFRLENBQVM7SUFBRyxDQUFDO0lBRWpHLElBQVcsSUFBSTtRQUNiLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0lBRUQsSUFBVyxLQUFLO1FBQ2QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxJQUFXLE9BQU87UUFDaEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7Q0FDRjtBQWRELDRCQWNDO0FBRUQsTUFBYSxNQUFNO0lBQ2pCLFlBQ1UsVUFBa0IsRUFDbEIsUUFBZ0IsRUFDaEIsU0FBbUIsRUFDbkIsYUFBc0IsRUFDdEIsTUFBYztRQUpkLGVBQVUsR0FBVixVQUFVLENBQVE7UUFDbEIsYUFBUSxHQUFSLFFBQVEsQ0FBUTtRQUNoQixjQUFTLEdBQVQsU0FBUyxDQUFVO1FBQ25CLGtCQUFhLEdBQWIsYUFBYSxDQUFTO1FBQ3RCLFdBQU0sR0FBTixNQUFNLENBQVE7SUFDckIsQ0FBQztJQUVKLElBQVcsU0FBUztRQUNsQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDekIsQ0FBQztJQUVELElBQVcsT0FBTztRQUNoQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVELElBQVcsUUFBUTtRQUNqQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQUVELElBQVcsWUFBWTtRQUNyQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDNUIsQ0FBQztJQUVELElBQVcsS0FBSztRQUNkLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0NBQ0Y7QUE1QkQsd0JBNEJDO0FBRUQsTUFBYSxTQUFTO0lBQ3BCLDJCQUEyQjtJQUMzQixZQUNVLE1BQVcsRUFDWCxZQUFpQixFQUNqQixlQUF3QixFQUN4QixXQUFvQixFQUNwQixTQUFtQjtRQUpuQixXQUFNLEdBQU4sTUFBTSxDQUFLO1FBQ1gsaUJBQVksR0FBWixZQUFZLENBQUs7UUFDakIsb0JBQWUsR0FBZixlQUFlLENBQVM7UUFDeEIsZ0JBQVcsR0FBWCxXQUFXLENBQVM7UUFDcEIsY0FBUyxHQUFULFNBQVMsQ0FBVTtJQUMxQixDQUFDO0lBRUosSUFBVyxLQUFLO1FBQ2QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxJQUFXLFdBQVc7UUFDcEIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzNCLENBQUM7SUFFRCxJQUFXLGNBQWM7UUFDdkIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQzlCLENBQUM7SUFFRCxJQUFXLFVBQVU7UUFDbkIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7SUFFRCxJQUFXLFFBQVE7UUFDakIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7Q0FFRjtBQTlCRCw4QkE4QkM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDeEhELG1KQUErRTtBQUMvRSxvSUFBcUQ7QUFFckQsTUFBYSxlQUFlO0lBQzFCLFlBQTZCLEdBQVcsRUFBWSxjQUFzQixFQUFZLGFBQWEsRUFBVSxXQUFtQjtRQUFuRyxRQUFHLEdBQUgsR0FBRyxDQUFRO1FBQVksbUJBQWMsR0FBZCxjQUFjLENBQVE7UUFBWSxrQkFBYSxHQUFiLGFBQWE7UUFBVSxnQkFBVyxHQUFYLFdBQVcsQ0FBUTtRQUM5SCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxHQUFHLGFBQWEsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFHRCxJQUFXLGFBQWE7UUFDdEIsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQzdCLENBQUM7SUFFRCxJQUFXLFNBQVM7UUFDbEIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pCLENBQUM7SUFFTSxZQUFZLENBQUMsVUFBa0I7UUFDcEMsMkJBQVksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDekQsTUFBTSxPQUFPLEdBQUcsb0NBQWtCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxVQUFVLGtDQUFzQyxDQUFDO1FBQzFHLE9BQU8sT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVZLGdCQUFnQixDQUFDLE9BQWdCOztZQUM1QyxNQUFNLFNBQVMsR0FBdUIsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pFLE9BQU8sR0FBRyxPQUFPLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQztZQUN4QyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDNUQsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBRXJFLDRGQUE0RjtZQUM1RixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNuRCxNQUFNLGFBQWEsR0FBRyxZQUFZLEdBQUcsY0FBYyxDQUFDO1lBQ3BELElBQUksYUFBYSxHQUE0QyxFQUFFLENBQUM7WUFDaEUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDckMsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN4QyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUMvQjtZQUVELElBQUksUUFBUSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsYUFBYSxDQUFDLENBQUM7WUFDdkQsb0ZBQW9GO1lBQ3BGLFFBQVEsQ0FBQyxNQUFNLEdBQUcsYUFBYSxDQUFDO1lBRWhDLE9BQU87Z0JBQ0wsSUFBSSxFQUFFLFNBQVMsQ0FBQyxJQUFJO2dCQUNwQixJQUFJLEVBQUUsUUFBUTtnQkFDZCxPQUFPLEVBQUUsU0FBUyxDQUFDLE9BQU87Z0JBQzFCLGFBQWEsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxhQUFhO2dCQUNoRixzQkFBc0IsRUFBRSxhQUFhO2dCQUNyQyxhQUFhLEVBQUUsU0FBUyxDQUFDLGFBQWE7YUFDdkMsQ0FBQztRQUNKLENBQUM7S0FBQTtJQUVNLFlBQVk7UUFDakIsTUFBTSxPQUFPLEdBQUcsb0NBQWtCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxVQUFVLGtDQUFzQyxDQUFDO1FBQzFHLE9BQU8sT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDeEMsQ0FBQztDQUNGO0FBckRELDBDQXFEQzs7Ozs7Ozs7Ozs7Ozs7QUN2REQ7O0dBRUc7QUFDSCxNQUFhLGNBQWM7Q0FFMUI7QUFGRCx3Q0FFQztBQUVEOztHQUVHO0FBQ0gsTUFBYSxtQkFBb0IsU0FBUSxjQUFjO0lBQXZEOztRQUNTLGlCQUFZLEdBQWtCLEVBQUUsQ0FBQztJQUMxQyxDQUFDO0NBQUE7QUFGRCxrREFFQztBQUVEOztHQUVHO0FBQ0gsTUFBYSwwQkFBMkIsU0FBUSxtQkFBbUI7Q0FBRztBQUF0RSxnRUFBc0U7QUFFdEU7O0dBRUc7QUFDSCxNQUFhLG1CQUFvQixTQUFRLGNBQWM7Q0FJdEQ7QUFKRCxrREFJQztBQUVEOztHQUVHO0FBQ0gsTUFBYSx1QkFBd0IsU0FBUSxtQkFBbUI7Q0FBRztBQUFuRSwwREFBbUU7QUFDbkU7O0dBRUc7QUFDSCxNQUFhLG1CQUFtQjtJQUFoQztRQUVTLGNBQVMsR0FBa0IsRUFBRSxDQUFDO0lBQ3ZDLENBQUM7Q0FBQTtBQUhELGtEQUdDO0FBRUQ7O0dBRUc7QUFDSCxNQUFhLHdCQUF3QjtJQUFyQztRQUNTLGlCQUFZLEdBQXNDLEVBQUUsQ0FBQztRQUNyRCxnQkFBVyxHQUFtQyxFQUFFLENBQUM7UUFDakQsa0JBQWEsR0FBK0IsRUFBRSxDQUFDO0lBRXhELENBQUM7Q0FBQTtBQUxELDREQUtDO0FBRUQsTUFBYSw0QkFBNEI7SUFDdkMsWUFDUyxpQkFBMkIsRUFDM0IsV0FBMEIsRUFBRSxFQUM1QixhQUE0QixFQUM1QixjQUErQjtRQUgvQixzQkFBaUIsR0FBakIsaUJBQWlCLENBQVU7UUFDM0IsYUFBUSxHQUFSLFFBQVEsQ0FBb0I7UUFDNUIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsbUJBQWMsR0FBZCxjQUFjLENBQWlCO0lBQ3JDLENBQUM7Q0FDTDtBQVBELG9FQU9DO0FBRUQsTUFBYSwwQkFBMEI7SUFDckMsWUFDUyxpQkFBMkIsRUFDM0IsT0FBZSxFQUNmLGNBQXNDLEVBQ3RDLGlCQUEyQjtRQUgzQixzQkFBaUIsR0FBakIsaUJBQWlCLENBQVU7UUFDM0IsWUFBTyxHQUFQLE9BQU8sQ0FBUTtRQUNmLG1CQUFjLEdBQWQsY0FBYyxDQUF3QjtRQUN0QyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQVU7SUFDakMsQ0FBQztDQUNMO0FBUEQsZ0VBT0M7Ozs7Ozs7Ozs7Ozs7O0FDbkVELE1BQWEsS0FBSztJQUNoQixZQUEyQixFQUFVLEVBQVUsRUFBVTtRQUE5QixPQUFFLEdBQUYsRUFBRSxDQUFRO1FBQVUsT0FBRSxHQUFGLEVBQUUsQ0FBUTtJQUFHLENBQUM7SUFFN0QsSUFBVyxDQUFDO1FBQ1YsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDO0lBQ2pCLENBQUM7SUFFRCxJQUFXLENBQUM7UUFDVixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUM7SUFDakIsQ0FBQztDQUNGO0FBVkQsc0JBVUM7Ozs7Ozs7Ozs7Ozs7O0FDUEQ7O0dBRUc7QUFDSCxJQUFZLFdBR1g7QUFIRCxXQUFZLFdBQVc7SUFDckIsa0NBQW1CO0lBQ25CLHdDQUF5QjtBQUMzQixDQUFDLEVBSFcsV0FBVyxHQUFYLG1CQUFXLEtBQVgsbUJBQVcsUUFHdEI7Ozs7Ozs7Ozs7Ozs7O0FDVkQseUlBQXVEO0FBQ3ZELDhLQUEyRTtBQUMzRSxrS0FBbUU7QUFDbkUscUtBQXFFO0FBQ3JFLHFLQUFxRTtBQUNyRSx5SkFBNkQ7QUFDN0QsZ01BQXVGO0FBQ3ZGLHlKQUE2RDtBQUM3RCw0SkFBK0Q7QUFDL0QsMktBQXlFO0FBQ3pFLHFLQUFxRTtBQUNyRSxrS0FBbUU7QUFDbkUsbUpBQXlEO0FBQ3pELHdLQUF1RTtBQUN2RSxnSkFBdUQ7QUFDdkQsbUpBQXlEO0FBRXpELFNBQWdCLHlCQUF5QixDQUFDLFVBQWlDLEVBQUUsVUFBa0I7SUFDN0Ysb0NBQWtCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxJQUFJLDJDQUFvQixDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBQ3JHLG9DQUFrQixDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxlQUFlLENBQUMsSUFBSSw2Q0FBcUIsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUN0RyxvQ0FBa0IsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsZUFBZSxDQUFDLElBQUkscUNBQWlCLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFDbEcsb0NBQWtCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxJQUFJLHVDQUFrQixDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBQ25HLG9DQUFrQixDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxlQUFlLENBQUMsSUFBSSxxQ0FBaUIsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUNsRyxvQ0FBa0IsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsZUFBZSxDQUFDLElBQUksaURBQXVCLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUM1RixvQ0FBa0IsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsZUFBZSxDQUFDLElBQUksNkNBQXFCLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFDdEcsb0NBQWtCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxJQUFJLDJDQUFvQixDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBQ3JHLG9DQUFrQixDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxlQUFlLENBQUMsSUFBSSw2Q0FBcUIsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUN0RyxvQ0FBa0IsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsZUFBZSxDQUFDLElBQUksaUNBQWUsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUNoRyxvQ0FBa0IsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsZUFBZSxDQUFDLElBQUksaUNBQWUsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUNoRyxvQ0FBa0IsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsZUFBZSxDQUFDLElBQUksK0NBQXNCLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFDdkcsb0NBQWtCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxJQUFJLCtCQUFjLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFDL0Ysb0NBQWtCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxJQUFJLCtEQUE4QixDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBQy9HLG9DQUFrQixDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxlQUFlLENBQUMsSUFBSSxtREFBd0IsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQztBQUMzRyxDQUFDO0FBaEJELDhEQWdCQzs7Ozs7Ozs7Ozs7Ozs7QUNsQ0QsMkpBQStEO0FBQy9ELHdIQUErQztBQThDL0MsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLEVBQUU7SUFDakMsTUFBTSxDQUFDLDJCQUEyQixHQUFHLE1BQU0sQ0FBQywyQkFBMkIsSUFBSSxFQUFFLENBQUM7Q0FDL0U7QUFzQkQsTUFBTSxtQkFBbUI7SUFHdkI7UUFDRSxJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRU0sZUFBZSxDQUFDLE9BQW1CO1FBQ3hDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxHQUFHLE9BQU8sQ0FBQztJQUNoRCxDQUFDO0lBRU0sVUFBVSxDQUF1QixXQUFtQjtRQUN6RCxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDL0MsTUFBTSxJQUFJLDJCQUFZLENBQUMscUNBQVUsQ0FBQyxhQUFhLEVBQUUsMkJBQTJCLFdBQVcsRUFBRSxDQUFDLENBQUM7U0FDNUY7UUFFRCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFNLENBQUM7SUFDMUMsQ0FBQztDQUNGO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQWEsa0JBQWtCO0lBQzdCOztPQUVHO0lBQ0ksTUFBTSxDQUFDLEdBQUcsQ0FBQyxVQUFrQjtRQUNsQyxJQUFJLENBQUMsTUFBTSxDQUFDLDJCQUEyQixJQUFJLENBQUMsTUFBTSxDQUFDLDJCQUEyQixDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQzFGLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsSUFBSSxtQkFBbUIsRUFBRSxDQUFDLENBQUM7U0FDdkU7UUFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLDJCQUEyQixDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ25ELE1BQU0sSUFBSSwyQkFBWSxDQUFDLHFDQUFVLENBQUMsYUFBYSxFQUFFLHlCQUF5QixDQUFDLENBQUM7U0FDN0U7UUFFRCxPQUFPLE1BQU0sQ0FBQywyQkFBMkIsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxXQUFXLENBQUMsVUFBa0IsRUFBRSxlQUFnQztRQUM1RSxJQUFJLENBQUMsTUFBTSxDQUFDLDJCQUEyQixFQUFFO1lBQ3ZDLE1BQU0sQ0FBQywyQkFBMkIsR0FBRyxFQUFFLENBQUM7U0FDekM7UUFDRCxNQUFNLENBQUMsMkJBQTJCLENBQUMsVUFBVSxDQUFDLEdBQUcsZUFBZSxDQUFDO0lBQ25FLENBQUM7SUFFRDs7T0FFRztJQUNJLE1BQU0sQ0FBQyxhQUFhO1FBQ3pCLE1BQU0sQ0FBQywyQkFBMkIsR0FBRyxFQUFFLENBQUM7SUFDMUMsQ0FBQztJQUVELDRDQUE0QztJQUM1QyxnQkFBdUIsQ0FBQztDQUN6QjtBQXJDRCxnREFxQ0M7Ozs7Ozs7Ozs7Ozs7O0FDM0lELGdLQUFxRztBQUNyRyw4SkFBMkU7QUFHM0UsOElBQW9EO0FBRXBELE1BQWEsd0JBQXlCLFNBQVEsaUNBQWU7SUFDM0QsSUFBVyxXQUFXO1FBQ3BCLDJDQUFrQztJQUNwQyxDQUFDO0lBRU0sbUJBQW1CLENBQUMsUUFBa0IsRUFBRSxPQUFlO1FBQzVELElBQUksa0JBQWtCLEdBQUcsSUFBSSw2Q0FBdUIsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFeEUsTUFBTSxVQUFVLEdBQXNCO1lBQ3BDLENBQUMsc0NBQVcsQ0FBQyxZQUFZLENBQUMsRUFBRSxxQkFBcUI7WUFDakQsQ0FBQyxzQ0FBVyxDQUFDLGtCQUFrQixDQUFDLEVBQUUsa0JBQWtCO1NBQ3JELENBQUM7UUFFRixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsaUNBQU0sQ0FBQyxjQUFjLEVBQUUsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFTLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDL0UsT0FBTyxRQUFRLENBQUMsTUFBZ0IsQ0FBQztRQUNuQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSx3QkFBd0IsQ0FBQyxRQUFrQjtRQUNoRCxNQUFNLFVBQVUsR0FBc0I7WUFDcEMsQ0FBQyxzQ0FBVyxDQUFDLFlBQVksQ0FBQyxFQUFFLDBCQUEwQjtZQUN0RCxDQUFDLHNDQUFXLENBQUMsUUFBUSxDQUFDLEVBQUUsUUFBUTtTQUNqQyxDQUFDO1FBRUYsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGlDQUFNLENBQUMsNkJBQTZCLEVBQUUsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFPLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDNUYsT0FBTztRQUNULENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBNUJELDREQTRCQzs7Ozs7Ozs7Ozs7Ozs7QUNsQ0QsMkpBQW9FO0FBQ3BFLGdLQUF3RTtBQUN4RSwyTUFBNEg7QUFDNUgsdUlBQXdEO0FBR3hELDhJQUFvRDtBQUVwRCxNQUFhLG9CQUFxQixTQUFRLGlDQUFlO0lBQ3ZELElBQVcsV0FBVztRQUNwQiwyQ0FBOEI7SUFDaEMsQ0FBQztJQUVNLFdBQVcsQ0FBQyxXQUE0QjtRQUM3QyxNQUFNLFVBQVUsR0FBRztZQUNqQixDQUFDLHNDQUFXLENBQUMsV0FBVyxDQUFDLEVBQUUsR0FBRztTQUMvQixDQUFDO1FBRUYsMkJBQVksQ0FBQyxlQUFlLENBQWtCLFdBQVcsRUFBRSwwQ0FBZSxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFDL0YsVUFBVSxDQUFDLHNDQUFXLENBQUMsV0FBVyxDQUFDLEdBQUcsK0RBQXFCLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRXBHLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQ0FBTSxDQUFDLGVBQWUsRUFBRSxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQU8sQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUM5RSxPQUFPO1FBQ1QsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUFqQkQsb0RBaUJDOzs7Ozs7Ozs7Ozs7OztBQ3pCRCx5SUFBOEQ7QUFDOUQsZ0tBQStIO0FBQy9ILDJNQUFtRztBQUNuRyxrSkFBNkY7QUFDN0YsMkhBQWtEO0FBR2xELDhJQUFvRDtBQUVwRCxNQUFhLHFCQUFzQixTQUFRLGlDQUFlO0lBQ3hELElBQVcsV0FBVztRQUNwQiw2Q0FBK0I7SUFDakMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGlCQUFpQixDQUFDLFFBQWtCLEVBQUUsSUFBdUIsRUFBRSxjQUFzQjtRQUMxRixNQUFNLHVCQUF1QixHQUE2QixJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzdGLE1BQU0sZ0JBQWdCLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUN4QyxNQUFNLGFBQWEsR0FBRyx3QkFBd0IsY0FBYyx5QkFBeUIsQ0FBQztRQUV0RixNQUFNLFVBQVUsR0FBc0I7WUFDcEMsQ0FBQyxzQ0FBVyxDQUFDLFlBQVksQ0FBQyxFQUFFLG1CQUFtQjtZQUMvQyxDQUFDLHNDQUFXLENBQUMsUUFBUSxDQUFDLEVBQUUsUUFBUTtZQUNoQyxDQUFDLHNDQUFXLENBQUMsWUFBWSxDQUFDLEVBQUUsdUNBQVksQ0FBQyxJQUFJO1lBQzdDLENBQUMsc0NBQVcsQ0FBQyxXQUFXLENBQUMsRUFBRSxnQkFBZ0I7WUFDM0MsQ0FBQyxzQ0FBVyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsdUJBQXVCLENBQUMsU0FBUyxDQUFDO1lBQ2hFLENBQUMsc0NBQVcsQ0FBQyxhQUFhLENBQUMsRUFBRSxhQUFhO1NBQzNDLENBQUM7UUFDRixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsaUNBQU0sQ0FBQyxnQkFBZ0IsRUFBRSxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQU8sQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUMvRSx3REFBd0Q7WUFDeEQsT0FBTztRQUNULENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksbUJBQW1CLENBQUMsUUFBa0I7UUFDM0MsTUFBTSxVQUFVLEdBQXNCO1lBQ3BDLENBQUMsc0NBQVcsQ0FBQyxZQUFZLENBQUMsRUFBRSxxQkFBcUI7WUFDakQsQ0FBQyxzQ0FBVyxDQUFDLFFBQVEsQ0FBQyxFQUFFLFFBQVE7U0FDakMsQ0FBQztRQUNGLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQ0FBTSxDQUFDLGNBQWMsRUFBRSxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQTZCLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDbkcsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDLE1BQTJCLENBQUM7WUFDN0QsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDbkQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxxQkFBcUIsQ0FBQyxRQUFrQixFQUFFLFVBQStCO1FBQzlFLE1BQU0sdUJBQXVCLEdBQTZCLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFFekcsTUFBTSxVQUFVLEdBQXNCO1lBQ3BDLENBQUMsc0NBQVcsQ0FBQyxZQUFZLENBQUMsRUFBRSx1QkFBdUI7WUFDbkQsQ0FBQyxzQ0FBVyxDQUFDLFFBQVEsQ0FBQyxFQUFFLFFBQVE7WUFDaEMsQ0FBQyxzQ0FBVyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsdUJBQXVCLENBQUMsU0FBUyxDQUFDO1NBQ2pFLENBQUM7UUFDRixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsaUNBQU0sQ0FBQyxnQkFBZ0IsRUFBRSxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQU8sQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUMvRSx3REFBd0Q7WUFDeEQsT0FBTztRQUNULENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNLLHFCQUFxQixDQUFDLEtBQStCO1FBQzNELE1BQU0sR0FBRyxHQUFrQixFQUFFLENBQUM7UUFDOUIsTUFBTSx1QkFBdUIsR0FBNkIsSUFBSSwwQ0FBd0IsRUFBRSxDQUFDO1FBQ3pGLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNyQixNQUFNLE9BQU8sR0FBdUIsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUNqRCxJQUFJLE9BQU8sS0FBSyxTQUFTLElBQUksT0FBTyxLQUFLLElBQUksSUFBSSxPQUFPLEdBQUcsQ0FBQyxFQUFFO2dCQUM1RCxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsd0JBQXdCO2FBQ3ZEO2lCQUFNO2dCQUNMLE1BQU0sSUFBSSwyQkFBWSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUFFLGlCQUFpQixDQUFDLENBQUM7YUFDOUU7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDcEIsNEJBQTRCO1lBQzVCLE1BQU0sbUJBQW1CLEdBQXdCLElBQUkscUNBQW1CLEVBQUUsQ0FBQztZQUMzRSxtQkFBbUIsQ0FBQyxhQUFhLEdBQUcsUUFBUSxDQUFDO1lBQzdDLG1CQUFtQixDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUM7WUFDcEMsdUJBQXVCLENBQUMsU0FBUyxHQUFHLG1CQUFtQixDQUFDO1NBQ3pEO1FBQ0QsT0FBTyx1QkFBdUIsQ0FBQztJQUNqQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssMkJBQTJCLENBQUMsV0FBdUM7UUFDekUsTUFBTSxHQUFHLEdBQWtCLEVBQUUsQ0FBQztRQUM5QixNQUFNLHVCQUF1QixHQUE2QixJQUFJLDBDQUF3QixFQUFFLENBQUM7UUFDekYsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFO1lBQ2pDLE1BQU0sWUFBWSxHQUF1QixVQUFVLENBQUMsWUFBWSxDQUFDO1lBQ2pFLElBQUksWUFBWSxLQUFLLFNBQVMsSUFBSSxZQUFZLEtBQUssSUFBSSxJQUFJLFlBQVksSUFBSSxDQUFDLEVBQUU7Z0JBQzVFLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyw2QkFBNkI7YUFDakU7aUJBQU07Z0JBQ0wsTUFBTSxJQUFJLDJCQUFZLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsc0JBQXNCLENBQUMsQ0FBQzthQUNuRjtRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUNwQixpQ0FBaUM7WUFDakMsTUFBTSxtQkFBbUIsR0FBd0IsSUFBSSxxQ0FBbUIsRUFBRSxDQUFDO1lBQzNFLG1CQUFtQixDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7WUFDbEQsbUJBQW1CLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQztZQUNwQyx1QkFBdUIsQ0FBQyxTQUFTLEdBQUcsbUJBQW1CLENBQUM7U0FDekQ7UUFDRCxPQUFPLHVCQUF1QixDQUFDO0lBQ2pDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssYUFBYSxDQUFDLFVBQXNCO1FBQzFDLE9BQU87WUFDTCxjQUFjLEVBQUUsVUFBVSxDQUFDLGNBQWM7WUFDekMsWUFBWSxFQUFFLFVBQVUsQ0FBQyxZQUFZO1lBQ3JDLGNBQWMsRUFBRSxVQUFVLENBQUMsbUJBQW1CO1lBQzlDLGNBQWMsRUFBRSwrREFBOEIsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUM7WUFDOUYsT0FBTyxFQUFFLFVBQVUsQ0FBQyxPQUFRO1NBQzdCLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLG1CQUFtQixDQUFDLFdBQThCO1FBQ3hELE1BQU0sZUFBZSxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztRQUV4RixPQUFPLGVBQWUsQ0FBQztJQUN6QixDQUFDO0NBQ0Y7QUEvSUQsc0RBK0lDOzs7Ozs7Ozs7Ozs7OztBQ3hKRCxnS0FBbUg7QUFHbkgsOElBQW9EO0FBRXBELE1BQWEscUJBQXNCLFNBQVEsaUNBQWU7SUFDeEQsSUFBVyxXQUFXO1FBQ3BCLDhDQUErQjtJQUNqQyxDQUFDO0lBRU0sa0JBQWtCO1FBQ3ZCLE1BQU0sSUFBSSxHQUFHLGlDQUFNLENBQUMsc0JBQXNCLENBQUM7UUFDM0MsTUFBTSxVQUFVLEdBQXNCO1lBQ3BDLENBQUMsc0NBQVcsQ0FBQyxZQUFZLENBQUMsRUFBRSxvQkFBb0I7U0FDakQsQ0FBQztRQUVGLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUF5QixDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQzlFLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxNQUFnQyxDQUFDO1lBQzdELE9BQU8sVUFBVSxDQUFDO1FBQ3BCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBaEJELHNEQWdCQzs7Ozs7Ozs7Ozs7Ozs7QUNwQkQsMkpBQStEO0FBRS9ELGdLQVcyQztBQUMzQyxxSEFBOEM7QUFDOUMsc0dBQW9DO0FBQ3BDLDJJQUEyRDtBQUMzRCw0SEFBaUQ7QUFDakQsMkhBQWtEO0FBR2xELDhJQUFvRDtBQUNwRCxNQUFhLHFCQUFzQixTQUFRLGlDQUFlO0lBQ3hELDBHQUEwRztJQUMxRyw4R0FBOEc7SUFDOUcsZ0RBQWdEO0lBQ2hELFlBQW1CLFVBQWlDLEVBQUUsVUFBa0I7UUFDdEUsS0FBSyxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBQ0QsSUFBVyxXQUFXO1FBQ3BCLHFEQUFzQztJQUN4QyxDQUFDO0lBRU0sWUFBWSxDQUFDLFlBQXFCO1FBQ3ZDLE1BQU0sVUFBVSxHQUFzQjtZQUNwQyxDQUFDLHNDQUFXLENBQUMsWUFBWSxDQUFDLEVBQUUsY0FBYztZQUMxQyxDQUFDLHNDQUFXLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUM1QixDQUFDLHNDQUFXLENBQUMsZUFBZSxDQUFDLEVBQUUsSUFBSTtTQUNwQyxDQUFDO1FBRUYseUVBQXlFO1FBQ3pFLElBQUksWUFBWSxFQUFFO1lBQ2hCLFVBQVUsQ0FBQyxzQ0FBVyxDQUFDLFlBQVksQ0FBQyxHQUFHLFlBQVksQ0FBQztTQUNyRDtRQUVELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQ0FBTSxDQUFDLGlCQUFpQixFQUFFLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQ2hGLE9BQU87UUFDVCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxvQkFBb0IsQ0FBQyxZQUFvQjtRQUM5QyxNQUFNLGNBQWMsR0FBc0I7WUFDeEMsQ0FBQyxzQ0FBVyxDQUFDLFlBQVksQ0FBQyxFQUFFLHNCQUFzQjtZQUNsRCxDQUFDLHNDQUFXLENBQUMsWUFBWSxDQUFDLEVBQUUsWUFBWTtTQUN6QyxDQUFDO1FBRUYsNERBQTREO1FBQzVELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQ0FBTSxDQUFDLGVBQWUsRUFBRSxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQW1CLENBQUMsWUFBWSxFQUFFLEVBQUU7WUFDbEcsTUFBTSxVQUFVLEdBQUcsWUFBWSxDQUFDLE1BQW9CLENBQUM7WUFFckQsNkZBQTZGO1lBQzdGLGtHQUFrRztZQUNsRyw4R0FBOEc7WUFDOUcsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7Z0JBQ2xDLE1BQU0sSUFBSSwyQkFBWSxDQUFDLHFDQUFVLENBQUMsa0NBQWtDLEVBQUUseUNBQXlDLFlBQVksRUFBRSxDQUFDLENBQUM7YUFDaEk7WUFFRCxPQUFPLFVBQVUsQ0FBQyxNQUFNLENBQUM7UUFDM0IsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sbUJBQW1CLENBQUMsUUFBa0I7UUFDM0MsTUFBTSxVQUFVLEdBQXNCO1lBQ3BDLENBQUMsc0NBQVcsQ0FBQyxZQUFZLENBQUMsRUFBRSxxQkFBcUI7WUFDakQsQ0FBQyxzQ0FBVyxDQUFDLFFBQVEsQ0FBQyxFQUFFLFFBQVE7U0FDakMsQ0FBQztRQUNGLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQ0FBTSxDQUFDLGNBQWMsRUFBRSxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQWEsQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUNuRixNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsTUFBb0IsQ0FBQztZQUNqRCxPQUFPLFVBQVUsQ0FBQztRQUNwQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxzQkFBc0I7UUFDM0IsTUFBTSxVQUFVLEdBQXNCO1lBQ3BDLENBQUMsc0NBQVcsQ0FBQyxZQUFZLENBQUMsRUFBRSx3QkFBd0I7U0FDckQsQ0FBQztRQUNGLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQ0FBTSxDQUFDLGlCQUFpQixFQUFFLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBYSxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQ3RGLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxNQUFvQixDQUFDO1lBQ2pELE9BQU8sVUFBVSxDQUFDO1FBQ3BCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLDJCQUEyQixDQUFDLFlBQW9CO1FBQ3JELE1BQU0sTUFBTSxHQUFzQjtZQUNoQyxDQUFDLHNDQUFXLENBQUMsWUFBWSxDQUFDLEVBQUUsNkJBQTZCO1lBQ3pELENBQUMsc0NBQVcsQ0FBQyxZQUFZLENBQUMsRUFBRSxZQUFZO1NBQ3pDLENBQUM7UUFFRiw0REFBNEQ7UUFDNUQsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGlDQUFNLENBQUMsaUNBQWlDLEVBQUUsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFpQyxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQ3RILE1BQU0sb0JBQW9CLEdBQUcsUUFBUSxDQUFDLE1BQXdDLENBQUM7WUFDL0UsT0FBTyxvQkFBb0IsQ0FBQztRQUM5QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxhQUFhLENBQUMsZUFBdUI7UUFDMUMsTUFBTSxJQUFJLEdBQUcsaUNBQU0sQ0FBQyxxQkFBcUIsQ0FBQztRQUMxQyxNQUFNLFVBQVUsR0FBc0I7WUFDcEMsQ0FBQyxzQ0FBVyxDQUFDLFlBQVksQ0FBQyxFQUFFLGVBQWU7WUFDM0MsQ0FBQyxzQ0FBVyxDQUFDLE9BQU8sQ0FBQyxFQUFFLGVBQWU7U0FDdkMsQ0FBQztRQUVGLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFpQixDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQ3RFLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsc0NBQVcsQ0FBQyxVQUFVLENBQWdDLENBQUM7WUFDMUYsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxzQ0FBVyxDQUFDLEtBQUssQ0FBVSxDQUFDO1lBQzFELE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDdEUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0scUJBQXFCLENBQUMsWUFBb0I7UUFDL0MsTUFBTSxNQUFNLEdBQXNCO1lBQ2hDLENBQUMsc0NBQVcsQ0FBQyxZQUFZLENBQUMsRUFBRSx1QkFBdUI7WUFDbkQsQ0FBQyxzQ0FBVyxDQUFDLFlBQVksQ0FBQyxFQUFFLFlBQVk7U0FDekMsQ0FBQztRQUNGLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQ0FBTSxDQUFDLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBMEIsQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUM5RixPQUFPLFFBQVEsQ0FBQyxNQUFpQyxDQUFDO1FBQ3BELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLHdCQUF3QixDQUFDLFFBQWtCO1FBQ2hELE1BQU0sTUFBTSxHQUFzQjtZQUNoQyxDQUFDLHNDQUFXLENBQUMsWUFBWSxDQUFDLEVBQUUsMEJBQTBCO1lBQ3RELENBQUMsc0NBQVcsQ0FBQyxRQUFRLENBQUMsRUFBRSxRQUFRO1NBQ2pDLENBQUM7UUFDRixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsaUNBQU0sQ0FBQyxtQkFBbUIsRUFBRSxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQTBCLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDakcsT0FBTyxRQUFRLENBQUMsTUFBaUMsQ0FBQztRQUNwRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxZQUFZLENBQUMsS0FBNkIsRUFBRSxVQUErQjtRQUNqRixPQUFPLElBQUksYUFBSyxDQUFDLElBQUkscUJBQVMsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRU8saUJBQWlCLENBQUMsVUFBdUM7UUFDL0QsT0FBTyxJQUFJLHVCQUFVLENBQUMsSUFBSSwrQkFBYyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztJQUMxRSxDQUFDO0NBQ0Y7QUE1SEQsc0RBNEhDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ25KRCxnS0FRMkM7QUFDM0MsMkpBTzJDO0FBQzNDLDJNQUFtRztBQUNuRywwSUFBMEQ7QUFHMUQsdUlBQXdEO0FBQ3hELDJIQUFrRDtBQUNsRCw4SUFBb0Q7QUFFcEQsTUFBYSxpQkFBa0IsU0FBUSxpQ0FBZTtJQUNwRCxJQUFXLFdBQVc7UUFDcEIscUNBQTJCO0lBQzdCLENBQUM7SUFFTSw4QkFBOEIsQ0FBQyxnQkFBbUM7UUFDdkUsTUFBTSxJQUFJLEdBQUcsaUNBQU0sQ0FBQyx5QkFBeUIsQ0FBQztRQUM5QyxNQUFNLFVBQVUsR0FBc0I7WUFDcEMsQ0FBQyxzQ0FBVyxDQUFDLFlBQVksQ0FBQyxFQUFFLGdDQUFnQztZQUM1RCxDQUFDLHNDQUFXLENBQUMsZ0JBQWdCLENBQUMsRUFBRSwrREFBOEIsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDO1NBQ25HLENBQUM7UUFDRixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBeUIsQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUM5RSxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBZ0MsQ0FBQztZQUN6RCxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFWSxtQkFBbUIsQ0FDOUIsU0FBaUIsRUFDakIsTUFBMEIsRUFDMUIsd0JBQXVDLEVBQ3ZDLGdCQUFtQzs7WUFFbkMsMkJBQVksQ0FBQyxlQUFlLENBQUMsd0JBQXdCLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDbEUsMkJBQVksQ0FBQyxlQUFlLENBQXFCLE1BQU0sRUFBRSw2Q0FBa0IsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO1lBRW5HLG9HQUFvRztZQUNwRyxpSEFBaUg7WUFDakgsa0hBQWtIO1lBQ2xILGdDQUFnQztZQUNoQyxNQUFNLGdCQUFnQixHQUFHLE1BQU0sSUFBSSxDQUFDLDhCQUE4QixDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDckYsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxFQUFFO2dCQUNoQyxNQUFNLElBQUksMkJBQVksQ0FBQywyQ0FBZ0IsQ0FBQyxhQUFhLEVBQUUsb0NBQW9DLENBQUMsQ0FBQzthQUM5RjtZQUVELE1BQU0sVUFBVSxHQUFzQjtnQkFDcEMsQ0FBQyxzQ0FBVyxDQUFDLFlBQVksQ0FBQyxFQUFFLHFCQUFxQjtnQkFDakQsQ0FBQyxzQ0FBVyxDQUFDLGVBQWUsQ0FBQyxFQUFFLGdCQUFnQixDQUFDLFNBQVMsQ0FBQztnQkFDMUQsQ0FBQyxzQ0FBVyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsSUFBSTthQUN0QyxDQUFDO1lBRUYsaUVBQWlFO1lBQ2pFLElBQUksSUFBSSxDQUFDO1lBQ1QsUUFBUSxNQUFNLEVBQUU7Z0JBQ2QsS0FBSyw2Q0FBa0IsQ0FBQyxHQUFHO29CQUN6QixJQUFJLEdBQUcsaUNBQU0sQ0FBQyx5QkFBeUIsQ0FBQztvQkFDeEMsOEVBQThFO29CQUM5RSxVQUFVLENBQUMsc0NBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLElBQUksQ0FBQztvQkFDaEQsTUFBTTtnQkFDUixLQUFLLDZDQUFrQixDQUFDLEtBQUs7b0JBQzNCLElBQUksR0FBRyxpQ0FBTSxDQUFDLDJCQUEyQixDQUFDO29CQUMxQyxNQUFNO2dCQUNSO29CQUNFLE1BQU0sSUFBSSwyQkFBWSxDQUFDLDJDQUFnQixDQUFDLGFBQWEsRUFBRSxtQ0FBbUMsQ0FBQyxDQUFDO2FBQy9GO1lBRUQsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUM7aUJBQ2xDLElBQUksQ0FBYSxDQUFDLFFBQVEsRUFBRSxFQUFFO2dCQUM3QixNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBb0IsQ0FBQztnQkFDN0MsT0FBTyxNQUFNLENBQUM7WUFDaEIsQ0FBQyxDQUFDO2lCQUNELEtBQUssQ0FBQyxHQUFHLEVBQUU7Z0JBQ1YsTUFBTSxJQUFJLDJCQUFZLENBQUMsMkNBQWdCLENBQUMscUJBQXFCLEVBQUUsNkRBQTZELENBQUMsQ0FBQztZQUNoSSxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUM7S0FBQTtJQUVNLGVBQWUsQ0FBQyxRQUFrQixFQUFFLE9BQTBCOztRQUNuRSwyQkFBWSxDQUFDLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRTlDLDZDQUE2QztRQUM3QyxNQUFNLFlBQVksR0FBZ0IsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDeEUsTUFBTSxvQkFBb0IsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRXRELE1BQU0sSUFBSSxHQUFHLGlDQUFNLENBQUMsa0JBQWtCLENBQUM7UUFDdkMsTUFBTSxVQUFVLEdBQXNCO1lBQ3BDLENBQUMsc0NBQVcsQ0FBQyxZQUFZLENBQUMsRUFBRSxpQkFBaUI7WUFDN0MsQ0FBQyxzQ0FBVyxDQUFDLFFBQVEsQ0FBQyxFQUFFLFFBQVE7WUFDaEMsQ0FBQyxzQ0FBVyxDQUFDLGFBQWEsQ0FBQyxRQUFFLE9BQU8sQ0FBQyxhQUFhLHVDQUFJLEtBQUs7WUFDM0QsQ0FBQyxzQ0FBVyxDQUFDLG9CQUFvQixDQUFDLEVBQUUsb0JBQW9CO1NBQ3pELENBQUM7UUFFRixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQzthQUNsQyxJQUFJLENBQU8sR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDO2FBQ3BCLEtBQUssQ0FBQyxHQUFHLEVBQUU7WUFDVixNQUFNLElBQUksMkJBQVksQ0FBQywyQ0FBZ0IsQ0FBQyxpQkFBaUIsRUFBRSw2REFBNkQsQ0FBQyxDQUFDO1FBQzVILENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVNLHFCQUFxQixDQUFDLFVBQXlCLEVBQUUsZUFBbUQ7UUFDekcsMkJBQVksQ0FBQyw0QkFBNEIsQ0FBQyxVQUFVLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFFdkUsNkdBQTZHO1FBQzdHLHlIQUF5SDtRQUN6SCw2REFBNkQ7UUFDN0QsTUFBTSxJQUFJLEdBQUcsaUNBQU0sQ0FBQyx3QkFBd0IsQ0FBQztRQUM3QyxNQUFNLFVBQVUsR0FBc0I7WUFDcEMsQ0FBQyxzQ0FBVyxDQUFDLFlBQVksQ0FBQyxFQUFFLHVCQUF1QjtZQUNuRCxDQUFDLHNDQUFXLENBQUMsZUFBZSxDQUFDLEVBQUUsRUFBRTtZQUNqQyxDQUFDLHNDQUFXLENBQUMsa0JBQWtCLENBQUMsRUFBRSxVQUFVO1NBQzdDLENBQUM7UUFFRixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQzthQUNsQyxJQUFJLENBQWEsQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUM3QixNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBb0IsQ0FBQztZQUM3QyxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDLENBQUM7YUFDRCxLQUFLLENBQUMsR0FBRyxFQUFFO1lBQ1YsTUFBTSxJQUFJLDJCQUFZLENBQ3BCLDJDQUFnQixDQUFDLHVCQUF1QixFQUN4QyxvRUFBb0UsQ0FDckUsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVZLGNBQWMsQ0FDekIsVUFBeUIsRUFDekIsd0JBQWtELEVBQ2xELGVBQW1EOztZQUVuRCwyQkFBWSxDQUFDLHNCQUFzQixDQUFDLHdCQUF3QixDQUFDLENBQUM7WUFDOUQsMkJBQVksQ0FBQyw0QkFBNEIsQ0FBQyxVQUFVLEVBQUUsZUFBZSxDQUFDLENBQUM7WUFFdkUsTUFBTSx3QkFBd0IsR0FBNkIsTUFBTSxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztZQUNqRyw2QkFBYSxDQUFDLDhCQUE4QixDQUFDLHdCQUF3QixFQUFFLHdCQUF3QixFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBRTdHLE1BQU0sSUFBSSxHQUFHLGlDQUFNLENBQUMsaUJBQWlCLENBQUM7WUFDdEMsTUFBTSxVQUFVLEdBQXNCO2dCQUNwQyxDQUFDLHNDQUFXLENBQUMsWUFBWSxDQUFDLEVBQUUsZ0JBQWdCO2dCQUM1QyxDQUFDLHNDQUFXLENBQUMsZ0JBQWdCLENBQUMsRUFBRSx3QkFBd0I7YUFDekQsQ0FBQztZQUVGLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDO2lCQUNsQyxJQUFJLENBQWEsQ0FBQyxRQUFRLEVBQUUsRUFBRTtnQkFDN0IsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQW9CLENBQUM7Z0JBQzdDLE9BQU8sTUFBTSxDQUFDO1lBQ2hCLENBQUMsQ0FBQztpQkFDRCxLQUFLLENBQUMsR0FBRyxFQUFFO2dCQUNWLE1BQU0sSUFBSSwyQkFBWSxDQUFDLDJDQUFnQixDQUFDLGdCQUFnQixFQUFFLCtEQUErRCxDQUFDLENBQUM7WUFDN0gsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDO0tBQUE7SUFFTSx3QkFBd0I7UUFDN0IsTUFBTSxJQUFJLEdBQUcsaUNBQU0sQ0FBQyxtQkFBbUIsQ0FBQztRQUN4QyxNQUFNLFVBQVUsR0FBc0I7WUFDcEMsQ0FBQyxzQ0FBVyxDQUFDLFlBQVksQ0FBQyxFQUFFLDBCQUEwQjtTQUN2RCxDQUFDO1FBQ0YsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQTJCLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDaEYsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQWtDLENBQUM7WUFDM0QsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUF2SkQsOENBdUpDOzs7Ozs7Ozs7Ozs7OztBQy9LRCxnS0FBMkY7QUFHM0YsOElBQW9EO0FBRXBELE1BQWEsOEJBQStCLFNBQVEsaUNBQWU7SUFDakUsSUFBVyxXQUFXO1FBQ3BCLGlFQUF3QztJQUMxQyxDQUFDO0lBRU0sc0JBQXNCLENBQUMsU0FBaUIsRUFBRSxVQUF1QixFQUFFLE1BQTBCO1FBQ2xHLE1BQU0sSUFBSSxHQUFHLGlDQUFNLENBQUMsc0JBQXNCLENBQUM7UUFDM0MsTUFBTSxVQUFVLEdBQXNCO1lBQ3BDLENBQUMsc0NBQVcsQ0FBQyxZQUFZLENBQUMsRUFBRSx3QkFBd0I7WUFDcEQsQ0FBQyxzQ0FBVyxDQUFDLGFBQWEsQ0FBQyxFQUFFLFNBQVM7WUFDdEMsQ0FBQyxzQ0FBVyxDQUFDLDJCQUEyQixDQUFDLEVBQUUsTUFBTSxDQUFDLFdBQVc7U0FDOUQsQ0FBQztRQUVGLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFTLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDOUQsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLE1BQWdCLENBQUM7WUFDaEQsT0FBTyxhQUFhLENBQUM7UUFDdkIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sc0JBQXNCLENBQUMsU0FBaUIsRUFBRSxVQUF1QixFQUFFLFVBQWtCO1FBQzFGLE1BQU0sSUFBSSxHQUFHLGlDQUFNLENBQUMsc0JBQXNCLENBQUM7UUFDM0MsTUFBTSxVQUFVLEdBQXNCO1lBQ3BDLENBQUMsc0NBQVcsQ0FBQyxZQUFZLENBQUMsRUFBRSx3QkFBd0I7WUFDcEQsQ0FBQyxzQ0FBVyxDQUFDLGFBQWEsQ0FBQyxFQUFFLFNBQVM7WUFDdEMsQ0FBQyxzQ0FBVyxDQUFDLGtCQUFrQixDQUFDLEVBQUUsVUFBVTtTQUM3QyxDQUFDO1FBRUYsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQU8sQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUM1RCxPQUFPO1FBQ1QsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sdUJBQXVCLENBQUMsU0FBaUIsRUFBRSxVQUF1QixFQUFFLFVBQWtCO1FBQzNGLE1BQU0sSUFBSSxHQUFHLGlDQUFNLENBQUMsdUJBQXVCLENBQUM7UUFDNUMsTUFBTSxVQUFVLEdBQXNCO1lBQ3BDLENBQUMsc0NBQVcsQ0FBQyxZQUFZLENBQUMsRUFBRSx5QkFBeUI7WUFDckQsQ0FBQyxzQ0FBVyxDQUFDLGFBQWEsQ0FBQyxFQUFFLFNBQVM7WUFDdEMsQ0FBQyxzQ0FBVyxDQUFDLGtCQUFrQixDQUFDLEVBQUUsVUFBVTtTQUM3QyxDQUFDO1FBRUYsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQU8sQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUM1RCxPQUFPO1FBQ1QsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sc0JBQXNCLENBQUMsU0FBaUIsRUFBRSxVQUF1QixFQUFFLFVBQWtCLEVBQUUsZUFBdUI7UUFDbkgsTUFBTSxJQUFJLEdBQUcsaUNBQU0sQ0FBQyxrQkFBa0IsQ0FBQztRQUN2QyxNQUFNLFVBQVUsR0FBc0I7WUFDcEMsQ0FBQyxzQ0FBVyxDQUFDLFlBQVksQ0FBQyxFQUFFLHdCQUF3QjtZQUNwRCxDQUFDLHNDQUFXLENBQUMsYUFBYSxDQUFDLEVBQUUsU0FBUztZQUN0QyxDQUFDLHNDQUFXLENBQUMsa0JBQWtCLENBQUMsRUFBRSxVQUFVO1lBQzVDLENBQUMsc0NBQVcsQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFLGVBQWU7U0FDdkQsQ0FBQztRQUVGLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFPLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDNUQsT0FBTztRQUNULENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBMURELHdFQTBEQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMvREQsMkpBTzJDO0FBQzNDLHNKQUFzRTtBQUN0RSxnS0FBaUg7QUFDakgsMkdBQWtEO0FBQ2xELDJNQUE0SDtBQUM1SCwyTUFBNEg7QUFDNUgseUlBU21DO0FBRW5DLG1KQUFnRTtBQUNoRSxrSEFBMEM7QUFHMUMsOElBQW9EO0FBRXBELE1BQWEsaUJBQWtCLFNBQVEsaUNBQWU7SUFDcEQsSUFBVyxXQUFXO1FBQ3BCLHFDQUEyQjtJQUM3QixDQUFDO0lBRU0sZ0JBQWdCLENBQ3JCLFFBQWtCLEVBQ2xCLFNBQWlCLEVBQ2pCLE1BQXFCLEVBQ3JCLFVBQXFDLEVBQ3JDLGFBQXFDO1FBRXJDLE1BQU0sSUFBSSxHQUFHLGlDQUFNLENBQUMsc0JBQXNCLENBQUM7UUFDM0MsTUFBTSxVQUFVLEdBQXNCO1lBQ3BDLENBQUMsc0NBQVcsQ0FBQyxZQUFZLENBQUMsRUFBRSxrQkFBa0I7U0FDL0MsQ0FBQztRQUNGLFVBQVUsQ0FBQyxzQ0FBVyxDQUFDLFFBQVEsQ0FBQyxHQUFHLFFBQVEsQ0FBQztRQUM1QyxVQUFVLENBQUMsc0NBQVcsQ0FBQyxTQUFTLENBQUMsR0FBRyxTQUFTLENBQUM7UUFDOUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDMUIsTUFBTSxJQUFJLHdCQUFZLENBQUMscUNBQVUsQ0FBQyxnQkFBZ0IsRUFBRSx3REFBd0QsQ0FBQyxDQUFDO1NBQy9HO1FBQ0QsVUFBVSxDQUFDLHNDQUFXLENBQUMsWUFBWSxDQUFDLEdBQUcsTUFBTSxDQUFDO1FBQzlDLFVBQVUsQ0FBQyxzQ0FBVyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsK0RBQXFCLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3RHLFVBQVUsQ0FBQyxzQ0FBVyxDQUFDLGFBQWEsQ0FBQztZQUNuQyxhQUFhLEtBQUssU0FBUyxJQUFJLGFBQWEsQ0FBQyxhQUFhLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUM7UUFFakgsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQVMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUM5RCxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxxQkFBcUIsQ0FBQyxRQUFrQixFQUFFLFNBQWlCLEVBQUUsYUFBMEM7UUFDNUcsTUFBTSxJQUFJLEdBQUcsaUNBQU0sQ0FBQyxnQkFBZ0IsQ0FBQztRQUNyQyxNQUFNLFVBQVUsR0FBc0I7WUFDcEMsQ0FBQyxzQ0FBVyxDQUFDLFlBQVksQ0FBQyxFQUFFLHVCQUF1QjtTQUNwRCxDQUFDO1FBRUYsSUFBSSxhQUFhLENBQUMsR0FBRyxLQUFLLFNBQVMsSUFBSSxhQUFhLENBQUMsR0FBRyxLQUFLLElBQUksRUFBRTtZQUNqRSxJQUFJLEdBQW9CLENBQUM7WUFDekIsSUFBSSxhQUFhLENBQUMsR0FBRyxZQUFZLElBQUksRUFBRTtnQkFDckMsR0FBRyxHQUFHLGFBQUssQ0FBQyx3QkFBd0IsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDekQ7aUJBQU07Z0JBQ0wsR0FBRyxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUM7YUFDekI7WUFDRCxVQUFVLENBQUMsc0NBQVcsQ0FBQyxjQUFjLENBQUMsR0FBRyxHQUFHLENBQUM7U0FDOUM7UUFFRCxJQUFJLGFBQWEsQ0FBQyxHQUFHLEtBQUssU0FBUyxJQUFJLGFBQWEsQ0FBQyxHQUFHLEtBQUssSUFBSSxFQUFFO1lBQ2pFLElBQUksR0FBb0IsQ0FBQztZQUN6QixJQUFJLGFBQWEsQ0FBQyxHQUFHLFlBQVksSUFBSSxFQUFFO2dCQUNyQyxHQUFHLEdBQUcsYUFBSyxDQUFDLHdCQUF3QixDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUN6RDtpQkFBTTtnQkFDTCxHQUFHLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQzthQUN6QjtZQUNELFVBQVUsQ0FBQyxzQ0FBVyxDQUFDLGNBQWMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztTQUM5QztRQUVELHNGQUFzRjtRQUN0RixJQUFJLGFBQWEsQ0FBQyxVQUFVLEVBQUU7WUFDNUIsVUFBVSxDQUFDLHNDQUFXLENBQUMscUJBQXFCLENBQUMsR0FBRywrREFBcUIsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUNySDtRQUVELFVBQVUsQ0FBQyxzQ0FBVyxDQUFDLFNBQVMsQ0FBQyxHQUFHLFNBQVMsQ0FBQztRQUM5QyxVQUFVLENBQUMsc0NBQVcsQ0FBQyxRQUFRLENBQUMsR0FBRyxRQUFRLENBQUM7UUFFNUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQVMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUM5RCxJQUFJLENBQUMsb0NBQW9DLENBQUMsUUFBUSxDQUFDLE1BQW1DLENBQUMsQ0FBQztZQUN4RixPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSw0QkFBNEIsQ0FDakMsUUFBa0IsRUFDbEIsU0FBaUIsRUFDakIsTUFBbUQsRUFDbkQsVUFBcUMsRUFDckMsYUFBcUM7UUFFckMsTUFBTSxJQUFJLEdBQUcsaUNBQU0sQ0FBQyxrQkFBa0IsQ0FBQztRQUN2QyxNQUFNLFVBQVUsR0FBc0I7WUFDcEMsQ0FBQyxzQ0FBVyxDQUFDLFlBQVksQ0FBQyxFQUFFLDhCQUE4QjtTQUMzRCxDQUFDO1FBQ0YsVUFBVSxDQUFDLHNDQUFXLENBQUMsUUFBUSxDQUFDLEdBQUcsUUFBUSxDQUFDO1FBQzVDLFVBQVUsQ0FBQyxzQ0FBVyxDQUFDLFNBQVMsQ0FBQyxHQUFHLFNBQVMsQ0FBQztRQUU5QyxNQUFNLGtCQUFrQixHQUFJLE1BQXNDLENBQUMsTUFBTSxDQUFDO1FBRTFFLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLGtCQUFrQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDdEUsVUFBVSxDQUFDLHNDQUFXLENBQUMsWUFBWSxDQUFDLEdBQUcsa0JBQWtCLENBQUM7U0FDM0Q7YUFBTSxJQUFLLE1BQXdCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUMvQyxVQUFVLENBQUMsc0NBQVcsQ0FBQyxZQUFZLENBQUMsR0FBRyxNQUFNLENBQUM7U0FDL0M7YUFBTTtZQUNMLGdFQUFnRTtZQUNoRSxpRUFBaUU7WUFDakUsVUFBVSxDQUFDLHNDQUFXLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDO1NBQzNDO1FBRUQsVUFBVSxDQUFDLHNDQUFXLENBQUMsZ0JBQWdCLENBQUMsR0FBRywrREFBcUIsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdEcsVUFBVSxDQUFDLHNDQUFXLENBQUMsYUFBYSxDQUFDLEdBQUcsYUFBYSxJQUFJLENBQUMsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDO1FBRXZGLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFTLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDOUQsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sZ0JBQWdCLENBQUMsUUFBa0IsRUFBRSxTQUFpQjtRQUMzRCxNQUFNLElBQUksR0FBRyxpQ0FBTSxDQUFDLFdBQVcsQ0FBQztRQUNoQyxNQUFNLFVBQVUsR0FBc0I7WUFDcEMsQ0FBQyxzQ0FBVyxDQUFDLFlBQVksQ0FBQyxFQUFFLGtCQUFrQjtTQUMvQyxDQUFDO1FBQ0YsVUFBVSxDQUFDLHNDQUFXLENBQUMsUUFBUSxDQUFDLEdBQUcsUUFBUSxDQUFDO1FBQzVDLFVBQVUsQ0FBQyxzQ0FBVyxDQUFDLFNBQVMsQ0FBQyxHQUFHLFNBQVMsQ0FBQztRQUM5QyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBUyxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQzlELE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLDRCQUE0QixDQUFDLFFBQWtCLEVBQUUsU0FBaUIsRUFBRSxPQUEyQztRQUNwSCxNQUFNLElBQUksR0FBRyxpQ0FBTSxDQUFDLHVCQUF1QixDQUFDO1FBQzVDLE1BQU0sVUFBVSxHQUFzQjtZQUNwQyxDQUFDLHNDQUFXLENBQUMsWUFBWSxDQUFDLEVBQUUsOEJBQThCO1NBQzNELENBQUM7UUFDRixVQUFVLENBQUMsc0NBQVcsQ0FBQyxRQUFRLENBQUMsR0FBRyxRQUFRLENBQUM7UUFDNUMsVUFBVSxDQUFDLHNDQUFXLENBQUMsU0FBUyxDQUFDLEdBQUcsU0FBUyxDQUFDO1FBQzlDLFVBQVUsQ0FBQyxzQ0FBVyxDQUFDLFVBQVUsQ0FBQyxHQUFHLCtEQUFxQixDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2xHLFVBQVUsQ0FBQyxzQ0FBVyxDQUFDLGFBQWEsQ0FBQyxHQUFHLCtEQUFxQixDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3ZHLElBQUksT0FBTyxDQUFDLFNBQVMsS0FBSyx3Q0FBYSxDQUFDLEtBQUssSUFBSSxPQUFPLENBQUMsU0FBUyxLQUFLLHdDQUFhLENBQUMsS0FBSyxFQUFFO1lBQzFGLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxTQUFTLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxJQUFJLEVBQUU7Z0JBQzNELE1BQU0sSUFBSSx3QkFBWSxDQUNwQiw4Q0FBbUIsQ0FBQyxtQ0FBbUMsRUFDdkQsb0VBQW9FLENBQ3JFLENBQUM7YUFDSDtZQUNELFVBQVUsQ0FBQyxzQ0FBVyxDQUFDLE1BQU0sQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7U0FDakQ7UUFFRCxJQUFJLE9BQU8sQ0FBQyxVQUFVLEtBQUssU0FBUyxJQUFJLE9BQU8sQ0FBQyxVQUFVLEtBQUssSUFBSSxFQUFFO1lBQ25FLFVBQVUsQ0FBQyxzQ0FBVyxDQUFDLFVBQVUsQ0FBQyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDakY7UUFFRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBUyxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQzlELE9BQU8sUUFBUSxDQUFDLE1BQWdCLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sZUFBZSxDQUFDLFFBQWtCO1FBQ3ZDLE1BQU0sSUFBSSxHQUFHLGlDQUFNLENBQUMsVUFBVSxDQUFDO1FBQy9CLE1BQU0sVUFBVSxHQUFzQjtZQUNwQyxDQUFDLHNDQUFXLENBQUMsWUFBWSxDQUFDLEVBQUUsaUJBQWlCO1NBQzlDLENBQUM7UUFDRixVQUFVLENBQUMsc0NBQVcsQ0FBQyxRQUFRLENBQUMsR0FBRyxRQUFRLENBQUM7UUFDNUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQXlCLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDOUUsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLE1BQXdDLENBQUM7WUFDbEUsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDNUMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0seUJBQXlCLENBQzlCLGFBQXFCLEVBQ3JCLE9BQWUsRUFDZixVQUE0QjtRQUU1QixNQUFNLElBQUksR0FBRyxpQ0FBTSxDQUFDLG9CQUFvQixDQUFDO1FBQ3pDLE1BQU0sVUFBVSxHQUFzQjtZQUNwQyxDQUFDLHNDQUFXLENBQUMsWUFBWSxDQUFDLEVBQUUsMkJBQTJCO1NBQ3hELENBQUM7UUFDRixVQUFVLENBQUMsc0NBQVcsQ0FBQyxRQUFRLENBQUMsR0FBRztZQUNqQyxTQUFTLEVBQUUsYUFBYTtTQUN6QixDQUFDO1FBRUYsVUFBVSxDQUFDLHNDQUFXLENBQUMsT0FBTyxDQUFDLEdBQUcsT0FBTyxDQUFDO1FBQzFDLFVBQVUsQ0FBQyxzQ0FBVyxDQUFDLFVBQVUsQ0FBQyxHQUFHLCtEQUFxQixDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNoRyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBNkIsQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUNsRixNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBNEMsQ0FBQztZQUNyRSxPQUFPLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDM0QsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sbUJBQW1CLENBQUMsYUFBcUIsRUFBRSxPQUFlLEVBQUUsVUFBNEI7UUFDN0YsTUFBTSxJQUFJLEdBQUcsaUNBQU0sQ0FBQyxjQUFjLENBQUM7UUFDbkMsTUFBTSxVQUFVLEdBQXNCO1lBQ3BDLENBQUMsc0NBQVcsQ0FBQyxZQUFZLENBQUMsRUFBRSxxQkFBcUI7U0FDbEQsQ0FBQztRQUNGLFVBQVUsQ0FBQyxzQ0FBVyxDQUFDLFFBQVEsQ0FBQyxHQUFHO1lBQ2pDLFNBQVMsRUFBRSxhQUFhO1NBQ3pCLENBQUM7UUFFRixVQUFVLENBQUMsc0NBQVcsQ0FBQyxPQUFPLENBQUMsR0FBRyxPQUFPLENBQUM7UUFDMUMsVUFBVSxDQUFDLHNDQUFXLENBQUMsVUFBVSxDQUFDLEdBQUcsK0RBQXFCLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2hHLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUF1QixDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQzVFLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFzQyxDQUFDO1lBRS9ELE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNyRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSx3QkFBd0I7UUFDN0IsTUFBTSxJQUFJLEdBQUcsaUNBQU0sQ0FBQyxtQkFBbUIsQ0FBQztRQUN4QyxNQUFNLFVBQVUsR0FBc0I7WUFDcEMsQ0FBQyxzQ0FBVyxDQUFDLFlBQVksQ0FBQyxFQUFFLDBCQUEwQjtTQUN2RCxDQUFDO1FBQ0YsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQXlCLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDOUUsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLE1BQXdDLENBQUM7WUFDbEUsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDNUMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0seUJBQXlCLENBQzlCLFNBQWlCLEVBQ2pCLE1BQXFCLEVBQ3JCLFVBQXFDLEVBQ3JDLGFBQXFDO1FBRXJDLE1BQU0sSUFBSSxHQUFHLGlDQUFNLENBQUMsMEJBQTBCLENBQUM7UUFDL0MsTUFBTSxVQUFVLEdBQXNCO1lBQ3BDLENBQUMsc0NBQVcsQ0FBQyxZQUFZLENBQUMsRUFBRSwyQkFBMkI7U0FDeEQsQ0FBQztRQUNGLFVBQVUsQ0FBQyxzQ0FBVyxDQUFDLFNBQVMsQ0FBQyxHQUFHLFNBQVMsQ0FBQztRQUM5QyxVQUFVLENBQUMsc0NBQVcsQ0FBQyxZQUFZLENBQUMsR0FBRyxNQUFNLENBQUM7UUFDOUMsVUFBVSxDQUFDLHNDQUFXLENBQUMsZ0JBQWdCLENBQUMsR0FBRywrREFBcUIsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdEcsVUFBVSxDQUFDLHNDQUFXLENBQUMsYUFBYSxDQUFDLEdBQUcsYUFBYSxJQUFJLENBQUMsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDO1FBRXZGLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFTLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDOUQsT0FBTyxRQUFRLENBQUMsTUFBZ0IsQ0FBQztRQUNuQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFWSx5QkFBeUIsQ0FBQyxhQUFxQixFQUFFLE9BQWU7OztZQUMzRSxNQUFNLGlCQUFpQixHQUFHLE1BQU0sSUFBSSxDQUFDLDJCQUEyQixDQUFDLGFBQWEsRUFBRSxPQUFPLEVBQUUsMkJBQTJCLENBQUMsQ0FBQztZQUN0SCxNQUFNLGNBQWMsR0FBYSxFQUFFLENBQUM7WUFDcEMsdUJBQWlCLENBQUMsVUFBVSwwQ0FBRSxHQUFHLENBQUMsQ0FBQyxhQUEwRCxFQUFFLEVBQUU7Z0JBQy9GLElBQUksYUFBYSxDQUFDLFVBQVUsRUFBRTtvQkFDNUIsY0FBYyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUM7aUJBQ2xEO1lBQ0gsQ0FBQyxFQUFFO1lBQ0gsT0FBTyxjQUFjLENBQUM7O0tBQ3ZCO0lBRVkseUJBQXlCLENBQ3BDLGFBQXFCLEVBQ3JCLFNBQWlCLEVBQ2pCLE9BQWUsRUFDZixpQkFBZ0M7O1lBRWhDLE1BQU0saUJBQWlCLEdBQUcsTUFBTSxJQUFJLENBQUMsMkJBQTJCLENBQUMsYUFBYSxFQUFFLE9BQU8sRUFBRSxtQ0FBbUMsQ0FBQyxDQUFDO1lBQzlILElBQUksQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsRUFBRTtnQkFDdkQsTUFBTSxJQUFJLHdCQUFZLENBQUMsMkNBQWdCLENBQUMsYUFBYSxFQUFFLG1EQUFtRCxDQUFDLENBQUM7YUFDN0c7WUFFRCxNQUFNLGlCQUFpQixHQUFhLEVBQUUsQ0FBQztZQUN2QyxJQUFJLGVBQWUsR0FBRyxFQUFFLENBQUM7WUFDekIsaUJBQWlCLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFO2dCQUNqRCx1QkFBdUI7Z0JBQ3ZCLElBQUksU0FBUyxDQUFDLFFBQVEsRUFBRTtvQkFDdEIsZUFBZSxHQUFHLFNBQVMsQ0FBQyxhQUFhLENBQUM7aUJBQzNDO2dCQUVELDhCQUE4QjtnQkFDOUIsSUFBSSxTQUFTLENBQUMsVUFBVSxJQUFJLFNBQVMsQ0FBQyxTQUFTLEVBQUU7b0JBQy9DLGlCQUFpQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUM7aUJBQ2pEO1lBQ0gsQ0FBQyxDQUFDLENBQUM7WUFFSCxJQUFJLGVBQWUsS0FBSyxFQUFFLEVBQUU7Z0JBQzFCLE1BQU0sSUFBSSx3QkFBWSxDQUFDLDJDQUFnQixDQUFDLGFBQWEsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO2FBQy9FO1lBRUQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsRUFBRTtnQkFDaEQsTUFBTSxJQUFJLHdCQUFZLENBQUMsMkNBQWdCLENBQUMsYUFBYSxFQUFFLEdBQUcsZUFBZSw2Q0FBNkMsQ0FBQyxDQUFDO2FBQ3pIO1lBRUQsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQ2xDLGlEQUFpRDtnQkFDakQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRTtvQkFDdEMsTUFBTSxJQUFJLHdCQUFZLENBQUMsMkNBQWdCLENBQUMsYUFBYSxFQUFFLGFBQWEsU0FBUyxzQ0FBc0MsS0FBSyxFQUFFLENBQUMsQ0FBQztpQkFDN0g7WUFDSCxDQUFDLENBQUMsQ0FBQztZQUVILE1BQU0sSUFBSSxHQUFHLGlDQUFNLENBQUMsa0JBQWtCLENBQUM7WUFDdkMsTUFBTSxVQUFVLEdBQXNCLEVBQUUsQ0FBQztZQUN6QyxVQUFVLENBQUMsc0NBQVcsQ0FBQyxZQUFZLENBQUMsR0FBRywyQkFBMkIsQ0FBQztZQUNuRSxVQUFVLENBQUMsc0NBQVcsQ0FBQyxRQUFRLENBQUMsR0FBRztnQkFDakMsU0FBUyxFQUFFLGFBQWE7YUFDekIsQ0FBQztZQUNGLFVBQVUsQ0FBQyxzQ0FBVyxDQUFDLE9BQU8sQ0FBQyxHQUFHLE9BQU8sQ0FBQztZQUMxQyxVQUFVLENBQUMsc0NBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLGlCQUFpQixDQUFDO1lBRS9ELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFXLENBQUMsUUFBUSxFQUFFLEVBQUU7Z0JBQ2hFLE9BQU8saUJBQWlCLENBQUM7WUFDM0IsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO0tBQUE7SUFFRCxpQkFBaUI7SUFFVCwyQkFBMkIsQ0FDakMsYUFBcUIsRUFDckIsT0FBZSxFQUNmLHFCQUE2QjtRQUU3QixNQUFNLElBQUksR0FBRyxpQ0FBTSxDQUFDLGVBQWUsQ0FBQztRQUNwQyxNQUFNLFVBQVUsR0FBc0IsRUFBRSxDQUFDO1FBQ3pDLFVBQVUsQ0FBQyxzQ0FBVyxDQUFDLFlBQVksQ0FBQyxHQUFHLHFCQUFxQixDQUFDO1FBQzdELFVBQVUsQ0FBQyxzQ0FBVyxDQUFDLFFBQVEsQ0FBQyxHQUFHO1lBQ2pDLFNBQVMsRUFBRSxhQUFhO1NBQ3pCLENBQUM7UUFDRixVQUFVLENBQUMsc0NBQVcsQ0FBQyxPQUFPLENBQUMsR0FBRyxPQUFPLENBQUM7UUFFMUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQXFDLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDMUYsTUFBTSxpQkFBaUIsR0FBRyxRQUFRLENBQUMsTUFBNEMsQ0FBQztZQUNoRixPQUFPLGlCQUFpQixDQUFDO1FBQzNCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLG9CQUFvQixDQUFDLGFBQTZDO1FBQ3hFLE1BQU0sT0FBTyxHQUEyQixFQUFFLENBQUM7UUFDM0MsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFlBQVksRUFBRSxFQUFFO1lBQ3JDLFFBQVEsWUFBWSxDQUFDLFVBQVUsRUFBRTtnQkFDL0IsS0FBSyxxQ0FBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO29CQUMzQixNQUFNLE1BQU0sR0FBRyxZQUFrRCxDQUFDO29CQUNsRSxJQUFJLE1BQU0sRUFBRTt3QkFDVixPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO3FCQUNyRDt5QkFBTTt3QkFDTCxNQUFNLElBQUksS0FBSyxDQUFDLDRCQUE0QixDQUFDLENBQUM7cUJBQy9DO29CQUNELE1BQU07aUJBQ1A7Z0JBRUQsS0FBSyxxQ0FBVSxDQUFDLFlBQVksQ0FBQyxDQUFDO29CQUM1QixNQUFNLE1BQU0sR0FBRyxZQUFtRCxDQUFDO29CQUNuRSxJQUFJLE1BQU0sRUFBRTt3QkFDVixPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO3FCQUN0RDt5QkFBTTt3QkFDTCxNQUFNLElBQUksS0FBSyxDQUFDLDZCQUE2QixDQUFDLENBQUM7cUJBQ2hEO29CQUNELE1BQU07aUJBQ1A7Z0JBRUQsS0FBSyxxQ0FBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUNyQixNQUFNLE1BQU0sR0FBRyxZQUE0QyxDQUFDO29CQUM1RCxJQUFJLE1BQU0sRUFBRTt3QkFDVixPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO3FCQUMvQzt5QkFBTTt3QkFDTCxNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixDQUFDLENBQUM7cUJBQ3pDO29CQUNELE1BQU07aUJBQ1A7Z0JBRUQsS0FBSyxxQ0FBVSxDQUFDLFlBQVksQ0FBQyxDQUFDO29CQUM1QixNQUFNLE1BQU0sR0FBRyxZQUFtRCxDQUFDO29CQUNuRSxJQUFJLE1BQU0sRUFBRTt3QkFDVixPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO3FCQUN0RDt5QkFBTTt3QkFDTCxNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUM7cUJBQ2pEO29CQUNELE1BQU07aUJBQ1A7Z0JBRUQsT0FBTyxDQUFDLENBQUM7b0JBQ1AsTUFBTTtpQkFDUDthQUNGO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRU8sd0JBQXdCLENBQUMsWUFBZ0Q7UUFDL0UsTUFBTSxhQUFhLEdBQThCLFlBQVksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUU7WUFDOUUsT0FBTyxtQ0FBZ0IsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNsRCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sSUFBSSxnQ0FBaUIsQ0FDMUIsWUFBWSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQy9CLFlBQVksQ0FBQyxZQUFZLEVBQ3pCLFlBQVksQ0FBQyxTQUFTLEVBQ3RCLHFDQUFVLENBQUMsV0FBVyxFQUN0QixJQUFJLENBQUMsV0FBVyxFQUNoQixhQUFhLEVBQ2IsWUFBWSxDQUFDLFNBQVMsRUFDdEIsWUFBWSxDQUFDLGFBQWEsQ0FDM0IsQ0FBQztJQUNKLENBQUM7SUFFTyx5QkFBeUIsQ0FBQyxZQUFpRDtRQUNqRixNQUFNLGFBQWEsR0FBZ0QsWUFBWSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxxQkFBcUIsRUFBRSxFQUFFO1lBQ25ILE9BQU8sSUFBSSxvQ0FBcUIsQ0FDOUIsbUNBQWdCLENBQUMsbUJBQW1CLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLEVBQ2pFLHFCQUFxQixDQUFDLGdCQUFnQixFQUN0QyxxQkFBcUIsQ0FBQyxLQUFLLENBQzVCLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sWUFBWSxHQUE0QyxZQUFZLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ2xHLE9BQU8sSUFBSSxzQ0FBdUIsQ0FDaEMsTUFBTSxDQUFDLElBQUksRUFDWCwrREFBcUIsQ0FBQywrQkFBK0IsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQzFGLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sSUFBSSxpQ0FBa0IsQ0FDM0IsWUFBWSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQy9CLFlBQVksQ0FBQyxZQUFZLEVBQ3pCLFlBQVksQ0FBQyxTQUFTLEVBQ3RCLHFDQUFVLENBQUMsWUFBWSxFQUN2QixJQUFJLENBQUMsV0FBVyxFQUNoQixZQUFZLENBQUMsYUFBYSxFQUMxQixZQUFZLENBQUMsZ0JBQWdCLEVBQzdCLFlBQVksQ0FBQyxNQUFNLEVBQ25CLFlBQVksRUFDWixhQUFhLEVBQ2IsWUFBWSxDQUFDLGFBQWEsQ0FDM0IsQ0FBQztJQUNKLENBQUM7SUFFTyxrQkFBa0IsQ0FBQyxZQUEwQztRQUNuRSxNQUFNLFFBQVEsR0FBYyxtQ0FBZ0IsQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkYsTUFBTSxRQUFRLEdBQWMsbUNBQWdCLENBQUMsbUJBQW1CLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ25GLE9BQU8sSUFBSSwwQkFBVyxDQUNwQixZQUFZLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFDL0IsWUFBWSxDQUFDLFlBQVksRUFDekIsWUFBWSxDQUFDLFNBQVMsRUFDdEIscUNBQVUsQ0FBQyxLQUFLLEVBQ2hCLElBQUksQ0FBQyxXQUFXLEVBQ2hCLFFBQVEsRUFDUixRQUFRLEVBQ1IsWUFBWSxDQUFDLGlCQUFpQixDQUMvQixDQUFDO0lBQ0osQ0FBQztJQUVPLHlCQUF5QixDQUFDLFlBQWlEO1FBQ2pGLE1BQU0sZUFBZSxHQUFjLG1DQUFnQixDQUFDLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNqRyxPQUFPLElBQUksaUNBQWtCLENBQzNCLFlBQVksQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUMvQixZQUFZLENBQUMsWUFBWSxFQUN6QixZQUFZLENBQUMsU0FBUyxFQUN0QixxQ0FBa0IsQ0FBQyxZQUFZLEVBQy9CLElBQUksQ0FBQyxXQUFXLEVBQ2hCLGVBQWUsRUFDZiwrREFBcUIsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsRUFDckUsK0RBQXFCLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLEVBQ25FLFlBQVksQ0FBQyxNQUFNLENBQ3BCLENBQUM7SUFDSixDQUFDO0lBRU8sd0JBQXdCLENBQUMsTUFBMEMsRUFBRSxVQUE0QjtRQUN2RyxNQUFNLE1BQU0sR0FBcUIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUM5RCxPQUFPLG1DQUFnQixDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3hELENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxJQUFJLGdDQUFpQixDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRU8sa0JBQWtCLENBQUMsTUFBb0MsRUFBRSxVQUE0QjtRQUMzRixNQUFNLEdBQUcsR0FBYyxtQ0FBZ0IsQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDeEUsTUFBTSxHQUFHLEdBQWMsbUNBQWdCLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3hFLE9BQU8sSUFBSSwwQkFBVyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVPLGlCQUFpQixDQUFDLFVBQWdCO1FBQ3hDLDRGQUE0RjtRQUM1RixrRkFBa0Y7UUFDbEYsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3pDLE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDM0MsTUFBTSxHQUFHLEdBQUcsVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3BDLE1BQU0sRUFBRSxHQUFHLFVBQVUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNwQyxNQUFNLEVBQUUsR0FBRyxVQUFVLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDdEMsTUFBTSxHQUFHLEdBQUcsVUFBVSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBRXZDLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDckYsTUFBTSxJQUFJLHdCQUFZLENBQUMsOENBQW1CLENBQUMsb0JBQW9CLEVBQUUsb0NBQW9DLENBQUMsQ0FBQztTQUN4RztRQUVELE1BQU0sTUFBTSxHQUFHLEdBQUcsSUFBSSxJQUFJLEtBQUssSUFBSSxHQUFHLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUM1RCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRU8sb0NBQW9DLENBQUMsUUFBbUM7UUFDOUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLEVBQUU7WUFDMUQsT0FBTztTQUNSO1FBQ0QsSUFBSSxRQUFRLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLG1CQUFtQixDQUFDLEVBQUU7WUFDOUQsTUFBTSxJQUFJLHdCQUFZLENBQUMsMkNBQWdCLENBQUMsc0JBQXNCLEVBQUUsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7U0FDN0g7UUFDRCxJQUFJLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLEVBQUU7WUFDeEQsTUFBTSxJQUFJLHdCQUFZLENBQUMsMkNBQWdCLENBQUMsdUJBQXVCLEVBQUUsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO1NBQ3hIO1FBQ0QsSUFBSSxRQUFRLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLG1CQUFtQixDQUFDLEVBQUU7WUFDOUQsTUFBTSxJQUFJLHdCQUFZLENBQUMsMkNBQWdCLENBQUMsMkJBQTJCLEVBQUUsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7U0FDbEk7UUFDRCxNQUFNLElBQUksd0JBQVksQ0FBQywyQ0FBZ0IsQ0FBQyxXQUFXLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDdkUsQ0FBQztDQUNGO0FBemVELDhDQXllQzs7Ozs7Ozs7Ozs7Ozs7QUN2Z0JELDJKQUF3RjtBQUN4RixnS0FXMkM7QUFDM0MsK0dBQW9DO0FBQ3BDLDJHQUFrRDtBQUNsRCwyTUFBbUc7QUFDbkcsNElBQXlFO0FBQ3pFLDZLQUF3RTtBQUN4RSxtSkFBZ0U7QUFDaEUsdUlBQWdFO0FBRWhFLDhJQUFvRDtBQUVwRCxNQUFhLGtCQUFtQixTQUFRLGlDQUFlO0lBQXZEOztRQUNFLGlGQUFpRjtRQUN6RSx5QkFBb0IsR0FBVyxTQUFNLEVBQUUsQ0FBQztJQW9XbEQsQ0FBQztJQWxXQyxJQUFXLFdBQVc7UUFDcEIsd0NBQTRCO0lBQzlCLENBQUM7SUFFTSxjQUFjO1FBQ25CLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVNLHVCQUF1QjtRQUM1QixPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztJQUNuQyxDQUFDO0lBRU8saUJBQWlCLENBQUMsYUFBcUIsRUFBRSxhQUFxQjtRQUNwRSxPQUFPLGFBQWEsR0FBRyxDQUFDLElBQUksYUFBYSxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUM7SUFDNUYsQ0FBQztJQUVNLHNCQUFzQixDQUMzQixRQUFrQixFQUNsQixPQUFvQixFQUNwQixhQUFzQixFQUN0QixlQUF3QixFQUN4QixpQkFBMEIsRUFDMUIsb0JBQW1DLEVBQ25DLE9BQWUsRUFDZix1QkFBZ0QsRUFDaEQsd0JBQWlDO1FBRWpDLCtCQUErQjtRQUMvQixNQUFNLFdBQVcsR0FBRyxPQUFPLEtBQUssNEJBQVcsQ0FBQyxPQUFPLENBQUM7UUFDcEQsTUFBTSxZQUFZLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsd0JBQXdCLENBQUM7UUFDcEYsTUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxpQ0FBTSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxpQ0FBTSxDQUFDLGlCQUFpQixDQUFDO1FBQ2hGLE1BQU0sY0FBYyxHQUFHLElBQUksS0FBSyxpQ0FBTSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1FBQ2hJLE1BQU0sVUFBVSxHQUFzQjtZQUNwQyxDQUFDLHNDQUFXLENBQUMsWUFBWSxDQUFDLEVBQUUsWUFBWTtTQUN6QyxDQUFDO1FBQ0YsVUFBVSxDQUFDLHNDQUFXLENBQUMsUUFBUSxDQUFDLEdBQUcsUUFBUSxDQUFDO1FBQzVDLFVBQVUsQ0FBQyxzQ0FBVyxDQUFDLGFBQWEsQ0FBQyxHQUFHLGFBQWEsQ0FBQztRQUN0RCxVQUFVLENBQUMsc0NBQVcsQ0FBQyxlQUFlLENBQUMsR0FBRyxlQUFlLENBQUM7UUFDMUQsVUFBVSxDQUFDLHNDQUFXLENBQUMsaUJBQWlCLENBQUMsR0FBRyxpQkFBaUIsQ0FBQztRQUM5RCxVQUFVLENBQUMsc0NBQVcsQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQ25HLFVBQVUsQ0FBQyxzQ0FBVyxDQUFDLE9BQU8sQ0FBQyxHQUFHLGNBQWMsQ0FBQztRQUNqRCxVQUFVLENBQUMsc0NBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLCtEQUE4QixDQUFDLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQ3RJLFVBQVUsQ0FBQyxzQ0FBVyxDQUFDLHdCQUF3QixDQUFDLEdBQUcsd0JBQXdCLENBQUM7UUFFNUUsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQVksQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUNqRSxNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsTUFBNkIsQ0FBQztZQUM1RCxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM3RSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSx5QkFBeUIsQ0FDOUIsUUFBa0IsRUFDbEIsWUFBb0IsRUFDcEIsYUFBc0IsRUFDdEIsZUFBd0IsRUFDeEIsaUJBQTBCLEVBQzFCLG9CQUFtQyxFQUNuQyx1QkFBZ0QsRUFDaEQsd0JBQWlDO1FBRWpDLE1BQU0sVUFBVSxHQUFzQjtZQUNwQyxDQUFDLHNDQUFXLENBQUMsWUFBWSxDQUFDLEVBQUUsMkJBQTJCO1lBQ3ZELENBQUMsc0NBQVcsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLElBQUksQ0FBQyx1QkFBdUIsRUFBRTtZQUNsRSxDQUFDLHNDQUFXLENBQUMsUUFBUSxDQUFDLEVBQUUsUUFBUTtZQUNoQyxDQUFDLHNDQUFXLENBQUMsWUFBWSxDQUFDLEVBQUUsWUFBWTtZQUN4QyxDQUFDLHNDQUFXLENBQUMsYUFBYSxDQUFDLEVBQUUsYUFBYTtZQUMxQyxDQUFDLHNDQUFXLENBQUMsZUFBZSxDQUFDLEVBQUUsZUFBZTtZQUM5QyxDQUFDLHNDQUFXLENBQUMsaUJBQWlCLENBQUMsRUFBRSxpQkFBaUI7WUFDbEQsQ0FBQyxzQ0FBVyxDQUFDLG9CQUFvQixDQUFDLEVBQUUsSUFBSSxDQUFDLHdCQUF3QixDQUFDLG9CQUFvQixDQUFDO1lBQ3ZGLENBQUMsc0NBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLCtEQUE4QixDQUFDLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQztZQUMxSCxDQUFDLHNDQUFXLENBQUMsd0JBQXdCLENBQUMsRUFBRSx3QkFBd0I7U0FDakUsQ0FBQztRQUVGLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQ0FBTSxDQUFDLHdCQUF3QixFQUFFLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBa0IsQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUNsRyxNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsTUFBeUMsQ0FBQztZQUV4RSxPQUFPLElBQUksMENBQWUsQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFLFlBQVksQ0FBQyxhQUFhLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMxRyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSwwQkFBMEIsQ0FBQyxRQUFrQjtRQUNsRCwwRkFBMEY7UUFDMUYsK0JBQStCO1FBQy9CLE1BQU0sSUFBSSxHQUFHLGlDQUFNLENBQUMsa0JBQWtCLENBQUM7UUFDdkMsTUFBTSxVQUFVLEdBQXNCO1lBQ3BDLENBQUMsc0NBQVcsQ0FBQyxZQUFZLENBQUMsRUFBRSw0QkFBNEI7WUFDeEQsQ0FBQyxzQ0FBVyxDQUFDLFFBQVEsQ0FBQyxFQUFFLFFBQVE7WUFDaEMsQ0FBQyxzQ0FBVyxDQUFDLGFBQWEsQ0FBQyxFQUFFLElBQUk7WUFDakMsQ0FBQyxzQ0FBVyxDQUFDLGVBQWUsQ0FBQyxFQUFFLElBQUk7WUFDbkMsQ0FBQyxzQ0FBVyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsSUFBSTtZQUNyQyxDQUFDLHNDQUFXLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUN4QixDQUFDLHNDQUFXLENBQUMsbUJBQW1CLENBQUMsRUFBRSxpREFBc0IsQ0FBQyxnQkFBZ0I7U0FDM0UsQ0FBQztRQUVGLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUF5QixDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQzlFLE1BQU0sbUJBQW1CLEdBQUcsUUFBUSxDQUFDLE1BQTZCLENBQUM7WUFDbkUsTUFBTSxTQUFTLEdBQUcsbUJBQW1CLENBQUMsSUFBSSxDQUFDO1lBQzNDLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLHNCQUFNLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUMzSCxPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxxQkFBcUIsQ0FBQyxRQUFrQjtRQUM3QyxNQUFNLFVBQVUsR0FBc0I7WUFDcEMsQ0FBQyxzQ0FBVyxDQUFDLFlBQVksQ0FBQyxFQUFFLHVCQUF1QjtZQUNuRCxDQUFDLHNDQUFXLENBQUMsUUFBUSxDQUFDLEVBQUUsUUFBUTtTQUNqQyxDQUFDO1FBQ0YsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGlDQUFNLENBQUMsZ0JBQWdCLEVBQUUsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUEyQixDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQ25HLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxNQUE0QixDQUFDO1lBQzNELE9BQU87Z0JBQ0wsSUFBSSxFQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO2FBQzlFLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSx3QkFBd0IsQ0FBQyxRQUFrQjtRQUNoRCxNQUFNLFVBQVUsR0FBc0I7WUFDcEMsQ0FBQyxzQ0FBVyxDQUFDLFlBQVksQ0FBQyxFQUFFLDBCQUEwQjtZQUN0RCxDQUFDLHNDQUFXLENBQUMsUUFBUSxDQUFDLEVBQUUsUUFBUTtTQUNqQyxDQUFDO1FBQ0YsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGlDQUFNLENBQUMsbUJBQW1CLEVBQUUsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUEyQixDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQ3RHLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxNQUErQixDQUFDO1lBQzlELE9BQU87Z0JBQ0wsSUFBSSxFQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO2FBQzlFLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxzQkFBc0IsQ0FDM0IsWUFBb0IsRUFDcEIsYUFBc0IsRUFDdEIsT0FBZSxFQUNmLGdCQUErQixFQUMvQixvQkFBbUMsRUFDbkMsdUJBQWdEO1FBRWhELE1BQU0sVUFBVSxHQUFzQjtZQUNwQyxDQUFDLHNDQUFXLENBQUMsWUFBWSxDQUFDLEVBQUUsd0JBQXdCO1lBQ3BELENBQUMsc0NBQVcsQ0FBQyxZQUFZLENBQUMsRUFBRSxZQUFZO1lBQ3hDLENBQUMsc0NBQVcsQ0FBQyxhQUFhLENBQUMsRUFBRSxhQUFhO1lBQzFDLENBQUMsc0NBQVcsQ0FBQyxPQUFPLENBQUMsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDakYsQ0FBQyxzQ0FBVyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsSUFBSSxDQUFDLHdCQUF3QixDQUFDLGdCQUFnQixDQUFDO1lBQy9FLENBQUMsc0NBQVcsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxvQkFBb0IsQ0FBQztZQUN2RixDQUFDLHNDQUFXLENBQUMsbUJBQW1CLENBQUMsRUFBRSwrREFBOEIsQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLENBQUMsdUJBQXVCLENBQUM7U0FDM0gsQ0FBQztRQUVGLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQ0FBTSxDQUFDLGlCQUFpQixFQUFFLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBWSxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQ3JGLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxNQUE2QixDQUFDO1lBQzVELE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDNUQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sd0JBQXdCLENBQzdCLFlBQW9CLEVBQ3BCLGNBQXNCLEVBQ3RCLGFBQXNCLEVBQ3RCLE9BQWUsRUFDZixnQkFBK0IsRUFDL0Isb0JBQW1DLEVBQ25DLHVCQUFnRDtRQUVoRCxNQUFNLFVBQVUsR0FBc0I7WUFDcEMsQ0FBQyxzQ0FBVyxDQUFDLFlBQVksQ0FBQyxFQUFFLDBCQUEwQjtZQUN0RCxDQUFDLHNDQUFXLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxnQkFBZ0I7WUFDaEQsQ0FBQyxzQ0FBVyxDQUFDLG9CQUFvQixDQUFDLEVBQUUsSUFBSSxDQUFDLHdCQUF3QixDQUFDLG9CQUFvQixDQUFDO1lBQ3ZGLENBQUMsc0NBQVcsQ0FBQyxZQUFZLENBQUMsRUFBRSxZQUFZO1lBQ3hDLENBQUMsc0NBQVcsQ0FBQyxhQUFhLENBQUMsRUFBRSxhQUFhO1lBQzFDLENBQUMsc0NBQVcsQ0FBQyxjQUFjLENBQUMsRUFBRSxjQUFjO1lBQzVDLENBQUMsc0NBQVcsQ0FBQyxPQUFPLENBQUMsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDakYsQ0FBQyxzQ0FBVyxDQUFDLG1CQUFtQixDQUFDLEVBQUUsK0RBQThCLENBQUMsdUJBQXVCLENBQUMsT0FBTyxDQUFDLHVCQUF1QixDQUFDO1NBQzNILENBQUM7UUFFRixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsaUNBQU0sQ0FBQyxtQkFBbUIsRUFBRSxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQVksQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUN2RixNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsTUFBNkIsQ0FBQztZQUM1RCxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzVELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLDhCQUE4QixDQUNuQyxZQUFvQixFQUNwQixjQUFzQixFQUN0QixZQUFvQixFQUNwQixhQUFzQixFQUN0QixvQkFBbUMsRUFDbkMsdUJBQWdEO1FBRWhELFlBQVksR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO1FBQzNFLE1BQU0sVUFBVSxHQUFzQjtZQUNwQyxDQUFDLHNDQUFXLENBQUMsWUFBWSxDQUFDLEVBQUUsZ0NBQWdDO1lBQzVELENBQUMsc0NBQVcsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLElBQUksQ0FBQyx1QkFBdUIsRUFBRTtZQUNsRSxDQUFDLHNDQUFXLENBQUMsWUFBWSxDQUFDLEVBQUUsWUFBWTtZQUN4QyxDQUFDLHNDQUFXLENBQUMsY0FBYyxDQUFDLEVBQUUsY0FBYztZQUM1QyxDQUFDLHNDQUFXLENBQUMsWUFBWSxDQUFDLEVBQUUsWUFBWTtZQUN4QyxDQUFDLHNDQUFXLENBQUMsYUFBYSxDQUFDLEVBQUUsYUFBYTtZQUMxQyxDQUFDLHNDQUFXLENBQUMsb0JBQW9CLENBQUMsRUFBRSxJQUFJLENBQUMsd0JBQXdCLENBQUMsb0JBQW9CLENBQUM7WUFDdkYsQ0FBQyxzQ0FBVyxDQUFDLG1CQUFtQixDQUFDLEVBQUUsK0RBQThCLENBQUMsdUJBQXVCLENBQUMsT0FBTyxDQUFDLHVCQUF1QixDQUFDO1NBQzNILENBQUM7UUFFRixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsaUNBQU0sQ0FBQyx5QkFBeUIsRUFBRSxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQWtCLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDbkcsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLE1BQXlDLENBQUM7WUFFeEUsT0FBTyxJQUFJLDBDQUFlLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFBRSxZQUFZLENBQUMsYUFBYSxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDMUcsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sMkJBQTJCLENBQ2hDLFFBQWtCLEVBQ2xCLGNBQXNCLEVBQ3RCLGFBQXNCLEVBQ3RCLGVBQXdCLEVBQ3hCLGlCQUEwQixFQUMxQixvQkFBbUMsRUFDbkMsT0FBZSxFQUNmLHVCQUFnRCxFQUNoRCx3QkFBaUM7UUFFakMsTUFBTSxVQUFVLEdBQXNCO1lBQ3BDLENBQUMsc0NBQVcsQ0FBQyxZQUFZLENBQUMsRUFBRSw2QkFBNkI7WUFDekQsQ0FBQyxzQ0FBVyxDQUFDLFFBQVEsQ0FBQyxFQUFFLFFBQVE7WUFDaEMsQ0FBQyxzQ0FBVyxDQUFDLGNBQWMsQ0FBQyxFQUFFLGNBQWM7WUFDNUMsQ0FBQyxzQ0FBVyxDQUFDLGFBQWEsQ0FBQyxFQUFFLGFBQWE7WUFDMUMsQ0FBQyxzQ0FBVyxDQUFDLGVBQWUsQ0FBQyxFQUFFLGVBQWU7WUFDOUMsQ0FBQyxzQ0FBVyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsaUJBQWlCO1lBQ2xELENBQUMsc0NBQVcsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxvQkFBb0IsQ0FBQztZQUN2RixDQUFDLHNDQUFXLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ2pGLENBQUMsc0NBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLCtEQUE4QixDQUFDLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQztZQUMxSCxDQUFDLHNDQUFXLENBQUMsd0JBQXdCLENBQUMsRUFBRSx3QkFBd0I7U0FDakUsQ0FBQztRQUVGLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQ0FBTSxDQUFDLHNCQUFzQixFQUFFLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBWSxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQzFGLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxNQUE2QixDQUFDO1lBQzVELE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDNUQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0saUNBQWlDLENBQ3RDLFFBQWtCLEVBQ2xCLGNBQXNCLEVBQ3RCLFlBQW9CLEVBQ3BCLGFBQXNCLEVBQ3RCLGVBQXdCLEVBQ3hCLGlCQUEwQixFQUMxQixvQkFBbUMsRUFDbkMsdUJBQWdELEVBQ2hELHdCQUFpQztRQUVqQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztRQUMzRSxNQUFNLFVBQVUsR0FBc0I7WUFDcEMsQ0FBQyxzQ0FBVyxDQUFDLFlBQVksQ0FBQyxFQUFFLG1DQUFtQztZQUMvRCxDQUFDLHNDQUFXLENBQUMsb0JBQW9CLENBQUMsRUFBRSxJQUFJLENBQUMsdUJBQXVCLEVBQUU7WUFDbEUsQ0FBQyxzQ0FBVyxDQUFDLFFBQVEsQ0FBQyxFQUFFLFFBQVE7WUFDaEMsQ0FBQyxzQ0FBVyxDQUFDLGNBQWMsQ0FBQyxFQUFFLGNBQWM7WUFDNUMsQ0FBQyxzQ0FBVyxDQUFDLGFBQWEsQ0FBQyxFQUFFLGFBQWE7WUFDMUMsQ0FBQyxzQ0FBVyxDQUFDLGVBQWUsQ0FBQyxFQUFFLGVBQWU7WUFDOUMsQ0FBQyxzQ0FBVyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsaUJBQWlCO1lBQ2xELENBQUMsc0NBQVcsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxvQkFBb0IsQ0FBQztZQUN2RixDQUFDLHNDQUFXLENBQUMsbUJBQW1CLENBQUMsRUFBRSwrREFBOEIsQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLENBQUMsdUJBQXVCLENBQUM7WUFDMUgsQ0FBQyxzQ0FBVyxDQUFDLFlBQVksQ0FBQyxFQUFFLFlBQVk7WUFDeEMsQ0FBQyxzQ0FBVyxDQUFDLHdCQUF3QixDQUFDLEVBQUUsd0JBQXdCO1NBQ2pFLENBQUM7UUFFRixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsaUNBQU0sQ0FBQyw0QkFBNEIsRUFBRSxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQWtCLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDdEcsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLE1BQXlDLENBQUM7WUFFeEUsT0FBTyxJQUFJLDBDQUFlLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFBRSxZQUFZLENBQUMsYUFBYSxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDMUcsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBSU0sWUFBWSxDQUFDLE9BQWUsRUFBRSxVQUFrQixFQUFFLFFBQWdCO1FBQ3ZFLE1BQU0sVUFBVSxHQUFzQjtZQUNwQyxDQUFDLHNDQUFXLENBQUMsWUFBWSxDQUFDLEVBQUUsY0FBYztZQUMxQyxDQUFDLHNDQUFXLENBQUMsb0JBQW9CLENBQUMsRUFBRSxJQUFJLENBQUMsdUJBQXVCLEVBQUU7WUFDbEUsQ0FBQyxzQ0FBVyxDQUFDLGVBQWUsQ0FBQyxFQUFFLE9BQU87WUFDdEMsQ0FBQyxzQ0FBVyxDQUFDLFlBQVksQ0FBQyxFQUFFLFVBQVUsR0FBRyxRQUFRO1NBQ2xELENBQUM7UUFFRixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsaUNBQU0sQ0FBQyxzQkFBc0IsRUFBRSxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQVksQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUMxRixNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsTUFBbUMsQ0FBQztZQUNsRSxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLEVBQUUsT0FBTyxLQUFLLGtCQUFrQixDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3RyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxZQUFZLENBQUMsT0FBZTtRQUNqQyxNQUFNLFVBQVUsR0FBc0I7WUFDcEMsQ0FBQyxzQ0FBVyxDQUFDLFlBQVksQ0FBQyxFQUFFLFNBQVM7WUFDckMsQ0FBQyxzQ0FBVyxDQUFDLG9CQUFvQixDQUFDLEVBQUUsSUFBSSxDQUFDLHVCQUF1QixFQUFFO1lBQ2xFLENBQUMsc0NBQVcsQ0FBQyxlQUFlLENBQUMsRUFBRSxPQUFPO1NBQ3ZDLENBQUM7UUFFRixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsaUNBQU0sQ0FBQyxzQkFBc0IsRUFBRSxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQU8sQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUNyRixPQUFPO1FBQ1QsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sd0JBQXdCLENBQUMsT0FBc0I7UUFDckQsZ0NBQWdDO1FBQ2hDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQzNCLE1BQU0sSUFBSSx3QkFBWSxDQUFDLHFDQUFVLENBQUMsZ0JBQWdCLEVBQUUsZ0VBQWdFLENBQUMsQ0FBQztTQUN2SDtRQUVELDZDQUE2QztRQUM3QyxNQUFNLFlBQVksR0FBZ0IsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbkQsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFUyxtQkFBbUIsQ0FBQyxZQUF1QyxFQUFFLFNBQWtCO1FBQ3ZGLE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLHNCQUFNLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUU5SCxzR0FBc0c7UUFDdEcsSUFBSSxLQUFLLENBQUM7UUFDVixJQUFJLFlBQVksQ0FBQyxLQUFLLEVBQUU7WUFDdEIsS0FBSyxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLHdCQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1NBQ2pGO1FBRUQsaUdBQWlHO1FBQ2pHLDBEQUEwRDtRQUMxRCxNQUFNLHNCQUFzQixHQUFHLFNBQVMsS0FBSyxLQUFLLElBQUksWUFBWSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLGNBQWMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNsSCxJQUFJLHNCQUFzQixFQUFFO1lBQzFCLFlBQVksQ0FBQyxTQUFTLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQztTQUNwQztRQUVELE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDL0MsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUM3QixPQUFPLG1DQUFnQixDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDNUUsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksS0FBSyxFQUFFO1lBQ1QsT0FBTyxJQUFJLHlCQUFTLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLHNCQUFzQixFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztTQUM5RjtRQUNELE9BQU8sSUFBSSx5QkFBUyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxzQkFBc0IsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUN4RixDQUFDO0lBRVMsa0JBQWtCLENBQUMsWUFBdUMsRUFBRSxTQUFrQjtRQUN0RixNQUFNLE9BQU8sR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxzQkFBTSxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFFOUgsSUFBSSxLQUFLLENBQUM7UUFDVixJQUFJLFlBQVksQ0FBQyxLQUFLLEVBQUU7WUFDdEIsS0FBSyxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLHdCQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1NBQ2pGO1FBRUQsTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUMvQyxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUU7Z0JBQzdCLE9BQU8sbUNBQWdCLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM1RSxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxLQUFLLEVBQUU7WUFDVCxPQUFPLElBQUkseUJBQVMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztTQUM3RTtRQUNELE9BQU8sSUFBSSx5QkFBUyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDdkUsQ0FBQzs7QUFyV0gsZ0RBc1dDO0FBdEZnQixpQ0FBYyxHQUFHLEVBQUUsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7QUN0U3JDLGtMQUE0RTtBQUU1RSxNQUFhLHVCQUF3QixTQUFRLHlEQUEyQjtJQUN0RSxJQUFXLFdBQVc7UUFDcEIsaURBQWlDO0lBQ25DLENBQUM7Q0FDRjtBQUpELDBEQUlDOzs7Ozs7Ozs7Ozs7OztBQ0xELE1BQWEsWUFBWTtJQUN2QixZQUEyQixTQUFnRCxFQUFVLFdBQStDO1FBQXpHLGNBQVMsR0FBVCxTQUFTLENBQXVDO1FBQVUsZ0JBQVcsR0FBWCxXQUFXLENBQW9DO1FBQ2xJLGVBQWU7SUFDakIsQ0FBQztJQUVNLGNBQWMsQ0FBQyxpQkFBd0I7UUFDNUMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLEVBQUU7WUFDckMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1NBQ3JDO0lBQ0gsQ0FBQztDQUNGO0FBVkQsb0NBVUM7QUFFRCxNQUFhLDJCQUEyQjtJQUd0QyxZQUEyQixVQUFpQztRQUFqQyxlQUFVLEdBQVYsVUFBVSxDQUF1QjtRQUMxRCxJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsVUFBVSxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUVNLGVBQWUsQ0FBQyxFQUFrQixFQUFFLFFBQW1DLEVBQUUsT0FBK0I7UUFDN0csTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLEtBQUssRUFBZ0IsQ0FBQztRQUNqRSxNQUFNLFlBQVksR0FBRyxJQUFJLFlBQVksQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDekQsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQztRQUM5QixPQUFPLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVPLDhCQUE4QixDQUFDLEVBQWtCO1FBQ3ZELGlEQUFpRDtRQUNqRCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFTyxjQUFjLENBQUMsWUFBMEI7UUFDL0MsSUFBSSxDQUFDLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLEVBQUU7WUFDckUsT0FBTztTQUNSO1FBRUQsNEVBQTRFO1FBQzVFLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNsRyxDQUFDO0lBRU8sa0JBQWtCLENBQUMsRUFBa0IsRUFBRSxZQUEwQjtRQUN2RSxJQUFJLENBQUMsSUFBSSxDQUFDLDhCQUE4QixDQUFDLEVBQUUsQ0FBQyxFQUFFO1lBQzVDLE9BQU87U0FDUjtRQUVELElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsS0FBSyxZQUFZLENBQUMsQ0FBQztJQUNoRixDQUFDO0NBQ0Y7QUFyQ0Qsa0VBcUNDOzs7Ozs7Ozs7Ozs7OztBQ3BERCwySkFBK0Q7QUFDL0QsZ0tBQTRIO0FBQzVILHdJQUF5RDtBQUN6RCwySEFBa0Q7QUFHbEQsOElBQW9EO0FBRXBELE1BQWEscUJBQXNCLFNBQVEsaUNBQWU7SUFDeEQsSUFBVyxXQUFXO1FBQ3BCLDZDQUErQjtJQUNqQyxDQUFDO0lBRU0sMEJBQTBCLENBQUMsU0FBb0I7UUFDcEQsTUFBTSxVQUFVLEdBQUc7WUFDakIsQ0FBQyxzQ0FBVyxDQUFDLFlBQVksQ0FBQyxFQUFFLDRCQUE0QjtZQUN4RCxDQUFDLHNDQUFXLENBQUMsU0FBUyxDQUFDLEVBQUUsU0FBUztTQUNuQyxDQUFDO1FBRUYsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVNLHFCQUFxQjtRQUMxQixNQUFNLFVBQVUsR0FBRztZQUNqQixDQUFDLHNDQUFXLENBQUMsWUFBWSxDQUFDLEVBQUUsNEJBQTRCO1NBQ3pELENBQUM7UUFFRixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRU8sa0JBQWtCLENBQUMsZUFBa0M7UUFDM0QsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGlDQUFNLENBQUMscUJBQXFCLEVBQUUsZUFBZSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDbkYsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQThCLENBQUM7WUFDdkQsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsYUFBYSxFQUFFLEVBQUU7Z0JBQ2xDLE9BQU8sSUFBSSw2QkFBYSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDNUQsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSx5QkFBeUIsQ0FBQyxTQUFpQixFQUFFLFFBQWdCO1FBQ2xFLE1BQU0sVUFBVSxHQUFHO1lBQ2pCLENBQUMsc0NBQVcsQ0FBQyxZQUFZLENBQUMsRUFBRSwyQkFBMkI7WUFDdkQsQ0FBQyxzQ0FBVyxDQUFDLGtCQUFrQixDQUFDLEVBQUUsU0FBUztZQUMzQyxDQUFDLHNDQUFXLENBQUMsY0FBYyxDQUFDLEVBQUUsUUFBUTtTQUN2QyxDQUFDO1FBRUYsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGlDQUFNLENBQUMsb0JBQW9CLEVBQUUsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDN0UsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQXVCLENBQUM7WUFDaEQsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sd0JBQXdCLENBQUMsSUFBWTtRQUMxQyxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVNLG1DQUFtQyxDQUFDLFNBQWlCO1FBQzFELE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRU8sa0JBQWtCLENBQUMsSUFBd0IsRUFBRSxTQUE2QjtRQUNoRixNQUFNLFVBQVUsR0FBc0I7WUFDcEMsQ0FBQyxzQ0FBVyxDQUFDLFlBQVksQ0FBQyxFQUFFLG9CQUFvQjtTQUNqRCxDQUFDO1FBQ0YsSUFBSSxJQUFJLEtBQUssU0FBUyxFQUFFO1lBQ3RCLFVBQVUsQ0FBQyxzQ0FBVyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsSUFBSSxDQUFDO1NBQ2pEO2FBQU0sSUFBSSxTQUFTLEtBQUssU0FBUyxFQUFFO1lBQ2xDLFVBQVUsQ0FBQyxzQ0FBVyxDQUFDLGtCQUFrQixDQUFDLEdBQUcsU0FBUyxDQUFDO1NBQ3hEO2FBQU07WUFDTCxNQUFNLElBQUksMkJBQVksQ0FBQyxxQ0FBVSxDQUFDLGdCQUFnQixFQUFFLHNEQUFzRCxDQUFDLENBQUM7U0FDN0c7UUFFRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsaUNBQU0sQ0FBQyxhQUFhLEVBQUUsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDdEUsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLE1BQWEsRUFBMkIsRUFBRTtnQkFDekUsT0FBTyxXQUFXLElBQUksTUFBTSxDQUFDO1lBQy9CLENBQUMsQ0FBQztZQUVGLGdFQUFnRTtZQUNoRSxJQUFJLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDNUMsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztnQkFDL0IsT0FBTyxJQUFJLDZCQUFhLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQzthQUNwRDtpQkFBTTtnQkFDTCxPQUFPLFNBQVMsQ0FBQzthQUNsQjtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBOUVELHNEQThFQzs7Ozs7Ozs7Ozs7Ozs7QUN0RkQseUlBQThEO0FBQzlELGdLQU8yQztBQUMzQyxrSkFTc0M7QUFDdEMsMkhBQWtEO0FBQ2xELGtIQUEwQztBQUcxQyw4SUFBb0Q7QUFFcEQsTUFBYSxvQkFBcUIsU0FBUSxpQ0FBZTtJQUN2RCxJQUFXLFdBQVc7UUFDcEIsMkNBQThCO0lBQ2hDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksdUJBQXVCLENBQUMsUUFBa0I7UUFDL0MsTUFBTSxVQUFVLEdBQXNCO1lBQ3BDLENBQUMsc0NBQVcsQ0FBQyxZQUFZLENBQUMsRUFBRSx5QkFBeUI7WUFDckQsQ0FBQyxzQ0FBVyxDQUFDLFFBQVEsQ0FBQyxFQUFFLFFBQVE7U0FDakMsQ0FBQztRQUNGLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQ0FBTSxDQUFDLGtCQUFrQixFQUFFLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQ2pGLE9BQU8sQ0FBQyx3REFBd0Q7UUFDbEUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksdUJBQXVCLENBQzVCLFFBQWtCLEVBQ2xCLGtCQUFxRCxFQUNyRCxtQkFBaUQ7UUFFakQsSUFBSSxrQkFBa0IsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ25DLE1BQU0sSUFBSSwyQkFBWSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLEVBQUUseURBQXlELENBQUMsQ0FBQztTQUN6SDtRQUVELE1BQU0sYUFBYSxHQUFXLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ3BGLE1BQU0sdUJBQXVCLEdBQTZCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBRXZHLE1BQU0sVUFBVSxHQUFzQjtZQUNwQyxDQUFDLHNDQUFXLENBQUMsWUFBWSxDQUFDLEVBQUUseUJBQXlCO1lBQ3JELENBQUMsc0NBQVcsQ0FBQyxRQUFRLENBQUMsRUFBRSxRQUFRO1lBQ2hDLENBQUMsc0NBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLGFBQWE7U0FDakQsQ0FBQztRQUVGLElBQUksdUJBQXVCLENBQUMsWUFBWSxJQUFJLHVCQUF1QixDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUU7WUFDdkYsVUFBVSxDQUFDLHNDQUFXLENBQUMsc0JBQXNCLENBQUMsR0FBRyx1QkFBdUIsQ0FBQyxZQUFZLENBQUM7U0FDdkY7UUFDRCxJQUFJLHVCQUF1QixDQUFDLGFBQWEsSUFBSSx1QkFBdUIsQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFO1lBQ3pGLFVBQVUsQ0FBQyxzQ0FBVyxDQUFDLHlCQUF5QixDQUFDLEdBQUcsdUJBQXVCLENBQUMsYUFBYSxDQUFDO1NBQzNGO1FBQ0QsSUFBSSx1QkFBdUIsQ0FBQyxXQUFXLElBQUksdUJBQXVCLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRTtZQUNyRixVQUFVLENBQUMsc0NBQVcsQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLHVCQUF1QixDQUFDLFdBQVcsQ0FBQztTQUNyRjtRQUVELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQ0FBTSxDQUFDLGFBQWEsRUFBRSxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQU8sQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUM1RSxJQUFJLENBQUMsb0NBQW9DLENBQUMsUUFBUSxDQUFDLE1BQW1DLENBQUMsQ0FBQztZQUN4RixPQUFPO1FBQ1QsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSSxlQUFlLENBQ3BCLFFBQWtCLEVBQ2xCLFlBQXFCLEVBQ3JCLE9BQXdDLEVBQ3hDLGlCQUEyQjtRQUUzQixJQUFJLGdCQUFnQixHQUFHLElBQUksNENBQTBCLENBQ25ELFFBQVEsRUFDUixJQUFJLENBQUMsMEJBQTBCLENBQUMsWUFBWSxDQUFDLEVBQzdDLE9BQU8sRUFDUCxpQkFBaUIsQ0FDbEIsQ0FBQztRQUVGLE1BQU0sVUFBVSxHQUFzQjtZQUNwQyxDQUFDLHNDQUFXLENBQUMsWUFBWSxDQUFDLEVBQUUsaUJBQWlCO1lBQzdDLENBQUMsc0NBQVcsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLGdCQUFnQjtTQUN0RCxDQUFDO1FBRUYsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGlDQUFNLENBQUMsMkJBQTJCLEVBQUUsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFPLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDMUYsT0FBTztRQUNULENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNJLGlCQUFpQixDQUN0QixRQUFrQixFQUNsQixjQUE2QixFQUM3QixZQUFvQyxFQUNwQyxPQUFpQztRQUVqQyxJQUFJLGdCQUFnQixHQUFHLElBQUksOENBQTRCLENBQUMsUUFBUSxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFekcsTUFBTSxVQUFVLEdBQXNCO1lBQ3BDLENBQUMsc0NBQVcsQ0FBQyxZQUFZLENBQUMsRUFBRSxtQkFBbUI7WUFDL0MsQ0FBQyxzQ0FBVyxDQUFDLHVCQUF1QixDQUFDLEVBQUUsZ0JBQWdCO1NBQ3hELENBQUM7UUFFRixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsaUNBQU0sQ0FBQyw2QkFBNkIsRUFBRSxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQU8sQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUM1RixPQUFPO1FBQ1QsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sb0NBQW9DLENBQUMsUUFBbUM7UUFDOUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxzQ0FBVyxDQUFDLGNBQWMsQ0FBQyxFQUFFO1lBQ3pDLE9BQU87U0FDUjtRQUNELElBQUksUUFBUSxDQUFDLHNDQUFXLENBQUMsYUFBYSxDQUFDLEVBQUU7WUFDdkMsTUFBTSxJQUFJLDJCQUFZLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLHlCQUF5QixFQUFFLFFBQVEsQ0FBQyxzQ0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7U0FDbEg7UUFDRCxJQUFJLFFBQVEsQ0FBQyxzQ0FBVyxDQUFDLGFBQWEsQ0FBQyxFQUFFO1lBQ3ZDLE1BQU0sSUFBSSwyQkFBWSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsRUFBRSxRQUFRLENBQUMsc0NBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO1NBQzlHO1FBQ0QsSUFBSSxRQUFRLENBQUMsc0NBQVcsQ0FBQyxZQUFZLENBQUMsRUFBRTtZQUN0QyxNQUFNLElBQUksMkJBQVksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsb0JBQW9CLEVBQUUsUUFBUSxDQUFDLHNDQUFXLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztTQUM1RztJQUNILENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxvQkFBb0IsQ0FDekIsUUFBa0IsRUFDbEIsS0FBK0IsRUFDL0IsbUJBQWlEO1FBRWpELElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDdEIsTUFBTSxJQUFJLDJCQUFZLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsRUFBRSw4Q0FBOEMsQ0FBQyxDQUFDO1NBQzlHO1FBRUQsTUFBTSxhQUFhLEdBQVcsSUFBSSxDQUFDLDJCQUEyQixDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDcEYsTUFBTSx1QkFBdUIsR0FBNkIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXhGLE1BQU0sVUFBVSxHQUFzQjtZQUNwQyxDQUFDLHNDQUFXLENBQUMsWUFBWSxDQUFDLEVBQUUsc0JBQXNCO1lBQ2xELENBQUMsc0NBQVcsQ0FBQyxRQUFRLENBQUMsRUFBRSxRQUFRO1lBQ2hDLENBQUMsc0NBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLGFBQWE7WUFDaEQsQ0FBQyxzQ0FBVyxDQUFDLFNBQVMsQ0FBQyxFQUFFLHVCQUF1QixDQUFDLFNBQVM7U0FDM0QsQ0FBQztRQUNGLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQ0FBTSxDQUFDLGFBQWEsRUFBRSxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQU8sQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUM1RSx3REFBd0Q7WUFDeEQsT0FBTztZQUNQLCtGQUErRjtRQUNqRyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSyxpQkFBaUIsQ0FBQyxLQUErQjtRQUN2RCxNQUFNLEdBQUcsR0FBa0IsRUFBRSxDQUFDO1FBQzlCLE1BQU0sdUJBQXVCLEdBQTZCLElBQUksMENBQXdCLEVBQUUsQ0FBQztRQUN6RixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNyQyxNQUFNLE9BQU8sR0FBdUIsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztZQUNyRCxJQUFJLE9BQU8sS0FBSyxTQUFTLElBQUksT0FBTyxLQUFLLElBQUksRUFBRTtnQkFDN0MsbURBQW1EO2dCQUNuRCxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsd0JBQXdCO2FBQ3ZEO2lCQUFNO2dCQUNMLE1BQU0sSUFBSSwyQkFBWSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUFFLHVCQUF1QixDQUFDLENBQUM7YUFDcEY7U0FDRjtRQUNELElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDcEIsNEJBQTRCO1lBQzVCLE1BQU0sbUJBQW1CLEdBQXdCLElBQUkscUNBQW1CLEVBQUUsQ0FBQztZQUMzRSxtQkFBbUIsQ0FBQyxhQUFhLEdBQUcsUUFBUSxDQUFDO1lBQzdDLG1CQUFtQixDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUM7WUFDcEMsdUJBQXVCLENBQUMsU0FBUyxHQUFHLG1CQUFtQixDQUFDO1NBQ3pEO1FBQ0QsT0FBTyx1QkFBdUIsQ0FBQztJQUNqQyxDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0ssbUJBQW1CLENBQUMsa0JBQXFEO1FBQy9FLE1BQU0sdUJBQXVCLEdBQTZCLElBQUksMENBQXdCLEVBQUUsQ0FBQztRQUV6RixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsa0JBQWtCLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ2xELE1BQU0sRUFBRSxHQUFHLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDLEtBQUssS0FBSyxTQUFTLElBQUksRUFBRSxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsRUFBRTtnQkFDbEUsTUFBTSxJQUFJLDJCQUFZLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsa0NBQWtDLENBQUMsQ0FBQzthQUMvRjtZQUVELE1BQU0sUUFBUSxHQUFHLElBQUksTUFBTSxDQUFDLG9CQUFvQixFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZELE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQyxLQUE0QixDQUFDO1lBQ3BELElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUU7Z0JBQy9CLCtCQUErQjtnQkFDL0IsTUFBTSxTQUFTLEdBQStCLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUErQixDQUFDO2dCQUN6SCx1QkFBdUIsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2FBQ3REO2lCQUFNLElBQUksV0FBVyxDQUFDLEdBQUcsS0FBSyxTQUFTLElBQUksV0FBVyxDQUFDLEdBQUcsS0FBSyxTQUFTLEVBQUU7Z0JBQ3pFLHdCQUF3QjtnQkFDeEIsTUFBTSxVQUFVLEdBQXdCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDO2dCQUM3Rix1QkFBdUIsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQ3hEO2lCQUFNO2dCQUNMLDRCQUE0QjtnQkFDNUIsTUFBTSxRQUFRLEdBQTRCLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUE0QixDQUFDO2dCQUNsSCx1QkFBdUIsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQ3BEO1NBQ0Y7UUFFRCxPQUFPLHVCQUF1QixDQUFDO0lBQ2pDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyxlQUFlLENBQUMsU0FBaUIsRUFBRSxLQUFzRDtRQUMvRixNQUFNLG1CQUFtQixHQUF3QixJQUFJLHFDQUFtQixFQUFFLENBQUM7UUFDM0UsTUFBTSxVQUFVLEdBQWtCLEVBQUUsQ0FBQztRQUVyQyxJQUFJLEtBQUssWUFBWSxLQUFLLEVBQUU7WUFDMUIsTUFBTSxRQUFRLEdBQWtCLEtBQUssQ0FBQztZQUN0QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDeEMsVUFBVSxDQUFDLElBQUksQ0FBQyxhQUFLLENBQUMsdUJBQXVCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUM3RDtTQUNGO2FBQU07WUFDTCxVQUFVLENBQUMsSUFBSSxDQUFDLGFBQUssQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1NBQ3ZEO1FBRUQsbUJBQW1CLENBQUMscUJBQXFCLEdBQUcsU0FBUyxDQUFDO1FBQ3RELG1CQUFtQixDQUFDLFlBQVksR0FBRyxVQUFVLENBQUM7UUFDOUMsT0FBTyxtQkFBbUIsQ0FBQztJQUM3QixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSyxvQkFBb0IsQ0FBQyxTQUFpQixFQUFFLEtBQTBCO1FBQ3hFLE1BQU0sbUJBQW1CLEdBQXdCLElBQUkscUNBQW1CLEVBQUUsQ0FBQztRQUMzRSxtQkFBbUIsQ0FBQyxxQkFBcUIsR0FBRyxTQUFTLENBQUM7UUFDdEQsSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLElBQUksRUFBRTtZQUNqRCxtQkFBbUIsQ0FBQyxRQUFRLEdBQUcsYUFBSyxDQUFDLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUN6RTtRQUNELElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxTQUFTLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxJQUFJLEVBQUU7WUFDakQsbUJBQW1CLENBQUMsUUFBUSxHQUFHLGFBQUssQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDekU7UUFDRCxtQkFBbUIsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM3RSxPQUFPLG1CQUFtQixDQUFDO0lBQzdCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssMkJBQTJCLENBQUMsbUJBQWlEO1FBQ25GLElBQUksbUJBQW1CLEtBQUssUUFBUSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRTtZQUNoRSxPQUFPLDhDQUEyQixDQUFDLE9BQU8sQ0FBQztTQUM1QzthQUFNLElBQUksbUJBQW1CLEtBQUssUUFBUSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsRUFBRTtZQUNuRSxPQUFPLDhDQUEyQixDQUFDLEdBQUcsQ0FBQztTQUN4QzthQUFNLElBQUksbUJBQW1CLEtBQUssUUFBUSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sRUFBRTtZQUN0RSxPQUFPLDhDQUEyQixDQUFDLE1BQU0sQ0FBQztTQUMzQztRQUNELE9BQU8sOENBQTJCLENBQUMsT0FBTyxDQUFDO0lBQzdDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssc0JBQXNCLENBQUMsVUFBaUQ7UUFDOUUsSUFBSSxVQUFVLEVBQUU7WUFDZCxJQUFJLFVBQVUsS0FBSyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFO2dCQUN2RCxPQUFPLHFEQUEwQixDQUFDLFdBQVcsQ0FBQzthQUMvQztpQkFBTSxJQUFJLFVBQVUsS0FBSyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxFQUFFO2dCQUNqRSxPQUFPLHFEQUEwQixDQUFDLGNBQWMsQ0FBQzthQUNsRDtpQkFBTSxJQUFJLFVBQVUsS0FBSyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFO2dCQUM3RCxPQUFPLHFEQUEwQixDQUFDLFVBQVUsQ0FBQzthQUM5QztTQUNGO1FBRUQsT0FBTyxxREFBMEIsQ0FBQyxVQUFVLENBQUM7SUFDL0MsQ0FBQztJQUVPLDBCQUEwQixDQUFDLE9BQWdCO1FBQ2pELElBQUksT0FBTyxJQUFJLE9BQU8sR0FBRyxDQUFDLEVBQUU7WUFDMUIsT0FBTyxPQUFPLENBQUM7U0FDaEI7UUFFRCxtRUFBbUU7UUFDbkUsOERBQThEO1FBQzlELE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQztDQUNGO0FBcFVELG9EQW9VQzs7Ozs7Ozs7Ozs7Ozs7QUMzVkQsMk1BQW1HO0FBQ25HLDJIQUFrRDtBQUNsRCwwSUFBd0Q7QUFFeEQ7Ozs7R0FJRztBQUNILE1BQWEsZUFBZTtJQUMxQixZQUEyQixXQUFrQyxFQUFZLFdBQW1CO1FBQWpFLGdCQUFXLEdBQVgsV0FBVyxDQUF1QjtRQUFZLGdCQUFXLEdBQVgsV0FBVyxDQUFRO0lBQUcsQ0FBQztJQUV0RixPQUFPLENBQUMsSUFBWSxFQUFFLE1BQXlCO1FBQ3ZELE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQzVELHdFQUF3RTtZQUN4RSw4REFBOEQ7WUFDOUQsTUFBTSxhQUFhLEdBQUcsS0FBNkIsQ0FBQztZQUNwRCxNQUFNLGlCQUFpQixHQUFlLCtEQUE4QixDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSwyQkFBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2hJLE1BQU0sSUFBSSwyQkFBWSxDQUFDLGlCQUFpQixFQUFFLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNuRSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQVpELDBDQVlDOzs7Ozs7Ozs7Ozs7OztBQ3RCRCxnS0FBMkY7QUFHM0YsOElBQW9EO0FBRXBELE1BQWEsZUFBZ0IsU0FBUSxpQ0FBZTtJQUNsRCxJQUFXLFdBQVc7UUFDcEIsaUNBQXlCO0lBQzNCLENBQUM7SUFFRCxlQUFlLENBQUMsSUFBWSxFQUFFLE9BQWtCOztRQUM5QyxNQUFNLFVBQVUsR0FBc0I7WUFDcEMsQ0FBQyxzQ0FBVyxDQUFDLFlBQVksQ0FBQyxFQUFFLGlCQUFpQjtZQUM3QyxDQUFDLHNDQUFXLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSTtZQUM3QixDQUFDLHNDQUFXLENBQUMsU0FBUyxDQUFDLEVBQUUsY0FBTyxDQUFDLE9BQU8sMENBQUUsTUFBTSxLQUFJLENBQUM7WUFDckQsQ0FBQyxzQ0FBVyxDQUFDLFFBQVEsQ0FBQyxFQUFFLGNBQU8sQ0FBQyxPQUFPLDBDQUFFLEtBQUssS0FBSSxDQUFDO1lBQ25ELENBQUMsc0NBQVcsQ0FBQyxTQUFTLENBQUMsRUFBRSxjQUFPLENBQUMsT0FBTywwQ0FBRSxNQUFNLEtBQUksQ0FBQztZQUNyRCxDQUFDLHNDQUFXLENBQUMsUUFBUSxDQUFDLEVBQUUsY0FBTyxDQUFDLE9BQU8sMENBQUUsS0FBSyxLQUFJLENBQUM7U0FDcEQsQ0FBQztRQUVGLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQ0FBTSxDQUFDLFlBQVksRUFBRSxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRTtZQUM1RSxPQUFPO1FBQ1QsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUFuQkQsMENBbUJDOzs7Ozs7Ozs7Ozs7OztBQ3pCRCxnS0FBNEc7QUFHNUcsOElBQW9EO0FBRXBELE1BQWEsMEJBQTJCLFNBQVEsaUNBQWU7SUFDN0QsSUFBVyxXQUFXO1FBQ3BCLHdEQUFvQztJQUN0QyxDQUFDO0lBRUQsMkJBQTJCO1FBQ3pCLE1BQU0sSUFBSSxHQUFHLGlDQUFNLENBQUMsc0JBQXNCLENBQUM7UUFDM0MsTUFBTSxVQUFVLEdBQXNCO1lBQ3BDLENBQUMsc0NBQVcsQ0FBQyxZQUFZLENBQUMsRUFBRSw2QkFBNkI7U0FDMUQsQ0FBQztRQUVGLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFPLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDNUQsT0FBTztRQUNULENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELCtCQUErQjtRQUM3QixNQUFNLElBQUksR0FBRyxpQ0FBTSxDQUFDLDBCQUEwQixDQUFDO1FBQy9DLE1BQU0sVUFBVSxHQUFzQjtZQUNwQyxDQUFDLHNDQUFXLENBQUMsWUFBWSxDQUFDLEVBQUUsaUNBQWlDO1NBQzlELENBQUM7UUFFRixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQzVELE9BQU87UUFDVCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCx1QkFBdUIsQ0FBQyxLQUFhO1FBQ25DLE1BQU0sSUFBSSxHQUFHLGlDQUFNLENBQUMsa0JBQWtCLENBQUM7UUFDdkMsTUFBTSxVQUFVLEdBQXNCO1lBQ3BDLENBQUMsc0NBQVcsQ0FBQyxZQUFZLENBQUMsRUFBRSx5QkFBeUI7U0FDdEQsQ0FBQztRQUNGLFVBQVUsQ0FBQyxzQ0FBVyxDQUFDLGVBQWUsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUVoRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQzVELE9BQU87UUFDVCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxLQUFhO1FBQ2pDLE1BQU0sSUFBSSxHQUFHLGlDQUFNLENBQUMsZ0JBQWdCLENBQUM7UUFDckMsTUFBTSxVQUFVLEdBQXNCO1lBQ3BDLENBQUMsc0NBQVcsQ0FBQyxZQUFZLENBQUMsRUFBRSx1QkFBdUI7U0FDcEQsQ0FBQztRQUNGLFVBQVUsQ0FBQyxzQ0FBVyxDQUFDLGVBQWUsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUVoRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBa0IsQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUN2RSxPQUFPLFFBQVEsQ0FBQyxNQUF5QixDQUFDO1FBQzVDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBbERELGdFQWtEQzs7Ozs7Ozs7Ozs7Ozs7QUN0REQsZ0tBQTBIO0FBRzFILDhJQUFvRDtBQUVwRCxNQUFhLHNCQUF1QixTQUFRLGlDQUFlO0lBQ3pELElBQVcsV0FBVztRQUNwQixnREFBZ0M7SUFDbEMsQ0FBQztJQUVNLDJCQUEyQixDQUFDLFFBQWtCO1FBQ25ELE1BQU0sVUFBVSxHQUFzQjtZQUNwQyxDQUFDLHNDQUFXLENBQUMsWUFBWSxDQUFDLEVBQUUsNkJBQTZCO1lBQ3pELENBQUMsc0NBQVcsQ0FBQyxhQUFhLENBQUMsRUFBRSxRQUFRLENBQUMsU0FBUztTQUNoRCxDQUFDO1FBRUYsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGlDQUFNLENBQUMsc0JBQXNCLEVBQUUsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUErQixDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQzdHLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUE2QixDQUFDO1lBQ3RELE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLHVCQUF1QixDQUM1QixRQUFrQixFQUNsQixjQUFzQixFQUN0QixZQUFtQyxFQUNuQyxPQUErQixFQUMvQixVQUFrQjtRQUVsQixNQUFNLFVBQVUsR0FBc0I7WUFDcEMsQ0FBQyxzQ0FBVyxDQUFDLFlBQVksQ0FBQyxFQUFFLHlCQUF5QjtZQUNyRCxDQUFDLHNDQUFXLENBQUMsYUFBYSxDQUFDLEVBQUUsUUFBUSxDQUFDLFNBQVM7WUFDL0MsQ0FBQyxzQ0FBVyxDQUFDLGNBQWMsQ0FBQyxFQUFFLGNBQWM7WUFDNUMsQ0FBQyxzQ0FBVyxDQUFDLFlBQVksQ0FBQyxFQUFFLFlBQVk7WUFDeEMsQ0FBQyxzQ0FBVyxDQUFDLE9BQU8sQ0FBQyxFQUFFLE9BQU87WUFDOUIsQ0FBQyxzQ0FBVyxDQUFDLFVBQVUsQ0FBQyxFQUFFLFVBQVU7U0FDckMsQ0FBQztRQUNGLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQ0FBTSxDQUFDLGtCQUFrQixFQUFFLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDbkUsT0FBTztRQUNULENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLHVCQUF1QixDQUM1QixRQUFrQixFQUNsQixjQUFzQixFQUN0QixTQUFpQixFQUNqQixPQUFlLEVBQ2YsVUFBVSxHQUFHLENBQUM7UUFFZCxNQUFNLFVBQVUsR0FBc0I7WUFDcEMsQ0FBQyxzQ0FBVyxDQUFDLFlBQVksQ0FBQyxFQUFFLHlCQUF5QjtZQUNyRCxDQUFDLHNDQUFXLENBQUMsYUFBYSxDQUFDLEVBQUUsUUFBUSxDQUFDLFNBQVM7WUFDL0MsQ0FBQyxzQ0FBVyxDQUFDLGNBQWMsQ0FBQyxFQUFFLGNBQWM7WUFDNUMsQ0FBQyxzQ0FBVyxDQUFDLFNBQVMsQ0FBQyxFQUFFLFNBQVM7WUFDbEMsQ0FBQyxzQ0FBVyxDQUFDLE9BQU8sQ0FBQyxFQUFFLE9BQU87WUFDOUIsQ0FBQyxzQ0FBVyxDQUFDLFVBQVUsQ0FBQyxFQUFFLFVBQVU7U0FDckMsQ0FBQztRQUNGLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQ0FBTSxDQUFDLGtCQUFrQixFQUFFLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDbkUsT0FBTztRQUNULENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLDBCQUEwQixDQUMvQixRQUFrQixFQUNsQixjQUFzQixFQUN0QixZQUFtQyxFQUNuQyxVQUFrQixFQUNsQixXQUFtQixFQUNuQixPQUErQjtRQUUvQixNQUFNLFVBQVUsR0FBc0I7WUFDcEMsQ0FBQyxzQ0FBVyxDQUFDLFlBQVksQ0FBQyxFQUFFLDRCQUE0QjtZQUN4RCxDQUFDLHNDQUFXLENBQUMsYUFBYSxDQUFDLEVBQUUsUUFBUSxDQUFDLFNBQVM7WUFDL0MsQ0FBQyxzQ0FBVyxDQUFDLGNBQWMsQ0FBQyxFQUFFLGNBQWM7WUFDNUMsQ0FBQyxzQ0FBVyxDQUFDLFlBQVksQ0FBQyxFQUFFLFlBQVk7WUFDeEMsQ0FBQyxzQ0FBVyxDQUFDLFVBQVUsQ0FBQyxFQUFFLFVBQVU7WUFDcEMsQ0FBQyxzQ0FBVyxDQUFDLFdBQVcsQ0FBQyxFQUFFLFdBQVc7WUFDdEMsQ0FBQyxzQ0FBVyxDQUFDLE9BQU8sQ0FBQyxFQUFFLE9BQU87U0FDL0IsQ0FBQztRQUNGLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQ0FBTSxDQUFDLHFCQUFxQixFQUFFLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDdEUsT0FBTztRQUNULENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELHNCQUFzQixDQUFDLFNBQWlCO1FBQ3RDLE1BQU0sVUFBVSxHQUFzQjtZQUNwQyxDQUFDLHNDQUFXLENBQUMsWUFBWSxDQUFDLEVBQUUsd0JBQXdCO1lBQ3BELENBQUMsc0NBQVcsQ0FBQyxPQUFPLENBQUMsRUFBRSxTQUFTO1NBQ2pDLENBQUM7UUFDRixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsaUNBQU0sQ0FBQyxpQkFBaUIsRUFBRSxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ2xFLE9BQU87UUFDVCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQXhGRCx3REF3RkM7Ozs7Ozs7Ozs7Ozs7O0FDOUZELGdLQUE0RztBQUM1RywySUFBMkQ7QUFHM0QsOElBQW9EO0FBRXBELE1BQWEsY0FBZSxTQUFRLGlDQUFlO0lBQ2pELElBQVcsV0FBVztRQUNwQiwrQkFBd0I7SUFDMUIsQ0FBQztJQUVNLG1CQUFtQixDQUFDLFNBQWlCO1FBQzFDLE1BQU0sVUFBVSxHQUFzQjtZQUNwQyxDQUFDLHNDQUFXLENBQUMsWUFBWSxDQUFDLEVBQUUscUJBQXFCO1lBQ2pELENBQUMsc0NBQVcsQ0FBQyxlQUFlLENBQUMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQztTQUN6RCxDQUFDO1FBRUYsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGlDQUFNLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQy9ELE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFnQixDQUFDO1lBQ3pDLE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLGtCQUFrQixDQUFDLElBQVk7UUFDcEMsTUFBTSxVQUFVLEdBQXNCO1lBQ3BDLENBQUMsc0NBQVcsQ0FBQyxZQUFZLENBQUMsRUFBRSxvQkFBb0I7WUFDaEQsQ0FBQyxzQ0FBVyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsSUFBSTtTQUN0QyxDQUFDO1FBRUYsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGlDQUFNLENBQUMsYUFBYSxFQUFFLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDOUQsT0FBTztRQUNULENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLG1CQUFtQjtRQUN4QixNQUFNLFVBQVUsR0FBc0I7WUFDcEMsQ0FBQyxzQ0FBVyxDQUFDLFlBQVksQ0FBQyxFQUFFLHFCQUFxQjtTQUNsRCxDQUFDO1FBRUYsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGlDQUFNLENBQUMsY0FBYyxFQUFFLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBd0IsQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUM5RixNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsTUFBZ0MsQ0FBQztZQUM5RCxPQUFPLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxVQUEyQixFQUFFLEVBQUU7Z0JBQ3JELE9BQU8sSUFBSSwrQkFBYyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDMUQsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxtQkFBbUIsQ0FBQyxjQUE4QjtRQUN2RCxNQUFNLFVBQVUsR0FBc0I7WUFDcEMsQ0FBQyxzQ0FBVyxDQUFDLFlBQVksQ0FBQyxFQUFFLHFCQUFxQjtZQUNqRCxDQUFDLHNDQUFXLENBQUMsY0FBYyxDQUFDLEVBQUUsY0FBYyxJQUFJLEVBQUU7U0FDbkQsQ0FBQztRQUVGLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQ0FBTSxDQUFDLGNBQWMsRUFBRSxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQTZCLENBQUMsUUFBUSxFQUFFLEVBQUU7O1lBQ25HLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxNQUF5QixDQUFDO1lBQ3RELE9BQU8saUJBQVUsMENBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQyxJQUFJLCtCQUFjLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ3pGLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLHFCQUFxQixDQUFDLGNBQXNCO1FBQ2pELE1BQU0sVUFBVSxHQUFzQjtZQUNwQyxDQUFDLHNDQUFXLENBQUMsWUFBWSxDQUFDLEVBQUUsdUJBQXVCO1lBQ25ELENBQUMsc0NBQVcsQ0FBQyxjQUFjLENBQUMsRUFBRSxjQUFjO1NBQzdDLENBQUM7UUFFRixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsaUNBQU0sQ0FBQyxnQkFBZ0IsRUFBRSxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQWlCLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDekYsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLE1BQXlCLENBQUM7WUFDdEQsT0FBTyxJQUFJLCtCQUFjLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMxRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxtQkFBbUIsQ0FBQyxjQUFzQjtRQUMvQyxpSEFBaUg7UUFDakgsd0RBQXdEO1FBQ3hELE1BQU0sVUFBVSxHQUFzQjtZQUNwQyxDQUFDLHNDQUFXLENBQUMsWUFBWSxDQUFDLEVBQUUscUJBQXFCO1lBQ2pELENBQUMsc0NBQVcsQ0FBQyxjQUFjLENBQUMsRUFBRSxjQUFjO1lBQzVDLENBQUMsc0NBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLEtBQUs7U0FDekMsQ0FBQztRQUVGLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQ0FBTSxDQUFDLHdCQUF3QixFQUFFLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBaUIsQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUNqRyxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsTUFBeUIsQ0FBQztZQUN0RCxPQUFPLElBQUksK0JBQWMsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzFELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLGlDQUFpQztRQUN0QyxNQUFNLFVBQVUsR0FBc0I7WUFDcEMsQ0FBQyxzQ0FBVyxDQUFDLFlBQVksQ0FBQyxFQUFFLG1DQUFtQztTQUNoRSxDQUFDO1FBRUYsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGlDQUFNLENBQUMsNEJBQTRCLEVBQUUsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUM3RSxPQUFPO1FBQ1QsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sU0FBUyxDQUFDLFVBQTBCO1FBQ3pDLE1BQU0sVUFBVSxHQUFzQjtZQUNwQyxDQUFDLHNDQUFXLENBQUMsWUFBWSxDQUFDLEVBQUUsV0FBVztZQUN2QyxDQUFDLHNDQUFXLENBQUMsY0FBYyxDQUFDLEVBQUUsVUFBVSxDQUFDLElBQUk7WUFDN0MsQ0FBQyxzQ0FBVyxDQUFDLGNBQWMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxJQUFJO1lBQzdDLENBQUMsc0NBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxTQUFTO1lBQ3ZELENBQUMsc0NBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxNQUFNO1NBQ3BELENBQUM7UUFFRixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsaUNBQU0sQ0FBQyxnQkFBZ0IsRUFBRSxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQWlCLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDekYsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLE1BQXlCLENBQUM7WUFDdEQsT0FBTyxJQUFJLCtCQUFjLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMxRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxrQkFBa0I7UUFDdkIsTUFBTSxVQUFVLEdBQXNCO1lBQ3BDLENBQUMsc0NBQVcsQ0FBQyxZQUFZLENBQUMsRUFBRSxvQkFBb0I7U0FDakQsQ0FBQztRQUVGLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQ0FBTSxDQUFDLGFBQWEsRUFBRSxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxNQUFnQixDQUFDLENBQUM7SUFDdEcsQ0FBQztDQUNGO0FBaEhELHdDQWdIQzs7Ozs7Ozs7Ozs7Ozs7QUNySEQsMkpBQWtGO0FBQ2xGLGdLQUF3RTtBQUN4RSwyTUFBNEg7QUFFNUgsdUlBQXdEO0FBQ3hELGtIQUEwQztBQUcxQyw4SUFBb0Q7QUFFcEQsTUFBYSxlQUFnQixTQUFRLGlDQUFlO0lBQ2xELElBQVcsV0FBVztRQUNwQixpQ0FBeUI7SUFDM0IsQ0FBQztJQUVNLGtCQUFrQixDQUN2QixTQUFpQixFQUNqQixnQkFBa0QsRUFDbEQsaUJBQTZDO1FBRTdDLE1BQU0sVUFBVSxHQUFHO1lBQ2pCLENBQUMsc0NBQVcsQ0FBQyxZQUFZLENBQUMsRUFBRSxvQkFBb0I7WUFDaEQsQ0FBQyxzQ0FBVyxDQUFDLFNBQVMsQ0FBQyxFQUFFLFNBQVM7WUFDbEMsQ0FBQyxzQ0FBVyxDQUFDLG9CQUFvQixDQUFDLEVBQUUsRUFBRTtTQUN2QyxDQUFDO1FBRUYsMkVBQTJFO1FBQzNFLE1BQU0sY0FBYyxHQUFHLGFBQUssQ0FBQyxxQkFBcUIsQ0FBQyxpQkFBaUIsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBRTNGLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7WUFDcEMsMkJBQVksQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzNFLDJCQUFZLENBQUMsZUFBZSxDQUFnQyxLQUFLLEVBQUUsd0RBQTZCLEVBQUUsK0JBQStCLENBQUMsQ0FBQztZQUNuSSxVQUFVLENBQUMsc0NBQVcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLCtEQUFxQixDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3RyxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQ0FBTSxDQUFDLGlCQUFpQixFQUFFLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQ2hGLE9BQU87UUFDVCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxrQkFBa0IsQ0FDdkIsU0FBaUIsRUFDakIsZ0JBQWtELEVBQ2xELHlDQUE2RjtRQUU3RixNQUFNLFVBQVUsR0FBRztZQUNqQixDQUFDLHNDQUFXLENBQUMsU0FBUyxDQUFDLEVBQUUsU0FBUztZQUNsQyxDQUFDLHNDQUFXLENBQUMsd0NBQXdDLENBQUMsRUFBRSx5Q0FBeUM7U0FDbEcsQ0FBQztRQUVGLHlDQUF5QyxDQUFDLE9BQU8sQ0FBQyxDQUFDLGVBQThELEVBQUUsRUFBRTtZQUNuSCwyQkFBWSxDQUFDLDRCQUE0QixDQUFDLGdCQUFnQixFQUFFLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQy9GLDJCQUFZLENBQUMsMERBQTBELENBQUMsZUFBZSxDQUFDLENBQUM7UUFDM0YsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsaUNBQU0sQ0FBQyxrQkFBa0IsRUFBRSxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQU8sQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUNqRixPQUFPO1FBQ1QsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUFqREQsMENBaURDOzs7Ozs7Ozs7Ozs7OztBQ3pERDs7O0dBR0c7QUFDSCxNQUFhLFlBQVk7SUFDdkIsWUFBMkIsVUFBcUI7UUFBckIsZUFBVSxHQUFWLFVBQVUsQ0FBVztJQUFHLENBQUM7SUFFcEQsSUFBVyxJQUFJO1FBQ2IsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQztJQUM5QixDQUFDO0lBRUQsSUFBVyxFQUFFO1FBQ1gsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRUQsSUFBVyxZQUFZO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUM7SUFDdEMsQ0FBQztJQUVELElBQVcsU0FBUztRQUNsQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDO0lBQ25DLENBQUM7Q0FDRjtBQWxCRCxvQ0FrQkM7Ozs7Ozs7Ozs7Ozs7O0FDdkJEOzs7OztHQUtHO0FBQ0gsTUFBYSxZQUFhLFNBQVEsS0FBSztJQUNyQyxZQUEyQixVQUErRCxFQUFFLE9BQWU7UUFDekcsS0FBSyxDQUFDLEdBQUcsVUFBVSxLQUFLLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFEVixlQUFVLEdBQVYsVUFBVSxDQUFxRDtRQUd4Riw2QkFBNkI7UUFDN0IsK0lBQStJO1FBQy9JLGlHQUFpRztRQUNqRyxpRkFBaUY7UUFDakYsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRCxJQUFXLFNBQVM7UUFDbEIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pCLENBQUM7Q0FDRjtBQWRELG9DQWNDOzs7Ozs7Ozs7Ozs7OztBQ3RCRCxzSkFBc0U7QUFDdEUseUlBQW9EO0FBRXBEOzs7R0FHRztBQUNILE1BQWEsZ0JBQWdCO0lBQ3BCLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxpQkFBNkMsRUFBRSxRQUFtQztRQUNySCxpRUFBaUU7UUFDakUsT0FBTyxJQUFJLHlCQUFTLENBQ2xCLGlCQUFpQixDQUFDLEtBQUssRUFDdkIsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsK0JBQStCLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxFQUNyRyxpQkFBaUIsQ0FBQyxjQUFjLEVBQ2hDLGlCQUFpQixDQUFDLFlBQVksRUFDOUIsaUJBQWlCLENBQUMsUUFBUSxDQUMzQixDQUFDO0lBQ0osQ0FBQztJQUVNLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxpQkFBNkM7UUFDN0UsZ0ZBQWdGO1FBQ2hGLE9BQU8sSUFBSSx5QkFBUyxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsaUJBQWlCLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDM0csQ0FBQztJQUVNLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxpQkFBNkMsRUFBRSxRQUFtQztRQUNqSCwwRUFBMEU7UUFDMUUsdUZBQXVGO1FBQ3ZGLGlEQUFpRDtRQUNqRCwwR0FBMEc7UUFDMUcsT0FBTyxJQUFJLHlCQUFTLENBQ2xCLGlCQUFpQixDQUFDLEtBQUssRUFDdkIsaUJBQWlCLENBQUMsS0FBSyxLQUFLLFNBQVM7WUFDbkMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLHlCQUF5QixDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxRQUFRLENBQUM7WUFDakcsQ0FBQyxDQUFDLFNBQVMsRUFDYixpQkFBaUIsQ0FBQyxjQUFjLENBQ2pDLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUE5QkQsNENBOEJDOzs7Ozs7Ozs7Ozs7OztBQ3JDRDs7Ozs7Ozs7R0FRRztBQUNILE1BQWEsUUFBUTtJQUtuQjs7T0FFRztJQUNIO1FBQ0UsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLE9BQU8sQ0FBVyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUN4RCxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQztZQUN4QixJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztRQUN4QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILElBQUksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxPQUFPLENBQUMsUUFBMEM7UUFDaEQsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDbEIsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxNQUFNLENBQUMsTUFBZ0I7UUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDakIsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN2QixDQUFDO0NBQ0Y7QUFwREQsNEJBb0RDO0FBRVksdUNBQStCLEdBQUcsS0FBSyxDQUFDOzs7Ozs7Ozs7Ozs7OztBQy9EckQsMkpBQStEO0FBQy9ELHdIQUErQztBQUUvQzs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFhLGFBQWE7SUFDeEIsWUFBMkIsU0FBa0QsRUFBVSxXQUE4QjtRQUExRixjQUFTLEdBQVQsU0FBUyxDQUF5QztRQUFVLGdCQUFXLEdBQVgsV0FBVyxDQUFtQjtJQUFHLENBQUM7SUFFbEgsT0FBTyxDQUFDLE9BQW9CLEVBQUUsaUJBQThCLFdBQVcsQ0FBQyxHQUFHO1FBQ2hGLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDMUMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQWlCLENBQUMsQ0FBQztTQUMxQztRQUVELElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxTQUFTLElBQUksY0FBYyxLQUFLLFdBQVcsQ0FBQyxHQUFHLEVBQUU7WUFDeEUsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO1NBQ3pCO1FBRUQsTUFBTSxJQUFJLDJCQUFZLENBQUMscUNBQVUsQ0FBQyxhQUFhLEVBQUUsK0JBQStCLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDN0YsQ0FBQztDQUNGO0FBZEQsc0NBY0M7QUFFRCxJQUFZLFdBR1g7QUFIRCxXQUFZLFdBQVc7SUFDckIsMEJBQVc7SUFDWCx3QkFBUztBQUNYLENBQUMsRUFIVyxXQUFXLEdBQVgsbUJBQVcsS0FBWCxtQkFBVyxRQUd0Qjs7Ozs7Ozs7Ozs7Ozs7QUNoQ0QsMkpBVTJDO0FBRTNDLHdIQUErQztBQUMvQyx3R0FBZ0M7QUFNaEM7Ozs7O0dBS0c7QUFDSCxNQUFhLFlBQVk7SUFDdkI7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxPQUFlO1FBQzdDLE9BQU8sSUFBSSwyQkFBWSxDQUFDLDJDQUFnQixDQUFDLGFBQWEsRUFBRSxHQUFHLE9BQU8sMkJBQTJCLENBQUMsQ0FBQztJQUNqRyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCw2QkFBNkI7SUFDdEIsTUFBTSxDQUFDLG1CQUFtQixDQUFDLGFBQWtCLEVBQUUsWUFBb0I7UUFDeEUsSUFBSSxhQUFhLEtBQUssSUFBSSxJQUFJLGFBQWEsS0FBSyxTQUFTLEVBQUU7WUFDekQsTUFBTSxJQUFJLDJCQUFZLENBQUMsMkNBQWdCLENBQUMsYUFBYSxFQUFFLEdBQUcsYUFBYSwwQkFBMEIsWUFBWSxFQUFFLENBQUMsQ0FBQztTQUNsSDtJQUNILENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILDZCQUE2QjtJQUN0QixNQUFNLENBQUMsZUFBZSxDQUFDLGFBQWtCLEVBQUUsWUFBb0I7UUFDcEUsSUFBSSxhQUFhLEtBQUssSUFBSSxJQUFJLGFBQWEsS0FBSyxTQUFTLEVBQUU7WUFDekQsTUFBTSxJQUFJLDJCQUFZLENBQUMsMkNBQWdCLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxhQUFhLG9DQUFvQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1NBQy9IO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCw2QkFBNkI7SUFDdEIsTUFBTSxDQUFDLG1CQUFtQixDQUFDLGFBQWtCLEVBQUUsWUFBb0IsRUFBRSxZQUFvQjtRQUM5RixJQUFJLE9BQU8sYUFBYSxLQUFLLFlBQVksRUFBRTtZQUN6QyxNQUFNLElBQUksMkJBQVksQ0FBQywyQ0FBZ0IsQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLGFBQWEsb0NBQW9DLFlBQVksR0FBRyxDQUFDLENBQUM7U0FDaEk7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCw2QkFBNkI7SUFDdEIsTUFBTSxDQUFDLHFCQUFxQixDQUFDLGFBQXFCLEVBQUUsWUFBb0I7UUFDN0UsSUFBSSxhQUFhLEtBQUssSUFBSSxJQUFJLGFBQWEsS0FBSyxTQUFTLElBQUksYUFBYSxLQUFLLEVBQUUsRUFBRTtZQUNqRixNQUFNLElBQUksMkJBQVksQ0FBQywyQ0FBZ0IsQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLGFBQWEsbUNBQW1DLFlBQVksRUFBRSxDQUFDLENBQUM7U0FDOUg7SUFDSCxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCw2QkFBNkI7SUFDdEIsTUFBTSxDQUFDLGdCQUFnQixDQUE0QixTQUFtQixFQUFFLFFBQWE7UUFDMUYsSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDeEMsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssU0FBUyxDQUFDLFFBQVEsRUFBRSxFQUFFO2dCQUM5QyxPQUFPLEdBQUcsSUFBSSxDQUFDO2FBQ2hCO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNILDZCQUE2QjtJQUN0QixNQUFNLENBQUMsZUFBZSxDQUE0QixTQUFtQixFQUFFLFFBQWEsRUFBRSxRQUFnQjtRQUMzRyxJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsRUFBRTtZQUN2RCxNQUFNLElBQUksMkJBQVksQ0FBQywyQ0FBZ0IsQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLFNBQVMsK0JBQStCLFFBQVEsR0FBRyxDQUFDLENBQUM7U0FDbkg7SUFDSCxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSSxNQUFNLENBQUMsV0FBVyxDQUFDLEtBQWEsRUFBRSxHQUFXLEVBQUUsR0FBVztRQUMvRCxJQUFJLE9BQU8sR0FBRyxHQUFHLElBQUksS0FBSyxJQUFJLEtBQUssR0FBRyxHQUFHLENBQUM7UUFFMUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNaLE1BQU0sSUFBSSwyQkFBWSxDQUFDLDJDQUFnQixDQUFDLGdCQUFnQixFQUFFLEdBQUcsS0FBSyxpQ0FBaUMsR0FBRyxLQUFLLEdBQUcsR0FBRyxDQUFDLENBQUM7U0FDcEg7SUFDSCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksTUFBTSxDQUFDLG9CQUFvQixDQUFDLEdBQThCLEVBQUUsR0FBOEI7UUFDL0YsTUFBTSxZQUFZLEdBQUcsR0FBRyxLQUFLLFNBQVMsQ0FBQztRQUN2QyxNQUFNLFlBQVksR0FBRyxHQUFHLEtBQUssU0FBUyxDQUFDO1FBRXZDLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDbEMsTUFBTSxJQUFJLDJCQUFZLENBQUMsMkNBQWdCLENBQUMsZ0JBQWdCLEVBQUUseUVBQXlFLENBQUMsQ0FBQztTQUN0STtRQUVELElBQUksWUFBWSxJQUFJLENBQUMsYUFBSyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDdEUsTUFBTSxJQUFJLDJCQUFZLENBQ3BCLDJDQUFnQixDQUFDLGdCQUFnQixFQUNqQyxxRkFBcUYsQ0FDdEYsQ0FBQztTQUNIO1FBRUQsSUFBSSxZQUFZLElBQUksQ0FBQyxhQUFLLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUN0RSxNQUFNLElBQUksMkJBQVksQ0FDcEIsMkNBQWdCLENBQUMsZ0JBQWdCLEVBQ2pDLHFGQUFxRixDQUN0RixDQUFDO1NBQ0g7UUFFRCxJQUFJLFlBQVksSUFBSSxZQUFZLElBQUksT0FBTyxHQUFHLEtBQUssT0FBTyxHQUFHLEVBQUU7WUFDN0QsTUFBTSxJQUFJLDJCQUFZLENBQ3BCLDJDQUFnQixDQUFDLGdCQUFnQixFQUNqQyxvRkFBb0YsQ0FDckYsQ0FBQztTQUNIO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBa0QsRUFBRSxNQUFjO1FBQ2hHLElBQUksZ0JBQWdCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ2hDLE9BQU87U0FDUjtRQUVELE1BQU0sSUFBSSwyQkFBWSxDQUNwQiwyQ0FBZ0IsQ0FBQyxnQkFBZ0IsRUFDakMsd0RBQXdELE1BQU0sK0JBQStCLENBQzlGLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksTUFBTSxDQUFDLDRCQUE0QixDQUFDLGdCQUFrRCxFQUFFLE1BQWM7UUFDM0csSUFBSSxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksZ0JBQWdCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBRSxDQUFDLFVBQVUsRUFBRTtZQUM1RSxPQUFPO1NBQ1I7UUFFRCxNQUFNLElBQUksMkJBQVksQ0FDcEIsMkNBQWdCLENBQUMsZ0JBQWdCLEVBQ2pDLHdEQUF3RCxNQUFNLHNEQUFzRCxDQUNySCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksTUFBTSxDQUFDLDBEQUEwRCxDQUN0RSxvQ0FBMEU7UUFFMUUsSUFBSSxvQ0FBb0MsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLG9DQUFvQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDckcsTUFBTSxJQUFJLDJCQUFZLENBQ3BCLDJDQUFnQixDQUFDLGdCQUFnQixFQUNqQywwREFBMEQsb0NBQW9DLENBQUMsaUJBQWlCLEdBQUc7Z0JBQ2pILCtDQUErQyxDQUNsRCxDQUFDO1NBQ0g7SUFDSCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksTUFBTSxDQUFDLGVBQWUsQ0FBQyxvQkFBbUMsRUFBRSxTQUFpQjtRQUNsRixJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQzdDLE1BQU0sSUFBSSwyQkFBWSxDQUNwQiwyQ0FBZ0IsQ0FBQyxxQkFBcUIsRUFDdEMsd0VBQXdFLENBQ3pFLENBQUM7U0FDSDtJQUNILENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxPQUEwQjtRQUM5RCxJQUNFLENBQUMsQ0FBQyxhQUFLLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsYUFBSyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDN0YsQ0FBQyxDQUFDLGFBQUssQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUM7WUFFeEcsTUFBTSxJQUFJLDJCQUFZLENBQUMsMkNBQWdCLENBQUMsZ0JBQWdCLEVBQUUscURBQXFELENBQUMsQ0FBQztJQUNySCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNJLE1BQU0sQ0FBQyw0QkFBNEIsQ0FBQyxVQUF5QixFQUFFLGVBQW1EO1FBQ3ZILElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQztZQUFFLE1BQU0sSUFBSSwyQkFBWSxDQUFDLDJDQUFnQixDQUFDLGdCQUFnQixFQUFFLHVDQUF1QyxDQUFDLENBQUM7UUFDbkksSUFBSSxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxNQUFNLElBQUksMkJBQVksQ0FBQywyQ0FBZ0IsQ0FBQyxhQUFhLEVBQUUsZ0NBQWdDLENBQUMsQ0FBQztRQUV0SCxNQUFNLHFCQUFxQixHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFpQixFQUFFLEVBQUUsQ0FDbkUsZUFBZSxDQUFDLGlDQUFpQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FDdEUsQ0FBQztRQUNGLElBQUkscUJBQXFCLEVBQUU7WUFDekIsT0FBTztTQUNSO1FBQ0QsTUFBTSxvQkFBb0IsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBaUIsRUFBRSxFQUFFLENBQ2xFLGVBQWUsQ0FBQyxnQ0FBZ0MsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQ3JFLENBQUM7UUFDRixJQUFJLG9CQUFvQixFQUFFO1lBQ3hCLE9BQU87U0FDUjtRQUNELE1BQU0sY0FBYyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxlQUFlLENBQUMsZ0JBQWdCLENBQUM7UUFDckcsSUFBSSxjQUFjLEVBQUU7WUFDbEIsT0FBTztTQUNSO1FBRUQsNEdBQTRHO1FBQzVHLDRIQUE0SDtRQUM1SCxNQUFNLElBQUksMkJBQVksQ0FDcEIsMkNBQWdCLENBQUMscUJBQXFCLEVBQ3RDLDRKQUE0SixDQUM3SixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksTUFBTSxDQUFDLHNCQUFzQixDQUFDLE9BQWlDO1FBQ3BFLElBQUk7WUFDRixJQUFJLENBQUMsZUFBZSxDQUFtQixPQUFPLENBQUMsV0FBVyxFQUFFLDJDQUFnQixFQUFFLGtCQUFrQixDQUFDLENBQUM7WUFDbEcsSUFBSSxDQUFDLGVBQWUsQ0FBZ0IsT0FBTyxDQUFDLFFBQVEsRUFBRSx3Q0FBYSxFQUFFLGVBQWUsQ0FBQyxDQUFDO1lBQ3RGLElBQUksQ0FBQyxlQUFlLENBQWUsT0FBTyxDQUFDLE9BQU8sRUFBRSx1Q0FBWSxFQUFFLGNBQWMsQ0FBQyxDQUFDO1NBQ25GO1FBQUMsV0FBTTtZQUNOLE1BQU0sSUFBSSwyQkFBWSxDQUFDLDJDQUFnQixDQUFDLGdCQUFnQixFQUFFLG9EQUFvRCxDQUFDLENBQUM7U0FDakg7SUFDSCxDQUFDO0NBQ0Y7QUFyU0Qsb0NBcVNDOzs7Ozs7Ozs7Ozs7OztBQzlURCxnS0FTMkM7QUFDM0MsMkpBTzJDO0FBQzNDLHdIQUErQztBQUUvQzs7OztHQUlHO0FBQ0gsTUFBYSxhQUFhO0lBdUJ4Qjs7Ozs7Ozs7T0FRRztJQUNJLE1BQU0sQ0FBQyw4QkFBOEIsQ0FDMUMsd0JBQWtELEVBQ2xELHdCQUFrRCxFQUNsRCxVQUF5QjtRQUV6Qix3QkFBd0IsQ0FBQyxZQUFZLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RELElBQUksQ0FBQyx5QkFBeUIsQ0FBQyx3QkFBd0IsRUFBRSx3QkFBd0IsQ0FBQyxDQUFDO1FBQ25GLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyx3QkFBd0IsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNJLE1BQU0sQ0FBQyx5QkFBeUIsQ0FDckMsd0JBQWtELEVBQ2xELHdCQUFrRDtRQUVsRCxNQUFNLG1CQUFtQixHQUFHLHdCQUF3QixDQUFDLG1CQUFtQixDQUFDO1FBRXpFLHdFQUF3RTtRQUN4RSxtQkFBbUIsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQztRQUN4RSxtQkFBbUIsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFVBQVUsQ0FBQztRQUV0RSw2REFBNkQ7UUFDN0QsUUFBUSx3QkFBd0IsQ0FBQyxXQUFXLEVBQUU7WUFDNUMsS0FBSywyQ0FBZ0IsQ0FBQyxTQUFTO2dCQUM3QixtQkFBbUIsQ0FBQyxxQkFBcUIsR0FBRywwQ0FBZSxDQUFDLFNBQVMsQ0FBQztnQkFDdEUsTUFBTTtZQUNSLEtBQUssMkNBQWdCLENBQUMsUUFBUTtnQkFDNUIsbUJBQW1CLENBQUMscUJBQXFCLEdBQUcsMENBQWUsQ0FBQyxRQUFRLENBQUM7Z0JBQ3JFLE1BQU07WUFDUjtnQkFDRSxNQUFNLElBQUksMkJBQVksQ0FBQywyQ0FBZ0IsQ0FBQyxhQUFhLEVBQUUseUNBQXlDLENBQUMsQ0FBQztTQUNyRztRQUVELDBEQUEwRDtRQUMxRCxRQUFRLHdCQUF3QixDQUFDLFFBQVEsRUFBRTtZQUN6QyxLQUFLLHdDQUFhLENBQUMsRUFBRTtnQkFDbkIsbUJBQW1CLENBQUMsY0FBYyxHQUFHLHlDQUFjLENBQUMsRUFBRSxDQUFDO2dCQUN2RCxNQUFNO1lBQ1IsS0FBSyx3Q0FBYSxDQUFDLEVBQUU7Z0JBQ25CLG1CQUFtQixDQUFDLGNBQWMsR0FBRyx5Q0FBYyxDQUFDLEVBQUUsQ0FBQztnQkFDdkQsTUFBTTtZQUNSLEtBQUssd0NBQWEsQ0FBQyxFQUFFO2dCQUNuQixtQkFBbUIsQ0FBQyxjQUFjLEdBQUcseUNBQWMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZELE1BQU07WUFDUixLQUFLLHdDQUFhLENBQUMsRUFBRTtnQkFDbkIsbUJBQW1CLENBQUMsY0FBYyxHQUFHLHlDQUFjLENBQUMsRUFBRSxDQUFDO2dCQUN2RCxNQUFNO1lBQ1IsS0FBSyx3Q0FBYSxDQUFDLEVBQUU7Z0JBQ25CLG1CQUFtQixDQUFDLGNBQWMsR0FBRyx5Q0FBYyxDQUFDLEVBQUUsQ0FBQztnQkFDdkQsTUFBTTtZQUNSLEtBQUssd0NBQWEsQ0FBQyxTQUFTO2dCQUMxQixtQkFBbUIsQ0FBQyxjQUFjLEdBQUcseUNBQWMsQ0FBQyxTQUFTLENBQUM7Z0JBQzlELE1BQU07WUFDUixLQUFLLHdDQUFhLENBQUMsS0FBSztnQkFDdEIsbUJBQW1CLENBQUMsY0FBYyxHQUFHLHlDQUFjLENBQUMsS0FBSyxDQUFDO2dCQUMxRCxNQUFNO1lBQ1IsS0FBSyx3Q0FBYSxDQUFDLE1BQU07Z0JBQ3ZCLG1CQUFtQixDQUFDLGNBQWMsR0FBRyx5Q0FBYyxDQUFDLE1BQU0sQ0FBQztnQkFDM0QsTUFBTTtZQUNSLEtBQUssd0NBQWEsQ0FBQyxLQUFLO2dCQUN0QixtQkFBbUIsQ0FBQyxjQUFjLEdBQUcseUNBQWMsQ0FBQyxLQUFLLENBQUM7Z0JBQzFELE1BQU07WUFDUixLQUFLLHdDQUFhLENBQUMsTUFBTTtnQkFDdkIsbUJBQW1CLENBQUMsY0FBYyxHQUFHLHlDQUFjLENBQUMsTUFBTSxDQUFDO2dCQUMzRCxNQUFNO1lBQ1IsS0FBSyx3Q0FBYSxDQUFDLElBQUk7Z0JBQ3JCLG1CQUFtQixDQUFDLGNBQWMsR0FBRyx5Q0FBYyxDQUFDLElBQUksQ0FBQztnQkFDekQsTUFBTTtZQUNSLEtBQUssd0NBQWEsQ0FBQyxNQUFNO2dCQUN2QixtQkFBbUIsQ0FBQyxjQUFjLEdBQUcseUNBQWMsQ0FBQyxNQUFNLENBQUM7Z0JBQzNELE1BQU07WUFDUixLQUFLLHdDQUFhLENBQUMsU0FBUztnQkFDMUIsbUJBQW1CLENBQUMsY0FBYyxHQUFHLHlDQUFjLENBQUMsU0FBUyxDQUFDO2dCQUM5RCxNQUFNO1lBQ1IsS0FBSyx3Q0FBYSxDQUFDLE9BQU87Z0JBQ3hCLG1CQUFtQixDQUFDLGNBQWMsR0FBRyx5Q0FBYyxDQUFDLE9BQU8sQ0FBQztnQkFDNUQsTUFBTTtZQUNSLEtBQUssd0NBQWEsQ0FBQyxXQUFXO2dCQUM1QixtQkFBbUIsQ0FBQyxjQUFjLEdBQUcseUNBQWMsQ0FBQyxXQUFXLENBQUM7Z0JBQ2hFLE1BQU07WUFDUjtnQkFDRSxNQUFNLElBQUksMkJBQVksQ0FBQywyQ0FBZ0IsQ0FBQyxhQUFhLEVBQUUsc0NBQXNDLENBQUMsQ0FBQztTQUNsRztRQUVELHlEQUF5RDtRQUN6RCxRQUFRLHdCQUF3QixDQUFDLE9BQU8sRUFBRTtZQUN4QyxLQUFLLHVDQUFZLENBQUMsZUFBZTtnQkFDL0IsSUFBSSxDQUFDLG9CQUFvQixDQUFDLG1CQUFtQixFQUFFLG1DQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3BFLE1BQU07WUFDUixLQUFLLHVDQUFZLENBQUMsZUFBZTtnQkFDL0IsSUFBSSxDQUFDLG9CQUFvQixDQUFDLG1CQUFtQixFQUFFLG1DQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3BFLE1BQU07WUFDUixLQUFLLHVDQUFZLENBQUMsZ0JBQWdCO2dCQUNoQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsbUJBQW1CLEVBQUUsbUNBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDcEUsTUFBTTtZQUNSLEtBQUssdUNBQVksQ0FBQyxnQkFBZ0I7Z0JBQ2hDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxtQkFBbUIsRUFBRSxtQ0FBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUNwRSxNQUFNO1lBQ1IsS0FBSyx1Q0FBWSxDQUFDLFNBQVM7Z0JBQ3pCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxtQkFBbUIsRUFBRSw0Q0FBaUIsQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDL0UsTUFBTTtZQUNSLEtBQUssdUNBQVksQ0FBQyxPQUFPO2dCQUN2QixJQUFJLENBQUMsb0JBQW9CLENBQUMsbUJBQW1CLEVBQUUsNENBQWlCLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQzlFLE1BQU07WUFDUixLQUFLLHVDQUFZLENBQUMsT0FBTztnQkFDdkIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLG1CQUFtQixFQUFFLDRDQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUM5RSxNQUFNO1lBQ1IsS0FBSyx1Q0FBWSxDQUFDLE1BQU07Z0JBQ3RCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxtQkFBbUIsRUFBRSw0Q0FBaUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDN0UsTUFBTTtZQUNSLEtBQUssdUNBQVksQ0FBQyxPQUFPO2dCQUN2QixJQUFJLENBQUMsb0JBQW9CLENBQUMsbUJBQW1CLEVBQUUsNENBQWlCLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQzlFLE1BQU07WUFDUixLQUFLLHVDQUFZLENBQUMsTUFBTTtnQkFDdEIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLG1CQUFtQixFQUFFLDRDQUFpQixDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUM3RSxNQUFNO1lBQ1IsS0FBSyx1Q0FBWSxDQUFDLE1BQU07Z0JBQ3RCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxtQkFBbUIsRUFBRSw0Q0FBaUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDN0UsTUFBTTtZQUNSLEtBQUssdUNBQVksQ0FBQyxNQUFNO2dCQUN0QixJQUFJLENBQUMsb0JBQW9CLENBQUMsbUJBQW1CLEVBQUUsNENBQWlCLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQzdFLE1BQU07WUFDUixLQUFLLHVDQUFZLENBQUMsTUFBTTtnQkFDdEIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLG1CQUFtQixFQUFFLDRDQUFpQixDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUM3RSxNQUFNO1lBQ1IsS0FBSyx1Q0FBWSxDQUFDLE1BQU07Z0JBQ3RCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxtQkFBbUIsRUFBRSw0Q0FBaUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDN0UsTUFBTTtZQUNSO2dCQUNFLE1BQU0sSUFBSSwyQkFBWSxDQUFDLDJDQUFnQixDQUFDLGFBQWEsRUFBRSxxQ0FBcUMsQ0FBQyxDQUFDO1NBQ2pHO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSSxNQUFNLENBQUMsa0JBQWtCLENBQUMsd0JBQWtELEVBQUUsVUFBeUI7UUFDNUcsTUFBTSxFQUFFLG1CQUFtQixFQUFFLFlBQVksRUFBRSxHQUFHLHdCQUF3QixDQUFDO1FBQ3ZFLHdHQUF3RztRQUN4RyxLQUFLLE1BQU0sV0FBVyxJQUFJLFlBQVksRUFBRTtZQUN0QyxXQUFXLENBQUMsbUJBQW1CLEdBQUcsbUJBQW1CLENBQUM7WUFDdEQsV0FBVyxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNqRTtJQUNILENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksTUFBTSxDQUFDLG9CQUFvQixDQUFDLG1CQUF3QyxFQUFFLGdCQUFrQztRQUM3RyxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxnQkFBZ0IsRUFBRSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztRQUV4RyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3RELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFFMUQsSUFBSSxRQUFRLEVBQUU7WUFDWixDQUFDLGlCQUFpQixFQUFFLGVBQWUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUN2RixhQUFhLEdBQUcsb0NBQVMsQ0FBQyxhQUFhLENBQUM7U0FDekM7YUFBTSxJQUFJLFlBQVksRUFBRTtZQUN2QixDQUFDLGdCQUFnQixDQUFDLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ3pFLGFBQWEsR0FBRyxvQ0FBUyxDQUFDLGVBQWUsQ0FBQztTQUMzQztRQUVELDRGQUE0RjtRQUM1RixtQkFBbUIsQ0FBQyxpQkFBaUIsR0FBRyxpQkFBaUIsQ0FBQztRQUMxRCxtQkFBbUIsQ0FBQyxlQUFlLEdBQUcsZUFBZSxDQUFDO1FBQ3RELG1CQUFtQixDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7UUFDbEQsbUJBQW1CLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUM7SUFDMUQsQ0FBQzs7QUF4Tkgsc0NBNE5DO0FBM05lLGdDQUFrQixHQUFzQjtJQUNwRCxhQUFhLEVBQUUsS0FBSztJQUNwQixvQkFBb0IsRUFBRSxFQUFFO0NBQ3pCLENBQUM7QUFFWSwrQkFBaUIsR0FBNkI7SUFDMUQsT0FBTyxFQUFFLHVDQUFZLENBQUMsU0FBUztJQUMvQixRQUFRLEVBQUUsd0NBQWEsQ0FBQyxNQUFNO0lBQzlCLFdBQVcsRUFBRSwyQ0FBZ0IsQ0FBQyxRQUFRO0NBQ3ZDLENBQUM7QUFFYSxrQ0FBb0IsR0FBd0I7SUFDekQsV0FBVyxFQUFFLENBQUM7SUFDZCxVQUFVLEVBQUUsQ0FBQztJQUNiLGlCQUFpQixFQUFFLENBQUM7SUFDcEIsZUFBZSxFQUFFLENBQUM7SUFDbEIscUJBQXFCLEVBQUUsMENBQWUsQ0FBQyxRQUFRO0lBQy9DLGFBQWEsRUFBRSxvQ0FBUyxDQUFDLFNBQVM7SUFDbEMsZ0JBQWdCLEVBQUUsR0FBRztJQUNyQixjQUFjLEVBQUUseUNBQWMsQ0FBQyxNQUFNO0NBQ3RDLENBQUM7QUFxTWEsc0JBQVEsR0FBRyxJQUFJLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0FBQzlDLHNCQUFRLEdBQUcsSUFBSSxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7O0FDcFB0RCwySkFBK0Q7QUFDL0Qsd0hBQStDO0FBQy9DLDZIQUE4QztBQUU5QyxNQUFhLEtBQUs7SUFDaEI7OztPQUdHO0lBQ0ksTUFBTSxDQUFDLHdCQUF3QixDQUFDLElBQVU7UUFDL0MsTUFBTSxJQUFJLEdBQVcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQzNDLE1BQU0sS0FBSyxHQUFXLElBQUksQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDN0MsTUFBTSxHQUFHLEdBQVcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3RDLE1BQU0sRUFBRSxHQUFXLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN0QyxNQUFNLEVBQUUsR0FBVyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDeEMsTUFBTSxHQUFHLEdBQVcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3pDLE9BQU8sR0FBRyxJQUFJLElBQUksS0FBSyxJQUFJLEdBQUcsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ3RELENBQUM7SUFFTSxNQUFNLENBQUMsMkJBQTJCLENBQUMsSUFBYTtRQUNyRCxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7SUFDakMsQ0FBQztJQUVNLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxHQUFXO1FBQ2xELE9BQU8sR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxxQ0FBcUM7SUFDOUIsTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFVO1FBQ25DLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssWUFBWSxNQUFNLENBQUM7SUFDOUQsQ0FBQztJQUVEOztPQUVHO0lBQ0gscUNBQXFDO0lBQzlCLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBVTtRQUNqQyxPQUFPLEtBQUssWUFBWSxJQUFJLENBQUM7SUFDL0IsQ0FBQztJQUVELHFDQUFxQztJQUM5QixNQUFNLENBQUMsWUFBWSxDQUFDLEtBQVU7UUFDbkMsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxZQUFZLE1BQU0sQ0FBQztJQUM5RCxDQUFDO0lBRUQscUNBQXFDO0lBQzlCLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBVTtRQUNqQyxPQUFPLE9BQU8sS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLFlBQVksT0FBTyxDQUFDO0lBQ2hFLENBQUM7SUFFRDs7T0FFRztJQUNILHFDQUFxQztJQUM5QixNQUFNLENBQUMsaUJBQWlCLENBQUMsS0FBVTtRQUN4QyxPQUFPLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLFNBQVMsQ0FBQztJQUMvQyxDQUFDO0lBRUQscUNBQXFDO0lBQzlCLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxLQUFVO1FBQzlDLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUM3QixPQUFPLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxLQUFlLENBQUMsQ0FBQztTQUMxRDthQUFNLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNsQyxPQUFPLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxLQUFhLENBQUMsQ0FBQztTQUN0RDthQUFNLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNsQyxPQUFPLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxLQUFnQixDQUFDLENBQUM7U0FDNUQ7YUFBTSxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDcEMsT0FBTyxLQUFLLENBQUM7U0FDZDthQUFNO1lBQ0wsTUFBTSxJQUFJLDJCQUFZLENBQUMscUNBQVUsQ0FBQyxhQUFhLEVBQUUsaUNBQWlDLEtBQUssRUFBRSxDQUFDLENBQUM7U0FDNUY7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGtDQUFrQztJQUMzQixNQUFNLENBQUMscUJBQXFCLENBQUMsS0FBYSxFQUFFLFNBQWlCO1FBQ2xFLDJCQUFZLENBQUMsbUJBQW1CLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUM3RCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDeEIsTUFBTSxJQUFJLDJCQUFZLENBQUMscUNBQVUsQ0FBQyxnQkFBZ0IsRUFBRSxnQ0FBZ0MsU0FBUyxHQUFHLENBQUMsQ0FBQztTQUNuRztRQUVELE9BQU8sS0FBSyxZQUFZLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVELHFDQUFxQztJQUM5QixNQUFNLENBQUMsY0FBYyxDQUFDLEtBQVU7UUFDckMsSUFBSSxLQUFLLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDbEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQztTQUMzQjtRQUVELElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUM3QixPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQWUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7U0FDbkQ7UUFFRCxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDckMsSUFBSSxXQUFXLEtBQUssS0FBSyxFQUFFO1lBQ3pCLHNFQUFzRTtZQUN0RSxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7U0FDdkM7UUFFRCxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDdkMsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDakIsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQztTQUMzQjtRQUVELE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDO0lBQ25DLENBQUM7Q0FDRjtBQTlHRCxzQkE4R0M7Ozs7Ozs7Ozs7Ozs7O0FDbEhELHlJQUE4RDtBQUM5RCxnS0FBeUY7QUFDekYsd0hBQStDO0FBRS9DLE1BQWEsVUFBVTtJQUNyQiw2REFBNkQ7SUFDdEQsTUFBTSxDQUFDLCtCQUErQixDQUFDLGNBQThCO1FBQzFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsR0FBRyxjQUFjLENBQUM7UUFFcEUsSUFBSSxTQUFTLEtBQUssQ0FBQyxJQUFJLFFBQVEsS0FBSyxDQUFDLEVBQUU7WUFDckMsSUFBSSxTQUFTLEtBQUssQ0FBQyxJQUFJLFFBQVEsS0FBSyxDQUFDLEVBQUU7Z0JBQ3JDLE9BQU87b0JBQ0wsUUFBUSxFQUFFLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTO2lCQUMvQyxDQUFDO2FBQ0g7WUFFRCxPQUFPO2dCQUNMLFFBQVEsRUFBRSxRQUFRLENBQUMsaUJBQWlCLENBQUMsTUFBTTtnQkFDM0MsT0FBTyxFQUFFLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFO2FBQ2hELENBQUM7U0FDSDtRQUVELElBQUksU0FBUyxLQUFLLENBQUMsSUFBSSxRQUFRLEtBQUssQ0FBQyxFQUFFO1lBQ3JDLE9BQU87Z0JBQ0wsUUFBUSxFQUFFLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPO2dCQUM1QyxPQUFPLEVBQUUsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUU7YUFDaEQsQ0FBQztTQUNIO1FBRUQsSUFBSSxTQUFTLEtBQUssU0FBUyxJQUFJLFFBQVEsS0FBSyxRQUFRLElBQUksUUFBUSxHQUFHLENBQUMsRUFBRTtZQUNwRSxPQUFPO2dCQUNMLFFBQVEsRUFBRSxRQUFRLENBQUMsaUJBQWlCLENBQUMsT0FBTztnQkFDNUMsT0FBTyxFQUFFLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFO2dCQUMvQyxPQUFPLEVBQUUsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUU7YUFDaEQsQ0FBQztTQUNIO1FBRUQsK0JBQStCO1FBQy9CLE1BQU0sV0FBVyxHQUFHLFFBQVEsS0FBSyxDQUFDLElBQUksUUFBUSxLQUFLLENBQUMsQ0FBQztRQUVyRCxPQUFPO1lBQ0wsUUFBUSxFQUFFLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLO1lBQzFDLE9BQU8sRUFBRSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRTtZQUMvQyxPQUFPLEVBQUUsRUFBRSxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFO1NBQzNFLENBQUM7SUFDSixDQUFDO0lBRU0sTUFBTSxDQUFDLG1CQUFtQjtRQUMvQixJQUFJLFFBQVEsR0FBRyxRQUFRLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDO1FBQ3BELElBQUksT0FBTyxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDdEMsSUFBSSxPQUFPLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUN0QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0lBRU0sTUFBTSxDQUFDLDJCQUEyQixDQUFDLElBQVksRUFBRSxVQUE0QjtRQUNsRixNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDO1FBQ2xFLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFTSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsaUJBQTRCO1FBQ3pELElBQUksU0FBNkIsQ0FBQztRQUNsQyxRQUFRLGlCQUFpQixFQUFFO1lBQ3pCLEtBQUssb0NBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDeEIsU0FBUyxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDO2dCQUN6QyxNQUFNO2FBQ1A7WUFDRCxLQUFLLG9DQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ3hCLFNBQVMsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQztnQkFDekMsTUFBTTthQUNQO1lBQ0QsS0FBSyxvQ0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNwQixTQUFTLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUM7Z0JBQ3JDLE1BQU07YUFDUDtZQUNELE9BQU8sQ0FBQyxDQUFDO2dCQUNQLE1BQU0sSUFBSSwyQkFBWSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsbUJBQW1CLENBQUMsQ0FBQzthQUNwRjtTQUNGO1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVNLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxVQUE4QztRQUMzRSxPQUE0QixVQUFXLENBQUMsUUFBUSxLQUFLLFNBQVMsQ0FBQztJQUNqRSxDQUFDO0NBQ0Y7QUFoRkQsZ0NBZ0ZDOzs7Ozs7Ozs7Ozs7OztBQ3BGRCx5SUFBOEQ7QUFDOUQsd0hBQStDO0FBQy9DLGlIQUF1RTtBQUV2RTs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBYSxrQkFBa0I7SUFHN0IsWUFBb0IseUJBQXlCLDBDQUErQjtRQUF4RCwyQkFBc0IsR0FBdEIsc0JBQXNCLENBQWtDO0lBQUcsQ0FBQztJQUV6RSwwQkFBMEI7UUFDL0IsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2xCLE1BQU0sSUFBSSwyQkFBWSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsRUFBRSw2REFBNkQsQ0FBQyxDQUFDO1NBQ3BJO1FBQ0QsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLG1CQUFRLEVBQUUsQ0FBQztRQUVoQyxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDaEMsTUFBTSxLQUFLLEdBQUcsSUFBSSwyQkFBWSxDQUM1QixRQUFRLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUNqQyw2QkFBNkIsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksVUFBVSxDQUMxRSxDQUFDO1lBQ0YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQixDQUFDLEVBQUUsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFFaEMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQztJQUNoQyxDQUFDO0lBRU0sT0FBTyxDQUFDLFFBQTBDO1FBQ3ZELElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNsQixZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzlCLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2pDLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1NBQzVCO0lBQ0gsQ0FBQztJQUVNLE1BQU0sQ0FBQyxLQUFVO1FBQ3RCLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNsQixZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzlCLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzdCLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1NBQzVCO0lBQ0gsQ0FBQztDQUNGO0FBckNELGdEQXFDQzs7Ozs7Ozs7Ozs7Ozs7QUN2REQsMkpBQStEO0FBQy9ELHVIQUE4QztBQUc5Qzs7O0dBR0c7QUFDSCxNQUFhLGFBQWE7SUFPeEIsOERBQThEO0lBQzlELDRDQUE0QztJQUM1QyxZQUFtQixhQUFxQixFQUFFLE9BQWdCO1FBQ3hELE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdDLGFBQWEsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFM0IsTUFBTSxLQUFLLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNuRSxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3RCLE1BQU0sSUFBSSwyQkFBWSxDQUFDLHFDQUFVLENBQUMsYUFBYSxFQUFFLDJCQUEyQixhQUFhLEVBQUUsQ0FBQyxDQUFDO1NBQzlGO1FBRUQsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEIsSUFBSSxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7SUFDekIsQ0FBQztJQUVPLGNBQWMsQ0FBQyxnQkFBd0I7UUFDN0MsTUFBTSxhQUFhLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDekIsSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQ3JCLE9BQU8sYUFBYSxDQUFDO1NBQ3RCO1FBRUQsbUdBQW1HO1FBQ25HLE1BQU0sT0FBTyxHQUFHLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM1QyxPQUFPLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDO0lBQy9ELENBQUM7SUFFRCxJQUFXLGNBQWM7UUFDdkIsT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDbkQsQ0FBQztJQUVELElBQVcsa0JBQWtCO1FBQzNCLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEdBQUcsUUFBUSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDckUsQ0FBQztDQUNGO0FBM0NELHNDQTJDQzs7Ozs7Ozs7Ozs7Ozs7QUNuREQsZ0tBWTJDO0FBRTNDOzs7Ozs7R0FNRztBQUNILE1BQWEsOEJBQThCO0lBSXpDOzs7Ozs7Ozs7Ozs7T0FZRztJQUNILFlBQTJCLHNCQUE2QyxFQUFFLHFCQUFvQztRQUFuRiwyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXVCO1FBQ3RFLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxtRUFBd0MsQ0FBQyxvREFBeUIsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO1FBRXBILElBQUksQ0FBQyxxQkFBcUIsR0FBRyxFQUFFLENBQUM7UUFDaEMsc0JBQXNCLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxZQUEwQixFQUFRLEVBQUU7WUFDdEYsSUFBSSxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtnQkFDM0MsT0FBTzthQUNSO1lBQ0QsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsbUJBQW1CLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDdEYsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO2dCQUM3QyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUNoQyxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxlQUE4QjtRQUNoRSxrRkFBa0Y7UUFDbEYsT0FBTywwQ0FBZSxDQUFDLGVBQWUsRUFBRSxvREFBeUIsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFFTSxPQUFPLENBQUMsSUFBWSxFQUFFLFVBQTZCO1FBQ3hELElBQUk7WUFDRixNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDMUYsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtnQkFDckgsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7Z0JBQ2hHLE9BQU8sZUFBZSxDQUFDO1lBQ3pCLENBQUMsQ0FBQyxDQUFDO1NBQ0o7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNWLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUMxQjtJQUNILENBQUM7SUFFTSwyQkFBMkIsQ0FBQyxPQUE0QjtRQUM3RCxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFTSw2QkFBNkIsQ0FBQyxPQUE0QjtRQUMvRCxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7Q0FDRjtBQXhERCx3RUF3REM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzdFdUM7QUFDQTtBQUNBO0FBQ0E7QUFDRTtBQUNRO0FBQ0U7QUFDRTs7Ozs7Ozs7Ozs7Ozs7OztBQ1B0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRDs7QUFFbkQ7O0FBRUEsb0JBQW9CLGdCQUFnQjtBQUNwQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsa0JBQWtCLGNBQWM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGtCQUFrQixjQUFjO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxrQkFBa0IsYUFBYTtBQUMvQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGlFQUFlLEdBQUc7Ozs7Ozs7Ozs7Ozs7OztBQ3RObEIsaUVBQWUsc0NBQXNDOzs7Ozs7Ozs7Ozs7Ozs7O0FDQWhCOztBQUVyQztBQUNBLE9BQU8sd0RBQVE7QUFDZjtBQUNBOztBQUVBO0FBQ0EsZ0NBQWdDOztBQUVoQztBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7O0FBRXJCO0FBQ0EscUJBQXFCOztBQUVyQjtBQUNBLHFCQUFxQjs7QUFFckI7QUFDQSxxQkFBcUI7QUFDckI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxpRUFBZSxLQUFLOzs7Ozs7Ozs7Ozs7Ozs7QUNsQ3BCLGlFQUFlLGNBQWMsRUFBRSxVQUFVLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLFVBQVUsR0FBRyx5Q0FBeUM7Ozs7Ozs7Ozs7Ozs7OztBQ0FwSTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ2U7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7OztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxtREFBbUQ7O0FBRW5EOztBQUVBLG9CQUFvQixnQkFBZ0I7QUFDcEM7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsbUJBQW1CLFFBQVE7QUFDM0I7O0FBRUEsb0JBQW9CLFFBQVE7QUFDNUI7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0IsU0FBUztBQUM3Qjs7QUFFQSxvQkFBb0IsUUFBUTtBQUM1QjtBQUNBOztBQUVBLHNCQUFzQixTQUFTO0FBQy9CO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxzQkFBc0IsVUFBVTtBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGlFQUFlLElBQUk7Ozs7Ozs7Ozs7Ozs7Ozs7QUMvRmtCO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLGdCQUFnQixTQUFTO0FBQ3pCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwZ0JBQTBnQjtBQUMxZ0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsT0FBTyx3REFBUTtBQUNmO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxpRUFBZSxTQUFTOzs7Ozs7Ozs7Ozs7Ozs7OztBQzdCRztBQUNZLENBQUM7QUFDeEM7QUFDQTtBQUNBOztBQUVBOztBQUVBLGVBQWU7OztBQUdmO0FBQ0Esb0JBQW9COztBQUVwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0ZBQWdGO0FBQ2hGO0FBQ0E7O0FBRUE7QUFDQSxzREFBc0QsK0NBQUc7O0FBRXpEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7O0FBR0Esd0VBQXdFO0FBQ3hFOztBQUVBLDRFQUE0RTs7QUFFNUUsOERBQThEOztBQUU5RDtBQUNBO0FBQ0EsSUFBSTtBQUNKOzs7QUFHQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx3QkFBd0I7O0FBRXhCLDJCQUEyQjs7QUFFM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7O0FBRXRCO0FBQ0E7QUFDQSx1QkFBdUI7O0FBRXZCLG9DQUFvQzs7QUFFcEMsOEJBQThCOztBQUU5QixrQ0FBa0M7O0FBRWxDLDRCQUE0Qjs7QUFFNUIsa0JBQWtCLE9BQU87QUFDekI7QUFDQTs7QUFFQSxnQkFBZ0IseURBQVM7QUFDekI7O0FBRUEsaUVBQWUsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM5RlU7QUFDQTtBQUMzQixTQUFTLG1EQUFHLGFBQWEsK0NBQUc7QUFDNUIsaUVBQWUsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ0hzQjtBQUNSOztBQUUvQjtBQUNBLDJDQUEyQzs7QUFFM0M7O0FBRUEsa0JBQWtCLGdCQUFnQjtBQUNsQztBQUNBOztBQUVBO0FBQ0E7O0FBRU87QUFDQTtBQUNQLDZCQUFlLG9DQUFVO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCLHFEQUFLO0FBQ3ZCOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsc0JBQXNCLFFBQVE7QUFDOUI7QUFDQTs7QUFFQTtBQUNBOztBQUVBLFdBQVcseURBQVM7QUFDcEIsSUFBSTs7O0FBR0o7QUFDQSw4QkFBOEI7QUFDOUIsSUFBSSxlQUFlOzs7QUFHbkI7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDL0QyQjtBQUNZOztBQUV2QztBQUNBO0FBQ0EsK0NBQStDLCtDQUFHLEtBQUs7O0FBRXZEO0FBQ0EsbUNBQW1DOztBQUVuQztBQUNBOztBQUVBLG9CQUFvQixRQUFRO0FBQzVCO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxTQUFTLHlEQUFTO0FBQ2xCOztBQUVBLGlFQUFlLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdkJVO0FBQ0U7QUFDN0IsU0FBUyxtREFBRyxhQUFhLGdEQUFJO0FBQzdCLGlFQUFlLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7QUNIYzs7QUFFL0I7QUFDQSxxQ0FBcUMsaURBQUs7QUFDMUM7O0FBRUEsaUVBQWUsUUFBUTs7Ozs7Ozs7Ozs7Ozs7OztBQ05jOztBQUVyQztBQUNBLE9BQU8sd0RBQVE7QUFDZjtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsaUVBQWUsT0FBTzs7Ozs7Ozs7Ozs7Ozs7Ozs7VUNWdEI7VUFDQTs7VUFFQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTs7VUFFQTtVQUNBOztVQUVBO1VBQ0E7VUFDQTs7Ozs7V0N0QkE7V0FDQTtXQUNBO1dBQ0E7V0FDQSx5Q0FBeUMsd0NBQXdDO1dBQ2pGO1dBQ0E7V0FDQTs7Ozs7V0NQQTs7Ozs7V0NBQTtXQUNBO1dBQ0E7V0FDQSx1REFBdUQsaUJBQWlCO1dBQ3hFO1dBQ0EsZ0RBQWdELGFBQWE7V0FDN0Q7Ozs7Ozs7Ozs7Ozs7QUNOQTs7OztHQUlHOztBQUVILG1IQUFvRDtBQUVwRCwwRkFBMEY7QUFDMUYsNEZBQTRGO0FBQzVGLGtCQUFrQjtBQUNsQiwwSUFBcUU7QUFDckUsMElBQW1FO0FBR25FLE1BQU0sT0FBTyxHQUFZLE9BQU8sZ0JBQWdCLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0FBRzVGLDBCQUFVLENBQUMsZ0JBQWdCLENBQUMsS0FBeUMsQ0FBQyxDQUFDLENBQUMsZUFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBRS9HLE1BQU0sYUFBYSxHQUFHLElBQUksK0JBQWMsRUFBRSxDQUFDO0FBQzlCLGtCQUFVLEdBQUcsSUFBSSx1QkFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0FBRXhELGVBQWU7QUFDZiwrRUFBK0U7QUFDL0UseUpBeUMyQztBQXhDekMsNEVBQW1CO0FBQ25CLGtFQUFjO0FBQ2QsOERBQVk7QUFDWiwwREFBVTtBQUNWLGdGQUFxQjtBQUNyQiw0RUFBbUI7QUFDbkIsZ0dBQTZCO0FBQzdCLHNEQUFRO0FBQ1IsZ0VBQWE7QUFDYiw0REFBVztBQUNYLDhEQUFZO0FBQ1osMERBQVU7QUFDVixzRUFBZ0I7QUFDaEIsZ0VBQWE7QUFDYiw4RUFBb0I7QUFDcEIsZ0VBQWE7QUFDYixzRUFBZ0I7QUFDaEIsc0VBQWdCO0FBQ2hCLDBEQUFVO0FBQ1Ysc0VBQWdCO0FBQ2hCLG9HQUErQjtBQUMvQixvRkFBdUI7QUFDdkIsc0RBQVE7QUFDUiwwRUFBa0I7QUFDbEIsMERBQVU7QUFDViwwRUFBa0I7QUFFbEIsb0VBQWU7QUFDZiw0RUFBbUI7QUFDbkIsZ0VBQWE7QUFDYix3REFBUztBQUNULGdFQUFhO0FBQ2Isc0VBQWdCO0FBQ2hCLDBFQUFrQjtBQUNsQiw4RUFBb0I7QUFDcEIsNEVBQW1CO0FBQ25CLHNHQUFnQztBQUNoQyxvRkFBdUI7QUFDdkIsd0ZBQXlCO0FBQ3pCLDBFQUFrQiIsInNvdXJjZXMiOlsid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2d1aWQvZ3VpZC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvRXZlbnRzL0Rhc2hib2FyZExheW91dENoYW5nZWRFdmVudC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvRXZlbnRzL0ZpbHRlckNoYW5nZWRFdmVudC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvRXZlbnRzL01hcmtzU2VsZWN0ZWRFdmVudC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvRXZlbnRzL1BhcmFtZXRlckNoYW5nZWRFdmVudC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvRXZlbnRzL1N1bW1hcnlEYXRhQ2hhbmdlZEV2ZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9FdmVudHMvVGFibGVhdUV2ZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9FdmVudHMvVGFibGVhdVNoZWV0RXZlbnQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0V2ZW50cy9UYWJsZWF1V29ya3NoZWV0RXZlbnQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0V2ZW50cy9Xb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkRXZlbnQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0V2ZW50cy9Xb3Jrc2hlZXRGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9JbXBsL0JlbnRvblNhbnNGb250TmFtZUNvbnN0YW50cy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvSW1wbC9Db25uZWN0ZWRTZXJ2ZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0ltcGwvRXh0ZW5zaW9uV29ya2Jvb2tJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9JbXBsL0V4dGVuc2lvbnNJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9JbXBsL0xlZ2FjeUludGVybmFsQXBpRGlzcGF0Y2hlckhvbGRlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvSW1wbC9TZXR0aW5nc0ltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0ltcGwvVGFibGVhdUJvb2tGb250TmFtZUNvbnN0YW50cy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvSW1wbC9VSUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL01vZGVscy9EYXNoYm9hcmQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL01vZGVscy9EYXNoYm9hcmRPYmplY3QudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL01vZGVscy9QYXJhbWV0ZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL01vZGVscy9TaGVldC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvTW9kZWxzL1dvcmtib29rLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9Nb2RlbHMvV29ya3NoZWV0LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9OYW1lc3BhY2VzL0Rhc2hib2FyZENvbnRlbnQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL05hbWVzcGFjZXMvRW52aXJvbm1lbnQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL05hbWVzcGFjZXMvRXh0ZW5zaW9ucy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvTmFtZXNwYWNlcy9TZXR0aW5ncy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvTmFtZXNwYWNlcy9VSS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvTmFtZXNwYWNlcy9Xb3JrYm9va0Zvcm1hdHRpbmdFbnZVdGlsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9OYW1lc3BhY2VzL1dvcmtzaGVldENvbnRlbnQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL1NlcnZpY2VzL0ltcGwvSW5pdGlhbGl6YXRpb25TZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvU2VydmljZXMvSW1wbC9TZXR0aW5nc1NlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9TZXJ2aWNlcy9JbXBsL1VJU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL1NlcnZpY2VzL1JlZ2lzdGVyQWxsRXh0ZW5zaW9uc1NlcnZpY2VzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnlVdGlsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9FbWJlZGRpbmdBcGlFeHRlcm5hbENvbnRyYWN0LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9FeHRlbnNpb25zQXBpRXh0ZXJuYWxDb250cmFjdC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1leHRlcm5hbC1jb250cmFjdC1qcy9zcmMvRXh0ZXJuYWxDb250cmFjdC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1leHRlcm5hbC1jb250cmFjdC1qcy9zcmMvRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvQXNrRGF0YUludGVyZmFjZXMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL0VudW1zLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9FeHRlcm5hbENvbnRyYWN0L0VtYmVkZGluZy9QdWxzZUludGVyZmFjZXMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1ZpekludGVyZmFjZXMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1dlYkNvbXBvbmVudEludGVyZmFjZXMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9OYW1lc3BhY2VzL1RhYmxlYXUudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL0V4dGVybmFsQ29udHJhY3QvU2hhcmVkL0VudW1zLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9OYW1lc3BhY2VzL1RhYmxlYXUudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL1NoYXJlZEFwaUV4dGVybmFsQ29udHJhY3QudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL0pzQXBpSW50ZXJuYWxDb250cmFjdC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvY29udHJhY3QvRGF0YVR5cGVDb252ZXJ0ZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL2NvbnRyYWN0L0VudW1zLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy9jb250cmFjdC9Ob3RpZmljYXRpb25zLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy9jb250cmFjdC9QYXJhbWV0ZXJzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy9jb250cmFjdC9WZXJicy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvaW50ZXJmYWNlL0Fza0RhdGFJbnRlcmZhY2UudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL2ludGVyZmFjZS9QdWxzZUludGVyZmFjZS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvaW50ZXJmYWNlL1ZxbEludGVyZmFjZS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvbWVzc2FnaW5nL0Nyb3NzRnJhbWVNZXNzZW5nZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL21lc3NhZ2luZy9Dcm9zc0ZyYW1lUHJlcGFyZWRNZXNzYWdlLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy9tZXNzYWdpbmcvTWVzc2FnZVR5cGVDaGVja3MudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL21lc3NhZ2luZy9pbnRlcmZhY2UvTWVzc2FnZVR5cGVzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy92ZXJzaW9uaW5nL0lkZW50aXR5VmVyc2lvbkNvbnZlcnRlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvdmVyc2lvbmluZy9TdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL3ZlcnNpb25pbmcvVmVyc2lvbkNvbnZlcnRlckZhY3RvcnkudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL3ZlcnNpb25pbmcvVmVyc2lvblRyYW5zbGF0aW9ucy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvdmVyc2lvbmluZy9leHRlcm5hbC9FeHRlcm5hbElkZW50aXR5VmVyc2lvbkNvbnZlcnRlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvdmVyc2lvbmluZy9leHRlcm5hbC9FeHRlcm5hbFN0YWNraW5nVmVyc2lvbkNvbnZlcnRlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvdmVyc2lvbmluZy9leHRlcm5hbC9FeHRlcm5hbFZlcnNpb25Db252ZXJ0ZXJGYWN0b3J5LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0FwaVZlcnNpb24udHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvQ29ubmVjdGlvblN1bW1hcnkudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvQ3Jvc3NGcmFtZS9Dcm9zc0ZyYW1lQm9vdHN0cmFwLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0Nyb3NzRnJhbWUvQ3Jvc3NGcmFtZURpc3BhdGNoZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvRGF0YVNvdXJjZS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9FbnVtTWFwcGluZ3MvRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0VudW1NYXBwaW5ncy9JbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvRXZlbnRMaXN0ZW5lck1hbmFnZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvRmllbGQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9DdXN0b21WaWV3SW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9JbXBsL0Rhc2hib2FyZEltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9EYXNoYm9hcmRPYmplY3RJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0ltcGwvRGF0YVNvdXJjZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9GaWVsZEltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9QYXJhbWV0ZXJJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0ltcGwvU2hlZXRJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0ltcGwvU2hlZXRJbmZvSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9JbXBsL1NpbmdsZUV2ZW50TWFuYWdlckltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9TdG9yeUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9TdG9yeVBvaW50SW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9JbXBsL1N0b3J5UG9pbnRJbmZvSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9JbXBsL1dvcmtib29rSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9JbXBsL1dvcmtzaGVldEltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvTG9naWNhbFRhYmxlLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL01vZGVscy9BY2Nlc3NpYmlsaXR5TW9kZWxzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL01vZGVscy9GaWx0ZXJNb2RlbHMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvTW9kZWxzL0dldERhdGFNb2RlbHMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvTW9kZWxzL0dldERhdGFUYWJsZVJlYWRlck1vZGVscy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9Nb2RlbHMvU2VsZWN0aW9uTW9kZWxzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1BvaW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL0dldERhdGFTZXJ2aWNlLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL1JlZ2lzdGVyQWxsU2hhcmVkU2VydmljZXMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvQWNjZXNzaWJpbGl0eVNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvQW5pbWF0aW9uU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9Bbm5vdGF0aW9uU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9DbGllbnRJbmZvU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9EYXRhU291cmNlU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9FeHBvcnRTZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL0V4dGVybmFsQ29udGV4dE1lbnVTZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL0ZpbHRlclNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvR2V0RGF0YVNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvTm90aWZpY2F0aW9uU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9Ob3RpZmljYXRpb25TZXJ2aWNlSW1wbEJhc2UudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9QYXJhbWV0ZXJzU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9TZWxlY3Rpb25TZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1NlcnZpY2VJbXBsQmFzZS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1NpemVTZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1N0b3J5QWN0aXZhdGlvblNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvVmlzdWFsTW9kZWxTZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1ZpelNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvWm9uZVNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1RhYmxlU3VtbWFyeS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9UYWJsZWF1RXJyb3IudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvVXRpbHMvRGF0YVZhbHVlRmFjdG9yeS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9VdGlscy9EZWZlcnJlZC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9VdGlscy9FbnVtQ29udmVydGVyLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1V0aWxzL0Vycm9ySGVscGVycy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9VdGlscy9FeHBvcnRIZWxwZXJzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1V0aWxzL1BhcmFtLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1V0aWxzL1NoZWV0VXRpbHMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvVXRpbHMvU2hvcnRMaXZlZERlZmVycmVkLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1ZlcnNpb25OdW1iZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9WZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvbWQ1LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL25pbC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9wYXJzZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9yZWdleC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9ybmcuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvc2hhMS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9zdHJpbmdpZnkuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdjEuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdjMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdjM1LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3Y0LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3Y1LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3ZhbGlkYXRlLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3ZlcnNpb24uanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly90YWJsZWF1L3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly90YWJsZWF1L3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vdGFibGVhdS93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gKCkge1xuICB2YXIgdmFsaWRhdG9yID0gbmV3IFJlZ0V4cChcIl5bYS16MC05XXs4fS1bYS16MC05XXs0fS1bYS16MC05XXs0fS1bYS16MC05XXs0fS1bYS16MC05XXsxMn0kXCIsIFwiaVwiKTtcblxuICBmdW5jdGlvbiBnZW4oY291bnQpIHtcbiAgICB2YXIgb3V0ID0gXCJcIjtcbiAgICBmb3IgKHZhciBpPTA7IGk8Y291bnQ7IGkrKykge1xuICAgICAgb3V0ICs9ICgoKDErTWF0aC5yYW5kb20oKSkqMHgxMDAwMCl8MCkudG9TdHJpbmcoMTYpLnN1YnN0cmluZygxKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIGZ1bmN0aW9uIEd1aWQoZ3VpZCkge1xuICAgIGlmICghZ3VpZCkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXJndW1lbnQ7IGB2YWx1ZWAgaGFzIG5vIHZhbHVlLlwiKTtcbiAgICAgIFxuICAgIHRoaXMudmFsdWUgPSBHdWlkLkVNUFRZO1xuICAgIFxuICAgIGlmIChndWlkICYmIGd1aWQgaW5zdGFuY2VvZiBHdWlkKSB7XG4gICAgICB0aGlzLnZhbHVlID0gZ3VpZC50b1N0cmluZygpO1xuXG4gICAgfSBlbHNlIGlmIChndWlkICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChndWlkKSA9PT0gXCJbb2JqZWN0IFN0cmluZ11cIiAmJiBHdWlkLmlzR3VpZChndWlkKSkge1xuICAgICAgdGhpcy52YWx1ZSA9IGd1aWQ7XG4gICAgfVxuICAgIFxuICAgIHRoaXMuZXF1YWxzID0gZnVuY3Rpb24ob3RoZXIpIHtcbiAgICAgIC8vIENvbXBhcmluZyBzdHJpbmcgYHZhbHVlYCBhZ2FpbnN0IHByb3ZpZGVkIGBndWlkYCB3aWxsIGF1dG8tY2FsbFxuICAgICAgLy8gdG9TdHJpbmcgb24gYGd1aWRgIGZvciBjb21wYXJpc29uXG4gICAgICByZXR1cm4gR3VpZC5pc0d1aWQob3RoZXIpICYmIHRoaXMudmFsdWUgPT0gb3RoZXI7XG4gICAgfTtcblxuICAgIHRoaXMuaXNFbXB0eSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMudmFsdWUgPT09IEd1aWQuRU1QVFk7XG4gICAgfTtcbiAgICBcbiAgICB0aGlzLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgICB9O1xuICAgIFxuICAgIHRoaXMudG9KU09OID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgICB9O1xuICB9O1xuXG4gIEd1aWQuRU1QVFkgPSBcIjAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMFwiO1xuXG4gIEd1aWQuaXNHdWlkID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgJiYgKHZhbHVlIGluc3RhbmNlb2YgR3VpZCB8fCB2YWxpZGF0b3IudGVzdCh2YWx1ZS50b1N0cmluZygpKSk7XG4gIH07XG5cbiAgR3VpZC5jcmVhdGUgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IEd1aWQoW2dlbigyKSwgZ2VuKDEpLCBnZW4oMSksIGdlbigxKSwgZ2VuKDMpXS5qb2luKFwiLVwiKSk7XG4gIH07XG5cbiAgR3VpZC5yYXcgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gW2dlbigyKSwgZ2VuKDEpLCBnZW4oMSksIGdlbigxKSwgZ2VuKDMpXS5qb2luKFwiLVwiKTtcbiAgfTtcblxuICBpZih0eXBlb2YgbW9kdWxlICE9ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBHdWlkO1xuICB9XG4gIGVsc2UgaWYgKHR5cGVvZiB3aW5kb3cgIT0gJ3VuZGVmaW5lZCcpIHtcbiAgICB3aW5kb3cuR3VpZCA9IEd1aWQ7XG4gIH1cbn0pKCk7XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUV2ZW50IH0gZnJvbSAnLi9UYWJsZWF1RXZlbnQnO1xuXG5leHBvcnQgY2xhc3MgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZEV2ZW50IGV4dGVuZHMgVGFibGVhdUV2ZW50IGltcGxlbWVudHMgQ29udHJhY3QuRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZEV2ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBfZGFzaGJvYXJkTGF5b3V0Q2hhbmdlRGV0YWlsczogQ29udHJhY3QuRGFzaGJvYXJkTGF5b3V0Q2hhbmdlRGV0YWlscykge1xuICAgIHN1cGVyKENvbnRyYWN0LlRhYmxlYXVFdmVudFR5cGUuRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRhc2hib2FyZExheW91dENoYW5nZURldGFpbHMoKTogQ29udHJhY3QuRGFzaGJvYXJkTGF5b3V0Q2hhbmdlRGV0YWlscyB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZExheW91dENoYW5nZURldGFpbHM7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFcnJvckNvZGVzLCBUYWJsZWF1RXZlbnRUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgVGFibGVhdVdvcmtzaGVldEV2ZW50IH0gZnJvbSAnLi9UYWJsZWF1V29ya3NoZWV0RXZlbnQnO1xuXG5leHBvcnQgY2xhc3MgRmlsdGVyQ2hhbmdlZEV2ZW50IGV4dGVuZHMgVGFibGVhdVdvcmtzaGVldEV2ZW50IGltcGxlbWVudHMgQ29udHJhY3QuRmlsdGVyQ2hhbmdlZEV2ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHdvcmtzaGVldDogQ29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0LCBwcml2YXRlIF9maWVsZE5hbWU6IHN0cmluZywgcHJpdmF0ZSBfZmllbGRJZD86IHN0cmluZykge1xuICAgIHN1cGVyKFRhYmxlYXVFdmVudFR5cGUuRmlsdGVyQ2hhbmdlZCwgd29ya3NoZWV0KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmllbGROYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkTmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmllbGRJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9maWVsZElkO1xuICB9XG5cbiAgcHVibGljIGdldEZpbHRlckFzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuRmlsdGVyPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldC5nZXRGaWx0ZXJzQXN5bmMoKS50aGVuPENvbnRyYWN0LkZpbHRlcj4oKGZpbHRlcnMpID0+IHtcbiAgICAgIC8vIFRPRE86IEZpbHRlcmluZyBvZiB0aGUgZmlsdGVycyBzaG91bGQgZXZlbnR1YWxseSBiZSBkb25lIHBsYXRmb3JtIHNpZGUuXG4gICAgICBjb25zdCBldmVudGVkRmlsdGVyID0gdGhpcy5maWVsZElkXG4gICAgICAgID8gZmlsdGVycy5maW5kKChmaWx0ZXIpID0+IGZpbHRlci5maWVsZElkID09PSB0aGlzLmZpZWxkSWQsIHRoaXMpXG4gICAgICAgIDogZmlsdGVycy5maW5kKChmaWx0ZXIpID0+IGZpbHRlci5maWVsZE5hbWUgPT09IHRoaXMuZmllbGROYW1lLCB0aGlzKTtcblxuICAgICAgaWYgKCFldmVudGVkRmlsdGVyKSB7XG4gICAgICAgIC8vIFdlIHNob3VsZG4ndCBoaXQgdGhpcyB1bmxlc3MgdGhlIGZpbHRlciB3YXMgcmVtb3ZlZCBmcm9tIHRoZSB3b3Jrc2hlZXRcbiAgICAgICAgLy8gYWZ0ZXIgdGhlIGV2ZW50IHdhcyByYWlzZWQuXG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5NaXNzaW5nRmlsdGVyLCBgY2Fubm90IGZpbmQgZmlsdGVyOiAke3RoaXMuX2ZpZWxkTmFtZX1gKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGV2ZW50ZWRGaWx0ZXI7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXZlbnRUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVXb3Jrc2hlZXRFdmVudCB9IGZyb20gJy4vVGFibGVhdVdvcmtzaGVldEV2ZW50JztcblxuZXhwb3J0IGNsYXNzIE1hcmtzU2VsZWN0ZWRFdmVudCBleHRlbmRzIFRhYmxlYXVXb3Jrc2hlZXRFdmVudCBpbXBsZW1lbnRzIENvbnRyYWN0Lk1hcmtzU2VsZWN0ZWRFdmVudCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih3b3Jrc2hlZXQ6IENvbnRyYWN0LkV4dGVuc2lvbldvcmtzaGVldCkge1xuICAgIHN1cGVyKFRhYmxlYXVFdmVudFR5cGUuTWFya1NlbGVjdGlvbkNoYW5nZWQsIHdvcmtzaGVldCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TWFya3NBc3luYygpOiBQcm9taXNlPENvbnRyYWN0Lk1hcmtzQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiB0aGlzLndvcmtzaGVldC5nZXRTZWxlY3RlZE1hcmtzQXN5bmMoKTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEVycm9yQ29kZXMsIFRhYmxlYXVFdmVudFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5LCBQYXJhbWV0ZXJzU2VydmljZSwgU2VydmljZU5hbWVzLCBUYWJsZWF1RXJyb3IgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IFBhcmFtZXRlciB9IGZyb20gJy4uL01vZGVscy9QYXJhbWV0ZXInO1xuaW1wb3J0IHsgRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnlVdGlsJztcbmltcG9ydCB7IFRhYmxlYXVTaGVldEV2ZW50IH0gZnJvbSAnLi9UYWJsZWF1U2hlZXRFdmVudCc7XG5cbmV4cG9ydCBjbGFzcyBQYXJhbWV0ZXJDaGFuZ2VkRXZlbnQgZXh0ZW5kcyBUYWJsZWF1U2hlZXRFdmVudCBpbXBsZW1lbnRzIENvbnRyYWN0LlBhcmFtZXRlckNoYW5nZWRFdmVudCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9nbG9iYWxGaWVsZE5hbWU6IHN0cmluZywgc2hlZXQ6IENvbnRyYWN0LkV4dGVuc2lvblNoZWV0KSB7XG4gICAgc3VwZXIoVGFibGVhdUV2ZW50VHlwZS5QYXJhbWV0ZXJDaGFuZ2VkLCBzaGVldCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0UGFyYW1ldGVyQXN5bmMoKTogUHJvbWlzZTxDb250cmFjdC5QYXJhbWV0ZXI+IHtcbiAgICAvLyBDYWxsIGRvd24gdG8gb3VyIHNlcnZpY2UgdG8gZ2V0IHRoZSBwYXJhbWV0ZXIgYmFjayB2aWEgaXRzIGZpZWxkIG5hbWVcbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxQYXJhbWV0ZXJzU2VydmljZT4oU2VydmljZU5hbWVzLlBhcmFtZXRlcnMpO1xuICAgIHJldHVybiBzZXJ2aWNlLmZpbmRQYXJhbWV0ZXJCeUdsb2JhbEZpZWxkTmFtZUFzeW5jKHRoaXMuX2dsb2JhbEZpZWxkTmFtZSkudGhlbigocGFyYW1ldGVySW1wbCkgPT4ge1xuICAgICAgaWYgKHBhcmFtZXRlckltcGwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuTWlzc2luZ1BhcmFtZXRlciwgYENhbm5vdCBmaW5kIHBhcmFtZXRlcjogJHt0aGlzLl9nbG9iYWxGaWVsZE5hbWV9YCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgUGFyYW1ldGVyKHBhcmFtZXRlckltcGwsIHRoaXMuc2hlZXQpO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUV2ZW50VHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1V29ya3NoZWV0RXZlbnQgfSBmcm9tICcuL1RhYmxlYXVXb3Jrc2hlZXRFdmVudCc7XG5cbmV4cG9ydCBjbGFzcyBTdW1tYXJ5RGF0YUNoYW5nZWRFdmVudCBleHRlbmRzIFRhYmxlYXVXb3Jrc2hlZXRFdmVudCBpbXBsZW1lbnRzIENvbnRyYWN0LlN1bW1hcnlEYXRhQ2hhbmdlZEV2ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHdvcmtzaGVldDogQ29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0KSB7XG4gICAgc3VwZXIoVGFibGVhdUV2ZW50VHlwZS5TdW1tYXJ5RGF0YUNoYW5nZWQsIHdvcmtzaGVldCk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXZlbnRUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcblxuZXhwb3J0IGNsYXNzIFRhYmxlYXVFdmVudCBpbXBsZW1lbnRzIENvbnRyYWN0LlRhYmxlYXVFdmVudCB7XG4gIHByaXZhdGUgX3R5cGU6IFRhYmxlYXVFdmVudFR5cGU7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHR5cGU6IFRhYmxlYXVFdmVudFR5cGUpIHtcbiAgICB0aGlzLl90eXBlID0gdHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdHlwZSgpOiBUYWJsZWF1RXZlbnRUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fdHlwZTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFdmVudFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUV2ZW50IH0gZnJvbSAnLi9UYWJsZWF1RXZlbnQnO1xuXG5leHBvcnQgY2xhc3MgVGFibGVhdVNoZWV0RXZlbnQgZXh0ZW5kcyBUYWJsZWF1RXZlbnQgaW1wbGVtZW50cyBDb250cmFjdC5UYWJsZWF1U2hlZXRFdmVudCB7XG4gIHByaXZhdGUgX3NoZWV0OiBDb250cmFjdC5FeHRlbnNpb25TaGVldDtcblxuICBwdWJsaWMgZ2V0IHNoZWV0KCk6IENvbnRyYWN0LkV4dGVuc2lvblNoZWV0IHtcbiAgICByZXR1cm4gdGhpcy5fc2hlZXQ7XG4gIH1cblxuICBwdWJsaWMgY29uc3RydWN0b3IodHlwZTogVGFibGVhdUV2ZW50VHlwZSwgc2hlZXQ6IENvbnRyYWN0LkV4dGVuc2lvblNoZWV0KSB7XG4gICAgc3VwZXIodHlwZSk7XG5cbiAgICB0aGlzLl9zaGVldCA9IHNoZWV0O1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUV2ZW50VHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1U2hlZXRFdmVudCB9IGZyb20gJy4vVGFibGVhdVNoZWV0RXZlbnQnO1xuXG5leHBvcnQgY2xhc3MgVGFibGVhdVdvcmtzaGVldEV2ZW50IGV4dGVuZHMgVGFibGVhdVNoZWV0RXZlbnQgaW1wbGVtZW50cyBDb250cmFjdC5UYWJsZWF1V29ya3NoZWV0RXZlbnQge1xuICBwdWJsaWMgZ2V0IHdvcmtzaGVldCgpOiBDb250cmFjdC5FeHRlbnNpb25Xb3Jrc2hlZXQge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXQ7XG4gIH1cblxuICBwdWJsaWMgY29uc3RydWN0b3IodHlwZTogVGFibGVhdUV2ZW50VHlwZSwgcHJvdGVjdGVkIF93b3Jrc2hlZXQ6IENvbnRyYWN0LkV4dGVuc2lvbldvcmtzaGVldCkge1xuICAgIHN1cGVyKHR5cGUsIF93b3Jrc2hlZXQpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUV2ZW50IH0gZnJvbSAnLi9UYWJsZWF1RXZlbnQnO1xuXG5leHBvcnQgY2xhc3MgV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50IGV4dGVuZHMgVGFibGVhdUV2ZW50IGltcGxlbWVudHMgQ29udHJhY3QuV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2Zvcm1hdHRpbmc6IENvbnRyYWN0Lldvcmtib29rRm9ybWF0dGluZykge1xuICAgIHN1cGVyKENvbnRyYWN0LlRhYmxlYXVFdmVudFR5cGUuV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZvcm1hdHRpbmcoKTogQ29udHJhY3QuV29ya2Jvb2tGb3JtYXR0aW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybWF0dGluZztcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVXb3Jrc2hlZXRFdmVudCB9IGZyb20gJy4vVGFibGVhdVdvcmtzaGVldEV2ZW50JztcblxuZXhwb3J0IGNsYXNzIFdvcmtzaGVldEZvcm1hdHRpbmdDaGFuZ2VkRXZlbnQgZXh0ZW5kcyBUYWJsZWF1V29ya3NoZWV0RXZlbnQgaW1wbGVtZW50cyBDb250cmFjdC5Xb3Jrc2hlZXRGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHdvcmtzaGVldDogQ29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0LCBwcml2YXRlIF9mb3JtYXR0aW5nOiBDb250cmFjdC5Xb3Jrc2hlZXRGb3JtYXR0aW5nKSB7XG4gICAgc3VwZXIoQ29udHJhY3QuVGFibGVhdUV2ZW50VHlwZS5Xb3Jrc2hlZXRGb3JtYXR0aW5nQ2hhbmdlZCwgd29ya3NoZWV0KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZm9ybWF0dGluZygpOiBDb250cmFjdC5Xb3Jrc2hlZXRGb3JtYXR0aW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybWF0dGluZztcbiAgfVxufVxuIiwiaW1wb3J0IHsgTW9kZWwgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG5leHBvcnQgY29uc3QgQmVudG9uU2Fuc0ZvbnRGYW1pbHlOYW1lID0gJ0JlbnRvbiBTYW5zJztcbmV4cG9ydCBjb25zdCBCZW50b25TYW5zTG93RFBJRm9udEZhbWlseU5hbWUgPSAnQmVudG9uIFNhbnMgTG93LURQSSc7XG5cbmV4cG9ydCBjb25zdCBCZW50b25TYW5zQm9va0ZvbnRGYWNlTmFtZSA9ICdCZW50b24gU2FucyBCb29rJztcbmV4cG9ydCBjb25zdCBCZW50b25TYW5zQm9va0l0YWxpY0ZvbnRGYWNlTmFtZSA9ICdCZW50b24gU2FucyBCb29rIEl0YWxpYyc7XG5leHBvcnQgY29uc3QgQmVudG9uU2Fuc1NlbWlEZW1pRm9udEZhY2VOYW1lID0gJ0JlbnRvbiBTYW5zIFNlbWlEZW1pJztcbmV4cG9ydCBjb25zdCBCZW50b25TYW5zU2VtaURlbWlJdGFsaWNGb250RmFjZU5hbWUgPSAnQmVudG9uIFNhbnMgU2VtaURlbWkgSXRhbGljJztcbmV4cG9ydCBjb25zdCBCZW50b25TYW5zTGlnaHRGb250RmFjZU5hbWUgPSAnQmVudG9uIFNhbnMgTGlnaHQnO1xuZXhwb3J0IGNvbnN0IEJlbnRvblNhbnNNZWRpdW1Gb250RmFjZU5hbWUgPSAnQmVudG9uIFNhbnMgTWVkaXVtJztcblxuZXhwb3J0IGNvbnN0IFN1cHBvcnRlZEJlbnRvblNhbnNGb250RmFjZXM6IE1vZGVsW10gPSBbXG4gIEJlbnRvblNhbnNCb29rRm9udEZhY2VOYW1lLFxuICBCZW50b25TYW5zQm9va0l0YWxpY0ZvbnRGYWNlTmFtZSxcbiAgQmVudG9uU2Fuc1NlbWlEZW1pRm9udEZhY2VOYW1lLFxuICBCZW50b25TYW5zU2VtaURlbWlJdGFsaWNGb250RmFjZU5hbWUsXG4gIEJlbnRvblNhbnNMaWdodEZvbnRGYWNlTmFtZSxcbiAgQmVudG9uU2Fuc01lZGl1bUZvbnRGYWNlTmFtZSxcbl07XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuXG5leHBvcnQgY2xhc3MgQ29ubmVjdGVkU2VydmVyIGltcGxlbWVudHMgQ29udHJhY3QuQ29ubmVjdGVkU2VydmVyIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBfdXNlcklkPzogc3RyaW5nLFxuICAgIHByb3RlY3RlZCBfc2l0ZUlkPzogc3RyaW5nLFxuICAgIHByb3RlY3RlZCBfc2l0ZU5hbWVzcGFjZT86IHN0cmluZyxcbiAgICBwcm90ZWN0ZWQgX3dvcmtib29rSWQ/OiBzdHJpbmcsXG4gICkge31cblxuICBwdWJsaWMgZ2V0IHVzZXJJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl91c2VySWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNpdGVJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9zaXRlSWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNpdGVOYW1lc3BhY2UoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fc2l0ZU5hbWVzcGFjZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgd29ya2Jvb2tJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl93b3JrYm9va0lkO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGF0YVNjaGVtYSwgRGF0YVNvdXJjZSBhcyBEYXRhU291cmNlSW5mbyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBBcGlTZXJ2aWNlUmVnaXN0cnksIERhdGFTb3VyY2UsIERhdGFTb3VyY2VJbXBsLCBEYXRhU291cmNlU2VydmljZSwgU2VydmljZU5hbWVzLCBXb3JrYm9va0ltcGwgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IEV4dGVuc2lvbnNSZWdpc3RyeUlkIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5VXRpbCc7XG5cbmV4cG9ydCBjbGFzcyBFeHRlbnNpb25Xb3JrYm9va0ltcGwgZXh0ZW5kcyBXb3JrYm9va0ltcGwge1xuICBwdWJsaWMgZ2V0QWxsRGF0YVNvdXJjZXNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkRhdGFTb3VyY2U+PiB7XG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RGF0YVNvdXJjZVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5EYXRhU291cmNlU2VydmljZSk7XG5cbiAgICByZXR1cm4gc2VydmljZS5nZXRBbGxEYXRhU291cmNlc0FzeW5jKCkudGhlbjxBcnJheTxDb250cmFjdC5EYXRhU291cmNlPj4oKHJlc3VsdCkgPT4ge1xuICAgICAgY29uc3QgZGF0YVNjaGVtYTogRGF0YVNjaGVtYSA9IHJlc3VsdDtcbiAgICAgIGNvbnN0IGRhdGFTb3VyY2VzOiBBcnJheTxDb250cmFjdC5EYXRhU291cmNlPiA9IFtdO1xuXG4gICAgICAvLyBMb29wIHRocm91Z2ggYWxsIGRhdGEgc291cmNlcyBhbmQgYWRkIHRoZW0uXG4gICAgICBPYmplY3QudmFsdWVzKGRhdGFTY2hlbWEuZGF0YVNvdXJjZXMpLmZvckVhY2goKGRzKSA9PiB7XG4gICAgICAgIGRhdGFTb3VyY2VzLnB1c2godGhpcy5jcmVhdGVEYXRhU291cmNlRnJvbUluZm8oZHMpKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gZGF0YVNvdXJjZXM7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZURhdGFTb3VyY2VGcm9tSW5mbyhkYXRhU291cmNlSW5mbzogRGF0YVNvdXJjZUluZm8pOiBEYXRhU291cmNlIHtcbiAgICBjb25zdCBkYXRhU291cmNlSW1wbCA9IG5ldyBEYXRhU291cmNlSW1wbChkYXRhU291cmNlSW5mbywgRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpO1xuICAgIGNvbnN0IGRhdGFTb3VyY2UgPSBuZXcgRGF0YVNvdXJjZShkYXRhU291cmNlSW1wbCk7XG4gICAgZGF0YVNvdXJjZUltcGwuaW5pdGlhbGl6ZVdpdGhQdWJsaWNJbnRlcmZhY2VzKGRhdGFTb3VyY2UpO1xuICAgIHJldHVybiBkYXRhU291cmNlO1xuICB9XG59XG4iLCJpbXBvcnQgeyBFcnJvckNvZGVzLCBTaGVldFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQ29udGV4dE1lbnVFdmVudCxcbiAgRGFzaGJvYXJkRXh0ZW5zaW9uTG9jYXRvcixcbiAgRXhlY3V0ZVBhcmFtZXRlcnMsXG4gIEV4dGVuc2lvbkRhc2hib2FyZEluZm8sXG4gIEV4dGVuc2lvbkxvY2F0b3IsXG4gIEV4dGVuc2lvblNldHRpbmdzSW5mbyxcbiAgRXh0ZW5zaW9uV29ya3NoZWV0SW5mbyxcbiAgRm9udE5hbWVBbmRJbmZvLFxuICBGb3JtYXR0aW5nU2hlZXQsXG4gIElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT04sXG4gIEluaXRpYWxpemF0aW9uT3B0aW9ucyxcbiAgSW50ZXJuYWxBcGlEaXNwYXRjaGVyLFxuICBJbnRlcm5hbEFwaURpc3BhdGNoZXJGYWN0b3J5LFxuICBNb2RlbCxcbiAgTm90aWZpY2F0aW9uSWQsXG4gIFBhcmFtZXRlcklkLFxuICBTaGVldFBhdGgsXG4gIFZlcmJJZCxcbiAgV29ya2Jvb2tGb3JtYXR0aW5nLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LFxuICBBcGlWZXJzaW9uLFxuICBEYXNoYm9hcmRJbXBsLFxuICBOb3RpZmljYXRpb25TZXJ2aWNlLFxuICBTZXJ2aWNlTmFtZXMsXG4gIFNoZWV0SW5mb0ltcGwsXG4gIFRhYmxlYXVFcnJvcixcbiAgVmVyc2lvbmVkRXh0ZXJuYWxBcGlEaXNwYXRjaGVyLFxuICBWaXpTZXJ2aWNlLFxuICBXb3Jrc2hlZXRJbXBsLFxuICBkb0Nyb3NzRnJhbWVCb290c3RyYXAsXG4gIHJlZ2lzdGVyQWxsU2hhcmVkU2VydmljZXMsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkIH0gZnJvbSAnLi4vTW9kZWxzL0Rhc2hib2FyZCc7XG5pbXBvcnQgeyBXb3JrYm9vayB9IGZyb20gJy4uL01vZGVscy9Xb3JrYm9vayc7XG5pbXBvcnQgeyBXb3Jrc2hlZXQgfSBmcm9tICcuLi9Nb2RlbHMvV29ya3NoZWV0JztcbmltcG9ydCB7IERhc2hib2FyZENvbnRlbnQgfSBmcm9tICcuLi9OYW1lc3BhY2VzL0Rhc2hib2FyZENvbnRlbnQnO1xuaW1wb3J0IHsgRW52aXJvbm1lbnQgfSBmcm9tICcuLi9OYW1lc3BhY2VzL0Vudmlyb25tZW50JztcbmltcG9ydCB7IFNldHRpbmdzIH0gZnJvbSAnLi4vTmFtZXNwYWNlcy9TZXR0aW5ncyc7XG5pbXBvcnQgeyBVSSB9IGZyb20gJy4uL05hbWVzcGFjZXMvVUknO1xuaW1wb3J0IHsgV29ya2Jvb2tGb3JtYXR0aW5nRW52VXRpbCB9IGZyb20gJy4uL05hbWVzcGFjZXMvV29ya2Jvb2tGb3JtYXR0aW5nRW52VXRpbCc7XG5pbXBvcnQgeyBXb3Jrc2hlZXRDb250ZW50IH0gZnJvbSAnLi4vTmFtZXNwYWNlcy9Xb3Jrc2hlZXRDb250ZW50JztcbmltcG9ydCB7IEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9FeHRlbnNpb25zU2VydmljZU5hbWVzJztcbmltcG9ydCB7IEluaXRpYWxpemF0aW9uU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0luaXRpYWxpemF0aW9uU2VydmljZSc7XG5pbXBvcnQgeyByZWdpc3RlckFsbEV4dGVuc2lvbnNTZXJ2aWNlcywgcmVnaXN0ZXJJbml0aWFsaXphdGlvbkV4dGVuc2lvbnNTZXJ2aWNlcyB9IGZyb20gJy4uL1NlcnZpY2VzL1JlZ2lzdGVyQWxsRXh0ZW5zaW9uc1NlcnZpY2VzJztcbmltcG9ydCB7IEV4dGVuc2lvbnNSZWdpc3RyeUlkIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5VXRpbCc7XG5pbXBvcnQgeyBVSVNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9VSVNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgQmVudG9uU2Fuc0Jvb2tGb250RmFjZU5hbWUsXG4gIEJlbnRvblNhbnNCb29rSXRhbGljRm9udEZhY2VOYW1lLFxuICBCZW50b25TYW5zRm9udEZhbWlseU5hbWUsXG4gIEJlbnRvblNhbnNMaWdodEZvbnRGYWNlTmFtZSxcbiAgQmVudG9uU2Fuc0xvd0RQSUZvbnRGYW1pbHlOYW1lLFxuICBCZW50b25TYW5zTWVkaXVtRm9udEZhY2VOYW1lLFxuICBCZW50b25TYW5zU2VtaURlbWlGb250RmFjZU5hbWUsXG4gIEJlbnRvblNhbnNTZW1pRGVtaUl0YWxpY0ZvbnRGYWNlTmFtZSxcbiAgU3VwcG9ydGVkQmVudG9uU2Fuc0ZvbnRGYWNlcyxcbn0gZnJvbSAnLi9CZW50b25TYW5zRm9udE5hbWVDb25zdGFudHMnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uV29ya2Jvb2tJbXBsIH0gZnJvbSAnLi9FeHRlbnNpb25Xb3JrYm9va0ltcGwnO1xuaW1wb3J0IHsgTGVnYWN5SW50ZXJuYWxBcGlEaXNwYXRjaGVySG9sZGVyIH0gZnJvbSAnLi9MZWdhY3lJbnRlcm5hbEFwaURpc3BhdGNoZXJIb2xkZXInO1xuaW1wb3J0IHsgU2V0dGluZ3NJbXBsIH0gZnJvbSAnLi9TZXR0aW5nc0ltcGwnO1xuaW1wb3J0IHtcbiAgU3VwcG9ydGVkVGFibGVhdUZvbnRGYWNlcyxcbiAgVGFibGVhdUJvbGRGb250RmFjZU5hbWUsXG4gIFRhYmxlYXVCb2xkRm9udEZhbWlseU5hbWUsXG4gIFRhYmxlYXVCb29rRm9udEZhY2VOYW1lLFxuICBUYWJsZWF1Qm9va0ZvbnRGYW1pbHlOYW1lLFxuICBUYWJsZWF1TGlnaHRGb250RmFjZU5hbWUsXG4gIFRhYmxlYXVMaWdodEZvbnRGYW1pbHlOYW1lLFxuICBUYWJsZWF1TWVkaXVtRm9udEZhY2VOYW1lLFxuICBUYWJsZWF1TWVkaXVtRm9udEZhbWlseU5hbWUsXG4gIFRhYmxlYXVSZWd1bGFyRm9udEZhY2VOYW1lLFxuICBUYWJsZWF1UmVndWxhckZvbnRGYW1pbHlOYW1lLFxuICBUYWJsZWF1U2VtaUJvbGRGb250RmFjZU5hbWUsXG4gIFRhYmxlYXVTZW1pYm9sZEZvbnRGYW1pbHlOYW1lLFxufSBmcm9tICcuL1RhYmxlYXVCb29rRm9udE5hbWVDb25zdGFudHMnO1xuaW1wb3J0IHsgVUlJbXBsIH0gZnJvbSAnLi9VSUltcGwnO1xuXG5leHBvcnQgdHlwZSBDYWxsYmFja01hcCA9IHsgW2tleTogc3RyaW5nXTogKCkgPT4gUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfTtcblxuZXhwb3J0IGNsYXNzIEV4dGVuc2lvbnNJbXBsIHtcbiAgcHJpdmF0ZSBfaW5pdGlhbGl6YXRpb25Qcm9taXNlOiBQcm9taXNlPHN0cmluZz47XG4gIHByaXZhdGUgX3N0eWxlRWxlbWVudDogSFRNTFN0eWxlRWxlbWVudDtcbiAgcHVibGljIGRhc2hib2FyZENvbnRlbnQ/OiBEYXNoYm9hcmRDb250ZW50O1xuICBwdWJsaWMgd29ya3NoZWV0Q29udGVudD86IFdvcmtzaGVldENvbnRlbnQ7XG4gIHB1YmxpYyBlbnZpcm9ubWVudDogRW52aXJvbm1lbnQ7XG4gIHB1YmxpYyBzZXR0aW5nczogU2V0dGluZ3M7XG4gIHB1YmxpYyB1aTogVUk7XG4gIHB1YmxpYyB3b3JrYm9vazogV29ya2Jvb2s7XG4gIHB1YmxpYyBleHRlbnNpb25ab25lSWQ6IG51bWJlcjtcblxuICBwdWJsaWMgaW5pdGlhbGl6ZUFzeW5jKGlzRXh0ZW5zaW9uRGlhbG9nOiBib29sZWFuLCBjb250ZXh0TWVudUNhbGxiYWNrcz86IENhbGxiYWNrTWFwKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoIXRoaXMuX2luaXRpYWxpemF0aW9uUHJvbWlzZSkge1xuICAgICAgdGhpcy5faW5pdGlhbGl6YXRpb25Qcm9taXNlID0gbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGluaXRPcHRpb25zOiBJbml0aWFsaXphdGlvbk9wdGlvbnMgPSB7IGlzQWxwaGE6IEFwaVZlcnNpb24uSW5zdGFuY2UuaXNBbHBoYSB9O1xuICAgICAgICAvLyBGaXJzdCB0aGluZyB3ZSB3YW50IHRvIGRvIGlzIGNoZWNrIHRvIHNlZSBpZiB0aGVyZSBpcyBhIGRlc2t0b3AgZGlzcGF0Y2hlciBhbHJlYWR5IHJlZ2lzdGVyZWQgZm9yIHVzXG4gICAgICAgIGlmIChMZWdhY3lJbnRlcm5hbEFwaURpc3BhdGNoZXJIb2xkZXIuaGFzRGVza3RvcEFwaURpc3BhdGNoZXJQcm9taXNlKGluaXRPcHRpb25zKSkge1xuICAgICAgICAgIC8vIFJ1bm5pbmcgaW4gYSBwcmUtMjAxOS4zIGRlc2t0b3AsIHVzZSBvdXIgbGVnYWN5IGRpc3BhdGNoZXIgcHJvbWlzZVxuICAgICAgICAgIGNvbnN0IGRlc2t0b3BEaXNwYXRjaGVyUHJvbWlzZSA9IExlZ2FjeUludGVybmFsQXBpRGlzcGF0Y2hlckhvbGRlci5nZXREZXNrdG9wRGlzcGF0Y2hlclByb21pc2UoaW5pdE9wdGlvbnMpO1xuICAgICAgICAgIGRlc2t0b3BEaXNwYXRjaGVyUHJvbWlzZVxuICAgICAgICAgICAgPy50aGVuKChkaXNwYXRjaGVyRmFjdG9yeSkgPT4gdGhpcy5vbkRpc3BhdGNoZXJSZWNlaXZlZChkaXNwYXRjaGVyRmFjdG9yeSwgaXNFeHRlbnNpb25EaWFsb2csIGNvbnRleHRNZW51Q2FsbGJhY2tzKSlcbiAgICAgICAgICAgIC50aGVuKChvcGVuUGF5bG9hZCkgPT4ge1xuICAgICAgICAgICAgICByZXNvbHZlKG9wZW5QYXlsb2FkKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBXZSBtdXN0IGJlIHJ1bm5pbmcgaW4gc2VydmVyLCBzbyB3ZSBzaG91bGQgdHJ5IHRvIGtpY2sgb2YgdGhlIHNlcnZlciBkaXNwYXRjaGVyIGJvb3RzdHJhcHBpbmdcbiAgICAgICAgICBjb25zdCBvbkRpc3BhdGNoZXJSZWNlaXZlZENhbGxiYWNrID0gdGhpcy5vbkRpc3BhdGNoZXJSZWNlaXZlZC5iaW5kKHRoaXMpO1xuICAgICAgICAgIGRvQ3Jvc3NGcmFtZUJvb3RzdHJhcCh3aW5kb3csIElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT04sIGluaXRPcHRpb25zKVxuICAgICAgICAgICAgLnRoZW4oKGZhY3Rvcnk6IEludGVybmFsQXBpRGlzcGF0Y2hlckZhY3RvcnkpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIG9uRGlzcGF0Y2hlclJlY2VpdmVkQ2FsbGJhY2soZmFjdG9yeSwgaXNFeHRlbnNpb25EaWFsb2csIGNvbnRleHRNZW51Q2FsbGJhY2tzKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbigob3BlblBheWxvYWQpID0+IHtcbiAgICAgICAgICAgICAgcmVzb2x2ZShvcGVuUGF5bG9hZCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9pbml0aWFsaXphdGlvblByb21pc2U7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlVml6SW1hZ2VBc3luYyhpbnB1dFNwZWM6IG9iamVjdCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3Qgdml6U2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8Vml6U2VydmljZT4oU2VydmljZU5hbWVzLlZpeik7XG5cbiAgICByZXR1cm4gdml6U2VydmljZS5jcmVhdGVWaXpJbWFnZUFzeW5jKGlucHV0U3BlYyk7XG4gIH1cblxuICBwdWJsaWMgc2V0Q2xpY2tUaHJvdWdoQXN5bmMoY2xpY2tUaHJvdWdoRW5hYmxlZDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHVpU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8VUlTZXJ2aWNlPihFeHRlbnNpb25zU2VydmljZU5hbWVzLlVJU2VydmljZSk7XG5cbiAgICByZXR1cm4gdWlTZXJ2aWNlLnNldENsaWNrVGhyb3VnaEFzeW5jKGNsaWNrVGhyb3VnaEVuYWJsZWQsIHRoaXMuZXh0ZW5zaW9uWm9uZUlkKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNEYXNoYm9hcmRFeHRlbnNpb25Mb2NhdG9yKGxvY2F0b3I6IEV4dGVuc2lvbkxvY2F0b3IpOiBsb2NhdG9yIGlzIERhc2hib2FyZEV4dGVuc2lvbkxvY2F0b3Ige1xuICAgIGNvbnN0IGRhc2hib2FyZEV4dGVuc2lvbkxvY2F0b3IgPSBsb2NhdG9yIGFzIERhc2hib2FyZEV4dGVuc2lvbkxvY2F0b3I7XG4gICAgaWYgKCFkYXNoYm9hcmRFeHRlbnNpb25Mb2NhdG9yLmRhc2hib2FyZFBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnVW5leHBlY3RlZCBlcnJvciBkdXJpbmcgaW5pdGlhbGl6YXRpb24uJyk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkRpc3BhdGNoZXJSZWNlaXZlZChcbiAgICBkaXNwYXRjaGVyRmFjdG9yeTogSW50ZXJuYWxBcGlEaXNwYXRjaGVyRmFjdG9yeSxcbiAgICBpc0V4dGVuc2lvbkRpYWxvZzogYm9vbGVhbixcbiAgICBjb250ZXh0TWVudUZ1bmN0aW9ucz86IENhbGxiYWNrTWFwLFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGxldCBkaXNwYXRjaGVyOiBJbnRlcm5hbEFwaURpc3BhdGNoZXIgPSBkaXNwYXRjaGVyRmFjdG9yeShJTlRFUk5BTF9DT05UUkFDVF9WRVJTSU9OKTtcblxuICAgIC8vIENhbGwgdG8gcmVnaXN0ZXIgYWxsIHRoZSBzZXJ2aWNlcyB3aGljaCB3aWxsIHVzZSB0aGUgbmV3bHkgaW5pdGlhbGl6ZWQgZGlzcGF0Y2hlclxuICAgIHJlZ2lzdGVySW5pdGlhbGl6YXRpb25FeHRlbnNpb25zU2VydmljZXMoZGlzcGF0Y2hlcik7XG5cbiAgICAvLyBHZXQgdGhlIGluaXRpYWxpemF0aW9uIHNlcnZpY2UgYW5kIGluaXRpYWxpemUgdGhpcyBleHRlbnNpb25cbiAgICBjb25zdCBpbml0aWFsaXphdGlvblNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEluaXRpYWxpemF0aW9uU2VydmljZT4oXG4gICAgICBFeHRlbnNpb25zU2VydmljZU5hbWVzLkluaXRpYWxpemF0aW9uU2VydmljZSxcbiAgICApO1xuXG4gICAgY29uc3QgY2FsbGJhY2tNYXBLZXlzID0gY29udGV4dE1lbnVGdW5jdGlvbnMgPyBPYmplY3Qua2V5cyhjb250ZXh0TWVudUZ1bmN0aW9ucykgOiBbXTtcbiAgICByZXR1cm4gaW5pdGlhbGl6YXRpb25TZXJ2aWNlLmluaXRpYWxpemVEYXNoYm9hcmRFeHRlbnNpb25zQXN5bmMoaXNFeHRlbnNpb25EaWFsb2csIGNhbGxiYWNrTWFwS2V5cykudGhlbjxzdHJpbmc+KChyZXN1bHQpID0+IHtcbiAgICAgIC8vIElmIHdlIHJlY2VpdmUgYW4gaW52YWxpZCBwbGFmb3JtIHZlcnNpb24sIHRoaXMgbWVhbnMgdGhhdCBwbGF0Zm9ybSBpcyBydW5ubmluZyAxLjQgb3IgMi4xIGFuZFxuICAgICAgLy8gZG9lc24ndCBwYXNzIHRoZSBwbGF0Zm9ybSB2ZXJzaW9uIHRvIGV4dGVybmFsLiBJbiB0aGlzIGNhc2Ugd2UgYXNzdW1lIHRoZSBwbGF0Zm9ybSB2ZXJzaW9uIHRvIGJlIDEuOVxuICAgICAgY29uc3QgcGxhdGZvcm1WZXJzaW9uID0gcmVzdWx0LmV4dGVuc2lvbkVudmlyb25tZW50LnBsYXRmb3JtVmVyc2lvblxuICAgICAgICA/IHJlc3VsdC5leHRlbnNpb25FbnZpcm9ubWVudC5wbGF0Zm9ybVZlcnNpb25cbiAgICAgICAgOiB7IG1ham9yOiAxLCBtaW5vcjogOSwgZml4OiAwIH07XG5cbiAgICAgIC8vIFdyYXAgb3VyIGV4aXN0aW5nIGRpc3BhdGNoZXIgaW4gYSBkaXNwYXRjaGVyIHRoYXQgY2FuIGRvd25ncmFkZS91cGdyYWRlIGZvciBhbiBvbGRlciBwbGF0Zm9ybS5cbiAgICAgIGlmIChWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIubmVlZHNWZXJzaW9uQ29udmVydGVyKHBsYXRmb3JtVmVyc2lvbikpIHtcbiAgICAgICAgZGlzcGF0Y2hlciA9IG5ldyBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIoZGlzcGF0Y2hlciwgcGxhdGZvcm1WZXJzaW9uKTtcbiAgICAgIH1cbiAgICAgIC8vIFJlZ2lzdHJhdGlvbiBvZiBzZXJ2aWNlcyBtdXN0IGhhcHBlbiBiZWZvcmUgaW5pdGlhbGl6aW5nIGNvbnRlbnQgYW5kIGVudmlyb25tZW50XG4gICAgICAvLyBFeHRlbnNpb25zIGRvZXNuJ3QgbmVlZCB0byBwYXNzIGluIGEgcmVnaXN0cnlJZC4gQnkgZGVmYXVsdCwgdGhlIHNlcnZpY2UgcmVnaXN0cnkgaW5zdGFuY2UgaXMgYXNzb2NpYXRlZCB3aXRoIHJlZ2lzdHJ5SWQ9MC5cbiAgICAgIHJlZ2lzdGVyQWxsU2hhcmVkU2VydmljZXMoZGlzcGF0Y2hlciwgRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpO1xuICAgICAgcmVnaXN0ZXJBbGxFeHRlbnNpb25zU2VydmljZXMoZGlzcGF0Y2hlcik7XG5cbiAgICAgIGlmIChyZXN1bHQuZXh0ZW5zaW9uRGFzaGJvYXJkSW5mbyAmJiB0aGlzLmlzRGFzaGJvYXJkRXh0ZW5zaW9uTG9jYXRvcihyZXN1bHQuZXh0ZW5zaW9uSW5zdGFuY2UubG9jYXRvcikpIHtcbiAgICAgICAgdGhpcy5kYXNoYm9hcmRDb250ZW50ID0gdGhpcy5pbml0aWFsaXplRGFzaGJvYXJkQ29udGVudChcbiAgICAgICAgICByZXN1bHQuZXh0ZW5zaW9uRGFzaGJvYXJkSW5mbyxcbiAgICAgICAgICByZXN1bHQuZXh0ZW5zaW9uSW5zdGFuY2UubG9jYXRvci5kYXNoYm9hcmRQYXRoLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmV4dGVuc2lvblpvbmVJZCA9IHJlc3VsdC5leHRlbnNpb25EYXNoYm9hcmRJbmZvLmV4dGVuc2lvblpvbmVJZDtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc3VsdC5leHRlbnNpb25Xb3Jrc2hlZXRJbmZvKSB7XG4gICAgICAgIHRoaXMud29ya3NoZWV0Q29udGVudCA9IHRoaXMuaW5pdGlhbGl6ZVdvcmtzaGVldENvbnRlbnQocmVzdWx0LmV4dGVuc2lvbldvcmtzaGVldEluZm8pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmVudmlyb25tZW50ID0gbmV3IEVudmlyb25tZW50KHJlc3VsdC5leHRlbnNpb25FbnZpcm9ubWVudCk7XG4gICAgICB0aGlzLnNldHRpbmdzID0gdGhpcy5pbml0aWFsaXplU2V0dGluZ3MocmVzdWx0LmV4dGVuc2lvblNldHRpbmdzSW5mbyk7XG4gICAgICB0aGlzLnVpID0gbmV3IFVJKG5ldyBVSUltcGwoKSk7XG4gICAgICB0aGlzLndvcmtib29rID0gbmV3IFdvcmtib29rKG5ldyBFeHRlbnNpb25Xb3JrYm9va0ltcGwoKSk7XG5cbiAgICAgIGlmIChyZXN1bHQuZXh0ZW5zaW9uRW52aXJvbm1lbnQud29ya2Jvb2tGb3JtYXR0aW5nKSB7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZVRhYmxlYXVGb250cyhkaXNwYXRjaGVyLCByZXN1bHQuZXh0ZW5zaW9uRW52aXJvbm1lbnQud29ya2Jvb2tGb3JtYXR0aW5nKTtcbiAgICAgICAgdGhpcy5hcHBseUFsbEZvcm1hdHRpbmcocmVzdWx0LmV4dGVuc2lvbkVudmlyb25tZW50Lndvcmtib29rRm9ybWF0dGluZyk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFmdGVyIGluaXRpYWxpemF0aW9uIGhhcyBjb21wbGV0ZWQsIHNldHVwIGxpc3RlbmVycyBmb3IgdGhlIGNhbGxiYWNrIGZ1bmN0aW9ucyB0aGF0XG4gICAgICAvLyBhcmUgbWVhbnQgdG8gYmUgdHJpZ2dlcmVkIHdoZW5ldmVyIGEgY29udGV4dCBtZW51IGl0ZW0gaXMgY2xpY2tlZC5cbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUNvbnRleHRNZW51Q2FsbGJhY2tzKGNvbnRleHRNZW51RnVuY3Rpb25zKTtcblxuICAgICAgLy8gQWxzbyBzZXQgdXAgbGlzdGVuZXJzIGZvciBFeHRlbnNpb25TdHlsZXNDaGFuZ2VkRXZlbnRcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZVdvcmtib29rRm9ybWF0dGluZ0NoYW5nZWRFdmVudENhbGxiYWNrKGRpc3BhdGNoZXIpO1xuXG4gICAgICAvLyBJbiB0aGUgbm9ybWFsIGluaXRpYWxpemF0aW9uIGNhc2UsIHRoaXMgd2lsbCBiZSBhbiBlbXB0eSBzdHJpbmcuICBXaGVuIHJldHVybmluZyBmcm9tIGluaXRpYWxpemVBc3luYyB0byB0aGVcbiAgICAgIC8vIGRldmVsb3Blciwgd2UganVzdCBpbmdvcmUgdGhhdCBzdHJpbmcuICBJbiB0aGUgY2FzZSBvZiBpbml0aWFsaXppbmcgZnJvbSBhbiBleHRlbnNpb24gZGlhbG9nLCB0aGlzIHN0cmluZ1xuICAgICAgLy8gaXMgYW4gb3B0aW9uYWwgcGF5bG9hZCBzZW50IGZyb20gdGhlIHBhcmVudCBleHRlbnNpb24uXG4gICAgICByZXR1cm4gcmVzdWx0LmV4dGVuc2lvbkRpYWxvZ1BheWxvYWQ7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlBbGxGb3JtYXR0aW5nKGZvcm1hdHRpbmdNb2RlbDogV29ya2Jvb2tGb3JtYXR0aW5nIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9zdHlsZUVsZW1lbnQpIHtcbiAgICAgIHRoaXMuX3N0eWxlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICB0aGlzLl9zdHlsZUVsZW1lbnQuaWQgPSAnVGFibGVhdS1FeHRlbnNpb24tRm9ybWF0dGluZyc7XG4gICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHRoaXMuX3N0eWxlRWxlbWVudCk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9zdHlsZUVsZW1lbnQuc2hlZXQgfHwgIWZvcm1hdHRpbmdNb2RlbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHN0eWxlc2hlZXQ6IENTU1N0eWxlU2hlZXQgPSB0aGlzLl9zdHlsZUVsZW1lbnQuc2hlZXQgYXMgQ1NTU3R5bGVTaGVldDtcbiAgICB3aGlsZSAoc3R5bGVzaGVldC5jc3NSdWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICBzdHlsZXNoZWV0LmRlbGV0ZVJ1bGUoc3R5bGVzaGVldC5jc3NSdWxlcy5sZW5ndGggLSAxKTtcbiAgICB9XG4gICAgZm9ybWF0dGluZ01vZGVsLmZvcm1hdHRpbmdTaGVldHMubWFwKChjdXJyZW50Rm9ybWF0dGluZ1NoZWV0KSA9PiB7XG4gICAgICB0aGlzLmFwcGx5Rm9ybWF0dGluZ1NoZWV0VG9TdHlsZVNoZWV0KGN1cnJlbnRGb3JtYXR0aW5nU2hlZXQsIHN0eWxlc2hlZXQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseUZvcm1hdHRpbmdTaGVldFRvU3R5bGVTaGVldChjdXJyZW50Rm9ybWF0dGluZ1NoZWV0OiBGb3JtYXR0aW5nU2hlZXQsIHN0eWxlc2hlZXQ6IENTU1N0eWxlU2hlZXQpOiB2b2lkIHtcbiAgICBsZXQgc3R5bGVJbmZvID0gJyc7XG5cbiAgICBjb25zdCBjc3NQcm9wZXJ0aWVzID0gY3VycmVudEZvcm1hdHRpbmdTaGVldC5jc3NQcm9wZXJ0aWVzO1xuICAgIGlmIChjc3NQcm9wZXJ0aWVzLmZvbnRGYW1pbHkpIHtcbiAgICAgIHN0eWxlSW5mbyArPSAnZm9udC1mYW1pbHk6ICcgKyBjc3NQcm9wZXJ0aWVzLmZvbnRGYW1pbHkudG9TdHJpbmcoKSArICc7ICc7XG4gICAgfVxuXG4gICAgaWYgKGNzc1Byb3BlcnRpZXMuZm9udFNpemUpIHtcbiAgICAgIHN0eWxlSW5mbyArPSAnZm9udC1zaXplOiAnICsgY3NzUHJvcGVydGllcy5mb250U2l6ZS50b1N0cmluZygpICsgJzsgJztcbiAgICB9XG5cbiAgICBpZiAoY3NzUHJvcGVydGllcy5mb250V2VpZ2h0KSB7XG4gICAgICBzdHlsZUluZm8gKz0gJ2ZvbnQtd2VpZ2h0OiAnICsgY3NzUHJvcGVydGllcy5mb250V2VpZ2h0LnRvU3RyaW5nKCkgKyAnOyAnO1xuICAgIH1cblxuICAgIGlmIChjc3NQcm9wZXJ0aWVzLmZvbnRTdHlsZSkge1xuICAgICAgc3R5bGVJbmZvICs9ICdmb250LXN0eWxlOiAnICsgY3NzUHJvcGVydGllcy5mb250U3R5bGUudG9TdHJpbmcoKSArICc7ICc7XG4gICAgfVxuXG4gICAgaWYgKGNzc1Byb3BlcnRpZXMudGV4dERlY29yYXRpb24pIHtcbiAgICAgIHN0eWxlSW5mbyArPSAndGV4dC1kZWNvcmF0aW9uOiAnICsgY3NzUHJvcGVydGllcy50ZXh0RGVjb3JhdGlvbi50b1N0cmluZygpICsgJzsgJztcbiAgICB9XG5cbiAgICBpZiAoY3NzUHJvcGVydGllcy5jb2xvcikge1xuICAgICAgc3R5bGVJbmZvICs9ICdjb2xvcjogJyArIGNzc1Byb3BlcnRpZXMuY29sb3IgKyAnOyAnO1xuICAgIH1cblxuICAgIGNvbnN0IHNlbGVjdG9yOiBzdHJpbmcgPSAnLicgKyBjdXJyZW50Rm9ybWF0dGluZ1NoZWV0LmNsYXNzTmFtZUtleTtcbiAgICBjb25zdCBydWxlOiBzdHJpbmcgPSBzZWxlY3RvciArICcgeyAnICsgc3R5bGVJbmZvICsgJyB9JztcbiAgICBzdHlsZXNoZWV0Lmluc2VydFJ1bGUocnVsZSwgc3R5bGVzaGVldC5jc3NSdWxlcy5sZW5ndGgpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50Q2FsbGJhY2soZGlzcGF0Y2hlcjogSW50ZXJuYWxBcGlEaXNwYXRjaGVyKTogdm9pZCB7XG4gICAgY29uc3Qgbm90aWZpY2F0aW9uU2VydmljZTogTm90aWZpY2F0aW9uU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8Tm90aWZpY2F0aW9uU2VydmljZT4oXG4gICAgICBTZXJ2aWNlTmFtZXMuTm90aWZpY2F0aW9uLFxuICAgICk7XG4gICAgLy8gVW5yZWdpc3RlciBmdW5jdGlvbiBub3QgdXNlZCBzaW5jZSB0aGVzZSBub3RpZmljYXRpb25zIHNob3VsZCBiZVxuICAgIC8vIG9ic2VydmVkIGZvciB0aGUgZnVsbCBsaWZldGltZSBvZiB0aGUgZXh0ZW5zaW9uLlxuICAgIG5vdGlmaWNhdGlvblNlcnZpY2UucmVnaXN0ZXJIYW5kbGVyKFxuICAgICAgTm90aWZpY2F0aW9uSWQuV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZCxcbiAgICAgICgpID0+IHRydWUsXG4gICAgICAoZXZlbnRGb3JtYXR0aW5nOiBXb3JrYm9va0Zvcm1hdHRpbmcpID0+IHtcbiAgICAgICAgaWYgKGV2ZW50Rm9ybWF0dGluZykge1xuICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZVRhYmxlYXVGb250cyhkaXNwYXRjaGVyLCBldmVudEZvcm1hdHRpbmcpO1xuICAgICAgICAgIHRoaXMuYXBwbHlBbGxGb3JtYXR0aW5nKGV2ZW50Rm9ybWF0dGluZyk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZVRhYmxlYXVGb250cyhkaXNwYXRjaGVyOiBJbnRlcm5hbEFwaURpc3BhdGNoZXIsIHdvcmtib29rRm9ybWF0dGluZzogV29ya2Jvb2tGb3JtYXR0aW5nKTogdm9pZCB7XG4gICAgY29uc3QgZm9udE5hbWVzOiBNb2RlbFtdID0gWy4uLlN1cHBvcnRlZEJlbnRvblNhbnNGb250RmFjZXMsIC4uLlN1cHBvcnRlZFRhYmxlYXVGb250RmFjZXNdO1xuICAgIHdvcmtib29rRm9ybWF0dGluZy5mb3JtYXR0aW5nU2hlZXRzLmZvckVhY2goKGZvcm1hdHRpbmdTaGVldCkgPT4ge1xuICAgICAgaWYgKGZvcm1hdHRpbmdTaGVldC5jc3NQcm9wZXJ0aWVzLmZvbnRGYW1pbHkpIHtcbiAgICAgICAgZm9udE5hbWVzLnB1c2goZm9ybWF0dGluZ1NoZWV0LmNzc1Byb3BlcnRpZXMuZm9udEZhbWlseSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoZm9udE5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0geyBbUGFyYW1ldGVySWQuRm9udE5hbWVMaXN0SXRlbXNdOiBmb250TmFtZXMgfTtcbiAgICAgIGRpc3BhdGNoZXJcbiAgICAgICAgLmV4ZWN1dGUoVmVyYklkLkdldEZvbnRzLCBwYXJhbWV0ZXJzKVxuICAgICAgICAudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICB0aGlzLmxvYWRGb250cyhyZXNwb25zZS5yZXN1bHQgYXMgQXJyYXk8Rm9udE5hbWVBbmRJbmZvPik7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbG9hZEZvbnRzKGZvbnRzOiBBcnJheTxGb250TmFtZUFuZEluZm8+KTogdm9pZCB7XG4gICAgZm9udHMuZm9yRWFjaCgoZm9udE5hbWVBbmRJbmZvKSA9PiB7XG4gICAgICBpZiAoU3VwcG9ydGVkVGFibGVhdUZvbnRGYWNlcy5pbmNsdWRlcyhmb250TmFtZUFuZEluZm8uZm9udE5hbWUpKSB7XG4gICAgICAgIHRoaXMubG9hZFRhYmxlYXVGb250cyhmb250TmFtZUFuZEluZm8pO1xuICAgICAgfSBlbHNlIGlmIChTdXBwb3J0ZWRCZW50b25TYW5zRm9udEZhY2VzLmluY2x1ZGVzKGZvbnROYW1lQW5kSW5mby5mb250TmFtZSkpIHtcbiAgICAgICAgdGhpcy5sb2FkQmVudG9uU2Fuc0ZvbnRzKGZvbnROYW1lQW5kSW5mbyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQobmV3IEZvbnRGYWNlKGZvbnROYW1lQW5kSW5mby5mb250TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVEYXNoYm9hcmRDb250ZW50KGluZm86IEV4dGVuc2lvbkRhc2hib2FyZEluZm8sIHNoZWV0UGF0aDogU2hlZXRQYXRoKTogRGFzaGJvYXJkQ29udGVudCB7XG4gICAgLy8gc2hlZXRzIGFyZSBhbHdheXMgYWN0aXZlIGZvciBFeHRlbnNpb25zXG4gICAgY29uc3Qgc2hlZXRJbmZvSW1wbCA9IG5ldyBTaGVldEluZm9JbXBsKGluZm8ubmFtZSwgU2hlZXRUeXBlLkRhc2hib2FyZCwgeyB3aWR0aDogaW5mby5zaXplLncsIGhlaWdodDogaW5mby5zaXplLmggfSwgdW5kZWZpbmVkLCB0cnVlKTtcbiAgICBjb25zdCBkYXNoYm9hcmRJbXBsID0gbmV3IERhc2hib2FyZEltcGwoc2hlZXRJbmZvSW1wbCwgaW5mby56b25lcywgc2hlZXRQYXRoLCBFeHRlbnNpb25zUmVnaXN0cnlJZCwgbnVsbCwgaW5mby5hY3RpdmVEYXNoYm9hcmRPYmplY3RJZCk7XG4gICAgY29uc3QgZGFzaGJvYXJkID0gbmV3IERhc2hib2FyZChkYXNoYm9hcmRJbXBsKTtcbiAgICByZXR1cm4gbmV3IERhc2hib2FyZENvbnRlbnQoZGFzaGJvYXJkKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZVdvcmtzaGVldENvbnRlbnQoaW5mbzogRXh0ZW5zaW9uV29ya3NoZWV0SW5mbyk6IFdvcmtzaGVldENvbnRlbnQge1xuICAgIGNvbnN0IHNoZWV0SW5mb0ltcGwgPSBuZXcgU2hlZXRJbmZvSW1wbChcbiAgICAgIGluZm8udmlzdWFsSWQud29ya3NoZWV0LFxuICAgICAgU2hlZXRUeXBlLldvcmtzaGVldCxcbiAgICAgIHsgd2lkdGg6IGluZm8uc2l6ZS53LCBoZWlnaHQ6IGluZm8uc2l6ZS5oIH0sXG4gICAgICB1bmRlZmluZWQsIC8vIGluZGV4IHByb3BlcnR5IGlzIGVtYmVkZGluZyBzcGVjaWZpY1xuICAgICAgdHJ1ZSwgLy8gc2hlZXRzIGFyZSBhbHdheXMgYWN0aXZlIGZvciBFeHRlbnNpb25zXG4gICAgKTtcblxuICAgIGNvbnN0IHdvcmtzaGVldEltcGwgPSBuZXcgV29ya3NoZWV0SW1wbChcbiAgICAgIHNoZWV0SW5mb0ltcGwsXG4gICAgICBFeHRlbnNpb25zUmVnaXN0cnlJZCxcbiAgICAgIGluZm8udmlzdWFsSWQsXG4gICAgICBudWxsLCAvLyBwYXJlbnREYXNoYm9hcmQgaXMgYWx3YXlzIG51bGwgZm9yIHdvcmtzaGVldCBpbiBXb3Jrc2hlZXRDb250ZW50XG4gICAgICBudWxsLCAvLyBwYXJlbnRTdG9yeVBvaW50IGlzIG9ubHkgdXNlZCBmb3IgZW1iZWRkaW5nXG4gICAgICBpbmZvLmJhY2tncm91bmRDb2xvcixcbiAgICAgIFdvcmtib29rRm9ybWF0dGluZ0VudlV0aWwuY29udmVydFRvV29ya2Jvb2tGb3JtYXR0aW5nKGluZm8uZm9ybWF0dGluZyksXG4gICAgKTtcbiAgICBjb25zdCB3b3Jrc2hlZXQgPSBuZXcgV29ya3NoZWV0KHdvcmtzaGVldEltcGwpO1xuICAgIHJldHVybiBuZXcgV29ya3NoZWV0Q29udGVudCh3b3Jrc2hlZXQpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplU2V0dGluZ3Moc2V0dGluZ3NJbmZvOiBFeHRlbnNpb25TZXR0aW5nc0luZm8pOiBTZXR0aW5ncyB7XG4gICAgY29uc3Qgc2V0dGluZ3NJbXBsID0gbmV3IFNldHRpbmdzSW1wbChzZXR0aW5nc0luZm8pO1xuICAgIHJldHVybiBuZXcgU2V0dGluZ3Moc2V0dGluZ3NJbXBsKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUNvbnRleHRNZW51Q2FsbGJhY2tzKGNvbnRleHRNZW51RnVuY3Rpb25zPzogQ2FsbGJhY2tNYXApOiB2b2lkIHtcbiAgICBjb25zdCBub3RpZmljYXRpb25TZXJ2aWNlOiBOb3RpZmljYXRpb25TZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxOb3RpZmljYXRpb25TZXJ2aWNlPihcbiAgICAgIFNlcnZpY2VOYW1lcy5Ob3RpZmljYXRpb24sXG4gICAgKTtcblxuICAgIC8vIFVucmVnaXN0ZXIgZnVuY3Rpb24gbm90IHVzZWQgc2luY2UgdGhlc2Ugbm90aWZpY2F0aW9ucyBzaG91bGQgYmVcbiAgICAvLyBvYnNlcnZlZCBmb3IgdGhlIGZ1bGwgbGlmZXRpbWUgb2YgdGhlIGV4dGVuc2lvbi5cbiAgICBub3RpZmljYXRpb25TZXJ2aWNlLnJlZ2lzdGVySGFuZGxlcihcbiAgICAgIE5vdGlmaWNhdGlvbklkLkNvbnRleHRNZW51Q2xpY2ssXG4gICAgICAoKSA9PiB7XG4gICAgICAgIC8vIExldCB0aHJvdWdoIGFueSBjb250ZXh0IG1lbnUgZXZlbnQsIHRoZXNlIGFyZSBhbHJlYWR5IGZpbHRlcmVkIG9uIGFwaS1jb3JlXG4gICAgICAgIC8vIGJhc2VkIG9uIHRoZSBleHRlbnNpb24gbG9jYXRvci5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9LFxuICAgICAgKGV2ZW50OiBDb250ZXh0TWVudUV2ZW50KSA9PiB7XG4gICAgICAgIC8vIEV4ZWN1dGUgdGhlIGZ1bmN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbnRleHQgbWVudSBJRFxuICAgICAgICBpZiAoY29udGV4dE1lbnVGdW5jdGlvbnMpIHtcbiAgICAgICAgICBpZiAoIWNvbnRleHRNZW51RnVuY3Rpb25zW2V2ZW50LmlkXSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludGVybmFsRXJyb3IsIGBSZWNlaXZlZCB1bmV4cGVjdGVkIGNvbnRleHQgbWVudSBJZCBmcm9tIGV2ZW50OiAke2V2ZW50LmlkfWApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnRleHRNZW51RnVuY3Rpb25zW2V2ZW50LmlkXSgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGxvYWRUYWJsZWF1Rm9udHMoZm9udE5hbWVBbmRJbmZvOiBGb250TmFtZUFuZEluZm8pOiB2b2lkIHtcbiAgICBzd2l0Y2ggKGZvbnROYW1lQW5kSW5mby5mb250TmFtZSkge1xuICAgICAgY2FzZSBUYWJsZWF1Qm9va0ZvbnRGYWNlTmFtZTpcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKG5ldyBGb250RmFjZShUYWJsZWF1Qm9va0ZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnbm9ybWFsJywgc3R5bGU6ICdub3JtYWwnIH0pKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVGFibGVhdUxpZ2h0Rm9udEZhY2VOYW1lOlxuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQobmV3IEZvbnRGYWNlKFRhYmxlYXVMaWdodEZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnbm9ybWFsJywgc3R5bGU6ICdub3JtYWwnIH0pKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVGFibGVhdVJlZ3VsYXJGb250RmFjZU5hbWU6XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChcbiAgICAgICAgICBuZXcgRm9udEZhY2UoVGFibGVhdVJlZ3VsYXJGb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHdlaWdodDogJ25vcm1hbCcsIHN0eWxlOiAnbm9ybWFsJyB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVGFibGVhdVNlbWlCb2xkRm9udEZhY2VOYW1lOlxuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQoXG4gICAgICAgICAgbmV3IEZvbnRGYWNlKFRhYmxlYXVTZW1pYm9sZEZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnbm9ybWFsJywgc3R5bGU6ICdub3JtYWwnIH0pLFxuICAgICAgICApO1xuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQobmV3IEZvbnRGYWNlKFRhYmxlYXVSZWd1bGFyRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdib2xkJywgc3R5bGU6ICdub3JtYWwnIH0pKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVGFibGVhdUJvbGRGb250RmFjZU5hbWU6XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChuZXcgRm9udEZhY2UoVGFibGVhdUJvbGRGb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHdlaWdodDogJ25vcm1hbCcsIHN0eWxlOiAnbm9ybWFsJyB9KSk7XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChuZXcgRm9udEZhY2UoVGFibGVhdUJvbGRGb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHdlaWdodDogJ2JvbGQnLCBzdHlsZTogJ25vcm1hbCcgfSkpO1xuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQobmV3IEZvbnRGYWNlKFRhYmxlYXVNZWRpdW1Gb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHdlaWdodDogJ2JvbGQnLCBzdHlsZTogJ25vcm1hbCcgfSkpO1xuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQoXG4gICAgICAgICAgbmV3IEZvbnRGYWNlKFRhYmxlYXVTZW1pYm9sZEZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnYm9sZCcsIHN0eWxlOiAnbm9ybWFsJyB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVGFibGVhdU1lZGl1bUZvbnRGYWNlTmFtZTpcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKFxuICAgICAgICAgIG5ldyBGb250RmFjZShUYWJsZWF1TWVkaXVtRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdub3JtYWwnLCBzdHlsZTogJ25vcm1hbCcgfSksXG4gICAgICAgICk7XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChuZXcgRm9udEZhY2UoVGFibGVhdUxpZ2h0Rm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdib2xkJywgc3R5bGU6ICdub3JtYWwnIH0pKTtcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKG5ldyBGb250RmFjZShUYWJsZWF1Qm9va0ZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnYm9sZCcsIHN0eWxlOiAnbm9ybWFsJyB9KSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYCdhdHRlbXB0ZWQgdG8gbG9hZCB1bnN1cHBvcnRlZCBmb250OiAke2ZvbnROYW1lQW5kSW5mby5mb250TmFtZX0uJ2ApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbG9hZEJlbnRvblNhbnNGb250cyhmb250TmFtZUFuZEluZm86IEZvbnROYW1lQW5kSW5mbyk6IHZvaWQge1xuICAgIHN3aXRjaCAoZm9udE5hbWVBbmRJbmZvLmZvbnROYW1lKSB7XG4gICAgICBjYXNlIEJlbnRvblNhbnNCb29rRm9udEZhY2VOYW1lOlxuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQobmV3IEZvbnRGYWNlKEJlbnRvblNhbnNGb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHdlaWdodDogJ25vcm1hbCcsIHN0eWxlOiAnbm9ybWFsJyB9KSk7XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChcbiAgICAgICAgICBuZXcgRm9udEZhY2UoQmVudG9uU2Fuc0xvd0RQSUZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnMTAwJywgc3R5bGU6ICdub3JtYWwnIH0pLFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBCZW50b25TYW5zTGlnaHRGb250RmFjZU5hbWU6XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChuZXcgRm9udEZhY2UoQmVudG9uU2Fuc0ZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnMTAwJywgc3R5bGU6ICdub3JtYWwnIH0pKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgQmVudG9uU2Fuc01lZGl1bUZvbnRGYWNlTmFtZTpcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKG5ldyBGb250RmFjZShCZW50b25TYW5zRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdib2xkJywgc3R5bGU6ICdub3JtYWwnIH0pKTtcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKFxuICAgICAgICAgIG5ldyBGb250RmFjZShCZW50b25TYW5zTG93RFBJRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdib2xkJywgc3R5bGU6ICdub3JtYWwnIH0pLFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBCZW50b25TYW5zU2VtaURlbWlGb250RmFjZU5hbWU6XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChcbiAgICAgICAgICBuZXcgRm9udEZhY2UoQmVudG9uU2Fuc0xvd0RQSUZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnbm9ybWFsJywgc3R5bGU6ICdub3JtYWwnIH0pLFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBCZW50b25TYW5zQm9va0l0YWxpY0ZvbnRGYWNlTmFtZTpcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKG5ldyBGb250RmFjZShCZW50b25TYW5zRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyBzdHlsZTogJ2l0YWxpYycgfSkpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBCZW50b25TYW5zU2VtaURlbWlJdGFsaWNGb250RmFjZU5hbWU6XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChuZXcgRm9udEZhY2UoQmVudG9uU2Fuc0xvd0RQSUZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgc3R5bGU6ICdpdGFsaWMnIH0pKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgJ2F0dGVtcHRlZCB0byBsb2FkIHVuc3VwcG9ydGVkIGZvbnQ6ICR7Zm9udE5hbWVBbmRJbmZvLmZvbnROYW1lfS4nYCk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBJbml0aWFsaXphdGlvbk9wdGlvbnMsIEludGVybmFsQXBpRGlzcGF0Y2hlckZhY3RvcnksIElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT04sIFZlcmJJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbi8qKlxuICogTGVnYWN5SW50ZXJuYWxBcGlEaXNwYXRjaGVySG9sZGVyIGhhcyBiZWVuIG1vdmVkIChhbmQgcmVuYW1lZCkgZnJvbSBhcGktaW50ZXJuYWwtY29udHJhY3QuXG4gKiBJdCBzdXBwb3J0cyBydW5uaW5nIGEgbmV3ZXIgZXh0ZXJuYWwgbGlicmFyeSBhZ2FpbnN0IGEgcHJlIDIwMTkuMyBkZXNrdG9wLlxuICogU3RhcnRpbmcgaW4gMjAxOS4zLCB3ZSBoYXZlIGEgbWVyZ2VkIGJvb3RzdHJhcCBzdHlsZSBmb3IgYm90aCBkZXNrdG9wIGFuZCBzZXJ2ZXIuXG4gKiBJbiBhZGRpdGlvbiwgdGhlIGFscGhhIGNoZWNraW5nIHRoYXQgaXMgaGFwcGVuaW5nIGhlcmUgaXMgbm90IG5lY2Vzc2FyeSBpbiBleHRlcm5hbC1hcGktanNcbiAqICBhZnRlciAyMDE5LjMgYmVjYXVzZSB0aGF0IGNoZWNraW5nIGhhcHBlbnMgaW4gYXBpLXBsYXRmb3JtLWpzIChBcGlEaXNwYXRjaGVyVGVzdC50cylcbiAqIFRGU0lEOiAxMDkxNTYxIHRyYWNrcyBhbiBpbXByb3ZlbWVudCB0byB0aGlzIHN5c3RlbSB0byBtYWtlIGl0IGxlc3MgY29tcGxleCBhbmQgdGllIGl0IGRpcmVjdGx5IHRvXG4gKiAgdGFibGVhdSBiZXRhIHJlbGVhc2UgdmVyc2lvbnMuXG4gKiBAZGVwcmVjYXRlZFxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5hbWVzcGFjZVxuZXhwb3J0IG5hbWVzcGFjZSBMZWdhY3lJbnRlcm5hbEFwaURpc3BhdGNoZXJIb2xkZXIge1xuICAvKipcbiAgICogQHBhcmFtIG9wdGlvbnNcbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiBnZXREZXNrdG9wRGlzcGF0Y2hlclByb21pc2Uob3B0aW9ucz86IEluaXRpYWxpemF0aW9uT3B0aW9ucyk6IFByb21pc2U8SW50ZXJuYWxBcGlEaXNwYXRjaGVyRmFjdG9yeT4gfCB1bmRlZmluZWQge1xuICAgIGlmICgoIW9wdGlvbnMgfHwgdHlwZW9mIG9wdGlvbnMuaXNBbHBoYSA9PT0gJ3VuZGVmaW5lZCcpICYmICF3aW5kb3cuX193YXJuaW5nSXNzdWVkKSB7XG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKCdUaGlzIGlzIGEgYmV0YSB2ZXJzaW9uIG9mIHRoZSBFeHRlbnNpb25zIEFQSS4gUGxlYXNlIHVwZ3JhZGUgdG8gYW4gb2ZmaWNpYWwgcmVsZWFzZS4nKTtcbiAgICAgIHdpbmRvdy5fX3dhcm5pbmdJc3N1ZWQgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAob3B0aW9ucz8uaXNBbHBoYSAmJiB3aW5kb3cuX19wbGF0Zm9ybUlzT2ZmaWNpYWxSZWxlYXNlKSB7XG4gICAgICB3aW5kb3cuX190YWJsZWF1RGVza3RvcERpc3BhdGNoZXJcbiAgICAgICAgLnRoZW4oKGRpc3BhdGNoZXJGYWN0b3J5KSA9PiB7XG4gICAgICAgICAgY29uc3QgZGlzcGF0Y2hlciA9IGRpc3BhdGNoZXJGYWN0b3J5KElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT04pO1xuICAgICAgICAgIGRpc3BhdGNoZXIuZXhlY3V0ZShWZXJiSWQuQmxvY2tFeHRlbnNpb24sIHt9KS5jYXRjaCgpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKTtcbiAgICB9XG5cbiAgICAvLyB0aGlzIHdpbGwgYmUgdW5kZWZpbmVkIGlmIHByb21pc2UgaXMgcmVqZWN0ZWQgb3IgdGhyb3dzXG4gICAgcmV0dXJuIHdpbmRvdy5fX3RhYmxlYXVEZXNrdG9wRGlzcGF0Y2hlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgKi9cbiAgZXhwb3J0IGZ1bmN0aW9uIGhhc0Rlc2t0b3BBcGlEaXNwYXRjaGVyUHJvbWlzZShvcHRpb25zPzogSW5pdGlhbGl6YXRpb25PcHRpb25zKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhZ2V0RGVza3RvcERpc3BhdGNoZXJQcm9taXNlKG9wdGlvbnMpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgX190YWJsZWF1RGVza3RvcERpc3BhdGNoZXI6IFByb21pc2U8SW50ZXJuYWxBcGlEaXNwYXRjaGVyRmFjdG9yeT47XG4gICAgX19wbGF0Zm9ybUlzT2ZmaWNpYWxSZWxlYXNlOiBib29sZWFuO1xuICAgIF9fd2FybmluZ0lzc3VlZDogYm9vbGVhbjtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEV4dGVuc2lvblNldHRpbmdzSW5mbywgTm90aWZpY2F0aW9uSWQsIFNldHRpbmdzRXZlbnQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LFxuICBFcnJvckhlbHBlcnMsXG4gIE5vdGlmaWNhdGlvblNlcnZpY2UsXG4gIFNlcnZpY2VOYW1lcyxcbiAgU2luZ2xlRXZlbnRNYW5hZ2VyLFxuICBTaW5nbGVFdmVudE1hbmFnZXJJbXBsLFxuICBUYWJsZWF1RXJyb3IsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgVGFibGVhdUV2ZW50IH0gZnJvbSAnLi4vRXZlbnRzL1RhYmxlYXVFdmVudCc7XG5pbXBvcnQgeyBFeHRlbnNpb25zU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZXMvRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcyc7XG5pbXBvcnQgeyBFeHRlbnNpb25zUmVnaXN0cnlJZCB9IGZyb20gJy4uL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeVV0aWwnO1xuaW1wb3J0IHsgU2V0dGluZ3NDb2xsZWN0aW9uLCBTZXR0aW5nc1NlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXR0aW5nc1NlcnZpY2UnO1xuXG5jbGFzcyBTZXR0aW5nc0NoYW5nZWRFdmVudCBleHRlbmRzIFRhYmxlYXVFdmVudCBpbXBsZW1lbnRzIENvbnRyYWN0LlNldHRpbmdzQ2hhbmdlZEV2ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX25ld1NldHRpbmdzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9KSB7XG4gICAgc3VwZXIoQ29udHJhY3QuVGFibGVhdUV2ZW50VHlwZS5TZXR0aW5nc0NoYW5nZWQpO1xuICB9XG5cbiAgcHVibGljIGdldCBuZXdTZXR0aW5ncygpOiBTZXR0aW5nc0NvbGxlY3Rpb24ge1xuICAgIHJldHVybiB0aGlzLl9uZXdTZXR0aW5ncztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU2V0dGluZ3NJbXBsIHtcbiAgcHJpdmF0ZSBzdGF0aWMgQVNZTkNfU0FWRV9JTl9QUk9HUkVTUyA9ICdBc3luYyBTYXZlIGlzIGluIHByb2dyZXNzLCB1cGRhdGluZyBzZXR0aW5ncyBpcyBub3QgYWxsb3dlZC4nO1xuICBwcml2YXRlIF9pc01vZGlmaWVkOiBib29sZWFuO1xuICBwcml2YXRlIF9jdXJyZW50U2V0dGluZ3M6IFNldHRpbmdzQ29sbGVjdGlvbjtcblxuICAvLyBTaW5jZSBwcm9taXNlcyBjYW4ndCBiZSBpbnRyb3NwZWN0ZWQgZm9yIHN0YXRlLCBrZWVwIGEgdmFyaWFibGUgdGhhdFxuICAvLyBpbmRpY2F0ZXMgYSBzYXZlIGlzIGluIHByb2dyZXNzLCBzbyB0aGF0IHNldC9lcmFzZSBjYW4ndCBiZSBjYWxsZWQgZHVyaW5nIGEgc2F2ZS5cbiAgcHJpdmF0ZSBfc2F2ZUluUHJvZ3Jlc3MgPSBmYWxzZTtcblxuICBwdWJsaWMgY29uc3RydWN0b3Ioc2V0dGluZ3NJbmZvOiBFeHRlbnNpb25TZXR0aW5nc0luZm8pIHtcbiAgICB0aGlzLmluaXRpYWxpemVTZXR0aW5ncyhzZXR0aW5nc0luZm8pO1xuICB9XG5cbiAgcHVibGljIGVyYXNlKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihrZXksICdrZXknKTtcblxuICAgIC8vIE9ubHkgbWFrZSBhIG1vZGlmaWNhdGlvbiBpZiB3ZSBoYXZlIHRoZSBrZXkgYWxyZWFkeVxuICAgIGlmICh0aGlzLl9jdXJyZW50U2V0dGluZ3Nba2V5XSkge1xuICAgICAgdGhpcy52ZXJpZnlTZXR0aW5nc0FyZVVubG9ja2VkKCk7XG5cbiAgICAgIGRlbGV0ZSB0aGlzLl9jdXJyZW50U2V0dGluZ3Nba2V5XTtcbiAgICAgIHRoaXMuX2lzTW9kaWZpZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQoa2V5OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIoa2V5LCAna2V5Jyk7XG5cbiAgICByZXR1cm4gdGhpcy5fY3VycmVudFNldHRpbmdzW2tleV07XG4gIH1cblxuICBwdWJsaWMgZ2V0QWxsKCk6IFNldHRpbmdzQ29sbGVjdGlvbiB7XG4gICAgLy8gUmV0dXJucyBhIG11dGFibGUgY29weSBvZiB0aGUgc2V0dGluZ3NcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fY3VycmVudFNldHRpbmdzKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNNb2RpZmllZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNNb2RpZmllZDtcbiAgfVxuXG4gIHB1YmxpYyBzYXZlQXN5bmMoKTogUHJvbWlzZTxTZXR0aW5nc0NvbGxlY3Rpb24+IHtcbiAgICB0aGlzLnZlcmlmeVNldHRpbmdzQXJlVW5sb2NrZWQoKTtcblxuICAgIC8vIEp1c3QgcmVzb2x2ZSBpbW1lZGlhdGVseSBpZiBzZXR0aW5ncyBhcmUgdW5jaGFuZ2VkXG4gICAgaWYgKCF0aGlzLl9pc01vZGlmaWVkKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlPFNldHRpbmdzQ29sbGVjdGlvbj4odGhpcy5fY3VycmVudFNldHRpbmdzKTtcbiAgICB9XG5cbiAgICB0aGlzLl9zYXZlSW5Qcm9ncmVzcyA9IHRydWU7XG5cbiAgICAvLyBVc2UgdGhlIHNldHRpbmdzIHNlcnZpY2UgdG8gc2F2ZSBzZXR0aW5ncyB0byB0d2JcbiAgICBjb25zdCBzZXR0aW5nc1NlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFNldHRpbmdzU2VydmljZT4oXG4gICAgICBFeHRlbnNpb25zU2VydmljZU5hbWVzLlNldHRpbmdzU2VydmljZSxcbiAgICApO1xuXG4gICAgcmV0dXJuIHNldHRpbmdzU2VydmljZS5zYXZlU2V0dGluZ3NBc3luYyh0aGlzLl9jdXJyZW50U2V0dGluZ3MpLnRoZW48U2V0dGluZ3NDb2xsZWN0aW9uPihcbiAgICAgIChuZXdTZXR0aW5ncykgPT4ge1xuICAgICAgICB0aGlzLl9zYXZlSW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9pc01vZGlmaWVkID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLl9jdXJyZW50U2V0dGluZ3MgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMuX2N1cnJlbnRTZXR0aW5ncyA9IG5ld1NldHRpbmdzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5fY3VycmVudFNldHRpbmdzLCBuZXdTZXR0aW5ncyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ld1NldHRpbmdzO1xuICAgICAgfSxcbiAgICAgIChyZWFzb24pID0+IHtcbiAgICAgICAgdGhpcy5fc2F2ZUluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHJlYXNvbik7XG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVN0cmluZ1BhcmFtZXRlcihrZXksICdrZXknKTsgLy8gS2V5IHNob3VsZG4ndCBiZSBhbiBlbXB0eSBzdHJpbmcuXG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcih2YWx1ZSwgJ3ZhbHVlJyk7IC8vIEVtcHR5IHN0cmluZyB2YWx1ZSBpcyBhbGxvd2VkLlxuICAgIHRoaXMudmVyaWZ5U2V0dGluZ3NBcmVVbmxvY2tlZCgpO1xuXG4gICAgdGhpcy5fY3VycmVudFNldHRpbmdzW2tleV0gPSB2YWx1ZTtcbiAgICB0aGlzLl9pc01vZGlmaWVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyBhbGwgZXZlbnRzIHJlbGV2YW50IHRvIHNldHRpbmdzIG9iamVjdC4gIFRoaXMgaXMgb25seSBhIHNldHRpbmdzVXBkYXRlIGV2ZW50IGN1cnJlbnRseS5cbiAgICpcbiAgICogQHJldHVybnMge0FycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj59IENvbGxlY3Rpb24gb2YgZXZlbnQgbWFuYWdlcnMgdG8gcGFzcyB0byBhbiBFdmVudExpc3RlbmVyTWFuYWdlci5cbiAgICovXG4gIHB1YmxpYyBpbml0aWFsaXplRXZlbnRzKCk6IEFycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj4ge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBuZXcgQXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPigpO1xuICAgIGxldCBub3RpZmljYXRpb25TZXJ2aWNlOiBOb3RpZmljYXRpb25TZXJ2aWNlO1xuXG4gICAgdHJ5IHtcbiAgICAgIG5vdGlmaWNhdGlvblNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPE5vdGlmaWNhdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5Ob3RpZmljYXRpb24pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgdGhpcyBzZXJ2aWNlIHJlZ2lzdGVyZWQsIGp1c3QgcmV0dXJuXG4gICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9XG5cbiAgICBjb25zdCBzZXR0aW5nc0NoYW5nZWRFdmVudCA9IG5ldyBTaW5nbGVFdmVudE1hbmFnZXJJbXBsPFNldHRpbmdzQ2hhbmdlZEV2ZW50PihDb250cmFjdC5UYWJsZWF1RXZlbnRUeXBlLlNldHRpbmdzQ2hhbmdlZCk7XG4gICAgbm90aWZpY2F0aW9uU2VydmljZS5yZWdpc3RlckhhbmRsZXIoXG4gICAgICBOb3RpZmljYXRpb25JZC5TZXR0aW5nc0NoYW5nZWQsXG4gICAgICAoKSA9PiB0cnVlLFxuICAgICAgKGV2ZW50OiBTZXR0aW5nc0V2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRTZXR0aW5ncyA9IGV2ZW50Lm5ld1NldHRpbmdzO1xuICAgICAgICBzZXR0aW5nc0NoYW5nZWRFdmVudC50cmlnZ2VyRXZlbnQoKCkgPT4gbmV3IFNldHRpbmdzQ2hhbmdlZEV2ZW50KGV2ZW50Lm5ld1NldHRpbmdzKSk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICByZXN1bHRzLnB1c2goc2V0dGluZ3NDaGFuZ2VkRXZlbnQpO1xuXG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVTZXR0aW5ncyhzZXR0aW5nc0luZm86IEV4dGVuc2lvblNldHRpbmdzSW5mbyk6IHZvaWQge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIoc2V0dGluZ3NJbmZvLCAnc2V0dGluZ3NJbmZvJyk7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihzZXR0aW5nc0luZm8uc2V0dGluZ3NWYWx1ZXMsICdzZXR0aW5nc0luZm8uU2V0dGluZ3NWYWx1ZXMnKTtcblxuICAgIHRoaXMuX2N1cnJlbnRTZXR0aW5ncyA9IHNldHRpbmdzSW5mby5zZXR0aW5nc1ZhbHVlcztcblxuICAgIC8vIFJlc2V0IHRoZSBpc01vZGlmaWVkIGZsYWdcbiAgICB0aGlzLl9pc01vZGlmaWVkID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBoZWxwZXIgc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgYW55IGxvY2FsIHVwZGF0ZSB0byB0aGlzLmN1cnJlbnRTZXR0aW5ncy5cbiAgICogQ2hlY2tzIGlmIGEgY3VycmVudCBzYXZlIGNhbGwgaXMgc3RpbGwgaW4gcHJvZ3Jlc3MgYW5kIHRocm93cyBhbiBlcnJvciBpZiBzby5cbiAgICovXG4gIHByaXZhdGUgdmVyaWZ5U2V0dGluZ3NBcmVVbmxvY2tlZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fc2F2ZUluUHJvZ3Jlc3MpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRXJyb3JDb2Rlcy5TZXR0aW5nU2F2ZUluUHJvZ3Jlc3MsIFNldHRpbmdzSW1wbC5BU1lOQ19TQVZFX0lOX1BST0dSRVNTKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IE1vZGVsIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuZXhwb3J0IGNvbnN0IFRhYmxlYXVCb29rRm9udEZhbWlseU5hbWUgPSAnVGFibGVhdSBCb29rJztcbmV4cG9ydCBjb25zdCBUYWJsZWF1TGlnaHRGb250RmFtaWx5TmFtZSA9ICdUYWJsZWF1IExpZ2h0JztcbmV4cG9ydCBjb25zdCBUYWJsZWF1UmVndWxhckZvbnRGYW1pbHlOYW1lID0gJ1RhYmxlYXUgUmVndWxhcic7XG5leHBvcnQgY29uc3QgVGFibGVhdU1lZGl1bUZvbnRGYW1pbHlOYW1lID0gJ1RhYmxlYXUgTWVkaXVtJztcbmV4cG9ydCBjb25zdCBUYWJsZWF1U2VtaWJvbGRGb250RmFtaWx5TmFtZSA9ICdUYWJsZWF1IFNlbWlib2xkJztcbmV4cG9ydCBjb25zdCBUYWJsZWF1Qm9sZEZvbnRGYW1pbHlOYW1lID0gJ1RhYmxlYXUgQm9sZCc7XG5cbmV4cG9ydCBjb25zdCBUYWJsZWF1Qm9va0ZvbnRGYWNlTmFtZSA9ICdUYWJsZWF1IEJvb2snO1xuZXhwb3J0IGNvbnN0IFRhYmxlYXVCb2xkRm9udEZhY2VOYW1lID0gJ1RhYmxlYXUgQm9sZCc7XG5leHBvcnQgY29uc3QgVGFibGVhdUxpZ2h0Rm9udEZhY2VOYW1lID0gJ1RhYmxlYXUgTGlnaHQnO1xuZXhwb3J0IGNvbnN0IFRhYmxlYXVNZWRpdW1Gb250RmFjZU5hbWUgPSAnVGFibGVhdSBNZWRpdW0nO1xuZXhwb3J0IGNvbnN0IFRhYmxlYXVSZWd1bGFyRm9udEZhY2VOYW1lID0gJ1RhYmxlYXUgUmVndWxhcic7XG5leHBvcnQgY29uc3QgVGFibGVhdVNlbWlCb2xkRm9udEZhY2VOYW1lID0gJ1RhYmxlYXUgU2VtaSBCb2xkJztcblxuZXhwb3J0IGNvbnN0IFN1cHBvcnRlZFRhYmxlYXVGb250RmFjZXM6IE1vZGVsW10gPSBbXG4gIFRhYmxlYXVCb29rRm9udEZhY2VOYW1lLFxuICBUYWJsZWF1Qm9sZEZvbnRGYWNlTmFtZSxcbiAgVGFibGVhdUxpZ2h0Rm9udEZhY2VOYW1lLFxuICBUYWJsZWF1TWVkaXVtRm9udEZhY2VOYW1lLFxuICBUYWJsZWF1UmVndWxhckZvbnRGYWNlTmFtZSxcbiAgVGFibGVhdVNlbWlCb2xkRm9udEZhY2VOYW1lLFxuXTtcbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFcnJvckNvZGVzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IERpYWxvZ01lc3NhZ2VFdmVudCBhcyBEaWFsb2dNZXNzYWdlRXZlbnRDb250cmFjdCwgRGlhbG9nVXBkYXRlRXZlbnQsIE5vdGlmaWNhdGlvbklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeSxcbiAgTm90aWZpY2F0aW9uU2VydmljZSxcbiAgU2VydmljZU5hbWVzLFxuICBTaW5nbGVFdmVudE1hbmFnZXIsXG4gIFNpbmdsZUV2ZW50TWFuYWdlckltcGwsXG4gIFRhYmxlYXVFcnJvcixcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXZlbnQgfSBmcm9tICcuLi9FdmVudHMvVGFibGVhdUV2ZW50JztcbmltcG9ydCB7IEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9FeHRlbnNpb25zU2VydmljZU5hbWVzJztcbmltcG9ydCB7IEV4dGVuc2lvbnNSZWdpc3RyeUlkIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5VXRpbCc7XG5pbXBvcnQgeyBVSVNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9VSVNlcnZpY2UnO1xuXG5leHBvcnQgY2xhc3MgRGlhbG9nTWVzc2FnZUV2ZW50IGV4dGVuZHMgVGFibGVhdUV2ZW50IGltcGxlbWVudHMgQ29udHJhY3QuRGlhbG9nTWVzc2FnZUV2ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihDb250cmFjdC5UYWJsZWF1RXZlbnRUeXBlLkRpYWxvZ01lc3NhZ2VSZWNlaXZlZCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFVJSW1wbCB7XG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBwdWJsaWMgZGlzcGxheURpYWxvZ0FzeW5jKHVybDogc3RyaW5nLCBwYXlsb2FkPzogc3RyaW5nLCBvcHRpb25zPzogQ29udHJhY3QuRGlhbG9nT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgdWlTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxVSVNlcnZpY2U+KEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMuVUlTZXJ2aWNlKTtcbiAgICBjb25zdCBub3RpZmljYXRpb25TZXJ2aWNlOiBOb3RpZmljYXRpb25TZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxOb3RpZmljYXRpb25TZXJ2aWNlPihcbiAgICAgIFNlcnZpY2VOYW1lcy5Ob3RpZmljYXRpb24sXG4gICAgKTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB1aVNlcnZpY2VcbiAgICAgICAgLmRpc3BsYXlEaWFsb2dBc3luYyh1cmwsIHBheWxvYWQgfHwgJycsIG9wdGlvbnMpXG4gICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICBjb25zdCB1bnJlZ2lzdGVyRm4gPSBub3RpZmljYXRpb25TZXJ2aWNlLnJlZ2lzdGVySGFuZGxlcihcbiAgICAgICAgICAgIE5vdGlmaWNhdGlvbklkLkV4dGVuc2lvbkRpYWxvZ1VwZGF0ZSxcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgLy8gTGV0IHRocm91Z2ggYW55IGRpYWxvZyB1cGRhdGUgZXZlbnRcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKGV2ZW50OiBEaWFsb2dVcGRhdGVFdmVudCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoZXZlbnQuaXNDbG9zZUV2ZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmNsb3NlUGF5bG9hZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ2Nsb3NlUGF5bG9hZCBpcyB1bmRlZmluZWQnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShldmVudC5jbG9zZVBheWxvYWQpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuRGlhbG9nQ2xvc2VkQnlVc2VyLCAnRXh0ZW5zaW9uIGRpYWxvZyBjbG9zZWQgYnkgdXNlci4nKSk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB1bnJlZ2lzdGVyRm4oKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNlbmREaWFsb2dNZXNzYWdlQXN5bmMobWVzc2FnZTogc3RyaW5nLCB0YXJnZXREaWFsb2dVcmw/OiBzdHJpbmcpIHtcbiAgICBjb25zdCB1aVNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFVJU2VydmljZT4oRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcy5VSVNlcnZpY2UpO1xuXG4gICAgdWlTZXJ2aWNlLnNlbmREaWFsb2dNZXNzYWdlQXN5bmMobWVzc2FnZSwgdGFyZ2V0RGlhbG9nVXJsKTtcbiAgfVxuXG4gIHB1YmxpYyBjbG9zZURpYWxvZyhwYXlsb2FkPzogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgdWlTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxVSVNlcnZpY2U+KEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMuVUlTZXJ2aWNlKTtcblxuICAgIHVpU2VydmljZS5jbG9zZURpYWxvZyhwYXlsb2FkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyBhbGwgZXZlbnRzIHJlbGV2YW50IHRvIFVJIG9iamVjdC5cbiAgICpcbiAgICogQHJldHVybnMge0FycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj59IENvbGxlY3Rpb24gb2YgZXZlbnQgbWFuYWdlcnMgdG8gcGFzcyB0byBhbiBFdmVudExpc3RlbmVyTWFuYWdlci5cbiAgICovXG4gIHB1YmxpYyBpbml0aWFsaXplRXZlbnRzKCk6IEFycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj4ge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBuZXcgQXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPigpO1xuICAgIGxldCBub3RpZmljYXRpb25TZXJ2aWNlOiBOb3RpZmljYXRpb25TZXJ2aWNlO1xuXG4gICAgdHJ5IHtcbiAgICAgIG5vdGlmaWNhdGlvblNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPE5vdGlmaWNhdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5Ob3RpZmljYXRpb24pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgdGhpcyBzZXJ2aWNlIHJlZ2lzdGVyZWQsIGp1c3QgcmV0dXJuXG4gICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9XG5cbiAgICBjb25zdCBkaWFsb2dNZXNzYWdlRXZlbnQgPSBuZXcgU2luZ2xlRXZlbnRNYW5hZ2VySW1wbDxDb250cmFjdC5EaWFsb2dNZXNzYWdlRXZlbnQ+KENvbnRyYWN0LlRhYmxlYXVFdmVudFR5cGUuRGlhbG9nTWVzc2FnZVJlY2VpdmVkKTtcbiAgICBub3RpZmljYXRpb25TZXJ2aWNlLnJlZ2lzdGVySGFuZGxlcihcbiAgICAgIE5vdGlmaWNhdGlvbklkLkV4dGVuc2lvbkRpYWxvZ01lc3NhZ2UsXG4gICAgICAoKSA9PiB0cnVlLFxuICAgICAgKGV2ZW50OiBEaWFsb2dNZXNzYWdlRXZlbnRDb250cmFjdCkgPT4ge1xuICAgICAgICBkaWFsb2dNZXNzYWdlRXZlbnQudHJpZ2dlckV2ZW50KCgpID0+IG5ldyBEaWFsb2dNZXNzYWdlRXZlbnQoZXZlbnQubWVzc2FnZSkpO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgcmVzdWx0cy5wdXNoKGRpYWxvZ01lc3NhZ2VFdmVudCk7XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IERhc2hib2FyZExheW91dENoYW5nZURldGFpbHMsIFRhYmxlYXVFdmVudFR5cGUsIFdvcmtib29rRm9ybWF0dGluZyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRMYXlvdXRFdmVudCwgTm90aWZpY2F0aW9uSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LFxuICBEYXNoYm9hcmRJbXBsLFxuICBEYXNoYm9hcmRPYmplY3RJbXBsLFxuICBOb3RpZmljYXRpb25TZXJ2aWNlLFxuICBTZXJ2aWNlTmFtZXMsXG4gIFNpbmdsZUV2ZW50TWFuYWdlcixcbiAgU2luZ2xlRXZlbnRNYW5hZ2VySW1wbCxcbiAgV29ya3NoZWV0SW1wbCxcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRMYXlvdXRDaGFuZ2VkRXZlbnQgfSBmcm9tICcuLi9FdmVudHMvRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZEV2ZW50JztcbmltcG9ydCB7IFdvcmtib29rRm9ybWF0dGluZ0NoYW5nZWRFdmVudCB9IGZyb20gJy4uL0V2ZW50cy9Xb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkRXZlbnQnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnlVdGlsJztcbmltcG9ydCB7IERhc2hib2FyZE9iamVjdCB9IGZyb20gJy4vRGFzaGJvYXJkT2JqZWN0JztcbmltcG9ydCB7IFNoZWV0IH0gZnJvbSAnLi9TaGVldCc7XG5pbXBvcnQgeyBXb3Jrc2hlZXQgfSBmcm9tICcuL1dvcmtzaGVldCc7XG5cbmV4cG9ydCBjbGFzcyBEYXNoYm9hcmQgZXh0ZW5kcyBTaGVldCBpbXBsZW1lbnRzIENvbnRyYWN0LkV4dGVuc2lvbkRhc2hib2FyZCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9kYXNoYm9hcmRJbXBsOiBEYXNoYm9hcmRJbXBsKSB7XG4gICAgc3VwZXIoX2Rhc2hib2FyZEltcGwpO1xuICAgIF9kYXNoYm9hcmRJbXBsLmluaXRpYWxpemVXaXRoUHVibGljSW50ZXJmYWNlcygpO1xuICAgIHRoaXMuaW5pdGlhbGl6ZUV2ZW50cygpLmZvckVhY2goKGUpID0+IHRoaXMuYWRkTmV3RXZlbnRUeXBlKGUpKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgd29ya3NoZWV0cygpOiBBcnJheTxDb250cmFjdC5FeHRlbnNpb25Xb3Jrc2hlZXQ+IHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkSW1wbC53b3Jrc2hlZXRzSW1wbC5tYXAoKHdvcmtzaGVldEltcGw6IFdvcmtzaGVldEltcGwpID0+IHtcbiAgICAgIHJldHVybiBuZXcgV29ya3NoZWV0KHdvcmtzaGVldEltcGwpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldCBvYmplY3RzKCk6IEFycmF5PENvbnRyYWN0LkV4dGVuc2lvbkRhc2hib2FyZE9iamVjdD4ge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRJbXBsLm9iamVjdHMubWFwKChkYXNoYm9hcmRPYmplY3RJbXBsOiBEYXNoYm9hcmRPYmplY3RJbXBsKSA9PiB7XG4gICAgICByZXR1cm4gbmV3IERhc2hib2FyZE9iamVjdChkYXNoYm9hcmRPYmplY3RJbXBsKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWN0aXZlRGFzaGJvYXJkT2JqZWN0SWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkSW1wbC5hY3RpdmVEYXNoYm9hcmRPYmplY3RJZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWN0aXZlRGFzaGJvYXJkTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRJbXBsLmFjdGl2ZURhc2hib2FyZE5hbWU7XG4gIH1cblxuICBwdWJsaWMgc2V0Wm9uZVZpc2liaWxpdHlBc3luYyh6b25lVmlzaWJpbGl0eU1hcDogQ29udHJhY3QuWm9uZVZpc2liaWxpdHlNYXApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkSW1wbC5zZXREYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5QXN5bmMoem9uZVZpc2liaWxpdHlNYXApO1xuICB9XG5cbiAgcHVibGljIHNldERhc2hib2FyZE9iamVjdFZpc2liaWxpdHlBc3luYyhkYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5TWFwOiBDb250cmFjdC5EYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5TWFwKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZEltcGwuc2V0RGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eUFzeW5jKGRhc2hib2FyZE9iamVjdFZpc2liaWxpdHlNYXApO1xuICB9XG5cbiAgcHVibGljIGdldERhc2hib2FyZE9iamVjdEJ5SWQoZGFzaGJvYXJkT2JqZWN0SWQ6IG51bWJlcik6IERhc2hib2FyZE9iamVjdCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgem9uZSA9IHRoaXMuX2Rhc2hib2FyZEltcGwuZ2V0RGFzaGJvYXJkT2JqZWN0QnlJZChkYXNoYm9hcmRPYmplY3RJZCk7XG4gICAgcmV0dXJuIHpvbmUgJiYgbmV3IERhc2hib2FyZE9iamVjdCh6b25lKTtcbiAgfVxuXG4gIHB1YmxpYyBpbml0aWFsaXplRXZlbnRzKCk6IEFycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj4ge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBuZXcgQXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPigpO1xuXG4gICAgLy8gSW5pdGlhbGl6aW5nIGV2ZW50cyBhbmQgcmVnaXN0ZXJpbmcgbm90aWZpY2F0aW9uIHNlcnZpY2VcbiAgICBsZXQgbm90aWZpY2F0aW9uU2VydmljZTogTm90aWZpY2F0aW9uU2VydmljZTtcblxuICAgIHRyeSB7XG4gICAgICBub3RpZmljYXRpb25TZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxOb3RpZmljYXRpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuTm90aWZpY2F0aW9uKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIHRoaXMgc2VydmljZSByZWdpc3RlcmVkLCBqdXN0IHJldHVybiAoYWxsb3dzIHVuaXQgdGVzdGluZyB3aXRob3V0IE5vdGlmaWNhdGlvblNlcnZpY2UgbW9jaylcbiAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH1cblxuICAgIGNvbnN0IGRhc2hib2FyZExheW91dENoYW5nZWRFdmVudCA9IG5ldyBTaW5nbGVFdmVudE1hbmFnZXJJbXBsPERhc2hib2FyZExheW91dENoYW5nZWRFdmVudD4oVGFibGVhdUV2ZW50VHlwZS5EYXNoYm9hcmRMYXlvdXRDaGFuZ2VkKTtcbiAgICBub3RpZmljYXRpb25TZXJ2aWNlLnJlZ2lzdGVySGFuZGxlcihcbiAgICAgIE5vdGlmaWNhdGlvbklkLkRhc2hib2FyZExheW91dENoYW5nZWQsXG4gICAgICAoKSA9PiB0cnVlLFxuICAgICAgKGV2ZW50OiBEYXNoYm9hcmRMYXlvdXRFdmVudCkgPT4ge1xuICAgICAgICBjb25zdCBkYXNoYm9hcmRPYmplY3RDaGFuZ2VzOiBEYXNoYm9hcmRMYXlvdXRDaGFuZ2VEZXRhaWxzID0gdGhpcy5fZGFzaGJvYXJkSW1wbC51cGRhdGVab25lcyhcbiAgICAgICAgICBldmVudC56b25lcyxcbiAgICAgICAgICBldmVudC5hY3RpdmVab25lSWQsXG4gICAgICAgICAgZXZlbnQuYWN0aXZlRGFzaGJvYXJkTmFtZSxcbiAgICAgICAgKTtcbiAgICAgICAgZGFzaGJvYXJkTGF5b3V0Q2hhbmdlZEV2ZW50LnRyaWdnZXJFdmVudCgoKSA9PiBuZXcgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZEV2ZW50KGRhc2hib2FyZE9iamVjdENoYW5nZXMpKTtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIHJlc3VsdHMucHVzaChkYXNoYm9hcmRMYXlvdXRDaGFuZ2VkRXZlbnQpO1xuXG4gICAgY29uc3Qgd29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50ID0gbmV3IFNpbmdsZUV2ZW50TWFuYWdlckltcGw8V29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50PihcbiAgICAgIFRhYmxlYXVFdmVudFR5cGUuV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZCxcbiAgICApO1xuXG4gICAgbm90aWZpY2F0aW9uU2VydmljZS5yZWdpc3RlckhhbmRsZXIoXG4gICAgICBOb3RpZmljYXRpb25JZC5Xb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkLFxuICAgICAgKCkgPT4gdHJ1ZSxcbiAgICAgIChldmVudEZvcm1hdHRpbmc6IFdvcmtib29rRm9ybWF0dGluZykgPT4ge1xuICAgICAgICB3b3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkRXZlbnQudHJpZ2dlckV2ZW50KCgpID0+IG5ldyBXb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkRXZlbnQoZXZlbnRGb3JtYXR0aW5nKSk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICByZXN1bHRzLnB1c2god29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50KTtcblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG5cbiAgcHVibGljIG1vdmVBbmRSZXNpemVEYXNoYm9hcmRPYmplY3RzQXN5bmMoXG4gICAgZGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlQXJyYXk6IENvbnRyYWN0LkRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUFycmF5LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkSW1wbC5tb3ZlQW5kUmVzaXplRGFzaGJvYXJkT2JqZWN0c0FzeW5jKGRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUFycmF5KTtcbiAgfVxuXG4gIHB1YmxpYyByZXBsYXlBbmltYXRpb25Bc3luYyhyZXBsYXlTcGVlZDogQ29udHJhY3QuUmVwbGF5U3BlZWRUeXBlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZEltcGwucmVwbGF5QW5pbWF0aW9uQXN5bmMocmVwbGF5U3BlZWQpO1xuICB9XG5cbiAgcHVibGljIGdldEZpbHRlcnNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkZpbHRlcj4+IHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkSW1wbC5nZXRGaWx0ZXJzQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseUZpbHRlckFzeW5jKFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHZhbHVlczogQXJyYXk8c3RyaW5nPixcbiAgICB1cGRhdGVUeXBlOiBDb250cmFjdC5GaWx0ZXJVcGRhdGVUeXBlLFxuICAgIG9wdGlvbnM6IENvbnRyYWN0LkZpbHRlck9wdGlvbnMsXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZEltcGwuYXBwbHlGaWx0ZXJBc3luYyhmaWVsZE5hbWUsIHZhbHVlcywgdXBkYXRlVHlwZSwgb3B0aW9ucyk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRPYmplY3RJbXBsIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmQgfSBmcm9tICcuL0Rhc2hib2FyZCc7XG5pbXBvcnQgeyBXb3Jrc2hlZXQgfSBmcm9tICcuL1dvcmtzaGVldCc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGRhc2hib2FyZCBvYmplY3RzIC0gdGhlIHpvbmVzIGluIGEgZGFzaGJvYXJkLlxuICovXG5leHBvcnQgY2xhc3MgRGFzaGJvYXJkT2JqZWN0IGltcGxlbWVudHMgQ29udHJhY3QuRXh0ZW5zaW9uRGFzaGJvYXJkT2JqZWN0IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2Rhc2hib2FyZE9iamVjdEltcGw6IERhc2hib2FyZE9iamVjdEltcGwpIHt9XG5cbiAgcHVibGljIGdldCBkYXNoYm9hcmQoKTogQ29udHJhY3QuRXh0ZW5zaW9uRGFzaGJvYXJkIHtcbiAgICByZXR1cm4gbmV3IERhc2hib2FyZCh0aGlzLl9kYXNoYm9hcmRPYmplY3RJbXBsLmRhc2hib2FyZEltcGwpO1xuICB9XG5cbiAgcHVibGljIGdldCB0eXBlKCk6IENvbnRyYWN0LkRhc2hib2FyZE9iamVjdFR5cGUge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRPYmplY3RJbXBsLnR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBvc2l0aW9uKCk6IENvbnRyYWN0LlBvaW50IHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkT2JqZWN0SW1wbC5wb3NpdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2l6ZSgpOiBDb250cmFjdC5TaXplIHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkT2JqZWN0SW1wbC5zaXplO1xuICB9XG5cbiAgcHVibGljIGdldCB3b3Jrc2hlZXQoKTogQ29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5fZGFzaGJvYXJkT2JqZWN0SW1wbC53b3Jrc2hlZXRJbXBsKSB7XG4gICAgICByZXR1cm4gbmV3IFdvcmtzaGVldCh0aGlzLl9kYXNoYm9hcmRPYmplY3RJbXBsLndvcmtzaGVldEltcGwpO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZE9iamVjdEltcGwubmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNGbG9hdGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkT2JqZWN0SW1wbC5pc0Zsb2F0aW5nO1xuICB9XG5cbiAgcHVibGljIGdldCBpc1Zpc2libGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZE9iamVjdEltcGwuaXNWaXNpYmxlO1xuICB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRPYmplY3RJbXBsLmlkO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWVsZElkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZE9iamVjdEltcGwuZmllbGRJZDtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IE5vdGlmaWNhdGlvbklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeSxcbiAgRXJyb3JIZWxwZXJzLFxuICBFdmVudExpc3RlbmVyTWFuYWdlcixcbiAgTm90aWZpY2F0aW9uU2VydmljZSxcbiAgUGFyYW1ldGVySW1wbCxcbiAgU2VydmljZU5hbWVzLFxuICBTaW5nbGVFdmVudE1hbmFnZXIsXG4gIFNpbmdsZUV2ZW50TWFuYWdlckltcGwsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgUGFyYW1ldGVyQ2hhbmdlZEV2ZW50IH0gZnJvbSAnLi4vRXZlbnRzL1BhcmFtZXRlckNoYW5nZWRFdmVudCc7XG5pbXBvcnQgeyBFeHRlbnNpb25zUmVnaXN0cnlJZCB9IGZyb20gJy4uL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeVV0aWwnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBQYXJhbWV0ZXIgY29udHJhY3QuIENhbGxzIGRvd24gdG8gdGhlIGltcGxcbiAqIGNsYXNzIGZvciBhbG1vc3QgYWxsIG9mIHRoZSB3b3JrIGl0IGRvZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBQYXJhbWV0ZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyTWFuYWdlciBpbXBsZW1lbnRzIENvbnRyYWN0LlBhcmFtZXRlciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHBhcmFtZXRlckltcGw6IFBhcmFtZXRlckltcGwsIHNoZWV0OiBDb250cmFjdC5FeHRlbnNpb25TaGVldCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICAvLyBJbml0aWFsaXplIG91ciBldmVudCBoYW5kbGluZyBmb3IgdGhpcyBjbGFzc1xuICAgIHRoaXMuaW5pdGlhbGl6ZUV2ZW50cyhzaGVldCkuZm9yRWFjaCgoZSkgPT4gdGhpcy5hZGROZXdFdmVudFR5cGUoZSkpO1xuICB9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1ldGVySW1wbC5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBjdXJyZW50VmFsdWUoKTogQ29udHJhY3QuRGF0YVZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5wYXJhbWV0ZXJJbXBsLmN1cnJlbnRWYWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGF0YVR5cGUoKTogQ29udHJhY3QuRGF0YVR5cGUge1xuICAgIHJldHVybiB0aGlzLnBhcmFtZXRlckltcGwuZGF0YVR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFsbG93YWJsZVZhbHVlcygpOiBDb250cmFjdC5QYXJhbWV0ZXJEb21haW5SZXN0cmljdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1ldGVySW1wbC5hbGxvd2FibGVWYWx1ZXM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1ldGVySW1wbC5pZDtcbiAgfVxuXG4gIHB1YmxpYyBjaGFuZ2VWYWx1ZUFzeW5jKG5ld1ZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgRGF0ZSk6IFByb21pc2U8Q29udHJhY3QuRGF0YVZhbHVlPiB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1ldGVySW1wbC5jaGFuZ2VWYWx1ZUFzeW5jKG5ld1ZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgbWV0aG9kIHdoaWNoIGdvZXMgdGhyb3VnaCBhbmQgcmVnaXN0ZXJzIGVhY2ggZXZlbnQgdHlwZSB0aGlzIGltcGwga25vd3MgYWJvdXRcbiAgICogd2l0aCB0aGUgTm90aWZpY2F0aW9uU2VydmljZS4gSXQgcmV0dXJucyBhbiBhcnJheSBvZiBTaW5nbGVFdmVudE1hbmFnZXIgb2JqZWN0cyB3aGljaFxuICAgKiBjYW4gdGhlbiBiZSBwYXNzZWQgdG8gYW4gRXZlbnRMaXN0ZW5lck1hbmFnZXIgdG8gaGFuZGxlIHVzZXIgcmVnaXN0cmF0aW9uIC8gdW5yZWdpc3RyYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBzaGVldCBUaGUgc2hlZXQgb2JqZWN0IHdoaWNoIHdpbGwgYmUgaW5jbHVkZWQgd2l0aCB0aGUgZXZlbnQgbm90aWZpY2F0aW9uc1xuICAgKiBAcmV0dXJucyB7QXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPn0gQ29sbGVjdGlvbiBvZiBldmVudCBtYW5hZ2VycyB0byBwYXNzIHRvIGFuIEV2ZW50TGlzdGVuZXJNYW5hZ2VyXG4gICAqL1xuICBwdWJsaWMgaW5pdGlhbGl6ZUV2ZW50cyhzaGVldDogQ29udHJhY3QuRXh0ZW5zaW9uU2hlZXQpOiBBcnJheTxTaW5nbGVFdmVudE1hbmFnZXI+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5SW50ZXJuYWxWYWx1ZShzaGVldCwgJ3NoZWV0Jyk7XG5cbiAgICBjb25zdCByZXN1bHRzID0gbmV3IEFycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj4oKTtcbiAgICBsZXQgbm90aWZpY2F0aW9uU2VydmljZTogTm90aWZpY2F0aW9uU2VydmljZTtcblxuICAgIHRyeSB7XG4gICAgICBub3RpZmljYXRpb25TZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxOb3RpZmljYXRpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuTm90aWZpY2F0aW9uKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIHRoaXMgc2VydmljZSByZWdpc3RlcmVkLCBqdXN0IHJldHVyblxuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBhbGwgb2YgdGhlIGV2ZW50IG1hbmFnZXJzIHdlJ2xsIG5lZWQgKG9uZSBmb3IgZWFjaCBldmVudCB0eXBlKVxuICAgIGNvbnN0IHBhcmFtZXRlckV2ZW50ID0gbmV3IFNpbmdsZUV2ZW50TWFuYWdlckltcGw8UGFyYW1ldGVyQ2hhbmdlZEV2ZW50PihDb250cmFjdC5UYWJsZWF1RXZlbnRUeXBlLlBhcmFtZXRlckNoYW5nZWQpO1xuICAgIG5vdGlmaWNhdGlvblNlcnZpY2UucmVnaXN0ZXJIYW5kbGVyKFxuICAgICAgTm90aWZpY2F0aW9uSWQuUGFyYW1ldGVyQ2hhbmdlZCxcbiAgICAgIChtb2RlbCkgPT4ge1xuICAgICAgICBjb25zdCBmaWVsZE5hbWUgPSBtb2RlbCBhcyBzdHJpbmc7XG4gICAgICAgIHJldHVybiBmaWVsZE5hbWUgPT09IHRoaXMucGFyYW1ldGVySW1wbC5pZDtcbiAgICAgIH0sXG4gICAgICAoZmllbGROYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgcGFyYW1ldGVyRXZlbnQudHJpZ2dlckV2ZW50KCgpID0+IG5ldyBQYXJhbWV0ZXJDaGFuZ2VkRXZlbnQoZmllbGROYW1lLCBzaGVldCkpO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgcmVzdWx0cy5wdXNoKHBhcmFtZXRlckV2ZW50KTtcblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXZlbnRMaXN0ZW5lck1hbmFnZXIsIFNoZWV0SW1wbCwgVGFibGVhdUVycm9yIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBQYXJhbWV0ZXIgfSBmcm9tICcuL1BhcmFtZXRlcic7XG5cbmV4cG9ydCBjbGFzcyBTaGVldCBleHRlbmRzIEV2ZW50TGlzdGVuZXJNYW5hZ2VyIGltcGxlbWVudHMgQ29udHJhY3QuRXh0ZW5zaW9uU2hlZXQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfc2hlZXRJbXBsOiBTaGVldEltcGwpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWV0SW1wbC5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBzaGVldFR5cGUoKTogQ29udHJhY3QuU2hlZXRUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fc2hlZXRJbXBsLnNoZWV0VHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2l6ZSgpOiBDb250cmFjdC5TaXplIHtcbiAgICBpZiAodGhpcy5pc1ZhbGlkU2l6ZSh0aGlzLl9zaGVldEltcGwuc2l6ZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zaGVldEltcGwuc2l6ZTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVtYmVkZGluZ0Vycm9yQ29kZXMuSW1wbGVtZW50YXRpb25FcnJvciwgJ1NpemUgbm90IGltcGxlbWVudGVkJyk7XG4gIH1cblxuICBwcml2YXRlIGlzVmFsaWRTaXplKHNpemU6IGFueSk6IHNpemUgaXMgQ29udHJhY3QuU2l6ZSB7XG4gICAgY29uc3QgdGVzdFNpemUgPSBzaXplIGFzIENvbnRyYWN0LlNpemU7XG4gICAgaWYgKHRlc3RTaXplLndpZHRoICE9PSB1bmRlZmluZWQgJiYgdGVzdFNpemUuaGVpZ2h0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBmaW5kUGFyYW1ldGVyQXN5bmMocGFyYW1ldGVyTmFtZTogc3RyaW5nKTogUHJvbWlzZTxDb250cmFjdC5QYXJhbWV0ZXIgfCB1bmRlZmluZWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fc2hlZXRJbXBsLmZpbmRQYXJhbWV0ZXJBc3luYyhwYXJhbWV0ZXJOYW1lKS50aGVuKChwYXJhbWV0ZXJJbXBsKSA9PiB7XG4gICAgICBpZiAocGFyYW1ldGVySW1wbCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8Q29udHJhY3QuUGFyYW1ldGVyPigocmVzb2x2ZSkgPT4gcmVzb2x2ZShuZXcgUGFyYW1ldGVyKHBhcmFtZXRlckltcGwsIHRoaXMpKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8dW5kZWZpbmVkPigocmVzb2x2ZSkgPT4gcmVzb2x2ZSh1bmRlZmluZWQpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRQYXJhbWV0ZXJzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5QYXJhbWV0ZXI+PiB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWV0SW1wbC5nZXRQYXJhbWV0ZXJzQXN5bmMoKS50aGVuKChwYXJhbWV0ZXJzSW1wbCkgPT4ge1xuICAgICAgcmV0dXJuIHBhcmFtZXRlcnNJbXBsLm1hcCgocGFyYW1ldGVySW1wbCkgPT4ge1xuICAgICAgICByZXR1cm4gbmV3IFBhcmFtZXRlcihwYXJhbWV0ZXJJbXBsLCB0aGlzKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uV29ya2Jvb2tJbXBsIH0gZnJvbSAnLi4vSW1wbC9FeHRlbnNpb25Xb3JrYm9va0ltcGwnO1xuXG5leHBvcnQgY2xhc3MgV29ya2Jvb2sgaW1wbGVtZW50cyBDb250cmFjdC5FeHRlbnNpb25Xb3JrYm9vayB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF93b3JrYm9va0ltcGw6IEV4dGVuc2lvbldvcmtib29rSW1wbCkge31cblxuICBwdWJsaWMgZ2V0QWxsRGF0YVNvdXJjZXNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkRhdGFTb3VyY2U+PiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtib29rSW1wbC5nZXRBbGxEYXRhU291cmNlc0FzeW5jKCk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBDb2x1bW4sXG4gIEZpbHRlclVwZGF0ZVR5cGUsXG4gIFNlbGVjdGlvblVwZGF0ZVR5cGUsXG4gIFRhYmxlYXVFdmVudFR5cGUsXG4gIFRvb2x0aXBDb250ZXh0LFxuICBXb3Jrc2hlZXRGb3JtYXR0aW5nLFxufSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRmlsdGVyRXZlbnQsIE5vdGlmaWNhdGlvbklkLCBTdW1tYXJ5RGF0YUV2ZW50LCBWaXN1YWxJZCwgV29ya3NoZWV0Rm9ybWF0dGluZ0V2ZW50IH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeSxcbiAgTm90aWZpY2F0aW9uU2VydmljZSxcbiAgU2VydmljZU5hbWVzLFxuICBTaW5nbGVFdmVudE1hbmFnZXIsXG4gIFNpbmdsZUV2ZW50TWFuYWdlckltcGwsXG4gIFRhYmxlYXVFcnJvcixcbiAgV29ya3NoZWV0SW1wbCxcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBGaWx0ZXJDaGFuZ2VkRXZlbnQgfSBmcm9tICcuLi9FdmVudHMvRmlsdGVyQ2hhbmdlZEV2ZW50JztcbmltcG9ydCB7IE1hcmtzU2VsZWN0ZWRFdmVudCB9IGZyb20gJy4uL0V2ZW50cy9NYXJrc1NlbGVjdGVkRXZlbnQnO1xuaW1wb3J0IHsgU3VtbWFyeURhdGFDaGFuZ2VkRXZlbnQgfSBmcm9tICcuLi9FdmVudHMvU3VtbWFyeURhdGFDaGFuZ2VkRXZlbnQnO1xuaW1wb3J0IHsgV29ya3NoZWV0Rm9ybWF0dGluZ0NoYW5nZWRFdmVudCB9IGZyb20gJy4uL0V2ZW50cy9Xb3Jrc2hlZXRGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50JztcbmltcG9ydCB7IEV4dGVuc2lvbnNSZWdpc3RyeUlkIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5VXRpbCc7XG5pbXBvcnQgeyBEYXNoYm9hcmQgfSBmcm9tICcuL0Rhc2hib2FyZCc7XG5pbXBvcnQgeyBTaGVldCB9IGZyb20gJy4vU2hlZXQnO1xuXG5leHBvcnQgY2xhc3MgV29ya3NoZWV0IGV4dGVuZHMgU2hlZXQgaW1wbGVtZW50cyBDb250cmFjdC5FeHRlbnNpb25Xb3Jrc2hlZXQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIF93b3Jrc2hlZXRJbXBsOiBXb3Jrc2hlZXRJbXBsKSB7XG4gICAgc3VwZXIoX3dvcmtzaGVldEltcGwpO1xuXG4gICAgLy8gQ2FsbCB0byBpbml0aWFsaXplIGV2ZW50cyBhbmQgdGhlbiBjYWxsIGRvd24gdG8gdGhlIGV2ZW50IGxpc3RlbmVyIG1hbmFnZXIgdG8gaGFuZGxlIHRoaW5nc1xuICAgIHRoaXMuaW5pdGlhbGl6ZUV2ZW50cygpLmZvckVhY2goKGUpID0+IHRoaXMuYWRkTmV3RXZlbnRUeXBlKGUpKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcGFyZW50RGFzaGJvYXJkKCk6IENvbnRyYWN0LkV4dGVuc2lvbkRhc2hib2FyZCB7XG4gICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIGZvciBFeHRlbnNpb25zIGlmIHRoZSBEYXNoYm9hcmRJbXBscyBhcmUgY3JlYXRlZCBjb3JyZWN0bHlcbiAgICBpZiAodGhpcy5fd29ya3NoZWV0SW1wbC5wYXJlbnREYXNoYm9hcmQgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5TaGFyZWRFcnJvckNvZGVzLkltcGxlbWVudGF0aW9uRXJyb3IsIGBQYXJlbnQgZGFzaGJvYXJkIG5vdCBpbXBsZW1lbnRlZGApO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgRGFzaGJvYXJkKHRoaXMuX3dvcmtzaGVldEltcGwucGFyZW50RGFzaGJvYXJkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYmFja2dyb3VuZENvbG9yKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuX3dvcmtzaGVldEltcGwuYmFja2dyb3VuZENvbG9yID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuU2hhcmVkRXJyb3JDb2Rlcy5JbXBsZW1lbnRhdGlvbkVycm9yLCBgV29ya3NoZWV0IGJhY2tncm91bmQgY29sb3IgaXMgbm90IGF2YWlsYWJsZWApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmJhY2tncm91bmRDb2xvcjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZm9ybWF0dGluZygpOiBXb3Jrc2hlZXRGb3JtYXR0aW5nIHtcbiAgICBpZiAodGhpcy5fd29ya3NoZWV0SW1wbC5mb3JtYXR0aW5nID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuU2hhcmVkRXJyb3JDb2Rlcy5JbXBsZW1lbnRhdGlvbkVycm9yLCBgV29ya3NoZWV0IGZvcm1hdHRpbmcgaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZWApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmZvcm1hdHRpbmc7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIG1ldGhvZCB3aGljaCBnb2VzIHRocm91Z2ggYW5kIHJlZ2lzdGVycyBlYWNoIGV2ZW50IHR5cGUgdGhpcyBpbXBsIGtub3dzIGFib3V0XG4gICAqIHdpdGggdGhlIE5vdGlmaWNhdGlvblNlcnZpY2UuIEl0IHJldHVybnMgYW4gYXJyYXkgb2YgU2luZ2xlRXZlbnRNYW5hZ2VyIG9iamVjdHMgd2hpY2hcbiAgICogY2FuIHRoZW4gYmUgcGFzc2VkIHRvIGFuIEV2ZW50TGlzdGVuZXJNYW5hZ2VyIHRvIGhhbmRsZSB1c2VyIHJlZ2lzdHJhdGlvbiAvIHVucmVnaXN0cmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge1dvcmtzaGVldH0gd29ya3NoZWV0IFRoZSB3b3Jrc2hlZXQgb2JqZWN0IHdoaWNoIHdpbGwgYmUgaW5jbHVkZWQgd2l0aCB0aGUgZXZlbnQgbm90aWZpY2F0aW9uc1xuICAgKiBAcmV0dXJucyB7QXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPn0gQ29sbGVjdGlvbiBvZiBldmVudCBtYW5hZ2VycyB0byBwYXNzIHRvIGFuIEV2ZW50TGlzdGVuZXJNYW5hZ2VyXG4gICAqL1xuICBwdWJsaWMgaW5pdGlhbGl6ZUV2ZW50cygpOiBBcnJheTxTaW5nbGVFdmVudE1hbmFnZXI+IHtcbiAgICBjb25zdCByZXN1bHRzID0gbmV3IEFycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj4oKTtcbiAgICBsZXQgbm90aWZpY2F0aW9uU2VydmljZTogTm90aWZpY2F0aW9uU2VydmljZTtcblxuICAgIHRyeSB7XG4gICAgICBub3RpZmljYXRpb25TZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxOb3RpZmljYXRpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuTm90aWZpY2F0aW9uKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIHRoaXMgc2VydmljZSByZWdpc3RlcmVkLCBqdXN0IHJldHVyblxuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBhbGwgb2YgdGhlIGV2ZW50IG1hbmFnZXJzIHdlJ2xsIG5lZWQgKG9uZSBmb3IgZWFjaCBldmVudCB0eXBlKVxuICAgIGNvbnN0IG1hcmtzRXZlbnQgPSBuZXcgU2luZ2xlRXZlbnRNYW5hZ2VySW1wbDxNYXJrc1NlbGVjdGVkRXZlbnQ+KFRhYmxlYXVFdmVudFR5cGUuTWFya1NlbGVjdGlvbkNoYW5nZWQpO1xuICAgIG5vdGlmaWNhdGlvblNlcnZpY2UucmVnaXN0ZXJIYW5kbGVyKFxuICAgICAgTm90aWZpY2F0aW9uSWQuU2VsZWN0ZWRNYXJrc0NoYW5nZWQsXG4gICAgICAobW9kZWwpID0+IHtcbiAgICAgICAgY29uc3QgdmlzdWFsSWQgPSBtb2RlbCBhcyBWaXN1YWxJZDtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzdWFsSWRzQXJlRXF1YWwodmlzdWFsSWQsIHRoaXMuX3dvcmtzaGVldEltcGwudmlzdWFsSWQpO1xuICAgICAgfSxcbiAgICAgICgpID0+IG1hcmtzRXZlbnQudHJpZ2dlckV2ZW50KCgpID0+IG5ldyBNYXJrc1NlbGVjdGVkRXZlbnQodGhpcykpLFxuICAgICk7XG5cbiAgICBjb25zdCBmaWx0ZXJFdmVudCA9IG5ldyBTaW5nbGVFdmVudE1hbmFnZXJJbXBsPEZpbHRlckNoYW5nZWRFdmVudD4oVGFibGVhdUV2ZW50VHlwZS5GaWx0ZXJDaGFuZ2VkKTtcbiAgICBub3RpZmljYXRpb25TZXJ2aWNlLnJlZ2lzdGVySGFuZGxlcihcbiAgICAgIE5vdGlmaWNhdGlvbklkLkZpbHRlckNoYW5nZWQsXG4gICAgICAobW9kZWwpID0+IHtcbiAgICAgICAgY29uc3QgZmlsdGVyRXZlbnRSZXNwb25zZSA9IG1vZGVsIGFzIEZpbHRlckV2ZW50O1xuICAgICAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC52aXN1YWxJZC53b3Jrc2hlZXQgPT09IGZpbHRlckV2ZW50UmVzcG9uc2UudmlzdWFsSWQud29ya3NoZWV0O1xuICAgICAgfSxcbiAgICAgIChldmVudDogRmlsdGVyRXZlbnQpID0+IHtcbiAgICAgICAgZmlsdGVyRXZlbnQudHJpZ2dlckV2ZW50KCgpID0+IG5ldyBGaWx0ZXJDaGFuZ2VkRXZlbnQodGhpcywgZXZlbnQuZmllbGROYW1lLCBldmVudC5maWVsZElkKSk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICBjb25zdCBzdW1tYXJ5RGF0YUV2ZW50ID0gbmV3IFNpbmdsZUV2ZW50TWFuYWdlckltcGw8U3VtbWFyeURhdGFDaGFuZ2VkRXZlbnQ+KFRhYmxlYXVFdmVudFR5cGUuU3VtbWFyeURhdGFDaGFuZ2VkKTtcbiAgICBub3RpZmljYXRpb25TZXJ2aWNlLnJlZ2lzdGVySGFuZGxlcihcbiAgICAgIE5vdGlmaWNhdGlvbklkLlN1bW1hcnlEYXRhQ2hhbmdlZCxcbiAgICAgIChtb2RlbCkgPT4ge1xuICAgICAgICBjb25zdCBzdW1tYXJ5RGF0YUV2ZW50UmVzcG9uc2UgPSBtb2RlbCBhcyBTdW1tYXJ5RGF0YUV2ZW50O1xuICAgICAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC52aXN1YWxJZC53b3Jrc2hlZXQgPT09IHN1bW1hcnlEYXRhRXZlbnRSZXNwb25zZS52aXN1YWxJZC53b3Jrc2hlZXQ7XG4gICAgICB9LFxuICAgICAgKGV2ZW50OiBTdW1tYXJ5RGF0YUV2ZW50KSA9PiB7XG4gICAgICAgIHN1bW1hcnlEYXRhRXZlbnQudHJpZ2dlckV2ZW50KCgpID0+IG5ldyBTdW1tYXJ5RGF0YUNoYW5nZWRFdmVudCh0aGlzKSk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICBjb25zdCB3b3Jrc2hlZXRGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50ID0gbmV3IFNpbmdsZUV2ZW50TWFuYWdlckltcGw8V29ya3NoZWV0Rm9ybWF0dGluZ0NoYW5nZWRFdmVudD4oXG4gICAgICBUYWJsZWF1RXZlbnRUeXBlLldvcmtzaGVldEZvcm1hdHRpbmdDaGFuZ2VkLFxuICAgICk7XG5cbiAgICBub3RpZmljYXRpb25TZXJ2aWNlLnJlZ2lzdGVySGFuZGxlcihcbiAgICAgIE5vdGlmaWNhdGlvbklkLldvcmtzaGVldEZvcm1hdHRpbmdDaGFuZ2VkLFxuICAgICAgKG1vZGVsKSA9PiB7XG4gICAgICAgIGNvbnN0IHdvcmtzaGVldEZvcm1hdHRpbmdDaGFuZ2VkRXZlbnQgPSBtb2RlbCBhcyBXb3Jrc2hlZXRGb3JtYXR0aW5nRXZlbnQ7XG4gICAgICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLnZpc3VhbElkLndvcmtzaGVldCA9PT0gd29ya3NoZWV0Rm9ybWF0dGluZ0NoYW5nZWRFdmVudC52aXN1YWxJZC53b3Jrc2hlZXQ7XG4gICAgICB9LFxuICAgICAgKGV2ZW50Rm9ybWF0dGluZzogV29ya3NoZWV0Rm9ybWF0dGluZykgPT4ge1xuICAgICAgICB3b3Jrc2hlZXRGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50LnRyaWdnZXJFdmVudCgoKSA9PiBuZXcgV29ya3NoZWV0Rm9ybWF0dGluZ0NoYW5nZWRFdmVudCh0aGlzLCBldmVudEZvcm1hdHRpbmcpKTtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIHJlc3VsdHMucHVzaChtYXJrc0V2ZW50KTtcbiAgICByZXN1bHRzLnB1c2goZmlsdGVyRXZlbnQpO1xuICAgIHJlc3VsdHMucHVzaChzdW1tYXJ5RGF0YUV2ZW50KTtcbiAgICByZXN1bHRzLnB1c2god29ya3NoZWV0Rm9ybWF0dGluZ0NoYW5nZWRFdmVudCk7XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIHB1YmxpYyBhcHBseUZpbHRlckFzeW5jKFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHZhbHVlczogQXJyYXk8c3RyaW5nPixcbiAgICB1cGRhdGVUeXBlOiBGaWx0ZXJVcGRhdGVUeXBlLFxuICAgIG9wdGlvbnM6IENvbnRyYWN0LkZpbHRlck9wdGlvbnMsXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuYXBwbHlGaWx0ZXJBc3luYyhmaWVsZE5hbWUsIHZhbHVlcywgdXBkYXRlVHlwZSwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlSYW5nZUZpbHRlckFzeW5jKGZpZWxkTmFtZTogc3RyaW5nLCBmaWx0ZXJPcHRpb25zOiBDb250cmFjdC5SYW5nZUZpbHRlck9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmFwcGx5UmFuZ2VGaWx0ZXJBc3luYyhmaWVsZE5hbWUsIGZpbHRlck9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGFwcGx5SGllcmFyY2hpY2FsRmlsdGVyQXN5bmMoXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgdmFsdWVzOiBBcnJheTxzdHJpbmc+LFxuICAgIHVwZGF0ZVR5cGU6IENvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGUsXG4gICAgb3B0aW9uczogQ29udHJhY3QuRmlsdGVyT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5hcHBseUhpZXJhcmNoaWNhbEZpbHRlckFzeW5jKGZpZWxkTmFtZSwgdmFsdWVzLCB1cGRhdGVUeXBlLCBvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseVJlbGF0aXZlRGF0ZUZpbHRlckFzeW5jKGZpZWxkTmFtZTogc3RyaW5nLCBvcHRpb25zOiBDb250cmFjdC5SZWxhdGl2ZURhdGVGaWx0ZXJPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5hcHBseVJlbGF0aXZlRGF0ZUZpbHRlckFzeW5jKGZpZWxkTmFtZSwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJGaWx0ZXJBc3luYyhmaWVsZE5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuY2xlYXJGaWx0ZXJBc3luYyhmaWVsZE5hbWUpO1xuICB9XG5cbiAgcHVibGljIGdldERhdGFTb3VyY2VzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5EYXRhU291cmNlPj4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldERhdGFTb3VyY2VzQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRGaWx0ZXJzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5GaWx0ZXI+PiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0RmlsdGVyc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2VsZWN0ZWRNYXJrc0FzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuTWFya3NDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0U2VsZWN0ZWRNYXJrc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0SGlnaGxpZ2h0ZWRNYXJrc0FzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuTWFya3NDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0SGlnaGxpZ2h0ZWRNYXJrc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3VtbWFyeURhdGFBc3luYyhvcHRpb25zOiBDb250cmFjdC5HZXRTdW1tYXJ5RGF0YU9wdGlvbnMpOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldFN1bW1hcnlEYXRhQXN5bmMob3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3VtbWFyeURhdGFSZWFkZXJBc3luYyhwYWdlUm93Q291bnQ6IG51bWJlciwgb3B0aW9uczogQ29udHJhY3QuR2V0U3VtbWFyeURhdGFPcHRpb25zKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGVSZWFkZXI+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5nZXRTdW1tYXJ5RGF0YVJlYWRlckFzeW5jKHBhZ2VSb3dDb3VudCwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3VtbWFyeUNvbHVtbnNJbmZvQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb2x1bW4+PiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0U3VtbWFyeUNvbHVtbnNJbmZvQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmRlcmx5aW5nRGF0YUFzeW5jKG9wdGlvbnM6IENvbnRyYWN0LkdldFVuZGVybHlpbmdEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ1dvcmtzaGVldC5nZXRVbmRlcmx5aW5nRGF0YUFzeW5jIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgJyArXG4gICAgICAgICdXb3Jrc2hlZXQuZ2V0VW5kZXJseWluZ1RhYmxlc0FzeW5jIGFuZCBXb3Jrc2hlZXQuZ2V0VW5kZXJseWluZ1RhYmxlRGF0YUFzeW5jJyxcbiAgICApO1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldFVuZGVybHlpbmdEYXRhQXN5bmMob3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ1RhYmxlc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuTG9naWNhbFRhYmxlPj4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldFVuZGVybHlpbmdUYWJsZXNBc3luYygpO1xuICB9XG5cbiAgcHVibGljIGdldFVuZGVybHlpbmdUYWJsZURhdGFBc3luYyhsb2dpY2FsVGFibGVJZDogc3RyaW5nLCBvcHRpb25zOiBDb250cmFjdC5HZXRVbmRlcmx5aW5nRGF0YU9wdGlvbnMpOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldFVuZGVybHlpbmdUYWJsZURhdGFBc3luYyhsb2dpY2FsVGFibGVJZCwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ1RhYmxlRGF0YVJlYWRlckFzeW5jKFxuICAgIGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsXG4gICAgcGFnZVJvd0NvdW50OiBudW1iZXIsXG4gICAgb3B0aW9uczogQ29udHJhY3QuR2V0VW5kZXJseWluZ0RhdGFPcHRpb25zLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZVJlYWRlcj4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldFVuZGVybHlpbmdUYWJsZURhdGFSZWFkZXJBc3luYyhsb2dpY2FsVGFibGVJZCwgcGFnZVJvd0NvdW50LCBvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRWaXN1YWxTcGVjaWZpY2F0aW9uQXN5bmMoKTogUHJvbWlzZTxDb250cmFjdC5WaXN1YWxTcGVjaWZpY2F0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0VmlzdWFsU3BlY2lmaWNhdGlvbkFzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgYWRkTWFya3NDYXJkRmllbGRzQXN5bmMoXG4gICAgbWFya3NDYXJkSW5kZXg6IG51bWJlcixcbiAgICBlbmNvZGluZ1R5cGU6IENvbnRyYWN0LkVuY29kaW5nVHlwZSxcbiAgICBjb2x1bW5zOiBBcnJheTxDb250cmFjdC5Db2x1bW4+LFxuICAgIHN0YXJ0SW5kZXg6IG51bWJlcixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuYWRkTWFya3NDYXJkRmllbGRzQXN5bmMobWFya3NDYXJkSW5kZXgsIGVuY29kaW5nVHlwZSwgY29sdW1ucywgc3RhcnRJbmRleCk7XG4gIH1cblxuICBwdWJsaWMgbW92ZU1hcmtzQ2FyZEZpZWxkQXN5bmMobWFya3NDYXJkSW5kZXg6IG51bWJlciwgZnJvbUluZGV4OiBudW1iZXIsIHRvSW5kZXg6IG51bWJlciwgZmllbGRDb3VudCA9IDEpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5tb3ZlTWFya3NDYXJkRmllbGRBc3luYyhtYXJrc0NhcmRJbmRleCwgZnJvbUluZGV4LCB0b0luZGV4LCBmaWVsZENvdW50KTtcbiAgfVxuXG4gIHB1YmxpYyBzcGxpY2VNYXJrc0NhcmRGaWVsZHNBc3luYyhcbiAgICBtYXJrc0NhcmRJbmRleDogbnVtYmVyLFxuICAgIGVuY29kaW5nVHlwZTogQ29udHJhY3QuRW5jb2RpbmdUeXBlLFxuICAgIHN0YXJ0SW5kZXg6IG51bWJlcixcbiAgICBkZWxldGVDb3VudDogbnVtYmVyLFxuICAgIGNvbHVtbnM6IEFycmF5PENvbnRyYWN0LkNvbHVtbj4sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLnNwbGljZU1hcmtzQ2FyZEZpZWxkc0FzeW5jKG1hcmtzQ2FyZEluZGV4LCBlbmNvZGluZ1R5cGUsIHN0YXJ0SW5kZXgsIGRlbGV0ZUNvdW50LCBjb2x1bW5zKTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhclNlbGVjdGVkTWFya3NBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5jbGVhclNlbGVjdGVkTWFya3NBc3luYygpO1xuICB9XG5cbiAgcHVibGljIHNlbGVjdE1hcmtzQnlJREFzeW5jKG1hcmtzSW5mbzogQXJyYXk8Q29udHJhY3QuTWFya0luZm8+LCB1cGRhdGVUeXBlOiBTZWxlY3Rpb25VcGRhdGVUeXBlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuc2VsZWN0TWFya3NCeUlkQXN5bmMobWFya3NJbmZvLCB1cGRhdGVUeXBlKTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RNYXJrc0J5VmFsdWVBc3luYyhzZWxlY3Rpb25zOiBBcnJheTxDb250cmFjdC5TZWxlY3Rpb25Dcml0ZXJpYT4sIHNlbGVjdGlvblVwZGF0ZVR5cGU6IFNlbGVjdGlvblVwZGF0ZVR5cGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5zZWxlY3RNYXJrc0J5VmFsdWVBc3luYyhzZWxlY3Rpb25zLCBzZWxlY3Rpb25VcGRhdGVUeXBlKTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RNYXJrc0J5SWRBc3luYyhzZWxlY3Rpb25zOiBBcnJheTxDb250cmFjdC5NYXJrSW5mbz4sIHNlbGVjdGlvblVwZGF0ZVR5cGU6IFNlbGVjdGlvblVwZGF0ZVR5cGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5zZWxlY3RNYXJrc0J5SWRBc3luYyhzZWxlY3Rpb25zLCBzZWxlY3Rpb25VcGRhdGVUeXBlKTtcbiAgfVxuXG4gIHB1YmxpYyBhbm5vdGF0ZU1hcmtBc3luYyhtYXJrOiBDb250cmFjdC5NYXJrSW5mbywgYW5ub3RhdGlvblRleHQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmFubm90YXRlTWFya0FzeW5jKG1hcmssIGFubm90YXRpb25UZXh0KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBbm5vdGF0aW9uc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuQW5ub3RhdGlvbj4+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5nZXRBbm5vdGF0aW9uc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlQW5ub3RhdGlvbkFzeW5jKGFubm90YXRpb246IENvbnRyYWN0LkFubm90YXRpb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5yZW1vdmVBbm5vdGF0aW9uQXN5bmMoYW5ub3RhdGlvbik7XG4gIH1cblxuICBwdWJsaWMgaG92ZXJUdXBsZUFzeW5jKGhvdmVyZWRUdXBsZT86IG51bWJlciwgdG9vbHRpcD86IFRvb2x0aXBDb250ZXh0IHwgbnVsbCwgYWxsb3dIb3ZlckFjdGlvbnMgPSB0cnVlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuaG92ZXJUdXBsZUFzeW5jKGhvdmVyZWRUdXBsZSwgdG9vbHRpcCwgYWxsb3dIb3ZlckFjdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIHNlbGVjdFR1cGxlc0FzeW5jKHNlbGVjdGVkVHVwbGVzOiBBcnJheTxudW1iZXI+LCBzZWxlY3RPcHRpb246IENvbnRyYWN0LlNlbGVjdE9wdGlvbnMsIHRvb2x0aXA/OiBUb29sdGlwQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLnNlbGVjdFR1cGxlc0FzeW5jKHNlbGVjdGVkVHVwbGVzLCBzZWxlY3RPcHRpb24sIHRvb2x0aXApO1xuICB9XG5cbiAgcHVibGljIGdldFRvb2x0aXBUZXh0QXN5bmModHVwbGVJZDogbnVtYmVyKTogUHJvbWlzZTxTdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5nZXRUb29sdGlwVGV4dEFzeW5jKHR1cGxlSWQpO1xuICB9XG5cbiAgcHVibGljIGxlYXZlTWFya05hdmlnYXRpb25Bc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5sZWF2ZU1hcmtOYXZpZ2F0aW9uQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBlZGl0QWxpYXNlc0RpYWxvZ0FzeW5jKGZpZWxkTmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZWRpdEFsaWFzZXNEaWFsb2dBc3luYyhmaWVsZE5hbWUpO1xuICB9XG5cbiAgcHJpdmF0ZSB2aXN1YWxJZHNBcmVFcXVhbChhOiBWaXN1YWxJZCwgYjogVmlzdWFsSWQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgYSAmJlxuICAgICAgYiAmJlxuICAgICAgYS53b3Jrc2hlZXQgPT09IGIud29ya3NoZWV0ICYmXG4gICAgICBhLmRhc2hib2FyZCA9PT0gYi5kYXNoYm9hcmQgJiZcbiAgICAgIGEuc3Rvcnlib2FyZCA9PT0gYi5zdG9yeWJvYXJkICYmXG4gICAgICBhLnN0b3J5UG9pbnRJRCA9PT0gYi5zdG9yeVBvaW50SURcbiAgICApO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBleHRlcm5hbCBEYXNoYm9hcmRDb250ZW50IG5hbWVzcGFjZS5cbiAqIFRoaXMgZG9lcyBub3QgZm9sbG93IHRoZSBJbXBsIHBhdHRlcm4gYXMgRGFzaGJvYXJkQ29udGVudCBpc1xuICogY3VycmVudGx5IGp1c3QgYSAoc2luZ2xlKSBwcm9wZXJ0eSBiYWcuXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXNoYm9hcmRDb250ZW50IGltcGxlbWVudHMgQ29udHJhY3QuRGFzaGJvYXJkQ29udGVudCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9kYXNoYm9hcmQ6IENvbnRyYWN0LkV4dGVuc2lvbkRhc2hib2FyZCkge31cblxuICBwdWJsaWMgZ2V0IGRhc2hib2FyZCgpOiBDb250cmFjdC5FeHRlbnNpb25EYXNoYm9hcmQge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmQ7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeHRlbnNpb25FbnZpcm9ubWVudCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBBcGlWZXJzaW9uLCBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MgYXMgRW51bU1hcHBpbmdzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBDb25uZWN0ZWRTZXJ2ZXIgfSBmcm9tICcuLi9JbXBsL0Nvbm5lY3RlZFNlcnZlcic7XG5pbXBvcnQgeyBXb3JrYm9va0Zvcm1hdHRpbmdFbnZVdGlsIH0gZnJvbSAnLi9Xb3JrYm9va0Zvcm1hdHRpbmdFbnZVdGlsJztcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgZXh0ZXJuYWwgZW52aXJvbm1lbnQgbmFtZXNwYWNlLlxuICogRW52aXJvbm1lbnQgZG9lcyBub3QgZm9sbG93IHRoZSBJbXBsIHBhdHRlcm4gYXMgaXQgaXNcbiAqIGp1c3QgYSBwcm9wZXJ0eSBiYWcuXG4gKiBGaXJzdCBjbGFzcyBleHRlbnNpb25zIGNhbiBnZXQgdG8gQ29ubmVjdGVkU2VydmVyIHdpdGg6IGVudmlyb25tZW50Wydjb25uZWN0ZWRTZXJ2ZXInXVxuICovXG5leHBvcnQgY2xhc3MgRW52aXJvbm1lbnQgaW1wbGVtZW50cyBDb250cmFjdC5FbnZpcm9ubWVudCB7XG4gIC8qKlRoZSBmb2xsb3dpbmcgaXMgYW4gaW5kZXggc2lnbmF0dXJlLiBJdCBhbGxvd3MgcHJvcGVydGllcyB0byBiZSBhY2Nlc3NlZCBieSBuYW1lLlxuICAgKiBUaGlzIGFsbG93cyB1cyB0byBhZGQgcHJvcGVydGllcyBkeW5hbWljYWxseSAoc2VlIHVzYWdlIG9mIHRoaXMuY29ubmVjdGVkU2VydmVyIGJlbG93KSB3aXRob3V0IFR5cGVzY3JpcHQgZXJyb3JzLlxuICAgKiBUaGUgcmVhc29uIHdlIGRvIHRoaXMgaXMgc28gdGhhdCAzcmQtcGFydHkgZXh0ZW5zaW9uIGRldmVsb3BlcnMgZG8gbm90IHNlZSB0aGUgY29ubmVjdGVkU2VydmVyIHByb3BlcnR5XG4gICAqIHRoYXQgaXMgb25seSBhdmFpbGFibGUgdG8gZmlyc3QgY2xhc3MgZXh0ZW5zaW9uIGRldmVsb3BlcnMuXG4gICAqIFRoZSB0eXBlIG9mIHRoZSBpbmRleCBzaWdhdHVyZSBuZWVkcyB0byBiZSBhIHVuaW9uIG9mIGFsbCBwcm9wZXJ0aWVzIGluIHRoZSBvYmplY3QsIHNpbmNlIHdlIGNvdWxkXG4gICAqIGFjY2VzcyBhbnkgcHJvcGVydHkgdXNpbmcgdGhlIHByb3BlcnR5IGluZGV4IG1ldGhvZC5cbiAgICovXG4gIFt4OiBzdHJpbmddOiBDb25uZWN0ZWRTZXJ2ZXIgfCBzdHJpbmcgfCBDb250cmFjdC5Xb3JrYm9va0Zvcm1hdHRpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfYXBpVmVyc2lvbjogc3RyaW5nO1xuICBwcml2YXRlIF9jb250ZXh0OiBDb250cmFjdC5FeHRlbnNpb25Db250ZXh0O1xuICBwcml2YXRlIF9mb3JtYXR0aW5nPzogQ29udHJhY3QuV29ya2Jvb2tGb3JtYXR0aW5nO1xuICBwcml2YXRlIF9sYW5ndWFnZTogc3RyaW5nO1xuICBwcml2YXRlIF9jb3VudHJ5Pzogc3RyaW5nO1xuICBwcml2YXRlIF9sb2NhbGU6IHN0cmluZztcbiAgcHJpdmF0ZSBfbW9kZTogQ29udHJhY3QuRXh0ZW5zaW9uTW9kZTtcbiAgcHJpdmF0ZSBfb3BlcmF0aW5nU3lzdGVtOiBzdHJpbmc7XG4gIHByaXZhdGUgX3RhYmxlYXVWZXJzaW9uOiBzdHJpbmc7XG4gIHByaXZhdGUgX3VuaXF1ZVVzZXJJZD86IHN0cmluZztcblxuICBwdWJsaWMgY29uc3RydWN0b3IoZXh0ZW5zaW9uRW52aXJvbm1lbnQ6IEV4dGVuc2lvbkVudmlyb25tZW50KSB7XG4gICAgdGhpcy5fYXBpVmVyc2lvbiA9IEFwaVZlcnNpb24uSW5zdGFuY2UgJiYgQXBpVmVyc2lvbi5JbnN0YW5jZS5mb3JtYXR0ZWRWYWx1ZTsgLy8gbWFqLm1pbi5maXggKG5vIGJ1aWxkKVxuICAgIHRoaXMuX2NvbnRleHQgPSBFbnVtTWFwcGluZ3MuZXh0ZW5zaW9uQ29udGV4dC5jb252ZXJ0KGV4dGVuc2lvbkVudmlyb25tZW50LmV4dGVuc2lvbkNvbnRleHQpO1xuICAgIHRoaXMuX2Zvcm1hdHRpbmcgPSBXb3JrYm9va0Zvcm1hdHRpbmdFbnZVdGlsLmNvbnZlcnRUb1dvcmtib29rRm9ybWF0dGluZyhleHRlbnNpb25FbnZpcm9ubWVudC53b3JrYm9va0Zvcm1hdHRpbmcpO1xuICAgIHRoaXMuX2xhbmd1YWdlID0gZXh0ZW5zaW9uRW52aXJvbm1lbnQuZXh0ZW5zaW9uTGFuZ3VhZ2U7XG4gICAgdGhpcy5fY291bnRyeSA9IGV4dGVuc2lvbkVudmlyb25tZW50LmV4dGVuc2lvbkNvdW50cnk7XG4gICAgdGhpcy5fbG9jYWxlID0gZXh0ZW5zaW9uRW52aXJvbm1lbnQuZXh0ZW5zaW9uTG9jYWxlO1xuICAgIHRoaXMuX21vZGUgPSBFbnVtTWFwcGluZ3MuZXh0ZW5zaW9uTW9kZS5jb252ZXJ0KGV4dGVuc2lvbkVudmlyb25tZW50LmV4dGVuc2lvbk1vZGUpO1xuICAgIHRoaXMuX29wZXJhdGluZ1N5c3RlbSA9IGV4dGVuc2lvbkVudmlyb25tZW50Lm9wZXJhdGluZ1N5c3RlbTtcbiAgICB0aGlzLl90YWJsZWF1VmVyc2lvbiA9IGV4dGVuc2lvbkVudmlyb25tZW50LnRhYmxlYXVWZXJzaW9uO1xuICAgIHRoaXMuX3VuaXF1ZVVzZXJJZCA9IGV4dGVuc2lvbkVudmlyb25tZW50LnVuaXF1ZVVzZXJJZDtcblxuICAgIC8vIElmIHdlIGhhdmUgYSB1c2VySWQsIHRoZW4gd2UgYXJlIGEgZmlyc3QgY2xhc3MgZXh0ZW5zaW9uXG4gICAgaWYgKGV4dGVuc2lvbkVudmlyb25tZW50LnVzZXJJZCkge1xuICAgICAgdGhpcy5jb25uZWN0ZWRTZXJ2ZXIgPSBuZXcgQ29ubmVjdGVkU2VydmVyKFxuICAgICAgICBleHRlbnNpb25FbnZpcm9ubWVudC51c2VySWQsXG4gICAgICAgIGV4dGVuc2lvbkVudmlyb25tZW50LnNpdGVJZCxcbiAgICAgICAgZXh0ZW5zaW9uRW52aXJvbm1lbnQuc2l0ZU5hbWVzcGFjZSxcbiAgICAgICAgZXh0ZW5zaW9uRW52aXJvbm1lbnQud29ya2Jvb2tJZCxcbiAgICAgICk7XG5cbiAgICAgIHRoaXMuZmVhdHVyZUZsYWdzID0gZXh0ZW5zaW9uRW52aXJvbm1lbnQuZmVhdHVyZUZsYWdzO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgYXBpVmVyc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9hcGlWZXJzaW9uO1xuICB9XG5cbiAgcHVibGljIGdldCBjb250ZXh0KCk6IENvbnRyYWN0LkV4dGVuc2lvbkNvbnRleHQge1xuICAgIHJldHVybiB0aGlzLl9jb250ZXh0O1xuICB9XG5cbiAgcHVibGljIGdldCB3b3JrYm9va0Zvcm1hdHRpbmcoKTogQ29udHJhY3QuV29ya2Jvb2tGb3JtYXR0aW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybWF0dGluZztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbGFuZ3VhZ2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbGFuZ3VhZ2U7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvdW50cnkoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fY291bnRyeTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbG9jYWxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2xvY2FsZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbW9kZSgpOiBDb250cmFjdC5FeHRlbnNpb25Nb2RlIHtcbiAgICByZXR1cm4gdGhpcy5fbW9kZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgb3BlcmF0aW5nU3lzdGVtKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX29wZXJhdGluZ1N5c3RlbTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdGFibGVhdVZlcnNpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fdGFibGVhdVZlcnNpb247XG4gIH1cblxuICBwdWJsaWMgZ2V0IHVuaXF1ZVVzZXJJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl91bmlxdWVVc2VySWQ7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBDYWxsYmFja01hcCwgRXh0ZW5zaW9uc0ltcGwgfSBmcm9tICcuLi9JbXBsL0V4dGVuc2lvbnNJbXBsJztcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgZXh0ZXJuYWwgRXh0ZW5zaW9ucyBuYW1lc3BhY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBFeHRlbnNpb25zIGltcGxlbWVudHMgQ29udHJhY3QuRXh0ZW5zaW9ucyB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIGV4dGVuc2lvbkltcGw6IEV4dGVuc2lvbnNJbXBsKSB7XG4gICAgdGhpcy5leHRlbnNpb25JbXBsID0gZXh0ZW5zaW9uSW1wbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGFzaGJvYXJkQ29udGVudCgpOiBDb250cmFjdC5EYXNoYm9hcmRDb250ZW50IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5leHRlbnNpb25JbXBsLmRhc2hib2FyZENvbnRlbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHdvcmtzaGVldENvbnRlbnQoKTogQ29udHJhY3QuV29ya3NoZWV0Q29udGVudCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZXh0ZW5zaW9uSW1wbC53b3Jrc2hlZXRDb250ZW50O1xuICB9XG5cbiAgcHVibGljIGdldCBlbnZpcm9ubWVudCgpOiBDb250cmFjdC5FbnZpcm9ubWVudCB7XG4gICAgcmV0dXJuIHRoaXMuZXh0ZW5zaW9uSW1wbC5lbnZpcm9ubWVudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2V0dGluZ3MoKTogQ29udHJhY3QuU2V0dGluZ3Mge1xuICAgIHJldHVybiB0aGlzLmV4dGVuc2lvbkltcGwuc2V0dGluZ3M7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHVpKCk6IENvbnRyYWN0LlVJIHtcbiAgICByZXR1cm4gdGhpcy5leHRlbnNpb25JbXBsLnVpO1xuICB9XG5cbiAgcHVibGljIGdldCB3b3JrYm9vaygpOiBDb250cmFjdC5FeHRlbnNpb25Xb3JrYm9vayB7XG4gICAgcmV0dXJuIHRoaXMuZXh0ZW5zaW9uSW1wbC53b3JrYm9vaztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGFzaGJvYXJkT2JqZWN0SWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5leHRlbnNpb25JbXBsLmV4dGVuc2lvblpvbmVJZDtcbiAgfVxuXG4gIHB1YmxpYyBpbml0aWFsaXplQXN5bmMoY29udGV4dE1lbnVDYWxsYmFja3M/OiBDYWxsYmFja01hcCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmV4dGVuc2lvbkltcGwuaW5pdGlhbGl6ZUFzeW5jKGZhbHNlLCBjb250ZXh0TWVudUNhbGxiYWNrcykudGhlbjx2b2lkPigpO1xuICB9XG5cbiAgcHVibGljIGluaXRpYWxpemVEaWFsb2dBc3luYygpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLmV4dGVuc2lvbkltcGwuaW5pdGlhbGl6ZUFzeW5jKHRydWUpO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZVZpekltYWdlQXN5bmMoaW5wdXRTcGVjOiBvYmplY3QpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLmV4dGVuc2lvbkltcGwuY3JlYXRlVml6SW1hZ2VBc3luYyhpbnB1dFNwZWMpO1xuICB9XG5cbiAgcHVibGljIHNldENsaWNrVGhyb3VnaEFzeW5jKGNsaWNrVGhyb3VnaEVuYWJsZWQ6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5leHRlbnNpb25JbXBsLnNldENsaWNrVGhyb3VnaEFzeW5jKGNsaWNrVGhyb3VnaEVuYWJsZWQpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBTZXR0aW5ncyBhcyBTZXR0aW5nc0NvbnRyYWN0IH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEV2ZW50TGlzdGVuZXJNYW5hZ2VyIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBTZXR0aW5nc0ltcGwgfSBmcm9tICcuLi9JbXBsL1NldHRpbmdzSW1wbCc7XG5pbXBvcnQgeyBTZXR0aW5nc0NvbGxlY3Rpb24gfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXR0aW5nc1NlcnZpY2UnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBleHRlcm5hbCBzZXR0aW5ncyBuYW1lc3BhY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXR0aW5ncyBleHRlbmRzIEV2ZW50TGlzdGVuZXJNYW5hZ2VyIGltcGxlbWVudHMgU2V0dGluZ3NDb250cmFjdCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9zZXR0aW5nc0ltcGw6IFNldHRpbmdzSW1wbCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICAvLyBJbml0aWFsaXplIG91ciBldmVudCBoYW5kbGluZyBmb3IgdGhpcyBjbGFzc1xuICAgIHRoaXMuX3NldHRpbmdzSW1wbC5pbml0aWFsaXplRXZlbnRzKCkuZm9yRWFjaCgoZSkgPT4gdGhpcy5hZGROZXdFdmVudFR5cGUoZSkpO1xuICB9XG5cbiAgcHVibGljIGVyYXNlKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fc2V0dGluZ3NJbXBsLmVyYXNlKGtleSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0KGtleTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fc2V0dGluZ3NJbXBsLmdldChrZXkpO1xuICB9XG5cbiAgcHVibGljIGdldEFsbCgpOiBTZXR0aW5nc0NvbGxlY3Rpb24ge1xuICAgIHJldHVybiB0aGlzLl9zZXR0aW5nc0ltcGwuZ2V0QWxsKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzTW9kaWZpZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzSW1wbC5pc01vZGlmaWVkO1xuICB9XG5cbiAgcHVibGljIHNhdmVBc3luYygpOiBQcm9taXNlPFNldHRpbmdzQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiB0aGlzLl9zZXR0aW5nc0ltcGwuc2F2ZUFzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fc2V0dGluZ3NJbXBsLnNldChrZXksIHZhbHVlKTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEV2ZW50TGlzdGVuZXJNYW5hZ2VyIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBVSUltcGwgfSBmcm9tICcuLi9JbXBsL1VJSW1wbCc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGV4dGVybmFsIFVJIG5hbWVzcGFjZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFVJIGV4dGVuZHMgRXZlbnRMaXN0ZW5lck1hbmFnZXIgaW1wbGVtZW50cyBDb250cmFjdC5VSSB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9pbXBsOiBVSUltcGwpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBvdXIgZXZlbnQgaGFuZGxpbmcgZm9yIHRoaXMgY2xhc3NcbiAgICB0aGlzLl9pbXBsLmluaXRpYWxpemVFdmVudHMoKS5mb3JFYWNoKChlKSA9PiB0aGlzLmFkZE5ld0V2ZW50VHlwZShlKSk7XG4gIH1cblxuICBwdWJsaWMgZGlzcGxheURpYWxvZ0FzeW5jKHVybDogc3RyaW5nLCBwYXlsb2FkPzogc3RyaW5nLCBvcHRpb25zPzogQ29udHJhY3QuRGlhbG9nT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX2ltcGwuZGlzcGxheURpYWxvZ0FzeW5jKHVybCwgcGF5bG9hZCwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgc2VuZERpYWxvZ01lc3NhZ2VBc3luYyhtZXNzYWdlOiBzdHJpbmcsIHRhcmdldERpYWxvZ1VybD86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9pbXBsLnNlbmREaWFsb2dNZXNzYWdlQXN5bmMobWVzc2FnZSwgdGFyZ2V0RGlhbG9nVXJsKTtcbiAgfVxuXG4gIHB1YmxpYyBjbG9zZURpYWxvZyhwYXlsb2FkPzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5faW1wbC5jbG9zZURpYWxvZyhwYXlsb2FkKTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyBhcyBFbnVtTWFwcGluZ3MgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IENsYXNzTmFtZUtleSwgV29ya2Jvb2tGb3JtYXR0aW5nIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuZXhwb3J0IGNsYXNzIFdvcmtib29rRm9ybWF0dGluZ0VudlV0aWwge1xuICBwdWJsaWMgc3RhdGljIGNvbnZlcnRUb1dvcmtib29rRm9ybWF0dGluZyh3b3JrYm9va0Zvcm1hdHRpbmdNb2RlbD86IFdvcmtib29rRm9ybWF0dGluZyk6IENvbnRyYWN0Lldvcmtib29rRm9ybWF0dGluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF3b3JrYm9va0Zvcm1hdHRpbmdNb2RlbCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZm9ybWF0dGluZ01hcDogQXJyYXk8Q29udHJhY3QuRm9ybWF0dGluZ1NoZWV0PiA9IHdvcmtib29rRm9ybWF0dGluZ01vZGVsLmZvcm1hdHRpbmdTaGVldHMubWFwKChjdXJyZW50Rm9ybWF0dGluZ1NoZWV0KSA9PiB7XG4gICAgICAgIGNvbnN0IGZvcm1hdHRpbmdTaGVldDogQ29udHJhY3QuRm9ybWF0dGluZ1NoZWV0ID0ge1xuICAgICAgICAgIGNsYXNzTmFtZUtleTogRW51bU1hcHBpbmdzLmNsYXNzTmFtZUtleS5jb252ZXJ0KGN1cnJlbnRGb3JtYXR0aW5nU2hlZXQuY2xhc3NOYW1lS2V5KSxcbiAgICAgICAgICBjc3NQcm9wZXJ0aWVzOiBnZXRDc3NQcm9wZXJ0aWVzKGN1cnJlbnRGb3JtYXR0aW5nU2hlZXQuY2xhc3NOYW1lS2V5LCBjdXJyZW50Rm9ybWF0dGluZ1NoZWV0LmNzc1Byb3BlcnRpZXMpLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gZm9ybWF0dGluZ1NoZWV0O1xuICAgICAgfSk7XG4gICAgICBjb25zdCByZXN1bHQ6IENvbnRyYWN0Lldvcmtib29rRm9ybWF0dGluZyA9IHtcbiAgICAgICAgZm9ybWF0dGluZ1NoZWV0czogZm9ybWF0dGluZ01hcCxcbiAgICAgIH07XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRDc3NQcm9wZXJ0aWVzKGNsYXNzTmFtZUtleTogQ2xhc3NOYW1lS2V5LCBjc3NQcm9wZXJ0aWVzOiBSZWFjdC5DU1NQcm9wZXJ0aWVzKTogaW1wb3J0KCdyZWFjdCcpLkNTU1Byb3BlcnRpZXMge1xuICBpZiAoY2xhc3NOYW1lS2V5ID09PSBDbGFzc05hbWVLZXkuUm93RGl2aWRlcnMgfHwgY2xhc3NOYW1lS2V5ID09PSBDbGFzc05hbWVLZXkuQ29sdW1uRGl2aWRlcnMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYm9yZGVyQ29sb3I6IGNzc1Byb3BlcnRpZXMuYm9yZGVyQ29sb3IsXG4gICAgICBib3JkZXJTdHlsZTogY3NzUHJvcGVydGllcy5ib3JkZXJTdHlsZSxcbiAgICAgIGJvcmRlcldpZHRoOiBjc3NQcm9wZXJ0aWVzLmJvcmRlcldpZHRoLFxuICAgIH0gYXMgUmVhY3QuQ1NTUHJvcGVydGllcztcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZm9udEZhbWlseTogY3NzUHJvcGVydGllcy5mb250RmFtaWx5LFxuICAgIGZvbnRTaXplOiBjc3NQcm9wZXJ0aWVzLmZvbnRTaXplLFxuICAgIGZvbnRXZWlnaHQ6IGNzc1Byb3BlcnRpZXMuZm9udFdlaWdodCxcbiAgICBmb250U3R5bGU6IGNzc1Byb3BlcnRpZXMuZm9udFN0eWxlLFxuICAgIHRleHREZWNvcmF0aW9uOiBjc3NQcm9wZXJ0aWVzLnRleHREZWNvcmF0aW9uLFxuICAgIGNvbG9yOiBjc3NQcm9wZXJ0aWVzLmNvbG9yLFxuICB9O1xufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgZXh0ZXJuYWwgV29ya3NoZWV0Q29udGVudCBuYW1lc3BhY2UuXG4gKiBUaGlzIGRvZXMgbm90IGZvbGxvdyB0aGUgSW1wbCBwYXR0ZXJuIGFzIFdvcmtzaGVldENvbnRlbnQgaXNcbiAqIGN1cnJlbnRseSBqdXN0IGEgKHNpbmdsZSkgcHJvcGVydHkgYmFnLlxuICovXG5leHBvcnQgY2xhc3MgV29ya3NoZWV0Q29udGVudCBpbXBsZW1lbnRzIENvbnRyYWN0LldvcmtzaGVldENvbnRlbnQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfd29ya3NoZWV0OiBDb250cmFjdC5FeHRlbnNpb25Xb3Jrc2hlZXQpIHt9XG5cbiAgcHVibGljIGdldCB3b3Jrc2hlZXQoKTogQ29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0O1xuICB9XG59XG4iLCJpbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgRXh0ZW5zaW9uQm9vdHN0cmFwSW5mbywgUGFyYW1ldGVySWQsIFZlcmJJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9FeHRlbnNpb25zU2VydmljZU5hbWVzJztcbmltcG9ydCB7IEluaXRpYWxpemF0aW9uU2VydmljZSB9IGZyb20gJy4uL0luaXRpYWxpemF0aW9uU2VydmljZSc7XG5cbmV4cG9ydCBjbGFzcyBJbml0aWFsaXphdGlvblNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgSW5pdGlhbGl6YXRpb25TZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBFeHRlbnNpb25zU2VydmljZU5hbWVzLkluaXRpYWxpemF0aW9uU2VydmljZTtcbiAgfVxuXG4gIHB1YmxpYyBpbml0aWFsaXplRGFzaGJvYXJkRXh0ZW5zaW9uc0FzeW5jKGlzRXh0ZW5zaW9uRGlhbG9nOiBib29sZWFuLCBjb250ZXh0TWVudUlkczogc3RyaW5nW10pOiBQcm9taXNlPEV4dGVuc2lvbkJvb3RzdHJhcEluZm8+IHtcbiAgICBjb25zdCBwYXJhbXM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdpbml0aWFsaXplRGFzaGJvYXJkRXh0ZW5zaW9uc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5FeHRlbnNpb25Db250ZXh0TWVudUlkc106IGNvbnRleHRNZW51SWRzLFxuICAgICAgW1BhcmFtZXRlcklkLklzRXh0ZW5zaW9uRGlhbG9nXTogaXNFeHRlbnNpb25EaWFsb2csXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkluaXRpYWxpemVFeHRlbnNpb24sIHBhcmFtcykudGhlbjxFeHRlbnNpb25Cb290c3RyYXBJbmZvPigocmVzcG9uc2UpID0+IHtcbiAgICAgIC8vIFRPRE8gLSBWYWxpZGF0ZSByZXR1cm4gdmFsdWVcblxuICAgICAgY29uc3QgcmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0IGFzIEV4dGVuc2lvbkJvb3RzdHJhcEluZm87XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBFcnJvckNvZGVzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBFeHRlbnNpb25TZXR0aW5nc0luZm8sIFBhcmFtZXRlcklkLCBWZXJiSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlLCBUYWJsZWF1RXJyb3IgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9FeHRlbnNpb25zU2VydmljZU5hbWVzJztcbmltcG9ydCB7IFNldHRpbmdzQ29sbGVjdGlvbiwgU2V0dGluZ3NTZXJ2aWNlIH0gZnJvbSAnLi4vU2V0dGluZ3NTZXJ2aWNlJztcblxuZXhwb3J0IGNsYXNzIFNldHRpbmdzU2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBTZXR0aW5nc1NlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMuU2V0dGluZ3NTZXJ2aWNlO1xuICB9XG5cbiAgcHVibGljIHNhdmVTZXR0aW5nc0FzeW5jKHNldHRpbmdzOiBTZXR0aW5nc0NvbGxlY3Rpb24pOiBQcm9taXNlPFNldHRpbmdzQ29sbGVjdGlvbj4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdzYXZlU2V0dGluZ3NBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuU2V0dGluZ3NWYWx1ZXNdOiBzZXR0aW5ncyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuU2F2ZUV4dGVuc2lvblNldHRpbmdzLCBwYXJhbWV0ZXJzKS50aGVuPFNldHRpbmdzQ29sbGVjdGlvbj4oKHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSB2YWx1ZS5yZXN1bHQgYXMgRXh0ZW5zaW9uU2V0dGluZ3NJbmZvO1xuXG4gICAgICBpZiAoIXJlc3VsdCB8fCAhcmVzdWx0LnNldHRpbmdzVmFsdWVzKSB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnVW5leHBlY3RlZCBlcnJvciBzYXZpbmdzIHNldHRpbmdzLicpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0LnNldHRpbmdzVmFsdWVzO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBEaWFsb2dPcHRpb25zLCBEaWFsb2dTdHlsZSwgRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgRXh0ZW5zaW9uRGlhbG9nUmVzdWx0LCBQYXJhbWV0ZXJJZCwgVmVyYklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEVycm9ySGVscGVycywgRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzLCBTZXJ2aWNlSW1wbEJhc2UsIFRhYmxlYXVFcnJvciB9IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcyB9IGZyb20gJy4uL0V4dGVuc2lvbnNTZXJ2aWNlTmFtZXMnO1xuaW1wb3J0IHsgVUlTZXJ2aWNlIH0gZnJvbSAnLi4vVUlTZXJ2aWNlJztcblxuY29uc3QgREVGQVVMVF9ESUFMT0dfSEVJR0hUID0gNDAwOyAvLyBpbiBwaXhlbHNcbmNvbnN0IERFRkFVTFRfRElBTE9HX1dJRFRIID0gNjAwOyAvLyBpbiBwaXhlbHNcbmNvbnN0IERFRkFVTFRfRElBTE9HX1NUWUxFOiBEaWFsb2dTdHlsZSA9IERpYWxvZ1N0eWxlLldpbmRvdztcblxuZXhwb3J0IGNsYXNzIFVJU2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBVSVNlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMuVUlTZXJ2aWNlO1xuICB9XG5cbiAgcHVibGljIGRpc3BsYXlEaWFsb2dBc3luYyh1cmw6IHN0cmluZywgcGF5bG9hZDogc3RyaW5nLCBvcHRpb25zPzogRGlhbG9nT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdkaXNwbGF5RGlhbG9nQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkV4dGVuc2lvbkRpYWxvZ1VybF06IHVybCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5FeHRlbnNpb25EaWFsb2dQYXlsb2FkXTogcGF5bG9hZCxcbiAgICB9O1xuXG4gICAgY29uc3QgaDogbnVtYmVyID0gb3B0aW9ucyAmJiBvcHRpb25zLmhlaWdodCA/IG9wdGlvbnMuaGVpZ2h0IDogREVGQVVMVF9ESUFMT0dfSEVJR0hUO1xuICAgIGNvbnN0IHc6IG51bWJlciA9IG9wdGlvbnMgJiYgb3B0aW9ucy53aWR0aCA/IG9wdGlvbnMud2lkdGggOiBERUZBVUxUX0RJQUxPR19XSURUSDtcbiAgICBjb25zdCBkaWFsb2dTdHlsZTogRGlhbG9nU3R5bGUgPSBvcHRpb25zICYmIG9wdGlvbnMuZGlhbG9nU3R5bGUgPyBvcHRpb25zLmRpYWxvZ1N0eWxlIDogREVGQVVMVF9ESUFMT0dfU1RZTEU7XG5cbiAgICAvLyBPbiB0aGUgcGxhdGZvcm0gc2lkZSwgd2UgZG8gc29tZXRoaW5nIHJlYXNvbmFibGUgcmVnYXJkZXNzIG9mIHdoZXRoZXIgdGhlIHBhc3NlZFxuICAgIC8vIGhlaWdodCBhbmQgd2lkdGggYXJlIHRvbyBsYXJnZSBvciB0b28gc21hbGwuICBCdXQgdGhpcyBsaWtlbHkgaW5kaWNhdGVzIGEgZGV2ZWxvcGVyIGVycm9yLFxuICAgIC8vIHNvIHdlIHRocm93IGFuIGVycm9yIGhlcmUgdG8gaGVscCB3aXRoIGRlYnVnZ2luZy5cbiAgICBpZiAoaCA8PSAwIHx8IHcgPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsICdTaXplIHBhcmFtZXRlcnMgZm9yIGRpc3BsYXlEaWFsb2dBc3luYyBtdXN0IGJlIHBvc2l0aXZlJyk7XG4gICAgfVxuXG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5FeHRlbnNpb25EaWFsb2dIXSA9IGg7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5FeHRlbnNpb25EaWFsb2dXXSA9IHc7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUVudW1WYWx1ZTxEaWFsb2dTdHlsZT4oZGlhbG9nU3R5bGUsIERpYWxvZ1N0eWxlLCAnRGlhbG9nU3R5bGUnKTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkV4dGVuc2lvbkRpYWxvZ1N0eWxlXSA9IEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncy5kaWFsb2dTdHlsZXMuY29udmVydChkaWFsb2dTdHlsZSk7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5EaXNwbGF5RGlhbG9nLCBwYXJhbWV0ZXJzKS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgZGlhbG9nUmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0IGFzIEV4dGVuc2lvbkRpYWxvZ1Jlc3VsdDtcbiAgICAgIHN3aXRjaCAoZGlhbG9nUmVzdWx0KSB7XG4gICAgICAgIGNhc2UgRXh0ZW5zaW9uRGlhbG9nUmVzdWx0LkRpYWxvZ0FscmVhZHlPcGVuOlxuICAgICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5EaWFsb2dBbHJlYWR5T3BlbiwgJ1RoZXJlIGFscmVhZHkgZXhpc3RzIGFuIG9wZW4gZGlhbG9nIGZvciB0aGlzIGV4dGVuc2lvbi4nKTtcbiAgICAgICAgY2FzZSBFeHRlbnNpb25EaWFsb2dSZXN1bHQuSW52YWxpZERvbWFpbjpcbiAgICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgICAgICAgRXJyb3JDb2Rlcy5JbnZhbGlkRG9tYWluRGlhbG9nLFxuICAgICAgICAgICAgJ1RoZSB1cmwgb2YgYW4gZXh0ZW5zaW9uIGRpYWxvZyBtdXN0IG1hdGNoIHRoZSBkb21haW4gb2YgdGhlIHBhcmVudCBleHRlbnNpb24uJyxcbiAgICAgICAgICApO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIFN1Y2Nlc3MgY2FzZVxuICAgICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBjbG9zZURpYWxvZyhwYXlsb2FkPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2Nsb3NlRGlhbG9nJyxcbiAgICB9O1xuXG4gICAgaWYgKHBheWxvYWQpIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRXh0ZW5zaW9uRGlhbG9nUGF5bG9hZF0gPSBwYXlsb2FkO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkNsb3NlRGlhbG9nLCBwYXJhbWV0ZXJzKS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIHNlbmREaWFsb2dNZXNzYWdlQXN5bmMobWVzc2FnZTogc3RyaW5nLCB0YXJnZXREaWFsb2dVcmw/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnc2VuZERpYWxvZ01lc3NhZ2UnLFxuICAgICAgW1BhcmFtZXRlcklkLkV4dGVuc2lvbkRpYWxvZ01lc3NhZ2VdOiBtZXNzYWdlLFxuICAgIH07XG5cbiAgICBpZiAodGFyZ2V0RGlhbG9nVXJsKSB7XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkV4dGVuc2lvbkRpYWxvZ1VybF0gPSB0YXJnZXREaWFsb2dVcmw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuU2VuZERpYWxvZ01lc3NhZ2UsIHBhcmFtZXRlcnMpLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNldENsaWNrVGhyb3VnaEFzeW5jKGNsaWNrVGhyb3VnaEVuYWJsZWQ6IGJvb2xlYW4sIGV4dGVuc2lvblpvbmVJZDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlclR5cGUoY2xpY2tUaHJvdWdoRW5hYmxlZCwgJ2Jvb2xlYW4nLCAnY2xpY2tUaHJvdWdoRW5hYmxlZCcpO1xuXG4gICAgaWYgKGV4dGVuc2lvblpvbmVJZCA9PT0gdW5kZWZpbmVkIHx8IGV4dGVuc2lvblpvbmVJZCA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ0V4dGVuc2lvbiBJZCBpcyBpbnZhbGlkLicpO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkV4dGVuc2lvblpvbmVJZF06IGV4dGVuc2lvblpvbmVJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5DbGlja1Rocm91Z2hFbmFibGVkXTogY2xpY2tUaHJvdWdoRW5hYmxlZCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuU2V0Q2xpY2tUaHJvdWdoLCBwYXJhbWV0ZXJzKS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgSW50ZXJuYWxBcGlEaXNwYXRjaGVyIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEFwaVNlcnZpY2VSZWdpc3RyeSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgSW5pdGlhbGl6YXRpb25TZXJ2aWNlSW1wbCB9IGZyb20gJy4vSW1wbC9Jbml0aWFsaXphdGlvblNlcnZpY2VJbXBsJztcbmltcG9ydCB7IFNldHRpbmdzU2VydmljZUltcGwgfSBmcm9tICcuL0ltcGwvU2V0dGluZ3NTZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBVSVNlcnZpY2VJbXBsIH0gZnJvbSAnLi9JbXBsL1VJU2VydmljZUltcGwnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQgfSBmcm9tICcuL1NlcnZpY2VSZWdpc3RyeVV0aWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJBbGxFeHRlbnNpb25zU2VydmljZXMoZGlzcGF0Y2hlcjogSW50ZXJuYWxBcGlEaXNwYXRjaGVyKTogdm9pZCB7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgU2V0dGluZ3NTZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCBFeHRlbnNpb25zUmVnaXN0cnlJZCkpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IFVJU2VydmljZUltcGwoZGlzcGF0Y2hlciwgRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVySW5pdGlhbGl6YXRpb25FeHRlbnNpb25zU2VydmljZXMoZGlzcGF0Y2hlcjogSW50ZXJuYWxBcGlEaXNwYXRjaGVyKTogdm9pZCB7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgSW5pdGlhbGl6YXRpb25TZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCBFeHRlbnNpb25zUmVnaXN0cnlJZCkpO1xufVxuIiwiZXhwb3J0IGNvbnN0IEV4dGVuc2lvbnNSZWdpc3RyeUlkID0gMDtcbiIsIi8vIFRoaXMgZmlsZSByZS1leHBvcnRzIGV2ZXJ5dGhpbmcgd2hpY2ggaXMgcGFydCBvZiB0aGUgZXh0ZW5zaW9ucyBhcGkgcHVibGljIGludGVyZmFjZVxuXG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL0Fza0RhdGFJbnRlcmZhY2VzJztcbmV4cG9ydCB7XG4gIEFwaU1lbnVUeXBlLFxuICBDcm9zc3RhYkZpbGVGb3JtYXQsXG4gIERldmljZVR5cGUsXG4gIEVtYmVkZGluZ0Vycm9yQ29kZXMsXG4gIFRhYmxlYXVFdmVudFR5cGUgYXMgRW1iZWRkaW5nVGFibGVhdUV2ZW50VHlwZSxcbiAgRmlsZUZvcm1hdHMsXG4gIFByaW50T3JpZW50YXRpb24sXG4gIFByaW50UGFnZVNpemUsXG4gIFByaW50U2NhbGluZyxcbiAgUHVsc2VFcnJvck1lc3NhZ2VWaXNpYmlsaXR5LFxuICBQdWxzZUxheW91dCxcbiAgUHVsc2VUaW1lRGltZW5zaW9uLFxuICBTaGVldFNpemVCZWhhdmlvcixcbiAgVGFibGVhdURpYWxvZ1R5cGUsXG4gIFRvb2xiYXIsXG59IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvRW51bXMnO1xuZXhwb3J0IHtcbiAgQ3VzdG9tVmlld0V2ZW50LFxuICBDdXN0b21NYXJrQ29udGV4dE1lbnVFdmVudCBhcyBFbWJlZGRpbmdDdXN0b21NYXJrQ29udGV4dE1lbnVFdmVudCxcbiAgRmlsdGVyQ2hhbmdlZEV2ZW50IGFzIEVtYmVkZGluZ0ZpbHRlckNoYW5nZWRFdmVudCxcbiAgTWFya3NTZWxlY3RlZEV2ZW50IGFzIEVtYmVkZGluZ01hcmtTZWxlY3RlZEV2ZW50LFxuICBQYXJhbWV0ZXJDaGFuZ2VkRXZlbnQgYXMgRW1iZWRkaW5nUGFyYW1ldGVyQ2hhbmdlZEV2ZW50LFxuICBTdW1tYXJ5RGF0YUNoYW5nZWRFdmVudCBhcyBFbWJlZGRpbmdTdW1tYXJ5RGF0YUNoYW5nZWRFdmVudCxcbiAgVGFibGVhdVNoZWV0RXZlbnQgYXMgRW1iZWRkaW5nVGFibGVhdVNoZWV0RXZlbnQsXG4gIFRhYmxlYXVXb3Jrc2hlZXRFdmVudCBhcyBFbWJlZGRpbmdUYWJsZWF1V29ya3NoZWV0RXZlbnQsXG4gIFRvb2xiYXJTdGF0ZUNoYW5nZWRFdmVudCBhcyBFbWJlZGRpbmdUb29sYmFyU3RhdGVDaGFuZ2VkRXZlbnQsXG4gIEZpcnN0UHVsc2VNZXRyaWNTaXplS25vd25FdmVudCxcbiAgRmlyc3RWaXpTaXplS25vd25FdmVudCxcbiAgUHVsc2VFcnJvckV2ZW50LFxuICBQdWxzZUZpbHRlcnNDaGFuZ2VkRXZlbnQsXG4gIFB1bHNlTWV0cmljU2l6ZUNoYW5nZWRFdmVudCxcbiAgUHVsc2VJbnNpZ2h0RGlzY292ZXJlZEV2ZW50LFxuICBQdWxzZVRpbWVEaW1lbnNpb25DaGFuZ2VkRXZlbnQsXG4gIFB1bHNlVXJsQ2hhbmdlZEV2ZW50LFxuICBTdG9yeVBvaW50U3dpdGNoZWRFdmVudCxcbiAgVGFiU3dpdGNoZWRFdmVudCxcbiAgVXJsQWN0aW9uRXZlbnQsXG4gIFZpekxvYWRFcnJvckV2ZW50LFxuICBXb3JrYm9va1B1Ymxpc2hlZEFzRXZlbnQsXG59IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvRXZlbnRJbnRlcmZhY2VzJztcbmV4cG9ydCB7IFBhcmFtZXRlciBhcyBFbWJlZGRpbmdQYXJhbWV0ZXIgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1BhcmFtZXRlckludGVyZmFjZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0VtYmVkZGluZy9QdWxzZUludGVyZmFjZXMnO1xuZXhwb3J0IHtcbiAgQ29udGV4dE1lbnVPcHRpb25zLFxuICBFbWJlZGRpbmdBYnN0cmFjdFF1ZXJ5LFxuICBBdXRob3JpbmdXb3Jrc2hlZXQgYXMgRW1iZWRkaW5nQXV0aG9yaW5nV29ya3NoZWV0LFxuICBEYXNoYm9hcmQgYXMgRW1iZWRkaW5nRGFzaGJvYXJkLFxuICBEYXNoYm9hcmRPYmplY3QgYXMgRW1iZWRkaW5nRGFzaGJvYXJkT2JqZWN0LFxuICBTaGVldCBhcyBFbWJlZGRpbmdTaGVldCxcbiAgRW1iZWRkaW5nVml6U3RhdGVXaXRoRGF0YU1vZGVsLFxuICBXb3Jrc2hlZXQgYXMgRW1iZWRkaW5nV29ya3NoZWV0LFxuICBIaWVyYXJjaGljYWxMZXZlbHMsXG4gIFNoZWV0SW5mbyxcbiAgU2hlZXRTaXplLFxufSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1NoZWV0SW50ZXJmYWNlcyc7XG5leHBvcnQgeyBTdG9yeSwgU3RvcnlQb2ludCwgU3RvcnlQb2ludEluZm8gfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1N0b3J5SW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1RhYmxlYXVFcnJvcic7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1ZpekludGVyZmFjZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0VtYmVkZGluZy9XZWJDb21wb25lbnRJbnRlcmZhY2VzJztcbmV4cG9ydCB7XG4gIEN1c3RvbVZpZXcsXG4gIEF1dGhvcmluZ1dvcmtib29rIGFzIEVtYmVkZGluZ0F1dGhvcmluZ1dvcmtib29rLFxuICBXb3JrYm9vayBhcyBFbWJlZGRpbmdXb3JrYm9vayxcbn0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0VtYmVkZGluZy9Xb3JrYm9va0ludGVyZmFjZSc7XG5leHBvcnQgKiBmcm9tICcuL1NoYXJlZEFwaUV4dGVybmFsQ29udHJhY3QnO1xuIiwiLy8gVGhpcyBmaWxlIHJlLWV4cG9ydHMgZXZlcnl0aGluZyB3aGljaCBpcyBwYXJ0IG9mIHRoZSBleHRlbnNpb25zIGFwaSBwdWJsaWMgaW50ZXJmYWNlXG5cbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FeHRlbnNpb25zL0V2ZW50SW50ZXJmYWNlJztcbmV4cG9ydCB7IERhc2hib2FyZENvbnRlbnQgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9OYW1lc3BhY2VzL0Rhc2hib2FyZENvbnRlbnQnO1xuZXhwb3J0IHsgRW52aXJvbm1lbnQgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9OYW1lc3BhY2VzL0Vudmlyb25tZW50JztcbmV4cG9ydCB7IEV4dGVuc2lvbnMgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9OYW1lc3BhY2VzL0V4dGVuc2lvbnMnO1xuZXhwb3J0IHsgU2V0dGluZ3MgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9OYW1lc3BhY2VzL1NldHRpbmdzJztcbmV4cG9ydCB7XG4gIEVycm9yQ29kZXMsXG4gIEV4dGVuc2lvbkNvbnRleHQsXG4gIEV4dGVuc2lvbk1vZGUsXG4gIFRhYmxlYXVFdmVudFR5cGUsXG4gIFZpekltYWdlRW5jb2RpbmdUeXBlLFxuICBWaXpJbWFnZVBhbGV0dGVUeXBlLFxuICBWaXpJbWFnZVNpemVTZXR0aW5nQWxpZ25tZW50VHlwZSxcbiAgVml6SW1hZ2VTaXplU2V0dGluZ1R5cGUsXG4gIFZpekltYWdlU29ydERpcmVjdGlvblR5cGUsXG59IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FeHRlbnNpb25zL05hbWVzcGFjZXMvVGFibGVhdSc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9OYW1lc3BhY2VzL1VJJztcbmV4cG9ydCB7IFdvcmtzaGVldENvbnRlbnQgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9OYW1lc3BhY2VzL1dvcmtzaGVldENvbnRlbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0V4dGVuc2lvbnMvUGFyYW1ldGVySW50ZXJmYWNlcyc7XG5leHBvcnQge1xuICBEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUsXG4gIERhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUFycmF5LFxuICBEYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5TWFwLFxuICBEYXNoYm9hcmQgYXMgRXh0ZW5zaW9uRGFzaGJvYXJkLFxuICBEYXNoYm9hcmRPYmplY3QgYXMgRXh0ZW5zaW9uRGFzaGJvYXJkT2JqZWN0LFxuICBTaGVldCBhcyBFeHRlbnNpb25TaGVldCxcbiAgV29ya3NoZWV0IGFzIEV4dGVuc2lvbldvcmtzaGVldCxcbiAgUG9pbnQsXG4gIFpvbmVWaXNpYmlsaXR5TWFwLFxufSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9TaGVldEludGVyZmFjZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0V4dGVuc2lvbnMvVGFibGVhdUVycm9yJztcbmV4cG9ydCB7IFdvcmtib29rIGFzIEV4dGVuc2lvbldvcmtib29rIH0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0V4dGVuc2lvbnMvV29ya2Jvb2tJbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vU2hhcmVkQXBpRXh0ZXJuYWxDb250cmFjdCc7XG4iLCIvKipcbiAqIFRoaXMgaXMgeW91ciBtYWluLiBUaGlzIGlzIHdoZXJlIHlvdSByZS1leHBvcnQgZXZlcnl0aGluZyB5b3Ugd2FudCB0byBiZSBwdWJsaWNseSBhdmFpbGFibGUuXG4gKlxuICogVGhlIGJ1aWxkIGVuZm9yY2VzIHRoYXQgdGhlIGZpbGUgaGFzIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGdsb2JhbCB2YXJpYWJsZSB0aGF0IGlzIGV4cG9ydGVkLlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vRW1iZWRkaW5nQXBpRXh0ZXJuYWxDb250cmFjdCc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVuc2lvbnNBcGlFeHRlcm5hbENvbnRyYWN0JztcbiIsImltcG9ydCB7IFdlYkNvbXBvbmVudExvY2FsU2V0dGluZ3MsIFdlYkNvbXBvbmVudFNldHRpbmdzU2hhcmVkIH0gZnJvbSAnLi9XZWJDb21wb25lbnRJbnRlcmZhY2VzJztcblxuLyoqXG4gKiBUaGUgbmFtZXMgb2YgdGhlIHN0cmluZyBjb25zdGFudHMgeW91IGNhbiB1c2UgYXMgSFRNTCBhdHRyaWJ1dGVzIGZvciB0aGUgPHRhYmxlYXUtYXNrLWRhdGE+IHdlYiBjb21wb25lbnQuXG4gKiBAaWdub3JlXG4gKiBAZGVwcmVjYXRlZFxuICovXG5leHBvcnQgZW51bSBBc2tEYXRhQXR0cmlidXRlcyB7XG4gIE9yaWdpbiA9ICdvcmlnaW4nLFxuICBTaG93RW1iZWQgPSAnc2hvdy1lbWJlZCcsXG4gIFNob3dQaW4gPSAnc2hvdy1waW4nLFxuICBTaG93U2F2ZSA9ICdzaG93LXNhdmUnLFxuICBTaG93U2hhcmUgPSAnc2hvdy1zaGFyZScsXG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc2tEYXRhU2V0dGluZ3MgZXh0ZW5kcyBXZWJDb21wb25lbnRTZXR0aW5nc1NoYXJlZCwgV2ViQ29tcG9uZW50TG9jYWxTZXR0aW5ncyB7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZW1iZWQgYnV0dG9uIGlzIGhpZGRlbiBvciB2aXNpYmxlLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtYXNrLWRhdGEgaWQ9XCJ0YWJsZWF1QXNrRGF0YVwiIHNob3ctZW1iZWQ+XG4gICAqIGBgYFxuICAgKi9cbiAgc2hvd0VtYmVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHBpbiBidXR0b24gaXMgaGlkZGVuIG9yIHZpc2libGUuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS1hc2stZGF0YSBpZD1cInRhYmxlYXVBc2tEYXRhXCIgc2hvdy1waW4+XG4gICAqIGBgYFxuICAgKi9cbiAgc2hvd1Bpbj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzYXZlIGJ1dHRvbiBpcyBoaWRkZW4gb3IgdmlzaWJsZS5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LWFzay1kYXRhIGlkPVwidGFibGVhdUFza0RhdGFcIiBzaG93LXNhdmU+XG4gICAqIGBgYFxuICAgKi9cbiAgc2hvd1NhdmU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgc2hhcmUgYnV0dG9uIGlzIGhpZGRlbiBvciB2aXNpYmxlLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtYXNrLWRhdGEgaWQ9XCJ0YWJsZWF1QXNrRGF0YVwiIHNob3ctc2hhcmU+XG4gICAqIGBgYFxuICAgKi9cbiAgc2hvd1NoYXJlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogIFVzZWQgZm9yIHRlbGVtZXRyeVxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtYXNrLWRhdGEgaWQ9XCJ0YWJsZWF1QXNrRGF0YVwiIG9yaWdpbj1cImVtYmVkZGluZ1NpdGVcIj5cbiAgICogYGBgXG4gICAqL1xuICBvcmlnaW4/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIGludGVyZmFjZSBmb3IgdGhlIHRvcCBsZXZlbCBBc2tEYXRhIG9iamVjdC5cbiAqIEBkZXByZWNhdGVkXG4gKiovXG5leHBvcnQgaW50ZXJmYWNlIEFza0RhdGEgZXh0ZW5kcyBBc2tEYXRhU2V0dGluZ3Mge31cbiIsIi8vIEFsbCBlbnVtIHZhbHVlcyBtYWRlIGF2YWlsYWJsZSB0byBFbWJlZGRpbmcgZGV2ZWxvcGVycy5cbi8vIEVudW1zIHNob3VsZCBiZSBrZXB0IGluIGFscGhhYmV0aWNhbCBvcmRlci5cbi8vIE1vc3Qgb2YgdGhlbSBzaG91bGQgbWF0Y2ggYW4gZW51bSBvbiB0aGUgc2VydmVyIGRlZmluZWQgYXRcbi8vIHdvcmtncm91cC92cWx3ZWIvc2NyaXB0c2hhcnAvc3JjL0FwaVNoYXJlZC9QdWJsaWNFbnVtcy5jcyNMMzk4OjE3XG5cbi8qKlxuICogQ3Jvc3N0YWIgZmlsZSBmb3JtYXRzIGF2YWlsYWJsZSB0byB1c2Ugd2l0aCB7QGxpbmsgVml6LmV4cG9ydENyb3NzdGFiQXN5bmN9XG4gKi9cbmV4cG9ydCBlbnVtIENyb3NzdGFiRmlsZUZvcm1hdCB7XG4gIENTViA9ICdjc3YnLFxuICBFeGNlbCA9ICd4bHN4Jyxcbn1cblxuLyoqXG4gKiBEZXZpY2UgdHlwZXMgYXZhaWxhYmxlIHRvIHVzZSB3aXRoIHtAbGluayBWaXouZGV2aWNlfVxuICovXG5leHBvcnQgZW51bSBEZXZpY2VUeXBlIHtcbiAgRGVmYXVsdCA9ICdkZWZhdWx0JyxcbiAgRGVza3RvcCA9ICdkZXNrdG9wJyxcbiAgVGFibGV0ID0gJ3RhYmxldCcsXG4gIFBob25lID0gJ3Bob25lJyxcbn1cblxuLyoqXG4gKiBBbGwgZXJyb3IgY29kZXMgdXNlZCBieSB0aGUgRW1iZWRkaW5nIEFQSS5cbiAqL1xuZXhwb3J0IGVudW0gRW1iZWRkaW5nRXJyb3JDb2RlcyB7XG4gIC8qKlxuICAgKiBSYWlzZWQgd2hlbiBhIHJlcXVlc3QgdG8gdGhlIGF1dGggZW5kcG9pbnQgZmFpbHMuXG4gICAqL1xuICBBdXRoRmFpbGVkID0gJ2F1dGgtZmFpbGVkJyxcbiAgLyoqXG4gICAqIFRoZSBicm93c2VyIGlzIG5vdCBjYXBhYmxlIG9mIHN1cHBvcnRpbmcgdGhlIFRhYmxlYXUgRW1iZWRkaW5nIEFQSVxuICAgKi9cbiAgQnJvd3Nlck5vdENhcGFibGUgPSAnYnJvd3Nlci1ub3QtY2FwYWJsZScsXG4gIC8qKlxuICAgKiBUaGUgcGVybWlzc2lvbnMgb24gYSB3b3JrYm9vayBvciBhIHZpZXcgZG8gbm90IGFsbG93IGRvd25sb2FkaW5nIHRoZSB3b3JrYm9vay5cbiAgICovXG4gIERvd25sb2FkV29ya2Jvb2tOb3RBbGxvd2VkID0gJ2Rvd25sb2FkLXdvcmtib29rLW5vdC1hbGxvd2VkJyxcbiAgLyoqXG4gICAqIFRocm93biB3aGVuIGFuIGVycm9yIG9jY3VycyB3aGlsZSBhdHRlbXB0aW5nIHRvIHBlcmZvcm0gYSBmaWx0ZXIgb3BlcmF0aW9uLlxuICAgKi9cbiAgRmlsdGVyQ2Fubm90QmVQZXJmb3JtZWQgPSAnZmlsdGVyLWNhbm5vdC1iZS1wZXJmb3JtZWQnLFxuICAvKipcbiAgICogVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBzd2l0Y2ggdG8gYSBzaGVldCBieSBpbmRleCB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSB3b3JrYm9vay5cbiAgICovXG4gIEluZGV4T3V0T2ZSYW5nZSA9ICdpbmRleC1vdXQtb2YtcmFuZ2UnLFxuICAvKipcbiAgICogVGhyb3duIHdoZW4gYW4gZXJyb3Igb2NjdXJzIHdpdGhpbiB0aGUgVGFibGVhdSBFbWJlZGRpbmcgQVBJLiBDb250YWN0IFRhYmxlYXUgU3VwcG9ydC5cbiAgICovXG4gIEludGVybmFsRXJyb3IgPSAnaW50ZXJuYWwtZXJyb3InLFxuICAvKipcbiAgICogQW4gb3BlcmF0aW9uIHdhcyBhdHRlbXB0ZWQgb24gYSBjdXN0b20gdmlldyB0aGF0IGRvZXMgbm90IGV4aXN0LlxuICAgKi9cbiAgSW52YWxpZEN1c3RvbVZpZXdOYW1lID0gJ2ludmFsaWQtY3VzdG9tLXZpZXctbmFtZScsXG4gIC8qKlxuICAgKiBBbiBpbnZhbGlkIGRhdGUgd2FzIHNwZWNpZmllZCBpbiBhIG1ldGhvZCB0aGF0IHJlcXVpcmVkIGEgZGF0ZSBwYXJhbWV0ZXIuXG4gICAqL1xuICBJbnZhbGlkRGF0ZVBhcmFtZXRlciA9ICdpbnZhbGlkLWRhdGUtcGFyYW1ldGVyJyxcbiAgLyoqXG4gICAqIEVpdGhlciBhIGZpbHRlciBvcGVyYXRpb24gd2FzIGF0dGVtcHRlZCBvbiBhIGZpZWxkIHRoYXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGRhdGEgc291cmNlLCBvciB0aGUgdmFsdWUgc3VwcGxpZWRcbiAgICogaW4gdGhlIGZpbHRlciBvcGVyYXRpb24gaXMgdGhlIHdyb25nIGRhdGEgdHlwZSBvciBmb3JtYXQuXG4gICAqL1xuICBpbnZhbGlkRmlsdGVyRmllbGROYW1lT3JWYWx1ZSA9ICdpbnZhbGlkLWZpbHRlci1maWVsZC1uYW1lJyxcbiAgLyoqXG4gICAqIEEgcGFyYW1ldGVyIGlzIG5vdCB0aGUgY29ycmVjdCBkYXRhIHR5cGUgb3IgZm9ybWF0LiBUaGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCBpbiB0aGUgRXJyb3IubWVzc2FnZVxuICAgKiBmaWVsZC5cbiAgICovXG4gIEludmFsaWRQYXJhbWV0ZXIgPSAnaW52YWxpZC1wYXJhbWV0ZXInLFxuICAvKipcbiAgICogVGhlIGN1cnJlbnRseSBhcHBsaWVkIHRpbWUgZGltZW5zaW9uIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkIG9yIGlzIGludmFsaWQuXG4gICAqL1xuICBJbnZhbGlkVGltZURpbWVuc2lvbiA9ICdpbnZhbGlkLXRpbWUtZGltZW5zaW9uJyxcbiAgLyoqXG4gICAqIEEgbmVnYXRpdmUgc2l6ZSB3YXMgc3BlY2lmaWVkIG9yIHRoZSBtYXhTaXplIHZhbHVlIGlzIGxlc3MgdGhhbiBtaW5TaXplIGluIFNoZWV0LmNoYW5nZVNpemVBc3luYygpLlxuICAgKi9cbiAgSW52YWxpZFNpemUgPSAnaW52YWxpZC1zaXplJyxcbiAgLyoqXG4gICAqIEF0dGVtcHRlZCB0byBnZXQgYW4gYXV0aG9yaW5nIHdvcmtzaGVldCB3aGVuIHRoZSBjdXJyZW50IHNoZWV0IGlzIG5vdCBhIHdvcmtzaGVldC5cbiAgICogQGlnbm9yZVxuICAgKi9cbiAgSW52YWxpZFNoZWV0VHlwZSA9ICdpbnZhbGlkLXNoZWV0LXR5cGUnLFxuICAvKipcbiAgICogQSBiZWhhdmlvciB2YWx1ZSB3YXMgZm91bmQgdGhhdCBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIFNoZWV0U2l6ZUJlaGF2aW9yIGVudW0uXG4gICAqL1xuICBJbnZhbGlkU2l6ZUJlaGF2aW9yID0gJ2ludmFsaWQtc2l6ZS1iZWhhdmlvcicsXG4gIC8qKlxuICAgKiBBIGJlaGF2aW9yIG90aGVyIHRoYW4gU2hlZXRTaXplQmVoYXZpb3IuQXV0b21hdGljIHdhcyBzcGVjaWZpZWQgaW4gU2hlZXQuY2hhbmdlU2l6ZUFzeW5jKCkgd2hlbiB0aGUgc2hlZXQgaXMgYVxuICAgKiBXb3Jrc2hlZXQgaW5zdGFuY2UuXG4gICAqL1xuICBJbnZhbGlkU2l6ZUJlaGF2aW9yT25Xb3Jrc2hlZXQgPSAnaW52YWxpZC1zaXplLWJlaGF2aW9yLW9uLXdvcmtzaGVldCcsXG4gIC8qKlxuICAgKiBUaGUgVVJMIHNwZWNpZmllZCBpbiB0aGUgVml6IGNsYXNzIGNvbnN0cnVjdG9yIGlzIG5vdCB2YWxpZC5cbiAgICovXG4gIEludmFsaWRVcmwgPSAnaW52YWxpZC11cmwnLFxuICAvKipcbiAgICogVGhlIG1heFNpemUgZmllbGQgaXMgbWlzc2luZyBpbiBTaGVldC5jaGFuZ2VTaXplQXN5bmMoKSB3aGVuIHNwZWNpZnlpbmcgU2hlZXRTaXplQmVoYXZpb3IuQXRNb3N0LlxuICAgKi9cbiAgTWlzc2luZ01heFNpemUgPSAnbWlzc2luZy1tYXgtc2l6ZScsXG4gIC8qKlxuICAgKiBUaGUgbWluU2l6ZSBmaWVsZCBpcyBtaXNzaW5nIGluIFNoZWV0LmNoYW5nZVNpemVBc3luYygpIHdoZW4gc3BlY2lmeWluZyBTaGVldFNpemVCZWhhdmlvci5BdExlYXN0LlxuICAgKi9cbiAgTWlzc2luZ01pblNpemUgPSAnbWlzc2luZy1taW4tc2l6ZScsXG4gIC8qKlxuICAgKiBUaGUgbWluU2l6ZSBvciBtYXhTaXplIGZpZWxkIGlzIG1pc3NpbmcgaW4gU2hlZXQuY2hhbmdlU2l6ZUFzeW5jKCkgd2hlbiBzcGVjaWZ5aW5nIFNoZWV0U2l6ZUJlaGF2aW9yLlJhbmdlLlxuICAgKi9cbiAgTWlzc2luZ01pbk1heFNpemUgPSAnbWlzc2luZy1taW4tbWF4LXNpemUnLFxuICAvKipcbiAgICogQ2FuIG9jY3VyIGlmIHRoZSBlbWJlZGRpbmcgYXBwIGludGVyYWN0cyB3aXRoIGEgcGFyYW1ldGVyIHRoYXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSB3b3Jrc2hlZXQuXG4gICAqL1xuICBNaXNzaW5nUGFyYW1ldGVyID0gJ21pc3NpbmctcGFyYW1ldGVyJyxcbiAgLyoqXG4gICAqIFRoZSByYW5nZU4gZmllbGQgaXMgbWlzc2luZyBmb3IgYSByZWxhdGl2ZSBkYXRlIGZpbHRlciBvZiB0eXBlIExBU1ROIG9yIE5FWFROLlxuICAgKi9cbiAgTWlzc2luZ1JhbmdlTkZvclJlbGF0aXZlRGF0ZUZpbHRlcnMgPSAnbWlzc2luZy1yYW5nZS1uLWZvci1yZWxhdGl2ZS1kYXRlLWZpbHRlcnMnLFxuICAvKipcbiAgICogQW4gYXR0ZW1wdCB3YXMgbWFkZSB0byBhY2Nlc3MgU2hlZXQuZ2V0VXJsKCkgb24gYSBoaWRkZW4gc2hlZXQuIEhpZGRlbiBzaGVldHMgZG8gbm90IGhhdmUgVVJMcy5cbiAgICovXG4gIE5vVXJsRm9ySGlkZGVuV29ya3NoZWV0ID0gJ25vLXVybC1mb3ItaGlkZGVuLXdvcmtzaGVldCcsXG4gIC8qKlxuICAgKiBPbmUgb3IgYm90aCBvZiB0aGUgcGFyZW50RWxlbWVudCBvciB0aGUgVVJMIHBhcmFtZXRlcnMgaXMgbm90IHNwZWNpZmllZCBpbiB0aGUgVml6IGNvbnN0cnVjdG9yLlxuICAgKi9cbiAgTm9VcmxPclBhcmVudEVsZW1lbnROb3RGb3VuZCA9ICduby11cmwtb3ItcGFyZW50LWVsZW1lbnQtbm90LWZvdW5kJyxcbiAgLyoqXG4gICAqIEFuIG9wZXJhdGlvbiB3YXMgYXR0ZW1wdGVkIG9uIGEgc2hlZXQgdGhhdCBpcyBub3QgYWN0aXZlIG9yIGVtYmVkZGVkIHdpdGhpbiB0aGUgYWN0aXZlIGRhc2hib2FyZC5cbiAgICovXG4gIE5vdEFjdGl2ZVNoZWV0ID0gJ25vdC1hY3RpdmUtc2hlZXQnLFxuICAvKipcbiAgICogQSByZXF1aXJlZCBwYXJhbWV0ZXIgd2FzIG5vdCBzcGVjaWZpZWQsIG51bGwsIG9yIGFuIGVtcHR5IHN0cmluZy9hcnJheS5cbiAgICovXG4gIE51bGxPckVtcHR5UGFyYW1ldGVyID0gJ251bGwtb3ItZW1wdHktcGFyYW1ldGVyJyxcbiAgLyoqXG4gICAqIEFuIG9wZXJhdGlvbiB3YXMgYXR0ZW1wdGVkIG9uIGEgc2hlZXQgdGhhdCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgd29ya2Jvb2suXG4gICAqL1xuICBTaGVldE5vdEluV29ya2Jvb2sgPSAnc2hlZXQtbm90LWluLXdvcmtib29rJyxcbiAgLyoqXG4gICAqIEFuIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgb24gYSBDdXN0b21WaWV3IG9iamVjdCB0aGF0IGlzIG5vIGxvbmdlciB2YWxpZCAoaXQgaGFzIGJlZW4gcmVtb3ZlZCkuXG4gICAqL1xuICBTdGFsZURhdGFSZWZlcmVuY2UgPSAnc3RhbGUtZGF0YS1yZWZlcmVuY2UnLFxuICAvKipcbiAgICogVW5rbm93biBlcnJvciB0cmlnZ2VyZWQgZHVyaW5nIHRoZSBhdXRoIGZsb3cuXG4gICAqL1xuICBVbmtub3duQXV0aEVycm9yID0gJ3Vua25vd24tYXV0aC1lcnJvcicsXG4gIC8qKlxuICAgKiBBbiB1bmtub3duIGV2ZW50IG5hbWUgd2FzIHNwZWNpZmllZCBpbiB0aGUgY2FsbCB0byBWaXouYWRkRXZlbnRMaXN0ZW5lciBvciBWaXoucmVtb3ZlRXZlbnRMaXN0ZW5lci5cbiAgICovXG4gIFVuc3VwcG9ydGVkRXZlbnROYW1lID0gJ3Vuc3VwcG9ydGVkLWV2ZW50LW5hbWUnLFxuICAvKipcbiAgICogQSBWaXogb2JqZWN0IGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZCBhcyBhIGNoaWxkIG9mIHRoZSBwYXJlbnRFbGVtZW50IHNwZWNpZmllZCBpbiB0aGUgVml6IGNvbnN0cnVjdG9yLlxuICAgKi9cbiAgVml6QWxyZWFkeUluTWFuYWdlciA9ICd2aXotYWxyZWFkeS1pbi1tYW5hZ2VyJyxcbiAgLyoqXG4gICAqIEZ1bmN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGVtYmVkZGluZyBhcGkuXG4gICAqL1xuICBJbXBsZW1lbnRhdGlvbkVycm9yID0gJ3dyb25nLWltcGxlbWVudGF0aW9uJyxcbiAgLyoqXG4gICAqIEBOb3RJbXBsZW1lbnRlZFxuICAgKi9cbiAgTm90SW1wbGVtZW50ZWQgPSAnbm90LWltcGxlbWVudGVkJyxcbiAgLyoqXG4gICAqIFVua25vd24gZXJyb3IgZHVyaW5nIGV2ZW50IGluaXRpYWxpemF0aW9uXG4gICAqL1xuICBFdmVudEluaXRpYWxpemF0aW9uRXJyb3IgPSAnZXZlbnQtaW5pdGlhbGl6YXRpb24tZXJyb3InLFxuICAvKipcbiAgICogVmVyc2lvbiBvZiB0aGUgZW1iZWRkaW5nIGFwaSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSB2ZXJzaW9uIG9mIHRhYmxlYXVcbiAgICovXG4gIEluY29tcGF0aWJsZVZlcnNpb25FcnJvciA9ICdpbmNvbXBhdGlibGUtdmVyc2lvbi1lcnJvcicsXG5cbiAgLyoqXG4gICAqIFVua25vd24ge0BsaW5rIFRhYmxlYXVEaWFsb2dUeXBlfSBwYXNzZWQgaW4gdG8gVml6LmRpc3BsYXlEaWFsb2dBc3luYy5cbiAgICovXG4gIFVua25vd25EaWFsb2dUeXBlID0gJ3Vua25vd24tZGlhbG9nLXR5cGUnLFxuXG4gIC8qKlxuICAgKiBDYW4gb2NjdXIgaWYgdGhlIEFQSSBpbnRlcmFjdHMgd2l0aCBhIGZpbHRlciB0aGF0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgd29ya3NoZWV0LlxuICAgKiBDYW4gYWxzbyBvY2N1cnMgaWYgYSB7QGxpbmsgRmlsdGVyVHlwZX0gaGFzIG5vdCBiZWVuIGltcGxlbWVudGVkLlxuICAgKi9cbiAgRmlsdGVyTWlzc2luZ09yTm90SW1wbGVtZW50ZWQgPSAnZmlsdGVyLW1pc3Npbmctbm90LWltcGxlbWVudGVkJyxcblxuICAvKipcbiAgICogQ2FuIG9jY3VyIGlmIHN0b3J5IHBvaW50IGlkcyBubyBsb25nZXIgbWF0Y2guXG4gICAqL1xuICBTdG9yeVBvaW50SWRNaXNtYXRjaCA9ICdzdG9yeXBvaW50LWlkLW1pc21hdGNoJyxcbn1cblxuLyoqXG4gKiBGb3JtYXRzIGF2YWlsYWJsZSB0byB1c2Ugd2l0aCBkaXNwbGF5U3RhdGljSW1hZ2UgaW4gQFZpekludGVyZmFjZXNcbiAqL1xuZXhwb3J0IGVudW0gRmlsZUZvcm1hdHMge1xuICBQREYgPSAncGRmJyxcbiAgUE5HID0gJ3BuZycsXG59XG5cbmV4cG9ydCBlbnVtIFByaW50T3JpZW50YXRpb24ge1xuICBQb3J0cmFpdCA9ICdwb3J0cmFpdCcsXG4gIExhbmRzY2FwZSA9ICdsYW5kc2NhcGUnLFxufVxuXG5leHBvcnQgZW51bSBQcmludFBhZ2VTaXplIHtcbiAgTGV0dGVyID0gJ2xldHRlcicsXG4gIExlZ2FsID0gJ2xlZ2FsJyxcbiAgTm90ZSA9ICdub3RlJyxcbiAgRm9saW8gPSAnZm9saW8nLFxuICBUYWJsb2lkID0gJ3RhYmxvaWQnLFxuICBMZWRnZXIgPSAnbGVkZ2VyJyxcbiAgU3RhdGVtZW50ID0gJ3N0YXRlbWVudCcsXG4gIEV4ZWN1dGl2ZSA9ICdleGVjdXRpdmUnLFxuICBBMyA9ICdBMycsXG4gIEE0ID0gJ0E0JyxcbiAgQTUgPSAnQTUnLFxuICBCNCA9ICdCNCcsXG4gIEI1ID0gJ0I1JyxcbiAgUXVhcnRvID0gJ3F1YXJ0bycsXG4gIFVuc3BlY2lmaWVkID0gJ3Vuc3BlY2lmaWVkJyxcbn1cblxuZXhwb3J0IGVudW0gUHJpbnRTY2FsaW5nIHtcbiAgQXV0b21hdGljID0gJ2F1dG9tYXRpYycsXG4gIFBlcmMyNSA9ICcyNSUnLFxuICBQZXJjNTAgPSAnNTAlJyxcbiAgUGVyYzYwID0gJzYwJScsXG4gIFBlcmM3NSA9ICc3NSUnLFxuICBQZXJjODAgPSAnODAlJyxcbiAgUGVyYzkwID0gJzkwJScsXG4gIFBlcmMxMDAgPSAnMTAwJScsXG4gIFBlcmMyMDAgPSAnMjAwJScsXG4gIFBlcmM0MDAgPSAnNDAwJScsXG4gIEF0TW9zdDFQYWdlSGlnaCA9ICdhdC1tb3N0LTEtcGFnZS1oaWdoJyxcbiAgQXRNb3N0MlBhZ2VzSGlnaCA9ICdhdC1tb3N0LTItcGFnZXMtaGlnaCcsXG4gIEF0TW9zdDFQYWdlV2lkZSA9ICdhdC1tb3N0LTEtcGFnZS13aWRlJyxcbiAgQXRNb3N0MlBhZ2VzV2lkZSA9ICdhdC1tb3N0LTItcGFnZXMtd2lkZScsXG59XG5cbmV4cG9ydCBlbnVtIFJldmVydFZpelNlbGVjdGlvbiB7XG4gIEFsbCA9ICdhbGwnLFxuICBBeGVzID0gJ2F4ZXMnLFxuICBGaWx0ZXJzID0gJ2ZpbHRlcnMnLFxuICBTb3J0cyA9ICdzb3J0cycsXG4gIFNoZWx2ZXMgPSAnc2hlbHZlcycsXG59XG5cbmV4cG9ydCBlbnVtIFRvb2xiYXJCdXR0b25zIHtcbiAgQWxlcnRzID0gJ2FsZXJ0cycsXG4gIEFza0RhdGEgPSAnYXNrRGF0YScsXG4gIEN1c3RvbVZpZXdzID0gJ2N1c3RvbVZpZXdzJyxcbiAgRGF0YURldGFpbHMgPSAnZGF0YURldGFpbHMnLFxuICBTaGFyZSA9ICdzaGFyZScsXG4gIFN1YnNjcmliZSA9ICdzdWJzY3JpYmUnLFxufVxuXG5leHBvcnQgZW51bSBUb29sYmFyIHtcbiAgVG9wID0gJ3RvcCcsXG4gIEJvdHRvbSA9ICdib3R0b20nLFxuICBIaWRkZW4gPSAnaGlkZGVuJyxcbn1cblxuZXhwb3J0IGVudW0gU2hlZXRTaXplQmVoYXZpb3Ige1xuICBBdXRvbWF0aWMgPSAnYXV0b21hdGljJyxcbiAgRXhhY3RseSA9ICdleGFjdGx5JyxcbiAgUmFuZ2UgPSAncmFuZ2UnLFxuICBBdExlYXN0ID0gJ2F0bGVhc3QnLFxuICBBdE1vc3QgPSAnYXRtb3N0Jyxcbn1cblxuZXhwb3J0IGVudW0gUHVsc2VMYXlvdXQge1xuICBEZWZhdWx0ID0gJ2RlZmF1bHQnLFxuICBDYXJkID0gJ2NhcmQnLFxuICBCYW4gPSAnYmFuJyxcbn1cblxuZXhwb3J0IGVudW0gUHVsc2VUaW1lRGltZW5zaW9uIHtcbiAgVG9kYXkgPSAnVG9kYXknLFxuICBZZXN0ZXJkYXkgPSAnWWVzdGVyZGF5JyxcbiAgV2Vla1RvRGF0ZSA9ICdXZWVrVG9EYXRlJyxcbiAgTGFzdFdlZWsgPSAnTGFzdFdlZWsnLFxuICBNb250aFRvRGF0ZSA9ICdNb250aFRvRGF0ZScsXG4gIExhc3RNb250aCA9ICdMYXN0TW9udGgnLFxuICBRdWFydGVyVG9EYXRlID0gJ1F1YXJ0ZXJUb0RhdGUnLFxuICBMYXN0UXVhcnRlciA9ICdMYXN0UXVhcnRlcicsXG4gIFllYXJUb0RhdGUgPSAnWWVhclRvRGF0ZScsXG4gIExhc3RZZWFyID0gJ0xhc3RZZWFyJyxcbn1cblxuZXhwb3J0IGVudW0gUHVsc2VFcnJvck1lc3NhZ2VWaXNpYmlsaXR5IHtcbiAgVmlzaWJsZSA9ICd2aXNpYmxlJyxcbiAgSGlkZGVuID0gJ2hpZGRlbicsXG4gIFN1cHByZXNzZWQgPSAnc3VwcHJlc3NlZCcsXG59XG5cbi8qKlxuICogQmUgY2FyZWZ1bCB3aGVuIGFkZGluZyBuZXcgZXZlbnQgdHlwZXMuIEV4dGVuc2lvbnMgYW5kIGVtYmVkZGluZyBmb2xsb3cgdHdvIGRpZmZlcmVudCBwYXR0ZXJucyBvbiBob3cgZXZlbnRzIGFyZSBuYW1lZC5cbiAqIEV2ZW50cyBzaG91bGQgYmUgYWxsIGxvd2VyIGNhc2UgYW5kIHdpdGhvdXQgaHlwaGVucyBvciB1bmRlcnNjb3Jlcy5cbiAqL1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIHR5cGUgb2YgdGFibGVhdSBlbWJlZGRpbmcgZXZlbnQgdGhhdCBjYW4gYmUgbGlzdGVuZWQgZm9yLlxuICovXG5leHBvcnQgZW51bSBUYWJsZWF1RXZlbnRUeXBlIHtcbiAgLyoqXG4gICAqIFJhaXNlZCB3aGVuIGEgY3VzdG9tIHZpZXcgaGFzIGZpbmlzaGVkIGxvYWRpbmcuIFRoaXMgZXZlbnQgaXMgcmFpc2VkIGFmdGVyIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBmb3Ige0BsaW5rIEZpcnN0SW50ZXJhY3RpdmV9IChpZiBhbnkpIGhhcyBiZWVuIGNhbGxlZC5cbiAgICpcbiAgICogQGNhdGVnb3J5IFZpZXdpbmdcbiAgICovXG4gIEN1c3RvbVZpZXdMb2FkZWQgPSAnY3VzdG9tdmlld2xvYWRlZCcsXG5cbiAgLyoqXG4gICAqIFJhaXNlZCB3aGVuIGEgY3VzdG9tIHZpZXcgaGFzIGJlZW4gcmVtb3ZlZC5cbiAgICpcbiAgICogQGNhdGVnb3J5IFZpZXdpbmdcbiAgICovXG4gIEN1c3RvbVZpZXdSZW1vdmVkID0gJ2N1c3RvbXZpZXdyZW1vdmVkJyxcblxuICAvKipcbiAgICogUmFpc2VkIHdoZW4gYSBjdXN0b20gdmlldyBoYXMgYmVlbiBzYXZlZCAobmV3bHkgY3JlYXRlZCBvciB1cGRhdGVkKS5cbiAgICpcbiAgICogQGNhdGVnb3J5IFZpZXdpbmdcbiAgICovXG4gIEN1c3RvbVZpZXdTYXZlZCA9ICdjdXN0b212aWV3c2F2ZWQnLFxuXG4gIC8qKlxuICAgKiBSYWlzZWQgd2hlbiBhIGN1c3RvbSB2aWV3IGhhcyBiZWVuIHNldCBhcyB0aGUgZGVmYXVsdCB2aWV3IGZvciBhIHdvcmtib29rLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgVmlld2luZ1xuICAgKi9cbiAgQ3VzdG9tVmlld1NldERlZmF1bHQgPSAnY3VzdG9tdmlld3NldGRlZmF1bHQnLFxuXG4gIC8qKiBSYWlzZWQgd2hlbiB0aGUgdXNlciBjbGlja3Mgb24gdGhlIEVkaXQgQnV0dG9uLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgVmlld2luZ1xuICAgKi9cbiAgRWRpdEJ1dHRvbkNsaWNrZWQgPSAnZWRpdGJ1dHRvbmNsaWNrZWQnLFxuXG4gIC8qKiBSYWlzZWQgd2hlbiB0aGUgdXNlciBjbGlja3Mgb24gdGhlIEVkaXQgSW4gRGVza3RvcCBCdXR0b24uXG4gICAqXG4gICAqIEBjYXRlZ29yeSBBdXRob3JpbmcsIFZpZXdpbmdcbiAgICovXG4gIEVkaXRJbkRlc2t0b3BCdXR0b25DbGlja2VkID0gJ2VkaXRpbmRlc2t0b3BidXR0b25jbGlja2VkJyxcblxuICAvKiogUmFpc2VkIHdoZW4gYW55IGZpbHRlciBoYXMgY2hhbmdlZCBzdGF0ZS4gWW91IGNhbiB1c2UgdGhpcyBldmVudCB0eXBlIHdpdGggVGFibGVhdVZpeiBvYmplY3RzLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgVmlld2luZ1xuICAgKi9cbiAgRmlsdGVyQ2hhbmdlZCA9ICdmaWx0ZXJjaGFuZ2VkJyxcblxuICAvKiogRmlyZWQgd2hlbiB2aXogc2l6ZSBpcyBrbm93blxuICAgKlxuICAgKiBAY2F0ZWdvcnkgQXV0aG9yaW5nLCBWaWV3aW5nXG4gICAqL1xuICBGaXJzdFZpelNpemVLbm93biA9ICdmaXJzdHZpenNpemVrbm93bicsXG5cbiAgLyoqIEZpcmVkIHdoZW4gYSB2aXogZmlyc3QgYmVjb21lcyBpbnRlcmFjdGl2ZVxuICAgKlxuICAgKiBAY2F0ZWdvcnkgQXV0aG9yaW5nLCBWaWV3aW5nLCBQdWxzZVxuICAgKi9cbiAgRmlyc3RJbnRlcmFjdGl2ZSA9ICdmaXJzdGludGVyYWN0aXZlJyxcblxuICAvKiogUmFpc2VkIHdoZW4gYSBjdXN0b20gbWFyayBjb250ZXh0IG1lbnUgaXMgY2xpY2tlZC5cbiAgICpcbiAgICogQGNhdGVnb3J5IFZpZXdpbmdcbiAgICovXG4gIEN1c3RvbU1hcmtDb250ZXh0TWVudUV2ZW50ID0gJ2N1c3RvbW1hcmtjb250ZXh0bWVudScsXG5cbiAgLyoqIFRoZSBzZWxlY3RlZCBtYXJrcyBvbiBhIHZpc3VhbGl6YXRpb24gaGF2ZSBjaGFuZ2VkLiBZb3UgY2FuIHVzZSB0aGlzIGV2ZW50IHR5cGUgd2l0aCBUYWJsZWF1Vml6IG9iamVjdHMuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBWaWV3aW5nXG4gICAqL1xuICBNYXJrU2VsZWN0aW9uQ2hhbmdlZCA9ICdtYXJrc2VsZWN0aW9uY2hhbmdlZCcsXG5cbiAgLyoqIEEgcGFyYW1ldGVyIGhhcyBoYWQgaXRzIHZhbHVlIG1vZGlmaWVkLiBZb3UgY2FuIHVzZSB0aGlzIGV2ZW50IHR5cGUgd2l0aCBbW1BhcmFtZXRlcl1dIG9iamVjdHMuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBWaWV3aW5nXG4gICAqL1xuICBQYXJhbWV0ZXJDaGFuZ2VkID0gJ3BhcmFtZXRlcmNoYW5nZWQnLFxuXG4gIC8qKiBSYWlzZWQgd2hlbiBhIHRvb2xiYXIgYnV0dG9uIG9yIGNvbnRyb2wgYmVjb21lcyBhdmFpbGFibGUgb3IgYmVjb21lcyB1bmF2YWlsYWJsZS5cbiAgICpcbiAgICogQGNhdGVnb3J5IFZpZXdpbmdcbiAgICovXG4gIFRvb2xiYXJTdGF0ZUNoYW5nZWQgPSAndG9vbGJhcnN0YXRlY2hhbmdlZCcsXG5cbiAgLyoqIFJhaXNlZCB3aGVuIHRoZSB3b3JrYm9vayBpcyByZWFkeSB0byBjbG9zZS4gVGhpcyBub3RpZmljYXRpb24gaXMgc2VudCB3aGVuIHVzaW5nIGVtYmVkZGVkIHdlYiBhdXRob3JpbmcgZnVuY3Rpb25hbGl0eS5cbiAgICpcbiAgICogQGNhdGVnb3J5IEF1dGhvcmluZ1xuICAgKi9cbiAgV29ya2Jvb2tSZWFkeVRvQ2xvc2UgPSAnd29ya2Jvb2tyZWFkeXRvY2xvc2UnLFxuXG4gIC8qKiBSYWlzZWQgd2hlbiB0aGUgd29ya2Jvb2sgaGFzIGJlZW4gcHVibGlzaGVkLiBUaGlzIG5vdGlmaWNhdGlvbiBpcyBzZW50IHdoZW4gdXNpbmcgZW1iZWRkZWQgd2ViIGF1dGhvcmluZyBmdW5jdGlvbmFsaXR5LlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgQXV0aG9yaW5nXG4gICAqL1xuICBXb3JrYm9va1B1Ymxpc2hlZCA9ICd3b3JrYm9va3B1Ymxpc2hlZCcsXG5cbiAgLyoqIFJhaXNlZCB3aGVuIFwicHVibGlzaCBhc1wiIGlzIHN1Y2Nlc3NmdWwuIFRoaXMgbm90aWZpY2F0aW9uIGlzIHNlbnQgd2hlbiB1c2luZyBlbWJlZGRlZCB3ZWIgYXV0aG9yaW5nIGZ1bmN0aW9uYWxpdHkuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBBdXRob3JpbmdcbiAgICovXG4gIFdvcmtib29rUHVibGlzaGVkQXMgPSAnd29ya2Jvb2twdWJsaXNoZWRhcycsXG5cbiAgLyoqXG4gICAqIFJhaXNlZCB3aGVuIGEgVVJMIGFjdGlvbiBvY2N1cnMuIFNlZSB0aGUge0BsaW5rIFVybEFjdGlvbkV2ZW50fSBjbGFzcy5cbiAgICpcbiAgICogQGNhdGVnb3J5IFZpZXdpbmdcbiAgICovXG4gIFVybEFjdGlvbiA9ICd1cmxhY3Rpb24nLFxuXG4gIC8qKlxuICAgKiBSYWlzZWQgYWZ0ZXIgYSB0YWIgc3dpdGNoIG9jY3VycyAodGhlIGFjdGl2ZSBzaGVldCBoYXMgY2hhbmdlZCkuIEd1YXJhbnRlZXMgdGhlIHZpeiBvYmplY3Qgd2lsbCBiZSBpbnRlcmFjdGl2ZSBhZnRlciB0aGlzLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgVmlld2luZ1xuICAgKi9cbiAgVGFiU3dpdGNoZWQgPSAndGFic3dpdGNoZWQnLFxuICAvKipcbiAgICpcbiAgICogUmFpc2VkIGFmdGVyIGEgbmV3IHN0b3J5IHBvaW50IGJlY29tZXMgYWN0aXZlLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgVmlld2luZ1xuICAgKi9cbiAgU3RvcnlQb2ludFN3aXRjaGVkID0gJ3N0b3J5cG9pbnRzd2l0Y2hlZCcsXG4gIC8qKlxuICAgKlxuICAgKiBSYWlzZWQgd2hlbiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgbG9hZGluZyB0aGUgY29udGVudHMgb2YgdGhlIHdlYmNvbXBvbmVudC5cbiAgICpcbiAgICogQGNhdGVnb3J5IEF1dGhvcmluZywgVmlld2luZywgQXNrRGF0YVxuICAgKi9cbiAgVml6TG9hZEVycm9yID0gJ3ZpemxvYWRlcnJvcicsXG4gIC8qKlxuICAgKiBSYWlzZWQgYWZ0ZXIgdGhlIGlmcmFtZSBzcmMgYXR0cmlidXRlIGhhcyBiZWVuIHVwZGF0ZWRcbiAgICpcbiAgICogQGNhdGVnb3J5IEF1dGhvcmluZywgVmlld2luZywgQXNrRGF0YVxuICAgKi9cbiAgSWZyYW1lU3JjVXBkYXRlZCA9ICdpZnJhbWVzcmN1cGRhdGVkJyxcblxuICAvKipcbiAgICogUmFpc2VkIHdoZW4gY2hhbmdlcyBhcmUgbWFkZSB0byBzdW1tYXJ5IGRhdGEuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBWaWV3aW5nXG4gICAqL1xuICBTdW1tYXJ5RGF0YUNoYW5nZWQgPSAnc3VtbWFyeWRhdGFjaGFuZ2VkJyxcblxuICAvKipcbiAgICogUmFpc2VkIHdoZW4gdGFibGVhdSAodml6LWNsaWVudCkgaXMgcmVhZHkgdG8gcmVjZWl2ZSBhbiBhdXRoIHRva2VuLlxuICAgKiBVc2VkIGZvciBhdXRoZW50aWNhdGlvbiBpbiBzYWxlc2ZvcmNlIG5hdGl2ZSBtb2RlLlxuICAgKlxuICAgKiBAaGlkZGVuXG4gICAqIEBjYXRlZ29yeSBBdXRob3JpbmcsIFZpZXdpbmcsXG4gICAqL1xuICBSZWFkeVRvUmVjZWl2ZUF1dGhUb2tlbiA9ICdyZWFkeXRvcmVjZWl2ZWF1dGh0b2tlbicsXG5cbiAgLyoqXG4gICAqIEZpcmVkIHdoZW4gdGhlIFB1bHNlIG1ldHJpYyBzaXplIGlzIGtub3duXG4gICAqXG4gICAqIEBjYXRlZ29yeSBQdWxzZVxuICAgKi9cbiAgRmlyc3RQdWxzZU1ldHJpY1NpemVLbm93biA9ICdmaXJzdHB1bHNlbWV0cmljc2l6ZWtub3duJyxcblxuICAvKipcbiAgICogRmlyZWQgd2hlbiBhbiBpbnRlcm5hbCBQdWxzZSBlcnJvciBpcyBlbmNvdW50ZXJlZC5cbiAgICpcbiAgICogQGNhdGVnb3J5IFB1bHNlXG4gICAqL1xuICBQdWxzZUVycm9yID0gJ3B1bHNlZXJyb3InLFxuXG4gIC8qKlxuICAgKiBGaXJlZCB3aGVuIHRoZSBQdWxzZSBmaWx0ZXJzIGNoYW5nZVxuICAgKlxuICAgKiBAY2F0ZWdvcnkgUHVsc2VcbiAgICovXG4gIFB1bHNlRmlsdGVyc0NoYW5nZWQgPSAncHVsc2VmaWx0ZXJzY2hhbmdlZCcsXG5cbiAgLyoqXG4gICAqIEZpcmVkIHdoZW4gYSBQdWxzZSBpbnNpZ2h0IGlzIGRpc2NvdmVyZWRcbiAgICpcbiAgICogQGNhdGVnb3J5IFB1bHNlXG4gICAqL1xuICBQdWxzZUluc2lnaHREaXNjb3ZlcmVkID0gJ3B1bHNlaW5zaWdodGRpc2NvdmVyZWQnLFxuXG4gIC8qKlxuICAgKiBGaXJlZCB3aGVuIHRoZSBQdWxzZSBtZXRyaWMgc2l6ZSBjaGFuZ2VzXG4gICAqXG4gICAqIEBjYXRlZ29yeSBQdWxzZVxuICAgKi9cbiAgUHVsc2VNZXRyaWNTaXplQ2hhbmdlZCA9ICdwdWxzZW1ldHJpY3NpemVjaGFuZ2VkJyxcblxuICAvKipcbiAgICogRmlyZWQgd2hlbiB0aGUgUHVsc2UgbWV0cmljIHRpbWUgZGltZW5zaW9uIGNoYW5nZXNcbiAgICpcbiAgICogQGNhdGVnb3J5IFB1bHNlXG4gICAqL1xuICBQdWxzZVRpbWVEaW1lbnNpb25DaGFuZ2VkID0gJ3B1bHNldGltZWRpbWVuc2lvbmNoYW5nZWQnLFxuXG4gIC8qKlxuICAgKiBGaXJlZCB3aGVuIHRoZSBQdWxzZSBVUkwgY2hhbmdlc1xuICAgKlxuICAgKiBAY2F0ZWdvcnkgUHVsc2VcbiAgICovXG4gIFB1bHNlVXJsQ2hhbmdlZCA9ICdwdWxzZXVybGNoYW5nZWQnLFxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIGxvY2F0aW9uIG9mIGEgY29udGV4dCBtZW51IHdoZXJlIHVzZXJzIGNhbiBhZGQgZXh0ZXJuYWwgbWVudSBpdGVtcy5cbiAqL1xuZXhwb3J0IGVudW0gQXBpTWVudVR5cGUge1xuICAvKiogRXh0ZXJuYWwgbWVudSBpdGVtIHdpbGwgYmUgaW5qZWN0ZWQgaW4gdWJlcnRpcCBkaWFsb2cgKi9cbiAgVWJlcnRpcCA9ICd1YmVydGlwJyxcbn1cblxuLyoqIFlvdSBjYW4gdXNlIHRoaXMgdHlwZSB3aXRoIGEge0BsaW5rIFZpen0gb2JqZWN0LiAqL1xuZXhwb3J0IGVudW0gVGFibGVhdURpYWxvZ1R5cGUge1xuICAvKipcbiAgICogVXNlZCB0byBkaXNwbGF5IHRoZSBkb3dubG9hZCBQREYgZGlhbG9nLlxuICAgKi9cbiAgRXhwb3J0UERGID0gJ2V4cG9ydC1wZGYnLFxuICAvKipcbiAgICogVXNlZCB0byBkaXNwbGF5IHRoZSBkb3dubG9hZCBQb3dlclBvaW50IGRpYWxvZy5cbiAgICovXG4gIEV4cG9ydFBvd2VyUG9pbnQgPSAnZXhwb3J0LXBvd2VycG9pbnQnLFxuICAvKipcbiAgICogVXNlZCB0byBkaXNwbGF5IHRoZSBkb3dubG9hZCBEYXRhIGRpYWxvZy5cbiAgICovXG4gIEV4cG9ydERhdGEgPSAnZXhwb3J0LWRhdGEnLFxuICAvKipcbiAgICogVXNlZCB0byBkaXNwbGF5IHRoZSBkb3dubG9hZCBDcm9zc1RhYiBkaWFsb2cuXG4gICAqL1xuICBFeHBvcnRDcm9zc1RhYiA9ICdleHBvcnQtY3Jvc3MtdGFiJyxcbiAgLyoqXG4gICAqIFVzZWQgdG8gZGlzcGxheSB0aGUgZG93bmxvYWQgV29ya2Jvb2sgZGlhbG9nLlxuICAgKi9cbiAgRXhwb3J0V29ya2Jvb2sgPSAnZXhwb3J0LXdvcmtib29rJyxcbiAgLyoqXG4gICAqIFVzZWQgdG8gZGlzcGxheSB0aGUgU2hhcmUgZGlhbG9nLlxuICAgKi9cbiAgU2hhcmUgPSAnc2hhcmUnLFxufVxuIiwiaW1wb3J0IHsgRmlsdGVyT3B0aW9ucyB9IGZyb20gJy4uL1NoYXJlZC9GaWx0ZXJJbnRlcmZhY2VzJztcbmltcG9ydCB7IEZpbHRlckRvbWFpblR5cGUsIEZpbHRlclR5cGUsIEZpbHRlclVwZGF0ZVR5cGUgfSBmcm9tICcuLi9TaGFyZWQvTmFtZXNwYWNlcy9UYWJsZWF1JztcbmltcG9ydCB7IFB1bHNlTGF5b3V0LCBQdWxzZVRpbWVEaW1lbnNpb24gfSBmcm9tICcuL0VudW1zJztcbmltcG9ydCB7IFdlYkNvbXBvbmVudExvY2FsU2V0dGluZ3MgfSBmcm9tICcuL1dlYkNvbXBvbmVudEludGVyZmFjZXMnO1xuXG4vKipcbiAqIFRoZSBuYW1lcyBvZiB0aGUgc3RyaW5nIGNvbnN0YW50cyB5b3UgY2FuIHVzZSBhcyBIVE1MIGF0dHJpYnV0ZXMgZm9yIHRoZSA8dGFibGVhdS1wdWxzZT4gd2ViIGNvbXBvbmVudC5cbiAqIEBpZ25vcmVcbiAqL1xuZXhwb3J0IGVudW0gUHVsc2VBdHRyaWJ1dGVzIHtcbiAgRGlzYWJsZUV4cGxvcmVGaWx0ZXIgPSAnZGlzYWJsZS1leHBsb3JlLWZpbHRlcicsXG4gIExheW91dCA9ICdsYXlvdXQnLFxuICBPbkZpcnN0SW50ZXJhY3RpdmUgPSAnb25GaXJzdEludGVyYWN0aXZlJyxcbiAgT25GaXJzdFB1bHNlTWV0cmljU2l6ZUtub3duID0gJ29uRmlyc3RQdWxzZU1ldHJpY1NpemVLbm93bicsXG4gIE9uUHVsc2VVcmxFcnJvciA9ICdvblB1bHNlRXJyb3InLFxuICBPblB1bHNlRmlsdGVyc0NoYW5nZWQgPSAnb25QdWxzZUZpbHRlcnNDaGFuZ2VkJyxcbiAgT25QdWxzZUluc2lnaHREaXNjb3ZlcmVkID0gJ29uUHVsc2VJbnNpZ2h0RGlzY292ZXJlZCcsXG4gIE9uUHVsc2VNZXRyaWNTaXplQ2hhbmdlZCA9ICdvblB1bHNlTWV0cmljU2l6ZUNoYW5nZWQnLFxuICBPblB1bHNlVGltZURpbWVuc2lvbkNoYW5nZWQgPSAnb25QdWxzZVRpbWVEaW1lbnNpb25DaGFuZ2VkJyxcbiAgT25QdWxzZVVybENoYW5nZWQgPSAnb25QdWxzZVVybENoYW5nZWQnLFxuICBUaW1lRGltZW5zaW9uID0gJ3RpbWUtZGltZW5zaW9uJyxcbiAgVG9rZW5PcHRpb25hbCA9ICd0b2tlbi1vcHRpb25hbCcsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHVsc2VTZXR0aW5ncyBleHRlbmRzIFdlYkNvbXBvbmVudExvY2FsU2V0dGluZ3Mge1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGV4cGxvcmUgZmlsdGVyIGlzIGhpZGRlbiBvciB2aXNpYmxlLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtcHVsc2UgaWQ9XCJ0YWJsZWF1UHVsc2VcIiBkaXNhYmxlLWV4cGxvcmUtZmlsdGVyPlxuICAgKiBgYGBcbiAgICovXG4gIGRpc2FibGVFeHBsb3JlRmlsdGVyPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBkZXNpcmVkIGN1c3RvbSBsYXlvdXQgb2YgdGhlIFB1bHNlIG1ldHJpYy5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXB1bHNlIGlkPVwidGFibGVhdVB1bHNlXCIgbGF5b3V0PVwiY2FyZFwiPlxuICAgKiBgYGBcbiAgICovXG4gIGxheW91dD86IFB1bHNlTGF5b3V0O1xuXG4gIC8qKlxuICAgKiBUaGUgdG9rZW4gdXNlZCBmb3IgYXV0aG9yaXphdGlvblxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIHRva2VuPVwic29tZS10b2tlbi1jb250YWluaW5nLWNsaWVudElkXCIgLz5cbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiB0b2tlbj1cInNvbWUtdG9rZW4tY29udGFpbmluZy1jbGllbnRJZFwiIC8+XG4gICAqIDx0YWJsZWF1LXB1bHNlIGlkPVwidGFibGVhdVB1bHNlXCIgdG9rZW49XCJzb21lLXRva2VuLWNvbnRhaW5pbmctY2xpZW50SWRcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIHRva2VuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgb2YgdGhlICdsb2FkaW5nJyBhdHRyaWJ1dGUgb2YgdGhlIGVtYmVkZGVkIGlmcmFtZS5cbiAgICogU2VlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvaWZyYW1lI2xvYWRpbmdcbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBpZnJhbWUtYXR0ci1sb2FkaW5nPVwibGF6eVwiIC8+XG4gICAqIDx0YWJsZWF1LWF1dGhvcmluZy12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgaWZyYW1lLWF0dHItbG9hZGluZz1cImxhenlcIiAvPlxuICAgKiA8dGFibGVhdS1wdWxzZSBpZD1cInRhYmxlYXVQdWxzZVwiIGlmcmFtZS1hdHRyLWxvYWRpbmc9XCJsYXp5XCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBpZnJhbWVBdHRyaWJ1dGVMb2FkaW5nPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgb2YgdGhlICdzdHlsZScgYXR0cmlidXRlIG9mIHRoZSBlbWJlZGRlZCBpZnJhbWUuXG4gICAqXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgaWZyYW1lLWF0dHItc3R5bGU9XCJib3JkZXI6IDFweCBzb2xpZCByZWRcIiAvPlxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIGlmcmFtZS1hdHRyLXN0eWxlPVwiYm9yZGVyOiAxcHggc29saWQgcmVkXCIgLz5cbiAgICogPHRhYmxlYXUtcHVsc2UgaWQ9XCJ0YWJsZWF1UHVsc2VcIiBpZnJhbWUtYXR0ci1zdHlsZT1cImJvcmRlcjogMXB4IHNvbGlkIHJlZFwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgaWZyYW1lQXR0cmlidXRlU3R5bGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSBvZiB0aGUgJ2NsYXNzJyBhdHRyaWJ1dGUgb2YgdGhlIGVtYmVkZGVkIGlmcmFtZSBwcm92aWRpbmcgYWNjZXNzIHRvIGFueVxuICAgKiBjdXN0b20gc2VsZWN0b3JzIGRlZmluZWQgaW4gdGhlIGA8aWZyYW1lLXN0eWxlPmAgY2hpbGQgdGFnLlxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtcHVsc2UgaWQ9XCJ0YWJsZWF1Vml6XCIgaWZyYW1lLWF0dHItY2xhc3M9XCJyZWQtYm9yZGVyXCI+XG4gICAqICAgPGlmcmFtZS1zdHlsZT5cbiAgICogICAgIC5yZWQtYm9yZGVyIHtcbiAgICogICAgICAgYm9yZGVyOiAxcHggc29saWQgcmVkO1xuICAgKiAgICAgfVxuICAgKiAgIDwvaWZyYW1lLXN0eWxlPlxuICAgKiA8L3RhYmxlYXUtcHVsc2U+XG4gICAqIGBgYFxuICAgKi9cbiAgaWZyYW1lQXR0cmlidXRlQ2xhc3M/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBCYXNlNjQtZW5jb2RlZCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIFB1bHNlIHRoZW1lIG9iamVjdC5cbiAgICpcbiAgICovXG4gIHRoZW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIGRlc2lyZWQgdGltZSBkaW1lbnNpb24gdG8gYXBwbHkgdG8gdGhlIFB1bHNlIG1ldHJpYyBieSBkZWZhdWx0LlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtcHVsc2UgaWQ9XCJ0YWJsZWF1UHVsc2VcIiB0aW1lLWRpbWVuc2lvbj1cIk1vbnRoVG9EYXRlXCI+XG4gICAqIGBgYFxuICAgKi9cbiAgdGltZURpbWVuc2lvbj86IFB1bHNlVGltZURpbWVuc2lvbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHRva2VuIGlzIG9wdGlvbmFsLlxuICAgKiBXaGVuIHRydWUsIHRoZSBtZXRyaWMgd2lsbCBhdHRlbXB0IHRvIGxvYWQgZXZlbiB3aXRob3V0IHNwZWNpZnlpbmcgYSB0b2tlbi5cbiAgICogVGhpcyB3YXMgYWRkZWQgc3BlY2lmaWNhbGx5IGZvciB0aGUgTW9iaWxlIHRlYW0gd2hvIHVzZXMgUEtDRSBmbG93IHRvIGluaXRpYXRlIHRoZSBzZXNzaW9uXG4gICAqIGFuZCBzaG91bGQgbm90IGJlIGFkdmVydGlzZWQgdG8gM3JkIHBhcnRpZXMuXG4gICAqXG4gICAqIEBpZ25vcmVcbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXB1bHNlIGlkPVwidGFibGVhdVB1bHNlXCIgdG9rZW4tb3B0aW9uYWw+XG4gICAqIGBgYFxuICAgKi9cbiAgaXNUb2tlbk9wdGlvbmFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUaGUgbmFtZXMgb2YgdGhlIHN0cmluZyBjb25zdGFudHMgeW91IGNhbiB1c2UgYXMgY2hpbGQgdGFncyBmb3IgVGFibGVhdVB1bHNlIGN1c3RvbSBlbGVtZW50LlxuICovXG5leHBvcnQgZW51bSBQdWxzZUNoaWxkRWxlbWVudHMge1xuICAvKipcbiAgICogQ3VzdG9tIHN0eWxlcyBhcHBsaWNhYmxlIHRvIHRoZSBlbWJlZGRlZCBpZnJhbWUgZWxlbWVudCBpdHNlbGYgKG5vdCBpbnNpZGUgaXQpLlxuICAgKi9cbiAgSWZyYW1lU3R5bGUgPSAnaWZyYW1lLXN0eWxlJyxcblxuICAvKipcbiAgICogQSBwYXJhbWV0ZXIgdG8gYmUgdXNlZCBpbiB0aGUgUHVsc2UgdGhlbWUuXG4gICAqL1xuICBUaGVtZVBhcmFtZXRlciA9ICd0aGVtZS1wYXJhbWV0ZXInLFxuXG4gIC8qKlxuICAgKiBDb250YWlucyBhIGxpc3Qgb2YgZmlsdGVyIHBhcmFtZXRlcnMuXG4gICAqL1xuICBQdWxzZUZpbHRlciA9ICdwdWxzZS1maWx0ZXInLFxufVxuXG4vKipcbiAqIFRoZSBhdHRyaWJ1dGVzIG9mIHRoZSA8dGhlbWUtcGFyYW1ldGVyPiBjaGlsZCBlbGVtZW50cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQdWxzZVRoZW1lUHJvcGVydHkge1xuICAvKipcbiAgICogTmFtZSBvZiB0aGUgdGhlbWUgcGFyYW1ldGVyIHRvIGJlIHNldC5cbiAgICovXG4gIG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVmFsdWUgZm9yIHRoZSB0aGVtZSBwYXJhbWV0ZXIgYmVpbmcgc2V0LlxuICAgKi9cbiAgdmFsdWU6IHN0cmluZztcblxuICAvKipcbiAgICogT3B0aW9uYWwgdHlwZSBvZiB0aGVtZSBwYXJhbWV0ZXIgYmVpbmcgc2V0LlxuICAgKi9cbiAgdHlwZTogc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqXG4gKiBUaGUgYXR0cmlidXRlcyBvZiB0aGUgY2hpbGQgZWxlbWVudHMgb2YgPHRhYmxlYXUtcHVsc2U+LlxuICovXG5leHBvcnQgZW51bSBQdWxzZUNoaWxkRWxlbWVudEF0dHJpYnV0ZXMge1xuICBOYW1lID0gJ25hbWUnLFxuICBGaWVsZCA9ICdmaWVsZCcsXG4gIFZhbHVlID0gJ3ZhbHVlJyxcbiAgVHlwZSA9ICd0eXBlJyxcbn1cblxuLyoqXG4gKiBUaGUgUHVsc2UgdGhlbWUgZGF0YSBzdHJ1Y3R1cmUuXG4gKi9cbmV4cG9ydCB0eXBlIFB1bHNlVGhlbWUgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PjtcblxuLyoqXG4gKiBBY3Rpb25zIHJlbGF0ZWQgdG8gZXZlbnRzIGFuZCBzdGF0ZSBvZiB0aGUgUHVsc2UgbWV0cmljXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHVsc2VBY3Rpb25zIHtcbiAgLyoqXG4gICAqIEFwcGxpZXMgdGhlIGxpc3Qgb2YgcHJvdmlkZWQgY2F0ZWdvcmljYWwgZmlsdGVyIHZhbHVlcyB0byB0aGUgUHVsc2UgbWV0cmljLlxuICAgKlxuICAgKiBAcGFyYW0gZmllbGROYW1lICAgICAgVGhlIG5hbWUgb2YgdGhlIGZpZWxkIHRvIGZpbHRlciBvbi5cbiAgICogQHBhcmFtIHZhbHVlcyAgICAgICAgIFRoZSBsaXN0IG9mIHZhbHVlcyB0byBmaWx0ZXIgb24uXG4gICAqIEBwYXJhbSB1cGRhdGVUeXBlICAgICBUaGUgdXBkYXRlIHR5cGUgb2YgdGhpcyBmaWx0ZXIgKGFkZCwgYWxsLCByZW1vdmUsIHJlcGxhY2UpLlxuICAgKiBAcGFyYW0gZmlsdGVyT3B0aW9ucyAgQWR2YW5jZWQgZmlsdGVyIG9wdGlvbnMgKGlzRXhjbHVkZU1vZGUpLlxuICAgKiBAcmV0dXJucyBUaGUgZmllbGQgbmFtZSB0aGF0IHRoZSBmaWx0ZXIgaXMgYXBwbGllZCBvbi5cbiAgICovXG4gIGFwcGx5RmlsdGVyQXN5bmMoZmllbGROYW1lOiBzdHJpbmcsIHZhbHVlczogUHVsc2VGaWVsZFZhbHVlQXJyYXksIHVwZGF0ZVR5cGU6IEZpbHRlclVwZGF0ZVR5cGUsIG9wdGlvbnM6IEZpbHRlck9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz47XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgYXQgbGVhc3Qgb25lIGNhdGVnb3JpY2FsIGZpbHRlciB2YWx1ZSB0byB0aGUgUHVsc2UgbWV0cmljLlxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5PHtcbiAgICogICAgICAgZmllbGROYW1lOiBzdHJpbmc7XG4gICAqICAgICAgIHZhbHVlczogUHVsc2VGaWVsZFZhbHVlQXJyYXk7XG4gICAqICAgICAgIHVwZGF0ZVR5cGU6IEZpbHRlclVwZGF0ZVR5cGU7XG4gICAqICAgICAgIG9wdGlvbnM6IEZpbHRlck9wdGlvbnM7XG4gICAqICAgICB9Pn0gZmlsdGVycyBUaGUgc2V0IG9mIGZpbHRlcnMgdG8gYXBwbHkuXG4gICAqIEByZXR1cm5zIFRoZSBmaWVsZCBuYW1lcyB0aGF0IHRoZSBmaWx0ZXIgd2FzIGFwcGxpZWQgb24uXG4gICAqL1xuICBhcHBseUZpbHRlcnNBc3luYyhcbiAgICBmaWx0ZXJzOiBBcnJheTx7XG4gICAgICBmaWVsZE5hbWU6IHN0cmluZztcbiAgICAgIHZhbHVlczogUHVsc2VGaWVsZFZhbHVlQXJyYXk7XG4gICAgICB1cGRhdGVUeXBlOiBGaWx0ZXJVcGRhdGVUeXBlO1xuICAgICAgb3B0aW9uczogRmlsdGVyT3B0aW9ucztcbiAgICB9PixcbiAgKTogUHJvbWlzZTxBcnJheTxzdHJpbmc+PjtcblxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudCB0aW1lIGRpbWVuc2lvbiBhcHBsaWVkIHRvIHRoZSBQdWxzZSBtZXRyaWMuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IHRpbWUgZGltZW5zaW9uLlxuICAgKi9cbiAgZ2V0VGltZURpbWVuc2lvbkFzeW5jKCk6IFByb21pc2U8UHVsc2VUaW1lRGltZW5zaW9uPjtcblxuICAvKipcbiAgICogQXBwbGllcyB0aGUgdGltZSBkaW1lbnNpb24gdG8gdGhlIFB1bHNlIG1ldHJpYy5cbiAgICpcbiAgICogQHBhcmFtIHtQdWxzZVRpbWVEaW1lbnNpb259IHRpbWVEaW1lbnNpb24gVGhlIHRpbWUgZGltZW5zaW9uIHRvIGFwcGx5XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXBwbHlUaW1lRGltZW5zaW9uQXN5bmModGltZURpbWVuc2lvbjogUHVsc2VUaW1lRGltZW5zaW9uKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogR2V0cyBhIGxpc3Qgb2YgZmlsdGVycyBmb3IgdGhlIFB1bHNlIG1ldHJpYy5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8QXJyYXk8UHVsc2VGaWx0ZXI+Pn0gVGhlIGxpc3Qgb2YgZmlsdGVycy5cbiAgICovXG4gIGdldEZpbHRlcnNBc3luYygpOiBQcm9taXNlPEFycmF5PFB1bHNlRmlsdGVyPj47XG5cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgZXhpc3RpbmcgZmlsdGVyIGZvciB0aGUgZ2l2ZW4gZmllbGQgb24gdGhlIFB1bHNlIG1ldHJpYy5cbiAgICpcbiAgICogQHBhcmFtIGZpZWxkTmFtZSAgVGhlIG5hbWUgb2YgdGhlIGZpZWxkIHRvIGNsZWFyIGZpbHRlciBvbi5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGZpZWxkIHRvIGNsZWFyIGZpbHRlciBvbi5cbiAgICovXG4gIGNsZWFyRmlsdGVyQXN5bmMoZmllbGROYW1lczogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlIGV4aXN0aW5nIGZpbHRlciBmb3IgdGhlIGdpdmVuIGZpZWxkcyBvbiB0aGUgUHVsc2UgbWV0cmljLlxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGZpZWxkTmFtZXMgVGhlIG5hbWUgb2YgdGhlIGZpZWxkcyB0byBjbGVhciBmaWx0ZXIgb24uXG4gICAqIEByZXR1cm5zIFRoZSBmaWVsZHMgdG8gY2xlYXIgZmlsdGVyIG9uLlxuICAgKi9cbiAgY2xlYXJGaWx0ZXJzQXN5bmMoZmllbGROYW1lczogQXJyYXk8c3RyaW5nPik6IFByb21pc2U8QXJyYXk8c3RyaW5nPj47XG5cbiAgLyoqXG4gICAqIFJlc2V0cyBhbGwgdGhlIGV4aXN0aW5nIGZpbHRlcnMgb24gdGhlIFB1bHNlIG1ldHJpYy5cbiAgICovXG4gIGNsZWFyQWxsRmlsdGVyc0FzeW5jKCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIFVzZSB0aGlzIG1ldGhvZCB0byBmaWx0ZXIgdGhlIFB1bHNlIG1ldHJpYyBiZWZvcmUgaW5pdGlhbGl6YXRpb24uIElmIHVzZWQgYWZ0ZXIgaW5pdGlhbGl6YXRpb24sIGl0IHdpbGwgcmUtcmVuZGVyIHRoZSBtZXRyaWMuXG4gICAqIEZvciBmaWx0ZXJpbmcgYWZ0ZXIgaW5pdGlhbGl6YXRpb24sIHVzZSB0aGUgb3RoZXIgZmlsdGVyaW5nIG1ldGhvZHMsIHN1Y2ggYXMgYGFwcGx5RmlsdGVyQXN5bmNgLlxuICAgKlxuICAgKiBJZiB5b3UgYWRkIHRoZSBzYW1lIGZpbHRlciBmaWVsZHMgdXNpbmcgdGhlIGBhZGRGaWx0ZXIoKWAgbWV0aG9kIGFuZCBieSB1c2luZyB0aGUgYDxwdWxzZS1maWx0ZXI+YCBlbGVtZW50IGluIHRoZSBgPHRhYmxlYXUtcHVsc2U+YCB3ZWIgY29tcG9uZW50LFxuICAgKiB5b3UgbWlnaHQgZXhwZXJpZW5jZSB1bmV4cGVjdGVkIGJlaGF2aW9yLlxuICAgKlxuICAgKiBAcGFyYW0gZmllbGROYW1lIFRoZSBuYW1lIG9mIHRoZSBmaWVsZCB0byBmaWx0ZXIgb24uXG4gICAqIEBwYXJhbSB2YWx1ZSBTaW5nbGUgdmFsdWUgb3IgYSBsaXN0IG9mIGNvbW1hIHNlcGFyYXRlZCB2YWx1ZXMgdG8gZmlsdGVyIG9uLlxuICAgKlxuICAgKiBgYGBcbiAgICogcHVsc2UuYWRkRmlsdGVyKCdSZWdpb24nLCAnQ2VudHJhbCxXZXN0Jyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYWRkRmlsdGVyKGZpZWxkTmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZDtcblxuICAvKipcbiAgICogVXNlIHRoaXMgbWV0aG9kIHRvIHJlYWRqdXN0IHRoZSBkaW1lbnNpb25zIG9mIHRoZSBlbWJlZGRlZCBQdWxzZSBtZXRyaWMgaW4gcmVzcG9uc2UgdG8gdGhpbmdzIGxpa2UgYSB3aW5kb3cgcmVzaXplLCBkZXZpY2Ugb3JpZW50YXRpb24gY2hhbmdlLCBvclxuICAgKiBwYXJlbnQgY29udGFpbmVyIHJlc2l6ZS5cbiAgICpcbiAgICogYGBgXG4gICAqIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCAoKSA9PiBwdWxzZS5yZXNpemUoKSk7XG4gICAqXG4gICAqIG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiBwdWxzZS5yZXNpemUoKSkub2JzZXJ2ZShwdWxzZS5wYXJlbnRFbGVtZW50KTtcbiAgICogYGBgXG4gICAqL1xuICByZXNpemUoKTogdm9pZDtcbn1cblxuLyoqXG4gKiBUaGUgaW50ZXJmYWNlIGZvciB0aGUgdG9wLWxldmVsIFB1bHNlIG9iamVjdC5cbiAqKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHVsc2UgZXh0ZW5kcyBQdWxzZVNldHRpbmdzLCBQdWxzZUFjdGlvbnMge31cblxuLyoqXG4gKiBBIFB1bHNlRmllbGRWYWx1ZUFycmF5IGlzIGFuIGFycmF5IHRoYXQgY2FuIGNvbnRhaW4gc3RyaW5ncywgYm9vbGVhbnMsIG9yIG51bGxzLCBidXQgd2lsbCBuZXZlciBjb250YWluIGJvdGggc3RyaW5ncyBhbmQgYm9vbGVhbnMgYXQgdGhlIHNhbWUgdGltZS5cbiAqL1xuZXhwb3J0IHR5cGUgUHVsc2VGaWVsZFZhbHVlQXJyYXkgPSBBcnJheTxib29sZWFuIHwgbnVsbD4gfCBBcnJheTxzdHJpbmcgfCBudWxsPjtcblxuLyoqXG4gKlxuICogQW4gYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYWxsIG9mIHRoZSBQdWxzZSBmaWx0ZXIgdHlwZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHVsc2VGaWx0ZXIge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGZpZWxkIGJlaW5nIGZpbHRlcmVkLiAgTm90ZSB0aGF0IHRoaXMgaXMgdGhlIGNhcHRpb25cbiAgICogYXMgc2hvd24gaW4gdGhlIFVJLCBhbmQgbm90IHRoZSBhY3R1YWwgZGF0YWJhc2UgZmllbGQgbmFtZS5cbiAgICovXG4gIGZpZWxkTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0aGUgZmlsdGVyLlxuICAgKi9cbiAgZmlsdGVyVHlwZTogRmlsdGVyVHlwZTtcblxuICAvKipcbiAgICogVGhlIFB1bHNlIG1ldHJpYyBJRC5cbiAgICovXG4gIG1ldHJpY0lkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBQdWxzZSBDYXRlZ29yaWNhbCBGaWx0ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXRlZ29yaWNhbFB1bHNlRmlsdGVyIGV4dGVuZHMgUHVsc2VGaWx0ZXIge1xuICAvKipcbiAgICogQSBsaXN0IG9mIHZhbHVlcyBhcHBsaWVkIHRvIHRoaXMgY2F0ZWdvcmljYWwgZmlsdGVyLiBOb3RpY2UgdGhhdCBpZiB0aGUgUHVsc2UgbWV0cmljXG4gICAqIGhhcyBhIGRlZmluaXRpb24gZmlsdGVyLCB0aGUgY3VycmVudCByZWxldmFudCB2YWx1ZXMgY2FuIGJlIGZldGNoZWQgYnkgY2FsbGluZ1xuICAgKiBgZ2V0RG9tYWluQXN5bmMoRmlsdGVyRG9tYWluVHlwZS5SZWxldmFudClgLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwbGllZFZhbHVlczogUHVsc2VGaWVsZFZhbHVlQXJyYXk7XG5cbiAgLyoqXG4gICAqIFRydWUgaWYgdGhpcyBmaWx0ZXIgaXMgYW4gZXhjbHVkZSBmaWx0ZXIsIGZhbHNlIGlmIGFuIGluY2x1ZGUgZmlsdGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNFeGNsdWRlTW9kZTogYm9vbGVhbjtcblxuICAvKipcbiAgICogVHJ1ZSBpZiBhbGwgdGhlIHZhbHVlcyBhcmUgc2VsZWN0ZWQgZm9yIHRoaXMgZmlsdGVyLiBXaGVuICdBbGwnIGlzIHNlbGVjdGVkLFxuICAgKiBhcHBsaWVkVmFsdWVzIHJldHVybnMgYW4gZW1wdHkgbGlzdC5cbiAgICovXG4gIHJlYWRvbmx5IGlzQWxsU2VsZWN0ZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBkb21haW4gb2YgYSBjYXRlZ29yaWNhbCBmaWx0ZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7KHN0cmluZyB8IHVuZGVmaW5lZCl9IHNlYXJjaFRlcm0gVGhlIHRlcm0gdG8gc2VhcmNoIGZvciBpbiB0aGUgZG9tYWluLlxuICAgKiBAcGFyYW0geyhudW1iZXIgfCB1bmRlZmluZWQpfSBwYWdlU2l6ZSBUaGUgbWF4aW11bSBudW1iZXIgb2YgdmFsdWVzIHRvIHJldHVybi4gSWdub3JlZCB3aGVuIG5leHRQYWdlVG9rZW4gaXMgbm90IHByb3ZpZGVkLlxuICAgKiBAcGFyYW0geyhzdHJpbmcgfCB1bmRlZmluZWQpfSBuZXh0UGFnZVRva2VuIFRoZSBuZXh0IHBhZ2UgdG9rZW4gcmV0dXJuZWQgYnkgUHVsc2Ugd2hlbiBhZGRpdGlvbmFsIHZhbHVlcyBhcmUgYXZhaWxhYmxlLlxuICAgKiBAcGFyYW0geyhGaWx0ZXJEb21haW5UeXBlIHwgdW5kZWZpbmVkKX0gZG9tYWluVHlwZSBUaGUgZG9tYWluIHR5cGUgb2YgdGhlIGZpbHRlci5cbiAgICogQHJldHVybnMge1Byb21pc2U8UHVsc2VDYXRlZ29yaWNhbERvbWFpbj59IEEgcHJvbWlzZSBjb250YWluaW5nIHRoZSBjYXRlZ29yaWNhbCBkb21haW4gZm9yIHRoZSBmaWx0ZXIuXG4gICAqL1xuICBnZXREb21haW5Bc3luYzogKFxuICAgIHNlYXJjaFRlcm0/OiBzdHJpbmcsXG4gICAgcGFnZVNpemU/OiBudW1iZXIsXG4gICAgbmV4dFBhZ2VUb2tlbj86IHN0cmluZyxcbiAgICBkb21haW5UeXBlPzogRmlsdGVyRG9tYWluVHlwZSxcbiAgKSA9PiBQcm9taXNlPFB1bHNlQ2F0ZWdvcmljYWxEb21haW4+O1xufVxuXG4vKipcbiAqIFRoZSBkb21haW4gb2YgYSBQdWxzZSBjYXRlZ29yaWNhbCBmaWx0ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQdWxzZUNhdGVnb3JpY2FsRG9tYWluIHtcbiAgLyoqXG4gICAqIFRoZSBkb21haW4gdHlwZSAocmVsZXZhbnQsIGRhdGFiYXNlKVxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZTogRmlsdGVyRG9tYWluVHlwZTtcbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIHZhbHVlcyBpbiB0aGUgZG9tYWluIG9mIHRoZSBmaWx0ZXJcbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlczogUHVsc2VGaWVsZFZhbHVlQXJyYXk7XG4gIC8qKlxuICAgKiBUaGUgdG90YWwgYXZhaWxhYmxlIG51bWJlciBvZiB2YWx1ZXMgaW4gdGhlIGRvbWFpbiBvZiB0aGUgZmlsdGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgdG90YWxBdmFpbGFibGU6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBuZXh0IHBhZ2UgdG9rZW4gcmV0dXJuZWQgYnkgUHVsc2Ugd2hlbiBhZGRpdGlvbmFsIHZhbHVlcyBhcmUgYXZhaWxhYmxlLlxuICAgKiBQcm92aWRlIHRoaXMgdG9rZW4gdG8gZ2V0RG9tYWluQXN5bmMgdG8gZ2V0IHRoZSBuZXh0IHBhZ2Ugb2YgdmFsdWVzLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV4dFBhZ2VUb2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuIiwiaW1wb3J0IHtcbiAgQ3Jvc3N0YWJGaWxlRm9ybWF0LFxuICBEZXZpY2VUeXBlLFxuICBQcmludE9yaWVudGF0aW9uLFxuICBQcmludFBhZ2VTaXplLFxuICBQcmludFNjYWxpbmcsXG4gIFRhYmxlYXVEaWFsb2dUeXBlLFxuICBUYWJsZWF1RXZlbnRUeXBlLFxuICBUb29sYmFyLFxufSBmcm9tICcuL0VudW1zJztcbmltcG9ydCB7IFNoZWV0U2l6ZSB9IGZyb20gJy4vU2hlZXRJbnRlcmZhY2VzJztcbmltcG9ydCB7IFdlYkNvbXBvbmVudExvY2FsU2V0dGluZ3MsIFdlYkNvbXBvbmVudFNldHRpbmdzU2hhcmVkIH0gZnJvbSAnLi9XZWJDb21wb25lbnRJbnRlcmZhY2VzJztcbmltcG9ydCB7IFdvcmtib29rIH0gZnJvbSAnLi9Xb3JrYm9va0ludGVyZmFjZSc7XG5cbi8qKlxuICogVGhlIHNoYXJlZCBzdHJpbmcgY29uc3RhbnRzIHlvdSBjYW4gdXNlIGFzIEhUTUwgYXR0cmlidXRlcyBmb3IgdGhlIDx0YWJsZWF1LXZpej4gYW5kIDx0YWJsZWF1LWF1dGhvcmluZy12aXo+IHdlYiBjb21wb25lbnQuXG4gKiBAaWdub3JlXG4gKi9cbmV4cG9ydCBlbnVtIFZpelNoYXJlZEF0dHJpYnV0ZXMge1xuICBUb3VjaE9wdGltaXplID0gJ3RvdWNoLW9wdGltaXplJyxcbiAgSGlkZUVkaXRJbkRlc2t0b3BCdXR0b24gPSAnaGlkZS1lZGl0LWluLWRlc2t0b3AtYnV0dG9uJyxcbiAgU3VwcHJlc3NEZWZhdWx0RWRpdEJlaGF2aW9yID0gJ3N1cHByZXNzLWRlZmF1bHQtZWRpdC1iZWhhdmlvcicsXG4gIERpc2FibGVWZXJzaW9uQ2hlY2sgPSAnZGlzYWJsZS12ZXJzaW9uLWNoZWNrJyxcbiAgT25FZGl0SW5EZXNrdG9wQnV0dG9uQ2xpY2tlZCA9ICdvbkVkaXRJbkRlc2t0b3BCdXR0b25DbGlja2VkJyxcbiAgT25GaXJzdFZpelNpemVLbm93biA9ICdvbkZpcnN0Vml6U2l6ZUtub3duJyxcbiAgT25GaXJzdEludGVyYWN0aXZlID0gJ29uRmlyc3RJbnRlcmFjdGl2ZScsXG59XG5cbi8qKlxuICogVGhlIG5hbWVzIG9mIHRoZSBzdHJpbmcgY29uc3RhbnRzIHlvdSBjYW4gdXNlIGFzIEhUTUwgYXR0cmlidXRlcyBmb3IgdGhlIDx0YWJsZWF1LXZpej4gd2ViIGNvbXBvbmVudC5cbiAqIEBpZ25vcmVcbiAqL1xuZXhwb3J0IGVudW0gVml6QXR0cmlidXRlcyB7XG4gIERpc2FibGVVcmxBY3Rpb25zUG9wdXBzID0gJ2Rpc2FibGUtdXJsLWFjdGlvbnMnLFxuICBIaWRlVGFicyA9ICdoaWRlLXRhYnMnLFxuICBUb29sYmFyID0gJ3Rvb2xiYXInLFxuICBJbnN0YW5jZUlkVG9DbG9uZSA9ICdpbnN0YW5jZS1pZC10by1jbG9uZScsXG4gIERldmljZSA9ICdkZXZpY2UnLFxuICBIaWRlRWRpdEJ1dHRvbiA9ICdoaWRlLWVkaXQtYnV0dG9uJyxcbiAgT25FZGl0QnV0dG9uQ2xpY2tlZCA9ICdvbkVkaXRCdXR0b25DbGlja2VkJyxcbiAgT25GaWx0ZXJDaGFuZ2VkID0gJ29uRmlsdGVyQ2hhbmdlZCcsXG4gIE9uQ3VzdG9tTWFya0NvbnRleHRNZW51RXZlbnQgPSAnb25DdXN0b21NYXJrQ29udGV4dE1lbnVFdmVudCcsXG4gIE9uTWFya1NlbGVjdGlvbkNoYW5nZWQgPSAnb25NYXJrU2VsZWN0aW9uQ2hhbmdlZCcsXG4gIE9uUGFyYW1ldGVyQ2hhbmdlZCA9ICdvblBhcmFtZXRlckNoYW5nZWQnLFxuICBPblRvb2xiYXJTdGF0ZUNoYW5nZWQgPSAnb25Ub29sYmFyU3RhdGVDaGFuZ2VkJyxcbiAgT25VcmxBY3Rpb24gPSAnb25VcmxBY3Rpb24nLFxuICBPblRhYlN3aXRjaGVkID0gJ29uVGFiU3dpdGNoZWQnLFxuICBPbkN1c3RvbVZpZXdMb2FkZWQgPSAnb25DdXN0b21WaWV3TG9hZGVkJyxcbiAgT25DdXN0b21WaWV3UmVtb3ZlZCA9ICdvbkN1c3RvbVZpZXdSZW1vdmVkJyxcbiAgT25DdXN0b21WaWV3U2F2ZWQgPSAnb25DdXN0b21WaWV3U2F2ZWQnLFxuICBPbkN1c3RvbVZpZXdTZXREZWZhdWx0ID0gJ29uQ3VzdG9tVmlld1NldERlZmF1bHQnLFxuICBPblN0b3J5UG9pbnRTd2l0Y2hlZCA9ICdvblN0b3J5UG9pbnRTd2l0Y2hlZCcsXG4gIE9uU3VtbWFyeURhdGFDaGFuZ2VkID0gJ29uU3VtbWFyeURhdGFDaGFuZ2VkJyxcbiAgT25SZWFkeVRvUmVjZWl2ZUF1dGhUb2tlbiA9ICdvblJlYWR5VG9SZWNlaXZlQXV0aFRva2VuJyxcbn1cblxuLyoqXG4gKiBUaGUgbmFtZXMgb2YgdGhlIHN0cmluZyBjb25zdGFudHMgeW91IGNhbiB1c2UgYXMgSFRNTCBhdHRyaWJ1dGVzIGZvciB0aGUgPHRhYmxlYXUtYXV0aG9yaW5nLXZpej4gd2ViIGNvbXBvbmVudC5cbiAqIEBpZ25vcmVcbiAqL1xuZXhwb3J0IGVudW0gVml6QXV0aG9yaW5nQXR0cmlidXRlcyB7XG4gIE9uV29ya2Jvb2tQdWJsaXNoZWQgPSAnb25Xb3JrYm9va1B1Ymxpc2hlZCcsXG4gIE9uV29ya2Jvb2tQdWJsaXNoZWRBcyA9ICdvbldvcmtib29rUHVibGlzaGVkQXMnLFxuICBPbldvcmtib29rUmVhZHlUb0Nsb3NlID0gJ29uV29ya2Jvb2tSZWFkeVRvQ2xvc2UnLFxuICBIaWRlQ2xvc2VCdXR0b24gPSAnaGlkZS1jbG9zZS1idXR0b24nLFxufVxuXG4vKipcbiAqIFRoZSBuYW1lcyBvZiB0aGUgc3RyaW5nIGNvbnN0YW50cyB5b3UgY2FuIHVzZSBhcyBjaGlsZCB0YWdzIGZvciBUYWJsZWF1Vml6IGFuZCBUYWJsZWF1QXV0aG9yaW5nVml6IGN1c3RvbSBlbGVtZW50cy5cbiAqL1xuZXhwb3J0IGVudW0gVml6Q2hpbGRFbGVtZW50cyB7XG4gIC8qKlxuICAgKiBDb250YWlucyBhIGxpc3Qgb2YgZmlsdGVyIHBhcmFtZXRlcnMuIEF2YWlsYWJsZSBvbmx5IGluIHZpZXdpbmcgbW9kZS5cbiAgICovXG4gIFZpekZpbHRlciA9ICd2aXotZmlsdGVyJyxcblxuICAvKipcbiAgICogQ29udGFpbnMgYSBuYW1lIGFuZCB2YWx1ZSBmb3IgYSBwYXJhbWV0ZXIuIEF2YWlsYWJsZSBvbmx5IGluIHZpZXdpbmcgbW9kZS5cbiAgICovXG4gIFZpelBhcmFtZXRlciA9ICd2aXotcGFyYW1ldGVyJyxcblxuICAvKipcbiAgICogQ29udGFpbnMgYSBsaXN0IG9mIGN1c3RvbSBwYXJhbWV0ZXJzLiAgQXZhaWxhYmxlIGluIGJvdGggdmlld2luZyBhbmQgYXV0aG9yaW5nIG1vZGVzLlxuICAgKi9cbiAgQ3VzdG9tUGFyYW1ldGVyID0gJ2N1c3RvbS1wYXJhbWV0ZXInLFxuXG4gIC8qKlxuICAgKiBDdXN0b20gc3R5bGVzIGFwcGxpY2FibGUgdG8gdGhlIGVtYmVkZGVkIGlmcmFtZSBlbGVtZW50IGl0c2VsZiAobm90IGluc2lkZSBpdCkuIEF2YWlsYWJsZSBpbiBib3RoIHZpZXdpbmcgYW5kIGF1dGhvcmluZyBtb2Rlcy5cbiAgICovXG4gIElmcmFtZVN0eWxlID0gJ2lmcmFtZS1zdHlsZScsXG59XG5cbmV4cG9ydCBlbnVtIFZpekNoaWxkRWxlbWVudEF0dHJpYnV0ZXMge1xuICBGaWVsZCA9ICdmaWVsZCcsXG4gIFZhbHVlID0gJ3ZhbHVlJyxcbiAgTmFtZSA9ICduYW1lJyxcbn1cblxuLyoqXG4gKiBUaGUgaW50ZXJmYWNlIGZvciB0aGUgdG9wIGxldmVsIFZpeiBvYmplY3QuXG4gKiovXG5leHBvcnQgaW50ZXJmYWNlIFZpeiBleHRlbmRzIFZpelNldHRpbmdzLCBXZWJDb21wb25lbnRMb2NhbFNldHRpbmdzLCBWaXpBY3Rpb25zIHtcbiAgLyoqXG4gICAqIE9uZSBXb3JrYm9vayBpcyBzdXBwb3J0ZWQgcGVyIHZpc3VhbGl6YXRpb24uXG4gICAqL1xuICByZWFkb25seSB3b3JrYm9vaz86IFdvcmtib29rO1xuXG4gIC8qKlxuICAgKiBQcm92aWRlIGFuIGF1dGggdG9rZW4gZm9yIHNhbGVzZm9yY2UgbmF0aXZlIG1vZGVcbiAgICogQHBhcmFtIHRva2VuXG4gICAqL1xuICBzZXRBdXRoVG9rZW4odG9rZW46IHN0cmluZyk6IHZvaWQ7XG59XG5cbi8qKlxuICogVGhlIGludGVyZmFjZSBmb3IgdGhlIHRvcCBsZXZlbCBBdXRob3JpbmcgVml6IG9iamVjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRob3JpbmdWaXogZXh0ZW5kcyBWaXpBdXRob3JpbmdTZXR0aW5ncywgV2ViQ29tcG9uZW50TG9jYWxTZXR0aW5ncyB7XG4gIC8qKlxuICAgKiBHZXRzIHRoZSB2aXN1YWxpemF0aW9uJ3MgY3VycmVudCBVUkwuXG4gICAqL1xuICBnZXRDdXJyZW50U3JjQXN5bmMoKTogUHJvbWlzZTxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBQcm92aWRlIGFuIGF1dGggdG9rZW4gZm9yIHNhbGVzZm9yY2UgbmF0aXZlIG1vZGVcbiAgICogQHBhcmFtIHRva2VuXG4gICAqL1xuICBzZXRBdXRoVG9rZW4odG9rZW46IHN0cmluZyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFVzZSB0aGlzIG1ldGhvZCB0byByZWFkanVzdCB0aGUgZGltZW5zaW9ucyBvZiB0aGUgZW1iZWRkZWQgdml6IGluIHJlc3BvbnNlIHRvIHRoaW5ncyBsaWtlIGEgd2luZG93IHJlc2l6ZSwgZGV2aWNlIG9yaWVudGF0aW9uIGNoYW5nZSwgb3JcbiAgICogcGFyZW50IGNvbnRhaW5lciByZXNpemUuXG4gICAqXG4gICAqIGBgYFxuICAgKiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgKCkgPT4gdml6LnJlc2l6ZSgpKTtcbiAgICpcbiAgICogbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHZpei5yZXNpemUoKSkub2JzZXJ2ZSh2aXoucGFyZW50RWxlbWVudCk7XG4gICAqIGBgYFxuICAgKi9cbiAgcmVzaXplKCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFVzZSB0aGlzIG1ldGhvZCB0byBsYXVuY2ggdGhlIEFuYWx5dGljcyBBc3Npc3RhbnQgc2lkZSBwYW5lLlxuICAgKiBZb3UgY2FuIHVzZSB0aGUgYGlzQW5hbHl0aWNzQXNzaXN0YW50QXZhaWxhYmxlQXN5bmMoKWAgbWV0aG9kIHRvIGNoZWNrIGlmIHRoZSBBbmFseXRpY3MgQXNzaXN0YW50IGlzIGF2YWlsYWJsZSBmb3IgdXNlLlxuICAgKlxuICAgKiBgYGBcbiAgICogY29uc3QgaXNBbmFseXRpY3NBc3Npc3RhbnRBdmFpbGFibGUgPSBhd2FpdCB2aXouaXNBbmFseXRpY3NBc3Npc3RhbnRBdmFpbGFibGVBc3luYygpO1xuICAgKiBpZiAoaXNBbmFseXRpY3NBc3Npc3RhbnRBdmFpbGFibGUpIHtcbiAgICogICBhd2FpdCB2aXoubGF1bmNoQW5hbHl0aWNzQXNzaXN0YW50QXN5bmMoKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGxhdW5jaEFuYWx5dGljc0Fzc2lzdGFudEFzeW5jKCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBBbmFseXRpY3MgQXNzaXN0YW50IHNpZGUgcGFuZSBpcyBhdmFpbGFibGUuXG4gICAqL1xuICBpc0FuYWx5dGljc0Fzc2lzdGFudEF2YWlsYWJsZUFzeW5jKCk6IFByb21pc2U8Ym9vbGVhbj47XG59XG5cbi8qKlxuICogUGFydGlhbGx5IGltcGxlbWVudGVkIC0gQWN0aW9ucyByZWxhdGVkIHRvIGV2ZW50cyBhbmQgc3RhdGUgb2YgdGhlIHZpelxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpekFjdGlvbnMge1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgYXV0b21hdGljIHVwZGF0ZXMgYXJlIGN1cnJlbnRseSBwYXVzZWQuXG4gICAqL1xuICByZWFkb25seSBhdXRvbWF0aWNVcGRhdGVzQXJlUGF1c2VkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBQYXVzZSBsYXlvdXQgdXBkYXRlcy4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IGFyZSByZXNpemluZyB0aGUgdmlzdWFsaXphdGlvbiBvciBwZXJmb3JtaW5nIG11bHRpcGxlIGNhbGxzIHRoYXQgY291bGQgYWZmZWN0IHRoZSBsYXlvdXQuXG4gICAqL1xuICBwYXVzZUF1dG9tYXRpY1VwZGF0ZXNBc3luYygpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBSZXN1bWUgbGF5b3V0IHVwZGF0ZXMuXG4gICAqL1xuICByZXN1bWVBdXRvbWF0aWNVcGRhdGVzQXN5bmMoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogVG9nZ2xlIGxheW91dCB1cGRhdGVzLlxuICAgKi9cbiAgdG9nZ2xlQXV0b21hdGljVXBkYXRlc0FzeW5jKCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEVxdWl2YWxlbnQgdG8gY2xpY2tpbmcgb24gdGhlIFJldmVydCBBbGwgdG9vbGJhciBidXR0b24sIHdoaWNoIHJlc3RvcmVzIHRoZSB3b3JrYm9vayB0byBpdHMgc3RhcnRpbmcgc3RhdGUuXG4gICAqL1xuICByZXZlcnRBbGxBc3luYygpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBFcXVpdmFsZW50IHRvIGNsaWNraW5nIG9uIHRoZSBSZWZyZXNoIERhdGEgdG9vbGJhciBidXR0b24uXG4gICAqL1xuICByZWZyZXNoRGF0YUFzeW5jKCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEVxdWl2YWxlbnQgdG8gY2xpY2tpbmcgb24gRG93bmxvYWQgPiBJbWFnZSBmcm9tIHRoZSB0b29sYmFyLCB3aGljaCBjcmVhdGVzIGEgUE5HIGZpbGUgb2YgdGhlIGN1cnJlbnQgdmlzdWFsaXphdGlvbi5cbiAgICovXG4gIGV4cG9ydEltYWdlQXN5bmMoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogRXhwb3J0cyB0aGUgY3Jvc3N0YWIgb2YgYW55IGdpdmVuIHdvcmtzaGVldCB3aXRoaW4gdGhlIGN1cnJlbnQgdmlldyB0byBhXG4gICAqIHNwZWNpZmllZCBmb3JtYXQgKENyb3NzdGFiRmlsZUZvcm1hdC5FeGNlbCwgQ3Jvc3N0YWJGaWxlRm9ybWF0LkNTVikuXG4gICAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgc2hlZXQgbmFtZSBkb2VzIG5vdCBtYXRjaCBhbnkgd29ya3NoZWV0cyB3aXRoaW4gdGhlIGFjdGl2ZSBzaGVldC5cbiAgICogVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBjcm9zc3RhYiBmaWxlIGZhaWxlZCB0byBiZSBjcmVhdGVkLlxuICAgKiBOb3RlOiBleHBvcnRDcm9zc3RhYkFzeW5jIHJlc29sdmVzIHdoZW4gYSBkb3dubG9hZCBpcyBpbml0aWF0ZWQuIEl0IGRvZXMgbm90IGluZGljYXRlIHRoYXQgYSBkb3dubG9hZCB3YXMgc3VjY2Vzc2Z1bCBvciBpZiB0aGUgZG93bmxvYWQgd2FzIGNvbXBsZXRlLlxuICAgKlxuICAgKiBgYGBcbiAgICogbGV0IHZpeiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWJsZWF1Vml6Jyk7XG4gICAqIHZpei5leHBvcnRDcm9zc3RhYkFzeW5jKCdTYWxlcyBieSBTZWdtZW50JywgQ3Jvc3N0YWJGaWxlRm9ybWF0LkNTVik7XG4gICAqIGBgYFxuICAgKi9cbiAgZXhwb3J0Q3Jvc3N0YWJBc3luYyhzaGVldE5hbWU6IHN0cmluZywgZm9ybWF0OiBDcm9zc3RhYkZpbGVGb3JtYXQpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBFeHBvcnRzIHRoZSBzdW1tYXJ5IGRhdGEgc2hvd24gaW4gdGhlIFZpZXcgRGF0YSB3aW5kb3dcbiAgICogKHNob3duIHdoZW4geW91IGNsaWNrIERvd25sb2FkID4gRGF0YSBmcm9tIHRoZSB0b29sYmFyIGZvciBhbnkgZ2l2ZW4gd29ya3NoZWV0IHdpdGhpbiB0aGUgY3VycmVudCB2aWV3KS5cbiAgICogVGhlIGN1cnJlbnQgZmlsZSBmb3JtYXQgaXMgQ1NWLiBUaGVyZSBpcyBubyBsaW1pdGF0aW9uIG9uIHRoZSBhbW91bnQgb2Ygc3VtbWFyeSBkYXRhIHlvdSBjYW4gZXhwb3J0LlxuICAgKiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIHNoZWV0IG5hbWUgZG9lcyBub3QgbWF0Y2ggYW55IHdvcmtzaGVldHMgd2l0aGluIHRoZSBhY3RpdmUgc2hlZXQuXG4gICAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgQ1NWIGZpbGUgZmFpbGVkIHRvIGJlIGNyZWF0ZWQuXG4gICAqIE5vdGU6IGV4cG9ydERhdGFBc3luYyByZXNvbHZlcyB3aGVuIGEgZG93bmxvYWQgaXMgaW5pdGlhdGVkLiBJdCBkb2VzIG5vdCBpbmRpY2F0ZSB0aGF0IGEgZG93bmxvYWQgd2FzIHN1Y2Nlc3NmdWwgb3IgaWYgdGhlIGRvd25sb2FkIHdhcyBjb21wbGV0ZS5cbiAgICpcbiAgICogYGBgXG4gICAqIGxldCB2aXogPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFibGVhdVZpeicpO1xuICAgKiBjb25zdCBhY3RpdmVTaGVldCA9IHZpei53b3JrYm9vay5hY3RpdmVTaGVldDtcbiAgICogaWYgKGFjdGl2ZVNoZWV0LnNoZWV0VHlwZSA9PT0gU2hlZXRUeXBlLldvcmtzaGVldCkge1xuICAgKiAgIGNvbnN0IGNvbHVtbnMgPSBhd2FpdCBhY3RpdmVTaGVldC5nZXRTdW1tYXJ5Q29sdW1uc0luZm9Bc3luYygpO1xuICAgKiAgIC8vIEdldHRpbmcgZmllbGRJZCdzIGZvciBMYXRpdHVkZSBhbmQgTG9uZ2l0dWRlIGNvbHVtbnNcbiAgICogICBjb25zdCBjb2x1bW5zVG9JbmNsdWRlQnlJZCA9IGNvbHVtbnMubWFwKChjb2x1bW4pID0+IHtcbiAgICogICAgIGlmIChjb2x1bW4uZmllbGROYW1lID09PSAnTGF0aXR1ZGUnIHx8IGNvbHVtbi5maWVsZE5hbWUgPT09ICdMb25naXR1ZGUnKSB7XG4gICAqICAgICAgIHJldHVybiBjb2x1bW4uZmllbGRJZDtcbiAgICogICAgIH1cbiAgICogICB9KTtcbiAgICogICBhd2FpdCB2aXouZXhwb3J0RGF0YUFzeW5jKGFjdGl2ZVNoZWV0Lm5hbWUsIHsgY29sdW1uc1RvSW5jbHVkZUJ5SWQgfSk7XG4gICAqIH1cbiAgICogZWxzZSBpZiAoYWN0aXZlU2hlZXQuc2hlZXRUeXBlID09PSBTaGVldFR5cGUuRGFzaGJvYXJkKSB7XG4gICAqICAgLy8gRXhwb3J0aW5nIHRoZSBzdW1tYXJ5IGRhdGEgZm9yIGVhY2ggd29ya3NoZWV0IGluIHRoZSBkYXNoYm9hcmQgd2hpbGUgYWxzbyBpZ25vcmluZyBhbGlhc2VzXG4gICAqICAgZm9yIChjb25zdCB3b3Jrc2hlZXQgb2YgYWN0aXZlU2hlZXQud29ya3NoZWV0cykge1xuICAgKiAgICAgYXdhaXQgdml6LmV4cG9ydERhdGFBc3luYyh3b3Jrc2hlZXQubmFtZSwgeyBpZ25vcmVBbGlhc2VzOiB0cnVlIH0pO1xuICAgKiAgIH1cbiAgICogfVxuICAgKiBlbHNlXG4gICAqIHtcbiAgICogICAvLyBhY3RpdmVTaGVldCBpcyBhIFN0b3J5IGFuZCB3ZSB3YW50IHRvIGV4cG9ydCB3b3Jrc2hlZXRzIHdpdGhpbiB0aGUgY3VycmVudCB2aWV3XG4gICAqICAgY29uc3QgY29udGFpbmVkU2hlZXQgPSBhY3RpdmVTaGVldC5hY3RpdmVTdG9yeVBvaW50LmNvbnRhaW5lZFNoZWV0O1xuICAgKiAgIGlmIChjb250YWluZWRTaGVldCAhPT0gdW5kZWZpbmVkICYmIGNvbnRhaW5lZFNoZWV0LnNoZWV0VHlwZSA9PT0gU2hlZXRUeXBlLldvcmtzaGVldCkge1xuICAgKiAgICAgLy8gRXhwb3J0aW5nIHN1bW1hcnkgZGF0YSBvZiBhIHdvcmtzaGVldCB3aXRoaW4gdGhlIGFjdGl2ZSBzdG9yeSBwb2ludFxuICAgKiAgICAgYXdhaXQgdml6LmV4cG9ydERhdGFBc3luYyhjb250YWluZWRTaGVldC5uYW1lKTtcbiAgICogICB9IGVsc2UgaWYgKGNvbnRhaW5lZFNoZWV0ICE9PSB1bmRlZmluZWQgJiYgY29udGFpbmVkU2hlZXQuc2hlZXRUeXBlID09PSBTaGVldFR5cGUuRGFzaGJvYXJkKSB7XG4gICAqICAgICAvLyBFeHBvcnRpbmcgdGhlIHN1bW1hcnkgZGF0YSBmb3IgZWFjaCB3b3Jrc2hlZXQgd2l0aGluIHRoZSBhY3RpdmUgc3RvcnkgcG9pbnRcbiAgICogICAgIGZvciAoY29uc3Qgd29ya3NoZWV0IG9mIGNvbnRhaW5lZFNoZWV0LndvcmtzaGVldHMpIHtcbiAgICogICAgICAgYXdhaXQgdml6LmV4cG9ydERhdGFBc3luYyh3b3Jrc2hlZXQubmFtZSk7XG4gICAqICAgICB9XG4gICAqICAgfVxuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgZXhwb3J0RGF0YUFzeW5jKHNoZWV0TmFtZTogc3RyaW5nLCBvcHRpb25zPzogRXhwb3J0RGF0YU9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBFeHBvcnRzIHRoZSBsaXN0IG9mIHNoZWV0cyB0byBhIFBvd2VyUG9pbnQgZmlsZS4gSWYgbm8gc2hlZXRzIGFyZSBzcGVjaWZpZWQsIHRoZSBjdXJyZW50IHNoZWV0IGlzIGV4cG9ydGVkLlxuICAgKiBUaGUgb3JkZXIgdGhlIHNoZWV0cyBhcHBlYXIgaW4gdGhlIGxpc3QgaXMgdGhlIG9yZGVyIHRoZSBzaGVldHMgYXBwZWFyIGluIHRoZSBQb3dlclBvaW50IGZpbGUuXG4gICAqIFRoZSBsaXN0IG9mIHNoZWV0cyBjYW4gZWl0aGVyIGV4Y2x1c2l2ZWx5IGluY2x1ZGUgdGhlIHdvcmtzaGVldHMgd2l0aGluIGEgZGFzaGJvYXJkIG9yIGV4Y2x1c2l2ZWx5IGluY2x1ZGUgdGhlIHB1Ymxpc2hlZCBzaGVldHMgZnJvbSB0aGUgd29ya2Jvb2suXG4gICAqXG4gICAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgbGlzdCBvZiBzaGVldHMgY29udGFpbnMgYm90aCB3b3Jrc2hlZXRzIHdpdGhpbiBhIGRhc2hib2FyZCBhbmQgcHVibGlzaGVkIHNoZWV0cyBmcm9tIHRoZSB3b3JrYm9vay5cbiAgICogVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBQb3dlclBvaW50IGZpbGUgZmFpbHMgdG8gYmUgY3JlYXRlZC5cbiAgICpcbiAgICogTm90ZTogZXhwb3J0UG93ZXJQb2ludEFzeW5jIHJlc29sdmVzIHdoZW4gYSBkb3dubG9hZCBpcyBpbml0aWF0ZWQuIEl0IGRvZXMgbm90IGluZGljYXRlIHRoYXQgYSBkb3dubG9hZCB3YXMgc3VjY2Vzc2Z1bCBvciBpZiB0aGUgZG93bmxvYWQgd2FzIGNvbXBsZXRlLlxuICAgKlxuICAgKiBgYGBcbiAgICogbGV0IHZpeiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWJsZWF1Vml6Jyk7XG4gICAqIGNvbnN0IHdvcmtib29rID0gdml6Lndvcmtib29rO1xuICAgKiBjb25zdCBhY3RpdmVTaGVldCA9IHdvcmtib29rLmFjdGl2ZVNoZWV0O1xuICAgKiBpZiAoYWN0aXZlU2hlZXQuc2hlZXRUeXBlID09PSBTaGVldFR5cGUuV29ya3NoZWV0IHx8IGFjdGl2ZVNoZWV0LnNoZWV0VHlwZSA9PT0gU2hlZXRUeXBlLlN0b3J5KSB7XG4gICAqICAgYXdhaXQgdml6LmV4cG9ydFBvd2VyUG9pbnRBc3luYygpO1xuICAgKiB9IGVsc2UgaWYgKGFjdGl2ZVNoZWV0LnNoZWV0VHlwZSA9PT0gIFNoZWV0VHlwZS5EYXNoYm9hcmQpIHtcbiAgICogICBjb25zdCB3b3Jrc2hlZXROYW1lcyA9IGFjdGl2ZVNoZWV0LndvcmtzaGVldHMubWFwKCh3b3Jrc2hlZXQpID0+IHdvcmtzaGVldC5uYW1lKTtcbiAgICogICBhd2FpdCB2aXouZXhwb3J0UG93ZXJQb2ludEFzeW5jKHdvcmtzaGVldE5hbWVzKTtcbiAgICogfVxuICAgKiAvLyBleHBvcnRpbmcgYWxsIHNoZWV0cyB3aXRoaW4gdGhlIHdvcmtib29rIHRvIFBvd2VyUG9pbnRcbiAgICogY29uc3QgcHVibGlzaGVkU2hlZXROYW1lcyA9IHdvcmtib29rLnB1Ymxpc2hlZFNoZWV0c0luZm8ubWFwKChwdWJsaXNoZWRTaGVldEluZm8pID0+IHB1Ymxpc2hlZFNoZWV0SW5mby5uYW1lKTtcbiAgICogYXdhaXQgdml6LmV4cG9ydFBvd2VyUG9pbnRBc3luYyhwdWJsaXNoZWRTaGVldE5hbWVzKTtcbiAgICogYGBgXG4gICAqL1xuICBleHBvcnRQb3dlclBvaW50QXN5bmMoc2hlZXROYW1lcz86IEFycmF5PHN0cmluZz4pOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBFeHBvcnRzIHRoZSBsaXN0IG9mIHNoZWV0cyB3aXRoIHRoZSBnaXZlbiB7QGxpbmsgRXhwb3J0UERGT3B0aW9uc30gb3B0aW9ucy4gSWYgbm8gc2hlZXRzIGFyZSBzcGVjaWZpZWQsIHRoZSBjdXJyZW50IHNoZWV0IGlzIGV4cG9ydGVkLlxuICAgKiBUaGUgbGlzdCBvZiBzaGVldHMgY2FuIGVpdGhlciBleGNsdXNpdmVseSBpbmNsdWRlIHRoZSB3b3Jrc2hlZXRzIHdpdGhpbiBhIGRhc2hib2FyZCBvciBleGNsdXNpdmVseSBpbmNsdWRlIHRoZSBwdWJsaXNoZWQgc2hlZXRzIGZyb20gdGhlIHdvcmtib29rLlxuICAgKiBJZiBubyBFeHBvcnRQREZPcHRpb25zIGFyZSBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IHNldHRpbmdzIGFyZTogU2NhbGluZyA9IEF1dG9tYXRpYywgUGFnZVNpemUgPSBMZXR0ZXIsIGFuZCBPcmllbnRhdGlvbiA9IFBvcnRyYWl0LlxuICAgKlxuICAgKiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIGxpc3Qgb2Ygc2hlZXRzIGNvbnRhaW5zIGJvdGggd29ya3NoZWV0cyB3aXRoaW4gYSBkYXNoYm9hcmQgYW5kIHB1Ymxpc2hlZCBzaGVldHMgZnJvbSB0aGUgd29ya2Jvb2suXG4gICAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgUERGIGZpbGUgZmFpbHMgdG8gYmUgY3JlYXRlZC5cbiAgICpcbiAgICogTm90ZTogZXhwb3J0UERGQXN5bmMgcmVzb2x2ZXMgd2hlbiBhIGRvd25sb2FkIGlzIGluaXRpYXRlZC4gSXQgZG9lcyBub3QgaW5kaWNhdGUgdGhhdCBhIGRvd25sb2FkIHdhcyBzdWNjZXNzZnVsIG9yIGlmIHRoZSBkb3dubG9hZCB3YXMgY29tcGxldGUuXG4gICAqXG4gICAqIGBgYFxuICAgKiBsZXQgdml6ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhYmxlYXVWaXonKTtcbiAgICogY29uc3Qgd29ya2Jvb2sgPSB2aXoud29ya2Jvb2s7XG4gICAqIGNvbnN0IGFjdGl2ZVNoZWV0ID0gd29ya2Jvb2suYWN0aXZlU2hlZXQ7XG4gICAqIGlmIChhY3RpdmVTaGVldC5zaGVldFR5cGUgPT09IFNoZWV0VHlwZS5Xb3Jrc2hlZXQgfHwgYWN0aXZlU2hlZXQuc2hlZXRUeXBlID09PSBTaGVldFR5cGUuU3RvcnkpIHtcbiAgICogICBhd2FpdCB2aXouZXhwb3J0UERGQXN5bmMoKTtcbiAgICogfSBlbHNlIGlmIChhY3RpdmVTaGVldC5zaGVldFR5cGUgPT09ICBTaGVldFR5cGUuRGFzaGJvYXJkKSB7XG4gICAqICAgY29uc3Qgd29ya3NoZWV0TmFtZXMgPSBhY3RpdmVTaGVldC53b3Jrc2hlZXRzLm1hcCgod29ya3NoZWV0KSA9PiB3b3Jrc2hlZXQubmFtZSk7XG4gICAqICAgYXdhaXQgdml6LmV4cG9ydFBERkFzeW5jKHdvcmtzaGVldE5hbWVzKTtcbiAgICogfVxuICAgKiAvLyBleHBvcnRpbmcgYWxsIHNoZWV0cyB3aXRoaW4gdGhlIHdvcmtib29rIHRvIFBERlxuICAgKiBjb25zdCBwdWJsaXNoZWRTaGVldE5hbWVzID0gd29ya2Jvb2sucHVibGlzaGVkU2hlZXRzSW5mby5tYXAoKHB1Ymxpc2hlZFNoZWV0SW5mbykgPT4gcHVibGlzaGVkU2hlZXRJbmZvLm5hbWUpO1xuICAgKiBhd2FpdCB2aXouZXhwb3J0UERGQXN5bmMocHVibGlzaGVkU2hlZXROYW1lcyk7XG4gICAqIGBgYFxuICAgKi9cbiAgZXhwb3J0UERGQXN5bmMoc2hlZXROYW1lcz86IEFycmF5PHN0cmluZz4sIG9wdGlvbnM/OiBFeHBvcnRQREZPcHRpb25zKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogRGlzcGxheSBvbmUgb2YgdGhlIGV4cG9ydCBkaWFsb2dzIGJhc2VkIG9uIHRoZSBkaWFsb2dUeXBlIHBhcmFtZXRlclxuICAgKlxuICAgKiBUaHJvd3MgYW4gZXJyb3IgaWYgZGlhbG9nVHlwZSBpcyBpbnZhbGlkXG4gICAqL1xuICBkaXNwbGF5RGlhbG9nQXN5bmMoZGlhbG9nVHlwZTogVGFibGVhdURpYWxvZ1R5cGUpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB2aXN1YWxpemF0aW9uJ3MgY3VycmVudCBVUkwuXG4gICAqL1xuICBnZXRDdXJyZW50U3JjQXN5bmMoKTogUHJvbWlzZTxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBSZWRvZXMgdGhlIGxhc3QgYWN0aW9uIHBlcmZvcm1lZCBvbiBhIHNoZWV0LlxuICAgKi9cbiAgcmVkb0FzeW5jKCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIFVuZG9lcyB0aGUgbGFzdCBhY3Rpb24gcGVyZm9ybWVkIG9uIGEgc2hlZXQuXG4gICAqL1xuICB1bmRvQXN5bmMoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogQWRkcyBhbiBldmVudCBsaXN0ZW5lciB0byB0aGUgc3BlY2lmaWVkIGV2ZW50LlxuICAgKlxuICAgKiBgYGBcbiAgICogYXN5bmMgZnVuY3Rpb24gZ2V0U2VsZWN0ZWRNYXJrcyhldmVudCkge1xuICAgKiAgICAgY29uc3QgbWFya3NTZWxlY3RlZCA9IGF3YWl0IGV2ZW50LmRldGFpbC5nZXRNYXJrc0FzeW5jKCk7XG4gICAqICAgICBjb25zdCBudW1NYXJrcyA9IG1hcmtzU2VsZWN0ZWQuZGF0YVswXS5kYXRhLmxlbmd0aDtcbiAgICogICAgIGNvbnNvbGUubG9nKGAke251bU1hcmtzfSBtYXJrcyBTZWxlY3RlZGApO1xuICAgKiB9XG4gICAqXG4gICAqIGxldCB2aXogPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFibGVhdVZpeicpO1xuICAgKiB2aXouYWRkRXZlbnRMaXN0ZW5lcihcIm1hcmtzZWxlY3Rpb25jaGFuZ2VkXCIsIGdldFNlbGVjdGVkTWFya3MpO1xuICAgKiBgYGBcbiAgICovXG4gIGFkZEV2ZW50TGlzdGVuZXIodHlwZTogVGFibGVhdUV2ZW50VHlwZSwgbGlzdGVuZXI6IEV2ZW50TGlzdGVuZXJPckV2ZW50TGlzdGVuZXJPYmplY3QsIG9wdGlvbnM/OiBib29sZWFuIHwgQWRkRXZlbnRMaXN0ZW5lck9wdGlvbnMpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuIGV2ZW50IGxpc3RlbmVyIGZyb20gdGhlIHNwZWNpZmllZCBldmVudC5cbiAgICpcbiAgICogYGBgXG4gICAqIGxldCB2aXogPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFibGVhdVZpeicpO1xuICAgKiB2aXoucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1hcmtzZWxlY3Rpb25jaGFuZ2VkXCIsIGdldFNlbGVjdGVkTWFya3MpO1xuICAgKiBgYGBcbiAgICovXG4gIHJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZTogVGFibGVhdUV2ZW50VHlwZSwgbGlzdGVuZXI6IEV2ZW50TGlzdGVuZXJPckV2ZW50TGlzdGVuZXJPYmplY3QsIG9wdGlvbnM/OiBib29sZWFuIHwgRXZlbnRMaXN0ZW5lck9wdGlvbnMpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBVc2UgdGhpcyBtZXRob2QgdG8gZmlsdGVyIHRoZSB2aXogYmVmb3JlIGluaXRpYWxpemF0aW9uLiBJZiB1c2VkIGFmdGVyIGluaXRpYWxpemF0aW9uLCBpdCB3aWxsIHJlLXJlbmRlciB0aGUgdml6LlxuICAgKiBGb3IgZmlsdGVyaW5nIGFmdGVyIGluaXRpYWxpemF0aW9uLCB1c2UgdGhlIG90aGVyIGZpbHRlcmluZyBtZXRob2RzLCBzdWNoIGFzIGBhcHBseUZpbHRlckFzeW5jYC5cbiAgICpcbiAgICogSWYgeW91IGFkZCB0aGUgc2FtZSBmaWx0ZXIgZmllbGRzIHVzaW5nIHRoZSBgYWRkRmlsdGVyKClgIG1ldGhvZCBhbmQgYnkgdXNpbmcgdGhlIGA8dml6LWZpbHRlcj5gIGVsZW1lbnQgaW4gdGhlIGA8dGFibGVhdS12aXo+YCB3ZWIgY29tcG9uZW50LFxuICAgKiB5b3UgbWlnaHQgZXhwZXJpZW5jZSB1bmV4cGVjdGVkIGJlaGF2aW9yLlxuICAgKlxuICAgKiBAcGFyYW0gZmllbGROYW1lIFRoZSBuYW1lIG9mIHRoZSBmaWVsZCB0byBmaWx0ZXIgb24uXG4gICAqIEBwYXJhbSB2YWx1ZSBTaW5nbGUgdmFsdWUgb3IgYSBsaXN0IG9mIGNvbW1hIHNlcGFyYXRlZCB2YWx1ZXMgdG8gZmlsdGVyIG9uLlxuICAgKlxuICAgKiBgYGBcbiAgICogdml6LmFkZEZpbHRlcignUmVnaW9uJywgJ0NlbnRyYWwsV2VzdCcpO1xuICAgKiBgYGBcbiAgICovXG4gIGFkZEZpbHRlcihmaWVsZE5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFVzZSB0aGlzIG1ldGhvZCB0byByZWFkanVzdCB0aGUgZGltZW5zaW9ucyBvZiB0aGUgZW1iZWRkZWQgdml6IGluIHJlc3BvbnNlIHRvIHRoaW5ncyBsaWtlIGEgd2luZG93IHJlc2l6ZSwgZGV2aWNlIG9yaWVudGF0aW9uIGNoYW5nZSwgb3JcbiAgICogcGFyZW50IGNvbnRhaW5lciByZXNpemUuXG4gICAqXG4gICAqIGBgYFxuICAgKiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgKCkgPT4gdml6LnJlc2l6ZSgpKTtcbiAgICpcbiAgICogbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHZpei5yZXNpemUoKSkub2JzZXJ2ZSh2aXoucGFyZW50RWxlbWVudCk7XG4gICAqIGBgYFxuICAgKi9cbiAgcmVzaXplKCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFVzZSB0aGlzIG1ldGhvZCB0byBsYXVuY2ggdGhlIEFuYWx5dGljcyBBc3Npc3RhbnQgc2lkZSBwYW5lLlxuICAgKiBZb3UgY2FuIHVzZSB0aGUgYGlzQW5hbHl0aWNzQXNzaXN0YW50QXZhaWxhYmxlQXN5bmMoKWAgbWV0aG9kIHRvIGNoZWNrIGlmIHRoZSBBbmFseXRpY3MgQXNzaXN0YW50IGlzIGF2YWlsYWJsZSBmb3IgdXNlLlxuICAgKlxuICAgKiBgYGBcbiAgICogY29uc3QgaXNBbmFseXRpY3NBc3Npc3RhbnRBdmFpbGFibGUgPSBhd2FpdCB2aXouaXNBbmFseXRpY3NBc3Npc3RhbnRBdmFpbGFibGVBc3luYygpO1xuICAgKiBpZiAoaXNBbmFseXRpY3NBc3Npc3RhbnRBdmFpbGFibGUpIHtcbiAgICogICBhd2FpdCB2aXoubGF1bmNoQW5hbHl0aWNzQXNzaXN0YW50QXN5bmMoKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGxhdW5jaEFuYWx5dGljc0Fzc2lzdGFudEFzeW5jKCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBBbmFseXRpY3MgQXNzaXN0YW50IHNpZGUgcGFuZSBpcyBhdmFpbGFibGUuXG4gICAqL1xuICBpc0FuYWx5dGljc0Fzc2lzdGFudEF2YWlsYWJsZUFzeW5jKCk6IFByb21pc2U8Ym9vbGVhbj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVml6U2l6ZSB7XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzaGVldFNpemUgcmVjb3JkIGZvciB0aGUgY3VycmVudCBzaGVldFxuICAgKi9cbiAgcmVhZG9ubHkgc2hlZXRTaXplOiBTaGVldFNpemU7XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGhlaWdodCBvZiB0aGUgVGFibGVhdSBVSSBlbGVtZW50cyAodGhlIGNocm9tZSkgc3Vycm91bmRpbmcgdGhlIHZpZXcuXG4gICAqL1xuICByZWFkb25seSBjaHJvbWVIZWlnaHQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUaGlzIGludGVyZmFjZSByZXByZXNlbnRzIGFsbCBvZiB0aGUgb3B0aW9ucyBmb3IgY29uZmlndXJpbmcgYSB2aXogdGhhdCBhcmUgY29tbW9uIGJldHdlZW5cbiAqIHZpZXdpbmcgYW5kIGF1dGhvcmluZyBtb2RlLlxuICovXG5pbnRlcmZhY2UgVml6U2V0dGluZ3NTaGFyZWQgZXh0ZW5kcyBXZWJDb21wb25lbnRTZXR0aW5nc1NoYXJlZCB7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0byB0b3VjaCBvcHRpbWl6ZSB2aXogY29udHJvbHMuXG4gICAqXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgdG91Y2gtb3B0aW1pemUgLz5cbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiB0b3VjaC1vcHRpbWl6ZSAvPlxuICAgKiBgYGBcbiAgICovXG4gIHRvdWNoT3B0aW1pemU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgRWRpdCBpbiBEZXNrdG9wIGJ1dHRvbiBpcyBoaWRkZW4gb3IgdmlzaWJsZS5cbiAgICogSWYgbm90IHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gZmFsc2UsIG1lYW5pbmcgdGhhdCB0aGUgRWRpdCBpbiBEZXNrdG9wIGJ1dHRvbiBpcyB2aXNpYmxlLlxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIGhpZGUtZWRpdC1pbi1kZXNrdG9wLWJ1dHRvbj5cbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiBoaWRlLWVkaXQtaW4tZGVza3RvcC1idXR0b24+XG4gICAqIGBgYFxuICAgKi9cbiAgaGlkZUVkaXRJbkRlc2t0b3BCdXR0b24/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZGVmYXVsdCBlZGl0IGJlaGF2aW9yIGlzIHN1cHByZXNzZWQuXG4gICAqIElmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvIGZhbHNlLCBtZWFuaW5nIHRoYXQgdGhlIGRlZmF1bHQgZWRpdCBiZWhhdmlvciBpcyBub3Qgc3VwcHJlc3NlZC5cbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBzdXBwcmVzcy1kZWZhdWx0LWVkaXQtYmVoYXZpb3I+XG4gICAqIDx0YWJsZWF1LWF1dGhvcmluZy12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgc3VwcHJlc3MtZGVmYXVsdC1lZGl0LWJlaGF2aW9yPlxuICAgKiBgYGBcbiAgICovXG4gIHN1cHByZXNzRGVmYXVsdEVkaXRCZWhhdmlvcj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIHRoZSB1c2VyIGNsaWNrcyBvbiB0aGUgRWRpdCBJbiBEZXNrdG9wIEJ1dHRvbi4gWW91IGNhbiB1c2UgdGhpcyBldmVudCB0eXBlIHdpdGggVGFibGVhdVZpeiBvYmplY3RzLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uRWRpdEluRGVza3RvcEJ1dHRvbkNsaWNrZWQ9XCJvbkVkaXRJbkRlc2t0b3BCdXR0b25DbGlja2VkSGFuZGxlclwiIC8+XG4gICAqIDx0YWJsZWF1LWF1dGhvcmluZy12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25FZGl0SW5EZXNrdG9wQnV0dG9uQ2xpY2tlZD1cIm9uRWRpdEluRGVza3RvcEJ1dHRvbkNsaWNrZWRIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvbkVkaXRJbkRlc2t0b3BCdXR0b25DbGlja2VkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgd2hlbiB0aGUgc2l6ZSBvZiB0aGUgdml6IGlzIGtub3duLiBZb3UgY2FuIHVzZSB0aGlzIGV2ZW50IHRvIHBlcmZvcm0gdGFza3Mgc3VjaCBhcyByZXNpemluZ1xuICAgKiB0aGUgZWxlbWVudHMgc3Vycm91bmRpbmcgdGhlIFZpeiBvYmplY3Qgb25jZSB0aGUgb2JqZWN0J3Mgc2l6ZSBoYXMgYmVlbiBlc3RhYmxpc2hlZC5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBcIm9uRmlyc3RWaXpTaXplS25vd25cIj1cIm9uRmlyc3RWaXpTaXplS25vd25IYW5kbGVyXCIgLz5cbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvbkZpcnN0Vml6U2l6ZUtub3duPVwib25GaXJzdFZpelNpemVLbm93bkhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uRmlyc3RWaXpTaXplS25vd24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIHRoZSBWaXogb2JqZWN0IGZpcnN0IGJlY29tZXMgaW50ZXJhY3RpdmUuIFRoaXMgaXMgb25seSByYWlzZWQgb25jZS5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBcIm9uRmlyc3RJbnRlcmFjdGl2ZVwiPVwib25GaXJzdEludGVyYWN0aXZlSGFuZGxlclwiIC8+XG4gICAqIDx0YWJsZWF1LWF1dGhvcmluZy12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25GaXJzdEludGVyYWN0aXZlPVwib25GaXJzdEludGVyYWN0aXZlSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25GaXJzdEludGVyYWN0aXZlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBvcHRpb25zIGZvciBjb25maWd1cmluZyBhIHZpeiBpbiB2aWV3IG1vZGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVml6U2V0dGluZ3MgZXh0ZW5kcyBWaXpTZXR0aW5nc1NoYXJlZCB7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0byBzdXBwcmVzcyB0aGUgZXhlY3V0aW9uIG9mIFVSTCBhY3Rpb25zLiBUaGlzIG9wdGlvbiBkb2VzIG5vdCBwcmV2ZW50IHRoZSBVUkwgYWN0aW9uXG4gICAqIGV2ZW50IGZyb20gYmVpbmcgcmFpc2VkLiBZb3UgY2FuIHVzZSB0aGlzIG9wdGlvbiB0byBjaGFuZ2Ugd2hhdCBoYXBwZW5zIHdoZW4gYSBVUkwgYWN0aW9uIG9jY3Vycy4gSWYgc2V0XG4gICAqIHRvIHRydWUgYW5kIHlvdSBjcmVhdGUgYW4gZXZlbnQgbGlzdGVuZXIgZm9yIHRoZSBVUkxfQUNUSU9OIGV2ZW50LCB5b3UgY2FuIHVzZSBhbiBldmVudCBsaXN0ZW5lclxuICAgKiBoYW5kbGVyIHRvIGN1c3RvbWl6ZSB0aGUgYWN0aW9ucy5cbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBkaXNhYmxlLXVybC1hY3Rpb25zIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgZGlzYWJsZVVybEFjdGlvbnNQb3B1cHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0YWJzIGFyZSBoaWRkZW4gb3Igc2hvd24uXG4gICAqXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgIGhpZGUtdGFicyAvPlxuICAgKiBgYGBcbiAgICovXG4gIGhpZGVUYWJzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBwb3NpdGlvbiBvZiB0aGUgdG9vbGJhciwgaWYgaXQgaXMgc2hvd24uIFRoZSB2YWx1ZXMgY2FuIGJlIFRvb2xiYXIuVG9wLFxuICAgKiBUb29sYmFyLkJvdHRvbSBvciBUb29sYmFyLkhpZGRlbi5cbiAgICogSWYgbm90IHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gVG9vbGJhci5Cb3R0b20uXG4gICAqXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgIHRvb2xiYXI9XCJoaWRkZW5cIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIHRvb2xiYXI/OiBUb29sYmFyO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgYSBkZXZpY2UgbGF5b3V0IGZvciBhIGRhc2hib2FyZCwgaWYgaXQgZXhpc3RzLlxuICAgKiBWYWx1ZXMgY2FuIGJlIGRlZmF1bHQsIGRlc2t0b3AsIHRhYmxldCwgb3IgcGhvbmUuXG4gICAqIElmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvIGxvYWRpbmcgYSBsYXlvdXQgYmFzZWQgb24gdGhlXG4gICAqIHNtYWxsZXN0IGRpbWVuc2lvbiBvZiB0aGUgaG9zdGluZyBpZnJhbWUgZWxlbWVudC5cbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiAgZGV2aWNlPVwiZGVza3RvcFwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgZGV2aWNlPzogRGV2aWNlVHlwZTtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBJRCBvZiBhbiBleGlzdGluZyBpbnN0YW5jZSB0byBtYWtlIGEgY29weSAoY2xvbmUpIG9mLlxuICAgKiBUaGlzIGlzIHVzZWZ1bCBpZiB0aGUgdXNlciB3YW50cyB0byBjb250aW51ZSBhbmFseXNpcyBvZiBhbiBleGlzdGluZyB2aXN1YWxpemF0aW9uXG4gICAqIHdpdGhvdXQgbG9zaW5nIHRoZSBzdGF0ZSBvZiB0aGUgb3JpZ2luYWwuIElmIHRoZSBJRCBkb2VzIG5vdCByZWZlciB0byBhbiBleGlzdGluZyB2aXN1YWxpemF0aW9uLFxuICAgKiB0aGUgY2xvbmVkIHZlcnNpb24gaXMgZGVyaXZlZCBmcm9tIHRoZSBvcmlnaW5hbCB2aXN1YWxpemF0aW9uLlxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiICBpbnN0YW5jZS1pZC10by1jbG9uZT1cImlkMVwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgaW5zdGFuY2VJZFRvQ2xvbmU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBFZGl0IGJ1dHRvbiBpcyBoaWRkZW4gb3IgdmlzaWJsZS5cbiAgICogSWYgbm90IHNldCwgZGVmYXVsdHMgdG8gZmFsc2UsIG1lYW5pbmcgdGhhdCB0aGUgRWRpdCBidXR0b24gaXMgdmlzaWJsZS5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBoaWRlLWVkaXQtYnV0dG9uPlxuICAgKiBgYGBcbiAgICovXG4gIGhpZGVFZGl0QnV0dG9uPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIG9uIHRoZSBFZGl0IEJ1dHRvbi5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvbkVkaXRCdXR0b25DbGlja2VkPVwib25FZGl0QnV0dG9uQ2xpY2tlZEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uRWRpdEJ1dHRvbkNsaWNrZWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIGFueSBmaWx0ZXIgaGFzIGNoYW5nZWQgc3RhdGUuIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFRhYmxlYXVWaXogb2JqZWN0cy5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvbkZpbHRlckNoYW5nZWQ9XCJvbkZpbHRlckNoYW5nZWRIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvbkZpbHRlckNoYW5nZWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIGEgY3VzdG9tIG1hcmsgY29udGV4dCBtZW51IGlzIGNsaWNrZWQuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25DdXN0b21NYXJrQ29udGV4dE1lbnVFdmVudD1cIm9uQ3VzdG9tTWFya0NvbnRleHRNZW51RXZlbnRIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvbkN1c3RvbU1hcmtDb250ZXh0TWVudUV2ZW50Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgd2hlbiB0aGUgc2VsZWN0ZWQgbWFya3Mgb24gYSB2aXN1YWxpemF0aW9uIGhhdmUgY2hhbmdlZC4gWW91IGNhbiB1c2UgdGhpcyBldmVudCB0eXBlIHdpdGggVGFibGVhdVZpeiBvYmplY3RzLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uTWFya1NlbGVjdGlvbkNoYW5nZWQ9XCJvbk1hcmtTZWxlY3Rpb25DaGFuZ2VkSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25NYXJrU2VsZWN0aW9uQ2hhbmdlZD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gYSBwYXJhbWV0ZXIgaGFzIGhhZCBpdHMgdmFsdWUgbW9kaWZpZWQuIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFtbUGFyYW1ldGVyXV0gb2JqZWN0cy5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvblBhcmFtZXRlckNoYW5nZWQ9XCJvblBhcmFtZXRlckNoYW5nZWRIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvblBhcmFtZXRlckNoYW5nZWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIGEgdG9vbGJhciBidXR0b24gb3IgY29udHJvbCBiZWNvbWVzIGF2YWlsYWJsZSBvciBiZWNvbWVzIHVuYXZhaWxhYmxlLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uVG9vbGJhclN0YXRlQ2hhbmdlZD1cIm9uVG9vbGJhclN0YXRlQ2hhbmdlZEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uVG9vbGJhclN0YXRlQ2hhbmdlZD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gYSBVUkwgYWN0aW9uIG9jY3Vycy4gU2VlIHRoZSB7QGxpbmsgVXJsQWN0aW9uRXZlbnR9IGNsYXNzLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uVXJsQWN0aW9uPVwib25VcmxBY3Rpb25IYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvblVybEFjdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIGFmdGVyIGEgdGFiIHN3aXRjaCBvY2N1cnMgKHRoZSBhY3RpdmUgc2hlZXQgaGFzIGNoYW5nZWQpLiBHdWFyYW50ZWVzIHRoZSB2aXogb2JqZWN0IHdpbGwgYmUgaW50ZXJhY3RpdmUgYWZ0ZXIgdGhpcy5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvblRhYlN3aXRjaGVkPVwib25UYWJTd2l0Y2hlZEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uVGFiU3dpdGNoZWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIGEgY3VzdG9tIHZpZXcgaGFzIGZpbmlzaGVkIGxvYWRpbmcuIFRoaXMgZXZlbnQgaXMgcmFpc2VkIGFmdGVyIHRoZSBjYWxsYmFja1xuICAgKiBmdW5jdGlvbiBmb3Ige0BsaW5rIEZpcnN0SW50ZXJhY3RpdmV9IChpZiBhbnkpIGhhcyBiZWVuIGNhbGxlZC5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvbkN1c3RvbVZpZXdMb2FkZWQ9XCJvbkN1c3RvbVZpZXdMb2FkZWRIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvbkN1c3RvbVZpZXdMb2FkZWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIGEgY3VzdG9tIHZpZXcgaGFzIGJlZW4gcmVtb3ZlZC5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvbkN1c3RvbVZpZXdSZW1vdmVkPVwib25DdXN0b21WaWV3UmVtb3ZlZEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uQ3VzdG9tVmlld1JlbW92ZWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIGEgY3VzdG9tIHZpZXcgaGFzIGJlZW4gc2F2ZWQgKG5ld2x5IGNyZWF0ZWQgb3IgdXBkYXRlZCkuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25DdXN0b21WaWV3U2F2ZWQ9XCJvbkN1c3RvbVZpZXdTYXZlZEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uQ3VzdG9tVmlld1NhdmVkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgd2hlbiBhIGN1c3RvbSB2aWV3IGhhcyBiZWVuIHNldCBhcyB0aGUgZGVmYXVsdCB2aWV3IGZvciBhIHdvcmtib29rLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uQ3VzdG9tVmlld1NldERlZmF1bHQ9XCJvbkN1c3RvbVZpZXdTZXREZWZhdWx0SGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25DdXN0b21WaWV3U2V0RGVmYXVsdD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIGFmdGVyIGEgbmV3IHN0b3J5IHBvaW50IGJlY29tZXMgYWN0aXZlLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uU3RvcnlQb2ludFN3aXRjaGVkPVwib25TdG9yeVBvaW50U3dpdGNoZWRIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvblN0b3J5UG9pbnRTd2l0Y2hlZD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gdGhlIHN1bW1hcnkgZGF0YSBvbiBhIHZpc3VhbGl6YXRpb24gaGF2ZSBjaGFuZ2VkLiBZb3UgY2FuIHVzZSB0aGlzIGV2ZW50IHR5cGUgd2l0aCBUYWJsZWF1Vml6IG9iamVjdHMuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25TdW1tYXJ5RGF0YUNoYW5nZWQ9XCJvblN1bW1hcnlEYXRhQ2hhbmdlZEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uU3VtbWFyeURhdGFDaGFuZ2VkPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIChCZXRhKSBSZXByZXNlbnRzIHRoZSBvcHRpb25zIGZvciBjb25maWd1cmluZyBhIHZpeiBpbiBhdXRob3JpbmcgbW9kZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaXpBdXRob3JpbmdTZXR0aW5ncyBleHRlbmRzIFZpelNldHRpbmdzU2hhcmVkIHtcbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBDbG9zZSBidXR0b24gaXMgaGlkZGVuIG9yIHZpc2libGUuXG4gICAqIElmIG5vdCBzZXQsIGRlZmF1bHRzIHRvIGZhbHNlLCBtZWFuaW5nIHRoYXQgdGhlIENsb3NlIGJ1dHRvbiBpcyB2aXNpYmxlLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiBoaWRlLWNsb3NlLWJ1dHRvbiAvPlxuICAgKiBgYGBcbiAgICovXG4gIGhpZGVDbG9zZUJ1dHRvbj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIHRoZSB3b3JrYm9vayBoYXMgYmVlbiBwdWJsaXNoZWQuIFRoaXMgbm90aWZpY2F0aW9uIGlzIHNlbnQgd2hlbiB1c2luZyBlbWJlZGRlZCB3ZWIgYXV0aG9yaW5nIGZ1bmN0aW9uYWxpdHkuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIG9uV29ya2Jvb2tQdWJsaXNoZWQ9XCJvbldvcmtib29rUHVibGlzaGVkSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25Xb3JrYm9va1B1Ymxpc2hlZD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gXCJwdWJsaXNoIGFzXCIgaXMgc3VjY2Vzc2Z1bC4gVGhpcyBub3RpZmljYXRpb24gaXMgc2VudCB3aGVuIHVzaW5nIGVtYmVkZGVkIHdlYiBhdXRob3JpbmcgZnVuY3Rpb25hbGl0eS5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LWF1dGhvcmluZy12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25Xb3JrYm9va1B1Ymxpc2hlZEFzPVwib25Xb3JrYm9va1B1Ymxpc2hlZEFzSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25Xb3JrYm9va1B1Ymxpc2hlZEFzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgd2hlbiB0aGUgd29ya2Jvb2sgaXMgcmVhZHkgdG8gY2xvc2UuIFRoaXMgbm90aWZpY2F0aW9uIGlzIHNlbnQgd2hlbiB1c2luZyBlbWJlZGRlZCB3ZWIgYXV0aG9yaW5nIGZ1bmN0aW9uYWxpdHkuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIG9uV29ya2Jvb2tSZWFkeVRvQ2xvc2U9XCJvbldvcmtib29rUmVhZHlUb0Nsb3NlSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25Xb3JrYm9va1JlYWR5VG9DbG9zZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWx0ZXJQYXJhbWV0ZXJzIHtcbiAgZmllbGQ6IHN0cmluZztcbiAgdmFsdWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBWaXpQYXJhbWV0ZXJzIGFyZSB1c2VkIHRvIHNldCBQYXJhbWV0ZXIgdmFsdWVzIG9uIHRoZSB2aXouXG4gKlxuICogKiBgYGBcbiAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIj5cbiAqICA8dml6LXBhcmFtZXRlciBuYW1lPVwicGFyYW1ldGVyLW5hbWVcIiB2YWx1ZT1cInBhcmFtZXRlci12YWx1ZVwiPjwvdml6LXBhcmFtZXRlcj5cbiAqIDwvdGFibGVhdS12aXo+XG4gKiBgYGBcbiAqXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVml6UGFyYW1ldGVyIHtcbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHBhcmFtZXRlciB0byBiZSBzZXQuXG4gICAqL1xuICBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFZhbGlkIHZhbHVlIGZvciB0aGUgcGFyYW1ldGVyIGJlaW5nIHNldC5cbiAgICovXG4gIHZhbHVlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ3VzdG9tUGFyYW1ldGVycyBhcmUgdXNlZCB0byBwYXNzIGFsb25nIHNldHRpbmdzLCBpbmZvcm1hdGlvbiwgZXRjLiwgdGhhdCBhcmVuJ3QgZXhwb3NlZCBvbiB0aGVcbiAqIHRhYmxlYXUtdml6IGVsZW1lbnQuIEN1c3RvbVBhcmFtZXRlcnMgd2lsbCBvdmVycmlkZSBhdHRyaWJ1dGVzLCBvciBmaWx0ZXJzLCBzZXQgb24gdGhlIHRhYmxlYXUtdml6IGVsZW1lbnQuXG4gKlxuICogKiBgYGBcbiAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIj5cbiAqICA8Y3VzdG9tLXBhcmFtZXRlciBuYW1lPVwicGFyYW1ldGVyLW5hbWVcIiB2YWx1ZT1cInBhcmFtZXRlci12YWx1ZVwiPjwvY3VzdG9tLXBhcmFtZXRlcj5cbiAqIDwvdGFibGVhdS12aXo+XG4gKiBgYGBcbiAqXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3VzdG9tUGFyYW1ldGVyIHtcbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHBhcmFtZXRlciB0byBiZSBzZXQuXG4gICAqL1xuICBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFZhbGlkIHZhbHVlIGZvciB0aGUgcGFyYW1ldGVyIGJlaW5nIHNldC5cbiAgICovXG4gIHZhbHVlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBvYmplY3QgZm9yIGV4cG9ydGluZyBkYXRhLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4cG9ydERhdGFPcHRpb25zIHtcbiAgLyoqXG4gICAqIERvIG5vdCB1c2UgYWxpYXNlcyBzcGVjaWZpZWQgaW4gdGhlIGRhdGEgc291cmNlIGluIFRhYmxlYXUuIERlZmF1bHQgaXMgZmFsc2UuXG4gICAqL1xuICBpZ25vcmVBbGlhc2VzPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRoZSBjb2x1bW5zIHRvIGluY2x1ZGUgc3BlY2lmaWVkIGJ5IGZpZWxkIGlkLCBpbmNsdWRlcyBhbGwgYnkgZGVmYXVsdC5cbiAgICogVGhlIG9yZGVyIG9mIHRoZSBjb2x1bW4gaWRzIGluIHRoZSBhcnJheSBkZXRlcm1pbmVzIHRoZSBjb2x1bW4gb3JkZXIgc2hvd24gaW4gdGhlIHN1bW1hcnkgZGF0YSB0YWJsZS5cbiAgICovXG4gIGNvbHVtbnNUb0luY2x1ZGVCeUlkPzogQXJyYXk8c3RyaW5nPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeHBvcnRQREZPcHRpb25zIHtcbiAgc2NhbGluZzogUHJpbnRTY2FsaW5nO1xuICBwYWdlU2l6ZTogUHJpbnRQYWdlU2l6ZTtcbiAgb3JpZW50YXRpb246IFByaW50T3JpZW50YXRpb247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhwb3J0U2NlbmFyaW9zRm9yUERGQW5kUG93ZXJQb2ludCB7XG4gIGN1cnJlbnRTaGVldE5hbWU6IHN0cmluZztcbiAgZXhwb3J0YWJsZVNoZWV0TmFtZXNGcm9tRGFzaGJvYXJkOiBBcnJheTxzdHJpbmc+O1xuICBleHBvcnRhYmxlU2hlZXROYW1lc0Zyb21Xb3JrYm9vazogQXJyYXk8c3RyaW5nPjtcbn1cbiIsIi8qKlxuICogVXNlciBzdXBwbGllZCBvcHRpb25zIHRoYXQgZG8gbm90IGdldCBwYXNzZWQgYXMgcmVxdWVzdCBwYXJhbWV0ZXJzIHRvIGxvYWQgYSBUYWJsZWF1IHZpeiwgVGFibGVhdSBhc2tkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2ViQ29tcG9uZW50TG9jYWxTZXR0aW5ncyB7XG4gIC8qKlxuICAgKiBUaGUgdml6IHNyY1xuICAgKi9cbiAgc3JjPzogc3RyaW5nIHwgbnVsbDtcblxuICAvKipcbiAgICogUmVwcmVzZW50cyB3aWR0aCBpbiBwaXhlbHNcbiAgICogQ2FuIGJlIGFueSB2YWxpZCBDU1Mgc2l6ZSBzcGVjaWZpZXIuIElmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvIHRoZSBwdWJsaXNoZWQgd2lkdGggb2YgdGhlIHZpZXcuXG4gICAqL1xuICB3aWR0aD86IHN0cmluZyB8IG51bWJlcjtcblxuICAvKipcbiAgICogUmVwcmVzZW50cyBoZWlnaHQgaW4gcGl4ZWxzXG4gICAqIENhbiBiZSBhbnkgdmFsaWQgQ1NTIHNpemUgc3BlY2lmaWVyLiBJZiBub3Qgc3BlY2lmaWVkLCBkZWZhdWx0cyB0byB0aGUgcHVibGlzaGVkIGhlaWdodCBvZiB0aGUgdmlldy5cbiAgICovXG4gIGhlaWdodD86IHN0cmluZyB8IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUaGlzIGludGVyZmFjZSByZXByZXNlbnRzIGFsbCBvZiB0aGUgb3B0aW9ucyBmb3IgY29uZmlndXJpbmcgYSB3ZWJjb21wb25lbnQgdGhhdCBhcmUgY29tbW9uIGJldHdlZW5cbiAqIHZpeiBhbmQgYXNrZGF0YS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJDb21wb25lbnRTZXR0aW5nc1NoYXJlZCB7XG4gIC8qKlxuICAgKiBUaGUgdG9rZW4gdXNlZCBmb3IgYXV0aG9yaXphdGlvblxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIHRva2VuPVwic29tZS10b2tlbi1jb250YWluaW5nLWNsaWVudElkXCIgLz5cbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiB0b2tlbj1cInNvbWUtdG9rZW4tY29udGFpbmluZy1jbGllbnRJZFwiIC8+XG4gICAqIDx0YWJsZWF1LWFzay1kYXRhIGlkPVwidGFibGVhdUFza0RhdGFcIiB0b2tlbj1cInNvbWUtdG9rZW4tY29udGFpbmluZy1jbGllbnRJZFwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgdG9rZW4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBub24tbWluaWZpZWQgdmVyc2lvbiBvZiBKYXZhU2NyaXB0IGlzIGxvYWRlZC4gSWYgc3BlY2lmaWVkIChvciBzZXQgdG8gdHJ1ZSksIHRoZVxuICAgKiBub24tbWluaWZpZWQgdmVyc2lvbiBpcyB1c2VkIGZvciBib3RoIHRoZSBsb2NhbCBjb21wb25lbnQgYW5kIHRoZSBUYWJsZWF1IFNlcnZlciB2aXN1YWxpemF0aW9uIChpZiBlbmFibGVkKS5cbiAgICogSWYgbm90IHNwZWNpZmllZCAob3Igc2V0IHRvIGZhbHNlKSwgdGhlIG1pbmlmaWVkIHZlcnNpb24gb2YgdGhlIEphdmFTY3JpcHQgZmlsZXMgYXJlIGxvYWRlZC5cbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBkZWJ1ZyAvPlxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIGRlYnVnIC8+XG4gICAqIDx0YWJsZWF1LWFzay1kYXRhIGlkPVwidGFibGVhdUFza0RhdGFcIiBkZWJ1ZyAvPlxuICAgKiBgYGBcbiAgICovXG4gIGRlYnVnPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdG8gdXNlIHRoZSBvbGQgYXV0aCBtZWNoYW5pc20gZm9yIGF1dGhlbnRpY2F0aW9uIHdoaWNoIGhhcHBlbnMgaW5zaWRlIHRoZSBpZnJhbWUuIElmIHNwZWNpZmllZCwgVml6TG9hZEVycm9yRXZlbnRzXG4gICAqIHRyaWdnZXJlZCBkdWUgdG8gYXV0aCBmYWlsdXJlcyB3aWxsIG5vdCBiZSB0aHJvd24uXG4gICAqXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgaWZyYW1lLWF1dGggLz5cbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiBpZnJhbWUtYXV0aCAvPlxuICAgKiA8dGFibGVhdS1hc2stZGF0YSBpZD1cInRhYmxlYXVBc2tEYXRhXCIgaWZyYW1lLWF1dGggLz5cbiAgICogYGBgXG4gICAqL1xuICBpZnJhbWVBdXRoPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHZhbHVlIG9mIHRoZSAnbG9hZGluZycgYXR0cmlidXRlIG9mIHRoZSBlbWJlZGRlZCBpZnJhbWUuXG4gICAqIFNlZTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRNTC9FbGVtZW50L2lmcmFtZSNsb2FkaW5nXG4gICAqXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgaWZyYW1lLWF0dHItbG9hZGluZz1cImxhenlcIiAvPlxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIGlmcmFtZS1hdHRyLWxvYWRpbmc9XCJsYXp5XCIgLz5cbiAgICogPHRhYmxlYXUtcHVsc2UgaWQ9XCJ0YWJsZWF1UHVsc2VcIiBpZnJhbWUtYXR0ci1sb2FkaW5nPVwibGF6eVwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgaWZyYW1lQXR0cmlidXRlTG9hZGluZz86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZhbHVlIG9mIHRoZSAnc3R5bGUnIGF0dHJpYnV0ZSBvZiB0aGUgZW1iZWRkZWQgaWZyYW1lLlxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIGlmcmFtZS1hdHRyLXN0eWxlPVwiYm9yZGVyOiAxcHggc29saWQgcmVkXCIgLz5cbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiBpZnJhbWUtYXR0ci1zdHlsZT1cImJvcmRlcjogMXB4IHNvbGlkIHJlZFwiIC8+XG4gICAqIDx0YWJsZWF1LXB1bHNlIGlkPVwidGFibGVhdVB1bHNlXCIgaWZyYW1lLWF0dHItc3R5bGU9XCJib3JkZXI6IDFweCBzb2xpZCByZWRcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIGlmcmFtZUF0dHJpYnV0ZVN0eWxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgb2YgdGhlICdjbGFzcycgYXR0cmlidXRlIG9mIHRoZSBlbWJlZGRlZCBpZnJhbWUgcHJvdmlkaW5nIGFjY2VzcyB0byBhbnlcbiAgICogY3VzdG9tIHNlbGVjdG9ycyBkZWZpbmVkIGluIHRoZSBgPGlmcmFtZS1zdHlsZT5gIGNoaWxkIHRhZy5cbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBpZnJhbWUtYXR0ci1jbGFzcz1cInJlZC1ib3JkZXJcIj5cbiAgICogICA8aWZyYW1lLXN0eWxlPlxuICAgKiAgICAgLnJlZC1ib3JkZXIge1xuICAgKiAgICAgICBib3JkZXI6IDFweCBzb2xpZCByZWQ7XG4gICAqICAgICB9XG4gICAqICAgPC9pZnJhbWUtc3R5bGU+XG4gICAqIDwvdGFibGVhdS12aXo+XG4gICAqIGBgYFxuICAgKi9cbiAgaWZyYW1lQXR0cmlidXRlQ2xhc3M/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIG5hbWVzIG9mIHRoZSBjb21tb24gc3RyaW5nIGNvbnN0YW50cyB5b3UgY2FuIHVzZSBhcyBIVE1MIGF0dHJpYnV0ZXMgZm9yIHRoZSB0YWJsZWF1IHdlYiBjb21wb25lbnQuXG4gKiBAaWdub3JlXG4gKi9cbmV4cG9ydCBlbnVtIFdlYkNvbXBvbmVudEF0dHJpYnV0ZXMge1xuICBTcmMgPSAnc3JjJyxcbiAgV2lkdGggPSAnd2lkdGgnLFxuICBIZWlnaHQgPSAnaGVpZ2h0JyxcbiAgVG9rZW4gPSAndG9rZW4nLFxuICBEZWJ1ZyA9ICdkZWJ1ZycsXG4gIElmcmFtZUF1dGggPSAnaWZyYW1lLWF1dGgnLFxuICBPblZpekxvYWRFcnJvciA9ICdvbnZpemxvYWRlcnJvcicsXG4gIEZvcmNlVG9rZW5TeW5jID0gJ2ZvcmNlLXRva2VuLXN5bmMnLFxufVxuXG4vKipcbiAqIFRoZSBuYW1lcyBvZiB0aGUgZW1iZWRkZWQgaWZyYW1lIGF0dHJpYnV0ZXMgd2hvc2UgdmFsdWVzIGNhbiBiZSBjb250cm9sbGVkLlxuICogQGlnbm9yZVxuICovXG5leHBvcnQgZW51bSBFbWJlZGRlZElmcmFtZUF0dHJpYnV0ZXMge1xuICBMb2FkaW5nID0gJ2lmcmFtZS1hdHRyLWxvYWRpbmcnLFxuICBTdHlsZSA9ICdpZnJhbWUtYXR0ci1zdHlsZScsXG4gIENsYXNzID0gJ2lmcmFtZS1hdHRyLWNsYXNzJyxcbn1cblxuLyoqXG4gKiBUaGUgbmFtZXMgb2YgdGhlIHN0cmluZyBjb25zdGFudHMgeW91IGNhbiB1c2UgYXMgY2hpbGQgdGFncyBmb3IgVGFibGVhdVZpeiwgVGFibGVhdUF1dGhvcmluZ1ZpeiBhbmQgVGFibGVhdUFza0RhdGEgY3VzdG9tIGVsZW1lbnRzLlxuICogQGlnbm9yZVxuICovXG5leHBvcnQgZW51bSBXZWJDb21wb25lbnRDaGlsZEVsZW1lbnRzIHtcbiAgLyoqXG4gICAqIENvbnRhaW5zIGEgbGlzdCBvZiBjdXN0b20gcGFyYW1ldGVycy4gIEF2YWlsYWJsZSBpbiB2aXogdmlld2luZywgdml6IGF1dGhvcmluZyBhbmQgYXNrZGF0YS5cbiAgICovXG4gIEN1c3RvbVBhcmFtZXRlciA9ICdjdXN0b20tcGFyYW1ldGVyJyxcblxuICAvKipcbiAgICogQ3VzdG9tIHN0eWxlcyBhcHBsaWNhYmxlIHRvIHRoZSBlbWJlZGRlZCBpZnJhbWUgZWxlbWVudCBpdHNlbGYgKG5vdCBpbnNpZGUgaXQpLlxuICAgKi9cbiAgSWZyYW1lU3R5bGUgPSAnaWZyYW1lLXN0eWxlJyxcbn1cblxuZXhwb3J0IGVudW0gV2ViQ29tcG9uZW50Q2hpbGRFbGVtZW50QXR0cmlidXRlcyB7XG4gIEZpZWxkID0gJ2ZpZWxkJyxcbiAgVmFsdWUgPSAndmFsdWUnLFxuICBOYW1lID0gJ25hbWUnLFxufVxuIiwiLy8gQWxsIGVudW0gdmFsdWVzIG1hZGUgYXZhaWxhYmxlIHRvIEV4dGVuc2lvbnMgZGV2ZWxvcGVycy5cbi8vIEVudW1zIHNob3VsZCBiZSBrZXB0IGluIGFscGhhYmV0aWNhbCBvcmRlci5cblxuaW1wb3J0IHsgRXh0ZW5zaW9ucyB9IGZyb20gJy4vRXh0ZW5zaW9ucyc7XG5cbm5hbWVzcGFjZSBUYWJsZWF1IHtcbiAgZXhwb3J0IGxldCBleHRlbnNpb25zOiBFeHRlbnNpb25zO1xuICAvKipcbiAgICogQWxsIGVycm9yIGNvZGVzIHVzZWQgYnkgdGhlIEV4dGVuc2lvbnMgQVBJLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gRXJyb3JDb2RlcyB7XG4gICAgLyoqXG4gICAgICogVGhyb3duIHdoZW4gY2FsbGVyIGF0dGVtcHRzIHRvIGV4ZWN1dGUgY29tbWFuZCBiZWZvcmUgaW5pdGlhbGl6YXRpb24gaGFzIGNvbXBsZXRlZC5cbiAgICAgKi9cbiAgICBBUElOb3RJbml0aWFsaXplZCA9ICdhcGktbm90LWluaXRpYWxpemVkJyxcbiAgICAvKipcbiAgICAgKiBUaHJvd24gd2hlbiBjYWxsZXIgYXR0ZW1wdHMgdG8gZXhlY3V0ZSBjb21tYW5kIHdoaWxlIGV4dGVuc2lvbiBpcyBub3QgdmlzaWJsZS5cbiAgICAgKi9cbiAgICBWaXNpYmlsaXR5RXJyb3IgPSAndmlzaWJpbGl0eS1lcnJvcicsXG4gICAgLyoqXG4gICAgICogT25seSBvbmUgZGlhbG9nIGNhbiBiZSBvcGVuZWQgYXQgdGltZSB3aXRoIHRoZSBVSSBuYW1lc3BhY2UgZnVuY3Rpb25hbGl0eS5cbiAgICAgKi9cbiAgICBEaWFsb2dBbHJlYWR5T3BlbiA9ICdkaWFsb2ctYWxyZWFkeS1vcGVuJyxcbiAgICAvKipcbiAgICAgKiBUaGUgb3BlbiBkaWFsb2cgd2FzIGNsb3NlZCBieSB0aGUgdXNlci5cbiAgICAgKi9cbiAgICBEaWFsb2dDbG9zZWRCeVVzZXIgPSAnZGlhbG9nLWNsb3NlZC1ieS11c2VyJyxcbiAgICAvKipcbiAgICAgKiBBbiBlcnJvciBvY2N1cnJlZCB3aXRoaW4gdGhlIFRhYmxlYXUgRXh0ZW5zaW9ucyBBUEkuIENvbnRhY3QgVGFibGVhdSBTdXBwb3J0LlxuICAgICAqL1xuICAgIEludGVybmFsRXJyb3IgPSAnaW50ZXJuYWwtZXJyb3InLFxuICAgIC8qKlxuICAgICAqIEEgZGlhbG9nIG11c3Qgc3RhcnQgb24gdGhlIHNhbWUgZG9tYWluIGFzIHRoZSBwYXJlbnQgZXh0ZW5pb24uXG4gICAgICovXG4gICAgSW52YWxpZERvbWFpbkRpYWxvZyA9ICdpbnZhbGlkLWRpYWxvZy1kb21haW4nLFxuICAgIC8qKlxuICAgICAqIEEgcGFyYW1ldGVyIGlzIG5vdCB0aGUgY29ycmVjdCBkYXRhIHR5cGUgb3IgZm9ybWF0LiBUaGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCBpbiB0aGUgRXJyb3IubWVzc2FnZSBmaWVsZC5cbiAgICAgKi9cbiAgICBJbnZhbGlkUGFyYW1ldGVyID0gJ2ludmFsaWQtcGFyYW1ldGVyJyxcbiAgICAvKipcbiAgICAgKiBDYW4gb2NjdXIgaWYgdGhlIGV4dGVuc2lvbiBpbnRlcmFjdHMgd2l0aCBhIGZpbHRlciB0aGF0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgd29ya3NoZWV0LlxuICAgICAqL1xuICAgIE1pc3NpbmdGaWx0ZXIgPSAnbWlzc2luZy1maWx0ZXInLFxuICAgIC8qKlxuICAgICAqIENhbiBvY2N1ciBpZiB0aGUgZXh0ZW5zaW9uIGludGVyYWN0cyB3aXRoIGEgcGFyYW1ldGVyIHRoYXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSB3b3Jrc2hlZXQuXG4gICAgICovXG4gICAgTWlzc2luZ1BhcmFtZXRlciA9ICdtaXNzaW5nLXBhcmFtZXRlcicsXG4gICAgLyoqXG4gICAgICogSW50ZXJuYWwgU2VydmVyIEVycm9yXG4gICAgICovXG4gICAgU2VydmVyRXJyb3IgPSAnc2VydmVyLWVycm9yJyxcbiAgICAvKipcbiAgICAgKiBEZXZlbG9wZXIgY2Fubm90IHNhdmUgc2V0dGluZ3Mgd2hpbGUgYW5vdGhlciBzYXZlIGlzIHN0aWxsIGluIHByb2dyZXNzLlxuICAgICAqL1xuICAgIFNldHRpbmdTYXZlSW5Qcm9ncmVzcyA9ICdzZXR0aW5nLXNhdmUtaW4tcHJvZ3Jlc3MnLFxuICAgIC8qKlxuICAgICAqIEFuIHVua25vd24gZXZlbnQgbmFtZSB3YXMgc3BlY2lmaWVkIGluIHRoZSBjYWxsIHRvIGBhZGRFdmVudExpc3RlbmVyYCBvciBgcmVtb3ZlRXZlbnRMaXN0ZW5lcmAuXG4gICAgICovXG4gICAgVW5zdXBwb3J0ZWRFdmVudE5hbWUgPSAndW5zdXBwb3J0ZWQtZXZlbnQtbmFtZScsXG4gICAgLyoqXG4gICAgICogQSBtZXRob2Qgd2FzIHVzZWQgZm9yIGEgdHlwZSBvZiBkYXRhIHNvdXJjZSB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCB0aGF0IG1ldGhvZCAoc2VlIGdldEFjdGl2ZVRhYmxlc0FzeW5jIGZvciBhbiBleGFtcGxlKVxuICAgICAqL1xuICAgIFVuc3VwcG9ydGVkTWV0aG9kRm9yRGF0YVNvdXJjZVR5cGUgPSAndW5zdXBwb3J0ZWQtbWV0aG9kLWZvci1kYXRhLXNvdXJjZS10eXBlJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgRXh0ZW5zaW9ucyBpcyBjdXJyZW50bHkgcnVubmluZy5cbiAgICovXG4gIGV4cG9ydCBlbnVtIEV4dGVuc2lvbkNvbnRleHQge1xuICAgIERlc2t0b3AgPSAnZGVza3RvcCcsXG4gICAgU2VydmVyID0gJ3NlcnZlcicsXG4gICAgQ2xvdWQgPSAnY2xvdWQnLFxuICAgIFB1YmxpY1dlYiA9ICdwdWJsaWMtd2ViJyxcbiAgICBQdWJsaWNEZXNrdG9wID0gJ3B1YmxpYy1kZXNrdG9wJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbW9kZSBpbiB3aGljaCB0aGUgRXh0ZW5zaW9ucyBpcyBjdXJyZW50bHkgcnVubmluZy5cbiAgICovXG4gIGV4cG9ydCBlbnVtIEV4dGVuc2lvbk1vZGUge1xuICAgIEF1dGhvcmluZyA9ICdhdXRob3JpbmcnLFxuICAgIFZpZXdpbmcgPSAndmlld2luZycsXG4gIH1cblxuICAvKipcbiAgICogUmVwcmVzZW50cyB0aGUgdHlwZSBvZiBldmVudCB0aGF0IGNhbiBiZSBsaXN0ZW5lZCBmb3IuXG4gICAqL1xuICBleHBvcnQgZW51bSBUYWJsZWF1RXZlbnRUeXBlIHtcbiAgICAvKipcbiAgICAgKiBAZXhwZXJpbWVudGFsXG4gICAgICogUmFpc2VkIHdoZW4gYSBtZXNzYWdlIGlzIHJlY2VpdmVkIHRoYXQgd2FzIHNlbnQgYnkgYSBkaWFsb2cgb3IgZXh0ZW5zaW9uIHZpYSBgc2VuZERpYWxvZ01lc3NhZ2VBc3luY2AuKi9cbiAgICBEaWFsb2dNZXNzYWdlUmVjZWl2ZWQgPSAnZGlhbG9nLW1lc3NhZ2UtcmVjZWl2ZWQnLFxuXG4gICAgLyoqIFJhaXNlZCB3aGVuIGFueSBmaWx0ZXIgaGFzIGNoYW5nZWQgc3RhdGUuIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFtXb3Jrc2hlZXRdKC4uL2ludGVyZmFjZXMvd29ya3NoZWV0Lmh0bWwpIG9iamVjdHMuKi9cbiAgICBGaWx0ZXJDaGFuZ2VkID0gJ2ZpbHRlci1jaGFuZ2VkJyxcblxuICAgIC8qKiBUaGUgc2VsZWN0ZWQgbWFya3Mgb24gYSB2aXN1YWxpemF0aW9uIGhhcyBjaGFuZ2VkLlxuICAgICAqIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFtXb3Jrc2hlZXRdKC4uL2ludGVyZmFjZXMvd29ya3NoZWV0Lmh0bWwpIG9iamVjdHMuICovXG4gICAgTWFya1NlbGVjdGlvbkNoYW5nZWQgPSAnbWFyay1zZWxlY3Rpb24tY2hhbmdlZCcsXG5cbiAgICAvKiogVGhlIHN1bW1hcnkgZGF0YSBiYWNraW5nIGEgd29ya3NoZWV0IGhhcyBjaGFuZ2VkXG4gICAgICogWW91IGNhbiB1c2UgdGhpcyBldmVudCB0eXBlIHdpdGggW1dvcmtzaGVldF0oLi4vaW50ZXJmYWNlcy93b3Jrc2hlZXQuaHRtbCkgb2JqZWN0cy4qL1xuICAgIFN1bW1hcnlEYXRhQ2hhbmdlZCA9ICdzdW1tYXJ5LWRhdGEtY2hhbmdlZCcsXG5cbiAgICAvKiogQSBwYXJhbWV0ZXIgaGFzIGhhZCBpdHMgdmFsdWUgbW9kaWZpZWQuIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFtbUGFyYW1ldGVyXV0gb2JqZWN0cy4gKi9cbiAgICBQYXJhbWV0ZXJDaGFuZ2VkID0gJ3BhcmFtZXRlci1jaGFuZ2VkJyxcblxuICAgIC8qKiBTZXR0aW5ncyBoYXZlIGJlZW4gY2hhbmdlZCBmb3IgdGhpcyBleHRlbnNpb24uIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFtbU2V0dGluZ3NdXSBvYmplY3RzLiAqL1xuICAgIFNldHRpbmdzQ2hhbmdlZCA9ICdzZXR0aW5ncy1jaGFuZ2VkJyxcblxuICAgIC8qKiBUaGUgZGFzaGJvYXJkIGxheW91dCBoYXMgY2hhbmdlZFxuICAgICAqIEBjYXRlZ29yeSBEYXNoYm9hcmQgRXh0ZW5zaW9uc1xuICAgICAqL1xuICAgIERhc2hib2FyZExheW91dENoYW5nZWQgPSAnZGFzaGJvYXJkLWxheW91dC1jaGFuZ2VkJyxcblxuICAgIC8qKiBUaGUgd29ya2Jvb2sgZm9ybWF0dGluZyBoYXMgY2hhbmdlZFxuICAgICAqIEBjYXRlZ29yeSBEYXNoYm9hcmQgRXh0ZW5zaW9uc1xuICAgICAqL1xuICAgIFdvcmtib29rRm9ybWF0dGluZ0NoYW5nZWQgPSAnd29ya2Jvb2stZm9ybWF0dGluZy1jaGFuZ2VkJyxcblxuICAgIC8qKiBUaGUgd29ya3NoZWV0IGZvcm1hdHRpbmcgaGFzIGNoYW5nZWRcbiAgICAgKiBAY2F0ZWdvcnkgVml6IEV4dGVuc2lvbnNcbiAgICAgKi9cbiAgICBXb3Jrc2hlZXRGb3JtYXR0aW5nQ2hhbmdlZCA9ICd3b3Jrc2hlZXQtZm9ybWF0dGluZy1jaGFuZ2VkJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnVtIHRoYXQgcmVwcmVzZW50cyB0aGUgZGF0YSB0eXBlIG9mIGVuY29kaW5ncyBmb3IgY3JlYXRlVml6SW1hZ2VBc3luYy5cbiAgICogQHNpbmNlIDEuNi4wXG4gICAqL1xuICBleHBvcnQgZW51bSBWaXpJbWFnZUVuY29kaW5nVHlwZSB7XG4gICAgRGlzY3JldGUgPSAnZGlzY3JldGUnLFxuICAgIENvbnRpbnVvdXMgPSAnY29udGludW91cycsXG4gIH1cblxuICAvKipcbiAgICogRW51bSB0aGF0IHJlcHJlc2VudHMgdGhlIHNvcnQgZGlyZWN0aW9uIGZvciBjcmVhdGVWaXpJbWFnZUFzeW5jLlxuICAgKiBAc2luY2UgMS44LjAgYW5kIFRhYmxlYXUgMjAyMS40XG4gICAqL1xuICBleHBvcnQgZW51bSBWaXpJbWFnZVNvcnREaXJlY3Rpb25UeXBlIHtcbiAgICBBc2NlbmRpbmcgPSAnYXNjZW5kaW5nJyxcbiAgICBEZXNjZW5kaW5nID0gJ2Rlc2NlbmRpbmcnLFxuICB9XG5cbiAgLyoqXG4gICAqIEVudW0gdGhhdCByZXByZXNlbnRzIHRoZSBwYWxldHRlIHR5cGUgZm9yIGNyZWF0ZVZpekltYWdlQXN5bmMuXG4gICAqIEBzaW5jZSAxLjguMCBhbmQgVGFibGVhdSAyMDIxLjRcbiAgICovXG4gIGV4cG9ydCBlbnVtIFZpekltYWdlUGFsZXR0ZVR5cGUge1xuICAgIEN1c3RvbURpdmVyZ2luZyA9ICdjdXN0b20tZGl2ZXJnaW5nJyxcbiAgICBDdXN0b21TZXF1ZW50aWFsID0gJ2N1c3RvbS1zZXF1ZW50aWFsJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnVtIHRoYXQgcmVwcmVzZW50cyB0aGUgU2l6ZSBTZXR0aW5nIHR5cGUgZm9yIGNyZWF0ZVZpekltYWdlQXN5bmMuXG4gICAqIEBzaW5jZSAxLjguMCBhbmQgVGFibGVhdSAyMDIxLjRcbiAgICovXG4gIGV4cG9ydCBlbnVtIFZpekltYWdlU2l6ZVNldHRpbmdUeXBlIHtcbiAgICBGaXhlZCA9ICdmaXhlZCcsXG4gICAgTWFudWFsID0gJ21hbnVhbCcsXG4gIH1cblxuICAvKipcbiAgICogRW51bSB0aGF0IHJlcHJlc2VudHMgdGhlIFNpemUgU2V0dGluZyBhbGlnbm1lbnQgdHlwZSBmb3IgY3JlYXRlVml6SW1hZ2VBc3luYy5cbiAgICogQHNpbmNlIDEuOC4wIGFuZCBUYWJsZWF1IDIwMjEuNFxuICAgKi9cbiAgZXhwb3J0IGVudW0gVml6SW1hZ2VTaXplU2V0dGluZ0FsaWdubWVudFR5cGUge1xuICAgIFJpZ2h0ID0gJ3JpZ2h0JyxcbiAgICBMZWZ0ID0gJ2xlZnQnLFxuICAgIENlbnRlciA9ICdjZW50ZXInLFxuICB9XG59XG5leHBvcnQgPSBUYWJsZWF1O1xuIiwiZXhwb3J0IGVudW0gU2hhcmVkRXJyb3JDb2RlcyB7XG4gIC8qKlxuICAgKiBBIENTViBvciBFeGNlbCBmaWxlIGZhaWxlZCB0byBiZSBjcmVhdGVkIGluIFZpei5leHBvcnRDcm9zc3RhYkFzeW5jKCkuXG4gICAqL1xuICBDcm9zc3RhYkNyZWF0aW9uRXJyb3IgPSAnY3Jvc3N0YWItY3JlYXRpb24tZXJyb3InLFxuICAvKipcbiAgICogQSBDU1YgZmlsZSBmYWlsZWQgdG8gYmUgY3JlYXRlZCBpbiBWaXouZXhwb3J0RGF0YUFzeW5jKCkuXG4gICAqL1xuICBEYXRhQ3JlYXRpb25FcnJvciA9ICdkYXRhLWNyZWF0aW9uLWVycm9yJyxcbiAgLyoqXG4gICAqIEFuIGludmFsaWQgYWdncmVnYXRpb24gd2FzIHNwZWNpZmllZCBmb3IgdGhlIGZpbHRlciwgc3VjaCBhcyBzZXR0aW5nIGEgcmFuZ2UgZmlsdGVyIHRvIFwiU1VNKFNhbGVzKVwiIGluc3RlYWQgb2ZcbiAgICogXCJTYWxlc1wiLlxuICAgKi9cbiAgSW52YWxpZEFnZ3JlZ2F0aW9uRmllbGROYW1lID0gJ2ludmFsaWQtYWdncmVnYXRpb24tZmllbGQtbmFtZScsXG4gIC8qKlxuICAgKiBBIGZpbHRlciBvcGVyYXRpb24gd2FzIGF0dGVtcHRlZCBvbiBhIGZpZWxkIHRoYXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGRhdGEgc291cmNlLlxuICAgKi9cbiAgSW52YWxpZEZpbHRlckZpZWxkTmFtZSA9ICdpbnZhbGlkLWZpbHRlci1uYW1lJyxcbiAgLyoqXG4gICAqIEEgZmlsdGVyIG9wZXJhdGlvbiB3YXMgYXR0ZW1wdGVkIHVzaW5nIGEgdmFsdWUgdGhhdCBpcyB0aGUgd3JvbmcgZGF0YSB0eXBlIG9yIGZvcm1hdC5cbiAgICovXG4gIEludmFsaWRGaWx0ZXJGaWVsZFZhbHVlID0gJ2ludmFsaWQtZmlsdGVyLWZpZWxkVmFsdWUnLFxuICAvKipcbiAgICogQW4gaW52YWxpZCBkYXRlIHZhbHVlIHdhcyBzcGVjaWZpZWQgaW4gYSBTaGVldC5zZWxlY3RNYXJrc0FzeW5jKCkgY2FsbCBmb3IgYSBkYXRlIGZpZWxkLlxuICAgKi9cbiAgSW52YWxpZFNlbGVjdGlvbkRhdGUgPSAnaW52YWxpZC1zZWxlY3Rpb24tZGF0ZScsXG4gIC8qKlxuICAgKiBBIGZpZWxkIHdhcyBzcGVjaWZpZWQgaW4gYSBTaGVldC5zZWxlY3RNYXJrc0FzeW5jKCkgY2FsbCB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBkYXRhIHNvdXJjZS5cbiAgICovXG4gIEludmFsaWRTZWxlY3Rpb25GaWVsZE5hbWUgPSAnaW52YWxpZC1zZWxlY3Rpb24tZmllbGROYW1lJyxcbiAgLyoqXG4gICAqIEFuIGludmFsaWQgdmFsdWUgd2FzIHNwZWNpZmllZCBpbiBhIFNoZWV0LnNlbGVjdE1hcmtzQXN5bmMoKSBjYWxsLlxuICAgKi9cbiAgSW52YWxpZFNlbGVjdGlvblZhbHVlID0gJ2ludmFsaWQtc2VsZWN0aW9uLXZhbHVlJyxcbiAgLyoqXG4gICAqIEEgcGFyYW1ldGVyIGRpZCBub3QgaW5jbHVkZSBhIHZhbGlkIHNoZWV0IHNlbGVjdGlvbiBmb3IgZXhwb3J0aW5nLlxuICAgKi9cbiAgSW52YWxpZFNlbGVjdGlvblNoZWV0ID0gJ2ludmFsaWQtc2VsZWN0aW9uLXNoZWV0JyxcbiAgLyoqXG4gICAqIEFuIGVycm9yIG9jY3VycmVkIHdpdGhpbiB0aGUgVGFibGVhdSBBUEkuIENvbnRhY3QgVGFibGVhdSBTdXBwb3J0LlxuICAgKi9cbiAgSW50ZXJuYWxFcnJvciA9ICdpbnRlcm5hbC1lcnJvcicsXG4gIC8qKlxuICAgKiBBIHBhcmFtZXRlciBpcyBub3QgdGhlIGNvcnJlY3QgZGF0YSB0eXBlIG9yIGZvcm1hdC4gVGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciBpcyBzcGVjaWZpZWQgaW4gdGhlIEVycm9yLm1lc3NhZ2UgZmllbGQuXG4gICAqL1xuICBJbnZhbGlkUGFyYW1ldGVyID0gJ2ludmFsaWQtcGFyYW1ldGVyJyxcbiAgLyoqXG4gICAqIEEgUERGIGZpbGUgZmFpbGVkIHRvIGJlIGNyZWF0ZWQgaW4gVml6LmV4cG9ydFBERkFzeW5jKCkuXG4gICAqL1xuICBQREZDcmVhdGlvbkVycm9yID0gJ3BkZi1jcmVhdGlvbi1lcnJvcicsXG4gIC8qKlxuICAgKiBBIFBvd2VyUG9pbnQgZmlsZSBmYWlsZWQgdG8gYmUgY3JlYXRlZCBpbiBWaXouZXhwb3J0UG93ZXJQb2ludEFzeW5jKCkuXG4gICAqL1xuICBQb3dlclBvaW50Q3JlYXRpb25FcnJvciA9ICdwb3dlcnBvaW50LWNyZWF0aW9uLWVycm9yJyxcbiAgLyoqXG4gICAqIEFuIG9wZXJhdGlvbiB3YXMgYXR0ZW1wdGVkIG9uIGEgc2hlZXQgdGhhdCBpcyBub3QgYWN0aXZlIG9yIGVtYmVkZGVkIHdpdGhpbiB0aGUgYWN0aXZlIGRhc2hib2FyZC5cbiAgICovXG4gIE5vdEFjdGl2ZVNoZWV0ID0gJ25vdC1hY3RpdmUtc2hlZXQnLFxuICAvKipcbiAgICogUHJvcGVydHkgb3IgRnVuY3Rpb24gaXMgbm90IHN1cHBvcnRlZCB3aXRoaW4gdGhlIFRhYmxlYXUgQVBJLlxuICAgKi9cbiAgSW1wbGVtZW50YXRpb25FcnJvciA9ICd3cm9uZy1pbXBsZW1lbnRhdGlvbicsXG4gIC8qKlxuICAgKiBDYW4gb2NjdXIgd2hlbiB0d28gaW5jb21wYXRpYmxlIGNhbGxzIGFyZSB0cmlnZ2VyZWQgdG9nZXRoZXIuXG4gICAqL1xuICBBcGlFeGVjdXRpb25FcnJvciA9ICdhcGktZXhlY3V0aW9uLWVycm9yJyxcbiAgLyoqXG4gICAqIEEgZ2VuZXJhbC1wdXJwb3NlIHNlcnZlciBlcnJvciBvY2N1cnJlZC4gRGV0YWlscyBhcmUgY29udGFpbmVkIGluIHRoZSBFcnJvciBvYmplY3QuXG4gICAqL1xuICBTZXJ2ZXJFcnJvciA9ICdzZXJ2ZXItZXJyb3InLFxuICAvKipcbiAgICogQ2FuIG9jY3VyIHdoZW4gYW4gYXBpIGNhbGwgdGltZXMgb3V0LlxuICAgKi9cbiAgVGltZW91dCA9ICd0aW1lb3V0Jyxcbn1cbiIsIi8qKlxuICogVGhlIHRhYmxlYXUgbmFtZXNwYWNlIGV4aXN0cyBmb3Igb3JnYW5pemF0aW9uIGFuZCB0byBhdm9pZCBwb2xsdXRpbmdcbiAqIHRoZSBnbG9iYWwgbmFtZXNwYWNlLiBJdCBjb250YWlucyBubyBjb25zdHJ1Y3RzIG90aGVyIHRoYW4gc3ViLW5hbWVzcGFjZXMgYW5kIHRoZSBUYWJsZWF1IGVudW1lcmF0aW9ucy5cbiAqL1xubmFtZXNwYWNlIFRhYmxlYXUge1xuICBleHBvcnQgZW51bSBBbmFseXRpY3NPYmplY3RUeXBlIHtcbiAgICBDbHVzdGVyID0gJ2NsdXN0ZXInLFxuICAgIEZvcmVjYXN0ID0gJ2ZvcmVjYXN0JyxcbiAgICBUcmVuZExpbmUgPSAndHJlbmQtbGluZScsXG4gIH1cblxuICBleHBvcnQgZW51bSBBbm5vdGF0aW9uVHlwZSB7XG4gICAgTWFyayA9ICdtYXJrJyxcbiAgICBQb2ludCA9ICdwb2ludCcsXG4gICAgQXJlYSA9ICdhcmVhJyxcbiAgfVxuXG4gIGV4cG9ydCBlbnVtIENvbHVtblR5cGUge1xuICAgIERpc2NyZXRlID0gJ2Rpc2NyZXRlJyxcbiAgICBDb250aW51b3VzID0gJ2NvbnRpbnVvdXMnLFxuICAgIFVua25vd24gPSAndW5rbm93bicsXG4gIH1cblxuICBleHBvcnQgZW51bSBDbGFzc05hbWVLZXkge1xuICAgIFdvcmtzaGVldFRpdGxlID0gJ3RhYmxlYXUtd29ya3NoZWV0LXRpdGxlJyxcbiAgICBXb3Jrc2hlZXQgPSAndGFibGVhdS13b3Jrc2hlZXQnLFxuICAgIFRvb2x0aXAgPSAndGFibGVhdS10b29sdGlwJyxcbiAgICBTdG9yeVRpdGxlID0gJ3RhYmxlYXUtc3RvcnktdGl0bGUnLFxuICAgIERhc2hib2FyZFRpdGxlID0gJ3RhYmxlYXUtZGFzaGJvYXJkLXRpdGxlJyxcbiAgICBQYW5lID0gJ3RhYmxlYXUtcGFuZScsXG4gICAgUm93RGl2aWRlcnMgPSAndGFibGVhdS1yb3ctZGl2aWRlcnMnLFxuICAgIENvbHVtbkRpdmlkZXJzID0gJ3RhYmxlYXUtY29sdW1uLWRpdmlkZXJzJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGF0IHRoZSBvYmplY3QgcmVwcmVzZW50cyBpbiBhIGRhc2hib2FyZC5cbiAgICovXG4gIGV4cG9ydCBlbnVtIERhc2hib2FyZE9iamVjdFR5cGUge1xuICAgIEJsYW5rID0gJ2JsYW5rJyxcbiAgICBXb3Jrc2hlZXQgPSAnd29ya3NoZWV0JyxcbiAgICBRdWlja0ZpbHRlciA9ICdxdWljay1maWx0ZXInLFxuICAgIFBhcmFtZXRlckNvbnRyb2wgPSAncGFyYW1ldGVyLWNvbnRyb2wnLFxuICAgIFBhZ2VGaWx0ZXIgPSAncGFnZS1maWx0ZXInLFxuICAgIExlZ2VuZCA9ICdsZWdlbmQnLFxuICAgIFRpdGxlID0gJ3RpdGxlJyxcbiAgICBUZXh0ID0gJ3RleHQnLFxuICAgIEltYWdlID0gJ2ltYWdlJyxcbiAgICBXZWJQYWdlID0gJ3dlYi1wYWdlJyxcbiAgICBFeHRlbnNpb24gPSAnZXh0ZW5zaW9uJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnVtIHRoYXQgcmVwcmVzZW50cyB0aGUgdmlzaWJpbGl0eSBzdGF0ZSBvZiBhIGRhc2hib2FyZCBvYmplY3QuXG4gICAqIEBzaW5jZSAxLjcuMFxuICAgKi9cbiAgZXhwb3J0IGVudW0gRGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eVR5cGUge1xuICAgIC8qKiBVc2VkIGZvciB0dXJuaW5nIG9uIHRoZSB2aXNpYmlsaXR5IG9mIGEgZGFzaGJvYXJkIG9iamVjdC4qL1xuICAgIFNob3cgPSAnc2hvdycsXG5cbiAgICAvKiogVXNlZCBmb3IgdHVybmluZyBvZmYgdGhlIHZpc2liaWxpdHkgb2YgYSBkYXNoYm9hcmQgb2JqZWN0LiovXG4gICAgSGlkZSA9ICdoaWRlJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZGlmZmVyZW50IHR5cGVzIG9mIGRhdGEgYSB2YWx1ZSBjYW4gaGF2ZVxuICAgKi9cbiAgZXhwb3J0IGVudW0gRGF0YVR5cGUge1xuICAgIFN0cmluZyA9ICdzdHJpbmcnLFxuICAgIEludCA9ICdpbnQnLFxuICAgIEZsb2F0ID0gJ2Zsb2F0JyxcbiAgICBCb29sID0gJ2Jvb2wnLFxuICAgIERhdGUgPSAnZGF0ZScsXG4gICAgRGF0ZVRpbWUgPSAnZGF0ZS10aW1lJyxcbiAgICBTcGF0aWFsID0gJ3NwYXRpYWwnLFxuICAgIFVua25vd24gPSAndW5rbm93bicsXG4gIH1cblxuICAvKipcbiAgICogRW51bSB0aGF0IHJlcHJlc2VudHMgdGhlIGNoYW5nZXMgdGhhdCBvY2N1ciB0byBhIGRhc2hib2FyZCBvYmplY3QuXG4gICAqL1xuICBleHBvcnQgZW51bSBEYXNoYm9hcmRMYXlvdXRDaGFuZ2Uge1xuICAgIC8qKiBBIGRhc2hib2FyZCBvYmplY3Qgd2FzIGFkZGVkICovXG4gICAgQWRkZWQgPSAnYWRkZWQnLFxuXG4gICAgLyoqIEEgZGFzaGJvYXJkIG9iamVjdCB3YXMgcmVtb3ZlZCAqL1xuICAgIFJlbW92ZWQgPSAncmVtb3ZlZCcsXG5cbiAgICAvKiogQSBkYXNoYm9hcmQgb2JqZWN0J3MgZmxvYXRpbmcgc3RhdGUgY2hhbmdlZCAqL1xuICAgIElzRmxvYXRpbmdDaGFuZ2VkID0gJ2lzLWZsb2F0aW5nLWNoYW5nZWQnLFxuXG4gICAgLyoqIEEgZGFzaGJvYXJkIG9iamVjdCdzIHZpc2liaWxpdHkgY2hhbmdlZCAqL1xuICAgIElzVmlzaWJsZUNoYW5nZWQgPSAnaXMtdmlzaWJsZS1jaGFuZ2VkJyxcblxuICAgIC8qKiBBIGRhc2hib2FyZCBvYmplY3QncyBwb3NpdGlvbiBjaGFuZ2VkICovXG4gICAgUG9zaXRpb25DaGFuZ2VkID0gJ3Bvc2l0aW9uLWNoYW5nZWQnLFxuXG4gICAgLyoqIEEgZGFzaGJvYXJkIG9iamVjdCdzIHNpemUgY2hhbmdlZCAqL1xuICAgIFNpemVDaGFuZ2VkID0gJ3NpemUtY2hhbmdlZCcsXG5cbiAgICAvKiogQSBkYXNoYm9hcmQgb2JqZWN0IHdhcyByZW5hbWVkICovXG4gICAgTmFtZUNoYW5nZWQgPSAnbmFtZS1jaGFuZ2VkJyxcblxuICAgIC8qKiBBIGRhc2hib2FyZCBvYmplY3QgaXMgc2VsZWN0ZWQgKi9cbiAgICBTZWxlY3RlZCA9ICdzZWxlY3RlZCcsXG5cbiAgICAvKiogQSBkYXNoYm9hcmQgb2JqZWN0IGlzIGRlc2VsZWN0ZWQgKi9cbiAgICBEZXNlbGVjdGVkID0gJ2Rlc2VsZWN0ZWQnLFxuXG4gICAgLyoqIE5hdmlnYXRlIHRvIGFub3RoZXIgZGFzaGJvYXJkICovXG4gICAgRGFzaGJvYXJkQ2hhbmdlZCA9ICdkYXNoYm9hcmQtY2hhbmdlZCcsXG4gIH1cblxuICAvKipcbiAgICogVmFsaWQgZGF0ZSByYW5nZXMgZm9yIGEgcmVsYXRpdmUgZGF0ZSBmaWx0ZXIuXG4gICAqL1xuICBleHBvcnQgZW51bSBEYXRlUmFuZ2VUeXBlIHtcbiAgICBMYXN0ID0gJ2xhc3QnLFxuICAgIExhc3ROID0gJ2xhc3QtbicsXG4gICAgTmV4dCA9ICduZXh0JyxcbiAgICBOZXh0TiA9ICduZXh0LW4nLFxuICAgIEN1cnJlbnQgPSAnY3VycmVudCcsXG4gICAgVG9EYXRlID0gJ3RvLWRhdGUnLFxuICB9XG5cbiAgLyoqXG4gICAqIEVudW0gdGhhdCByZXByZXNlbnRzIHRoZSB0eXBlcyBvZiBkaWFsb2cgcG9wdXAgc3R5bGVzLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gRGlhbG9nU3R5bGUge1xuICAgIFdpbmRvdyA9ICd3aW5kb3cnLFxuICAgIE1vZGFsID0gJ21vZGFsJyxcbiAgICBNb2RlbGVzcyA9ICdtb2RlbGVzcycsXG4gIH1cblxuICBleHBvcnQgZW51bSBFbmNvZGluZ1R5cGUge1xuICAgIENvbHVtbiA9ICdjb2x1bW4nLFxuICAgIFJvdyA9ICdyb3cnLFxuICAgIFBhZ2UgPSAncGFnZScsXG4gICAgRmlsdGVyID0gJ2ZpbHRlcicsXG4gICAgTWFya3NUeXBlID0gJ21hcmtzLXR5cGUnLFxuICAgIE1lYXN1cmVWYWx1ZXMgPSAnbWVhc3VyZS12YWx1ZXMnLFxuICAgIENvbG9yID0gJ2NvbG9yJyxcbiAgICBTaXplID0gJ3NpemUnLFxuICAgIExhYmVsID0gJ2xhYmVsJyxcbiAgICBEZXRhaWwgPSAnZGV0YWlsJyxcbiAgICBUb29sdGlwID0gJ3Rvb2x0aXAnLFxuICAgIFNoYXBlID0gJ3NoYXBlJyxcbiAgICBQYXRoID0gJ3BhdGgnLFxuICAgIEFuZ2xlID0gJ2FuZ2xlJyxcbiAgICBHZW9tZXRyeSA9ICdnZW9tZXRyeScsXG4gICAgQ3VzdG9tID0gJ2N1c3RvbScsXG4gIH1cblxuICAvKipcbiAgICogIFR5cGUgb2YgYWdncmVnYXRpb24gb24gYSBmaWVsZC5cbiAgICovXG4gIGV4cG9ydCBlbnVtIEZpZWxkQWdncmVnYXRpb25UeXBlIHtcbiAgICBTdW0gPSAnc3VtJyxcbiAgICBBdmcgPSAnYXZnJyxcbiAgICBNaW4gPSAnbWluJyxcbiAgICBNYXggPSAnbWF4JyxcbiAgICBTdGRldiA9ICdzdGRldicsXG4gICAgU3RkZXZwID0gJ3N0ZGV2cCcsXG4gICAgVmFyID0gJ3ZhcicsXG4gICAgVmFycCA9ICd2YXJwJyxcbiAgICBDb2xsZWN0ID0gJ2NvbGxlY3QnLFxuICAgIENvdW50ID0gJ2NvdW50JyxcbiAgICBDb3VudGQgPSAnY291bnRkJyxcbiAgICBNZWRpYW4gPSAnbWVkaWFuJyxcbiAgICBBdHRyID0gJ2F0dHInLFxuICAgIE5vbmUgPSAnbm9uZScsXG4gICAgWWVhciA9ICd5ZWFyJyxcbiAgICBRdHIgPSAncXRyJyxcbiAgICBNb250aCA9ICdtb250aCcsXG4gICAgRGF5ID0gJ2RheScsXG4gICAgSG91ciA9ICdob3VyJyxcbiAgICBNaW51dGUgPSAnbWludXRlJyxcbiAgICBTZWNvbmQgPSAnc2Vjb25kJyxcbiAgICBXZWVrID0gJ3dlZWsnLFxuICAgIFdlZWtkYXkgPSAnd2Vla2RheScsXG4gICAgTW9udGhZZWFyID0gJ21vbnRoLXllYXInLFxuICAgIE1keSA9ICdtZHknLFxuICAgIEVuZCA9ICdlbmQnLFxuICAgIFRydW5jWWVhciA9ICd0cnVuYy15ZWFyJyxcbiAgICBUcnVuY1F0ciA9ICd0cnVuYy1xdHInLFxuICAgIFRydW5jTW9udGggPSAndHJ1bmMtbW9udGgnLFxuICAgIFRydW5jV2VlayA9ICd0cnVuYy13ZWVrJyxcbiAgICBUcnVuY0RheSA9ICd0cnVuYy1kYXknLFxuICAgIFRydW5jSG91ciA9ICd0cnVuYy1ob3VyJyxcbiAgICBUcnVuY01pbnV0ZSA9ICd0cnVuYy1taW51dGUnLFxuICAgIFRydW5jU2Vjb25kID0gJ3RydW5jLXNlY29uZCcsXG4gICAgUXVhcnQxID0gJ3F1YXJ0MScsXG4gICAgUXVhcnQzID0gJ3F1YXJ0MycsXG4gICAgU2tld25lc3MgPSAnc2tld25lc3MnLFxuICAgIEt1cnRvc2lzID0gJ2t1cnRvc2lzJyxcbiAgICBJbk91dCA9ICdpbi1vdXQnLFxuICAgIFVzZXIgPSAndXNlcicsXG4gIH1cblxuICAvKipcbiAgICogUm9sZSBvZiBhIGZpZWxkLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gRmllbGRSb2xlVHlwZSB7XG4gICAgRGltZW5zaW9uID0gJ2RpbWVuc2lvbicsXG4gICAgTWVhc3VyZSA9ICdtZWFzdXJlJyxcbiAgICBVbmtub3duID0gJ3Vua25vd24nLFxuICB9XG5cbiAgLyoqXG4gICAqIEFuIGVudW1lcmF0aW9uIG9mIHRoZSB2YWxpZCB0eXBlcyBvZiBmaWx0ZXJzIHRoYXQgY2FuIGJlIGFwcGxpZWQuXG4gICAqL1xuICBleHBvcnQgZW51bSBGaWx0ZXJUeXBlIHtcbiAgICBDYXRlZ29yaWNhbCA9ICdjYXRlZ29yaWNhbCcsXG4gICAgUmFuZ2UgPSAncmFuZ2UnLFxuICAgIEhpZXJhcmNoaWNhbCA9ICdoaWVyYXJjaGljYWwnLFxuICAgIFJlbGF0aXZlRGF0ZSA9ICdyZWxhdGl2ZS1kYXRlJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZGlmZmVyZW50IHVwZGF0ZSB0eXBlcyBmb3IgYXBwbHlpbmcgZmlsdGVyXG4gICAqL1xuICBleHBvcnQgZW51bSBGaWx0ZXJVcGRhdGVUeXBlIHtcbiAgICBBZGQgPSAnYWRkJyxcbiAgICBBbGwgPSAnYWxsJyxcbiAgICBSZXBsYWNlID0gJ3JlcGxhY2UnLFxuICAgIFJlbW92ZSA9ICdyZW1vdmUnLFxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBkb21haW4gdHlwZSBmb3IgYSBmaWx0ZXJcbiAgICovXG4gIGV4cG9ydCBlbnVtIEZpbHRlckRvbWFpblR5cGUge1xuICAgIC8qKlxuICAgICAqIFRoZSBkb21haW4gdmFsdWVzIHRoYXQgYXJlIHJlbGV2YW50IHRvIHRoZSBzcGVjaWZpZWQgZmlsdGVyXG4gICAgICogaS5lLiB0aGUgZG9tYWluIGlzIHJlc3RyaWN0ZWQgYnkgYSBwcmV2aW91cyBmaWx0ZXJcbiAgICAgKi9cbiAgICBSZWxldmFudCA9ICdyZWxldmFudCcsXG4gICAgLyoqXG4gICAgICogbGlzdCBvZiBhbGwgcG9zc2libGUgZG9tYWluIHZhbHVlcyBmcm9tIGRhdGFiYXNlXG4gICAgICovXG4gICAgRGF0YWJhc2UgPSAnZGF0YWJhc2UnLFxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBvcHRpb24gZm9yIHNwZWNpZnlpbmcgd2hpY2ggdmFsdWVzIHRvIGluY2x1ZGUgZm9yIGZpbHRlcmluZ1xuICAgKiBJbmRpY2F0ZXMgd2hhdCB0byBkbyB3aXRoIG51bGwgdmFsdWVzIGZvciBhIGdpdmVuIGZpbHRlciBvciBtYXJrIHNlbGVjdGlvbiBjYWxsLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gRmlsdGVyTnVsbE9wdGlvbiB7XG4gICAgTnVsbFZhbHVlcyA9ICdudWxsLXZhbHVlcycsXG4gICAgTm9uTnVsbFZhbHVlcyA9ICdub24tbnVsbC12YWx1ZXMnLFxuICAgIEFsbFZhbHVlcyA9ICdhbGwtdmFsdWVzJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnVtIHRoYXQgc2VydmVzIGFzIGEgZmlsdGVyIG9uIHRoZSBEYXRhVmFsdWVzIHJldHVybmVkIGZyb20gYGdldFN1bW1hcnlEYXRhUmVhZGVyQXN5bmNgLFxuICAgKiBgZ2V0VW5kZXJseWluZ1RhYmxlRGF0YVJlYWRlckFzeW5jYCBhbmQgYGdldExvZ2ljYWxUYWJsZURhdGFSZWFkZXJBc3luY2AuXG4gICAqIFRoaXMgaXMgYW4gb3B0aW1pemF0aW9uIG9mIHJldHVybmVkIGRhdGEgdmFsdWVzIG9ubHkuIFRhYmxlYXUgdmVyc2lvbnMgcHJpb3IgdG8gMjAyMS4yXG4gICAqIHdpbGwgcGFzcyB0aGUgZGF0YSBhY3Jvc3MgYW5kIHBvcHVsYXRlIHRoZSBEYXRhVmFsdWUgcHJvcGVydGllcy5cbiAgICogUGxlYXNlIG5vdGUgdGhhdCBhbGwgcHJvcGVydGllcyBub3QgcmVxdWVzdGVkIHdpbGwgYmUgYHVuZGVmaW5lZGAgaW4gdGhlIERhdGFWYWx1ZSByZXN1bHRzLlxuICAgKiBAc2luY2UgMS41LjBcbiAgICovXG4gIGV4cG9ydCBlbnVtIEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uIHtcbiAgICAvKiogRGF0YVZhbHVlcyB3aWxsIGluY2x1ZGUgYWxsIHByb3BlcnRpZXMuKi9cbiAgICBBbGxWYWx1ZXMgPSAnYWxsLXZhbHVlcycsXG5cbiAgICAvKiogRGF0YVZhbHVlcyB3aWxsIG9ubHkgaW5jbHVkZSB2YWx1ZSBhbmQgbmF0aXZlVmFsdWUgcHJvcGVydGllcy4qL1xuICAgIE9ubHlOYXRpdmVWYWx1ZXMgPSAnb25seS1uYXRpdmUtdmFsdWVzJyxcblxuICAgIC8qKiBEYXRhVmFsdWVzIHdpbGwgb25seSBpbmNsdWRlIGZvcm1hdHRlZFZhbHVlIHByb3BlcnRpZXMuICovXG4gICAgT25seUZvcm1hdHRlZFZhbHVlcyA9ICdvbmx5LWZvcm1hdHRlZC12YWx1ZXMnLFxuICB9XG5cbiAgLyoqXG4gICAqIFR5cGUgb2YgbWFyayBmb3IgYSBnaXZlbiBtYXJrcyBjYXJkIGluIGEgdml6LlxuICAgKi9cbiAgZXhwb3J0IGVudW0gTWFya1R5cGUge1xuICAgIEJhciA9ICdiYXInLFxuICAgIExpbmUgPSAnbGluZScsXG4gICAgQXJlYSA9ICdhcmVhJyxcbiAgICBTcXVhcmUgPSAnc3F1YXJlJyxcbiAgICBDaXJjbGUgPSAnY2lyY2xlJyxcbiAgICBTaGFwZSA9ICdzaGFwZScsXG4gICAgVGV4dCA9ICd0ZXh0JyxcbiAgICBNYXAgPSAnbWFwJyxcbiAgICBQaWUgPSAncGllJyxcbiAgICBHYW50dEJhciA9ICdnYW50dC1iYXInLFxuICAgIFBvbHlnb24gPSAncG9seWdvbicsXG4gICAgSGVhdG1hcCA9ICdoZWF0bWFwJyxcbiAgICBWaXpFeHRlbnNpb24gPSAndml6LWV4dGVuc2lvbicsXG4gIH1cblxuICAvKipcbiAgICogQW4gZW51bWVyYXRpb24gZGVzY3JpYmluZyB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIGFsbG93YWJsZSB2YWx1ZXMuXG4gICAqIFRoaXMgaXMgdXNlZCBmb3IgcmVzdHJpY3RpbmcgdGhlIGRvbWFpbiBvZiBhIHBhcmFtZXRlclxuICAgKi9cbiAgZXhwb3J0IGVudW0gUGFyYW1ldGVyVmFsdWVUeXBlIHtcbiAgICBBbGwgPSAnYWxsJyxcbiAgICBMaXN0ID0gJ2xpc3QnLFxuICAgIFJhbmdlID0gJ3JhbmdlJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBEYXRlIHBlcmlvZCB1c2VkIGluIGZpbHRlcnMgYW5kIGluIHBhcmFtZXRlcnMuXG4gICAqL1xuICBleHBvcnQgZW51bSBQZXJpb2RUeXBlIHtcbiAgICBZZWFycyA9ICd5ZWFycycsXG4gICAgUXVhcnRlcnMgPSAncXVhcnRlcnMnLFxuICAgIE1vbnRocyA9ICdtb250aHMnLFxuICAgIFdlZWtzID0gJ3dlZWtzJyxcbiAgICBEYXlzID0gJ2RheXMnLFxuICAgIEhvdXJzID0gJ2hvdXJzJyxcbiAgICBNaW51dGVzID0gJ21pbnV0ZXMnLFxuICAgIFNlY29uZHMgPSAnc2Vjb25kcycsXG4gIH1cblxuICBleHBvcnQgZW51bSBRdWlja1RhYmxlQ2FsY1R5cGUge1xuICAgIFJ1bm5pbmdUb3RhbCA9ICdydW5uaW5nLXRvdGFsJyxcbiAgICBEaWZmZXJlbmNlID0gJ2RpZmZlcmVuY2UnLFxuICAgIFBlcmNlbnREaWZmZXJlbmNlID0gJ3BlcmNlbnQtZGlmZmVyZW5jZScsXG4gICAgUGVyY2VudE9mVG90YWwgPSAncGVyY2VudC1vZi10b3RhbCcsXG4gICAgUmFuayA9ICdyYW5rJyxcbiAgICBQZXJjZW50aWxlID0gJ3BlcmNlbnRpbGUnLFxuICAgIE1vdmluZ0F2ZXJhZ2UgPSAnbW92aW5nLWF2ZXJhZ2UnLFxuICAgIFlURFRvdGFsID0gJ3l0ZC10b3RhbCcsXG4gICAgQ29tcG91bmRHcm93dGhSYXRlID0gJ2NvbXBvdW5kLWdyb3d0aC1yYXRlJyxcbiAgICBZZWFyT3ZlclllYXJHcm93dGggPSAneWVhci1vdmVyLXllYXItZ3Jvd3RoJyxcbiAgICBZVERHcm93dGggPSAneXRkLWdyb3d0aCcsXG4gICAgVW5kZWZpbmVkID0gJ3VuZGVmaW5lZCcsXG4gIH1cblxuICAvKipcbiAgICogRW51bSBmb3Igc3BlY2lmeWluZyB0aGUgc2VsZWN0aW9uIHR5cGUgZm9yIHNlbGVjdCBtYXJrcyBhcGkuXG4gICAqL1xuICBleHBvcnQgZW51bSBTZWxlY3Rpb25VcGRhdGVUeXBlIHtcbiAgICBSZXBsYWNlID0gJ3NlbGVjdC1yZXBsYWNlJyxcbiAgICBBZGQgPSAnc2VsZWN0LWFkZCcsXG4gICAgUmVtb3ZlID0gJ3NlbGVjdC1yZW1vdmUnLFxuICB9XG5cbiAgLyoqXG4gICAqIEVudW0gZm9yIHNwZWNpZnlpbmcgdGhlIHNlbGVjdCBvcHRpb24gZm9yIHRoZSBgZXh0ZW5zaW9ucy5Xb3Jrc2hlZXQuc2VsZWN0VHVwbGVzQXN5bmNgIG1ldGhvZC5cbiAgICovXG4gIGV4cG9ydCBlbnVtIFNlbGVjdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIENsZWFycyBleGlzdGluZyBzZWxlY3Rpb24gYmVmb3JlIHNlbGVjdGluZyB0aGUgdHVwbGVzIHNwZWNpZmllZFxuICAgICAqL1xuICAgIFNpbXBsZSA9ICdzZWxlY3Qtb3B0aW9ucy1zaW1wbGUnLFxuICAgIC8qKlxuICAgICAqIEFkZHMgc3BlY2lmaWVkIHR1cGxlcyB0byB0aGUgZXhpc3Rpbmcgc2VsZWN0aW9uXG4gICAgICovXG4gICAgVG9nZ2xlID0gJ3NlbGVjdC1vcHRpb25zLXRvZ2dsZScsXG4gIH1cblxuICAvKipcbiAgICogVGhlIHR5cGUgb2Ygc2hlZXQgYSBbW1NoZWV0XV0gb2JqZWN0IHJlcHJlc2VudHNcbiAgICovXG4gIGV4cG9ydCBlbnVtIFNoZWV0VHlwZSB7XG4gICAgRGFzaGJvYXJkID0gJ2Rhc2hib2FyZCcsXG4gICAgU3RvcnkgPSAnc3RvcnknLFxuICAgIFdvcmtzaGVldCA9ICd3b3Jrc2hlZXQnLFxuICB9XG5cbiAgZXhwb3J0IGVudW0gU29ydERpcmVjdGlvbiB7XG4gICAgSW5jcmVhc2luZyA9ICdpbmNyZWFzaW5nJyxcbiAgICBEZWNyZWFzaW5nID0gJ2RlY3JlYXNpbmcnLFxuICB9XG5cbiAgZXhwb3J0IGVudW0gVHJlbmRMaW5lTW9kZWxUeXBlIHtcbiAgICBMaW5lYXIgPSAnbGluZWFyJyxcbiAgICBMb2dhcml0aG1pYyA9ICdsb2dhcml0aG1pYycsXG4gICAgRXhwb25lbnRpYWwgPSAnZXhwb25lbnRpYWwnLFxuICAgIFBvbHlub21pYWwgPSAncG9seW5vbWlhbCcsXG4gIH1cblxuICAvKipcbiAgICogRW51bSB0aGF0IHJlcHJlc2VudHMgdGhlIHJlcGxheSBzcGVlZCBvZiBhbiBhbmltYXRpb24uXG4gICAqIEBzaW5jZSAxLjcuMFxuICAgKi9cbiAgZXhwb3J0IGVudW0gUmVwbGF5U3BlZWRUeXBlIHtcbiAgICAvKiogVXNlZCBmb3Igc2V0dGluZyB0aGUgcmVwbGF5IHNwZWVkIG9mIGFuIGFuaW1hdGlvbiB0byAwLjV4LiovXG4gICAgU2xvdyA9ICdzbG93JyxcblxuICAgIC8qKiBVc2VkIGZvciBzZXR0aW5nIHRoZSByZXBsYXkgc3BlZWQgb2YgYW4gYW5pbWF0aW9uIHRvIDEuMHguKi9cbiAgICBOb3JtYWwgPSAnbm9ybWFsJyxcblxuICAgIC8qKiBVc2VkIGZvciBzZXR0aW5nIHRoZSByZXBsYXkgc3BlZWQgb2YgYW4gYW5pbWF0aW9uIHRvIDIuMHguKi9cbiAgICBGYXN0ID0gJ2Zhc3QnLFxuICB9XG5cbiAgLyoqXG4gICAqIEVudW0gdGhhdCByZXByZXNlbnRzIHRoZSBzZWxlY3Rpb24gc3RhdGUgb2YgYSBsZXZlbCBpbiBhIGhpZXJhcmNoaWNhbCBmaWx0ZXJcbiAgICogQHNpbmNlIEV4dGVuc2lvbnMgMS4xMC4wXG4gICAqL1xuICBleHBvcnQgZW51bSBIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlIHtcbiAgICBBbGxTZWxlY3RlZCA9ICdhbGwtc2VsZWN0ZWQnLFxuICAgIE5vbmVTZWxlY3RlZCA9ICdub25lLXNlbGVjdGVkJyxcbiAgICBTb21lU2VsZWN0ZWQgPSAnc29tZS1zZWxlY3RlZCcsXG4gICAgVW5rbm93blNlbGVjdGVkID0gJ3Vua25vd24tc2VsZWN0ZWQnLFxuICB9XG5cbiAgLyoqXG4gICAqIFpvbmVWaXNpYmlsaXR5VHlwZVxuICAgKiBAZGVwcmVjYXRlZCB1c2UgRGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eVR5cGVcbiAgICovXG4gIGV4cG9ydCBkZWNsYXJlIHR5cGUgWm9uZVZpc2liaWxpdHlUeXBlID0gRGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eVR5cGU7XG4gIGV4cG9ydCBjb25zdCBab25lVmlzaWJpbGl0eVR5cGUgPSB7IC4uLkRhc2hib2FyZE9iamVjdFZpc2liaWxpdHlUeXBlIH07XG59XG5leHBvcnQgPSBUYWJsZWF1O1xuIiwiLy8gVGhpcyBmaWxlIHJlLWV4cG9ydHMgZXZlcnl0aGluZyB3aGljaCBpcyBwYXJ0IG9mIHRoZSBzaGFyZWQgYXBpIHB1YmxpYyBpbnRlcmZhY2VcblxuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9Bbm5vdGF0aW9uSW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvU2hhcmVkL0RhdGFTb3VyY2VJbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvRGF0YVRhYmxlSW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvU2hhcmVkL0VudW1zJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvRW52aXJvbm1lbnRJbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvRmlsdGVySW50ZXJmYWNlcyc7XG5leHBvcnQge1xuICBBbmFseXRpY3NPYmplY3RUeXBlLFxuICBBbm5vdGF0aW9uVHlwZSxcbiAgQ2xhc3NOYW1lS2V5LFxuICBDb2x1bW5UeXBlLFxuICBEYXNoYm9hcmRMYXlvdXRDaGFuZ2UsXG4gIERhc2hib2FyZE9iamVjdFR5cGUsXG4gIERhc2hib2FyZE9iamVjdFZpc2liaWxpdHlUeXBlLFxuICBEYXRhVHlwZSxcbiAgRGF0ZVJhbmdlVHlwZSxcbiAgRGlhbG9nU3R5bGUsXG4gIEVuY29kaW5nVHlwZSxcbiAgRmllbGRBZ2dyZWdhdGlvblR5cGUsXG4gIEZpZWxkUm9sZVR5cGUsXG4gIEZpbHRlckRvbWFpblR5cGUsXG4gIEZpbHRlck51bGxPcHRpb24sXG4gIEZpbHRlclR5cGUsXG4gIEZpbHRlclVwZGF0ZVR5cGUsXG4gIEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUsXG4gIEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICBNYXJrVHlwZSxcbiAgUGFyYW1ldGVyVmFsdWVUeXBlLFxuICBQZXJpb2RUeXBlLFxuICBRdWlja1RhYmxlQ2FsY1R5cGUsXG4gIFJlcGxheVNwZWVkVHlwZSxcbiAgU2VsZWN0T3B0aW9ucyxcbiAgU2VsZWN0aW9uVXBkYXRlVHlwZSxcbiAgU2hlZXRUeXBlLFxuICBTb3J0RGlyZWN0aW9uLFxuICBUcmVuZExpbmVNb2RlbFR5cGUsXG4gIFpvbmVWaXNpYmlsaXR5VHlwZSxcbn0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9OYW1lc3BhY2VzL1RhYmxlYXUnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9TZWxlY3Rpb25JbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvU2hlZXRJbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvVmlzdWFsTW9kZWxJbnRlcmZhY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9Xb3JrYm9va0Zvcm1hdHRpbmdJbnRlcmZhY2VzJztcbiIsIi8qKlxuICogVGhpcyBpcyB5b3VyIG1haW4uIFRoaXMgaXMgd2hlcmUgeW91IHJlLWV4cG9ydCBldmVyeXRoaW5nIHlvdSB3YW50IHRvIGJlIHB1YmxpY2x5IGF2YWlsYWJsZS5cbiAqXG4gKiBUaGUgYnVpbGQgZW5mb3JjZXMgdGhhdCB0aGUgZmlsZSBoYXMgdGhlIHNhbWUgbmFtZSBhcyB0aGUgZ2xvYmFsIHZhcmlhYmxlIHRoYXQgaXMgZXhwb3J0ZWQuXG4gKi9cblxuLy8gRXhwb3J0IHRoZSB2ZXJzaW9uIG9mIHRoZSBpbnRlcm5hbCBjb250cmFjdCB0byBiZSBhdmFpbGFibGUgYXQgcnVudGltZVxuLy8gIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgeWFybiBwdWJsaXNoOmJ1bXAgdmlhIHNjcmlwdHMvcHVibGlzaC1jaGVjay50c1xuLy8gIHVwZGF0ZUludGVybmFsQ29udHJhY3RSdW50aW1lVmVyc2lvbiBpbiB0aGUgbW9ub3JlcG8gcm9vdC5cbmltcG9ydCAqIGFzIGludGVybmFsQ29udHJhY3RWZXJzaW9uIGZyb20gJy4uL2ludGVybmFsLWNvbnRyYWN0LXZlcnNpb24uanNvbic7XG5leHBvcnQgY29uc3QgSU5URVJOQUxfQ09OVFJBQ1RfVkVSU0lPTiA9IGludGVybmFsQ29udHJhY3RWZXJzaW9uO1xuXG5leHBvcnQgKiBmcm9tICcuL2NvbnRyYWN0L0RhdGFUeXBlQ29udmVydGVyJztcbmV4cG9ydCAqIGZyb20gJy4vY29udHJhY3QvRW51bXMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb250cmFjdC9Nb2RlbHMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb250cmFjdC9Ob3RpZmljYXRpb25zJztcbmV4cG9ydCAqIGZyb20gJy4vY29udHJhY3QvUGFyYW1ldGVycyc7XG5leHBvcnQgKiBmcm9tICcuL2NvbnRyYWN0L1ZlcmJzJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJmYWNlL0Fza0RhdGFJbnRlcmZhY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcmZhY2UvSW5pdGlhbGl6YXRpb25PcHRpb25zJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJmYWNlL0ludGVybmFsQXBpRGlzcGF0Y2hlcic7XG5leHBvcnQgKiBmcm9tICcuL2ludGVyZmFjZS9QdWxzZUludGVyZmFjZSc7XG5leHBvcnQgKiBmcm9tICcuL2ludGVyZmFjZS9WZXJzaW9uTnVtYmVyJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJmYWNlL1ZxbEludGVyZmFjZSc7XG5leHBvcnQgKiBmcm9tICcuL21lc3NhZ2luZy9Dcm9zc0ZyYW1lTWVzc2VuZ2VyJztcbmV4cG9ydCAqIGZyb20gJy4vbWVzc2FnaW5nL2ludGVyZmFjZS9NZXNzYWdlRGlzcGF0Y2hlcic7XG5leHBvcnQgKiBmcm9tICcuL21lc3NhZ2luZy9pbnRlcmZhY2UvTWVzc2FnZUxpc3RlbmVyJztcbmV4cG9ydCAqIGZyb20gJy4vbWVzc2FnaW5nL2ludGVyZmFjZS9NZXNzYWdlVHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9tZXNzYWdpbmcvaW50ZXJmYWNlL01lc3Nlbmdlcic7XG5leHBvcnQgKiBmcm9tICcuL21lc3NhZ2luZy9pbnRlcmZhY2UvUHJlcGFyZWRNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vdmVyc2lvbmluZy9leHRlcm5hbC9FeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcic7XG5leHBvcnQgKiBmcm9tICcuL3ZlcnNpb25pbmcvZXh0ZXJuYWwvRXh0ZXJuYWxJZGVudGl0eVZlcnNpb25Db252ZXJ0ZXInO1xuZXhwb3J0ICogZnJvbSAnLi92ZXJzaW9uaW5nL2V4dGVybmFsL0V4dGVybmFsVmVyc2lvbkNvbnZlcnRlckZhY3RvcnknO1xuZXhwb3J0ICogZnJvbSAnLi92ZXJzaW9uaW5nL0ludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyJztcbmV4cG9ydCAqIGZyb20gJy4vdmVyc2lvbmluZy9WZXJzaW9uQ29udmVydGVyRmFjdG9yeSc7XG5cbi8vIEV4cG9ydCB0aGUgdmVyc2lvbiBudW1iZXIgb2YgbWVzc2FnaW5nIGZvciBjb25zdW1lcnMgdG8gdXNlLlxuLy8gQmUgdmVyeSBjYXJlZnVsIG1ha2luZyBhbnkgdXBkYXRlcyB0byB0aGlzIGNvbnRyYWN0IHdoaWNoIGJyZWFrIHZlcnNpb24gY29tcGF0aWJpbGl0eS5cbmV4cG9ydCBjb25zdCBNRVNTQUdJTkdfVkVSU0lPTiA9IHtcbiAgbWFqb3I6IDEsXG4gIG1pbm9yOiAwLFxuICBmaXg6IDAsXG59O1xuIiwiaW1wb3J0IHsgRGF0YVR5cGUgfSBmcm9tICcuL0VudW1zJztcblxuZXhwb3J0IGNsYXNzIERhdGFUeXBlQ29udmVydGVyIHtcbiAgcHJpdmF0ZSBzdGF0aWMgaXNTcGVjaWFsKHZhbHVlQXNTdHJpbmc6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIC8vIFByaW9yIHRvIFNob3dEYXRhVGFibGVQcmVzTW9kZWwsIHNwZWNpYWwgdmFsdWVzIGNvbWUgdG8gdXMgYXNcbiAgICAvLyAnJW51bGwlJywgJyVhbGwlJywgJyV3aWxkY2FyZCUnLCAnJW1pc3NpbmclJy4uLlxuICAgIC8vIFdoaWxlIHRoaXMgZnVuY3Rpb24gd2lsbCBuZXZlciByZXR1cm4gdHJ1ZSBmb3IgU2hvd0RhdGFUYWJsZVByZXNNb2RlbCBjb252ZXJzaW9uLFxuICAgIC8vIGl0IGlzIGFzIGNoZWFwIGFzIHBhc3NpbmcgYXJvdW5kIGEgdmVyc2lvbiBhbmQgY2hlY2tpbmcgdGhhdC5cbiAgICAvLyAoU2VlIERhdGFWYWx1ZUZvcm1hdHRlci5jcHApXG5cbiAgICBpZiAodmFsdWVBc1N0cmluZy5sZW5ndGggPiAyICYmIHZhbHVlQXNTdHJpbmdbMF0gPT09ICclJyAmJiB2YWx1ZUFzU3RyaW5nW3ZhbHVlQXNTdHJpbmcubGVuZ3RoIC0gMV0gPT09ICclJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHNwZWNpYWxWYWx1ZUluZGljYXRvciA9ICclbnVsbCUnO1xuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgcHJpdmF0ZSBzdGF0aWMgcGFyc2VCb29sZWFuKGJvb2xlYW5TdHJpbmc6IHN0cmluZyk6IGJvb2xlYW4gfCBzdHJpbmcge1xuICAgIC8vIGJvb2xlYW4gdmFsdWVzIGNvbWUgdG8gdXMgYXMgJ3RydWUnfCdmYWxzZSdcbiAgICBjb25zdCBub3JtYWxpemVkQm9vbGVhbjogc3RyaW5nID0gYm9vbGVhblN0cmluZy50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiBub3JtYWxpemVkQm9vbGVhbiAhPT0gJ3RydWUnICYmIG5vcm1hbGl6ZWRCb29sZWFuICE9PSAnZmFsc2UnID8gdGhpcy5zcGVjaWFsVmFsdWVJbmRpY2F0b3IgOiBub3JtYWxpemVkQm9vbGVhbiA9PT0gJ3RydWUnO1xuICB9XG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICBwcml2YXRlIHN0YXRpYyBwYXJzZU51bWJlcih2YWx1ZUFzU3RyaW5nOiBzdHJpbmcpOiBudW1iZXIgfCBzdHJpbmcge1xuICAgIGNvbnN0IHZhbHVlID0gTnVtYmVyKHZhbHVlQXNTdHJpbmcpO1xuICAgIHJldHVybiBpc05hTih2YWx1ZSkgPyB0aGlzLnNwZWNpYWxWYWx1ZUluZGljYXRvciA6IHZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcGFyc2VEYXRlKGRhdGVBc1N0cmluZzogc3RyaW5nKTogRGF0ZSB8IG51bGwge1xuICAgIC8vIE5vdGUgdGhhdCB3aXRob3V0IGEgdGltZSwgdGhlIGRhdGUgaXMgYXNzdW1lZCB0byBiZSBVVENcbiAgICAvLyBJbnB1dCBvZiAyMDIwLTAzLTI1IGlzIHByaW50ZWQgYXM6IE1hciAyNCAyMDIwIDE3OjAwOjAwIEdNVC0wNzAwXG4gICAgLy8gVGhpcyBtYXRjaGVzIHN0eWxlIHVzZWQgaW4gZXhpc3RpbmcgY29udmVydEZpbHRlclZhbHVlUHJlc01vZGVsXG4gICAgY29uc3QgdmFsdWUgPSBuZXcgRGF0ZShkYXRlQXNTdHJpbmcpO1xuICAgIHJldHVybiBOdW1iZXIuaXNOYU4odmFsdWUuZ2V0VGltZSgpKSA/IG51bGwgOiB2YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHBhcnNlRGF0ZVRpbWUoZGF0ZUFzU3RyaW5nOiBzdHJpbmcpOiBEYXRlIHwgbnVsbCB7XG4gICAgLy8gV2l0aCBhIHRpbWUsIHRoZSBkYXRlIGlzIGFzc3VtZWQgdG8gYmUgVVRDLlxuICAgIC8vIE91ciBkYXRlIGZvcm1hdCBpcyBhbHdheXM6IHl5eXktbW0tZGQgaGg6bW06c3NcbiAgICAvLyBVbmZvcnR1bmF0ZWx5LCBJRTExIGNhbid0IHBhcnNlIHRoYXQgZm9ybWF0IHNvIHdlIGFkZCBhIFQgYmV0d2VlbiB0aGUgZGF5IGFuZCB0aW1lLlxuICAgIC8vIFdlIGFsc28gYWRkIGEgWiBzbyB0aGF0IGl0IGlzIFVUQy4gKFdpdGhvdXQgdGhlIFosIHNvbWUgYnJvd3NlcnMgYXNzdW1lIGxvY2FsLCBhbmQgb3RoZXJzIFVUQylcbiAgICAvLyBFdmVuIHRob3VnaCB3ZSd2ZSBkcm9wcGVkIHN1cHBvcnQgZm9yIElFMTEsIGl0J3Mgcmlza2llci9jb3N0bGllciB0byBtYWtlIHVwZGF0ZXMgaGVyZS5cbiAgICBjb25zdCBmb3JtYXR0ZWREYXRlU3RyaW5nOiBzdHJpbmcgPSBkYXRlQXNTdHJpbmcucmVwbGFjZSgnICcsICdUJykuY29uY2F0KCdaJyk7XG4gICAgY29uc3QgdmFsdWUgPSBuZXcgRGF0ZShmb3JtYXR0ZWREYXRlU3RyaW5nKTtcbiAgICByZXR1cm4gTnVtYmVyLmlzTmFOKHZhbHVlLmdldFRpbWUoKSkgPyBudWxsIDogdmFsdWU7XG4gIH1cblxuICAvLyBJdCB3b3VsZCBiZSBuaWNlIHRvIG1lcmdlIHRoaXMgYW5kIHRoZSBtZXRob2QgRmlsdGVyQ29udmVydGVyOjpjb252ZXJ0RmlsdGVyVmFsdWVQcmVzTW9kZWwgaW4gYXBpLXBsYXRmb3JtLWpzXG4gIHB1YmxpYyBzdGF0aWMgY29udmVydFZhbHVlQXNTdHJpbmdUb1ZhbHVlKHZhbHVlQXNTdHJpbmc6IHN0cmluZywgdHlwZTogRGF0YVR5cGUpOiBib29sZWFuIHwgbnVtYmVyIHwgc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAvLyBUaGlzIGlzIGJvdGggRGF0YURpY3Rpb25hcnkgYW5kIFNob3dEYXRhVGFibGVQcmVzTW9kZWwgY29tcGF0aWJsZS5cbiAgICAvLyBJbiB0aGUgRGF0YURpY3Rpb25hcnksIHZhbHVlQXNTdHJpbmcgY2FuIGJlICclbnVsbCUnIG9yICclbWlzc2luZyUnLCB3aGlsZSBpblxuICAgIC8vIFNob3dEYXRhVGFibGVQcmVzTW9kZWwsIHdlIGNhbiBnZXQgJ251bGwnIG9yICdtaXNzaW5nJywgb3IgJyVudWxsJScgZm9yIHN0cmluZyBzcGVjaWFsIHZhbHVlcy5cbiAgICAvLyBGb3IgZWl0aGVyIG9mIHRoZXNlIGNhc2VzLCB3ZSByZXR1cm4gc3BlY2lhbFZhbHVlSW5kaWNhdG9yIChvciB0aGUgb3JpZ2luYWwgc3BlY2lhbCBzdHJpbmcpLlxuICAgIC8vIFRvIG1haW50YWluIGJhY2t3YXJkcyBjb21wYXRpYmlsdHksIHRoaXMgY29udmVydGVyOlxuICAgIC8vIDEuIHJldHVybnMgYSBzdHJpbmcgZm9yIGFueSBzcGVjaWFsIHZhbHVlc1xuICAgIC8vIDIuIHJldHVybnMgYSBzdHJpbmcgZm9yIGFueSBkYXRlXG5cbiAgICAvLyBQYXJhbWV0ZXIgbWluL21heCB2YWx1ZXMgY2FuIGJlIHVuZGVmaW5lZCwgc28gcmVzdWx0IGlzIGFsc28gdW5kZWZpbmVkXG4gICAgaWYgKHZhbHVlQXNTdHJpbmcgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZUFzU3RyaW5nID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzU3BlY2lhbCh2YWx1ZUFzU3RyaW5nKSkge1xuICAgICAgcmV0dXJuIHZhbHVlQXNTdHJpbmc7XG4gICAgfVxuXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIERhdGFUeXBlLkJvb2w6XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlQm9vbGVhbih2YWx1ZUFzU3RyaW5nKTtcblxuICAgICAgY2FzZSBEYXRhVHlwZS5JbnQ6XG4gICAgICBjYXNlIERhdGFUeXBlLkZsb2F0OlxuICAgICAgICAvLyBSZXR1cm4gc3BlY2lhbCB2YWx1ZSAnJW51bGwlJyBmb3IgYW55IGZhaWx1cmUgaW4gcGFyc2luZy5cbiAgICAgICAgLy8gV2UgbmVlZCB0byBkbyB0aGF0IGJlY2F1c2UgU2hvd0RhdGFUYWJsZVByZXNNb2RlbCB3aWxsIGdpdmUgdXMgc3RyaW5ncyBsaWtlICdudWxsJ1xuICAgICAgICAvLyBmb3Igc3BlY2lhbCB2YWx1ZXMuXG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlTnVtYmVyKHZhbHVlQXNTdHJpbmcpO1xuXG4gICAgICBjYXNlIERhdGFUeXBlLkRhdGU6XG4gICAgICAgIC8vIEZvciBTaG93RGF0YVRhYmxlUHJlc01vZGVsLCBzcGVjaWFsIHZhbHVlcyB3aWxsIGJlIFwibnVsbFwiIHdoaWNoIHdpbGwgZmFpbCB0byBwYXJzZS5cbiAgICAgICAgLy8gSW4gdGhhdCBjYXNlLCB3ZSByZXR1cm4gJyVudWxsJScuXG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlRGF0ZSh2YWx1ZUFzU3RyaW5nKSA9PT0gbnVsbCA/IHRoaXMuc3BlY2lhbFZhbHVlSW5kaWNhdG9yIDogdmFsdWVBc1N0cmluZztcblxuICAgICAgY2FzZSBEYXRhVHlwZS5EYXRlVGltZTpcbiAgICAgICAgLy8gRm9yIFNob3dEYXRhVGFibGVQcmVzTW9kZWwsIHNwZWNpYWwgdmFsdWVzIHdpbGwgYmUgXCJudWxsXCIgd2hpY2ggd2lsbCBmYWlsIHRvIHBhcnNlLlxuICAgICAgICAvLyBJbiB0aGF0IGNhc2UsIHdlIHJldHVybiAnJW51bGwlJ1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZURhdGVUaW1lKHZhbHVlQXNTdHJpbmcpID09PSBudWxsID8gdGhpcy5zcGVjaWFsVmFsdWVJbmRpY2F0b3IgOiB2YWx1ZUFzU3RyaW5nO1xuXG4gICAgICBjYXNlIERhdGFUeXBlLlNwYXRpYWw6XG4gICAgICBjYXNlIERhdGFUeXBlLlN0cmluZzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB2YWx1ZUFzU3RyaW5nO1xuICAgIH1cbiAgfVxuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgcHVibGljIHN0YXRpYyBjb252ZXJ0VmFsdWVUb05hdGl2ZVZhbHVlKHZhbHVlOiBhbnksIHR5cGU6IERhdGFUeXBlKTogYm9vbGVhbiB8IG51bWJlciB8IERhdGUgfCBzdHJpbmcgfCBudWxsIHtcbiAgICAvLyBUaGlzIGNvbnZlcnRzIGZyb20gb3VyIDEuMiBBUEkgdGhhdCByZXR1cm5zIHN0cmluZ3MgZm9yIHNwZWNpYWxzLCBhbmQgZGF0ZXMgYXMgc3RyaW5ncy5cbiAgICAvLyBJdCB0YWtlcyB0aGUgc3BlY2lhbCBjYXNlIG9mICclbnVsbCUnIGFuZCByZXR1cm5zIGEgbnVsbC5cbiAgICAvLyBGb3IgZGF0ZXMsIGl0IHJldHVybnMgYSBEYXRlIG9iamVjdCByYXRoZXIgdGhhbiBhIHN0cmluZy5cbiAgICAvLyBjb252ZXJ0VmFsdWVUb05hdGl2ZVZhbHVlIHNob3VsZCBiZSB1c2VkIHRvIGJ1aWxkIGEgRGF0YVZhbHVlLm5hdGl2ZVZhbHVlIGZpZWxkLlxuXG4gICAgLy8gUGFyYW1ldGVyIG1pbi9tYXggY2FuIGJlIHVuZGVmaW5lZC4gSWYgdGhhdCBpcyB0aGUgY2FzZSwgbmF0aXZlVmFsdWUgaXMgdHJlYXRlZCBsaWtlIGEgc3BlY2lhbFxuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgRGF0YVR5cGUuQm9vbDpcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyBudWxsIDogdmFsdWU7XG5cbiAgICAgIGNhc2UgRGF0YVR5cGUuSW50OlxuICAgICAgY2FzZSBEYXRhVHlwZS5GbG9hdDpcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyBudWxsIDogdmFsdWU7XG5cbiAgICAgIGNhc2UgRGF0YVR5cGUuRGF0ZTpcbiAgICAgICAgLy8gQ29udmVydCB0aGUgc3RyaW5nIHRvIERhdGUgb2JqZWN0IChvciBudWxsIGlmIHBhcnNpbmcgZmFpbHMgLi4uIHdlIGFzc3VtZSBzcGVjaWFsKVxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZURhdGUodmFsdWUpO1xuXG4gICAgICBjYXNlIERhdGFUeXBlLkRhdGVUaW1lOlxuICAgICAgICAvLyBDb252ZXJ0IHRoZSBzdHJpbmcgdG8gRGF0ZSBvYmplY3QgKG9yIG51bGwgaWYgcGFyc2luZyBmYWlscyAuLi4gd2UgYXNzdW1lIHNwZWNpYWwpXG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlRGF0ZVRpbWUodmFsdWUpO1xuXG4gICAgICBjYXNlIERhdGFUeXBlLlN0cmluZzpcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNTcGVjaWFsKHZhbHVlKSA/IG51bGwgOiB2YWx1ZTtcblxuICAgICAgY2FzZSBEYXRhVHlwZS5TcGF0aWFsOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgcHVibGljIHN0YXRpYyBjb252ZXJ0U3RyaW5nVmFsdWVUb05hdGl2ZVZhbHVlKHZhbHVlOiBzdHJpbmcsIHR5cGU6IERhdGFUeXBlKTogYm9vbGVhbiB8IG51bWJlciB8IERhdGUgfCBzdHJpbmcgfCBudWxsIHtcbiAgICAvLyBUaGlzIGhhbmRsZXMgdGhlIGNvbnZlcnNpb24gZnJvbSBzdHJpbmcgZGlyZWN0bHkgdG8gbmF0aXZlIHZhbHVlIGZvciBhbGwgdHlwZXNcbiAgICByZXR1cm4gdGhpcy5jb252ZXJ0VmFsdWVUb05hdGl2ZVZhbHVlKHRoaXMuY29udmVydFZhbHVlQXNTdHJpbmdUb1ZhbHVlKHZhbHVlLCB0eXBlKSwgdHlwZSk7XG4gIH1cbn1cbiIsImV4cG9ydCBlbnVtIEV4dGVuc2lvbkNvbnRleHQge1xuICBEZXNrdG9wID0gJ2Rlc2t0b3AnLFxuICBTZXJ2ZXIgPSAnc2VydmVyJyxcbiAgVW5rbm93biA9ICd1bmtub3duJyxcbiAgQ2xvdWQgPSAnY2xvdWQnLFxuICBQdWJsaWNXZWIgPSAncHVibGljLXdlYicsXG4gIFB1YmxpY0Rlc2t0b3AgPSAncHVibGljLWRlc2t0b3AnLFxufVxuXG5leHBvcnQgZW51bSBFeHRlbnNpb25Nb2RlIHtcbiAgQXV0aG9yaW5nID0gJ2F1dGhvcmluZycsXG4gIFZpZXdpbmcgPSAndmlld2luZycsXG4gIFVua25vd24gPSAndW5rbm93bicsXG59XG5cbmV4cG9ydCBlbnVtIEFubm90YXRlRW51bSB7XG4gIE1hcmsgPSAnbWFyaycsXG4gIFBvaW50ID0gJ3BvaW50JyxcbiAgQXJlYSA9ICdhcmVhJyxcbn1cblxuZXhwb3J0IGVudW0gQ29sdW1uVHlwZSB7XG4gIERpc2NyZXRlID0gJ2Rpc2NyZXRlJyxcbiAgQ29udGludW91cyA9ICdjb250aW51b3VzJyxcbiAgVW5rbm93biA9ICd1bmtub3duJyxcbn1cblxuZXhwb3J0IGVudW0gRGFzaGJvYXJkT2JqZWN0VHlwZSB7XG4gIEJsYW5rID0gJ2JsYW5rJyxcbiAgV29ya3NoZWV0ID0gJ3dvcmtzaGVldCcsXG4gIFF1aWNrRmlsdGVyID0gJ3F1aWNrLWZpbHRlcicsXG4gIFBhcmFtZXRlckNvbnRyb2wgPSAncGFyYW1ldGVyLWNvbnRyb2wnLFxuICBQYWdlRmlsdGVyID0gJ3BhZ2UtZmlsdGVyJyxcbiAgTGVnZW5kID0gJ2xlZ2VuZCcsXG4gIFRpdGxlID0gJ3RpdGxlJyxcbiAgVGV4dCA9ICd0ZXh0JyxcbiAgSW1hZ2UgPSAnaW1hZ2UnLFxuICBXZWJQYWdlID0gJ3dlYi1wYWdlJyxcbiAgRXh0ZW5zaW9uID0gJ2V4dGVuc2lvbicsXG59XG5cbmV4cG9ydCBlbnVtIERhdGFUeXBlIHtcbiAgU3RyaW5nID0gJ3N0cmluZycsXG4gIEludCA9ICdpbnQnLFxuICBGbG9hdCA9ICdmbG9hdCcsXG4gIEJvb2wgPSAnYm9vbCcsXG4gIERhdGUgPSAnZGF0ZScsXG4gIERhdGVUaW1lID0gJ2RhdGUtdGltZScsXG4gIFNwYXRpYWwgPSAnc3BhdGlhbCcsXG4gIFVua25vd24gPSAndW5rbm93bicsXG59XG5cbmV4cG9ydCBlbnVtIERpYWxvZ1N0eWxlIHtcbiAgV2luZG93ID0gJ3dpbmRvdycsXG4gIE1vZGFsID0gJ21vZGFsJyxcbiAgTW9kZWxlc3MgPSAnbW9kZWxlc3MnLFxufVxuXG5leHBvcnQgZW51bSBFbmNvZGVkRGF0YVR5cGUge1xuICBOdW1iZXIgPSAnbnVtYmVyJyxcbiAgU3RyaW5nID0gJ3N0cmluZycsXG4gIERhdGUgPSAnZGF0ZScsXG4gIEJvb2xlYW4gPSAnYm9vbGVhbicsXG59XG5cbmV4cG9ydCBlbnVtIEVycm9yQ29kZXMge1xuICBJTklUSUFMSVpBVElPTl9FUlJPUiA9ICdpbml0aWFsaXphdGlvbi1lcnJvcicsXG4gIElOVEVSTkFMX0VSUk9SID0gJ2ludGVybmFsLWVycm9yJyxcbiAgTUlTU0lOR19FTlVNX01BUFBJTkcgPSAnbWlzc2luZy1lbnVtLW1hcHBpbmcnLFxuICBNSVNTSU5HX1BBUkFNRVRFUiA9ICdtaXNzaW5nLXBhcmFtZXRlcicsXG4gIFBFUk1JU1NJT05fREVOSUVEID0gJ3Blcm1pc3Npb24tZGVuaWVkJyxcbiAgUFJFU19NT0RFTF9QQVJTSU5HX0VSUk9SID0gJ3ByZXMtbW9kZWwtcGFyc2luZy1lcnJvcicsXG4gIFZFUlNJT05fTk9UX0NPTkZJR1VSRUQgPSAndmVyc2lvbi1ub3QtY29uZmlndXJlZCcsXG4gIFZJU0lCSUxJVFlfRVJST1IgPSAndmlzaWJpbGl0eS1lcnJvcicsXG4gIFVOS05PV05fVkVSQl9JRCA9ICd1bmtub3duLXZlcmItaWQnLFxufVxuXG5leHBvcnQgZW51bSBGaWVsZEFnZ3JlZ2F0aW9uVHlwZSB7XG4gIFN1bSA9ICdzdW0nLFxuICBBdmcgPSAnYXZnJyxcbiAgTWluID0gJ21pbicsXG4gIE1heCA9ICdtYXgnLFxuICBTdGRldiA9ICdzdGRldicsXG4gIFN0ZGV2cCA9ICdzdGRldnAnLFxuICBWYXIgPSAndmFyJyxcbiAgVmFycCA9ICd2YXJwJyxcbiAgQ29sbGVjdCA9ICdjb2xsZWN0JyxcbiAgQ291bnQgPSAnY291bnQnLFxuICBDb3VudGQgPSAnY291bnRkJyxcbiAgTWVkaWFuID0gJ21lZGlhbicsXG4gIEF0dHIgPSAnYXR0cicsXG4gIE5vbmUgPSAnbm9uZScsXG4gIFllYXIgPSAneWVhcicsXG4gIFF0ciA9ICdxdHInLFxuICBNb250aCA9ICdtb250aCcsXG4gIERheSA9ICdkYXknLFxuICBIb3VyID0gJ2hvdXInLFxuICBNaW51dGUgPSAnbWludXRlJyxcbiAgU2Vjb25kID0gJ3NlY29uZCcsXG4gIFdlZWsgPSAnd2VlaycsXG4gIFdlZWtkYXkgPSAnd2Vla2RheScsXG4gIE1vbnRoWWVhciA9ICdtb250aC15ZWFyJyxcbiAgTWR5ID0gJ21keScsXG4gIEVuZCA9ICdlbmQnLFxuICBUcnVuY1llYXIgPSAndHJ1bmMteWVhcicsXG4gIFRydW5jUXRyID0gJ3RydW5jLXF0cicsXG4gIFRydW5jTW9udGggPSAndHJ1bmMtbW9udGgnLFxuICBUcnVuY1dlZWsgPSAndHJ1bmMtd2VlaycsXG4gIFRydW5jRGF5ID0gJ3RydW5jLWRheScsXG4gIFRydW5jSG91ciA9ICd0cnVuYy1ob3VyJyxcbiAgVHJ1bmNNaW51dGUgPSAndHJ1bmMtbWludXRlJyxcbiAgVHJ1bmNTZWNvbmQgPSAndHJ1bmMtc2Vjb25kJyxcbiAgUXVhcnQxID0gJ3F1YXJ0MScsXG4gIFF1YXJ0MyA9ICdxdWFydDMnLFxuICBTa2V3bmVzcyA9ICdza2V3bmVzcycsXG4gIEt1cnRvc2lzID0gJ2t1cnRvc2lzJyxcbiAgSW5PdXQgPSAnaW4tb3V0JyxcbiAgVXNlciA9ICd1c2VyJyxcbn1cblxuZXhwb3J0IGVudW0gRmllbGRSb2xlVHlwZSB7XG4gIERpbWVuc2lvbiA9ICdkaW1lbnNpb24nLFxuICBNZWFzdXJlID0gJ21lYXN1cmUnLFxuICBVbmtub3duID0gJ3Vua25vd24nLFxufVxuXG4vKipcbiAqICBUaGUgZGlmZmVyZW50IHVwZGF0ZSB0eXBlcyBmb3IgYXBwbHlpbmcgZmlsdGVyLlxuICovXG5leHBvcnQgZW51bSBGaWx0ZXJVcGRhdGVUeXBlIHtcbiAgQWRkID0gJ2FkZCcsXG4gIEFsbCA9ICdhbGwnLFxuICBSZXBsYWNlID0gJ3JlcGxhY2UnLFxuICBSZW1vdmUgPSAncmVtb3ZlJyxcbn1cblxuZXhwb3J0IGVudW0gU2hlZXRUeXBlIHtcbiAgRGFzaGJvYXJkID0gJ2Rhc2hib2FyZCcsXG4gIFN0b3J5ID0gJ3N0b3J5JyxcbiAgV29ya3NoZWV0ID0gJ3dvcmtzaGVldCcsXG59XG5cbmV4cG9ydCBlbnVtIERvbWFpblJlc3RyaWN0aW9uVHlwZSB7XG4gIEFsbCA9ICdhbGwnLFxuICBMaXN0ID0gJ2xpc3QnLFxuICBSYW5nZSA9ICdyYW5nZScsXG59XG5cbmV4cG9ydCBlbnVtIERhdGVTdGVwUGVyaW9kIHtcbiAgWWVhcnMgPSAneWVhcnMnLFxuICBRdWFydGVycyA9ICdxdWFydGVycycsXG4gIE1vbnRocyA9ICdtb250aHMnLFxuICBXZWVrcyA9ICd3ZWVrcycsXG4gIERheXMgPSAnZGF5cycsXG4gIEhvdXJzID0gJ2hvdXJzJyxcbiAgTWludXRlcyA9ICdtaW51dGVzJyxcbiAgU2Vjb25kcyA9ICdzZWNvbmRzJyxcbn1cblxuLyoqXG4gKiBUaGUgb3B0aW9uIGZvciBzcGVjaWZ5aW5nIHdoaWNoIHZhbHVlcyB0byBpbmNsdWRlIGZvciBmaWx0ZXJpbmcuXG4gKi9cbmV4cG9ydCBlbnVtIEZpbHRlck51bGxPcHRpb24ge1xuICBOdWxsVmFsdWVzID0gJ251bGx2YWx1ZXMnLFxuICBOb25OdWxsVmFsdWVzID0gJ25vbm51bGx2YWx1ZXMnLFxuICBBbGxWYWx1ZXMgPSAnYWxsdmFsdWVzJyxcbn1cblxuLyoqXG4gKiBUaGUgdHlwZSBvZiBmaWx0ZXIgZG9tYWluXG4gKi9cbmV4cG9ydCBlbnVtIEZpbHRlckRvbWFpblR5cGUge1xuICBSZWxldmFudCA9ICdyZWxldmFudCcsXG4gIERhdGFiYXNlID0gJ2RhdGFiYXNlJyxcbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBlbnVtIGZvciBzcGVjaWZ5aW5nIHRoZSBzZWxlY3Rpb24gdHlwZSBmb3Igc2VsZWN0IG1hcmtzIGFwaS5cbiAqL1xuZXhwb3J0IGVudW0gU2VsZWN0aW9uVXBkYXRlVHlwZSB7XG4gIFJlcGxhY2UgPSAnc2VsZWN0LXJlcGxhY2UnLFxuICBBZGQgPSAnc2VsZWN0LWFkZCcsXG4gIFJlbW92ZSA9ICdzZWxlY3QtcmVtb3ZlJyxcbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBlbnVtIGZvciBzcGVjaWZ5aW5nIHRoZSBzZWxlY3Qgb3B0aW9uIGZvciB0aGUgc2VsZWN0IHR1cGxlcyBhcGkuXG4gKi9cbmV4cG9ydCBlbnVtIFNlbGVjdE9wdGlvbnMge1xuICBTaW1wbGUgPSAnc2VsZWN0LW9wdGlvbnMtc2ltcGxlJyxcbiAgVG9nZ2xlID0gJ3NlbGVjdC1vcHRpb25zLXRvZ2dsZScsXG4gIE1lbnUgPSAnc2VsZWN0LW9wdGlvbnMtbWVudScsIC8vIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGUgZXh0ZXJuYWwgY29udHJhY3RcbiAgUmFuZ2UgPSAnc2VsZWN0LW9wdGlvbnMtcmFuZ2UnLCAvLyBub3QgaW1wbGVtZW50ZWQgaW4gdGhlIGV4dGVybmFsIGNvbnRyYWN0XG4gIFNlYXJjaCA9ICdzZWxlY3Qtb3B0aW9ucy1zZWFyY2gnLCAvLyBub3QgaW1wbGVtZW50ZWQgaW4gdGhlIGV4dGVybmFsIGNvbnRyYWN0XG59XG5cbi8qKlxuICogSW50ZXJuYWwgZW51bSBmb3Igc3BlY2lmeWluZyB0aGUgaW5jbHVkZWQgdmFsdWVzIHR5cGUgZm9yIHJhbmdlIHNlbGVjdGlvbi5cbiAqL1xuZXhwb3J0IGVudW0gUXVhbnRpdGF0aXZlSW5jbHVkZWRWYWx1ZXMge1xuICBJbmNsdWRlTnVsbCA9ICdpbmNsdWRlLW51bGwnLFxuICBJbmNsdWRlTm9uTnVsbCA9ICdpbmNsdWRlLW5vbi1udWxsJyxcbiAgSW5jbHVkZUFsbCA9ICdpbmNsdWRlLWFsbCcsXG59XG5cbi8qKlxuICogSW50ZXJuYWwgZW51bSBmb3Igc3BlY2lmeWluZyBhIGhpZXJhcmNoaWNhbCBsZXZlbCBzZWxlY3Rpb24gc3RhdGUuXG4gKi9cbmV4cG9ydCBlbnVtIEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUge1xuICBBbGxTZWxlY3RlZCA9ICdhbGwtc2VsZWN0ZWQnLFxuICBOb25lU2VsZWN0ZWQgPSAnbm9uZS1zZWxlY3RlZCcsXG4gIFNvbWVTZWxlY3RlZCA9ICdzb21lLXNlbGVjdGVkJyxcbiAgVW5rbm93blNlbGVjdGVkID0gJ3Vua25vd24tc2VsZWN0ZWQnLFxufVxuXG4vKipcbiAqIFR5cGUgb2YgbWFyayBmb3IgYSBnaXZlbiBtYXJrcyBjYXJkIGluIGEgdml6LlxuICovXG5leHBvcnQgZW51bSBNYXJrVHlwZSB7XG4gIEJhciA9ICdiYXInLFxuICBMaW5lID0gJ2xpbmUnLFxuICBBcmVhID0gJ2FyZWEnLFxuICBTcXVhcmUgPSAnc3F1YXJlJyxcbiAgQ2lyY2xlID0gJ2NpcmNsZScsXG4gIFNoYXBlID0gJ3NoYXBlJyxcbiAgVGV4dCA9ICd0ZXh0JyxcbiAgTWFwID0gJ21hcCcsXG4gIFBpZSA9ICdwaWUnLFxuICBHYW50dEJhciA9ICdnYW50dC1iYXInLFxuICBQb2x5Z29uID0gJ3BvbHlnb24nLFxuICBIZWF0bWFwID0gJ2hlYXRtYXAnLFxuICBWaXpFeHRlbnNpb24gPSAndml6LWV4dGVuc2lvbicsXG59XG5cbi8qKlxuICogSW50ZXJuYWwgZW51bSBmb3Igc3BlY2lmeWluZyB0aGUgdHlwZSBvZiBmaWx0ZXJcbiAqL1xuZXhwb3J0IGVudW0gRmlsdGVyVHlwZSB7XG4gIENhdGVnb3JpY2FsID0gJ2NhdGVnb3JpY2FsJyxcbiAgUmFuZ2UgPSAncmFuZ2UnLFxuICBSZWxhdGl2ZURhdGUgPSAncmVsYXRpdmVEYXRlJyxcbiAgSGllcmFyY2hpY2FsID0gJ2hpZXJhcmNoaWNhbCcsXG59XG5cbi8qKlxuICogSW50ZXJuYWwgZW51bSBmb3Igc3BlY2lmeWluZyB0aGUgRGF0ZVJhbmdlVHlwZSBvZiBhIHJlbGF0aXZlIGRhdGUgZmlsdGVyXG4gKi9cbmV4cG9ydCBlbnVtIERhdGVSYW5nZVR5cGUge1xuICAvKipcbiAgICogUmVmZXJzIHRvIHRoZSBsYXN0IGRheSwgd2VlaywgbW9udGgsIGV0Yy4gb2YgdGhlIGRhdGUgcGVyaW9kLlxuICAgKi9cbiAgTGFzdCA9ICdsYXN0JyxcbiAgLyoqXG4gICAqIFJlZmVycyB0byB0aGUgbGFzdCBOIGRheXMsIHdlZWtzLCBtb250aHMsIGV0Yy4gb2YgdGhlIGRhdGUgcGVyaW9kLlxuICAgKi9cbiAgTGFzdE4gPSAnbGFzdE4nLFxuICAvKipcbiAgICogUmVmZXJzIHRvIHRoZSBuZXh0IGRheSwgd2VlaywgbW9udGgsIGV0Yy4gb2YgdGhlIGRhdGUgcGVyaW9kLlxuICAgKi9cbiAgTmV4dCA9ICduZXh0JyxcbiAgLyoqXG4gICAqIFJlZmVycyB0byB0aGUgbmV4dCBOIGRheXMsIHdlZWtzLCBtb250aHMsIGV0Yy4gb2YgdGhlIGRhdGUgcGVyaW9kLlxuICAgKi9cbiAgTmV4dE4gPSAnbmV4dE4nLFxuICAvKipcbiAgICogUmVmZXJzIHRvIHRoZSBjdXJyZW50IGRheSwgd2VlaywgbW9udGgsIGV0Yy4gb2YgdGhlIGRhdGUgcGVyaW9kLlxuICAgKi9cbiAgQ3VycmVudCA9ICdjdXJyZW50JyxcbiAgLyoqXG4gICAqIFJlZmVycyB0byBldmVyeXRoaW5nIHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhlIGN1cnJlbnQgZGF5LCB3ZWVrLCBtb250aCwgZXRjLiBvZiB0aGUgZGF0ZSBwZXJpb2QuXG4gICAqL1xuICBUb0RhdGUgPSAndG9EYXRlJyxcbn1cblxuLyoqXG4gKiBVc2VkIHRvIGRldGVybWluZSBpZiB0aGUgbGF1bmNoaW5nIG9mIGFuIGV4dGVuc2lvbiBkaWFsb2cgc3VjY2VlZGVkIG9yIGZhaWxlZC5cbiAqL1xuZXhwb3J0IGVudW0gRXh0ZW5zaW9uRGlhbG9nUmVzdWx0IHtcbiAgRGlhbG9nQWxyZWFkeU9wZW4gPSAnZGlhbG9nLWFscmVhZHktb3BlbicsXG4gIEludmFsaWREb21haW4gPSAnaW52YWxpZC1kb21haW4nLFxuICBTdWNjZXNzID0gJ3N1Y2Nlc3MnLFxufVxuXG4vKipcbiAqIFVzZWQgdG8gb3B0aW1pemUgdGhlIGdldFN1bW1hcnlEYXRhL2dldFVuZGVybHlpbmdUYWJsZURhdGEgcmVzdWx0c1xuICogTWFwcGVkIGZyb20gZXh0ZXJuYWwgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb25cbiAqL1xuZXhwb3J0IGVudW0gQXBpU2hvd0RhdGFUYWJsZUZvcm1hdCB7XG4gIE5hdGl2ZVZhbHVlc09ubHkgPSAnbmF0aXZlLXZhbHVlcy1vbmx5JyxcbiAgRm9ybWF0dGVkVmFsdWVzT25seSA9ICdmb3JtYXR0ZWQtdmFsdWVzLW9ubHknLFxuICBOYXRpdmVBbmRGb3JtYXR0ZWRWYWx1ZXMgPSAnbmF0aXZlLWFuZC1mb3JtYXR0ZWQtdmFsdWVzJyxcbn1cblxuLyoqXG4gKiBVc2VkIHRvIGRlbm90ZSB0aGUgc2VjdGlvbnMgb2YgZm9ybWF0dGluZyB3aXRoaW4gdGFibGVhdVxuICovXG5leHBvcnQgY29uc3QgZW51bSBDbGFzc05hbWVLZXkge1xuICBXb3Jrc2hlZXRUaXRsZSA9ICd0YWJsZWF1LXdvcmtzaGVldC10aXRsZScsXG4gIFdvcmtzaGVldCA9ICd0YWJsZWF1LXdvcmtzaGVldCcsXG4gIFRvb2x0aXAgPSAndGFibGVhdS10b29sdGlwJyxcbiAgU3RvcnlUaXRsZSA9ICd0YWJsZWF1LXN0b3J5LXRpdGxlJyxcbiAgRGFzaGJvYXJkVGl0bGUgPSAndGFibGVhdS1kYXNoYm9hcmQtdGl0bGUnLFxuICBQYW5lID0gJ3RhYmxlYXUtcGFuZScsXG4gIFJvd0RpdmlkZXJzID0gJ3RhYmxlYXUtcm93LWRpdmlkZXJzJyxcbiAgQ29sdW1uRGl2aWRlcnMgPSAndGFibGVhdS1jb2x1bW4tZGl2aWRlcnMnLFxufVxuXG4vKipcbiAqIFVzZWQgdG8gc2V0IHBhZ2Ugc2l6ZSBmb3IgZXhwb3J0IGxheW91dCBvcHRpb25zLlxuICovXG5leHBvcnQgZW51bSBQYWdlU2l6ZU9wdGlvbiB7XG4gIExldHRlciA9ICdsZXR0ZXInLFxuICBMZWdhbCA9ICdsZWdhbCcsXG4gIE5vdGUgPSAnbm90ZScsXG4gIEZvbGlvID0gJ2ZvbGlvJyxcbiAgVGFibG9pZCA9ICd0YWJsb2lkJyxcbiAgTGVkZ2VyID0gJ2xlZGdlcicsXG4gIFN0YXRlbWVudCA9ICdzdGF0ZW1lbnQnLFxuICBFeGVjdXRpdmUgPSAnZXhlY3V0aXZlJyxcbiAgQTMgPSAnYTMnLFxuICBBNCA9ICdhNCcsXG4gIEE1ID0gJ2E1JyxcbiAgQjQgPSAnYjQnLFxuICBCNSA9ICdiNScsXG4gIFF1YXJ0byA9ICdxdWFydG8nLFxuICBVbnNwZWNpZmllZCA9ICd1bnNwZWNpZmllZCcsXG59XG5cbi8qKlxuICogVXNlZCB0byBzZXQgdGhlIHBhZ2Ugb3JpZW50YXRpb24gbW9kZSBmb3IgZXhwb3J0IGxheW91dCBvcHRpb25zLlxuICovXG5leHBvcnQgZW51bSBQYWdlT3JpZW50YXRpb24ge1xuICBQcmludGVyID0gJ3ByaW50ZXInLFxuICBQb3J0cmFpdCA9ICdwb3J0cmFpdCcsXG4gIExhbmRzY2FwZSA9ICdsYW5kc2NhcGUnLFxufVxuXG4vKipcbiAqIFVzZWQgdG8gc2V0IHNjYWxlIG1vZGUgZm9yIGV4cG9ydCBsYXlvdXQgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGVudW0gU2NhbGVNb2RlIHtcbiAgU2NhbGVBdXRvID0gJ2F1dG8nLFxuICBTY2FsZVBlcmNlbnRhZ2UgPSAncGVyY2VudCcsXG4gIFNjYWxlRml0UGFnZXMgPSAnZml0LXBhZ2VzJyxcbn1cblxuLyoqXG4gKiBVc2VkIGJ5IHNldEZpdEFuZFNjYWxlVmFsdWVzIHRvIHNjYWxlIHBlcmNlbnQgdmFsdWVzXG4gKi9cbmV4cG9ydCBlbnVtIFBhZ2VTY2FsaW5nT3B0aW9uIHtcbiAgU2NhbGVQY3RBdXRvID0gJ2F1dG8nLFxuICBTY2FsZVBjdDQwMCA9ICdwY3Q0MDAnLFxuICBTY2FsZVBjdDIwMCA9ICdwY3QyMDAnLFxuICBTY2FsZVBjdDEwMCA9ICdwY3QxMDAnLFxuICBTY2FsZVBjdDkwID0gJ3BjdDkwJyxcbiAgU2NhbGVQY3Q4MCA9ICdwY3Q4MCcsXG4gIFNjYWxlUGN0NzUgPSAncGN0NzUnLFxuICBTY2FsZVBjdDYwID0gJ3BjdDYwJyxcbiAgU2NhbGVQY3Q1MCA9ICdwY3Q1MCcsXG4gIFNjYWxlUGN0MjUgPSAncGN0MjUnLFxufVxuXG4vKipcbiAqIFVzZWQgYnkgc2V0Rml0QW5kU2NhbGVWYWx1ZXMgdG8gc2NhbGUgZml0IHBhZ2UgdmFsdWVzXG4gKi9cbmV4cG9ydCBlbnVtIEZpdFBhZ2VzIHtcbiAgRml0T25lSGlnaCA9ICdmaXQweDEnLFxuICBGaXRUd29IaWdoID0gJ2ZpdDB4MicsXG4gIEZpdE9uZVdpZGUgPSAnZml0MXgwJyxcbiAgRml0VHdvV2lkZSA9ICdmaXQyeDAnLFxufVxuXG4vKipcbiAqIFVzZWQgYnkgZ2V0VmlzdWFsU3BlY2lmaWNhdGlvbkFzeW5jXG4gKi9cbmV4cG9ydCBlbnVtIEVuY29kaW5nVHlwZSB7XG4gIENvbG9yID0gJ2NvbG9yJyxcbiAgU2l6ZSA9ICdzaXplJyxcbiAgTGFiZWwgPSAnbGFiZWwnLFxuICBEZXRhaWwgPSAnZGV0YWlsJyxcbiAgVG9vbHRpcCA9ICd0b29sdGlwJyxcbiAgU2hhcGUgPSAnc2hhcGUnLFxuICBQYXRoID0gJ3BhdGgnLFxuICBBbmdsZSA9ICdhbmdsZScsXG4gIEdlb21ldHJ5ID0gJ2dlb21ldHJ5JyxcbiAgQ3VzdG9tID0gJ2N1c3RvbScsXG59XG5cbmV4cG9ydCBlbnVtIFB1bHNlVGltZURpbWVuc2lvbiB7XG4gIFRvZGF5ID0gJ1RvZGF5JyxcbiAgWWVzdGVyZGF5ID0gJ1llc3RlcmRheScsXG4gIFdlZWtUb0RhdGUgPSAnV2Vla1RvRGF0ZScsXG4gIExhc3RXZWVrID0gJ0xhc3RXZWVrJyxcbiAgTW9udGhUb0RhdGUgPSAnTW9udGhUb0RhdGUnLFxuICBMYXN0TW9udGggPSAnTGFzdE1vbnRoJyxcbiAgUXVhcnRlclRvRGF0ZSA9ICdRdWFydGVyVG9EYXRlJyxcbiAgTGFzdFF1YXJ0ZXIgPSAnTGFzdFF1YXJ0ZXInLFxuICBZZWFyVG9EYXRlID0gJ1llYXJUb0RhdGUnLFxuICBMYXN0WWVhciA9ICdMYXN0WWVhcicsXG59XG5cbmV4cG9ydCBlbnVtIFB1bHNlRXJyb3JNZXNzYWdlVmlzaWJpbGl0eSB7XG4gIFZpc2libGUgPSAndmlzaWJsZScsXG4gIEhpZGRlbiA9ICdoaWRkZW4nLFxuICBTdXBwcmVzc2VkID0gJ3N1cHByZXNzZWQnLFxufVxuIiwiZXhwb3J0IGVudW0gTm90aWZpY2F0aW9uSWQge1xuICBDdXN0b21NYXJrQ29udGV4dE1lbnVDbGlja2VkID0gJ2N1c3RvbS1tYXJrLWNvbnRleHQtbWVudS1jbGlja2VkJyxcbiAgQ29udGV4dE1lbnVDbGljayA9ICdjb250ZXh0LW1lbnUtY2xpY2snLFxuICBDdXN0b21WaWV3UmVtb3ZlZCA9ICdjdXN0b20tdmlldy1yZW1vdmVkJyxcbiAgQ3VzdG9tVmlld1NhdmVkID0gJ2N1c3RvbS12aWV3LXNhdmVkJyxcbiAgQ3VzdG9tVmlld1NldERlZmF1bHQgPSAnY3VzdG9tLXZpZXctc2V0LWRlZmF1bHQnLFxuICBDdXN0b21WaWV3c0xvYWRlZCA9ICdjdXN0b20tdmlld3MtbG9hZGVkJyxcbiAgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZCA9ICdkYXNoYm9hcmQtbGF5b3V0LWNoYW5nZWQnLFxuICBFZGl0QnV0dG9uQ2xpY2tlZCA9ICdlZGl0LWJ1dHRvbi1jbGlja2VkJyxcbiAgRWRpdEluRGVza3RvcEJ1dHRvbkNsaWNrZWQgPSAnZWRpdC1pbi1kZXNrdG9wLWJ1dHRvbi1jbGlja2VkJyxcbiAgRXh0ZW5zaW9uRGlhbG9nVXBkYXRlID0gJ2V4dGVuc2lvbi1kaWFsb2ctdXBkYXRlJyxcbiAgRXh0ZW5zaW9uRGlhbG9nTWVzc2FnZSA9ICdleHRlbnNpb24tZGlhbG9nLW1lc3NhZ2UnLFxuICBGaWx0ZXJDaGFuZ2VkID0gJ2ZpbHRlci1jaGFuZ2VkJyxcbiAgRmlyc3RWaXpTaXplS25vd24gPSAnZmlyc3Qtdml6LXNpemUta25vd24nLFxuICBGaXJzdFB1bHNlTWV0cmljU2l6ZUtub3duID0gJ2ZpcnN0LXB1bHNlLW1ldHJpYy1zaXplLWtub3duJyxcbiAgUGFyYW1ldGVyQ2hhbmdlZCA9ICdwYXJhbWV0ZXItY2hhbmdlZCcsXG4gIFB1bHNlRXJyb3IgPSAncHVsc2UtZXJyb3InLFxuICBQdWxzZUZpbHRlcnNDaGFuZ2VkID0gJ3B1bHNlLWZpbHRlcnMtY2hhbmdlZCcsXG4gIFB1bHNlTWV0cmljU2l6ZUNoYW5nZWQgPSAncHVsc2UtbWV0cmljLXNpemUtY2hhbmdlZCcsXG4gIFB1bHNlSW5zaWdodERpc2NvdmVyZWQgPSAncHVsc2UtaW5zaWdodC1kaXNjb3ZlcmVkJyxcbiAgUHVsc2VJbnRlcmFjdGl2ZSA9ICdwdWxzZS1pbnRlcmFjdGl2ZScsXG4gIFB1bHNlVGltZURpbWVuc2lvbkNoYW5nZWQgPSAncHVsc2UtdGltZS1kaW1lbnNpb24tY2hhbmdlZCcsXG4gIFB1bHNlVXJsQ2hhbmdlZCA9ICdwdWxzZS11cmwtY2hhbmdlZCcsXG4gIFNlbGVjdGVkTWFya3NDaGFuZ2VkID0gJ3NlbGVjdGVkLW1hcmtzLWNoYW5nZWQnLFxuICBTZXR0aW5nc0NoYW5nZWQgPSAnc2V0dGluZ3MtY2hhbmdlZCcsXG4gIFN1bW1hcnlEYXRhQ2hhbmdlZCA9ICdzdW1tYXJ5LWRhdGEtY2hhbmdlZCcsXG4gIFRlc3RDb252ZXJzaW9uTm90aWZpY2F0aW9uID0gJ3Rlc3QtY29udmVyc2lvbi1ub3RpZmljYXRpb24nLFxuICBUb29sYmFyU3RhdGVDaGFuZ2VkID0gJ3Rvb2xiYXItc3RhdGUtY2hhbmdlZCcsXG4gIFZpekludGVyYWN0aXZlID0gJ3Zpei1pbnRlcmFjdGl2ZScsXG4gIEFza0RhdGFJbnRlcmFjdGl2ZSA9ICdhc2stZGF0YS1pbnRlcmFjdGl2ZScsXG4gIFdvcmtib29rUmVhZHlUb0Nsb3NlID0gJ3dvcmtib29rLXJlYWR5LXRvLWNsb3NlJyxcbiAgV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZCA9ICd3b3JrYm9vay1mb3JtYXR0aW5nLWNoYW5nZWQnLFxuICBXb3JrYm9va1B1Ymxpc2hlZCA9ICd3b3JrYm9vay1wdWJsaXNoZWQnLFxuICBXb3JrYm9va1B1Ymxpc2hlZEFzID0gJ3dvcmtib29rLXB1Ymxpc2hlZC1hcycsXG4gIFdvcmtzaGVldEZvcm1hdHRpbmdDaGFuZ2VkID0gJ3dvcmtzaGVldC1mb3JtYXR0aW5nLWNoYW5nZWQnLFxuICBVcmxBY3Rpb24gPSAndXJsLWFjdGlvbicsXG4gIFRhYlN3aXRjaGVkID0gJ3RhYi1zd2l0Y2hlZCcsXG4gIFN0b3J5UG9pbnRTd2l0Y2hlZCA9ICdzdG9yeS1wb2ludC1zd2l0Y2hlZCcsXG4gIFJlYWR5VG9SZWNlaXZlQXV0aFRva2VuID0gJ3JlYWR5LXRvLXJlY2VpdmUtYXV0aC10b2tlbicsXG59XG4iLCIvLyBQTEVBU0UgS0VFUCBJTiBBTFBIQUJFVElDQUwgT1JERVIuIFRoaXMgaGVscHMgd2l0aCB2aXN1YWxseSBmaW5kaW5nIGVudHJpZXMsIGtub3dpbmcgd2hlcmUgdG8gcHV0XG4vLyBuZXcgb25lcywgYW5kIG1lcmdlIGNvbmZsaWN0cy5cbmV4cG9ydCBlbnVtIFBhcmFtZXRlcklkIHtcbiAgQWN0aXZlVGFibGVzSW5mbyA9ICdhY3RpdmUtdGFibGVzLWluZm8nLFxuICBBbmNob3JEYXRlID0gJ2FuY2hvci1kYXRlJyxcbiAgQW5ub3RhdGVFbnVtID0gJ2Fubm90YXRlLWVudW0nLFxuICBBbm5vdGF0aW9uTGlzdCA9ICdhbm5vdGF0aW9uLWxpc3QnLFxuICBBcHBseVdvcmtzaGVldEZvcm1hdHRpbmcgPSAnYXBwbHktd29ya3NoZWV0LWZvcm1hdHRpbmcnLFxuXG4gIENhdGVnb3JpY2FsRG9tYWluID0gJ2NhdGVnb3JpY2FsLWRvbWFpbicsXG4gIENsaWNrVGhyb3VnaEVuYWJsZWQgPSAnY2xpY2stdGhyb3VnaC1lbmFibGVkJyxcbiAgQ29sdW1ucyA9ICdjb2x1bW5zJyxcbiAgQ29sdW1uc1RvSW5jbHVkZSA9ICdjb2x1bW5zLXRvLWluY2x1ZGUnLFxuICBDb2x1bW5zVG9JbmNsdWRlQnlJZCA9ICdjb2x1bW5zLXRvLWluY2x1ZGUtYnktaWQnLFxuICBDb25uZWN0aW9uRGVzY3JpcHRpb25TdW1tYXJpZXMgPSAnY29ubmVjdGlvbi1kZXNjcmlwdGlvbi1zdW1tYXJpZXMnLFxuICBDdXJyZW50U2hlZXRUeXBlID0gJ2N1cnJlbnQtc2hlZXQtdHlwZScsXG4gIEN1c3RvbVZpZXcgPSAnY3VzdG9tLXZpZXcnLFxuICBDdXN0b21WaWV3SXNEZWZhdWx0ID0gJ2N1c3RvbS12aWV3LWlzLWRlZmF1bHQnLFxuICBDdXN0b21WaWV3SXNQdWJsaWMgPSAnY3VzdG9tLXZpZXctaXMtcHVibGljJyxcbiAgQ3VzdG9tVmlld0x1aWQgPSAnY3VzdG9tLXZpZXctbHVpZCcsXG4gIEN1c3RvbVZpZXdOYW1lID0gJ2N1c3RvbS12aWV3LW5hbWUnLFxuICBDdXN0b21WaWV3cyA9ICdjdXN0b20tdmlld3MnLFxuXG4gIERhc2hib2FyZCA9ICdkYXNoYm9hcmQnLFxuICBEYXNoYm9hcmRGaWx0ZXJzID0gJ2Rhc2hib2FyZC1maWx0ZXJzJyxcbiAgRGFzaGJvYXJkTmFtZSA9ICdkYXNoYm9hcmQnLFxuICBEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUgPSAnZGFzaGJvYXJkLW9iamVjdC1wb3NpdGlvbi1hbmQtc2l6ZS11cGRhdGUnLFxuICBEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGVMaXN0ID0gJ2Rhc2hib2FyZC1vYmplY3QtcG9zaXRpb24tYW5kLXNpemUtdXBkYXRlLWxpc3QnLFxuICBEYXRhUm93SW5kZXggPSAnZGF0YS1yb3ctaW5kZXgnLFxuICBEYXRhU2NoZW1hID0gJ2RhdGEtc2NoZW1hJyxcbiAgRGF0YVNvdXJjZSA9ICdkYXRhLXNvdXJjZScsXG4gIERhdGFTb3VyY2VEYXRhVGFibGUgPSAnZGF0YS1zb3VyY2UtZGF0YS10YWJsZScsXG4gIERhdGFTb3VyY2VJZCA9ICdkYXRhLXNvdXJjZS1pZCcsXG4gIERhdGFTb3VyY2VOYW1lID0gJ2RhdGEtc291cmNlLW5hbWUnLFxuICBEYXRhVGFibGUgPSAnZGF0YS10YWJsZScsXG4gIERhdGFUYWJsZVJlYWRlciA9ICdkYXRhLXRhYmxlLXJlYWRlcicsXG4gIERhdGVSYW5nZVR5cGUgPSAnZGF0ZS1yYW5nZS10eXBlJyxcbiAgRGVsZXRlQ291bnQgPSAnZGVsZXRlLWNvdW50JyxcbiAgRGVsdGFUaW1lTXMgPSAnZGVsdGEtdGltZS1tcycsXG4gIERpbVZhbFNlbGVjdGlvbk1vZGVscyA9ICdkaW1lbnNpb25WYWx1ZVNlbGVjdGlvbk1vZGVscycsXG4gIERvbWFpblR5cGUgPSAnZG9tYWluLXR5cGUnLFxuXG4gIEVtYmVkZGluZ0Fic3RyYWN0UXVlcnkgPSAnZW1iZWRkaW5nLWFic3RyYWN0LXF1ZXJ5JyxcbiAgRW1iZWRkaW5nQm9vdHN0cmFwSW5mbyA9ICdlbWJlZGRpbmctYm9vdHN0cmFwLWluZm8nLFxuICBFbmNvZGluZ1R5cGUgPSAnZW5jb2RpbmctdHlwZScsXG4gIEV4cG9ydENyb3NzdGFiU2hlZXRNYXAgPSAnZXhwb3J0LWNyb3NzdGFiLXNoZWV0LW1hcCcsXG4gIEV4cG9ydEZpbGUgPSAnZXhwb3J0LWZpbGUnLFxuICBFeHBvcnRPcmlnaW5VcmwgPSAnZXhwb3J0LW9yaWdpbi11cmwnLFxuICBFeHBvcnRQZGZPcHRpb25zID0gJ2V4cG9ydC1wZGYtb3B0aW9ucycsXG4gIEV4dGVuc2lvbkJvb3RzdHJhcEluZm8gPSAnZXh0ZW5zaW9uLWJvb3RzdHJhcC1pbmZvJyxcbiAgRXh0ZW5zaW9uQ29udGV4dE1lbnVJZHMgPSAnZXh0ZW5zaW9uLWNvbnRleHQtbWVudS1pZHMnLFxuICBFeHRlbnNpb25EaWFsb2dIID0gJ2V4dGVuc2lvbi1kaWFsb2ctaGVpZ2h0JyxcbiAgRXh0ZW5zaW9uRGlhbG9nTWVzc2FnZSA9ICdleHRlbnNpb24tZGlhbG9nLW1lc3NhZ2UnLFxuICBFeHRlbnNpb25EaWFsb2dQYXlsb2FkID0gJ2V4dGVuc2lvbi1kaWFsb2ctcGF5bG9hZCcsXG4gIEV4dGVuc2lvbkRpYWxvZ1Jlc3VsdCA9ICdleHRlbnNpb24tZGlhbG9nLXJlc3VsdCcsXG4gIEV4dGVuc2lvbkRpYWxvZ1N0eWxlID0gJ2V4dGVuc2lvbi1kaWFsb2ctc3R5bGUnLFxuICBFeHRlbnNpb25EaWFsb2dVcmwgPSAnZXh0ZW5zaW9uLWRpYWxvZy11cmwnLFxuICBFeHRlbnNpb25EaWFsb2dXID0gJ2V4dGVuc2lvbi1kaWFsb2ctd2lkdGgnLFxuICBFeHRlbnNpb25Mb2NhdG9yID0gJ2V4dGVuc2lvbi1sb2NhdG9yJyxcbiAgRXh0ZW5zaW9uU2V0dGluZ3NJbmZvID0gJ2V4dGVuc2lvbi1zZXR0aW5ncy1pbmZvJyxcbiAgRXh0ZW5zaW9uWm9uZUlkID0gJ2V4dGVuc2lvbi16b25lLWlkJyxcbiAgRXh0ZXJuYWxNZW51RGVzY3JpcHRpb24gPSAnZXh0ZXJuYWwtbWVudS1kZXNjcmlwdGlvbicsXG4gIEV4dGVybmFsTWVudUhlYWRlciA9ICdleHRlcm5hbC1tZW51LWhlYWRlcicsXG4gIEV4dGVybmFsTWVudUl0ZW1EaXNwbGF5TmFtZSA9ICdleHRlcm5hbC1tZW51LWl0ZW0tZGlzcGxheS1uYW1lJyxcbiAgRXh0ZXJuYWxNZW51SXRlbUlkID0gJ2V4dGVybmFsLW1lbnUtaXRlbS1pZCcsXG5cbiAgRmllbGQgPSAnZmllbGQnLFxuICBGaWVsZENvdW50ID0gJ2ZpZWxkLWNvdW50JyxcbiAgRmllbGRJZCA9ICdmaWVsZC1pZCcsXG4gIEZpZWxkTmFtZSA9ICdmaWVsZC1uYW1lJyxcbiAgRmlsdGVyTGV2ZWxzID0gJ2ZpbHRlci1sZXZlbHMnLFxuICBGaWx0ZXJSYW5nZU1heCA9ICdmaWx0ZXItcmFuZ2UtbWF4JyxcbiAgRmlsdGVyUmFuZ2VNaW4gPSAnZmlsdGVyLXJhbmdlLW1pbicsXG4gIEZpbHRlclJhbmdlTnVsbE9wdGlvbiA9ICdmaWx0ZXItcmFuZ2UtbnVsbC1vcHRpb24nLFxuICBGaWx0ZXJVcGRhdGVUeXBlID0gJ2ZpbHRlci11cGRhdGUtdHlwZScsXG4gIEZpbHRlclZhbHVlcyA9ICdmaWx0ZXItdmFsdWVzJyxcbiAgRm9udE5hbWVMaXN0SXRlbXMgPSAnZm9udC1uYW1lLWxpc3QtaXRlbXMnLFxuICBGb3JtYXR0ZWRUZXh0ID0gJ2Zvcm1hdHRlZC10ZXh0JyxcbiAgRnVuY3Rpb25OYW1lID0gJ2Z1bmN0aW9uLW5hbWUnLFxuICBGcm9tSW5kZXggPSAnZnJvbS1pbmRleCcsXG5cbiAgSGllclZhbFNlbGVjdGlvbk1vZGVscyA9ICdoaWVyYXJjaGljYWxWYWx1ZVNlbGVjdGlvbk1vZGVscycsXG4gIEhpZ2hsaWdodGVkRGF0YSA9ICdoaWdobGlnaHRlZC1kYXRhJyxcbiAgSG92ZXJUdXBsZUludGVyYWN0aW9uID0gJ2hvdmVyLXR1cGxlLWludGVyYWN0aW9uJyxcblxuICBJZ25vcmVBbGlhc2VzID0gJ2lnbm9yZS1hbGlhc2VzJyxcbiAgSWdub3JlU2VsZWN0aW9uID0gJ2lnbm9yZS1zZWxlY3Rpb24nLFxuICBJbmNsdWRlQWxsQ29sdW1ucyA9ICdpbmNsdWRlLWFsbC1jb2x1bW5zJyxcbiAgSW52YWxpZEFnZ0ZpZWxkTmFtZSA9ICdpbnZhbGlkLWFnZy1maWVsZC1uYW1lJyxcbiAgSW52YWxpZERhdGVzID0gJ2ludmFsaWQtZGF0ZXMnLFxuICBJbnZhbGlkRmllbGRDYXB0aW9uID0gJ2ludmFsaWQtZmllbGQtY2FwdGlvbicsXG4gIEludmFsaWRGaWVsZHMgPSAnaW52YWxpZC1maWVsZHMnLFxuICBJbnZhbGlkVmFsdWVzID0gJ2ludmFsaWQtdmFsdWVzJyxcbiAgSXNBbmFseXRpY3NBc3Npc3RhbnRBdmFpbGFibGUgPSAnaXMtYW5hbHl0aWNzLWFzc2lzdGFudC1hdmFpbGFibGUnLFxuICBJc0V4Y2x1ZGVNb2RlID0gJ2lzLWV4Y2x1ZGUnLFxuICBJc0V4dGVuc2lvbkRpYWxvZyA9ICdpcy1leHRlbnNpb24tZGlhbG9nJyxcbiAgSXNGcm9tQ2FsY0RpYWxvZyA9ICdpcy1mcm9tLWNhbGMtZGlhbG9nJyxcblxuICBKb2luRGVzY3JpcHRpb24gPSAnam9pbi1kZXNjcmlwdGlvbicsXG5cbiAgTG9naWNhbFRhYmxlSWQgPSAnbG9naWNhbC10YWJsZS1pZCcsXG4gIExvZ2ljYWxUYWJsZUluZm9MaXN0ID0gJ2xvZ2ljYWwtdGFibGUtaW5mby1saXN0JyxcblxuICBNYXJrc0NhcmRJbmRleCA9ICdtYXJrcy1jYXJkLWluZGV4JyxcbiAgTWF4SGVpZ2h0ID0gJ21heC1oZWlnaHQnLFxuICBNYXhSb3dzID0gJ21heC1yb3dzJyxcbiAgTWF4V2lkdGggPSAnbWF4LXdpZHRoJyxcbiAgTWluSGVpZ2h0ID0gJ21pbi1oZWlnaHQnLFxuICBNaW5XaWR0aCA9ICdtaW4td2lkdGgnLFxuXG4gIFBhZ2VSb3dDb3VudCA9ICdwYWdlLXJvdy1jb3VudCcsXG4gIFBhcmFtZXRlckNhcHRpb24gPSAncGFyZW1ldGVyLWNhcHRpb24nLFxuICBQYXJhbWV0ZXJFcnJvciA9ICdwYXJhbWV0ZXItZXJyb3InLFxuICBQYXJhbWV0ZXJGaWVsZE5hbWUgPSAncGFyYW1ldGVyLWZpZWxkLW5hbWUnLFxuICBQYXJhbWV0ZXJJbmZvID0gJ3BhcmFtZXRlci1pbmZvJyxcbiAgUGFyYW1ldGVySW5mb3MgPSAncGFyYW1ldGVyLWluZm9zJyxcbiAgUGFyYW1ldGVyVmFsdWUgPSAncGFyYW1ldGVyLXZhbHVlJyxcbiAgUGVyaW9kVHlwZSA9ICdwZXJpb2QtdHlwZScsXG4gIFB1bHNlRmllbGROYW1lID0gJ2ZpZWxkTmFtZScsXG4gIFB1bHNlRmllbGROYW1lcyA9ICdmaWVsZE5hbWVzJyxcbiAgUHVsc2VGaWx0ZXJEb21haW5UeXBlID0gJ2RvbWFpblR5cGUnLFxuICBQdWxzZUZpbHRlckRvbWFpblNlYXJjaFRlcm0gPSAnc2VhcmNoVGVybScsXG4gIFB1bHNlUGFnZVNpemUgPSAncGFnZVNpemUnLFxuICBQdWxzZU5leHRQYWdlVG9rZW4gPSAnbmV4dFBhZ2VUb2tlbicsXG4gIFB1bHNlRmlsdGVycyA9ICdmaWx0ZXJzJyxcbiAgUHVsc2VUaW1lRGltZW5zaW9uID0gJ3RpbWVEaW1lbnNpb24nLFxuXG4gIFF1YW50aXRhdGl2ZURvbWFpbiA9ICdxdWFudGl0YXRpdmUtZG1haW4nLFxuICBRdWFudFJhbmdlU2VsZWN0aW9uTW9kZWxzID0gJ3F1YW50YXRpdmVSYW5nZVNlbGVjdGlvbk1vZGVscycsXG5cbiAgUmFuZ2VOID0gJ3JhbmdlLW4nLFxuICBSZXBsYXlTcGVlZCA9ICdyZXBsYXktc3BlZWQnLFxuXG4gIFNlbGVjdGVkRGF0YSA9ICdzZWxlY3RlZC1kYXRhJyxcbiAgU2VsZWN0ZWRTaGVldE5hbWVzID0gJ3NlbGVjdGVkLXNoZWV0LW5hbWVzJyxcbiAgU2VsZWN0aW9uID0gJ3NlbGVjdGlvbicsXG4gIFNlbGVjdGlvbkxpc3QgPSAnc2VsZWN0aW9uLWxpc3QnLFxuICBTZWxlY3Rpb25VcGRhdGVUeXBlID0gJ3NlbGVjdGlvblVwZGF0ZVR5cGUnLFxuICBTZWxlY3RUdXBsZXNJbnRlcmFjdGlvbiA9ICdzZWxlY3QtdHVwbGVzLWludGVyYWN0aW9uJyxcbiAgU2VuZE5vdGlmaWNhdGlvbnMgPSAnc2VuZC1ub3RpZmljYXRpb25zJyxcbiAgU2V0dGluZ3NWYWx1ZXMgPSAnc2V0dGluZ3MtdmFsdWVzJyxcbiAgU2hhcmVkRmlsdGVyU2hlZXRzID0gJ3NoYXJlZC1maWx0ZXItc2hlZXRzJyxcbiAgU2hhcmVkRmlsdGVyc0luZm8gPSAnc2hhcmVkLWZpbHRlcnMtaW5mbycsXG4gIFNoZWV0SWRlbnRpZmllciA9ICdzaGVldC1pZGVudGlmaWVyJyxcbiAgU2hlZXROYW1lID0gJ3NoZWV0LW5hbWUnLFxuICBTaGVldFBhdGggPSAnc2hlZXQtcGF0aCcsXG4gIFNob3VsZFJlZnJlc2hEUyA9ICdzaG91bGQtcmVmcmVzaC1kcycsXG4gIFNob3dEYXRhVGFibGVGb3JtYXQgPSAnc2hvdy1kYXRhLXRhYmxlLWZvcm1hdCcsXG4gIFN0YXJ0SW5kZXggPSAnc3RhcnQtaW5kZXgnLFxuICBTdGF0ZSA9ICdzdGF0ZScsXG4gIFN0b3J5UG9pbnRJbmRleCA9ICdzdG9yeS1wb2ludC1pbmRleCcsXG4gIFN0b3J5UG9pbnRJbmZvID0gJ3N0b3J5LXBvaW50LWluZm8nLFxuICBTd2l0Y2hUb1NoZWV0TmFtZSA9ICdzd2l0Y2gtdG8tc2hlZXQtbmFtZScsXG5cbiAgVGFyZ2V0UG9pbnQgPSAndGFyZ2V0LXBvaW50JyxcbiAgVGVzdENvbnZlcnNpb25QYXJhbWV0ZXIgPSAndGVzdC1jb252ZXJzaW9uLXBhcmFtZXRlcicsXG4gIFRleHQgPSAnZm9ybWF0dGVkLXRleHQnLFxuICBUb0luZGV4ID0gJ3RvLWluZGV4JyxcbiAgVG9vbHRpcENvbnRleHQgPSAndG9vbHRpcC1jb250ZXh0JyxcbiAgVG9vbHRpcFRleHRSZXF1ZXN0ID0gJ3Rvb2x0aXAtdGV4dC1yZXF1ZXN0JyxcbiAgVG9vbHRpcFRleHQgPSAndG9vbHRpcC10ZXh0JyxcblxuICBVbmRlcmx5aW5nRGF0YVRhYmxlID0gJ3VuZGVybHlpbmctZGF0YS10YWJsZScsXG4gIFVuZGVybHlpbmdTdW1tYXJ5RGF0YVRhYmxlID0gJ3VuZGVybHlpbmctc3VtbWFyeS1kYXRhLXRhYmxlJyxcbiAgVXJsID0gJ3VybCcsXG4gIFVzZVRhYkRlbGltaXRlcnMgPSAndXNlLXRhYi1kZWxpbWl0ZXJzJyxcblxuICBWaWV3RGF0YVRhYmxlQ2FjaGVJZCA9ICd2aWV3LWRhdGEtdGFibGUtY2FjaGUtaWQnLFxuICBWaWV3RGF0YVRhYmxlSWQgPSAndmlldy1kYXRhLXRhYmxlLWlkJyxcbiAgVmlzdWFsSWQgPSAndmlzdWFsLWlkJyxcbiAgVmlzdWFsU3BlY2lmaWNhdGlvbiA9ICd2aXN1YWwtc3BlY2lmaWNhdGlvbicsXG4gIFZpekFQSUlucHV0SnNvbiA9ICd2aXphcGktaW5wdXQtanNvbicsXG4gIFZpekFQSVN0YXRlV2l0aERhdGFNb2RlbCA9ICd2aXphcGktc3RhdGUtd2l0aC1kYXRhLW1vZGVsJyxcbiAgVml6QVBJU3RhdGVXYXJuaW5nTXNnID0gJ3ZpemFwaS1zdGF0ZS13YXJuaW5nLW1zZycsXG4gIFZpekFQSVNWRyA9ICd2aXphcGktc3ZnJyxcblxuICBXb3Jrc2hlZXROYW1lID0gJ3dvcmtzaGVldC1uYW1lJyxcbiAgV29ya3NoZWV0RmlsdGVycyA9ICd3b3Jrc2hlZXQtZmlsdGVycycsXG5cbiAgWm9uZUlkc1Zpc2liaWxpdHlNYXAgPSAnem9uZS1pZHMtdmlzaWJpbGl0eS1tYXAnLFxufVxuIiwiLy8gRGVjbGFyZSB0aGlzIGtleSB0eXBlIGFuZCBleHBvcnQgdGhlIE5vdGlmaWNhdGlvbklkIHRvIG1ha2UgdGhpcyBiZWhhdmUgbGlrZSBhIHN0cmluZyBlbnVtLlxuLy9cbi8vIFBMRUFTRSBLRUVQIElOIEFMUEhBQkVUSUNBTCBPUkRFUi4gVGhpcyBoZWxwcyB3aXRoIHZpc3VhbGx5IGZpbmRpbmcgZW50cmllcywga25vd2luZyB3aGVyZSB0byBwdXRcbi8vIG5ldyBvbmVzLCBhbmQgbWVyZ2UgY29uZmxpY3RzLlxuZXhwb3J0IGVudW0gVmVyYklkIHtcbiAgQWN0aXZhdGVOZXh0U3RvcnlQb2ludCA9ICdhY3RpdmF0ZS1uZXh0LXN0b3J5LXBvaW50JyxcbiAgQWN0aXZhdGVQcmV2aW91c1N0b3J5UG9pbnQgPSAnYWN0aXZhdGUtcHJldmlvdXMtc3RvcnktcG9pbnQnLFxuICBBY3RpdmF0ZVNoZWV0ID0gJ2FjdGl2YXRlU2hlZXQnLFxuICBBY3RpdmF0ZVN0b3J5UG9pbnQgPSAnYWN0aXZhdGUtc3RvcnktcG9pbnQnLFxuICBBZGRNYXJrc0NhcmRGaWVsZHMgPSAnYWRkLW1hcmtzLWNhcmQtZmllbGRzJyxcbiAgQXBwZW5kRXh0ZXJuYWxNZW51SXRlbSA9ICdhcHBlbmQtZXh0ZXJuYWwtbWVudS1pdGVtJyxcbiAgQXBwbHlDYXRlZ29yaWNhbEZpbHRlciA9ICdjYXRlZ29yaWNhbC1maWx0ZXInLFxuICBBcHBseVB1bHNlRmlsdGVycyA9ICdhcHBseS1wdWxzZS1maWx0ZXJzJyxcbiAgQXBwbHlQdWxzZVRpbWVEaW1lbnNpb24gPSAnYXBwbHktcHVsc2UtdGltZS1kaW1lbnNpb24nLFxuICBBcHBseVJhbmdlRmlsdGVyID0gJ3JhbmdlLWZpbHRlcicsXG4gIEFwcGx5UmVsYXRpdmVEYXRlRmlsdGVyID0gJ2FwcGx5LXJlbGF0aXZlLWRhdGUtRmlsdGVyJyxcbiAgQXV0aGVudGljYXRlID0gJ2F1dGhlbnRpY2F0ZScsXG5cbiAgQmxvY2tFeHRlbnNpb24gPSAnYmxvY2stZXh0ZW5zaW9uJyxcblxuICBDaGFuZ2VQYXJhbWV0ZXJWYWx1ZSA9ICdjaGFuZ2UtcGFyYW1ldGVyLXZhbHVlJyxcbiAgQ2hhbmdlU2hhcmVkRmlsdGVyID0gJ2NoYW5nZS1zaGFyZWQtZmlsdGVyJyxcbiAgQ2xlYXJBbGxQdWxzZUZpbHRlcnMgPSAnY2xlYXItYWxsLXB1bHNlLWZpbHRlcnMnLFxuICBDbGVhckZpbHRlciA9ICdjbGVhci1maWx0ZXInLFxuICBDbGVhclB1bHNlRmlsdGVycyA9ICdjbGVhci1wdWxzZS1maWx0ZXJzJyxcbiAgQ2xlYXJTZWxlY3RlZE1hcmtzID0gJ2NsZWFyLXNlbGVjdGVkLW1hcmtzJyxcbiAgQ2xvc2VEaWFsb2cgPSAnY2xvc2UtZGlhbG9nJyxcbiAgQ3JlYXRlQW5ub3RhdGlvbiA9ICdjcmVhdGUtYW5ub3RhdGlvbicsXG5cbiAgRGFzaGJvYXJkQ2F0ZWdvcmljYWxGaWx0ZXIgPSAnZGFzaGJvYXJkLWNhdGVnb3JpY2FsLWZpbHRlcicsXG4gIERpc3BsYXlEaWFsb2cgPSAnZGlzcGxheS1kaWFsb2cnLFxuICBEb3dubG9hZFdvcmtib29rID0gJ2Rvd25sb2FkLXdvcmtib29rJyxcblxuICBFZGl0QWxpYXNlc0RpYWxvZyA9ICdlZGl0LWFsaWFzZXMtZGlhbG9nJyxcbiAgRXhlY3V0ZUV4dGVybmFsTWVudUl0ZW0gPSAnZXhlY3V0ZS1leHRlcm5hbC1tZW51LWl0ZW0nLFxuICBFeHBvcnRDcm9zc3RhYiA9ICdleHBvcnQtY3Jvc3N0YWInLFxuICBFeHBvcnRDcm9zc3RhYkNzdkRvd25sb2FkID0gJ2V4cG9ydC1jcm9zc3RhYi1jc3YtZG93bmxvYWQnLFxuICBFeHBvcnRDcm9zc3RhYkV4Y2VsRG93bmxvYWQgPSAnZXhwb3J0LWNyb3NzdGFiLWV4Y2VsLWRvd25sb2FkJyxcbiAgRXhwb3J0RGF0YSA9ICdleHBvcnQtZGF0YScsXG4gIEV4cG9ydERhdGFEb3dubG9hZCA9ICdleHBvcnQtZGF0YS1kb3dubG9hZCcsXG4gIEV4cG9ydEltYWdlID0gJ2V4cG9ydC1pbWFnZScsXG4gIEV4cG9ydFBkZiA9ICdleHBvcnQtcGRmJyxcbiAgRXhwb3J0UGRmRG93bmxvYWQgPSAnZXhwb3J0LXBkZi1kb3dubG9hZCcsXG4gIEV4cG9ydFBvd2VycG9pbnQgPSAnZXhwb3J0LXBvd2VycG9pbnQnLFxuICBFeHBvcnRQb3dlcnBvaW50RG93bmxvYWQgPSAnZXhwb3J0LXBvd2VycG9pbnQtZG93bmxvYWQnLFxuXG4gIEZpbmRQYXJhbWV0ZXIgPSAnZmluZC1wYXJhbWV0ZXInLFxuXG4gIEdldEFjdGl2ZVRhYmxlcyA9ICdnZXQtYWN0aXZlLXRhYmxlcycsXG4gIEdldEFsbERhdGFTb3VyY2VzID0gJ2dldC1hbGwtZGF0YS1zb3VyY2VzJyxcbiAgR2V0QW5ub3RhdGlvbnMgPSAnZ2V0LWFubm90YXRpb25zJyxcbiAgR2V0Q2F0ZWdvcmljYWxEb21haW4gPSAnZ2V0LWNhdGVnb3JpY2FsLWRvbWFpbicsXG4gIEdldENvbm5lY3Rpb25EZXNjcmlwdGlvblN1bW1hcmllcyA9ICdnZXQtY29ubmVjdGlvbi1kZXNjcmlwdGlvbi1zdW1tYXJpZXMnLFxuICBHZXRDdXJyZW50U3JjID0gJ2dldC1jdXJyZW50LXNyYycsXG4gIEdldEN1c3RvbVZpZXdzID0gJ2dldC1jdXN0b20tdmlld3MnLFxuICBHZXREYXNoYm9hcmRGaWx0ZXJzID0gJ2dldC1kYXNoYm9hcmQtZmlsdGVycycsXG4gIEdldERhdGFTb3VyY2UgPSAnZ2V0LWRhdGFzb3VyY2UnLFxuICBHZXREYXRhU291cmNlRGF0YSA9ICdnZXQtZGF0YXNvdXJjZS1kYXRhJyxcbiAgR2V0RGF0YVNvdXJjZXMgPSAnZ2V0LWRhdGEtc291cmNlcycsXG4gIEdldERhdGFTdW1tYXJ5RGF0YSA9ICdnZXQtc3VtbWFyeS1kYXRhJyxcbiAgR2V0RGF0YVN1bW1hcnlEYXRhUmVhZGVyID0gJ2dldC1zdW1tYXJ5LWRhdGEtcmVhZGVyJyxcbiAgR2V0RGF0YVRhYmxlUmVhZGVyUGFnZSA9ICdnZXQtZGF0YS10YWJsZS1yZWFkZXItcGFnZScsXG4gIEdldEVtYmVkZGluZ0Fic3RyYWN0UXVlcnlXaXRoRGF0YU1vZGVsID0gJ2dldC1lbWJlZGRpbmctYWJzdHJhY3QtcXVlcnktd2l0aC1kYXRhLW1vZGVsJyxcbiAgR2V0RW1iZWRkaW5nQ2xpZW50SW5mbyA9ICdnZXQtZW1iZWRkaW5nLWNsaWVudC1pbmZvJyxcbiAgR2V0Vml6U3RhdGVXaXRoRGF0YU1vZGVsID0gJ2dldC12aXotc3RhdGUtd2l0aC1kYXRhLW1vZGVsJyxcbiAgR2V0RXhwb3J0Q3Jvc3N0YWJTaGVldE1hcCA9ICdnZXQtZXhwb3J0LWNyb3NzdGFiLXNoZWV0LW1hcCcsXG4gIEdldEV4cG9ydFBkZk9wdGlvbnMgPSAnZ2V0LWV4cG9ydC1wZGYtb3B0aW9ucycsXG4gIEdldEZpZWxkID0gJ2dldC1maWVsZCcsXG4gIEdldEZpZWxkQW5kRGF0YVNvdXJjZSA9ICdnZXQtZmllbGQtYW5kLWRhdGFzb3VyY2UnLFxuICBHZXRWaXN1YWxTcGVjaWZpY2F0aW9uID0gJ2dldC12aXN1YWwtc3BlY2lmaWNhdGlvbicsXG4gIEdldEZpbHRlcnMgPSAnZ2V0LWZpbHRlcnMnLFxuICBHZXRGb250cyA9ICdnZXQtZm9udHMnLFxuICBHZXRIaWdobGlnaHRlZE1hcmtzID0gJ2dldC1oaWdobGlnaHRlZC1tYXJrcycsXG4gIEdldEpvaW5EZXNjcmlwdGlvbiA9ICdnZXQtam9pbi1kZXNjcmlwdGlvbicsXG4gIEdldExvZ2ljYWxUYWJsZURhdGEgPSAnZ2V0LWxvZ2ljYWwtdGFibGUtZGF0YScsXG4gIEdldExvZ2ljYWxUYWJsZURhdGFSZWFkZXIgPSAnZ2V0LWxvZ2ljYWwtdGFibGUtZGF0YS1yZWFkZXInLFxuICBHZXRMb2dpY2FsVGFibGVzID0gJ2dldC1sb2dpY2FsLXRhYmxlcycsXG4gIEdldFBhcmFtZXRlcnNGb3JTaGVldCA9ICdnZXQtcGFyYW1ldGVycy1mb3Itc2hlZXQnLFxuICBHZXRQdWxzZUNhdGVnb3JpY2FsRG9tYWluID0gJ2dldC1wdWxzZS1jYXRlZ29yaWNhbC1kb21haW4nLFxuICBHZXRQdWxzZUZpbHRlcnMgPSAnZ2V0LXB1bHNlLWZpbHRlcnMnLFxuICBHZXRQdWxzZVRpbWVEaW1lbnNpb24gPSAnZ2V0LXB1bHNlLXRpbWUtZGltZW5zaW9uJyxcbiAgR2V0UmFuZ2VEb21haW4gPSAnZ2V0LXJhbmdlLWRvbWFpbicsXG4gIEdldFNlbGVjdGVkTWFya3MgPSAnZ2V0LXNlbGVjdGVkLW1hcmtzJyxcbiAgR2V0U2hhcmVkRmlsdGVyID0gJ2dldC1zaGFyZWQtZmlsdGVyJyxcbiAgR2V0VG9vbHRpcFRleHQgPSAnZ2V0LXRvb2x0aXAtdGV4dCcsXG4gIEdldFVuZGVybHlpbmdEYXRhID0gJ2dldC11bmRlcmx5aW5nLWRhdGEnLFxuICBHZXRVbmRlcmx5aW5nVGFibGVEYXRhID0gJ2dldC11bmRlcmx5aW5nLXRhYmxlLWRhdGEnLFxuICBHZXRVbmRlcmx5aW5nVGFibGVEYXRhUmVhZGVyID0gJ2dldC11bmRlcmx5aW5nLXRhYmxlLWRhdGEtcmVhZGVyJyxcbiAgR2V0VW5kZXJseWluZ1RhYmxlcyA9ICdnZXQtdW5kZXJseWluZy10YWJsZXMnLFxuXG4gIEhpZXJhcmNoaWNhbEZpbHRlciA9ICdoaWVyYWNoaWNhbC1maWx0ZXInLFxuXG4gIEluaXRpYWxpemVFeHRlbnNpb24gPSAnaW5pdGlhbGl6ZS1leHRlbnNpb24nLFxuICBJc0FuYWx5dGljc0Fzc2lzdGFudEF2YWlsYWJsZSA9ICdpcy1hbmFseXRpY3MtYXNzaXN0YW50LWF2YWlsYWJsZScsXG5cbiAgTGF1bmNoQW5hbHl0aWNzQXNzaXN0YW50ID0gJ2xhdW5jaC1hbmFseXRpY3MtYXNzaXN0YW50JyxcblxuICBNb3ZlQW5kUmVzaXplWm9uZXMgPSAnbW92ZS1hbmQtcmVzaXplLXpvbmVzJyxcbiAgTW92ZU1hcmtzQ2FyZEZpZWxkID0gJ21vdmUtbWFya3MtY2FyZC1maWVsZCcsXG5cbiAgUmFpc2VMZWF2ZU1hcmtOYXZOb3RpZmljYXRpb24gPSAncmFpc2UtbGVhdmUtbWFyay1uYXYtbm90aWZpY2F0aW9uJyxcbiAgUmFpc2VIb3ZlclR1cGxlTm90aWZpY2F0aW9uID0gJ3JhaXNlLWhvdmVyLXR1cGxlLW5vdGlmaWNhdGlvbicsXG4gIFJhaXNlU2VsZWN0VHVwbGVzTm90aWZpY2F0aW9uID0gJ3JhaXNlLXNlbGVjdC10dXBsZXMtbm90aWZpY2F0aW9uJyxcbiAgUmVkbyA9ICdyZWRvJyxcbiAgUmVmcmVzaERhdGFTb3VyY2UgPSAncmVmcmVzaC1kYXRhLXNvdXJjZScsXG4gIFJlbGVhc2VEYXRhVGFibGVSZWFkZXIgPSAncmVsZWFzZS1kYXRhLXRhYmxlLXJlYWRlcicsXG4gIFJlbW92ZUFubm90YXRpb24gPSAncmVtb3ZlLWFubm90YXRpb24nLFxuICBSZW1vdmVDdXN0b21WaWV3ID0gJ3JlbW92ZS1jdXN0b20tdmlldycsXG4gIFJlbW92ZUV4dGVybmFsTWVudUl0ZW0gPSAncmVtb3ZlLWV4dGVybmFsLW1lbnUtaXRlbScsXG4gIFJlbmFtZUV4dGVybmFsTWVudSA9ICdyZW5hbWUtZXh0ZXJuYWwtbWVudScsXG4gIFJlcGxheUFuaW1hdGlvbiA9ICdyZXBsYXktYW5pbWF0aW9uJyxcbiAgUmV2ZXJ0U3RvcnlQb2ludCA9ICdyZXZlcnQtc3RvcnktcG9pbnQnLFxuICBSZXZlcnRXb3JrYm9vayA9ICdyZXZlcnQtd29ya2Jvb2snLFxuXG4gIFNhdmVFeHRlbnNpb25TZXR0aW5ncyA9ICdzYXZlLWV4dGVuc2lvbi1zZXR0aW5ncycsXG4gIFNhdmVXb3JrYm9va0FzQ3VzdG9tVmlldyA9ICdzYXZlLXdvcmtib29rLWFzLWN1c3RvbS12aWV3JyxcbiAgU2VsZWN0QnlWYWx1ZSA9ICdzZWxlY3QtYnktdmFsdWUnLFxuICBTZXRBY3RpdmVDdXN0b21WaWV3QXNEZWZhdWx0ID0gJ3NldC1hY3RpdmUtY3VzdG9tLXZpZXctYXMtZGVmYXVsdCcsXG4gIFNldEF1dG9VcGRhdGUgPSAnc2V0LWF1dG8tdXBkYXRlJyxcbiAgU2V0Q2xpY2tUaHJvdWdoID0gJ3NldC1jbGljay10aHJvdWdoJyxcbiAgU2VuZERpYWxvZ01lc3NhZ2UgPSAnc2VuZC1kaWFsb2ctbWVzc2FnZScsXG4gIFNldFZpelN0YXRlV2l0aERhdGFNb2RlbCA9ICdzZXQtdml6LXN0YXRlLXdpdGgtZGF0YS1tb2RlbCcsXG4gIFNldFNoZWV0U2l6ZSA9ICdzZXQtc2hlZXQtc2l6ZScsXG4gIFNldFpvbmVWaXNpYmlsaXR5ID0gJ3NldC16b25lLXZpc2liaWxpdHknLFxuICBTaGFyZSA9ICdzaGFyZScsXG4gIFNob3dDdXN0b21WaWV3ID0gJ3Nob3ctY3VzdG9tLXZpZXcnLFxuICBTcGxpY2VNYXJrc0NhcmRGaWVsZHMgPSAnc3BsaWNlLW1hcmtzLWNhcmQtZmllbGRzJyxcblxuICBUZXN0Q29udmVyc2lvblZlcmIgPSAndGVzdC1jb252ZXJzaW9uLXZlcmInLFxuXG4gIFVuZG8gPSAndW5kbycsXG4gIFVwZGF0ZUN1c3RvbVZpZXcgPSAndXBkYXRlLWN1c3RvbS12aWV3JyxcblxuICBWaXpBUEkgPSAndml6LWFwaScsXG59XG4iLCJleHBvcnQgZW51bSBBc2tEYXRhT3B0aW9uTmFtZXMge1xuICB0b2tlbiA9ICd0b2tlbicsXG4gIG9yaWdpbiA9ICdvcmlnaW4nLFxuICBzaG93RW1iZWQgPSAnc2hvd0VtYmVkJyxcbiAgc2hvd1BpbiA9ICdzaG93UGluJyxcbiAgc2hvd1NhdmUgPSAnc2hvd1NhdmUnLFxuICBzaG93U2hhcmUgPSAnc2hvd1NoYXJlJyxcbiAgZGVidWcgPSAnOmpzZGVidWcnLFxuICBBcGlJRCA9ICc6YXBpSUQnLFxuICBBcGlFeHRlcm5hbFZlcnNpb24gPSAnOmFwaUV4dGVybmFsVmVyc2lvbicsXG4gIEFwaUludGVybmFsVmVyc2lvbiA9ICc6YXBpSW50ZXJuYWxWZXJzaW9uJyxcbiAgQXNrRGF0YVdlYkNvbXBvbmVudCA9ICc6YXNrRGF0YVdlYkNvbXBvbmVudCcsXG59XG4iLCJleHBvcnQgZW51bSBQdWxzZU9wdGlvbk5hbWVzIHtcbiAgZW1iZWQgPSAnZW1iZWQnLFxuICB0b2tlbiA9ICd0b2tlbicsXG4gIGRpc2FibGVFeHBsb3JlRmlsdGVyID0gJ2Rpc2FibGVFeHBsb3JlRmlsdGVyJyxcbiAgbGF5b3V0ID0gJ2VtYmVkX2xheW91dCcsXG4gIHRoZW1lID0gJ2VtYmVkX3RoZW1lJyxcbiAgQXBpRXh0ZXJuYWxWZXJzaW9uID0gJzphcGlFeHRlcm5hbFZlcnNpb24nLFxuICBBcGlJbnRlcm5hbFZlcnNpb24gPSAnOmFwaUludGVybmFsVmVyc2lvbicsXG4gIFB1bHNlV2ViQ29tcG9uZW50ID0gJzpwdWxzZVdlYkNvbXBvbmVudCcsXG59XG4iLCIvKipcbiAqIFRoZXNlIHN0cmluZ3Mgd2VyZSAqbWFudWFsbHkgY29waWVkKiBmcm9tIHRoZSBzZXJ2ZXIsXG4gKiB3b3JrZ3JvdXAvc3JjL3NpbG9zL3RhYmxlYXUtc2VydmVyL2xpYnJhcmllcy90YWItY29udHJvbGxlci12aXpxbC9zcmMvY29tL3RhYmxlYXVzb2Z0d2FyZS9cbiAqIGNvbnRyb2xsZXIvdml6cWwvY29uc3RhbnRzL1BhcmFtZXRlcktleXMuamF2YSNMOVxuICogc2hvdWxkIGJlIGV4cG9ydGVkIGluc3RlYWRcbiAqIHBhcmFtZXRlcnMgdGhhdCB2aXpxbCB3aWxsIGFjY2VwdCBpbiBhbiBlbWJlZGRpbmcgVVJMXG4gKiovXG5lbnVtIFZxbFBhcmFtZXRlck5hbWVzIHtcbiAgT05FID0gJzEnLFxuICBBTEVSVFMgPSAnOmFsZXJ0cycsXG4gIEFMSUFTID0gJ2FsaWFzJyxcbiAgQUxMT1dfREVGRVJSRURfQk9PVFNUUkFQID0gJzphbGxvd0RlZmVycmVkQm9vdHN0cmFwJyxcbiAgQUxMT1dfQVVUT0dFTl9XT1JLU0hFRVRfUEhPTkVfTEFZT1VUUyA9ICdhbGxvd0F1dG9nZW5Xb3Jrc2hlZXRQaG9uZUxheW91dHMnLFxuICBBUElfSUQgPSAnOmFwaUlEJyxcbiAgQVBQID0gJzphcHAnLFxuICBBVFRBQ0hNRU5UID0gJ2F0dGFjaG1lbnQnLFxuICBJU19JUEFEX0FQUCA9ICdhcHAnLFxuICBBTklNQVRFX1RSQU5TSVRJT04gPSAnOmFuaW1hdGVfdHJhbnNpdGlvbicsXG4gIEFTQ0VORElORyA9ICdhc2NlbmRpbmcnLFxuICBBVVRIRU5USUNBVElPTiA9ICdhdXRoZW50aWNhdGlvbicsXG4gIEFUVFJJQlVURVMgPSAnYXR0cmlidXRlcycsXG4gIEFVVEhPUklOR19TSEVFVCA9ICc6YXV0aFNoZWV0JyxcbiAgQVhJUyA9ICdheGlzJyxcbiAgQk9PVFNUUkFQX1dIRU5fTk9USUZJRUQgPSAnOmJvb3RzdHJhcFdoZW5Ob3RpZmllZCcsXG4gIEJST1dTRVJfQkFDS19CVVRUT05fVU5ETyA9ICc6YnJvd3NlckJhY2tCdXR0b25VbmRvJyxcbiAgQlJPV1NFUl9SRU5ERVJJTkdfT04gPSAnaXNCcm93c2VyUmVuZGVyaW5nJyxcbiAgQlJPV1NFUl9SRU5ERVJJTkdfVEhSRVNIT0xEID0gJ2Jyb3dzZXJSZW5kZXJpbmdUaHJlc2hvbGQnLFxuICBDSEFSU0VUID0gJ2NoYXJzZXQnLFxuICBDTElFTlRfRElNRU5TSU9OID0gJ2NsaWVudERpbWVuc2lvbicsXG4gIENMSUVOVF9JUCA9ICdjbGllbnRfaXAnLFxuICBDTElFTlRfTlVNID0gJ2NsaWVudE51bScsXG4gIENPTE9OX0VNQkVEREVEID0gJzplbWJlZGRlZCcsXG4gIENPTE9OX01PQklMRSA9ICc6bW9iaWxlJyxcbiAgQ09MT05fREVFUF9MSU5LSU5HX0RJU0FCTEVEID0gJzpkZWVwTGlua2luZ0Rpc2FibGVkJyxcbiAgQ09MT05fV0FURVJNQVJLID0gJzp3YXRlcm1hcmsnLFxuICBDT01NRU5UUyA9ICc6Y29tbWVudHMnLFxuICBDT01NRU5USU5HX0VOQUJMRUQgPSAnOmNvbW1lbnRpbmdFbmFibGVkJyxcbiAgQ09NTUVOVElOR19NRU5USU9OU19FTkFCTEVEID0gJzpjb21tZW50aW5nTWVudGlvbnMnLFxuICBDT05ORUNUSU9OID0gJ2Nvbm5lY3Rpb24nLFxuICBDUkVBVEVEX0JZX0ZFQVRVUkUgPSAnY3JlYXRlZEJ5RmVhdHVyZScsXG4gIENSWVBURURfUEFTU1dPUkQgPSAnY3J5cHRlZCcsXG4gIENTU0RFQlVHID0gJzpjc3NkZWJ1ZycsXG4gIENTViA9ICdjc3YnLFxuICBDVVNUT01fVklFV1MgPSAnOmN1c3RvbVZpZXdzJyxcbiAgQ1YgPSAnOmN2JyxcbiAgQ1ZfSUQgPSAnY3ZJZCcsXG4gIERBU0hCT0FSRF9QT1JUX1NJWkUgPSAnZGFzaGJvYXJkUG9ydFNpemUnLFxuICBEQVRBX0RFVEFJTFMgPSAnOmRhdGFEZXRhaWxzJyxcbiAgREFUQVNPVVJDRSA9ICdkYXRhc291cmNlJyxcbiAgREVCVUcgPSAnOmRlYnVnJyxcbiAgREVMQVkgPSAnOmRlbGF5JyxcbiAgREVQVEggPSAnZGVwdGgnLFxuICBERVZJQ0VfVFlQRSA9ICc6ZGV2aWNlJyxcbiAgREVWSUNFX1BJWEVMX1JBVElPID0gJ2RldmljZVBpeGVsUmF0aW8nLFxuICBERVZJQ0VfUFJFVklFV19NT0RFID0gJzpkZXZpY2VwcmV2aWV3bW9kZScsXG4gIERJTUVOU0lPTlMgPSAnOmRpbWVuc2lvbnMnLFxuICBESVNBQkxFX1NIQVJFRF9TRVNTSU9OUyA9ICc6ZGlzYWJsZV9zaGFyZWRfc2Vzc2lvbnMnLFxuICBESVNBQkxFX1VSTF9BQ1RJT05TX1BPUFVQUyA9ICc6ZGlzYWJsZVVybEFjdGlvbnNQb3B1cHMnLFxuICBESVJFQ1RJT04gPSAnZGlyZWN0aW9uJyxcbiAgRElTUExBWV9PVkVSTEFZID0gJzpkaXNwbGF5X292ZXJsYXknLFxuICBESVNQTEFZX1NIQVJFID0gJzpkaXNwbGF5X3NoYXJlJyxcbiAgRElTUExBWV9TUElOTkVSID0gJzpkaXNwbGF5X3NwaW5uZXInLFxuICBESVNQTEFZX1NUQVRJQ19JTUFHRSA9ICc6ZGlzcGxheV9zdGF0aWNfaW1hZ2UnLFxuICBESVNQTEFZX1RBQlMgPSAnZGlzcGxheV90YWJzJyxcbiAgRElTUExBWV9WSUVXX0NPVU5UID0gJzpkaXNwbGF5X2NvdW50JyxcbiAgSUdOT1JFX1NUSUNLWV9TRVNTSU9OID0gJzppZ25vcmVfc3RpY2t5X3Nlc3Npb24nLFxuICBJTkNSRU1FTlRfVklFV19DT1VOVCA9ICc6aW5jcmVtZW50X3ZpZXdfY291bnQnLFxuICBET0NNT0RFID0gJ2RvY21vZGUnLFxuICBET01BSU4gPSAnZG9tYWluJyxcbiAgRE9fV09SSyA9ICdkb193b3JrJyxcbiAgRFggPSAnZHgnLFxuICBEWSA9ICdkeScsXG4gIEVESVRfREFUQV9BTEVSVCA9ICc6ZWRpdERhdGFBbGVydCcsXG4gIEVNQkVEID0gJzplbWJlZCcsXG4gIEVNQkVEREVEID0gJ2VtYmVkZGVkJyxcbiAgRU5DUllQVEVEID0gJ2VuY3J5cHRlZCcsXG4gIEFQSV9FWFRFUk5BTF9WRVJTSU9OID0gJzphcGlFeHRlcm5hbFZlcnNpb24nLFxuICBBUElfSU5URVJOQUxfVkVSU0lPTiA9ICc6YXBpSW50ZXJuYWxWZXJzaW9uJyxcbiAgRVhDTFVERSA9ICdleGNsdWRlJyxcbiAgRVhQT1JUX0ZPUk1BVCA9ICc6ZXhwb3J0X2Zvcm1hdCcsXG4gIEZJRUxETkFNRSA9ICdmaWVsZG5hbWUnLFxuICBGSUVMRF9OQU1FID0gJ2ZpZWxkX25hbWUnLFxuICBGSUVMRF9TRVAgPSAnZmllbGRfc2VwJyxcbiAgRklMRSA9ICdmaWxlJyxcbiAgRklMVEVSX1RJTEVfU0laRSA9ICdmaWx0ZXJUaWxlU2l6ZScsXG4gIEZOID0gJ2ZuJyxcbiAgRk9DVVMgPSAnZm9jdXMnLFxuICBGT1JDRV9DQUNIRSA9ICdmb3JjZV9jYWNoZScsXG4gIEZPUk1BVCA9ICdmb3JtYXQnLFxuICBGT1JNQVRfREFUQV9WQUxVRV9MT0NBTExZID0gJ2Zvcm1hdERhdGFWYWx1ZUxvY2FsbHknLFxuICBGUk9NX1dHID0gJzpmcm9tX3dnJyxcbiAgR1JBUEhRTF9EQVRBQkFTRV9JRCA9ICc6Z3JhcGhRTERhdGFiYXNlSWQnLFxuICBHUkFQSFFMX1RBQkxFX0lEID0gJzpncmFwaFFMVGFibGVJZCcsXG4gIEdVSUQgPSAnOmd1aWQnLFxuICBIID0gJ2gnLFxuICBISURERU4gPSAnaGlkZGVuJyxcbiAgSElERV9DTE9TRV9CVVRUT04gPSAnOmhpZGVDbG9zZUJ1dHRvbicsXG4gIEhJREVfRURJVF9CVVRUT04gPSAnOmhpZGVFZGl0QnV0dG9uJyxcbiAgSElERV9FRElUX0lOX0RFU0tUT1BfQlVUVE9OID0gJzpoaWRlRWRpdEluRGVza3RvcEJ1dHRvbicsXG4gIEhJR0hfRFBJID0gJzpoaWdoZHBpJyxcbiAgSU1BR0VfU0laRV9MSU1JVCA9ICdpbWFnZVNpemVMaW1pdCcsXG4gIFRSQU5TUEFSRU5UX0xJTkVfTUFSS1NfTElNSVQgPSAndHJhbnNwYXJlbnRMaW5lTWFya0xpbWl0JyxcbiAgQ0xJRU5UX1JFTkRFUl9QSVhFTF9MSU1JVCA9ICdjbGllbnRSZW5kZXJQaXhlbExpbWl0JyxcbiAgSU4gPSAnaW4nLFxuICBJTlNUQU5DRV9JRCA9ICc6aWlkJyxcbiAgSVNfR1VFU1RfUkVESVJFQ1RfRlJPTV9WSVpQT1JUQUwgPSAnOmlzR3Vlc3RSZWRpcmVjdEZyb21WaXpwb3J0YWwnLFxuICBJU19NQVJLX0FOSU1BVElPTl9FTkFCTEVEID0gJ2lzTWFya0FuaW1hdGlvbkVuYWJsZWQnLFxuICBJU19WSVpQT1JUQUwgPSAnOmlzVml6UG9ydGFsJyxcbiAgSU5QVVRfID0gJ2lucHV0X3N0cmluZycsXG4gIEpTREVCVUcgPSAnOmpzZGVidWcnLFxuICBKU09OID0gJ2pzb24nLFxuICBKU09OX09OTFkgPSAnOmpzb25Pbmx5JyxcbiAgS0VFUEZJTEUgPSAna2VlcGZpbGUnLFxuICBLRVkgPSAna2V5JyxcbiAgTEFOR1VBR0UgPSAnbGFuZ3VhZ2UnLFxuICBMQU5HVUFHRV9SRVFVRVNURUQgPSAnOmxhbmd1YWdlJyxcbiAgTElOS1RBUkdFVCA9ICc6bGlua3RhcmdldCcsXG4gIExPQURfT1JERVJfSUQgPSAnOmxvYWRPcmRlcklEJywgLy8gdXNlZCBmb3IgUHVibGljXG4gIExPQURfTkVXRVNUX1JFVklTSU9OID0gJzpsb2FkTmV3ZXN0UmV2aXNpb24nLFxuICBMT0NBTF9QQVRIUyA9ICc6bG9jYWxQYXRocycsXG4gIExPQ0FMRSA9ICdsb2NhbGUnLFxuICBMT0NBVElPTl9JRCA9ICdsb2NhdGlvbmlkJyxcbiAgTE9DQVRJT05fVFlQRSA9ICdsb2NhdGlvbnR5cGUnLFxuICBXT1JLQk9PS19MT0NBTEUgPSAnd29ya2Jvb2tMb2NhbGUnLFxuICBNQVhST1dTID0gJ21heHJvd3MnLFxuICBNQVhfQUdFID0gJ21heEFnZScsXG4gIE1BWF9ST1dTID0gJ21heFJvd3MnLFxuICBNRVRIT0QgPSAnbWV0aG9kJyxcbiAgTU9CSUxFID0gJ21vYmlsZScsXG4gIE1PRElGSUVSID0gJ21vZGlmaWVyJyxcbiAgTkFNRSA9ICduYW1lJyxcbiAgTkFWX1RZUEUgPSAnbmF2VHlwZScsXG4gIE5BVl9TUkMgPSAnbmF2U3JjJyxcbiAgTk9BVFRBQ0hNRU5UID0gJ25vLWF0dGFjaG1lbnQnLFxuICBOT19PVkVSV1JJVEUgPSAnbm9fb3ZlcndyaXRlJyxcbiAgT1BFTl9BVVRIT1JJTkdfSU5fVE9QX1dJTkRPVyA9ICc6b3BlbkF1dGhvcmluZ0luVG9wV2luZG93JyxcbiAgT1BFTklEX0hEID0gJzpvcGVuaWRfaGQnLFxuICBPUEVOSURfTE9HSU5fSElOVCA9ICc6b3BlbmlkX2xvZ2luX2hpbnQnLFxuICBPQVVUSFJFUVVFU1QgPSAnb2F1dGhyZXF1ZXN0JyxcbiAgT0FVVEhfQ1JFREVOVElBTF9JRFMgPSAnb2F1dGhfY3JlZGVudGlhbF9pZHMnLFxuICBPRkZMSU5FX01PREUgPSAnOm9mZmxpbmVtb2RlJyxcbiAgT1JJR0lOID0gJzpvcmlnaW4nLFxuICBPVkVSTEFZID0gJzpvdmVybGF5JyxcbiAgUCA9ICdwJyxcbiAgUEFUSCA9ICdwYXRoJyxcbiAgUEFORV9SRVNPTFZFUl9YID0gJ3BhbmVSZXNvbHZlclgnLFxuICBQQU5FX1JFU09MVkVSX1kgPSAncGFuZVJlc29sdmVyWScsXG4gIFBBUkFNID0gJ3BhcmFtJyxcbiAgUEFSRU5UX0lEID0gJ3BhcmVudF9pZCcsXG4gIFBBU1NXT1JEID0gJ3Bhc3N3b3JkJyxcbiAgUEFUVEVSTiA9ICdwYXR0ZXJuJyxcbiAgUElYRUxfUkFUSU8gPSAnOnBpeGVscmF0aW8nLFxuICBQUkVGSVggPSAnOnByZWZpeCcsXG4gIFBSRVZJRVcgPSAnOnByZXZpZXcnLFxuICBQUklNQVJZX0NPTlRFTlRfVVJMID0gJ3ByaW1hcnlfY29udGVudF91cmwnLFxuICBQUk9KRUNUID0gJ3Byb2plY3QnLFxuICBQUk9UT0NPTCA9ICdwcm90b2NvbCcsXG4gIFBTRVVETyA9ICc6cHNldWRvJyxcbiAgUVVFUlkgPSAncXVlcnknLFxuICBSID0gJ3InLFxuICBSQU5HRV9UWVBFID0gJ3JhbmdlX3R5cGUnLFxuICBSRUNPUkRfU0VQID0gJ3JlY29yZF9zZXAnLFxuICBSRUNPUkRfQ0xJRU5UX1BFUkZPUk1BTkNFID0gJzpyZWNvcmRfY2xpZW50X3BlcmZvcm1hbmNlJyxcbiAgUkVDT1JEX1BFUkZPUk1BTkNFID0gJzpyZWNvcmRfcGVyZm9ybWFuY2UnLFxuICBSRUNPVkVSX09MRF9TRVNTSU9OX0lEID0gJzpyZWNvdmVyX29sZF9zZXNzaW9uX2lkJyxcbiAgUkVDT1ZFUl9TRVNTSU9OX1NUQVRFX1RJQ0tFVFMgPSAnOnJlY292ZXJfc2Vzc2lvbl9zdGF0ZV90aWNrZXRzJyxcbiAgUkVGUkVTSCA9ICc6cmVmcmVzaCcsXG4gIFJFRlJFU0hVTk1PRElGSUVEID0gJzpyZWZyZXNodW5tb2RpZmllZCcsXG4gIFJFR0lPTiA9ICdyZWdpb24nLFxuICBSRUxPQURfT05fQ1VTVE9NX1ZJRVdfU0FWRSA9ICc6cmVsb2FkT25DdXN0b21WaWV3U2F2ZScsXG4gIFJFTkRFUiA9ICc6cmVuZGVyJyxcbiAgUkVOREVSX01BUFNfQ0xJRU5UX1NJREUgPSAncmVuZGVyTWFwc0NsaWVudFNpZGUnLFxuICBSRVRSWSA9ICc6cmV0cnknLFxuICBSRVVTRSA9ICdyZXVzZScsXG4gIFJFVVNFX0ZPUkVWRVIgPSAncmV1c2VfZm9yZXZlcicsXG4gIFJFVkVSVCA9ICc6cmV2ZXJ0JyxcbiAgU0FWRV9EQl9QQVNTV09SRFMgPSAnc2F2ZV9kYl9wYXNzd29yZHMnLFxuICBTRUxFQ1RfWCA9ICdzZWxlY3RfeCcsXG4gIFNFTEVDVF9ZID0gJ3NlbGVjdF95JyxcbiAgU0VTU0lPTl9GRUFUVVJFX1BSRUZJWCA9ICc6ZmZfJyxcbiAgU0VTU0lPTl9GTEFHUyA9ICc6c2Vzc2lvbl9mZWF0dXJlX2ZsYWdzJyxcbiAgU0hBUkVfQlVUVE9OID0gJ3NoYXJlX2J1dHRvbicsXG4gIFNIRUVUX0lEID0gJ3NoZWV0X2lkJyxcbiAgU0hBUkVEID0gJ3NoYXJlZCcsXG4gIFNIT1dBTEwgPSAnc2hvd2FsbCcsXG4gIFNIT1dfQVBQX0JBTk5FUiA9ICc6c2hvd0FwcEJhbm5lcicsXG4gIFNIT1dfQVNLX0RBVEEgPSAnOnNob3dBc2tEYXRhJyxcbiAgU0hPV19QQVJBTVMgPSAnc2hvd1BhcmFtcycsXG4gIFNIT1dfU0hBUkVfT1BUSU9OUyA9ICc6c2hvd1NoYXJlT3B0aW9ucycsXG4gIFNJWkUgPSAnOnNpemUnLFxuICBTT1VSQ0UgPSAnc291cmNlJyxcbiAgU1RBVEUgPSAnc3RhdGUnLFxuICBTVElDS1lfU0VTU0lPTl9LRVkgPSAnc3RpY2t5U2Vzc2lvbktleScsXG4gIFNVQlNDUklQVElPTlMgPSAnOnN1YnNjcmlwdGlvbnMnLFxuICBTVU1NQVJZID0gJ3N1bW1hcnknLFxuICBTVVBQUkVTU19ERUZBVUxUX0VESVRfQkVIQVZJT1IgPSAnOnN1cHByZXNzRGVmYXVsdEVkaXRCZWhhdmlvcicsXG4gIFNZTkNfU0VTU0lPTiA9ICc6c3luY19zZXNzaW9uJyxcbiAgU1lOQ19TRVNTSU9OX1NUQVRFID0gJ3N5bmNfc2Vzc2lvbl9zdGF0ZScsXG4gIFRBQlMgPSAnOnRhYnMnLFxuICBUQVJHRVQgPSAndGFyZ2V0JyxcbiAgVEFSR0VUX1NJVEUgPSAndGFyZ2V0X3NpdGUnLFxuICBUT09MQkFSID0gJzp0b29sYmFyJyxcbiAgVE9PTFRJUCA9ICc6dG9vbHRpcCcsXG4gIFRTID0gJ3RzJyxcbiAgVU5ERVJMWUlOR19UQUJMRV9JRCA9ICd1bmRlcmx5aW5nX3RhYmxlX2lkJyxcbiAgVU5ERVJMWUlOR19UQUJMRV9DQVBUSU9OID0gJ3VuZGVybHlpbmdfdGFibGVfY2FwdGlvbicsXG4gIFVQREFURV9UWVBFID0gJ3VwZGF0ZV90eXBlJyxcbiAgVVNFX0dVRVNUID0gJzp1c2VHdWVzdCcsXG4gIFVTRV9JTkxJTkVfSU1BR0VTID0gJ3VzZV9pbmxpbmVfaW1hZ2VzJyxcbiAgVVNFUkFHRU5UID0gJ3VzZXJhZ2VudCcsXG4gIFVTRVJOQU1FID0gJ3VzZXJuYW1lJyxcbiAgVkFMVUUgPSAndmFsdWUnLFxuICBWRVJCT1NFX01PREUgPSAndmVyYm9zZU1vZGUnLFxuICBWSUVXX0lEID0gJ3ZpZXdzX2lkJyxcbiAgVklaX1NOQVBTSE9UX0lEID0gJ3Zpel9zbmFwc2hvdF9pZCcsXG4gIFZXID0gJzp2dycsXG4gIFcgPSAndycsXG4gIFdPUktTSEVFVF9QT1JUX1NJWkUgPSAnd29ya3NoZWV0UG9ydFNpemUnLFxuICBXQVRFUk1BUksgPSAnd2F0ZXJtYXJrJyxcbiAgV0FURVJNQVJLX01BUkdJTiA9ICc6d2F0ZXJtYXJrX21hcmdpbicsXG4gIFdCID0gJzp3YicsXG4gIFdISUNIID0gJ3doaWNoJyxcbiAgWCA9ICd4JyxcbiAgWSA9ICd5JyxcbiAgWklEID0gJ3ppZCcsXG4gIFpPTkVfSUQgPSAnem9uZV9pZCcsXG4gIEtFWUNIQUlOX1ZFUlNJT04gPSAna2V5Y2hhaW5fdmVyc2lvbicsXG4gIERBVEFTT1VSQ0VfSUQgPSAnZGF0YXNvdXJjZV9pZCcsXG4gIERBVEFTT1VSQ0VfTkFNRSA9ICdkYXRhc291cmNlX25hbWUnLFxuICBMRU5TX0lEID0gJ2xlbnNfaWQnLFxuICBXSURUSCA9ICd3aWR0aCcsXG4gIEhFSUdIVCA9ICdoZWlnaHQnLFxuXG4gIC8vIERlZmF1bHQgTGF5b3V0IHBhcmFtc1xuICBMQVlPVVRfVklFV1MgPSAndmlld3MnLFxuICBMQVlPVVRfTUVOVVMgPSAnbWVudXMnLFxuICBMQVlPVVRfR0VPTUVUUlkgPSAnZ2VvbWV0cnknLFxuICBMQVlPVVRfUEFHRVMgPSAncGFnZXMnLFxuICBMQVlPVVRfQ0FDSEVVUkwgPSAnY2FjaGV1cmwnLFxuICBMQVlPVVRfU0hFRVQgPSAnc2hlZXQnLFxuICBMQVlPVVRfREVQVEggPSAnZGVwdGgnLFxufVxuXG4vKipcbiAqIHBhcmFtZXRlcnMgdGhhdCBhcmUgb25seSByZWxldmFudCB3aGVuIHdvcmtpbmcgd2l0aCBUYWJsZWF1IFB1YmxpY1xuICogbWF5YmUgbm90IHJlYWxseSBuZWNlc3NyeSB0byBzcGxpdCB0aGVtIG91dFxuICovXG5lbnVtIFB1YmxpY1BhcmFtZXRlck5hbWVzIHtcbiAgU0hPV19WSVpfSE9NRSA9ICc6c2hvd1ZpekhvbWUnLFxuICAvLyBkaXNwbGF5IHZpZXcgY291bnRcbn1cblxuLyoqXG4gKiBNYXAgdGhlIHBhcmFtZXRlciBuYW1lcyBhcyB1c2VkIGluIHRoZSB1cmwgdG8gd2hhdCB3ZSBjYWxsIHRoZW0gcHVibGljbHkgaW4gdGhlIGVtYmVkZGluZyBsaWJyYXJ5LlxuICogVGhlIG9ubHkgcGFyYW1ldGVycyBsaXN0ZWQgaGVyZSBzaG91bGQgYmUgdGhlIG9uZXMgdGhhdCBnZXQgc2VudCB0byB2aXpxbFxuICogIC0gdGhpcyBzaG91bGQgbWF0Y2ggdGhlIGludGVyZmFjZSBhdCBleHRlcm5hbC1jb250cmFjdDpWaXpJbnRlcmZhY2VzOlZpelNldHRpbmdzXG4gKi9cbmV4cG9ydCBlbnVtIFZpek9wdGlvbk5hbWVzIHtcbiAgLy8gcHVibGljTmFtZSA9IGludGVybmFsU3RyaW5nVmFsdWVcbiAgU2l6ZSA9IFZxbFBhcmFtZXRlck5hbWVzLlNJWkUsXG4gIEVtYmVkID0gVnFsUGFyYW1ldGVyTmFtZXMuRU1CRUQsXG4gIEFwaUludGVybmFsVmVyc2lvbiA9IFZxbFBhcmFtZXRlck5hbWVzLkFQSV9JTlRFUk5BTF9WRVJTSU9OLFxuICBBcGlFeHRlcm5hbFZlcnNpb24gPSBWcWxQYXJhbWV0ZXJOYW1lcy5BUElfRVhURVJOQUxfVkVSU0lPTixcbiAgU2hvd1ZpekhvbWUgPSBQdWJsaWNQYXJhbWV0ZXJOYW1lcy5TSE9XX1ZJWl9IT01FLFxuICBKc2RlYnVnID0gVnFsUGFyYW1ldGVyTmFtZXMuSlNERUJVRyxcbiAgQm9vdHN0cmFwV2hlbk5vdGlmaWVkID0gVnFsUGFyYW1ldGVyTmFtZXMuQk9PVFNUUkFQX1dIRU5fTk9USUZJRUQsXG4gIE5hdlR5cGUgPSBWcWxQYXJhbWV0ZXJOYW1lcy5OQVZfVFlQRSxcbiAgTmF2U3JjID0gVnFsUGFyYW1ldGVyTmFtZXMuTkFWX1NSQyxcbiAgZGVidWcgPSBWcWxQYXJhbWV0ZXJOYW1lcy5KU0RFQlVHLFxuICBBcGlJRCA9IFZxbFBhcmFtZXRlck5hbWVzLkFQSV9JRCxcblxuICBkaXNhYmxlVXJsQWN0aW9uc1BvcHVwcyA9IFZxbFBhcmFtZXRlck5hbWVzLkRJU0FCTEVfVVJMX0FDVElPTlNfUE9QVVBTLFxuICBoaWRlVGFicyA9IFZxbFBhcmFtZXRlck5hbWVzLlRBQlMsXG4gIHRvb2xiYXIgPSBWcWxQYXJhbWV0ZXJOYW1lcy5UT09MQkFSLFxuICBkZXZpY2UgPSBWcWxQYXJhbWV0ZXJOYW1lcy5ERVZJQ0VfVFlQRSxcbiAgaW5zdGFuY2VJZFRvQ2xvbmUgPSBWcWxQYXJhbWV0ZXJOYW1lcy5JTlNUQU5DRV9JRCxcbiAgdG91Y2hPcHRpbWl6ZSA9IFZxbFBhcmFtZXRlck5hbWVzLk1PQklMRSxcbiAgaGlkZUVkaXRCdXR0b24gPSBWcWxQYXJhbWV0ZXJOYW1lcy5ISURFX0VESVRfQlVUVE9OLFxuICBoaWRlRWRpdEluRGVza3RvcEJ1dHRvbiA9IFZxbFBhcmFtZXRlck5hbWVzLkhJREVfRURJVF9JTl9ERVNLVE9QX0JVVFRPTixcbiAgc3VwcHJlc3NEZWZhdWx0RWRpdEJlaGF2aW9yID0gVnFsUGFyYW1ldGVyTmFtZXMuU1VQUFJFU1NfREVGQVVMVF9FRElUX0JFSEFWSU9SLFxuICBoaWRlQ2xvc2VCdXR0b24gPSBWcWxQYXJhbWV0ZXJOYW1lcy5ISURFX0NMT1NFX0JVVFRPTixcbn1cbiIsImltcG9ydCAqIGFzIGd1aWQgZnJvbSAnZ3VpZCc7XG5pbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgSU5URVJOQUxfQ09OVFJBQ1RfVkVSU0lPTiwgTW9kZWwsIE5vdGlmaWNhdGlvbklkLCBWZXJiSWQsIFZlcnNpb25OdW1iZXIgfSBmcm9tICcuLi9Kc0FwaUludGVybmFsQ29udHJhY3QnO1xuaW1wb3J0IHsgSW5pdGlhbGl6YXRpb25PcHRpb25zIH0gZnJvbSAnLi4vaW50ZXJmYWNlL0luaXRpYWxpemF0aW9uT3B0aW9ucyc7XG5pbXBvcnQgeyBDcm9zc0ZyYW1lUHJlcGFyZWRNZXNzYWdlIH0gZnJvbSAnLi9Dcm9zc0ZyYW1lUHJlcGFyZWRNZXNzYWdlJztcbmltcG9ydCB7XG4gIGlzQ29tbWFuZE1lc3NhZ2UsXG4gIGlzQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSxcbiAgaXNIYW5kc2hha2VNZXNzYWdlLFxuICBpc0luaXRNZXNzYWdlLFxuICBpc01lc3NhZ2UsXG4gIGlzTm90aWZpY2F0aW9uTWVzc2FnZSxcbn0gZnJvbSAnLi9NZXNzYWdlVHlwZUNoZWNrcyc7XG5pbXBvcnQge1xuICBDb21tYW5kTWVzc2FnZUhhbmRsZXIsXG4gIENvbW1hbmRSZXNwb25zZU1lc3NhZ2VIYW5kbGVyLFxuICBIYW5kc2hha2VNZXNzYWdlSGFuZGxlcixcbiAgSW5pdGlhbGl6ZU1lc3NhZ2VIYW5kbGVyLFxuICBOb3RpZmljYXRpb25NZXNzYWdlSGFuZGxlcixcbn0gZnJvbSAnLi9pbnRlcmZhY2UvTWVzc2FnZUxpc3RlbmVyJztcbmltcG9ydCB7XG4gIENvbW1hbmRNZXNzYWdlLFxuICBDb21tYW5kUmVzcG9uc2VNZXNzYWdlLFxuICBIYW5kc2hha2VNZXNzYWdlLFxuICBJbml0aWFsaXplTWVzc2FnZSxcbiAgTWVzc2FnZSxcbiAgTWVzc2FnZVR5cGUsXG4gIE5vdGlmaWNhdGlvbk1lc3NhZ2UsXG59IGZyb20gJy4vaW50ZXJmYWNlL01lc3NhZ2VUeXBlcyc7XG5pbXBvcnQgeyBNZXNzZW5nZXIgfSBmcm9tICcuL2ludGVyZmFjZS9NZXNzZW5nZXInO1xuaW1wb3J0IHsgUHJlcGFyZWRNZXNzYWdlIH0gZnJvbSAnLi9pbnRlcmZhY2UvUHJlcGFyZWRNZXNzYWdlJztcblxuLyoqXG4gKiBUaGUgQ3Jvc3NGcmFtZU1lc3NlbmdlciBpcyB0aGUgcHJpbWFyeSBleHBvcnQgZnJvbSB0aGUgYXBpLW1lc3NhZ2luZyBtb2R1bGUuIEFuIGluc3RhbmNlIG9mXG4gKiB0aGlzIGNsYXNzIGNhbiBiZSBpbnN0YW50aWF0ZWQgb24gYm90aCBzaWRlcyBvZiBhIGZyYW1lIGJvdW5kYXJ5IHRvIGZhY2lsaXRhdGUgY29tbXVuaWNhdGlvblxuICogaW4gYm90aCBkaXJlY3Rpb25zIGJldHdlZW4gdGhlIGZyYW1lcy4gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGJvdGggdGhlIGRpc3BhdGNoZXIgYW5kIHRoZSBsaXN0ZW5lclxuICogcG9ydGlvbnMsIGJ1dCBkb2Vzbid0IHJlcXVpcmUgY2FsbGVycyB0byBjYXJlIGFib3V0IGJvdGguXG4gKi9cbmV4cG9ydCBjbGFzcyBDcm9zc0ZyYW1lTWVzc2VuZ2VyIGltcGxlbWVudHMgTWVzc2VuZ2VyIHtcbiAgcHJpdmF0ZSB1bnJlZ2lzdGVyRnVuY3Rpb24/OiAoKSA9PiB2b2lkO1xuICBwcml2YXRlIGluaXRpYWxpemVNZXNzYWdlSGFuZGxlcj86IEluaXRpYWxpemVNZXNzYWdlSGFuZGxlcjtcbiAgcHJpdmF0ZSBjb21tYW5kUmVzcG9uc2VNZXNzYWdlSGFuZGxlcj86IENvbW1hbmRSZXNwb25zZU1lc3NhZ2VIYW5kbGVyO1xuICBwcml2YXRlIGNvbW1hbmRNZXNzYWdlSGFuZGxlcj86IENvbW1hbmRNZXNzYWdlSGFuZGxlcjtcbiAgcHJpdmF0ZSBub3RpZmljYXRpb25NZXNzYWdlSGFuZGxlcj86IE5vdGlmaWNhdGlvbk1lc3NhZ2VIYW5kbGVyO1xuICBwcml2YXRlIGhhbmRzaGFrZU1lc3NhZ2VIYW5kbGVyPzogSGFuZHNoYWtlTWVzc2FnZUhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgQ3Jvc3NGcmFtZU1lc3Nlbmdlci4gSWYgeW91IHdvdWxkIGxpa2UgdG8gdXNlIHRoZSBDcm9zc0ZyYW1lTWVzc2VuZ2VyIGFzIGEgTWVzc2FnZUxpc3RlbmVyLFxuICAgKiBiZSBzdXJlIHRvIGNhbGwgU3RhcnRMaXN0ZW5pbmcgYW5kIHJlZ2lzdGVyIG1lc3NhZ2UgaGFuZGxlcnMuXG4gICAqIEBwYXJhbSB0aGlzV2luZG93IFRoZSB3aW5kb3cgb2JqZWN0IHdoaWNoIHRoZSBDcm9zc0ZyYW1lTWVzc2VuZ2VyIGxpdmVzLiBBbiBvbk1lc3NhZ2UgbGlzdGVuZXIgd2lsbCBiZSBhZGRlZCBoZXJlLlxuICAgKiBAcGFyYW0gW290aGVyV2luZG93XSBPcHRpb25hbCBvdGhlcldpbmRvdyB3aGljaCBtZXNzYWdlcyB3aWxsIGJlIHBvc3RlZCB0by5cbiAgICogICAgICAgICAgICAgICAgICAgICAgSWYgZGVmaW5lZCwgaW5jb21pbmcgbWVzc2FnZXMgbXVzdCBvcmlnaW5hdGUgZnJvbSBvdGhlcldpbmRvdyB0byBiZSBwYXNzZWQgb25cbiAgICogQHBhcmFtIFtvdGhlcldpbmRvd09yaWdpbl0gVGhlIHRhcmdldCBvcmlnaW4gd2hpY2ggb3RoZXJXaW5kb3cgbXVzdCBoYXZlIGluIG9yZGVyIHRvIHJlY2VpdmUgZGlzcGF0Y2hlZCBtZXNzYWdlcy5cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyB2YWx1ZSB3aWxsIGJlIHNlbnQgYXMgdGhlIHRhcmdldE9yaWdpbiBvZiBhIHBvc3RNZXNzYWdlXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIChodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2luZG93L3Bvc3RNZXNzYWdlKVxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgdGhpc1dpbmRvdzogV2luZG93LCBwcml2YXRlIG90aGVyV2luZG93PzogV2luZG93LCBwcml2YXRlIG90aGVyV2luZG93T3JpZ2luPzogc3RyaW5nKSB7XG4gICAgLy8gTWFrZSBzdXJlIHRvIGNhbGwgU3RhcnRMaXN0ZW5pbmdcbiAgfVxuXG4gIC8vLy8vIE1lc3NhZ2VMaXN0ZW5lciBJbXBsZW1lbnRhdGlvblxuXG4gIHB1YmxpYyBzdGFydExpc3RlbmluZygpOiB2b2lkIHtcbiAgICAvLyBDaGVjayBpZiB3ZSBhbHJlYWR5IGFyZSBsaXN0ZW5pbmcsIGlmIG5vdCwgaG9vayB1cCBhIG1lc3NhZ2UgbGlzdGVuZXJcbiAgICBpZiAoIXRoaXMudW5yZWdpc3RlckZ1bmN0aW9uKSB7XG4gICAgICBjb25zdCBib3VuZEhhbmRsZXIgPSB0aGlzLm9uTWVzc2FnZVJlY2VpdmVkLmJpbmQodGhpcyk7XG4gICAgICB0aGlzLnRoaXNXaW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGJvdW5kSGFuZGxlciwgdHJ1ZSk7XG4gICAgICB0aGlzLnVucmVnaXN0ZXJGdW5jdGlvbiA9ICgpID0+IHRoaXMudGhpc1dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgYm91bmRIYW5kbGVyLCB0cnVlKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc3RvcExpc3RlbmluZygpOiB2b2lkIHtcbiAgICAvLyBTdG9wIGxpc3RlbmluZyBpZiB3ZSBoYXZlIHN0YXJ0ZWQgbGlzdGVuaW5nXG4gICAgaWYgKHRoaXMudW5yZWdpc3RlckZ1bmN0aW9uKSB7XG4gICAgICB0aGlzLnVucmVnaXN0ZXJGdW5jdGlvbigpO1xuICAgICAgdGhpcy51bnJlZ2lzdGVyRnVuY3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNldEluaXRpYWxpemVNZXNzYWdlSGFuZGxlcihoYW5kbGVyPzogSW5pdGlhbGl6ZU1lc3NhZ2VIYW5kbGVyKTogdm9pZCB7XG4gICAgdGhpcy5pbml0aWFsaXplTWVzc2FnZUhhbmRsZXIgPSBoYW5kbGVyO1xuICB9XG5cbiAgcHVibGljIHNldENvbW1hbmRSZXNwb25zZU1lc3NhZ2VIYW5kbGVyKGhhbmRsZXI/OiBDb21tYW5kUmVzcG9uc2VNZXNzYWdlSGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMuY29tbWFuZFJlc3BvbnNlTWVzc2FnZUhhbmRsZXIgPSBoYW5kbGVyO1xuICB9XG5cbiAgcHVibGljIHNldENvbW1hbmRNZXNzYWdlSGFuZGxlcihoYW5kbGVyPzogQ29tbWFuZE1lc3NhZ2VIYW5kbGVyKTogdm9pZCB7XG4gICAgdGhpcy5jb21tYW5kTWVzc2FnZUhhbmRsZXIgPSBoYW5kbGVyO1xuICB9XG5cbiAgcHVibGljIHNldE5vdGlmaWNhdGlvbk1lc3NhZ2VIYW5kbGVyKGhhbmRsZXI/OiBOb3RpZmljYXRpb25NZXNzYWdlSGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMubm90aWZpY2F0aW9uTWVzc2FnZUhhbmRsZXIgPSBoYW5kbGVyO1xuICB9XG5cbiAgcHVibGljIHNldEhhbmRzaGFrZU1lc3NhZ2VIYW5kbGVyKGhhbmRsZXI/OiBIYW5kc2hha2VNZXNzYWdlSGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMuaGFuZHNoYWtlTWVzc2FnZUhhbmRsZXIgPSBoYW5kbGVyO1xuICB9XG5cbiAgLy8vLy8gTWVzc2FnZURpc3BhdGNoZXIgSW1wbGVtZW50YXRpb25cblxuICAvKipcbiAgICogQHBhcmFtIGFwaVZlcnNpb24gYXBpLWludGVybmFsLWNvbnRyYWN0LWpzIHZlcnNpb24gKGV4cG9ydGVkIGluIEpzQXBpSW50ZXJuYWxDb25udHJhY3QpXG4gICAqIEBwYXJhbSBjcm9zc0ZyYW1lVmVyc2lvbiBjcm9zc2ZyYW1lIG1lc3NhZ2luZyB2ZXJzaW9uIChleHBvcnRlZCBpbiBKc0FwaUludGVybmFsQ29ubnRyYWN0KVxuICAgKiBAcGFyYW0gb3B0aW9ucyBhZGRpdGlvbmFsIG9wdGlvbnMgdGhhdCBjYW4gYmUgcGFzc2VkIGF0IGluaXRpYWxpemF0aW9uIChpbmZvcm1hdGlvbiBhYm91dCB0aGUgdmVyc2lvbiBvZlxuICAgKiAgICAgICAgICAgICAgICBleHRlcm5hbCBiZWluZyB1c2VkIGZvciBleGFtcGxlKVxuICAgKi9cbiAgcHVibGljIHByZXBhcmVJbml0aWFsaXphdGlvbk1lc3NhZ2UoXG4gICAgYXBpVmVyc2lvbjogVmVyc2lvbk51bWJlcixcbiAgICBjcm9zc0ZyYW1lVmVyc2lvbjogVmVyc2lvbk51bWJlcixcbiAgICBvcHRpb25zPzogSW5pdGlhbGl6YXRpb25PcHRpb25zLFxuICApOiBQcmVwYXJlZE1lc3NhZ2Uge1xuICAgIGNvbnN0IG1lc3NhZ2U6IEluaXRpYWxpemVNZXNzYWdlID0ge1xuICAgICAgbXNnR3VpZDogZ3VpZC5yYXcoKSxcbiAgICAgIG1zZ1R5cGU6IE1lc3NhZ2VUeXBlLkluaXRpYWxpemUsXG4gICAgICBjcm9zc0ZyYW1lVmVyc2lvbjogY3Jvc3NGcmFtZVZlcnNpb24sXG4gICAgICBhcGlWZXJzaW9uOiBhcGlWZXJzaW9uLFxuICAgICAgb3B0aW9uczogb3B0aW9ucyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMucHJlcGFyZU1lc3NhZ2UobWVzc2FnZSk7XG4gIH1cblxuICBwdWJsaWMgcHJlcGFyZUNvbW1hbmRNZXNzYWdlKHZlcmJJZDogVmVyYklkLCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyk6IFByZXBhcmVkTWVzc2FnZSB7XG4gICAgY29uc3QgbWVzc2FnZTogQ29tbWFuZE1lc3NhZ2UgPSB7XG4gICAgICBtc2dHdWlkOiBndWlkLnJhdygpLFxuICAgICAgbXNnVHlwZTogTWVzc2FnZVR5cGUuQ29tbWFuZCxcbiAgICAgIHZlcmJJZDogdmVyYklkLFxuICAgICAgcGFyYW1ldGVyczogcGFyYW1ldGVycyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMucHJlcGFyZU1lc3NhZ2UobWVzc2FnZSk7XG4gIH1cblxuICBwdWJsaWMgcHJlcGFyZUNvbW1hbmRSZXNwb25zZU1lc3NhZ2UoY29tbWFuZEd1aWQ6IHN0cmluZywgZGF0YTogTW9kZWwgfCB1bmRlZmluZWQsIGVycm9yOiBNb2RlbCB8IHVuZGVmaW5lZCk6IFByZXBhcmVkTWVzc2FnZSB7XG4gICAgY29uc3QgbWVzc2FnZTogQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSA9IHtcbiAgICAgIG1zZ0d1aWQ6IGd1aWQucmF3KCksXG4gICAgICBtc2dUeXBlOiBNZXNzYWdlVHlwZS5Db21tYW5kUmVzcG9uc2UsXG4gICAgICBjb21tYW5kR3VpZDogY29tbWFuZEd1aWQsXG4gICAgICBkYXRhOiBkYXRhLFxuICAgICAgZXJyb3I6IGVycm9yLFxuICAgIH07XG5cbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIC8vIHN0cmluZ2lmeSBlcnJvciBvYmplY3QgdG8gcmVtb3ZlIHVuc2VyaWFsaXphYmxlIGZpZWxkcyBsaWtlIGZ1bmN0aW9ucyBhbmQgcHJldmVudCBzZXJpYWxpemF0aW9uIGVycm9yc1xuICAgICAgbWVzc2FnZS5lcnJvciA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZXJyb3IpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5wcmVwYXJlTWVzc2FnZShtZXNzYWdlKTtcbiAgfVxuXG4gIHB1YmxpYyBwcmVwYXJlTm90aWZpY2F0aW9uTWVzc2FnZShub3RpZmljYXRpb25JZDogTm90aWZpY2F0aW9uSWQsIGRhdGE6IE1vZGVsKTogUHJlcGFyZWRNZXNzYWdlIHtcbiAgICBjb25zdCBtZXNzYWdlOiBOb3RpZmljYXRpb25NZXNzYWdlID0ge1xuICAgICAgbXNnR3VpZDogZ3VpZC5yYXcoKSxcbiAgICAgIG1zZ1R5cGU6IE1lc3NhZ2VUeXBlLk5vdGlmaWNhdGlvbixcbiAgICAgIG5vdGlmaWNhdGlvbklkOiBub3RpZmljYXRpb25JZCxcbiAgICAgIGRhdGE6IGRhdGEsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLnByZXBhcmVNZXNzYWdlKG1lc3NhZ2UpO1xuICB9XG5cbiAgcHVibGljIHByZXBhcmVBY2tNZXNzYWdlKCk6IFByZXBhcmVkTWVzc2FnZSB7XG4gICAgY29uc3QgbWVzc2FnZTogSGFuZHNoYWtlTWVzc2FnZSA9IHtcbiAgICAgIG1zZ0d1aWQ6IGd1aWQucmF3KCksXG4gICAgICBtc2dUeXBlOiBNZXNzYWdlVHlwZS5BY2ssXG4gICAgICBwbGF0Zm9ybVZlcnNpb246IElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT04sXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLnByZXBhcmVNZXNzYWdlKG1lc3NhZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXBhcmVzIGEgcGVuZGluZyBtZXNzYWdlIGZvciBzZW5kaW5nIGFuZCByZXR1cm5zIHRoZSBwcmVwYXJlZCBtZXNzYWdlXG4gICAqXG4gICAqIEBwYXJhbSBtc2cgVGhlIG1lc3NhZ2UgdG8gYmUgc2VudCB0byB0aGlzLm90aGVyV2luZG93XG4gICAqIEByZXR1cm5zIFRoZSBwcmVwYXJlZCBtZXNzYWdlXG4gICAqL1xuICBwcml2YXRlIHByZXBhcmVNZXNzYWdlKG1zZzogTWVzc2FnZSk6IFByZXBhcmVkTWVzc2FnZSB7XG4gICAgaWYgKCF0aGlzLm90aGVyV2luZG93IHx8ICF0aGlzLm90aGVyV2luZG93T3JpZ2luKSB7XG4gICAgICB0aHJvdyAnT3RoZXIgd2luZG93IG5vdCBpbml0aWFsaXplZCwgY2Fubm90IGRpc3BhdGNoIG1lc3NhZ2VzJztcbiAgICB9XG5cbiAgICBjb25zdCBwcmVwYXJlZE1lc3NhZ2UgPSBuZXcgQ3Jvc3NGcmFtZVByZXBhcmVkTWVzc2FnZShtc2csIHRoaXMub3RoZXJXaW5kb3csIHRoaXMub3RoZXJXaW5kb3dPcmlnaW4pO1xuICAgIHJldHVybiBwcmVwYXJlZE1lc3NhZ2U7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gYSBtZXNzYWdlIGlzIHJlY2VpdmVkLiBEb2VzIHNvbWUgdmFsaWRhdGlvbiBvZiB0aGUgbWVzc2FnZSwgYW5kIHRoZW5cbiAgICogY2FsbHMgYW4gYXBwcm9wcmlhdGUgbWVzc2FnZSBoYW5kbGVyIGlmIG9uZSBpcyBkZWZpbmVkXG4gICAqXG4gICAqIEBwYXJhbSBldmVudCBUaGUgaW5jb21pbmcgTWVzc2FnZUV2ZW50XG4gICAqL1xuICBwcml2YXRlIG9uTWVzc2FnZVJlY2VpdmVkKGV2ZW50OiBNZXNzYWdlRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBJZiB3ZSBoYXZlIGFuIG90aGVyV2luZG93IGRlZmluZWQsIG1ha2Ugc3VyZSB0aGUgbWVzc2FnZSBpcyBjb21pbmcgZnJvbSB0aGVyZVxuICAgIGlmICh0aGlzLm90aGVyV2luZG93ICYmIGV2ZW50LnNvdXJjZSAhPT0gdGhpcy5vdGhlcldpbmRvdykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIERvIHNvbWUgdmFsaWRhdGlvbiBvbiBldmVudC5kYXRhIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgcmVjZWl2ZWQgYSByZWFsIG1lc3NhZ2VcbiAgICBpZiAoIWV2ZW50LmRhdGEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBtZXNzYWdlID0gZXZlbnQuZGF0YTtcbiAgICBpZiAoIWlzTWVzc2FnZShtZXNzYWdlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENoZWNrIHRoZSBkZWNsYXJlZCBtZXNzYWdlIHR5cGUsIHZhbGlkYXRlIHRoZSBtZXNzYWdlLCBhbmQgY2FsbCBhbiBhcHByb3ByaWF0ZSBoYW5kZXIgaWYgb25lIGV4aXN0c1xuICAgIHN3aXRjaCAobWVzc2FnZS5tc2dUeXBlKSB7XG4gICAgICBjYXNlIE1lc3NhZ2VUeXBlLkluaXRpYWxpemU6IHtcbiAgICAgICAgaWYgKCFpc0luaXRNZXNzYWdlKG1lc3NhZ2UpIHx8ICF0aGlzLmluaXRpYWxpemVNZXNzYWdlSGFuZGxlcikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZU1lc3NhZ2VIYW5kbGVyKG1lc3NhZ2UsIGV2ZW50LnNvdXJjZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBNZXNzYWdlVHlwZS5Db21tYW5kUmVzcG9uc2U6IHtcbiAgICAgICAgaWYgKCFpc0NvbW1hbmRSZXNwb25zZU1lc3NhZ2UobWVzc2FnZSkgfHwgIXRoaXMuY29tbWFuZFJlc3BvbnNlTWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbW1hbmRSZXNwb25zZU1lc3NhZ2VIYW5kbGVyKG1lc3NhZ2UsIGV2ZW50LnNvdXJjZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBNZXNzYWdlVHlwZS5Db21tYW5kOiB7XG4gICAgICAgIGlmICghaXNDb21tYW5kTWVzc2FnZShtZXNzYWdlKSB8fCAhdGhpcy5jb21tYW5kTWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbW1hbmRNZXNzYWdlSGFuZGxlcihtZXNzYWdlLCBldmVudC5zb3VyY2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgTWVzc2FnZVR5cGUuTm90aWZpY2F0aW9uOiB7XG4gICAgICAgIGlmICghaXNOb3RpZmljYXRpb25NZXNzYWdlKG1lc3NhZ2UpIHx8ICF0aGlzLm5vdGlmaWNhdGlvbk1lc3NhZ2VIYW5kbGVyKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb25NZXNzYWdlSGFuZGxlcihtZXNzYWdlLCBldmVudC5zb3VyY2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgTWVzc2FnZVR5cGUuSGFuZHNoYWtlOiB7XG4gICAgICAgIGlmICghaXNIYW5kc2hha2VNZXNzYWdlKG1lc3NhZ2UpIHx8ICF0aGlzLmhhbmRzaGFrZU1lc3NhZ2VIYW5kbGVyKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5oYW5kc2hha2VNZXNzYWdlSGFuZGxlcihtZXNzYWdlLCBldmVudC5zb3VyY2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAvLyBKdXN0IGlnbm9yZSB0aGlzIHNpbmNlIHdlIGRvbid0IGtub3cgaG93IHRvIGhhbmRsZSB0aGUgbWVzc2FnZSB0eXBlXG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNldE90aGVyV2luZG93KG90aGVyV2luZG93OiBXaW5kb3cpOiB2b2lkIHtcbiAgICB0aGlzLm90aGVyV2luZG93ID0gb3RoZXJXaW5kb3c7XG4gIH1cblxuICBwdWJsaWMgc2V0T3RoZXJXaW5kb3dPcmlnaW4ob3JpZ2luOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm90aGVyV2luZG93T3JpZ2luID0gb3JpZ2luO1xuICB9XG59XG4iLCJpbXBvcnQgeyBNZXNzYWdlIH0gZnJvbSAnLi9pbnRlcmZhY2UvTWVzc2FnZVR5cGVzJztcbmltcG9ydCB7IFByZXBhcmVkTWVzc2FnZSB9IGZyb20gJy4vaW50ZXJmYWNlL1ByZXBhcmVkTWVzc2FnZSc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFByZXBhcmVkTWVzc2FnZSBpbnRlcmZhY2UgdXNlZCB0byBwb3N0IG1lc3NhZ2VzIGJldHdlZW5cbiAqIHR3byBmcmFtZXMgdXNpbmcgd2luZG93LnBvc3RNZXNzYWdlXG4gKi9cbmV4cG9ydCBjbGFzcyBDcm9zc0ZyYW1lUHJlcGFyZWRNZXNzYWdlIGltcGxlbWVudHMgUHJlcGFyZWRNZXNzYWdlIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgQ3Jvc3NGcmFtZVByZXBhcmVkTWVzc2FnZS5cbiAgICogQHBhcmFtIF9tZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGJlIHNlbnRcbiAgICogQHBhcmFtIF90YXJnZXQgVGhlIHRhcmdldCB3aW5kb3cgd2hlcmUgdGhlIG1lc3NhZ2Ugd2lsbCBiZSBzZW50XG4gICAqIEBwYXJhbSBfb3JpZ2luIFRoZSB0YXJnZXRPcmlnaW4gd2hlcmUgdGhpcyBtZXNzYWdlIGNhbiBiZSByZWNlaXZlZFxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX21lc3NhZ2U6IE1lc3NhZ2UsIHByaXZhdGUgX3RhcmdldDogV2luZG93LCBwcml2YXRlIF9vcmlnaW46IHN0cmluZykge31cblxuICBwdWJsaWMgZ2V0IG1lc3NhZ2VHdWlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX21lc3NhZ2UubXNnR3VpZDtcbiAgfVxuXG4gIHB1YmxpYyBzZW5kKCk6IFByZXBhcmVkTWVzc2FnZSB7XG4gICAgdGhpcy5fdGFyZ2V0LnBvc3RNZXNzYWdlKHRoaXMuX21lc3NhZ2UsIHRoaXMuX29yaWdpbik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIGd1aWQgZnJvbSAnZ3VpZCc7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25JZCB9IGZyb20gJy4uL2NvbnRyYWN0L05vdGlmaWNhdGlvbnMnO1xuaW1wb3J0IHsgVmVyc2lvbk51bWJlciB9IGZyb20gJy4uL2ludGVyZmFjZS9WZXJzaW9uTnVtYmVyJztcbmltcG9ydCB7XG4gIENvbW1hbmRNZXNzYWdlLFxuICBDb21tYW5kUmVzcG9uc2VNZXNzYWdlLFxuICBIYW5kc2hha2VNZXNzYWdlLFxuICBJbml0aWFsaXplTWVzc2FnZSxcbiAgTWVzc2FnZSxcbiAgTWVzc2FnZVR5cGUsXG4gIE5vdGlmaWNhdGlvbk1lc3NhZ2UsXG59IGZyb20gJy4vaW50ZXJmYWNlL01lc3NhZ2VUeXBlcyc7XG5cbmNvbnN0IGV4cGVjdGVkRW1wdHlOb3RpZmljYXRpb25zID0gbmV3IFNldChbXG4gIE5vdGlmaWNhdGlvbklkLkVkaXRCdXR0b25DbGlja2VkLFxuICBOb3RpZmljYXRpb25JZC5FZGl0SW5EZXNrdG9wQnV0dG9uQ2xpY2tlZCxcbiAgTm90aWZpY2F0aW9uSWQuV29ya2Jvb2tQdWJsaXNoZWQsXG4gIE5vdGlmaWNhdGlvbklkLldvcmtib29rUmVhZHlUb0Nsb3NlLFxuICBOb3RpZmljYXRpb25JZC5SZWFkeVRvUmVjZWl2ZUF1dGhUb2tlbixcbl0pO1xuXG4vKiB0c2xpbnQ6ZGlzYWJsZSBuby1hbnkgKi9cbmV4cG9ydCBmdW5jdGlvbiBpc01lc3NhZ2UoZGF0YTogTWVzc2FnZSB8IGFueSk6IGRhdGEgaXMgTWVzc2FnZSB7XG4gIGlmICghZGF0YSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IG1lc3NhZ2UgPSBkYXRhIGFzIE1lc3NhZ2U7XG4gIGlmICghbWVzc2FnZSB8fCAhbWVzc2FnZS5tc2dHdWlkIHx8ICFtZXNzYWdlLm1zZ1R5cGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWd1aWQuaXNHdWlkKG1lc3NhZ2UubXNnR3VpZCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAodHlwZW9mIG1lc3NhZ2UubXNnVHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBtZXNzYWdlVHlwZXM6IEFycmF5PHN0cmluZz4gPSBbXG4gICAgTWVzc2FnZVR5cGUuQ29tbWFuZCxcbiAgICBNZXNzYWdlVHlwZS5Db21tYW5kUmVzcG9uc2UsXG4gICAgTWVzc2FnZVR5cGUuSW5pdGlhbGl6ZSxcbiAgICBNZXNzYWdlVHlwZS5Ob3RpZmljYXRpb24sXG4gICAgTWVzc2FnZVR5cGUuSGFuZHNoYWtlLFxuICBdO1xuXG4gIGlmIChtZXNzYWdlVHlwZXMuaW5kZXhPZihtZXNzYWdlLm1zZ1R5cGUpIDwgMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNWZXJzaW9uKHZlcnNpb25OdW1iZXI6IFZlcnNpb25OdW1iZXIgfCBhbnkpOiB2ZXJzaW9uTnVtYmVyIGlzIFZlcnNpb25OdW1iZXIge1xuICBpZiAoIXZlcnNpb25OdW1iZXIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCB2ID0gdmVyc2lvbk51bWJlciBhcyBWZXJzaW9uTnVtYmVyO1xuXG4gIGlmICh0eXBlb2YgdiAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAodHlwZW9mIHYuZml4ICE9PSAnbnVtYmVyJyB8fCB0eXBlb2Ygdi5taW5vciAhPT0gJ251bWJlcicgfHwgdHlwZW9mIHYubWFqb3IgIT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0luaXRNZXNzYWdlKG1lc3NhZ2U6IEluaXRpYWxpemVNZXNzYWdlIHwgYW55KTogbWVzc2FnZSBpcyBJbml0aWFsaXplTWVzc2FnZSB7XG4gIGlmICghaXNNZXNzYWdlKG1lc3NhZ2UpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgaW5pdE1lc3NhZ2UgPSBtZXNzYWdlIGFzIEluaXRpYWxpemVNZXNzYWdlO1xuICBpZiAoaW5pdE1lc3NhZ2UubXNnVHlwZSAhPT0gTWVzc2FnZVR5cGUuSW5pdGlhbGl6ZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghaW5pdE1lc3NhZ2UuYXBpVmVyc2lvbiB8fCAhaXNWZXJzaW9uKGluaXRNZXNzYWdlLmFwaVZlcnNpb24pKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFpbml0TWVzc2FnZS5jcm9zc0ZyYW1lVmVyc2lvbiB8fCAhaXNWZXJzaW9uKGluaXRNZXNzYWdlLmNyb3NzRnJhbWVWZXJzaW9uKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNDb21tYW5kUmVzcG9uc2VNZXNzYWdlKG1lc3NhZ2U6IENvbW1hbmRSZXNwb25zZU1lc3NhZ2UgfCBhbnkpOiBtZXNzYWdlIGlzIENvbW1hbmRSZXNwb25zZU1lc3NhZ2Uge1xuICBpZiAoIWlzTWVzc2FnZShtZXNzYWdlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGNyTWVzc2FnZSA9IG1lc3NhZ2UgYXMgQ29tbWFuZFJlc3BvbnNlTWVzc2FnZTtcbiAgaWYgKGNyTWVzc2FnZS5tc2dUeXBlICE9PSBNZXNzYWdlVHlwZS5Db21tYW5kUmVzcG9uc2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWd1aWQuaXNHdWlkKGNyTWVzc2FnZS5jb21tYW5kR3VpZCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWNyTWVzc2FnZS5kYXRhICYmICFjck1lc3NhZ2UuZXJyb3IpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQ29tbWFuZE1lc3NhZ2UobWVzc2FnZTogQ29tbWFuZE1lc3NhZ2UgfCBhbnkpOiBtZXNzYWdlIGlzIENvbW1hbmRNZXNzYWdlIHtcbiAgaWYgKCFpc01lc3NhZ2UobWVzc2FnZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBjb21tYW5kTWVzc2FnZSA9IG1lc3NhZ2UgYXMgQ29tbWFuZE1lc3NhZ2U7XG4gIGlmIChjb21tYW5kTWVzc2FnZS5tc2dUeXBlICE9PSBNZXNzYWdlVHlwZS5Db21tYW5kKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFjb21tYW5kTWVzc2FnZS5wYXJhbWV0ZXJzIHx8IHR5cGVvZiBjb21tYW5kTWVzc2FnZS5wYXJhbWV0ZXJzICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghY29tbWFuZE1lc3NhZ2UudmVyYklkIHx8IHR5cGVvZiBjb21tYW5kTWVzc2FnZS52ZXJiSWQgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc05vdGlmaWNhdGlvbk1lc3NhZ2UobWVzc2FnZTogTm90aWZpY2F0aW9uTWVzc2FnZSB8IGFueSk6IG1lc3NhZ2UgaXMgTm90aWZpY2F0aW9uTWVzc2FnZSB7XG4gIGlmICghaXNNZXNzYWdlKG1lc3NhZ2UpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3Qgbm90aWZpY2F0aW9uTWVzc2FnZSA9IG1lc3NhZ2UgYXMgTm90aWZpY2F0aW9uTWVzc2FnZTtcbiAgaWYgKG5vdGlmaWNhdGlvbk1lc3NhZ2UubXNnVHlwZSAhPT0gTWVzc2FnZVR5cGUuTm90aWZpY2F0aW9uKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFub3RpZmljYXRpb25NZXNzYWdlLmRhdGEgJiYgIWV4cGVjdGVkRW1wdHlOb3RpZmljYXRpb25zLmhhcyhub3RpZmljYXRpb25NZXNzYWdlLm5vdGlmaWNhdGlvbklkKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghbm90aWZpY2F0aW9uTWVzc2FnZS5ub3RpZmljYXRpb25JZCB8fCB0eXBlb2Ygbm90aWZpY2F0aW9uTWVzc2FnZS5ub3RpZmljYXRpb25JZCAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzSGFuZHNoYWtlTWVzc2FnZShtZXNzYWdlOiBIYW5kc2hha2VNZXNzYWdlIHwgYW55KTogbWVzc2FnZSBpcyBIYW5kc2hha2VNZXNzYWdlIHtcbiAgaWYgKCFpc01lc3NhZ2UobWVzc2FnZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBoYW5kc2hha2VNZXNzYWdlID0gbWVzc2FnZSBhcyBIYW5kc2hha2VNZXNzYWdlO1xuICBpZiAoaGFuZHNoYWtlTWVzc2FnZS5tc2dUeXBlICE9PSBNZXNzYWdlVHlwZS5IYW5kc2hha2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cbiIsImltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBNb2RlbCwgTm90aWZpY2F0aW9uSWQsIFZlcmJJZCwgVmVyc2lvbk51bWJlciB9IGZyb20gJy4uLy4uL0pzQXBpSW50ZXJuYWxDb250cmFjdCc7XG5pbXBvcnQgeyBJbml0aWFsaXphdGlvbk9wdGlvbnMgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2UvSW5pdGlhbGl6YXRpb25PcHRpb25zJztcblxuLyoqXG4gKiBFbnVtIGRlZmluaW5nIHRoZSA0IGRpZmZlcmVudCB0eXBlcyBvZiBtZXNzYWdlcyB3ZSBoYXZlIGRlZmluZWRcbiAqL1xuZXhwb3J0IGVudW0gTWVzc2FnZVR5cGUge1xuICBJbml0aWFsaXplID0gJ2luaXRpYWxpemUnLFxuICBOb3RpZmljYXRpb24gPSAnbm90aWZpY2F0aW9uJyxcbiAgQ29tbWFuZCA9ICdjb21tYW5kJyxcbiAgQ29tbWFuZFJlc3BvbnNlID0gJ2NvbW1hbmQtcmVzcG9uc2UnLFxuICBIYW5kc2hha2UgPSAndi1oYW5kc2hha2UnLFxuICBBY2sgPSAndi1hY2snLFxufVxuXG4vKipcbiAqIFRoZSBNZXNzYWdlIGludGVyZmFjZSBpcyB0aGUgYmFzZSBpbnRlcmZhY2UgZm9yIGFsbCB0aGUgb3RoZXJcbiAqIG1lc3NhZ2UgdHlwZSBpbnRlcmZhY2VzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1lc3NhZ2Uge1xuICAvKipcbiAgICogQSB1bmlxdWUgaWQgZm9yIHRoaXMgbWVzc2FnZVxuICAgKi9cbiAgbXNnR3VpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0aGlzIG1lc3NhZ2VcbiAgICovXG4gIG1zZ1R5cGU6IE1lc3NhZ2VUeXBlO1xufVxuXG4vKipcbiAqIFRoZSBpbml0aWFsaXplIG1lc3NhZ2UgaXMgdGhlIGZpcnN0IG1lc3NhZ2Ugd2hpY2ggd2lsbCBiZSBzZW50XG4gKiBmcm9tIHRoZSBqYXZhc2NyaXB0IHRvIHNldCB1cCBjb21tdW5pY2F0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEluaXRpYWxpemVNZXNzYWdlIGV4dGVuZHMgTWVzc2FnZSB7XG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgYXBpIHdoaWNoIHRoZSBzZW5kZXIgd2FudHMgdG8gdXNlXG4gICAqL1xuICBhcGlWZXJzaW9uOiBWZXJzaW9uTnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBvZiB0aGlzIG1lc3NhZ2luZyBjb250cmFjdCB0byBiZSB1c2VkLiBGb3Igbm93LCB0aGVyZVxuICAgKiBzaG91bGQgb25seSBiZSBhIHNpbmdsZSB2ZXJzaW9uIGJ1dCBzZW5kaW5nIHRoaXMgYWxvbmcgc2hvdWxkIGhlbHBcbiAgICogaWYgd2UgbmVlZCB0byBhZGQgYSBuZXcgdmVyc2lvbiBpbiBhIGZ1dHVyZSByZWxlYXNlXG4gICAqL1xuICBjcm9zc0ZyYW1lVmVyc2lvbjogVmVyc2lvbk51bWJlcjtcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBvcHRpb25zIHRoYXQgY2FuIGJlIHBhc3NlZCBhdCB0aGUgdGltZSBvZiBpbml0aWFsaXphdGlvblxuICAgKi9cbiAgb3B0aW9ucz86IEluaXRpYWxpemF0aW9uT3B0aW9ucztcbn1cblxuLyoqXG4gKiBUaGlzIG1lc3NhZ2UgaXMgc2VudCB3aGVuIGEgbm90aWZpY2F0aW9uIG9jY3VycyBmcm9tIHRoZSBwcmVzbGF5ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOb3RpZmljYXRpb25NZXNzYWdlIGV4dGVuZHMgTWVzc2FnZSB7XG4gIC8qKlxuICAgKiBUaGUgaWQgZm9yIHRoaXMgdHlwZSBvZiBub3RpZmljYXRpb25cbiAgICovXG4gIG5vdGlmaWNhdGlvbklkOiBOb3RpZmljYXRpb25JZDtcblxuICAvKipcbiAgICogVGhlIGRhdGEgd2hpY2ggY2FtZSBhbG9uZyB3aXRoIHRoZSBub3RpZmljYXRpb25cbiAgICovXG4gIGRhdGE6IE1vZGVsO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgY2FsbGluZyBhbiBpbnRlcm5hbCBjb250cmFjdCBjb21tYW5kXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tbWFuZE1lc3NhZ2UgZXh0ZW5kcyBNZXNzYWdlIHtcbiAgLyoqXG4gICAqIFRoZSBpZCBvZiB0aGUgY29tbWFuZCB3aGljaCBzaG91bGQgYmUgZXhlY3V0ZWRcbiAgICovXG4gIHZlcmJJZDogVmVyYklkO1xuXG4gIC8qKlxuICAgKiBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGNvbW1hbmRcbiAgICovXG4gIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzO1xufVxuXG4vKipcbiAqIFRoaXMgbWVzc2FnZSBpcyBzZW50IGluIHJlc3BvbnNlIHRvIGEgQ29tbWFuZE1lc3NhZ2Ugd2l0aCB0aGVcbiAqIHJlc3VsdCBvZiB0aGF0IGNvbW1hbmRzIGludm9jYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21tYW5kUmVzcG9uc2VNZXNzYWdlIGV4dGVuZHMgTWVzc2FnZSB7XG4gIC8qKlxuICAgKiBHdWlkIG9mIHRoZSBDb21tYW5kTWVzc2FnZSB3aGljaCB0aGlzIGlzIGluIHJlc3BvbnNlIHRvXG4gICAqL1xuICBjb21tYW5kR3VpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJZiB0aGVyZSB3YXMgYW4gZXJyb3IgcmV0dXJuZWQgZnJvbSB0aGUgY29tbWFuZCwgdGhpcyB3aWxsIGJlIGRlZmluZWRcbiAgICogYW5kIGNvbnRhaW4gdGhlIGVycm9yXG4gICAqL1xuICBlcnJvcj86IE1vZGVsO1xuXG4gIC8qKlxuICAgKiBJZiB0aGUgY29tbWFuZCBleGVjdXRlZCBzdWNjZXNzZnVsbHksIHRoaXMgd2lsbCBjb250YWluIHRoZSBjb21tYW5kIHJlc3VsdFxuICAgKi9cbiAgZGF0YT86IE1vZGVsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEhhbmRzaGFrZU1lc3NhZ2UgZXh0ZW5kcyBNZXNzYWdlIHtcbiAgLyoqXG4gICAqIEludGVybmFsIEFQSSBjb250cmFjdCB2ZXJzaW9uXG4gICAqL1xuICBwbGF0Zm9ybVZlcnNpb246IFZlcnNpb25OdW1iZXI7XG59XG4iLCJpbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgRXhlY3V0ZVJlc3BvbnNlLCBOb3RpZmljYXRpb24sIFZlcmJJZCB9IGZyb20gJy4uL0pzQXBpSW50ZXJuYWxDb250cmFjdCc7XG5pbXBvcnQgeyBJbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB9IGZyb20gJy4vSW50ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXInO1xuXG4vLyB0c2xpbnQ6ZGlzYWJsZTpuby1hbnlcblxuLyoqXG4gKiBUaGlzIHZlcnNpb24gY29udmVydGVyIGRvZXNuJ3QgYWN0dWFsbHkgZG8gYW55dGhpbmcgYnV0IGlzIHVzZWZ1bCBmb3IgdGVzdGluZyBvciB3aGVuIHdlIGhhdmVcbiAqIGEgbWF0Y2hpbmcgcGxhdGZvcm0gYW5kIGludGVybmFsIHZlcnNpb24gbnVtYmVyXG4gKi9cbmV4cG9ydCBjbGFzcyBJZGVudGl0eVZlcnNpb25Db252ZXJ0ZXIgaW1wbGVtZW50cyBJbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB7XG4gIHB1YmxpYyB1cGdyYWRlRXhlY3V0ZUNhbGwodmVyYjogYW55LCBwYXJhbWV0ZXJzOiBhbnkpOiB7IHZlcmI6IFZlcmJJZDsgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgfSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZlcmI6IHZlcmIgYXMgVmVyYklkLFxuICAgICAgcGFyYW1ldGVyczogcGFyYW1ldGVycyBhcyBFeGVjdXRlUGFyYW1ldGVycyxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGRvd25ncmFkZUV4ZWN1dGVSZXR1cm4oZXhlY3V0ZVJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UpOiBFeGVjdXRlUmVzcG9uc2Uge1xuICAgIHJldHVybiBleGVjdXRlUmVzcG9uc2U7XG4gIH1cblxuICBwdWJsaWMgZG93bmdyYWRlTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uKTogTm90aWZpY2F0aW9uIHtcbiAgICByZXR1cm4gbm90aWZpY2F0aW9uO1xuICB9XG59XG4iLCJpbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgRXhlY3V0ZVJlc3BvbnNlLCBOb3RpZmljYXRpb24sIFZlcmJJZCwgVmVyc2lvbk51bWJlciB9IGZyb20gJy4uL0pzQXBpSW50ZXJuYWxDb250cmFjdCc7XG5pbXBvcnQgeyBJbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB9IGZyb20gJy4vSW50ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXInO1xuaW1wb3J0ICogYXMgVHJhbnNsYXRpb25zIGZyb20gJy4vVmVyc2lvblRyYW5zbGF0aW9ucyc7XG5cbi8vIHRzbGludDpkaXNhYmxlOm5vLWFueVxuXG4vKipcbiAqIFRoZSB2ZXJzaW9uIGNvbnZlcnRlciBpcyBkZXNpZ25lZCB0byBhbGxvdyB0aGUgcGxhdGZvcm0gYW5kIGV4dGVybmFsIG1vZHVsZXNcbiAqIHRvIHNlZW1sZXNzbHkgY29tbXVuaWNhdGUgb3ZlciB0d28gZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoZSBpbnRlcm5hbCBBUEkuIFRoZSBvbmx5XG4gKiBtb2RlIGl0IHN1cHBvcnRzIGlzIGV4dGVybmFsJ3MgdmVyc2lvbiA8PSBwbGF0Zm9ybSdzIHZlcnNpb24uIFdoZW4gZXhlY3V0aW5nXG4gKiBjb21tYW5kcywgaXQgaXMgdXNlZCB0byB1cGdyYWRlIHRoZSBleHRlcm5hbCByZXByZXNlbnRhdGlvbiB0byB3aGF0IHBsYXRmb3JtIGtub3dzIG9uIHRoZSB3YXkgaW5cbiAqIGFuZCBkb3duZ3JhZGUgdGhlIHJlcHJlc2VudGF0aW9ucyBvbiB0aGUgd2F5IG91dC4gU2ltaWxhcmx5IGZvciBub3RpZmljYXRpb25zLCBpdCBjYW5cbiAqIGRvd25ncmFkZSB0aG9zZSBvbiB0aGUgd2F5IGZyb20gcGxhdGZvcm0gdG8gZXh0ZXJuYWwuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIgaW1wbGVtZW50cyBJbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXJcbiAgICpcbiAgICogQHBhcmFtIF9leHRlcm5hbFZlcnNpb24gVGhlIHZlcnNpb24gb2YgdGhlIGludGVybmFsIGNvbnRyYWN0IGFwaS1leHRlcm5hbC1qcyBpcyB1c2luZ1xuICAgKiBAcGFyYW0gX3BsYXRmb3JtVmVyc2lvbiBUaGUgdmVyc2lvbiBvZiB0aGUgaW50ZXJuYWwgY29udHJhY3QgdGhlIGFwaS1wbGF0Zm9ybS1qcyBpcyB1c2luZ1xuICAgKiBAcGFyYW0gX3VwZ3JhZGVFeGVjdXRlVHJhbnNsYXRpb25zIE9yZGVyZWQgbGlzdCBvZiB0aGUgdHJhbnNsYXRpb25zIHRvIHBlcmZvcm0gd2hlbiB1cGdyYWRpbmcgY21kIHBhcmFtZXRlcnNcbiAgICogQHBhcmFtIF9kb3duZ3JhZGVFeGVjdXRlVHJhbnNsYXRpb25zIE9yZGVyZWQgbGlzdCBvZiBkb3duZ3JhZGUgdHJhbnNsYXRpb25zIHRvIHBlcmZvcm0gYWZ0ZXIgYSBjbWRcbiAgICogQHBhcmFtIF9kb3duZ3JhZGVOb3RpZmljYXRpb25UcmFuc2xhdGlvbnMgT3JkZXJlZCBsaXN0IG9mIGRvd25ncmFkZSB0cmFuc2xhdGlvbnMgdG8gcGVyZm9ybSBvbiBhIG5vdGlmaWNhdGlvblxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tRGF0YShcbiAgICBleHRlcm5hbFZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4gICAgcGxhdGZvcm1WZXJzaW9uOiBWZXJzaW9uTnVtYmVyLFxuICAgIHVwZ3JhZGVFeGVjdXRlVHJhbnNsYXRpb25zOiBBcnJheTxUcmFuc2xhdGlvbnMuVXBncmFkZUV4ZWN1dGVDYWxsPixcbiAgICBkb3duZ3JhZGVFeGVjdXRlVHJhbnNsYXRpb25zOiBBcnJheTxUcmFuc2xhdGlvbnMuRG93bmdyYWRlRXhlY3V0ZVJldHVybj4sXG4gICAgZG93bmdyYWRlTm90aWZpY2F0aW9uVHJhbnNsYXRpb25zOiBBcnJheTxUcmFuc2xhdGlvbnMuRG93bmdyYWRlTm90aWZpY2F0aW9uPixcbiAgKTogU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyIHtcbiAgICByZXR1cm4gbmV3IHRoaXMoXG4gICAgICBleHRlcm5hbFZlcnNpb24ubWFqb3IsXG4gICAgICBwbGF0Zm9ybVZlcnNpb24ubWFqb3IsXG4gICAgICB1cGdyYWRlRXhlY3V0ZVRyYW5zbGF0aW9ucyxcbiAgICAgIGRvd25ncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnMsXG4gICAgICBkb3duZ3JhZGVOb3RpZmljYXRpb25UcmFuc2xhdGlvbnMsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXJcbiAgICpcbiAgICogQHBhcmFtIF9leHRlcm5hbE1ham9yVmVyc2lvbiBUaGUgbWFqb3IgdmVyc2lvbiBvZiB0aGUgaW50ZXJuYWwgY29udHJhY3QgYXBpLWV4dGVybmFsLWpzIGlzIHVzaW5nXG4gICAqIEBwYXJhbSBfcGxhdGZvcm1NYWpvclZlcnNpb24gVGhlIG1ham9yIHZlcnNpb24gb2YgdGhlIGludGVybmFsIGNvbnRyYWN0IHRoZSBhcGktcGxhdGZvcm0tanMgaXMgdXNpbmdcbiAgICogQHBhcmFtIF91cGdyYWRlRXhlY3V0ZVRyYW5zbGF0aW9ucyBPcmRlcmVkIGxpc3Qgb2YgdGhlIHRyYW5zbGF0aW9ucyB0byBwZXJmb3JtIHdoZW4gdXBncmFkaW5nIGNtZCBwYXJhbWV0ZXJzXG4gICAqIEBwYXJhbSBfZG93bmdyYWRlRXhlY3V0ZVRyYW5zbGF0aW9ucyBPcmRlcmVkIGxpc3Qgb2YgZG93bmdyYWRlIHRyYW5zbGF0aW9ucyB0byBwZXJmb3JtIGFmdGVyIGEgY21kXG4gICAqIEBwYXJhbSBfZG93bmdyYWRlTm90aWZpY2F0aW9uVHJhbnNsYXRpb25zIE9yZGVyZWQgbGlzdCBvZiBkb3duZ3JhZGUgdHJhbnNsYXRpb25zIHRvIHBlcmZvcm0gb24gYSBub3RpZmljYXRpb25cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9leHRlcm5hbE1ham9yVmVyc2lvbjogbnVtYmVyLFxuICAgIHByaXZhdGUgX3BsYXRmb3JtTWFqb3JWZXJzaW9uOiBudW1iZXIsXG4gICAgcHJpdmF0ZSBfdXBncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnM6IEFycmF5PFRyYW5zbGF0aW9ucy5VcGdyYWRlRXhlY3V0ZUNhbGw+LFxuICAgIHByaXZhdGUgX2Rvd25ncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnM6IEFycmF5PFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVFeGVjdXRlUmV0dXJuPixcbiAgICBwcml2YXRlIF9kb3duZ3JhZGVOb3RpZmljYXRpb25UcmFuc2xhdGlvbnM6IEFycmF5PFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVOb3RpZmljYXRpb24+LFxuICApIHtcbiAgICBpZiAodGhpcy5fZXh0ZXJuYWxNYWpvclZlcnNpb24gPiB0aGlzLl9wbGF0Zm9ybU1ham9yVmVyc2lvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY29udmVydCBiZXR3ZWVuIGV4dGVybmFsIHZlcnNpb24gJHt0aGlzLl9leHRlcm5hbE1ham9yVmVyc2lvbn0gYW5kICR7dGhpcy5fcGxhdGZvcm1NYWpvclZlcnNpb259YCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHVwZ3JhZGVFeGVjdXRlQ2FsbCh2ZXJiOiBhbnksIHBhcmFtZXRlcnM6IGFueSk6IHsgdmVyYjogVmVyYklkOyBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyB9IHtcbiAgICAvLyBQZXJmb3JtIHRoZSB1cGdyYWRlIG9mIHRoZSB2ZXJiIGFuZCBwYXJhbWV0ZXJzIHRvIHRoZSBsZXZlbCB0aGF0IHBsYXRmb3JtIGlzIHVzaW5nXG4gICAgbGV0IHVwZ3JhZGVkID0geyB2ZXJiOiB2ZXJiLCBwYXJhbWV0ZXJzOiBwYXJhbWV0ZXJzIH07XG4gICAgZm9yIChjb25zdCB1cGdyYWRlVHJhbnNsYXRpb24gb2YgdGhpcy5fdXBncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnMpIHtcbiAgICAgIHVwZ3JhZGVkID0gdXBncmFkZVRyYW5zbGF0aW9uKHVwZ3JhZGVkLnZlcmIsIHVwZ3JhZGVkLnBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIHJldHVybiB1cGdyYWRlZDtcbiAgfVxuXG4gIHB1YmxpYyBkb3duZ3JhZGVFeGVjdXRlUmV0dXJuKGV4ZWN1dGVSZXNwb25zZTogRXhlY3V0ZVJlc3BvbnNlKTogRXhlY3V0ZVJlc3BvbnNlIHtcbiAgICAvLyBEb3duZ3JhZGUgdGhlIHJlc3BvbnNlIHRvIHdoYXQgdGhlIGV4dGVybmFsIG1vZHVsZSBpcyBleHBlY3RpbmdcbiAgICBsZXQgZG93bmdyYWRlZCA9IGV4ZWN1dGVSZXNwb25zZTtcbiAgICBmb3IgKGNvbnN0IGRvd25ncmFkZVRyYW5zbGF0aW9uIG9mIHRoaXMuX2Rvd25ncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnMpIHtcbiAgICAgIGRvd25ncmFkZWQgPSBkb3duZ3JhZGVUcmFuc2xhdGlvbihkb3duZ3JhZGVkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZG93bmdyYWRlZDtcbiAgfVxuXG4gIHB1YmxpYyBkb3duZ3JhZGVOb3RpZmljYXRpb24obm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24pOiBOb3RpZmljYXRpb24ge1xuICAgIC8vIERvd25ncmFkZSB0aGUgbm90aWZpY2F0aW9uIHRvIHdoYXQgdGhlIGV4dGVybmFsIG1vZHVsZSBpcyBleHBlY3RpbmdcbiAgICBsZXQgZG93bmdyYWRlZCA9IG5vdGlmaWNhdGlvbjtcbiAgICBmb3IgKGNvbnN0IGRvd25ncmFkZVRyYW5zbGF0aW9uIG9mIHRoaXMuX2Rvd25ncmFkZU5vdGlmaWNhdGlvblRyYW5zbGF0aW9ucykge1xuICAgICAgZG93bmdyYWRlZCA9IGRvd25ncmFkZVRyYW5zbGF0aW9uKGRvd25ncmFkZWQpO1xuICAgIH1cblxuICAgIHJldHVybiBkb3duZ3JhZGVkO1xuICB9XG59XG4iLCJpbXBvcnQgeyBWZXJzaW9uTnVtYmVyIH0gZnJvbSAnLi4vSnNBcGlJbnRlcm5hbENvbnRyYWN0JztcbmltcG9ydCB7IElkZW50aXR5VmVyc2lvbkNvbnZlcnRlciB9IGZyb20gJy4vSWRlbnRpdHlWZXJzaW9uQ29udmVydGVyJztcbmltcG9ydCB7IEludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIH0gZnJvbSAnLi9JbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcic7XG5pbXBvcnQgeyBTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIgfSBmcm9tICcuL1N0YWNraW5nVmVyc2lvbkNvbnZlcnRlcic7XG5pbXBvcnQgKiBhcyBUcmFuc2xhdGlvbnMgZnJvbSAnLi9WZXJzaW9uVHJhbnNsYXRpb25zJztcbmltcG9ydCB7XG4gIERvd25ncmFkZUV4dGVuc2lvbkVudmlyb25tZW50Q29udGV4dCxcbiAgRG93bmdyYWRlRmxpcGJvYXJkWm9uZUlELFxuICBEb3duZ3JhZGVXb3Jrc2hlZXRGb21hdHRpbmcxNzUsXG4gIERvd25ncmFkZVdvcmtzaGVldEZvbWF0dGluZ05vdGlmaWNhdGlvbjE3NSxcbiAgRG93bmdyYWRlV29ya3NoZWV0TmFtZXMsXG59IGZyb20gJy4vVmVyc2lvblRyYW5zbGF0aW9ucyc7XG5cbi8qKlxuICogQHJldHVybnMgdHJ1ZSBpZiBsaHMgPCByaHMgKGlnbm9yaW5nIGZpeCBudW1iZXIpXG4gKiBAcGFyYW0gbGhzXG4gKiBAcGFyYW0gcmhzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBWZXJzaW9uTGVzc1RoYW4obGhzOiBWZXJzaW9uTnVtYmVyLCByaHM6IFZlcnNpb25OdW1iZXIpOiBib29sZWFuIHtcbiAgaWYgKGxocy5tYWpvciA+IHJocy5tYWpvcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAobGhzLm1ham9yIDwgcmhzLm1ham9yKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGxocy5taW5vciA8IHJocy5taW5vcjtcbn1cblxuLyoqXG4gKiBAcmV0dXJucyB0cnVlIGlmIGxocyA9PSByaHMgKGlnbm9yaW5nIGZpeCBudW1iZXIpXG4gKiBAcGFyYW0gbGhzXG4gKiBAcGFyYW0gcmhzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBWZXJzaW9uRXF1YWxUbyhsaHM6IFZlcnNpb25OdW1iZXIsIHJoczogVmVyc2lvbk51bWJlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gbGhzLm1ham9yID09PSByaHMubWFqb3IgJiYgbGhzLm1pbm9yID09PSByaHMubWlub3I7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWFqb3JNaW5vclRyYW5zbGF0b3JzPFQ+IHtcbiAgW21ham9yOiBudW1iZXJdOiB7IFttaW5vcjogbnVtYmVyXTogQXJyYXk8VD4gfTtcbn1cblxuLy8gQSBtYXBwaW5nIGZyb20gYW4gb2xkZXIgY2xpZW50IHZlcnNpb24gb2YgaW50ZXJuYWwtY29udHJhY3QgdG8gdGhlIGN1cnJlbnQgcGxhdGZvcm0gdmVyc2lvbiBvZiB0aGlzIGNvbnRyYWN0LlxuLy8gRWFjaCB2ZXJzaW9uIGJ1bXAgY2FuIGhhdmUgYW4gYXJyYXkgb2YgdHJhbnNsYXRpb25zIHRvIHBlcmZvcm0gaW4gb3JkZXIuIE5vdGljZSB0aGF0IHRoaXMgaXNcbi8vIGRpZmZlcmVudCB0aGFuIHRoZSBtYWpvciB1cGdyYWRlcy9kb3duZ3JhZGVzIGFib3ZlIGJlY2F1c2UgaXQgaGFuZGxlcyBib3RoIG1ham9yIGFuZCBtaW5vciB2ZXJzaW9uIGNoYW5nZXMuXG4vLyBBbHNvIHBsZWFzZSBub3RlOiBkb3duZ3JhZGVFeGVjdXRlQ2FsbCBpcyBoYW5kbGVkIG9uIHRoZSBjbGllbnQvZXh0ZXJuYWwgc2lkZSByYXRoZXIgdGhhbiBwbGF0Zm9ybSBzaWRlLlxuLy8gV2hlbiB1cGRhdGluZyB0aGUgbWFqb3Igb3IgbWlub3IgdmVyc2lvbiBvZiBvdXIgaW50ZXJuYWwtY29udHJhY3QsIHlvdSB3aWxsIG5lZWQgdG8gdXBkYXRlIHRoZXNlIGRhdGEgc3RydWN0dXJlcy5cbi8vICogSWYgdGhlcmUgYXJlIHRyYW5zbGF0aW9ucyB0byBhZGQsIGFkZCB0aGVtIHRvIHRoZSB2ZXJzaW9uIHRvIFwidXBncmFkZSBmcm9tXCIgb3IgXCJkb3duZ3JhZGUgdG9cIi5cbmV4cG9ydCBjb25zdCBFeGVjdXRlTWlub3JVcGdyYWRlczogTWFqb3JNaW5vclRyYW5zbGF0b3JzPFRyYW5zbGF0aW9ucy5VcGdyYWRlRXhlY3V0ZUNhbGw+ID0ge1xuICAxOiB7XG4gICAgOTogW10sIC8vIE5vdGUgdGhhdCB3ZSBwdXQgdXBncmFkZXMgZnJvbSAxLjkgdG8gMS4xMCBpbiB0aGUgWzFdWzldIGJ1Y2tldFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IEV4ZWN1dGVNaW5vckRvd25ncmFkZXM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnMuRG93bmdyYWRlRXhlY3V0ZVJldHVybj4gPSB7XG4gIDE6IHtcbiAgICA1OiBbRG93bmdyYWRlV29ya3NoZWV0TmFtZXNdLFxuICAgIDk6IFtdLFxuICAgIDE3NTogW0Rvd25ncmFkZVdvcmtzaGVldEZvbWF0dGluZzE3NV0sXG4gICAgMTgyOiBbRG93bmdyYWRlRXh0ZW5zaW9uRW52aXJvbm1lbnRDb250ZXh0XSxcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBOb3RpZmljYXRpb25NaW5vckRvd25ncmFkZXM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnMuRG93bmdyYWRlTm90aWZpY2F0aW9uPiA9IHtcbiAgMToge1xuICAgIDk6IFtdLFxuICAgIDEwOiBbRG93bmdyYWRlRmxpcGJvYXJkWm9uZUlEXSxcbiAgICAxNzU6IFtEb3duZ3JhZGVXb3Jrc2hlZXRGb21hdHRpbmdOb3RpZmljYXRpb24xNzVdLFxuICB9LFxufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IEludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIHdoaWNoIGhhcyB0aGUgYWJpbGl0eSB0byB1cGdyYWRlIGFuZCBkb3duZ3JhZGUgdGhlIGNvbnRyYWN0XG4gKiBiZXR3ZWVuIHRoZSB0d28gdmVyc2lvbnMsIHdoaWNoIGFyZSBzcGVjaWZpZWQuIElmIGV4dGVybmFsTWFqb3JWZXJzaW9uIGlzIGdyZWF0ZXIgdGhhbiBwbGF0Zm9ybU1ham9yVmVyc2lvbixcbiAqIGFuIGVycm9yIHdpbGwgYmUgdGhyb3duIGJlY2F1c2Ugd2Ugd29uJ3Qga25vdyBob3cgdG8gZG8gdGhvc2UgY29udmVyc2lvbnMuXG4gKiBUaGlzIGNvbnZlcnRlciBjYW4gaGFuZGxlIGJvdGggbWFqb3IgYW5kIG1pbm9yIHVwZGF0ZXMgd2hlbiB0aGUgcGxhdGZvcm0gdmVyc2lvbiBpcyBncmVhdGVyIHRoYW4gZXh0ZXJuYWwgdmVyc2lvbi5cbiAqXG4gKiBAcGFyYW0gZXh0ZXJuYWxWZXJzaW9uIFZlcnNpb25OdW1iZXIgb2YgdGhlIGludGVybmFsIGFwaSB3aGljaCB0aGUgZXh0ZXJuYWwgbW9kdWxlIGlzIHVzaW5nXG4gKiBAcGFyYW0gcGxhdGZvcm1WZXJzaW9uIFZlcnNpb25OdW1iZXIgb2YgdGhlIGludGVybmFsIGFwaSB3aGljaCB0aGUgcGxhdGZvcm0gaXMgdXNpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENyZWF0ZVZlcnNpb25Db252ZXJ0ZXIoZXh0ZXJuYWxWZXJzaW9uOiBWZXJzaW9uTnVtYmVyLCBwbGF0Zm9ybVZlcnNpb246IFZlcnNpb25OdW1iZXIpOiBJbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB7XG4gIHJldHVybiBDcmVhdGVWZXJzaW9uQ29udmVydGVyV2l0aFRyYW5zbGF0b3JzKFxuICAgIGV4dGVybmFsVmVyc2lvbixcbiAgICBwbGF0Zm9ybVZlcnNpb24sXG4gICAgRXhlY3V0ZU1pbm9yVXBncmFkZXMsXG4gICAgRXhlY3V0ZU1pbm9yRG93bmdyYWRlcyxcbiAgICBOb3RpZmljYXRpb25NaW5vckRvd25ncmFkZXMsXG4gICk7XG59XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgQ3JlYXRlVmVyc2lvbkNvbnZlcnRlci4gVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgdXBncmFkZSwgZG93bmdyYWRlLCBhbmRcbiAqIG5vdGlmaWNhdGlvbiBhcnJheXMgc28gdGhhdCBhbGwgdGhlIGxvZ2ljIGNhbiBiZSB0ZXN0ZWQuXG4gKlxuICogQHBhcmFtIGV4dGVybmFsVmVyc2lvbiBWZXJzaW9uTnVtYmVyIG9mIHRoZSBpbnRlcm5hbCBhcGkgd2hpY2ggdGhlIGV4dGVybmFsIG1vZHVsZSBpcyB1c2luZ1xuICogQHBhcmFtIHBsYXRmb3JtVmVyc2lvbiBWZXJzaW9uTnVtYmVyIG9mIHRoZSBpbnRlcm5hbCBhcGkgd2hpY2ggdGhlIHBsYXRmb3JtIGlzIHVzaW5nXG4gKiBAcGFyYW0gdXBncmFkZXMgTWFqb3JNaW5vclRyYW5zbGF0b3JzIGZvciB1cGdyYWRlc1xuICogQHBhcmFtIGRvd25ncmFkZXMgTWFqb3JNaW5vclRyYW5zbGF0b3JzIGZvciBkb3duZ3JhZGVzXG4gKiBAcGFyYW0gbm90aWZpY2F0aW9uRG93bmdyYWRlcyBNYWpvck1pbm9yVHJhbnNsYXRvcnMgZm9yIG5vdGlmaWNhdGlvbiBkb3duZ3JhZGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDcmVhdGVWZXJzaW9uQ29udmVydGVyV2l0aFRyYW5zbGF0b3JzKFxuICBleHRlcm5hbFZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4gIHBsYXRmb3JtVmVyc2lvbjogVmVyc2lvbk51bWJlcixcbiAgdXBncmFkZXM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnMuVXBncmFkZUV4ZWN1dGVDYWxsPixcbiAgZG93bmdyYWRlczogTWFqb3JNaW5vclRyYW5zbGF0b3JzPFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVFeGVjdXRlUmV0dXJuPixcbiAgbm90aWZpY2F0aW9uRG93bmdyYWRlczogTWFqb3JNaW5vclRyYW5zbGF0b3JzPFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVOb3RpZmljYXRpb24+LFxuKTogSW50ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXIge1xuICBjb25zdCBleHRlcm5hbE1ham9yVmVyc2lvbjogbnVtYmVyID0gZXh0ZXJuYWxWZXJzaW9uLm1ham9yO1xuICBjb25zdCBleHRlcm5hbE1pbm9yVmVyc2lvbjogbnVtYmVyID0gZXh0ZXJuYWxWZXJzaW9uLm1pbm9yO1xuICBjb25zdCBwbGF0Zm9ybU1ham9yVmVyc2lvbjogbnVtYmVyID0gcGxhdGZvcm1WZXJzaW9uLm1ham9yO1xuXG4gIGlmIChleHRlcm5hbE1ham9yVmVyc2lvbiA+IHBsYXRmb3JtTWFqb3JWZXJzaW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFeHRlcm5hbCB2ZXJzaW9uIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHBsYXRmb3JtIHZlcnNpb24uXG4gICAgZXh0ZXJuYWxNYWpvclZlcnNpb249JHtleHRlcm5hbE1ham9yVmVyc2lvbn0gcGxhdGZvcm1NYWpvclZlcnNpb249JHtwbGF0Zm9ybU1ham9yVmVyc2lvbn1gKTtcbiAgfVxuXG4gIC8vIElmIHdlIGFyZSB1c2luZyB0aGUgZXhhY3Qgc2FtZSB2ZXJzaW9ucyAobWFqb3IubWlub3IpLCBqdXN0IHVzZSB0aGUgaWRlbnRpdHkgY29udmVydGVyXG4gIGlmIChWZXJzaW9uRXF1YWxUbyhleHRlcm5hbFZlcnNpb24sIHBsYXRmb3JtVmVyc2lvbikpIHtcbiAgICByZXR1cm4gbmV3IElkZW50aXR5VmVyc2lvbkNvbnZlcnRlcigpO1xuICB9XG5cbiAgLy8gV2FsayB0aGUgc3BhbiBiZXR3ZWVuIHRoZSB2ZXJzaW9ucyB3ZSBoYXZlIGhlcmUgYW5kIGNvbGxlY3QgdGhlIHVwZ3JhZGUgYW5kIGRvd25ncmFkZXMgbmVjZXNzYXJ5XG4gIGNvbnN0IG5lZWRlZEV4ZWN1dGVVcGdyYWRlczogQXJyYXk8VHJhbnNsYXRpb25zLlVwZ3JhZGVFeGVjdXRlQ2FsbD4gPSBHZXROZWVkZWRUcmFuc2xhdGlvbnMoXG4gICAgZXh0ZXJuYWxNYWpvclZlcnNpb24sXG4gICAgcGxhdGZvcm1NYWpvclZlcnNpb24sXG4gICAgZXh0ZXJuYWxNaW5vclZlcnNpb24sXG4gICAgdXBncmFkZXMsXG4gICk7XG5cbiAgY29uc3QgbmVlZGVkRXhlY3V0ZURvd25ncmFkZXM6IEFycmF5PFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVFeGVjdXRlUmV0dXJuPiA9IEdldE5lZWRlZFRyYW5zbGF0aW9ucyhcbiAgICBleHRlcm5hbE1ham9yVmVyc2lvbixcbiAgICBwbGF0Zm9ybU1ham9yVmVyc2lvbixcbiAgICBleHRlcm5hbE1pbm9yVmVyc2lvbixcbiAgICBkb3duZ3JhZGVzLFxuICApO1xuXG4gIGNvbnN0IG5lZWRlZE5vdGlmaWNhdGlvbkRvd25ncmFkZXM6IEFycmF5PFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVOb3RpZmljYXRpb24+ID0gR2V0TmVlZGVkVHJhbnNsYXRpb25zKFxuICAgIGV4dGVybmFsTWFqb3JWZXJzaW9uLFxuICAgIHBsYXRmb3JtTWFqb3JWZXJzaW9uLFxuICAgIGV4dGVybmFsTWlub3JWZXJzaW9uLFxuICAgIG5vdGlmaWNhdGlvbkRvd25ncmFkZXMsXG4gICk7XG5cbiAgLy8gV2Ugd2FudCB0byBhcHBseSB0aGUgZG93bmdyYWRlcyBpbiByZXZlcnNlIG9yZGVyIGluIGNhc2Ugb2YgZGVwZW5kZW5jaWVzIGJldHdlZW4gdGhlbVxuICBuZWVkZWRFeGVjdXRlRG93bmdyYWRlcy5yZXZlcnNlKCk7XG4gIG5lZWRlZE5vdGlmaWNhdGlvbkRvd25ncmFkZXMucmV2ZXJzZSgpO1xuXG4gIHJldHVybiBTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIuZnJvbURhdGEoXG4gICAgZXh0ZXJuYWxWZXJzaW9uLFxuICAgIHBsYXRmb3JtVmVyc2lvbixcbiAgICBuZWVkZWRFeGVjdXRlVXBncmFkZXMsXG4gICAgbmVlZGVkRXhlY3V0ZURvd25ncmFkZXMsXG4gICAgbmVlZGVkTm90aWZpY2F0aW9uRG93bmdyYWRlcyxcbiAgKTtcbn1cblxuZnVuY3Rpb24gR2V0TmVlZGVkVHJhbnNsYXRpb25zPFQ+KFxuICBleHRlcm5hbE1ham9yVmVyc2lvbjogbnVtYmVyLFxuICBwbGF0Zm9ybU1ham9yVmVyc2lvbjogbnVtYmVyLFxuICBleHRlcm5hbE1pbm9yVmVyc2lvbjogbnVtYmVyLFxuICBtYWpvck1pbm9yVHJhbnNsYXRvcnM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUPixcbik6IEFycmF5PFQ+IHtcbiAgY29uc3QgbmVlZGVkVHJhbnNsYXRpb25zOiBBcnJheTxUPiA9IFtdO1xuXG4gIGZvciAobGV0IG1ham9yID0gZXh0ZXJuYWxNYWpvclZlcnNpb247IG1ham9yIDw9IHBsYXRmb3JtTWFqb3JWZXJzaW9uOyBtYWpvcisrKSB7XG4gICAgaWYgKG1ham9yIGluIG1ham9yTWlub3JUcmFuc2xhdG9ycykge1xuICAgICAgY29uc3Qgc3RhcnQgPSBtYWpvciA9PT0gZXh0ZXJuYWxNYWpvclZlcnNpb24gPyBleHRlcm5hbE1pbm9yVmVyc2lvbiA6IDA7XG4gICAgICBjb25zdCBtYXhpbXVtTWlub3JWZXJzaW9uID0gR2V0TWF4aW11bU1pbm9ySW5kZXgoT2JqZWN0LmtleXMobWFqb3JNaW5vclRyYW5zbGF0b3JzW21ham9yXSkpO1xuICAgICAgZm9yIChsZXQgbWlub3IgPSBzdGFydDsgbWlub3IgPD0gbWF4aW11bU1pbm9yVmVyc2lvbjsgbWlub3IrKykge1xuICAgICAgICBpZiAobWlub3IgaW4gbWFqb3JNaW5vclRyYW5zbGF0b3JzW21ham9yXSkge1xuICAgICAgICAgIG5lZWRlZFRyYW5zbGF0aW9ucy5wdXNoKC4uLm1ham9yTWlub3JUcmFuc2xhdG9yc1ttYWpvcl1bbWlub3JdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZWVkZWRUcmFuc2xhdGlvbnM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBHZXRNYXhpbXVtTWlub3JJbmRleChtaW5vclZlcnNpb25zOiBBcnJheTxzdHJpbmc+KTogbnVtYmVyIHtcbiAgcmV0dXJuIG1pbm9yVmVyc2lvbnMubWFwKChhKSA9PiBOdW1iZXIoYSkpLnJlZHVjZSgoYSwgYikgPT4gKGEgPiBiID8gYSA6IGIpKTtcbn1cbiIsImltcG9ydCB7XG4gIENsYXNzTmFtZUtleSxcbiAgRXhlY3V0ZVBhcmFtZXRlcnMsXG4gIEV4ZWN1dGVSZXNwb25zZSxcbiAgRXh0ZW5zaW9uQm9vdHN0cmFwSW5mbyxcbiAgRXh0ZW5zaW9uQ29udGV4dCxcbiAgTm90aWZpY2F0aW9uLFxuICBWZXJiSWQsXG59IGZyb20gJy4uL0pzQXBpSW50ZXJuYWxDb250cmFjdCc7XG5pbXBvcnQgeyBWaXN1YWxJZCwgV29ya2Jvb2tGb3JtYXR0aW5nIH0gZnJvbSAnLi4vY29udHJhY3QvTW9kZWxzJztcbmltcG9ydCB7IE5vdGlmaWNhdGlvbklkIH0gZnJvbSAnLi4vY29udHJhY3QvTm90aWZpY2F0aW9ucyc7XG5cbi8vIHRzbGludDpkaXNhYmxlOm5vLWFueVxuXG4vKiogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB3ZSByZWNlaXZlIG9sZCB2ZXJzIGFuZCBwYXJhbWV0ZXJzIGZyb20gdGhlIGV4dGVybmFsIGJlZm9yZSB3ZSBzZW5kIGl0IHRvIHBsYXRmb3JtICovXG5leHBvcnQgdHlwZSBVcGdyYWRlRXhlY3V0ZUNhbGwgPSAodmVyYjogVmVyYklkLCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycykgPT4geyB2ZXJiOiBWZXJiSWQ7IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzIH07XG5cbi8qKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHdlIHJlY2VpdmVkIGEgcmVzcG9uc2UgYmFjayBmcm9tIHBsYXRmb3JtIGFuZCB3ZSBuZWVkIHRvIGRvd25ncmFkZSBpdCB0byBleHRlcm5hbCdzIHZlcnNpb24gKi9cbmV4cG9ydCB0eXBlIERvd25ncmFkZUV4ZWN1dGVSZXR1cm4gPSAoZXhlY3V0ZVJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UpID0+IEV4ZWN1dGVSZXNwb25zZTtcblxuLyoqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gd2UgcmVjZWl2ZSBhIG5vdGlmaWNhdGlvbiBmcm9tIHBsYXRmb3JtIGFuZCB3ZSBuZWVkIHRvIGRvd25ncmFkZSBpdCB0byBleHRlcm5hbCdzIHZlcnNpb24gKi9cbmV4cG9ydCB0eXBlIERvd25ncmFkZU5vdGlmaWNhdGlvbiA9IChub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbikgPT4gTm90aWZpY2F0aW9uO1xuXG4vLyBUaGlzIGlzIHdoZXJlIHdlIHdpbGwgc3RhcnQgdG8gZGVmaW5lIHNvbWUgb2YgdGhlc2UgdHJhbnNsYXRpb25zLlxuLy8gV2hlbiBtb2RpZnlpbmcgZXhpc3RpbmcgbW9kZWxzLCBhZGQgdGhlIHJlcXVpc2l0ZSBjb252ZXJzaW9uIGZ1bmN0aW9ucyBoZXJlLCB0aGVuIHVzZSB0aGVtXG4vLyBpbiB0aGUgVmVyc2lvbkNvbnZlcnRlckZhY3RvcnkgaW1wbGVtZW50YXRpb24uIEltcG9ydCBvbGQgdmVyc2lvbnMgYXMgeW91IHdvdWxkIGFueSBvdGhlciBtb2R1bGVcblxuLy8gMCA8LT4gVHJhbnNsYXRpb25zXG4vLyBVbmNvbW1lbnQgdGhpcyBsaW5lIHRvIGltcG9ydCBmcm9tIHRoZSBWMCBkZWZpbml0aW9uIG9mIHRoZSBBUElcbi8vIGltcG9ydCAqIGFzIFYwIGZyb20gJ0B0YWJsZWF1LWFwaS1pbnRlcm5hbC1jb250cmFjdC1qc192MCc7XG5cbi8vIDEgPC0+IDIgVHJhbnNsYXRpb25zXG4vLyBVbmNvbW1lbnQgdGhpcyBsaW5lIHRvIGltcG9ydCBmcm9tIHRoZSBWMSBkZWZpbml0aW9uIG9mIHRoZSBBUElcbi8vIGltcG9ydCAqIGFzIFYxIGZyb20gJ0B0YWJsZWF1LWFwaS1pbnRlcm5hbC1jb250cmFjdC1qc192MSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBEb3duZ3JhZGVXb3Jrc2hlZXROYW1lcyhleGVjdXRlUmVzcG9uc2U6IEV4ZWN1dGVSZXNwb25zZSk6IEV4ZWN1dGVSZXNwb25zZSB7XG4gIC8vIEZpeCB0aGUgZGFzaGJvYXJkIGZyaWVuZGx5IG5hbWUgaXNzdWUuIFRoZSBzdHJ1Y3R1cmVzIGFyZSBjb21wYXRpYmxlLFxuICAvLyBzbyB3ZSBzdGlsbCByZXR1cm4gdGhlIG9yaWdpbmFsIHJlcGx5LCBidXQgd2UgY29weSB0aGUgU2hlZXRJbmZvLm5hbWVcbiAgLy8gaW50byB0aGUgRGFzaGJvYXJkWm9uZS5uYW1lLCB3aGVyZSB2MSB3YW50cyB0byBmaW5kIGl0LlxuXG4gIGNvbnN0IGJvb3RzdHJhcEluZm8gPSBleGVjdXRlUmVzcG9uc2UucmVzdWx0IGFzIEV4dGVuc2lvbkJvb3RzdHJhcEluZm87XG4gIGlmIChib290c3RyYXBJbmZvLmV4dGVuc2lvbkRhc2hib2FyZEluZm8gIT09IHVuZGVmaW5lZCkge1xuICAgIGJvb3RzdHJhcEluZm8uZXh0ZW5zaW9uRGFzaGJvYXJkSW5mby56b25lcy5mb3JFYWNoKCh6b25lKSA9PiB7XG4gICAgICBpZiAoem9uZS5zaGVldEluZm8pIHtcbiAgICAgICAgem9uZS5uYW1lID0gem9uZS5zaGVldEluZm8ubmFtZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBleGVjdXRlUmVzcG9uc2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBEb3duZ3JhZGVGbGlwYm9hcmRab25lSUQobm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24pOiBOb3RpZmljYXRpb24ge1xuICAvLyBGaXggdGhlIEZsaXBib2FyZFpvbmVJZCBpc3N1ZS4gT2xkZXIgZXh0ZXJuYWwgdmVyc2lvbnMgc3RpbGwgY2hlY2sgZm9yIGZsaXBib2FyZFpvbmVJRHMuXG4gIC8vIFdoZW4gcnVubmluZyBhZ2FpbnN0IGEgbmV3ZXIgc2VydmVyLCBpZiBmbGlwYm9hcmRab25lSWQgaXMgYWJzZW50LCBzZXQgaXQgdG8gZGVmYXVsdCgwKS5cblxuICBpZiAobm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbklkID09PSBOb3RpZmljYXRpb25JZC5TZWxlY3RlZE1hcmtzQ2hhbmdlZCkge1xuICAgIGNvbnN0IHZpc3VhbE1vZGVsID0gbm90aWZpY2F0aW9uLmRhdGEgYXMgVmlzdWFsSWQ7XG4gICAgaWYgKHZpc3VhbE1vZGVsLmZsaXBib2FyZFpvbmVJRCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB2aXN1YWxNb2RlbC5mbGlwYm9hcmRab25lSUQgPSAwO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBub3RpZmljYXRpb247XG59XG5cbi8vIEZpbHRlciBvdXQgZm9ybWF0dGluZyBzaGVldHMgdGhhdCBhcmUgc3BlY2lmaWVkIGluIHRoZSBjbGFzc05hbWVzIGxpc3RcbmZ1bmN0aW9uIERvd25ncmFkZVdvcmtzaGVldEZvcm1hdHRpbmcoZXhlY3V0ZVJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UsIGNsYXNzTmFtZXM6IENsYXNzTmFtZUtleVtdKTogRXhlY3V0ZVJlc3BvbnNlIHtcbiAgY29uc3QgYm9vdHN0cmFwSW5mbyA9IGV4ZWN1dGVSZXNwb25zZS5yZXN1bHQgYXMgRXh0ZW5zaW9uQm9vdHN0cmFwSW5mbztcblxuICBpZiAoYm9vdHN0cmFwSW5mbz8uZXh0ZW5zaW9uV29ya3NoZWV0SW5mbz8uZm9ybWF0dGluZylcbiAgICBib290c3RyYXBJbmZvLmV4dGVuc2lvbldvcmtzaGVldEluZm8uZm9ybWF0dGluZy5mb3JtYXR0aW5nU2hlZXRzID1cbiAgICAgIGJvb3RzdHJhcEluZm8uZXh0ZW5zaW9uV29ya3NoZWV0SW5mby5mb3JtYXR0aW5nLmZvcm1hdHRpbmdTaGVldHMuZmlsdGVyKCh4KSA9PiAhY2xhc3NOYW1lcy5pbmNsdWRlcyh4LmNsYXNzTmFtZUtleSkpO1xuICByZXR1cm4gZXhlY3V0ZVJlc3BvbnNlO1xufVxuXG4vLyBGaWx0ZXIgb3V0IGZvcm1hdHRpbmcgc2hlZXRzIHRoYXQgYXJlIHNwZWNpZmllZCBpbiB0aGUgY2xhc3NOYW1lcyBsaXN0XG4vLyBGaWx0ZXIgb3V0IGZvcm1hdHRpbmcgc2hlZXRzIHRoYXQgYXJlIHNwZWNpZmllZCBpbiB0aGUgY2xhc3NOYW1lcyBsaXN0XG5mdW5jdGlvbiBEb3duZ3JhZGVXb3Jrc2hlZXRGb3JtYXR0aW5nTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uLCBjbGFzc05hbWVzOiBDbGFzc05hbWVLZXlbXSk6IE5vdGlmaWNhdGlvbiB7XG4gIGlmIChub3RpZmljYXRpb24ubm90aWZpY2F0aW9uSWQgPT09IE5vdGlmaWNhdGlvbklkLldvcmtzaGVldEZvcm1hdHRpbmdDaGFuZ2VkKSB7XG4gICAgY29uc3QgZm9ybWF0dGluZyA9IG5vdGlmaWNhdGlvbi5kYXRhIGFzIFdvcmtib29rRm9ybWF0dGluZztcbiAgICBub3RpZmljYXRpb24uZGF0YSA9IGZvcm1hdHRpbmcuZm9ybWF0dGluZ1NoZWV0cy5maWx0ZXIoKHgpID0+ICFjbGFzc05hbWVzLmluY2x1ZGVzKHguY2xhc3NOYW1lS2V5KSk7XG4gIH1cblxuICByZXR1cm4gbm90aWZpY2F0aW9uO1xufVxuXG4vLyBXZSBhZGRlZCBuZXcgZW51bSB2YWx1ZXMgZm9yIENsYXNzTmFtZUtleXMgZW51bSBpbiAxNzYuIE5lZWQgdG8gZmlsdGVyIHRoZW0gb3V0IGlmIHRoZSBjbGllbnQgdmVyc2lvbiBpcyA8MTc2XG5jb25zdCBDbGFzc05hbWVLZXlzVG9GaWx0ZXIxNzUgPSBbQ2xhc3NOYW1lS2V5LlJvd0RpdmlkZXJzLCBDbGFzc05hbWVLZXkuQ29sdW1uRGl2aWRlcnMsIENsYXNzTmFtZUtleS5QYW5lXTtcblxuZXhwb3J0IGNvbnN0IERvd25ncmFkZVdvcmtzaGVldEZvbWF0dGluZzE3NSA9IChyZXNwb25zZTogRXhlY3V0ZVJlc3BvbnNlKSA9PlxuICBEb3duZ3JhZGVXb3Jrc2hlZXRGb3JtYXR0aW5nKHJlc3BvbnNlLCBDbGFzc05hbWVLZXlzVG9GaWx0ZXIxNzUpO1xuZXhwb3J0IGNvbnN0IERvd25ncmFkZVdvcmtzaGVldEZvbWF0dGluZ05vdGlmaWNhdGlvbjE3NSA9IChub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbikgPT5cbiAgRG93bmdyYWRlV29ya3NoZWV0Rm9ybWF0dGluZ05vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIENsYXNzTmFtZUtleXNUb0ZpbHRlcjE3NSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBEb3duZ3JhZGVFeHRlbnNpb25FbnZpcm9ubWVudENvbnRleHQoZXhlY3V0ZVJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UpOiBFeGVjdXRlUmVzcG9uc2Uge1xuICAvLyBGaXggdGhlIGV4dGVuc2lvbiBlbnZpcm9ubWVudCBjb250ZXh0IGlzc3VlLiBSZXBsYWNlcyBuZXcgZW51bSB2YWx1ZXMgdGhhdCBnbyB1bnJlY29nbml6ZWRcbiAgLy8gYnkgb2xkZXIgZXh0ZW5zaW9ucyB3aXRoIHRoZWlyIHJlc3BlY3RpdmUgb2xkZXIgZW51bSB2YWx1ZXMuXG4gIGNvbnN0IGJvb3RzdHJhcEluZm8gPSBleGVjdXRlUmVzcG9uc2UucmVzdWx0IGFzIEV4dGVuc2lvbkJvb3RzdHJhcEluZm87XG5cbiAgaWYgKGJvb3RzdHJhcEluZm8uZXh0ZW5zaW9uRW52aXJvbm1lbnQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGNvbnRleHQgPSBib290c3RyYXBJbmZvLmV4dGVuc2lvbkVudmlyb25tZW50LmV4dGVuc2lvbkNvbnRleHQ7XG4gICAgaWYgKGNvbnRleHQgPT09IEV4dGVuc2lvbkNvbnRleHQuUHVibGljV2ViIHx8IGNvbnRleHQgPT09IEV4dGVuc2lvbkNvbnRleHQuQ2xvdWQpIHtcbiAgICAgIGJvb3RzdHJhcEluZm8uZXh0ZW5zaW9uRW52aXJvbm1lbnQuZXh0ZW5zaW9uQ29udGV4dCA9IEV4dGVuc2lvbkNvbnRleHQuU2VydmVyO1xuICAgIH0gZWxzZSBpZiAoY29udGV4dCA9PT0gRXh0ZW5zaW9uQ29udGV4dC5QdWJsaWNEZXNrdG9wKSB7XG4gICAgICBib290c3RyYXBJbmZvLmV4dGVuc2lvbkVudmlyb25tZW50LmV4dGVuc2lvbkNvbnRleHQgPSBFeHRlbnNpb25Db250ZXh0LkRlc2t0b3A7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGV4ZWN1dGVSZXNwb25zZTtcbn1cbiIsImltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBFeGVjdXRlUmVzcG9uc2UsIE5vdGlmaWNhdGlvbiwgVmVyYklkIH0gZnJvbSAnLi4vLi4vSnNBcGlJbnRlcm5hbENvbnRyYWN0JztcbmltcG9ydCB7IEV4dGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIH0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcic7XG5cbi8vIHRzbGludDpkaXNhYmxlOm5vLWFueVxuXG4vKipcbiAqIFRoaXMgdmVyc2lvbiBjb252ZXJ0ZXIgZG9lc24ndCBhY3R1YWxseSBkbyBhbnl0aGluZyBidXQgaXMgdXNlZnVsIGZvciB0ZXN0aW5nIG9yIHdoZW4gd2UgaGF2ZVxuICogYSBtYXRjaGluZyBwbGF0Zm9ybSBhbmQgZXh0ZXJuYWwgdmVyc2lvbiBudW1iZXJcbiAqL1xuZXhwb3J0IGNsYXNzIEV4dGVybmFsSWRlbnRpdHlWZXJzaW9uQ29udmVydGVyIGltcGxlbWVudHMgRXh0ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXIge1xuICBwdWJsaWMgZG93bmdyYWRlRXhlY3V0ZUNhbGwodmVyYjogYW55LCBwYXJhbWV0ZXJzOiBhbnkpOiB7IHZlcmI6IFZlcmJJZDsgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgfSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZlcmI6IHZlcmIgYXMgVmVyYklkLFxuICAgICAgcGFyYW1ldGVyczogcGFyYW1ldGVycyBhcyBFeGVjdXRlUGFyYW1ldGVycyxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIHVwZ3JhZGVFeGVjdXRlUmV0dXJuKGV4ZWN1dGVSZXNwb25zZTogRXhlY3V0ZVJlc3BvbnNlLCB2ZXJiOiBWZXJiSWQsIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzKTogRXhlY3V0ZVJlc3BvbnNlIHtcbiAgICByZXR1cm4gZXhlY3V0ZVJlc3BvbnNlO1xuICB9XG5cbiAgcHVibGljIHVwZ3JhZGVOb3RpZmljYXRpb24obm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24pOiBOb3RpZmljYXRpb24ge1xuICAgIHJldHVybiBub3RpZmljYXRpb247XG4gIH1cbn1cbiIsImltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBFeGVjdXRlUmVzcG9uc2UsIE5vdGlmaWNhdGlvbiwgVmVyYklkLCBWZXJzaW9uTnVtYmVyIH0gZnJvbSAnLi4vLi4vSnNBcGlJbnRlcm5hbENvbnRyYWN0JztcbmltcG9ydCB7IEV4dGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIH0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcic7XG5pbXBvcnQgKiBhcyBUcmFuc2xhdGlvbnMgZnJvbSAnLi9FeHRlcm5hbFZlcnNpb25UcmFuc2xhdGlvbnMnO1xuXG4vLyB0c2xpbnQ6ZGlzYWJsZTpuby1hbnlcbi8qKlxuICogVGhlIHZlcnNpb24gY29udmVydGVyIGlzIGRlc2lnbmVkIHRvIGFsbG93IHRoZSBwbGF0Zm9ybSBhbmQgZXh0ZXJuYWwgbW9kdWxlc1xuICogdG8gc2VlbWxlc3NseSBjb21tdW5pY2F0ZSBvdmVyIHR3byBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhlIGludGVybmFsIEFQSS4gVGhpcyBjb252ZXJ0ZXJcbiAqIHN1cHBvcnRzIGV4dGVybmFsJ3MgdmVyc2lvbihtaW5vcikgPj0gcGxhdGZvcm0ncyB2ZXJzaW9uKG1pbm9yKS4gV2hlbiBleGVjdXRpbmdcbiAqIGNvbW1hbmRzLCBpdCBpcyB1c2VkIHRvIGRvd25ncmFkZSB0aGUgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb24gdG8gd2hhdCBwbGF0Zm9ybSBrbm93cyBvbiB0aGUgd2F5IGluXG4gKiBhbmQgdXBncmFkZSB0aGUgcmVwcmVzZW50YXRpb25zIG9uIHRoZSB3YXkgb3V0LlxuICovXG5leHBvcnQgY2xhc3MgRXh0ZXJuYWxTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIgaW1wbGVtZW50cyBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXJcbiAgICpcbiAgICogQHBhcmFtIF9leHRlcm5hbFZlcnNpb24gVGhlIHZlcnNpb24gb2YgdGhlIGludGVybmFsIGNvbnRyYWN0IGFwaS1leHRlcm5hbC1qcyBpcyB1c2luZ1xuICAgKiBAcGFyYW0gX3BsYXRmb3JtVmVyc2lvbiBUaGUgdmVyc2lvbiBvZiB0aGUgaW50ZXJuYWwgY29udHJhY3QgdGhlIGFwaS1wbGF0Zm9ybS1qcyBpcyB1c2luZ1xuICAgKiBAcGFyYW0gX2Rvd25ncmFkZUV4ZWN1dGVDYWxsVHJhbnNsYXRpb25zIE9yZGVyZWQgbGlzdCBvZiB0aGUgdHJhbnNsYXRpb25zIHRvIHBlcmZvcm0gd2hlbiBkb3duZ3JhZGluZyBjbWQgcGFyYW1ldGVyc1xuICAgKiBAcGFyYW0gX3VwZ3JhZGVFeGVjdXRlUmV0dXJuVHJhbnNsYXRpb25zIE9yZGVyZWQgbGlzdCBvZiB1cGdyYWRlIHRyYW5zbGF0aW9ucyB0byBwZXJmb3JtIGFmdGVyIGEgY21kIGlzIGV4ZWN1dGVkXG4gICAqIEBwYXJhbSBfdXBncmFkZU5vdGlmaWNhdGlvblRyYW5zbGF0aW9ucyBPcmRlcmVkIGxpc3Qgb2YgdXBncmFkZSBub3RmaWNhdGlvbnMgdG8gcGVyZm9ybSBvbiBldmVudHNcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9leHRlcm5hbFZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4gICAgcHJpdmF0ZSBfcGxhdGZvcm1WZXJzaW9uOiBWZXJzaW9uTnVtYmVyLFxuICAgIHByaXZhdGUgX2Rvd25ncmFkZUV4ZWN1dGVDYWxsVHJhbnNsYXRpb25zOiBBcnJheTxUcmFuc2xhdGlvbnMuRG93bmdyYWRlRXhlY3V0ZUNhbGw+LFxuICAgIHByaXZhdGUgX3VwZ3JhZGVFeGVjdXRlUmV0dXJuVHJhbnNsYXRpb25zOiBBcnJheTxUcmFuc2xhdGlvbnMuVXBncmFkZUV4ZWN1dGVSZXR1cm4+LFxuICAgIHByaXZhdGUgX3VwZ3JhZGVOb3RpZmljYXRpb25UcmFuc2xhdGlvbnM6IEFycmF5PFRyYW5zbGF0aW9ucy5VcGdyYWRlTm90aWZpY2F0aW9uPixcbiAgKSB7XG4gICAgaWYgKHRoaXMuX2V4dGVybmFsVmVyc2lvbi5tYWpvciA+IHRoaXMuX3BsYXRmb3JtVmVyc2lvbi5tYWpvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY29udmVydCBiZXR3ZWVuIGV4dGVybmFsIHZlcnNpb24gJHt0aGlzLl9leHRlcm5hbFZlcnNpb24ubWFqb3J9XG4gICAgICBhbmQgJHt0aGlzLl9wbGF0Zm9ybVZlcnNpb24ubWFqb3J9YCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGRvd25ncmFkZUV4ZWN1dGVDYWxsKHZlcmI6IGFueSwgcGFyYW1ldGVyczogYW55KTogeyB2ZXJiOiBWZXJiSWQ7IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzIH0ge1xuICAgIC8vIFBlcmZvcm0gdGhlIGRvd25ncmFkZSBvZiB0aGUgdmVyYiBhbmQgcGFyYW1ldGVycyB0byB0aGUgbGV2ZWwgdGhhdCBwbGF0Zm9ybSBpcyB1c2luZ1xuICAgIGxldCBkb3duZ3JhZGVkID0geyB2ZXJiOiB2ZXJiLCBwYXJhbWV0ZXJzOiBwYXJhbWV0ZXJzIH07XG4gICAgZm9yIChjb25zdCBkb3duZ3JhZGVUcmFuc2xhdGlvbiBvZiB0aGlzLl9kb3duZ3JhZGVFeGVjdXRlQ2FsbFRyYW5zbGF0aW9ucykge1xuICAgICAgZG93bmdyYWRlZCA9IGRvd25ncmFkZVRyYW5zbGF0aW9uKGRvd25ncmFkZWQudmVyYiwgZG93bmdyYWRlZC5wYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZG93bmdyYWRlZDtcbiAgfVxuXG4gIHB1YmxpYyB1cGdyYWRlRXhlY3V0ZVJldHVybihleGVjdXRlUmVzcG9uc2U6IEV4ZWN1dGVSZXNwb25zZSwgdmVyYjogVmVyYklkLCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyk6IEV4ZWN1dGVSZXNwb25zZSB7XG4gICAgLy8gUGVyZm9ybSB0aGUgdXBncmFkZSBvZiB0aGUgcmVzcG9uc2UgdG8gd2hhdCB0aGUgZXh0ZXJuYWwgbW9kdWxlIGlzIGV4cGVjdGluZ1xuICAgIGxldCB1cGdyYWRlZCA9IGV4ZWN1dGVSZXNwb25zZTtcbiAgICBmb3IgKGNvbnN0IHVwZ3JhZGVUcmFuc2xhdGlvbiBvZiB0aGlzLl91cGdyYWRlRXhlY3V0ZVJldHVyblRyYW5zbGF0aW9ucykge1xuICAgICAgdXBncmFkZWQgPSB1cGdyYWRlVHJhbnNsYXRpb24odXBncmFkZWQsIHZlcmIsIHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIHJldHVybiB1cGdyYWRlZDtcbiAgfVxuXG4gIHB1YmxpYyB1cGdyYWRlTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uKTogTm90aWZpY2F0aW9uIHtcbiAgICAvLyBQZXJmb3JtIHRoZSB1cGdyYWRlIG9mIG5vdGlmaWNhdGlvbiB0byB3aGF0IHRoZSBleHRlcm5hbCBtb2R1bGUgaXMgZXhwZWN0aW5nXG4gICAgbGV0IHVwZ3JhZGVkID0gbm90aWZpY2F0aW9uO1xuICAgIGZvciAoY29uc3QgdXBncmFkZU5vdGlmaWNhdGlvbiBvZiB0aGlzLl91cGdyYWRlTm90aWZpY2F0aW9uVHJhbnNsYXRpb25zKSB7XG4gICAgICB1cGdyYWRlZCA9IHVwZ3JhZGVOb3RpZmljYXRpb24odXBncmFkZWQpO1xuICAgIH1cblxuICAgIHJldHVybiB1cGdyYWRlZDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVmVyc2lvbk51bWJlciB9IGZyb20gJy4uLy4uL0pzQXBpSW50ZXJuYWxDb250cmFjdCc7XG5pbXBvcnQgeyBHZXRNYXhpbXVtTWlub3JJbmRleCwgTWFqb3JNaW5vclRyYW5zbGF0b3JzLCBWZXJzaW9uRXF1YWxUbyB9IGZyb20gJy4uL1ZlcnNpb25Db252ZXJ0ZXJGYWN0b3J5JztcbmltcG9ydCB7IEV4dGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIH0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcic7XG5pbXBvcnQgeyBFeHRlcm5hbElkZW50aXR5VmVyc2lvbkNvbnZlcnRlciB9IGZyb20gJy4vRXh0ZXJuYWxJZGVudGl0eVZlcnNpb25Db252ZXJ0ZXInO1xuaW1wb3J0IHsgRXh0ZXJuYWxTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIgfSBmcm9tICcuL0V4dGVybmFsU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyJztcbmltcG9ydCAqIGFzIFRyYW5zbGF0aW9uc0V4dGVybmFsIGZyb20gJy4vRXh0ZXJuYWxWZXJzaW9uVHJhbnNsYXRpb25zJztcblxuLy8gQSBtYXBwaW5nIGZyb20gdGhlIGN1cnJlbnQgY2xpZW50IHZlcnNpb24gb2YgaW50ZXJuYWwtY29udHJhY3QgdG8gYW4gb2xkZXIgcGxhdGZvcm0gdmVyc2lvbiBvZiB0aGUgY29udHJhY3QuXG4vLyBFYWNoIHZlcnNpb24gYnVtcCBjYW4gaGF2ZSBhbiBhcnJheSBvZiB0cmFuc2xhdGlvbnMgdG8gcGVyZm9ybSBpbiBvcmRlci5cbi8vIFRoZXNlIHRyYW5zbGF0aW9ucyBoYW5kbGUgZG93bmdyYWRlRXhlY3V0ZUNhbGwgYW5kIHVwZ3JhZGVFeGVjdXRlUmV0dXJuIGFuZCBhcmUgbWVhbnQgdG8gYmUgY2FsbGVkIG9uIHRoZVxuLy8gY2xpZW50L2V4dGVybmFsIHNpZGUuXG4vLyBXaGVuIHVwZGF0aW5nIHRoZSBtYWpvciBvciBtaW5vciB2ZXJzaW9uIG9mIG91ciBpbnRlcm5hbC1jb250cmFjdCwgeW91IHdpbGwgbmVlZCB0byB1cGRhdGUgdGhlc2UgZGF0YSBzdHJ1Y3R1cmVzLlxuLy8gKiBJZiB0aGVyZSBhcmUgdHJhbnNsYXRpb25zIHRvIGFkZCwgYWRkIHRoZW0gdG8gdGhlIHZlcnNpb24gdG8gJ3VwZ3JhZGUgZnJvbScgb3IgJ2Rvd25ncmFkZSB0bycuXG5leHBvcnQgY29uc3QgRXhlY3V0ZU1pbm9yRG93bmdyYWRlQ2FsbEV4dGVybmFsOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VHJhbnNsYXRpb25zRXh0ZXJuYWwuRG93bmdyYWRlRXhlY3V0ZUNhbGw+ID0ge1xuICAxOiB7XG4gICAgOTogW10sIC8vIE5vdGUgdGhhdCB3ZSBwdXQgZG93bmdyYWRlcyBmcm9tIDEuMTAgdG8gMS45IGluIHRoZSBbMV1bOV0gYnVja2V0XG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgRXhlY3V0ZU1pbm9yVXBncmFkZVJldHVybkV4dGVybmFsOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VHJhbnNsYXRpb25zRXh0ZXJuYWwuVXBncmFkZUV4ZWN1dGVSZXR1cm4+ID0ge1xuICAxOiB7XG4gICAgOTogW10sIC8vIE5vdGUgdGhhdCB3ZSBwdXQgdXBncmFkZXMgZnJvbSAxLjkgdG8gMS4xMCBpbiB0aGUgWzFdWzldIGJ1Y2tldFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IEV4ZWN1dGVNaW5vclVwZ3JhZGVOb3RpZmljYXRpb246IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnNFeHRlcm5hbC5VcGdyYWRlTm90aWZpY2F0aW9uPiA9IHtcbiAgMToge1xuICAgIDk6IFtdLCAvLyBOb3RlIHRoYXQgd2UgcHV0IHVwZ3JhZGVzIGZyb20gMS45IHRvIDEuMTAgaW4gdGhlIFsxXVs5XSBidWNrZXRcbiAgfSxcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB3aGljaCBoYXMgdGhlIGFiaWxpdHkgdG8gdXBncmFkZSBhbmQgZG93bmdyYWRlXG4gKiB0aGUgY29udHJhY3QgYmV0d2VlbiB0aGUgdHdvIHZlcnNpb25zIHdoaWNoIGFyZSBzcGVjaWZpZWQuIElmIGV4dGVybmFsTWFqb3JWZXJzaW9uIGlzIGxlc3MgdGhhblxuICogcGxhdGZvcm1NYWpvclZlcnNpb24sIGFuIEV4dGVybmFsSWRlbnRpdHlWZXJzaW9uQ29udmVydGVyIHdpbGwgYmUgcmV0dXJuZWQuXG4gKiBIYW5kbGVzIHVwZ3JhZGUvZG93bmdyYWRlIGZvciBib3RoIG1ham9yIGFuZCBtaW5vciB1cGRhdGVzLlxuICpcbiAqIEBwYXJhbSBleHRlcm5hbFZlcnNpb24gVmVyc2lvbk51bWJlciBvZiB0aGUgaW50ZXJuYWwgYXBpIHdoaWNoIHRoZSBleHRlcm5hbCBtb2R1bGUgaXMgdXNpbmdcbiAqIEBwYXJhbSBwbGF0Zm9ybVZlcnNpb24gVmVyc2lvbk51bWJlciBvZiB0aGUgaW50ZXJuYWwgYXBpIHdoaWNoIHRoZSBwbGF0Zm9ybSBpcyB1c2luZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gQ3JlYXRlRXh0ZXJuYWxDb21wYXRpYmxlVmVyc2lvbkNvbnZlcnRlcihcbiAgZXh0ZXJuYWxWZXJzaW9uOiBWZXJzaW9uTnVtYmVyLFxuICBwbGF0Zm9ybVZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4pOiBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB7XG4gIHJldHVybiBDcmVhdGVFeHRlcm5hbENvbXBhdGlibGVWZXJzaW9uQ29udmVydGVyV2l0aFRyYW5zbGF0b3JzKFxuICAgIGV4dGVybmFsVmVyc2lvbixcbiAgICBwbGF0Zm9ybVZlcnNpb24sXG4gICAgRXhlY3V0ZU1pbm9yRG93bmdyYWRlQ2FsbEV4dGVybmFsLFxuICAgIEV4ZWN1dGVNaW5vclVwZ3JhZGVSZXR1cm5FeHRlcm5hbCxcbiAgICBFeGVjdXRlTWlub3JVcGdyYWRlTm90aWZpY2F0aW9uLFxuICApO1xufVxuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIENyZWF0ZUV4dGVybmFsQ29tcGF0aWJsZVZlcnNpb25Db252ZXJ0ZXJXaXRoVHJhbnNsYXRvcnMuXG4gKiBUaGlzIGZ1bmN0aW9uIHRha2VzIHRoZSB1cGdyYWRlLCBkb3duZ3JhZGUgYXJyYXlzIHNvIHRoYXQgYWxsIHRoZSBsb2dpYyBjYW4gYmUgdGVzdGVkLlxuICpcbiAqIEBwYXJhbSBleHRlcm5hbFZlcnNpb24gVmVyc2lvbk51bWJlciBvZiB0aGUgaW50ZXJuYWwgY29udHJhY3Qgd2hpY2ggdGhlIGV4dGVybmFsIG1vZHVsZSBpcyB1c2luZ1xuICogQHBhcmFtIHBsYXRmb3JtVmVyc2lvbiBWZXJzaW9uTnVtYmVyIG9mIHRoZSBpbnRlcm5hbCBjb250cmFjdCB3aGljaCB0aGUgcGxhdGZvcm0gaXMgdXNpbmdcbiAqIEBwYXJhbSB1cGdyYWRlcyBNYWpvck1pbm9yVHJhbnNsYXRvcnMgZm9yIHJlc3BvbnNlIHVwZ3JhZGVzXG4gKiBAcGFyYW0gZG93bmdyYWRlcyBNYWpvck1pbm9yVHJhbnNsYXRvcnMgZm9yIGV4ZWN1dGUgY2FsbCBkb3duZ3JhZGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDcmVhdGVFeHRlcm5hbENvbXBhdGlibGVWZXJzaW9uQ29udmVydGVyV2l0aFRyYW5zbGF0b3JzKFxuICBleHRlcm5hbFZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4gIHBsYXRmb3JtVmVyc2lvbjogVmVyc2lvbk51bWJlcixcbiAgZG93bmdyYWRlczogTWFqb3JNaW5vclRyYW5zbGF0b3JzPFRyYW5zbGF0aW9uc0V4dGVybmFsLkRvd25ncmFkZUV4ZWN1dGVDYWxsPixcbiAgdXBncmFkZXM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnNFeHRlcm5hbC5VcGdyYWRlRXhlY3V0ZVJldHVybj4sXG4gIHVwZ3JhZGVOb3RpZmljYXRpb25zOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VHJhbnNsYXRpb25zRXh0ZXJuYWwuVXBncmFkZU5vdGlmaWNhdGlvbj4sXG4pOiBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB7XG4gIGNvbnN0IGV4dGVybmFsTWFqb3JWZXJzaW9uOiBudW1iZXIgPSBleHRlcm5hbFZlcnNpb24ubWFqb3I7XG4gIGNvbnN0IHBsYXRmb3JtTWFqb3JWZXJzaW9uOiBudW1iZXIgPSBwbGF0Zm9ybVZlcnNpb24ubWFqb3I7XG4gIGNvbnN0IHBsYXRmb3JtTWlub3JWZXJzaW9uOiBudW1iZXIgPSBwbGF0Zm9ybVZlcnNpb24ubWlub3I7XG5cbiAgLy8gVGhpcyBjaGVjayBpcyBwcmVzZW50IGluIFZlcnNpb25Db252ZXJ0ZXJGYWN0b3J5LiBXZSB0aHJvdyB0aGUgc2FtZSBlcnJvciBoZXJlIGFzIHdlbGwuXG4gIC8vIEhlbmNlIHdlIG9ubHkgbmVlZCB0byBjaGVjayB0aGUgbWlub3IgdmVyc2lvbnMgZm9yIHRyYW5zbGF0aW9ucy5cbiAgaWYgKGV4dGVybmFsTWFqb3JWZXJzaW9uID4gcGxhdGZvcm1NYWpvclZlcnNpb24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEV4dGVybmFsIHZlcnNpb24gbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gcGxhdGZvcm0gdmVyc2lvbi5cbiAgICBleHRlcm5hbE1ham9yVmVyc2lvbj0ke2V4dGVybmFsTWFqb3JWZXJzaW9ufSBwbGF0Zm9ybU1ham9yVmVyc2lvbj0ke3BsYXRmb3JtTWFqb3JWZXJzaW9ufWApO1xuICB9XG5cbiAgaWYgKGV4dGVybmFsTWFqb3JWZXJzaW9uIDwgcGxhdGZvcm1NYWpvclZlcnNpb24gfHwgVmVyc2lvbkVxdWFsVG8oZXh0ZXJuYWxWZXJzaW9uLCBwbGF0Zm9ybVZlcnNpb24pKSB7XG4gICAgcmV0dXJuIG5ldyBFeHRlcm5hbElkZW50aXR5VmVyc2lvbkNvbnZlcnRlcigpO1xuICB9XG5cbiAgLy8gV2FsayB0aGUgc3BhbiBiZXR3ZWVuIHRoZSB2ZXJzaW9ucyB3ZSBoYXZlIGhlcmUgYW5kIGNvbGxlY3QgdGhlIHVwZ3JhZGUgYW5kIGRvd25ncmFkZXMgbmVjZXNzYXJ5XG4gIGNvbnN0IG5lZWRlZEV4ZWN1dGVDYWxsRG93bmdyYWRlOiBBcnJheTxUcmFuc2xhdGlvbnNFeHRlcm5hbC5Eb3duZ3JhZGVFeGVjdXRlQ2FsbD4gPSBHZXROZWVkZWRFeHRlcm5hbFRyYW5zbGF0aW9ucyhcbiAgICBwbGF0Zm9ybU1ham9yVmVyc2lvbixcbiAgICBwbGF0Zm9ybU1pbm9yVmVyc2lvbixcbiAgICBkb3duZ3JhZGVzLFxuICApO1xuXG4gIGNvbnN0IG5lZWRlZEV4ZWN1dGVSZXR1cm5VcGdyYWRlczogQXJyYXk8VHJhbnNsYXRpb25zRXh0ZXJuYWwuVXBncmFkZUV4ZWN1dGVSZXR1cm4+ID0gR2V0TmVlZGVkRXh0ZXJuYWxUcmFuc2xhdGlvbnMoXG4gICAgcGxhdGZvcm1NYWpvclZlcnNpb24sXG4gICAgcGxhdGZvcm1NaW5vclZlcnNpb24sXG4gICAgdXBncmFkZXMsXG4gICk7XG5cbiAgY29uc3QgbmVlZGVkTm90aWZpY2F0aW9uVXBncmFkZXM6IEFycmF5PFRyYW5zbGF0aW9uc0V4dGVybmFsLlVwZ3JhZGVOb3RpZmljYXRpb24+ID0gR2V0TmVlZGVkRXh0ZXJuYWxUcmFuc2xhdGlvbnMoXG4gICAgcGxhdGZvcm1NYWpvclZlcnNpb24sXG4gICAgcGxhdGZvcm1NaW5vclZlcnNpb24sXG4gICAgdXBncmFkZU5vdGlmaWNhdGlvbnMsXG4gICk7XG5cbiAgLy8gUmV2ZXJzZSB0aGUgZG93bmdyYWRlIGNhbGxzLCBzbyB0aGF0IHdlIHN0YXJ0IHRoZSBkb3duZ3JhZGUgZnJvbSB0aGUgZXh0ZXJuYWwgdmVyc2lvbiB0byB0aGUgcGxhdGZvcm0gdmVyc2lvblxuICBuZWVkZWRFeGVjdXRlQ2FsbERvd25ncmFkZS5yZXZlcnNlKCk7XG4gIHJldHVybiBuZXcgRXh0ZXJuYWxTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIoXG4gICAgZXh0ZXJuYWxWZXJzaW9uLFxuICAgIHBsYXRmb3JtVmVyc2lvbixcbiAgICBuZWVkZWRFeGVjdXRlQ2FsbERvd25ncmFkZSxcbiAgICBuZWVkZWRFeGVjdXRlUmV0dXJuVXBncmFkZXMsXG4gICAgbmVlZGVkTm90aWZpY2F0aW9uVXBncmFkZXMsXG4gICk7XG59XG5cbmZ1bmN0aW9uIEdldE5lZWRlZEV4dGVybmFsVHJhbnNsYXRpb25zPFQ+KFxuICBwbGF0Zm9ybU1ham9yVmVyc2lvbjogbnVtYmVyLFxuICBwbGF0Zm9ybU1pbm9yVmVyc2lvbjogbnVtYmVyLFxuICBtYWpvck1pbm9yVHJhbnNsYXRvcnM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUPixcbik6IEFycmF5PFQ+IHtcbiAgY29uc3QgbmVlZGVkVHJhbnNsYXRpb25zOiBBcnJheTxUPiA9IFtdO1xuXG4gIGlmIChwbGF0Zm9ybU1ham9yVmVyc2lvbiBpbiBtYWpvck1pbm9yVHJhbnNsYXRvcnMpIHtcbiAgICBjb25zdCBzdGFydCA9IHBsYXRmb3JtTWlub3JWZXJzaW9uO1xuICAgIGNvbnN0IG1heGltdW1NaW5vclZlcnNpb24gPSBHZXRNYXhpbXVtTWlub3JJbmRleChPYmplY3Qua2V5cyhtYWpvck1pbm9yVHJhbnNsYXRvcnNbcGxhdGZvcm1NYWpvclZlcnNpb25dKSk7XG4gICAgZm9yIChsZXQgbWlub3IgPSBzdGFydDsgbWlub3IgPD0gbWF4aW11bU1pbm9yVmVyc2lvbjsgbWlub3IrKykge1xuICAgICAgaWYgKG1pbm9yIGluIG1ham9yTWlub3JUcmFuc2xhdG9yc1twbGF0Zm9ybU1ham9yVmVyc2lvbl0pIHtcbiAgICAgICAgbmVlZGVkVHJhbnNsYXRpb25zLnB1c2goLi4ubWFqb3JNaW5vclRyYW5zbGF0b3JzW3BsYXRmb3JtTWFqb3JWZXJzaW9uXVttaW5vcl0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZWVkZWRUcmFuc2xhdGlvbnM7XG59XG4iLCIvLyBFeHBvcnQgZXZlcnl0aGluZyB3aGljaCBoYWQgYmVlbiBwcmV2aW91c2x5IGluIHRoZSBhcGktc2hhcmVkIG1vZHVsZVxuXG5leHBvcnQgeyBBcGlWZXJzaW9uIH0gZnJvbSAnLi9BcGlTaGFyZWQvQXBpVmVyc2lvbic7XG5leHBvcnQgKiBmcm9tICcuL0FwaVNoYXJlZC9Dcm9zc0ZyYW1lL0Nyb3NzRnJhbWVCb290c3RyYXAnO1xuZXhwb3J0IHsgQ3Jvc3NGcmFtZURpc3BhdGNoZXIgfSBmcm9tICcuL0FwaVNoYXJlZC9Dcm9zc0ZyYW1lL0Nyb3NzRnJhbWVEaXNwYXRjaGVyJztcbmV4cG9ydCB7IERhdGFTb3VyY2UgfSBmcm9tICcuL0FwaVNoYXJlZC9EYXRhU291cmNlJztcbmV4cG9ydCB7IEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyB9IGZyb20gJy4vQXBpU2hhcmVkL0VudW1NYXBwaW5ncy9FeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MnO1xuZXhwb3J0IHsgSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzIH0gZnJvbSAnLi9BcGlTaGFyZWQvRW51bU1hcHBpbmdzL0ludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyc7XG5leHBvcnQgeyBFdmVudExpc3RlbmVyTWFuYWdlciB9IGZyb20gJy4vQXBpU2hhcmVkL0V2ZW50TGlzdGVuZXJNYW5hZ2VyJztcbmV4cG9ydCB7IEZpZWxkIH0gZnJvbSAnLi9BcGlTaGFyZWQvRmllbGQnO1xuZXhwb3J0IHsgQ3VzdG9tVmlld0ltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL0N1c3RvbVZpZXdJbXBsJztcbmV4cG9ydCB7IERhc2hib2FyZEltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL0Rhc2hib2FyZEltcGwnO1xuZXhwb3J0IHsgRGFzaGJvYXJkT2JqZWN0SW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvRGFzaGJvYXJkT2JqZWN0SW1wbCc7XG5leHBvcnQgeyBEYXRhU291cmNlSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvRGF0YVNvdXJjZUltcGwnO1xuZXhwb3J0IHsgUGFyYW1ldGVySW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvUGFyYW1ldGVySW1wbCc7XG5leHBvcnQgeyBTaGVldEltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL1NoZWV0SW1wbCc7XG5leHBvcnQgeyBTaGVldEluZm9JbXBsIH0gZnJvbSAnLi9BcGlTaGFyZWQvSW1wbC9TaGVldEluZm9JbXBsJztcbmV4cG9ydCB7IFNpbmdsZUV2ZW50TWFuYWdlckltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL1NpbmdsZUV2ZW50TWFuYWdlckltcGwnO1xuZXhwb3J0IHsgU3RvcnlJbXBsIH0gZnJvbSAnLi9BcGlTaGFyZWQvSW1wbC9TdG9yeUltcGwnO1xuZXhwb3J0IHsgU3RvcnlQb2ludEltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL1N0b3J5UG9pbnRJbXBsJztcbmV4cG9ydCB7IFN0b3J5UG9pbnRJbmZvSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvU3RvcnlQb2ludEluZm9JbXBsJztcbmV4cG9ydCB7IFdvcmtib29rSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvV29ya2Jvb2tJbXBsJztcbmV4cG9ydCB7IFdvcmtzaGVldEltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL1dvcmtzaGVldEltcGwnO1xuZXhwb3J0IHsgUG9pbnQgfSBmcm9tICcuL0FwaVNoYXJlZC9Qb2ludCc7XG5leHBvcnQgeyBBbm5vdGF0aW9uU2VydmljZSB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL0Fubm90YXRpb25TZXJ2aWNlJztcbmV4cG9ydCB7IERhdGFTb3VyY2VTZXJ2aWNlIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvRGF0YVNvdXJjZVNlcnZpY2UnO1xuZXhwb3J0IHsgRXhwb3J0U2VydmljZSB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL0V4cG9ydFNlcnZpY2UnO1xuZXhwb3J0IHsgRmlsdGVyU2VydmljZSB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL0ZpbHRlclNlcnZpY2UnO1xuZXhwb3J0IHsgR2V0RGF0YVNlcnZpY2UgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9HZXREYXRhU2VydmljZSc7XG5leHBvcnQgeyBOb3RpZmljYXRpb25TZXJ2aWNlLCBVbnJlZ2lzdGVyRm4gfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9Ob3RpZmljYXRpb25TZXJ2aWNlJztcbmV4cG9ydCB7IFBhcmFtZXRlcnNTZXJ2aWNlIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvUGFyYW1ldGVyc1NlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvUmVnaXN0ZXJBbGxTaGFyZWRTZXJ2aWNlcyc7XG5leHBvcnQgeyBTZWxlY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvU2VsZWN0aW9uU2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnknO1xuZXhwb3J0IHsgU2l6ZVNlcnZpY2UgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9TaXplU2VydmljZSc7XG5leHBvcnQgeyBTdG9yeUFjdGl2YXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvU3RvcnlBY3RpdmF0aW9uU2VydmljZSc7XG5leHBvcnQgeyBWaXpTZXJ2aWNlIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvVml6U2VydmljZSc7XG5leHBvcnQgeyBDbGllbnRJbmZvU2VydmljZUltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL0NsaWVudEluZm9TZXJ2aWNlSW1wbCc7XG5leHBvcnQgeyBOb3RpZmljYXRpb25TZXJ2aWNlSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvTm90aWZpY2F0aW9uU2VydmljZUltcGwnO1xuZXhwb3J0IHsgTm90aWZpY2F0aW9uU2VydmljZUltcGxCYXNlLCBSZWdpc3RyYXRpb24gfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL05vdGlmaWNhdGlvblNlcnZpY2VJbXBsQmFzZSc7XG5leHBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1NlcnZpY2VJbXBsQmFzZSc7XG5leHBvcnQgeyBTaXplU2VydmljZUltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1NpemVTZXJ2aWNlSW1wbCc7XG5leHBvcnQgeyBTdG9yeUFjdGl2YXRpb25TZXJ2aWNlSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvU3RvcnlBY3RpdmF0aW9uU2VydmljZUltcGwnO1xuZXhwb3J0IHsgU2luZ2xlRXZlbnRNYW5hZ2VyIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2luZ2xlRXZlbnRNYW5hZ2VyJztcbmV4cG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4vQXBpU2hhcmVkL1RhYmxlYXVFcnJvcic7XG5leHBvcnQgeyBEZWZlcnJlZCB9IGZyb20gJy4vQXBpU2hhcmVkL1V0aWxzL0RlZmVycmVkJztcbmV4cG9ydCB7IEVycm9ySGVscGVycyB9IGZyb20gJy4vQXBpU2hhcmVkL1V0aWxzL0Vycm9ySGVscGVycyc7XG5leHBvcnQgeyBFeHBvcnRIZWxwZXJzIH0gZnJvbSAnLi9BcGlTaGFyZWQvVXRpbHMvRXhwb3J0SGVscGVycyc7XG5leHBvcnQgeyBTaGVldFV0aWxzIH0gZnJvbSAnLi9BcGlTaGFyZWQvVXRpbHMvU2hlZXRVdGlscyc7XG5leHBvcnQgeyBWZXJzaW9uTnVtYmVyIH0gZnJvbSAnLi9BcGlTaGFyZWQvVmVyc2lvbk51bWJlcic7XG5leHBvcnQgeyBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIgfSBmcm9tICcuL1ZlcnNpb25lZEV4dGVybmFsQXBpRGlzcGF0Y2hlcic7XG4iLCJpbXBvcnQgeyBWZXJzaW9uTnVtYmVyIH0gZnJvbSAnLi9WZXJzaW9uTnVtYmVyJztcbmltcG9ydCB7IFZlcnNpb25OdW1iZXJDb250cmFjdCB9IGZyb20gJy4vVmVyc2lvbk51bWJlckNvbnRyYWN0JztcblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBzaW5nbGV0b24gd3JhcHBlciBvZiBWZXJzaW9uTnVtYmVyXG4gKi9cbmV4cG9ydCBjbGFzcyBBcGlWZXJzaW9uIHtcbiAgLy8gVXNpbmcgc29tZSB3ZWJwYWNrIHRyaWNrcywgd2UgY2FuIGluamVjdCB0aGlzIHZlcnNpb24gaW50byBvdXIgY29kZSAoa2luZGEgbGlrZSBjKysgcHJlcHJvY2Vzc29yIHN0dWZmKVxuICBwcml2YXRlIHN0YXRpYyBfaW5zdGFuY2U6IFZlcnNpb25OdW1iZXJDb250cmFjdDtcblxuICAvKipcbiAgICogR2V0cyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSB2ZXJzaW9uIG51bWJlci5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0IEluc3RhbmNlKCk6IFZlcnNpb25OdW1iZXJDb250cmFjdCB7XG4gICAgcmV0dXJuIEFwaVZlcnNpb24uX2luc3RhbmNlO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBTZXRWZXJzaW9uTnVtYmVyKG51bVN0cmluZzogc3RyaW5nLCBpc0FscGhhOiBib29sZWFuKTogdm9pZCB7XG4gICAgQXBpVmVyc2lvbi5faW5zdGFuY2UgPSBuZXcgVmVyc2lvbk51bWJlcihudW1TdHJpbmcsIGlzQWxwaGEpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQ29ubmVjdGlvbkRlc2NyaXB0aW9uU3VtbWFyeSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgYSBjb25uZWN0aW9uIHN1bW1hcnkuXG4gKiBUaGlzIGRvZXMgbm90IGZvbGxvdyB0aGUgSW1wbCBwYXR0ZXJuIGFzIGl0IGlzIGp1c3QgYSBwcm9wZXJ0eSBiYWcuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb25uZWN0aW9uU3VtbWFyeSBpbXBsZW1lbnRzIENvbnRyYWN0LkNvbm5lY3Rpb25TdW1tYXJ5IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2Nvbm5lY3Rpb25JbmZvOiBDb25uZWN0aW9uRGVzY3JpcHRpb25TdW1tYXJ5KSB7fVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jb25uZWN0aW9uSW5mby5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jb25uZWN0aW9uSW5mby5pZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2VydmVyVVJJKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2Nvbm5lY3Rpb25JbmZvLnNlcnZlclVSSTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jb25uZWN0aW9uSW5mby50eXBlO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSxcbiAgQ3Jvc3NGcmFtZU1lc3NlbmdlcixcbiAgSW5pdGlhbGl6YXRpb25PcHRpb25zLFxuICBNRVNTQUdJTkdfVkVSU0lPTiBhcyBBcGlNZXNzYWdpbmdWZXJzaW9uLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQ3Jvc3NGcmFtZURpc3BhdGNoZXIgfSBmcm9tICcuL0Nyb3NzRnJhbWVEaXNwYXRjaGVyJztcblxuLy8gQ2hlY2tzIHRvIHNlZSBpZiB3ZSBhcmUgcnVubmluZyBpbiBhbiBpZnJhbWUgY3VycmVudGx5OiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzI2MDc2Lzg4MjExNTNcbmZ1bmN0aW9uIGluSWZyYW1lKHRoaXNXaW5kb3c6IFdpbmRvdyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHJldHVybiB0aGlzV2luZG93LnNlbGYgIT09IHRoaXNXaW5kb3cucGFyZW50O1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBBdHRlbXB0cyB0byBib290c3RyYXAgdGhlIGV4dGVuc2lvbiB3aXRoIGEgY3Jvc3MtZnJhbWUgcGFyZW50IHdoZXJlIFRhYmxlYXUgaXMgcnVubmluZ1xuICpcbiAqIEBwYXJhbSB0aGlzV2luZG93IFRoZSB3aW5kb3cgd2hpY2ggd2UgYXJlIHJ1bm5pbmcgaW4gKGluamVjdGVkIGZvciB1bml0IHRlc3RpbmcgcHVycG9zZXMpXG4gKiBAcGFyYW0gaW50ZXJuYWxDb250cmFjdFZlcnNpb24gVGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBpbnRlcm5hbCBjb250cmFjdCB3ZSBhcmUgdXNpbmdcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB3aGljaCBpcyBkb2luZyB0aGUgYWN0dWFsIGJvb3RzdHJhcHBpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRvQ3Jvc3NGcmFtZUJvb3RzdHJhcChcbiAgdGhpc1dpbmRvdzogV2luZG93LFxuICBpbnRlcm5hbENvbnRyYWN0VmVyc2lvbjogQ29udHJhY3QuVmVyc2lvbk51bWJlcixcbiAgb3B0aW9uczogSW5pdGlhbGl6YXRpb25PcHRpb25zLFxuKTogUHJvbWlzZTxDb250cmFjdC5JbnRlcm5hbEFwaURpc3BhdGNoZXJGYWN0b3J5PiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZTxDb250cmFjdC5JbnRlcm5hbEFwaURpc3BhdGNoZXJGYWN0b3J5PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgbGV0IHBhcmVudDogV2luZG93O1xuXG4gICAgLy8gTm9ybWFsbHksIHdlIGFyZSBydW5uaW5nIGluc2lkZSBhbiBpZnJhbWUuICBUaGUgZXhjZXB0aW9uIHRvIHRoaXMgaXNcbiAgICAvLyB3aGVuIHdlIGFyZSBydW5uaW5nIGFzIGFuIGV4dGVuc2lvbiBpbnNpZGUgYSBkaWFsb2cgYXMgcGFydCBvZiB0aGUgVUlOYW1lc3BhY2VcbiAgICAvLyBmdW5jdGlvbmFsaXR5LiAgSW4gdGhhdCBjYXNlLCB3ZSB3YW50IHRoZSBvcGVuZXIgb2YgdGhpcyB3aW5kb3cgcmF0aGVyIHRoYW4gdGhlIHBhcmVudC5cbiAgICBpZiAoIWluSWZyYW1lKHRoaXNXaW5kb3cpKSB7XG4gICAgICBwYXJlbnQgPSB0aGlzV2luZG93Lm9wZW5lcjtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyZW50ID0gdGhpc1dpbmRvdy5wYXJlbnQ7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgIHJlamVjdCgnVGhpcyBleHRlbnNpb24gaXMgbm90IHJ1bm5pbmcgaW5zaWRlIGFuIGlmcmFtZSwgZGVza3RvcCwgb3IgcG9wdXAgd2luZG93LiBJbml0aWFsaXphdGlvbiBmYWlsZWQuJyk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHRoZSBtZXNzZW5nZXIgd2hpY2ggd2lsbCBkbyBoZSBjb21tdW5pY2F0aW9uIGJldHdlZW4gdGhpcyB3aW5kb3cgYW5kIG91ciBwYXJlbnRcbiAgICAvLyBTaW5jZSB3ZSBkb24ndCBrbm93IHdoZXJlIHdlIGFyZSBydW5uaW5nIHlldCwgd2UgaGF2ZSB0byBtYWtlIHRoaXMgaW5pdGlhbCBvcmlnaW4gJyonLiBPbmNlXG4gICAgLy8gd2UgaGF2ZSBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQgb3VyIGV4dGVuc2lvbiwgd2Ugd2lsbCBsaW1pdCB3aGVyZSB3ZSBzZW5kIG1lc3NhZ2VzXG4gICAgY29uc3QgbWVzc2VuZ2VyID0gbmV3IENyb3NzRnJhbWVNZXNzZW5nZXIodGhpc1dpbmRvdywgcGFyZW50LCAnKicpO1xuXG4gICAgLy8gUHJlcGFyZSB0byBzZW5kIGFuIGluaXRpYWxpemF0aW9uIG1lc3NhZ2UgdG8gdGhlIHBhcmVudCBmcmFtZVxuICAgIGNvbnN0IGluaXRpYWxpemF0aW9uTWVzc2FnZSA9IG1lc3Nlbmdlci5wcmVwYXJlSW5pdGlhbGl6YXRpb25NZXNzYWdlKGludGVybmFsQ29udHJhY3RWZXJzaW9uLCBBcGlNZXNzYWdpbmdWZXJzaW9uLCBvcHRpb25zKTtcblxuICAgIC8vIFdoZW4gd2UgcmVjZWl2ZSBhIHJlc3BvbnNlIGJhY2sgZnJvbSB0aGUgcGFyZW50LCB3ZSBjaGVjayB0byBtYWtlIHN1cmUgdGhlIGd1aWRzIG1hdGNoIGFuZCB0aGVuIHdlIGtub3dcbiAgICAvLyB0aGF0IHRoZSBwYXJlbnQgaXMgYXdhcmUgb2YgdXMgYW5kIHdlIGNhbiBzdGFydCBjb21tdW5pY2F0aW5nXG4gICAgbWVzc2VuZ2VyLnNldENvbW1hbmRSZXNwb25zZU1lc3NhZ2VIYW5kbGVyKGZ1bmN0aW9uIChtc2c6IENvbW1hbmRSZXNwb25zZU1lc3NhZ2UpOiB2b2lkIHtcbiAgICAgIC8vIFZlcmlmeSB3ZSBhcmUgZ2V0dGluZyBhIHJlc3BvbnNlIGZyb20gb3VyIGluaXRpYWxpemUgbWVzc2FnZVxuICAgICAgaWYgKG1zZy5jb21tYW5kR3VpZCA9PT0gaW5pdGlhbGl6YXRpb25NZXNzYWdlLm1lc3NhZ2VHdWlkKSB7XG4gICAgICAgIC8vIFRoZSB2ZXJzaW9uaW5nIG9mIHRoZSBkaXNwYXRjaGVyIGhhcHBlbnMgb24gdGhlIG90aGVyIHNpZGUgb2Ygb3VyIGZyYW1lLCBhbmRcbiAgICAgICAgLy8gaW4gYSB3cmFwcGVyIG9uIHRoaXMgc2lkZS4gVGhpcyBvbmUgZG9lc24ndCBoYXZlIGFueSB2ZXJzaW9uIGtub3dsZWRnZS5cbiAgICAgICAgY29uc3QgZGlzcGF0Y2hlckZhY3RvcnkgPSAoKSA9PiBuZXcgQ3Jvc3NGcmFtZURpc3BhdGNoZXIobWVzc2VuZ2VyKTtcbiAgICAgICAgcmVzb2x2ZShkaXNwYXRjaGVyRmFjdG9yeSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBOb3cgdGhhdCBvdXIgaGFuZGxlcnMgYXJlIHJlYWR5LCBzdGFydCBsaXN0ZW5pbmcgYW5kIHNlbmQgb3VyIGluaXRpYWxpemF0aW9uIG1lc3NhZ2VcbiAgICBtZXNzZW5nZXIuc3RhcnRMaXN0ZW5pbmcoKTtcbiAgICBpbml0aWFsaXphdGlvbk1lc3NhZ2Uuc2VuZCgpO1xuICB9KTtcbn1cbiIsImltcG9ydCB7IEVtYmVkZGluZ0Vycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSxcbiAgRXhlY3V0ZVBhcmFtZXRlcnMsXG4gIEV4ZWN1dGVSZXNwb25zZSxcbiAgSW50ZXJuYWxBcGlEaXNwYXRjaGVyLFxuICBNZXNzZW5nZXIsXG4gIE1vZGVsLFxuICBOb3RpZmljYXRpb25IYW5kbGVyLFxuICBOb3RpZmljYXRpb25NZXNzYWdlLFxuICBWZXJiSWQsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuXG4vKipcbiAqIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIEludGVybmFsQXBpRGlzcGF0Y2hlciBpbnRlcmZhY2Ugd2hpY2ggZnVuY3Rpb25zIGJ5IHBhc3NpbmcgbWVzc2FnZXNcbiAqIGFjcm9zcyBhIGZyYW1lIGJvdW5kYXJ5LiBUaGlzIGlzIHVzdWFsbHkgYmV0d2VlbiB0aGUgY29kZSB3aGVyZSBvdXIgamF2c2NyaXB0IGxpYnJhcnkgaGFzIGJlZW4gaW5jbHVkZWRcbiAqIGJ5IGEgM3JkIHBhcnR5IGRldiBhbmQgYW5vdGhlciBmcmFtZSB3aGVyZSBUYWJsZWF1IHNlcnZlciBoYXMgY29udGVudC5cbiAqL1xuZXhwb3J0IGNsYXNzIENyb3NzRnJhbWVEaXNwYXRjaGVyIGltcGxlbWVudHMgSW50ZXJuYWxBcGlEaXNwYXRjaGVyIHtcbiAgLy8gQ29sbGVjdGlvbiBvZiBwZW5kaW5nIHByb21pc2VzIHdoaWNoIGFyZSB3YWl0aW5nIHRvIGJlIHJlc29sdmVkLiBXaGVuIHdlIHJlY2VpdmUgYSByZXNwb25zZSBiYWNrIGZyb20gdGhlIG90aGVyIGZyYW1lLFxuICAvLyB0aGVzZSBwcm9taXNlcyBjYW4gYmUgZWl0aGVyIHJlc29sdmVkIG9yIHJlamVjdGVkXG4gIHByaXZhdGUgX3BlbmRpbmdQcm9taXNlczogeyBbbWVzc2FnZUd1aWQ6IHN0cmluZ106IHsgcmVzb2x2ZTogKHJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UpID0+IHZvaWQ7IHJlamVjdDogKGVycm9yOiBNb2RlbCkgPT4gdm9pZCB9IH0gPVxuICAgIHt9O1xuXG4gIC8vIFRoZSBjb2xsZWN0aW9uIG9mIG5vdGlmaWNhdGlvbiBoYW5kbGVycyB3aGljaCBoYXZlIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoaXMgZGlzcGF0Y2hlclxuICBwcml2YXRlIF9ub3RpZmljYXRpb25IYW5kbGVyczogQXJyYXk8Tm90aWZpY2F0aW9uSGFuZGxlcj4gPSBbXTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBDcm9zc0ZyYW1lRGlzcGF0Y2hlciB3aGljaCB3aWxsIHVzZSB0aGUgZ2l2ZW4gbWVzc2VuZ2VyIHRvIGNvbW11bmljYXRlXG4gICAqIEBwYXJhbSBfbWVzc2VuZ2VyIGFuIGluc3RhbnRpYXRlZCBhbmQgbGlzdGVuaW5nIG1lc3NlbmdlciBvYmplY3RcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9tZXNzZW5nZXI6IE1lc3Nlbmdlcikge1xuICAgIGlmICghdGhpcy5fbWVzc2VuZ2VyKSB7XG4gICAgICB0aHJvdyAnTWlzc2luZyBtZXNzZW5nZXIgb2JqZWN0JztcbiAgICB9XG5cbiAgICAvLyBTZXQgdXAgb3VyIG1lc3NhZ2UgaGFuZGxlcnMuIFdlIG9ubHkgY2FyZSBhYm91dCBpbmNvbWluZyBub3RpZmljYXRpb25zIGFuZCBjb21tYW5kIHJlc3BvbnNlc1xuICAgIHRoaXMuX21lc3Nlbmdlci5zZXRDb21tYW5kUmVzcG9uc2VNZXNzYWdlSGFuZGxlcih0aGlzLm9uQ29tbWFuZFJlc3BvbnNlLmJpbmQodGhpcykpO1xuICAgIHRoaXMuX21lc3Nlbmdlci5zZXROb3RpZmljYXRpb25NZXNzYWdlSGFuZGxlcih0aGlzLm9uTm90aWZpY2F0aW9uLmJpbmQodGhpcykpO1xuICB9XG5cbiAgLy8vLy8vIFN0YXJ0IEludGVybmFsQXBpRGlzcGF0Y2hlciBpbXBsZW1lbnRhdGlvblxuXG4gIHB1YmxpYyBleGVjdXRlKHZlcmI6IFZlcmJJZCwgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMpOiBQcm9taXNlPEV4ZWN1dGVSZXNwb25zZT4ge1xuICAgIC8vIFRvIGV4ZWN1dGUgYSB2ZXJiLCB3ZSBmaXJzdCBwcmVwYXJlIGEgY29tbWFuZCBtZXNzYWdlIGFuZCB0aGVuIGRlZmluZSBhIHByb21pc2UuXG4gICAgY29uc3QgcHJlcGFyZWRNZXNzYWdlID0gdGhpcy5fbWVzc2VuZ2VyLnByZXBhcmVDb21tYW5kTWVzc2FnZSh2ZXJiLCBwYXJhbWV0ZXJzKTtcbiAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2U8RXhlY3V0ZVJlc3BvbnNlPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAvLyBTYXZlIG9mZiB0aGUgcGVuZGluZyBwcm9taXNlIGJ5IHRoZSBtZXNzYWdlR3VpZCB3ZSBhcmUgYWJvdXQgdG8gc2VuZC4gV2hlbiBhIHJlc3BvbnNlIGlzXG4gICAgICAvLyByZWNlaXZlZCwgd2UnbGwgYmUgYWJsZSB0byByZXNvbHZlIHRoaXMgcHJvbWlzZSB3aXRoIHRoZSByZXN1bHRcbiAgICAgIHRoaXMuX3BlbmRpbmdQcm9taXNlc1twcmVwYXJlZE1lc3NhZ2UubWVzc2FnZUd1aWRdID0geyByZXNvbHZlOiByZXNvbHZlLCByZWplY3Q6IHJlamVjdCB9O1xuICAgIH0pO1xuXG4gICAgLy8gQWN0dWFsbHkgc2VuZCB0aGUgbWVzc2FnZSBhbmQgcmV0dXJuIHRoZSBwcm9taXNlXG4gICAgcHJlcGFyZWRNZXNzYWdlLnNlbmQoKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3Rlck5vdGlmaWNhdGlvbkhhbmRsZXIoaGFuZGxlcjogTm90aWZpY2F0aW9uSGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMuX25vdGlmaWNhdGlvbkhhbmRsZXJzLnB1c2goaGFuZGxlcik7XG4gIH1cblxuICBwdWJsaWMgdW5yZWdpc3Rlck5vdGlmaWNhdGlvbkhhbmRsZXIoaGFuZGxlcjogTm90aWZpY2F0aW9uSGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMuX25vdGlmaWNhdGlvbkhhbmRsZXJzID0gdGhpcy5fbm90aWZpY2F0aW9uSGFuZGxlcnMuZmlsdGVyKChoKSA9PiBoICE9PSBoYW5kbGVyKTtcbiAgfVxuXG4gIC8vLy8vLyBFbmQgSW50ZXJuYWxBcGlEaXNwYXRjaGVyIGltcGxlbWVudGF0aW9uXG5cbiAgcHJpdmF0ZSBvbkNvbW1hbmRSZXNwb25zZShyZXNwb25zZTogQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSk6IHZvaWQge1xuICAgIC8vIFdlIGdvdCBhIGNvbW1hbmQgcmVzcG9uc2UsIGxvb2sgdGhyb3VnaCB0aGUgcGVuZGluZyBwcm9taXNlcyBhbmQgcmVzb2x2ZVxuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl9wZW5kaW5nUHJvbWlzZXMpLmluZGV4T2YocmVzcG9uc2UuY29tbWFuZEd1aWQpIDwgMCkge1xuICAgICAgcmV0dXJuOyAvLyBXZSBkb24ndCBoYXZlIGFueSByZWZlcmVuY2UgdG8gdGhpcyBjb21tYW5kLCBqdXN0IHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHBlbmRpbmdQcm9taXNlID0gdGhpcy5fcGVuZGluZ1Byb21pc2VzW3Jlc3BvbnNlLmNvbW1hbmRHdWlkXTtcblxuICAgIC8vIElmIHdlIGhhdmUgYW4gZXJyb3IgZGVmaW5lZCwgcmVqZWN0IHRoZSBwcm9taXNlXG4gICAgaWYgKHJlc3BvbnNlLmVycm9yKSB7XG4gICAgICBwZW5kaW5nUHJvbWlzZS5yZWplY3QocmVzcG9uc2UuZXJyb3IpO1xuICAgIH1cblxuICAgIC8vIElmIHdlIGhhdmUgZGF0YSBkZWZpbmVkLCByZXNvbHZlIHRoZSBwcm9taXNlXG4gICAgaWYgKHJlc3BvbnNlLmRhdGEpIHtcbiAgICAgIHBlbmRpbmdQcm9taXNlLnJlc29sdmUoeyByZXN1bHQ6IHJlc3BvbnNlLmRhdGEgfSk7XG4gICAgfVxuXG4gICAgLy8gQ2xlYW4gdXAgb3VyIHBlbmRpbmcgcHJvbWlzZXMgb2JqZWN0XG4gICAgZGVsZXRlIHRoaXMuX3BlbmRpbmdQcm9taXNlc1tyZXNwb25zZS5jb21tYW5kR3VpZF07XG4gIH1cblxuICBwcml2YXRlIG9uTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbk1lc3NhZ2U6IE5vdGlmaWNhdGlvbk1lc3NhZ2UpOiB2b2lkIHtcbiAgICAvLyBHbyB0aHJvdWdoIGVhY2ggbm90aWZpY2F0aW9uIGhhbmRsZXIgd2UgaGF2ZSByZWdpc3RlcmVkIGFuZCBsZXQgdGhlbSBrbm93IGEgbm90aWZpY2F0aW9uIGNhbWUgaW5cbiAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgdGhpcy5fbm90aWZpY2F0aW9uSGFuZGxlcnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGhhbmRsZXIoeyBub3RpZmljYXRpb25JZDogbm90aWZpY2F0aW9uTWVzc2FnZS5ub3RpZmljYXRpb25JZCwgZGF0YTogbm90aWZpY2F0aW9uTWVzc2FnZS5kYXRhIH0pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBJbmNhc2Ugb2YgYSBJbmNvbXBhdGlibGVWZXJzaW9uRXJyb3IsIHJlLXRocm93IHRoZSBlcnJvci5cbiAgICAgICAgaWYgKChlIGFzIFRhYmxlYXVFcnJvcikuZXJyb3JDb2RlID09PSBFbWJlZGRpbmdFcnJvckNvZGVzLkluY29tcGF0aWJsZVZlcnNpb25FcnJvcikge1xuICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRWxzZSBJZ25vcmUgIHNvIGlmIG9uZSBoYW5kbGVyIGVycm9ycywgdGhlIG90aGVyIHN0aWxsIGdldCB0aGUgbWVzc2FnZS5cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXRhU291cmNlSW1wbCB9IGZyb20gJy4vSW1wbC9EYXRhU291cmNlSW1wbCc7XG5cbmV4cG9ydCBjbGFzcyBEYXRhU291cmNlIGltcGxlbWVudHMgQ29udHJhY3QuRGF0YVNvdXJjZSB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9kYXRhU291cmNlSW1wbDogRGF0YVNvdXJjZUltcGwpIHt9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbXBsLm5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbXBsLmlkO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWVsZHMoKTogQXJyYXk8Q29udHJhY3QuRmllbGQ+IHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwuZmllbGRzO1xuICB9XG5cbiAgcHVibGljIGdldCBleHRyYWN0VXBkYXRlVGltZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5leHRyYWN0VXBkYXRlVGltZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNFeHRyYWN0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5pc0V4dHJhY3Q7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzUHVibGlzaGVkKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5pc1B1Ymxpc2hlZDtcbiAgfVxuXG4gIHB1YmxpYyBwdWJsaXNoZWRVcmwoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwucHVibGlzaGVkVXJsKCk7XG4gIH1cblxuICBwdWJsaWMgcmVmcmVzaEFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5yZWZyZXNoQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBY3RpdmVUYWJsZXNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LlRhYmxlU3VtbWFyeT4+IHtcbiAgICBjb25zb2xlLndhcm4oJ0RhdGFTb3VyY2UuZ2V0QWN0aXZlVGFibGVzQXN5bmMgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBEYXRhU291cmNlLmdldExvZ2ljYWxUYWJsZXNBc3luYy4nKTtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwuZ2V0QWN0aXZlVGFibGVzQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDb25uZWN0aW9uU3VtbWFyaWVzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5Db25uZWN0aW9uU3VtbWFyeT4+IHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwuZ2V0Q29ubmVjdGlvblN1bW1hcmllc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ0RhdGFBc3luYyhvcHRpb25zPzogQ29udHJhY3QuRGF0YVNvdXJjZVVuZGVybHlpbmdEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ0RhdGFTb3VyY2UuZ2V0VW5kZXJseWluZ0RhdGFBc3luYyBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlICcgK1xuICAgICAgICAnRGF0YVNvdXJjZS5nZXRMb2dpY2FsVGFibGVzQXN5bmMgYW5kIERhdGFTb3VyY2UuZ2V0TG9naWNhbFRhYmxlRGF0YUFzeW5jLicsXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwuZ2V0VW5kZXJseWluZ0RhdGFBc3luYyhvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMb2dpY2FsVGFibGVzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5Mb2dpY2FsVGFibGU+PiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbXBsLmdldExvZ2ljYWxUYWJsZXNBc3luYygpO1xuICB9XG5cbiAgcHVibGljIGdldExvZ2ljYWxUYWJsZURhdGFBc3luYyhsb2dpY2FsVGFibGVJZDogc3RyaW5nLCBvcHRpb25zPzogQ29udHJhY3QuRGF0YVNvdXJjZVVuZGVybHlpbmdEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbXBsLmdldExvZ2ljYWxUYWJsZURhdGFBc3luYyhsb2dpY2FsVGFibGVJZCwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TG9naWNhbFRhYmxlRGF0YVJlYWRlckFzeW5jKFxuICAgIGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsXG4gICAgcGFnZVJvd0NvdW50PzogbnVtYmVyLFxuICAgIG9wdGlvbnM/OiBDb250cmFjdC5EYXRhU291cmNlVW5kZXJseWluZ0RhdGFPcHRpb25zLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZVJlYWRlcj4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5nZXRMb2dpY2FsVGFibGVEYXRhUmVhZGVyQXN5bmMobG9naWNhbFRhYmxlSWQsIHBhZ2VSb3dDb3VudCwgb3B0aW9ucyk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIERhdGVSYW5nZVR5cGUgYXMgRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLFxuICBEaWFsb2dTdHlsZSBhcyBFeHRlcm5hbERpYWxvZ1N0eWxlLFxuICBGaWx0ZXJEb21haW5UeXBlIGFzIEV4dGVybmFsRG9tYWluVHlwZSxcbiAgRmlsdGVyTnVsbE9wdGlvbiBhcyBFeHRlcm5hbE51bGxPcHRpb24sXG4gIEZpbHRlclVwZGF0ZVR5cGUgYXMgRXh0ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLFxuICBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgUGVyaW9kVHlwZSxcbiAgUmVwbGF5U3BlZWRUeXBlLFxuICBTaGVldFR5cGUgYXMgRXh0ZXJuYWxTaGVldFR5cGUsXG4gIFpvbmVWaXNpYmlsaXR5VHlwZSxcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIEFwaVNob3dEYXRhVGFibGVGb3JtYXQsXG4gIERhdGVSYW5nZVR5cGUgYXMgSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLFxuICBEYXRlU3RlcFBlcmlvZCxcbiAgRGlhbG9nU3R5bGUgYXMgSW50ZXJuYWxEaWFsb2dTdHlsZSxcbiAgRmlsdGVyRG9tYWluVHlwZSBhcyBJbnRlcm5hbERvbWFpblR5cGUsXG4gIEZpbHRlck51bGxPcHRpb24gYXMgSW50ZXJuYWxOdWxsT3B0aW9uLFxuICBGaWx0ZXJVcGRhdGVUeXBlIGFzIEludGVybmFsRmlsdGVyVXBkYXRlVHlwZSxcbiAgU2hlZXRUeXBlIGFzIEludGVybmFsU2hlZXRUeXBlLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRW51bUNvbnZlcnRlciB9IGZyb20gJy4uL1V0aWxzL0VudW1Db252ZXJ0ZXInO1xuXG4vKiB0c2xpbnQ6ZGlzYWJsZTp0eXBlZGVmIC0gRGlzYWJsZSB0aGlzIHRvIG1ha2UgZGVjbGFyaW5nIHRoZXNlIGNsYXNzZXMgYSBiaXQgZWFzaWVyICovXG4vKipcbiAqIE1hcHMgZW51bXMgdXNlZCBieSB0aGUgZXh0ZXJuYWwtYXBpLWNvbnRyYWN0IHRvIHRoZSBlbnVtcyB1c2VkXG4gKiBpbiB0aGUgaW50ZXJuYWwtYXBpLWNvbnRyYWN0LCB3aGljaCBkZXZlbG9wZXJzIGNvZGUgYWdhaW5zdC5cbiAqL1xuZXhwb3J0IGNsYXNzIEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyB7XG4gIHB1YmxpYyBzdGF0aWMgZmlsdGVyRG9tYWluVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEV4dGVybmFsRG9tYWluVHlwZSwgSW50ZXJuYWxEb21haW5UeXBlPih7XG4gICAgW0V4dGVybmFsRG9tYWluVHlwZS5SZWxldmFudF06IEludGVybmFsRG9tYWluVHlwZS5SZWxldmFudCxcbiAgICBbRXh0ZXJuYWxEb21haW5UeXBlLkRhdGFiYXNlXTogSW50ZXJuYWxEb21haW5UeXBlLkRhdGFiYXNlLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIG51bGxPcHRpb25zID0gbmV3IEVudW1Db252ZXJ0ZXI8RXh0ZXJuYWxOdWxsT3B0aW9uLCBJbnRlcm5hbE51bGxPcHRpb24+KHtcbiAgICBbRXh0ZXJuYWxOdWxsT3B0aW9uLkFsbFZhbHVlc106IEludGVybmFsTnVsbE9wdGlvbi5BbGxWYWx1ZXMsXG4gICAgW0V4dGVybmFsTnVsbE9wdGlvbi5Ob25OdWxsVmFsdWVzXTogSW50ZXJuYWxOdWxsT3B0aW9uLk5vbk51bGxWYWx1ZXMsXG4gICAgW0V4dGVybmFsTnVsbE9wdGlvbi5OdWxsVmFsdWVzXTogSW50ZXJuYWxOdWxsT3B0aW9uLk51bGxWYWx1ZXMsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZmlsdGVyVXBkYXRlVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEV4dGVybmFsRmlsdGVyVXBkYXRlVHlwZSwgSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlPih7XG4gICAgW0V4dGVybmFsRmlsdGVyVXBkYXRlVHlwZS5BZGRdOiBJbnRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuQWRkLFxuICAgIFtFeHRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuQWxsXTogSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLkFsbCxcbiAgICBbRXh0ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLlJlbW92ZV06IEludGVybmFsRmlsdGVyVXBkYXRlVHlwZS5SZW1vdmUsXG4gICAgW0V4dGVybmFsRmlsdGVyVXBkYXRlVHlwZS5SZXBsYWNlXTogSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLlJlcGxhY2UsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgc2V0VmlzaWJpbGl0eVR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxab25lVmlzaWJpbGl0eVR5cGUsIGJvb2xlYW4+KHtcbiAgICBbWm9uZVZpc2liaWxpdHlUeXBlLlNob3ddOiB0cnVlLFxuICAgIFtab25lVmlzaWJpbGl0eVR5cGUuSGlkZV06IGZhbHNlLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIHNldFJlcGxheVNwZWVkVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPFJlcGxheVNwZWVkVHlwZSwgbnVtYmVyPih7XG4gICAgLy8gdGhlc2UgbnVtYmVycyBhcmUgZHVyYXRpb24gbXVsdGlwbGllcnNcbiAgICAvLyAyLjAsIGZvciBleGFtcGxlLCBkb3VibGVzIHRoZSBkdXJhdGlvbiBvZiB0aGUgcmVwbGF5LCBzbG93aW5nIGl0IGRvd24gdG8gMC41eCBzcGVlZFxuICAgIFtSZXBsYXlTcGVlZFR5cGUuU2xvd106IDIuMCxcbiAgICBbUmVwbGF5U3BlZWRUeXBlLk5vcm1hbF06IDEuMCxcbiAgICBbUmVwbGF5U3BlZWRUeXBlLkZhc3RdOiAwLjUsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgc2hlZXRUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8RXh0ZXJuYWxTaGVldFR5cGUsIEludGVybmFsU2hlZXRUeXBlPih7XG4gICAgW0V4dGVybmFsU2hlZXRUeXBlLkRhc2hib2FyZF06IEludGVybmFsU2hlZXRUeXBlLkRhc2hib2FyZCxcbiAgICBbRXh0ZXJuYWxTaGVldFR5cGUuV29ya3NoZWV0XTogSW50ZXJuYWxTaGVldFR5cGUuV29ya3NoZWV0LFxuICAgIFtFeHRlcm5hbFNoZWV0VHlwZS5TdG9yeV06IEludGVybmFsU2hlZXRUeXBlLlN0b3J5LFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIHNob3dEYXRhVGFibGVGb3JtYXRUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sIEFwaVNob3dEYXRhVGFibGVGb3JtYXQ+KHtcbiAgICBbSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uQWxsVmFsdWVzXTogQXBpU2hvd0RhdGFUYWJsZUZvcm1hdC5OYXRpdmVBbmRGb3JtYXR0ZWRWYWx1ZXMsXG4gICAgW0luY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLk9ubHlOYXRpdmVWYWx1ZXNdOiBBcGlTaG93RGF0YVRhYmxlRm9ybWF0Lk5hdGl2ZVZhbHVlc09ubHksXG4gICAgW0luY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLk9ubHlGb3JtYXR0ZWRWYWx1ZXNdOiBBcGlTaG93RGF0YVRhYmxlRm9ybWF0LkZvcm1hdHRlZFZhbHVlc09ubHksXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgcGVyaW9kVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPFBlcmlvZFR5cGUsIERhdGVTdGVwUGVyaW9kPih7XG4gICAgW1BlcmlvZFR5cGUuWWVhcnNdOiBEYXRlU3RlcFBlcmlvZC5ZZWFycyxcbiAgICBbUGVyaW9kVHlwZS5RdWFydGVyc106IERhdGVTdGVwUGVyaW9kLlF1YXJ0ZXJzLFxuICAgIFtQZXJpb2RUeXBlLk1vbnRoc106IERhdGVTdGVwUGVyaW9kLk1vbnRocyxcbiAgICBbUGVyaW9kVHlwZS5XZWVrc106IERhdGVTdGVwUGVyaW9kLldlZWtzLFxuICAgIFtQZXJpb2RUeXBlLkRheXNdOiBEYXRlU3RlcFBlcmlvZC5EYXlzLFxuICAgIFtQZXJpb2RUeXBlLkhvdXJzXTogRGF0ZVN0ZXBQZXJpb2QuSG91cnMsXG4gICAgW1BlcmlvZFR5cGUuTWludXRlc106IERhdGVTdGVwUGVyaW9kLk1pbnV0ZXMsXG4gICAgW1BlcmlvZFR5cGUuU2Vjb25kc106IERhdGVTdGVwUGVyaW9kLlNlY29uZHMsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZGF0ZVJhbmdlVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEV4dGVybmFsRGF0ZVJhbmdlVHlwZSwgSW50ZXJuYWxEYXRlUmFuZ2VUeXBlPih7XG4gICAgW0V4dGVybmFsRGF0ZVJhbmdlVHlwZS5MYXN0XTogSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLkxhc3QsXG4gICAgW0V4dGVybmFsRGF0ZVJhbmdlVHlwZS5MYXN0Tl06IEludGVybmFsRGF0ZVJhbmdlVHlwZS5MYXN0TixcbiAgICBbRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLk5leHRdOiBJbnRlcm5hbERhdGVSYW5nZVR5cGUuTmV4dCxcbiAgICBbRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLk5leHROXTogSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLk5leHROLFxuICAgIFtFeHRlcm5hbERhdGVSYW5nZVR5cGUuQ3VycmVudF06IEludGVybmFsRGF0ZVJhbmdlVHlwZS5DdXJyZW50LFxuICAgIFtFeHRlcm5hbERhdGVSYW5nZVR5cGUuVG9EYXRlXTogSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLlRvRGF0ZSxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBkaWFsb2dTdHlsZXMgPSBuZXcgRW51bUNvbnZlcnRlcjxFeHRlcm5hbERpYWxvZ1N0eWxlLCBJbnRlcm5hbERpYWxvZ1N0eWxlPih7XG4gICAgW0V4dGVybmFsRGlhbG9nU3R5bGUuV2luZG93XTogSW50ZXJuYWxEaWFsb2dTdHlsZS5XaW5kb3csXG4gICAgW0V4dGVybmFsRGlhbG9nU3R5bGUuTW9kYWxdOiBJbnRlcm5hbERpYWxvZ1N0eWxlLk1vZGFsLFxuICAgIFtFeHRlcm5hbERpYWxvZ1N0eWxlLk1vZGVsZXNzXTogSW50ZXJuYWxEaWFsb2dTdHlsZS5Nb2RlbGVzcyxcbiAgfSk7XG59XG4vKiB0c2xpbnQ6ZW5hYmxlOnR5cGVkZWYgKi9cbiIsImltcG9ydCB7XG4gIEFubm90YXRpb25UeXBlIGFzIEV4dGVybmFsQW5ub3RhdGlvblR5cGUsXG4gIENsYXNzTmFtZUtleSBhcyBFeHRlcm5hbENsYXNzTmFtZUtleSxcbiAgQ29sdW1uVHlwZSBhcyBFeHRlcm5hbENvbHVtblR5cGUsXG4gIERhc2hib2FyZE9iamVjdFR5cGUgYXMgRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLFxuICBEYXRhVHlwZSBhcyBFeHRlcm5hbERhdGFUeXBlLFxuICBQZXJpb2RUeXBlIGFzIEV4dGVybmFsRGF0ZVBlcmlvZCxcbiAgRGF0ZVJhbmdlVHlwZSBhcyBFeHRlcm5hbERhdGVSYW5nZVR5cGUsXG4gIEVycm9yQ29kZXMgYXMgRXh0ZXJuYWxFcnJvckNvZGVzLFxuICBFeHRlbnNpb25Db250ZXh0IGFzIEV4dGVybmFsRXh0ZW5zaW9uc0NvbnRleHQsXG4gIEV4dGVuc2lvbk1vZGUgYXMgRXh0ZXJuYWxFeHRlbnNpb25zTW9kZSxcbiAgRmllbGRBZ2dyZWdhdGlvblR5cGUgYXMgRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZSxcbiAgRmllbGRSb2xlVHlwZSBhcyBFeHRlcm5hbEZpZWxkUm9sZVR5cGUsXG4gIEZpbHRlclR5cGUgYXMgRXh0ZXJuYWxGaWx0ZXJUeXBlLFxuICBGaWx0ZXJVcGRhdGVUeXBlIGFzIEV4dGVybmFsRmlsdGVyVXBkYXRlVHlwZSxcbiAgSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZSBhcyBFeHRlcm5hbEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUsXG4gIE1hcmtUeXBlIGFzIEV4dGVybmFsTWFya1R5cGUsXG4gIFBhcmFtZXRlclZhbHVlVHlwZSBhcyBFeHRlcm5hbFBhcmFtZXRlclZhbHVlVHlwZSxcbiAgU2hlZXRUeXBlIGFzIEV4dGVybmFsU2hlZXRUeXBlLFxufSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQW5ub3RhdGVFbnVtIGFzIEludGVybmFsQW5ub3RhdGlvblR5cGUsXG4gIENsYXNzTmFtZUtleSBhcyBJbnRlcm5hbENsYXNzTmFtZUtleSxcbiAgQ29sdW1uVHlwZSBhcyBJbnRlcm5hbENvbHVtblR5cGUsXG4gIERhc2hib2FyZE9iamVjdFR5cGUgYXMgSW50ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLFxuICBEYXRhVHlwZSBhcyBJbnRlcm5hbERhdGFUeXBlLFxuICBEYXRlUmFuZ2VUeXBlIGFzIEludGVybmFsRGF0ZVJhbmdlVHlwZSxcbiAgRGF0ZVN0ZXBQZXJpb2QgYXMgSW50ZXJuYWxEYXRlU3RlcFBlcmlvZCxcbiAgRG9tYWluUmVzdHJpY3Rpb25UeXBlIGFzIEludGVybmFsRG9tYWluUmVzdHJpY3Rpb25UeXBlLFxuICBFcnJvckNvZGVzIGFzIEludGVybmFsRXJyb3JDb2RlcyxcbiAgRXh0ZW5zaW9uQ29udGV4dCBhcyBJbnRlcm5hbEV4dGVuc2lvbnNDb250ZXh0LFxuICBFeHRlbnNpb25Nb2RlIGFzIEludGVybmFsRXh0ZW5zaW9uc01vZGUsXG4gIEZpZWxkQWdncmVnYXRpb25UeXBlIGFzIEludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUsXG4gIEZpZWxkUm9sZVR5cGUgYXMgSW50ZXJuYWxGaWVsZFJvbGVUeXBlLFxuICBGaWx0ZXJUeXBlIGFzIEludGVybmFsRmlsdGVyVHlwZSxcbiAgRmlsdGVyVXBkYXRlVHlwZSBhcyBJbnRlcm5hbEZpbHRlclVwZGF0ZVR5cGUsXG4gIEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUgYXMgSW50ZXJuYWxIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlLFxuICBNYXJrVHlwZSBhcyBJbnRlcm5hbE1hcmtUeXBlLFxuICBTaGVldFR5cGUgYXMgSW50ZXJuYWxTaGVldFR5cGUsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFbnVtQ29udmVydGVyIH0gZnJvbSAnLi4vVXRpbHMvRW51bUNvbnZlcnRlcic7XG5cbi8qIHRzbGludDpkaXNhYmxlOnR5cGVkZWYgLSBEaXNhYmxlIHRoaXMgdG8gbWFrZSBkZWNsYXJpbmcgdGhlc2UgY2xhc3NlcyBhIGJpdCBlYXNpZXIgKi9cbi8qKlxuICogTWFwcyBlbnVtcyB1c2VkIGJ5IHRoZSBpbnRlcm5hbC1hcGktY29udHJhY3QgdG8gdGhlIGVudW1zIHVzZWRcbiAqIGluIHRoZSBleHRlcm5hbC1hcGktY29udHJhY3QsIHdoaWNoIGRldmVsb3BlcnMgY29kZSBhZ2FpbnN0LlxuICovXG5leHBvcnQgY2xhc3MgSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzIHtcbiAgcHVibGljIHN0YXRpYyBleHRlbnNpb25Db250ZXh0ID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxFeHRlbnNpb25zQ29udGV4dCwgRXh0ZXJuYWxFeHRlbnNpb25zQ29udGV4dD4oe1xuICAgIFtJbnRlcm5hbEV4dGVuc2lvbnNDb250ZXh0LkRlc2t0b3BdOiBFeHRlcm5hbEV4dGVuc2lvbnNDb250ZXh0LkRlc2t0b3AsXG4gICAgW0ludGVybmFsRXh0ZW5zaW9uc0NvbnRleHQuU2VydmVyXTogRXh0ZXJuYWxFeHRlbnNpb25zQ29udGV4dC5TZXJ2ZXIsXG4gICAgW0ludGVybmFsRXh0ZW5zaW9uc0NvbnRleHQuUHVibGljV2ViXTogRXh0ZXJuYWxFeHRlbnNpb25zQ29udGV4dC5QdWJsaWNXZWIsXG4gICAgW0ludGVybmFsRXh0ZW5zaW9uc0NvbnRleHQuUHVibGljRGVza3RvcF06IEV4dGVybmFsRXh0ZW5zaW9uc0NvbnRleHQuUHVibGljRGVza3RvcCxcbiAgICBbSW50ZXJuYWxFeHRlbnNpb25zQ29udGV4dC5DbG91ZF06IEV4dGVybmFsRXh0ZW5zaW9uc0NvbnRleHQuQ2xvdWQsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZXh0ZW5zaW9uTW9kZSA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsRXh0ZW5zaW9uc01vZGUsIEV4dGVybmFsRXh0ZW5zaW9uc01vZGU+KHtcbiAgICBbSW50ZXJuYWxFeHRlbnNpb25zTW9kZS5BdXRob3JpbmddOiBFeHRlcm5hbEV4dGVuc2lvbnNNb2RlLkF1dGhvcmluZyxcbiAgICBbSW50ZXJuYWxFeHRlbnNpb25zTW9kZS5WaWV3aW5nXTogRXh0ZXJuYWxFeHRlbnNpb25zTW9kZS5WaWV3aW5nLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIGNvbHVtblR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbENvbHVtblR5cGUsIEV4dGVybmFsQ29sdW1uVHlwZT4oe1xuICAgIFtJbnRlcm5hbENvbHVtblR5cGUuQ29udGludW91c106IEV4dGVybmFsQ29sdW1uVHlwZS5Db250aW51b3VzLFxuICAgIFtJbnRlcm5hbENvbHVtblR5cGUuRGlzY3JldGVdOiBFeHRlcm5hbENvbHVtblR5cGUuRGlzY3JldGUsXG4gICAgW0ludGVybmFsQ29sdW1uVHlwZS5Vbmtub3duXTogRXh0ZXJuYWxDb2x1bW5UeXBlLlVua25vd24sXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZmllbGRBZ2dyZWdhdGlvblR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLCBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlPih7XG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuQXR0cl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuQXR0cixcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5BdmddOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkF2ZyxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Db2xsZWN0XTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Db2xsZWN0LFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkNvdW50XTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Db3VudCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Db3VudGRdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkNvdW50ZCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5EYXldOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkRheSxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5FbmRdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkVuZCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Ib3VyXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Ib3VyLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkluT3V0XTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Jbk91dCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5LdXJ0b3Npc106IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuS3VydG9zaXMsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTWF4XTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5NYXgsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTWR5XTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5NZHksXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTWVkaWFuXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5NZWRpYW4sXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTWluXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5NaW4sXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTWludXRlXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5NaW51dGUsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTW9udGhZZWFyXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Nb250aFllYXIsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTm9uZV06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuTm9uZSxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5RdHJdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlF0cixcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5RdWFydDFdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlF1YXJ0MSxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5RdWFydDNdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlF1YXJ0MyxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5TZWNvbmRdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlNlY29uZCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Ta2V3bmVzc106IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuU2tld25lc3MsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuU3RkZXZdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlN0ZGV2LFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlN0ZGV2cF06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuU3RkZXZwLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlN1bV06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuU3VtLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jRGF5XTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY0RheSxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY0hvdXJdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jSG91cixcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY01pbnV0ZV06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNNaW51dGUsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNNb250aF06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNNb250aCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY1F0cl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNRdHIsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNTZWNvbmRdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jU2Vjb25kLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jV2Vla106IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNXZWVrLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jWWVhcl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNZZWFyLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlVzZXJdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlVzZXIsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVmFyXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5WYXIsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVmFycF06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVmFycCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5XZWVrXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5XZWVrLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLldlZWtkYXldOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLldlZWtkYXksXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuWWVhcl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuWWVhcixcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBmaWVsZFJvbGVUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxGaWVsZFJvbGVUeXBlLCBFeHRlcm5hbEZpZWxkUm9sZVR5cGU+KHtcbiAgICBbSW50ZXJuYWxGaWVsZFJvbGVUeXBlLkRpbWVuc2lvbl06IEV4dGVybmFsRmllbGRSb2xlVHlwZS5EaW1lbnNpb24sXG4gICAgW0ludGVybmFsRmllbGRSb2xlVHlwZS5NZWFzdXJlXTogRXh0ZXJuYWxGaWVsZFJvbGVUeXBlLk1lYXN1cmUsXG4gICAgW0ludGVybmFsRmllbGRSb2xlVHlwZS5Vbmtub3duXTogRXh0ZXJuYWxGaWVsZFJvbGVUeXBlLlVua25vd24sXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgc2hlZXRUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxTaGVldFR5cGUsIEV4dGVybmFsU2hlZXRUeXBlPih7XG4gICAgW0ludGVybmFsU2hlZXRUeXBlLkRhc2hib2FyZF06IEV4dGVybmFsU2hlZXRUeXBlLkRhc2hib2FyZCxcbiAgICBbSW50ZXJuYWxTaGVldFR5cGUuU3RvcnldOiBFeHRlcm5hbFNoZWV0VHlwZS5TdG9yeSxcbiAgICBbSW50ZXJuYWxTaGVldFR5cGUuV29ya3NoZWV0XTogRXh0ZXJuYWxTaGVldFR5cGUuV29ya3NoZWV0LFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIGRhc2hib2FyZE9iamVjdFR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUsIEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZT4oe1xuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuRXh0ZW5zaW9uXTogRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLkV4dGVuc2lvbixcbiAgICBbSW50ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLkJsYW5rXTogRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLkJsYW5rLFxuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuSW1hZ2VdOiBFeHRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuSW1hZ2UsXG4gICAgW0ludGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5MZWdlbmRdOiBFeHRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuTGVnZW5kLFxuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuUGFnZUZpbHRlcl06IEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5QYWdlRmlsdGVyLFxuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuUGFyYW1ldGVyQ29udHJvbF06IEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5QYXJhbWV0ZXJDb250cm9sLFxuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuUXVpY2tGaWx0ZXJdOiBFeHRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuUXVpY2tGaWx0ZXIsXG4gICAgW0ludGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5UZXh0XTogRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLlRleHQsXG4gICAgW0ludGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5UaXRsZV06IEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5UaXRsZSxcbiAgICBbSW50ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLldlYlBhZ2VdOiBFeHRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuV2ViUGFnZSxcbiAgICBbSW50ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLldvcmtzaGVldF06IEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5Xb3Jrc2hlZXQsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZGF0YVR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbERhdGFUeXBlLCBFeHRlcm5hbERhdGFUeXBlPih7XG4gICAgW0ludGVybmFsRGF0YVR5cGUuQm9vbF06IEV4dGVybmFsRGF0YVR5cGUuQm9vbCxcbiAgICBbSW50ZXJuYWxEYXRhVHlwZS5EYXRlXTogRXh0ZXJuYWxEYXRhVHlwZS5EYXRlLFxuICAgIFtJbnRlcm5hbERhdGFUeXBlLkRhdGVUaW1lXTogRXh0ZXJuYWxEYXRhVHlwZS5EYXRlVGltZSxcbiAgICBbSW50ZXJuYWxEYXRhVHlwZS5GbG9hdF06IEV4dGVybmFsRGF0YVR5cGUuRmxvYXQsXG4gICAgW0ludGVybmFsRGF0YVR5cGUuSW50XTogRXh0ZXJuYWxEYXRhVHlwZS5JbnQsXG4gICAgW0ludGVybmFsRGF0YVR5cGUuU3BhdGlhbF06IEV4dGVybmFsRGF0YVR5cGUuU3BhdGlhbCxcbiAgICBbSW50ZXJuYWxEYXRhVHlwZS5TdHJpbmddOiBFeHRlcm5hbERhdGFUeXBlLlN0cmluZyxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBmaWx0ZXJVcGRhdGVUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLCBFeHRlcm5hbEZpbHRlclVwZGF0ZVR5cGU+KHtcbiAgICBbSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLkFkZF06IEV4dGVybmFsRmlsdGVyVXBkYXRlVHlwZS5BZGQsXG4gICAgW0ludGVybmFsRmlsdGVyVXBkYXRlVHlwZS5BbGxdOiBFeHRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuQWxsLFxuICAgIFtJbnRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuUmVtb3ZlXTogRXh0ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLlJlbW92ZSxcbiAgICBbSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLlJlcGxhY2VdOiBFeHRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuUmVwbGFjZSxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBhbGxvd2FibGVWYWx1ZXMgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbERvbWFpblJlc3RyaWN0aW9uVHlwZSwgRXh0ZXJuYWxQYXJhbWV0ZXJWYWx1ZVR5cGU+KHtcbiAgICBbSW50ZXJuYWxEb21haW5SZXN0cmljdGlvblR5cGUuQWxsXTogRXh0ZXJuYWxQYXJhbWV0ZXJWYWx1ZVR5cGUuQWxsLFxuICAgIFtJbnRlcm5hbERvbWFpblJlc3RyaWN0aW9uVHlwZS5MaXN0XTogRXh0ZXJuYWxQYXJhbWV0ZXJWYWx1ZVR5cGUuTGlzdCxcbiAgICBbSW50ZXJuYWxEb21haW5SZXN0cmljdGlvblR5cGUuUmFuZ2VdOiBFeHRlcm5hbFBhcmFtZXRlclZhbHVlVHlwZS5SYW5nZSxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBkYXRlU3RlcFBlcmlvZCA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsRGF0ZVN0ZXBQZXJpb2QsIEV4dGVybmFsRGF0ZVBlcmlvZD4oe1xuICAgIFtJbnRlcm5hbERhdGVTdGVwUGVyaW9kLlllYXJzXTogRXh0ZXJuYWxEYXRlUGVyaW9kLlllYXJzLFxuICAgIFtJbnRlcm5hbERhdGVTdGVwUGVyaW9kLlF1YXJ0ZXJzXTogRXh0ZXJuYWxEYXRlUGVyaW9kLlF1YXJ0ZXJzLFxuICAgIFtJbnRlcm5hbERhdGVTdGVwUGVyaW9kLk1vbnRoc106IEV4dGVybmFsRGF0ZVBlcmlvZC5Nb250aHMsXG4gICAgW0ludGVybmFsRGF0ZVN0ZXBQZXJpb2QuV2Vla3NdOiBFeHRlcm5hbERhdGVQZXJpb2QuV2Vla3MsXG4gICAgW0ludGVybmFsRGF0ZVN0ZXBQZXJpb2QuRGF5c106IEV4dGVybmFsRGF0ZVBlcmlvZC5EYXlzLFxuICAgIFtJbnRlcm5hbERhdGVTdGVwUGVyaW9kLkhvdXJzXTogRXh0ZXJuYWxEYXRlUGVyaW9kLkhvdXJzLFxuICAgIFtJbnRlcm5hbERhdGVTdGVwUGVyaW9kLk1pbnV0ZXNdOiBFeHRlcm5hbERhdGVQZXJpb2QuTWludXRlcyxcbiAgICBbSW50ZXJuYWxEYXRlU3RlcFBlcmlvZC5TZWNvbmRzXTogRXh0ZXJuYWxEYXRlUGVyaW9kLlNlY29uZHMsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZGF0ZVJhbmdlVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsRGF0ZVJhbmdlVHlwZSwgRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlPih7XG4gICAgW0ludGVybmFsRGF0ZVJhbmdlVHlwZS5DdXJyZW50XTogRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLkN1cnJlbnQsXG4gICAgW0ludGVybmFsRGF0ZVJhbmdlVHlwZS5MYXN0XTogRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLkxhc3QsXG4gICAgW0ludGVybmFsRGF0ZVJhbmdlVHlwZS5MYXN0Tl06IEV4dGVybmFsRGF0ZVJhbmdlVHlwZS5MYXN0TixcbiAgICBbSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLk5leHRdOiBFeHRlcm5hbERhdGVSYW5nZVR5cGUuTmV4dCxcbiAgICBbSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLk5leHROXTogRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLk5leHROLFxuICAgIFtJbnRlcm5hbERhdGVSYW5nZVR5cGUuVG9EYXRlXTogRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLlRvRGF0ZSxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBlcnJvckNvZGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbEVycm9yQ29kZXMsIEV4dGVybmFsRXJyb3JDb2Rlcz4oXG4gICAge1xuICAgICAgW0ludGVybmFsRXJyb3JDb2Rlcy5JTklUSUFMSVpBVElPTl9FUlJPUl06IEV4dGVybmFsRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLFxuICAgICAgW0ludGVybmFsRXJyb3JDb2Rlcy5JTlRFUk5BTF9FUlJPUl06IEV4dGVybmFsRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLFxuICAgICAgW0ludGVybmFsRXJyb3JDb2Rlcy5NSVNTSU5HX0VOVU1fTUFQUElOR106IEV4dGVybmFsRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLFxuICAgICAgW0ludGVybmFsRXJyb3JDb2Rlcy5NSVNTSU5HX1BBUkFNRVRFUl06IEV4dGVybmFsRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLFxuICAgICAgW0ludGVybmFsRXJyb3JDb2Rlcy5QRVJNSVNTSU9OX0RFTklFRF06IEV4dGVybmFsRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLFxuICAgICAgW0ludGVybmFsRXJyb3JDb2Rlcy5QUkVTX01PREVMX1BBUlNJTkdfRVJST1JdOiBFeHRlcm5hbEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvcixcbiAgICAgIFtJbnRlcm5hbEVycm9yQ29kZXMuVU5LTk9XTl9WRVJCX0lEXTogRXh0ZXJuYWxFcnJvckNvZGVzLkludGVybmFsRXJyb3IsXG4gICAgICBbSW50ZXJuYWxFcnJvckNvZGVzLlZFUlNJT05fTk9UX0NPTkZJR1VSRURdOiBFeHRlcm5hbEVycm9yQ29kZXMuQVBJTm90SW5pdGlhbGl6ZWQsXG4gICAgICBbSW50ZXJuYWxFcnJvckNvZGVzLlZJU0lCSUxJVFlfRVJST1JdOiBFeHRlcm5hbEVycm9yQ29kZXMuVmlzaWJpbGl0eUVycm9yLFxuICAgIH0sXG4gICAgRXh0ZXJuYWxFcnJvckNvZGVzLkludGVybmFsRXJyb3IsXG4gICk7XG5cbiAgcHVibGljIHN0YXRpYyBmaWx0ZXJUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxGaWx0ZXJUeXBlLCBFeHRlcm5hbEZpbHRlclR5cGU+KHtcbiAgICBbSW50ZXJuYWxGaWx0ZXJUeXBlLkNhdGVnb3JpY2FsXTogRXh0ZXJuYWxGaWx0ZXJUeXBlLkNhdGVnb3JpY2FsLFxuICAgIFtJbnRlcm5hbEZpbHRlclR5cGUuUmFuZ2VdOiBFeHRlcm5hbEZpbHRlclR5cGUuUmFuZ2UsXG4gICAgW0ludGVybmFsRmlsdGVyVHlwZS5SZWxhdGl2ZURhdGVdOiBFeHRlcm5hbEZpbHRlclR5cGUuUmVsYXRpdmVEYXRlLFxuICAgIFtJbnRlcm5hbEZpbHRlclR5cGUuSGllcmFyY2hpY2FsXTogRXh0ZXJuYWxGaWx0ZXJUeXBlLkhpZXJhcmNoaWNhbCxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBjbGFzc05hbWVLZXkgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbENsYXNzTmFtZUtleSwgRXh0ZXJuYWxDbGFzc05hbWVLZXk+KHtcbiAgICBbSW50ZXJuYWxDbGFzc05hbWVLZXkuRGFzaGJvYXJkVGl0bGVdOiBFeHRlcm5hbENsYXNzTmFtZUtleS5EYXNoYm9hcmRUaXRsZSxcbiAgICBbSW50ZXJuYWxDbGFzc05hbWVLZXkuU3RvcnlUaXRsZV06IEV4dGVybmFsQ2xhc3NOYW1lS2V5LlN0b3J5VGl0bGUsXG4gICAgW0ludGVybmFsQ2xhc3NOYW1lS2V5LlRvb2x0aXBdOiBFeHRlcm5hbENsYXNzTmFtZUtleS5Ub29sdGlwLFxuICAgIFtJbnRlcm5hbENsYXNzTmFtZUtleS5Xb3Jrc2hlZXRdOiBFeHRlcm5hbENsYXNzTmFtZUtleS5Xb3Jrc2hlZXQsXG4gICAgW0ludGVybmFsQ2xhc3NOYW1lS2V5LldvcmtzaGVldFRpdGxlXTogRXh0ZXJuYWxDbGFzc05hbWVLZXkuV29ya3NoZWV0VGl0bGUsXG4gICAgW0ludGVybmFsQ2xhc3NOYW1lS2V5LlBhbmVdOiBFeHRlcm5hbENsYXNzTmFtZUtleS5QYW5lLFxuICAgIFtJbnRlcm5hbENsYXNzTmFtZUtleS5Sb3dEaXZpZGVyc106IEV4dGVybmFsQ2xhc3NOYW1lS2V5LlJvd0RpdmlkZXJzLFxuICAgIFtJbnRlcm5hbENsYXNzTmFtZUtleS5Db2x1bW5EaXZpZGVyc106IEV4dGVybmFsQ2xhc3NOYW1lS2V5LkNvbHVtbkRpdmlkZXJzLFxuICAgIC8vIFRlbXBvcmFyeSB1bnRpbCB3ZSBmaXggMTMxNzI2NiAtIFBsYXRmb3JtIGhhc24ndCBiZWVuIHVwZGF0ZWQgY3VycmVudGx5IGJlY2F1c2UgbmVhciBicmFuY2ggaXMgY2xvc2VkXG4gICAgWydkYXNoYm9hcmQtdGl0bGUnXTogRXh0ZXJuYWxDbGFzc05hbWVLZXkuRGFzaGJvYXJkVGl0bGUsXG4gICAgWydzdG9yeS10aXRsZSddOiBFeHRlcm5hbENsYXNzTmFtZUtleS5TdG9yeVRpdGxlLFxuICAgIFsndG9vbHRpcCddOiBFeHRlcm5hbENsYXNzTmFtZUtleS5Ub29sdGlwLFxuICAgIFsnd29ya3NoZWV0J106IEV4dGVybmFsQ2xhc3NOYW1lS2V5LldvcmtzaGVldCxcbiAgICBbJ3dvcmtzaGVldC10aXRsZSddOiBFeHRlcm5hbENsYXNzTmFtZUtleS5Xb3Jrc2hlZXRUaXRsZSxcbiAgICBbJ3BhbmUnXTogRXh0ZXJuYWxDbGFzc05hbWVLZXkuUGFuZSxcbiAgICBbJ3Jvdy1kaXZpZGVycyddOiBFeHRlcm5hbENsYXNzTmFtZUtleS5Sb3dEaXZpZGVycyxcbiAgICBbJ2NvbHVtbi1kaXZpZGVycyddOiBFeHRlcm5hbENsYXNzTmFtZUtleS5Db2x1bW5EaXZpZGVycyxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBoaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlID0gbmV3IEVudW1Db252ZXJ0ZXI8XG4gICAgSW50ZXJuYWxIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlLFxuICAgIEV4dGVybmFsSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZVxuICA+KHtcbiAgICBbSW50ZXJuYWxIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlLkFsbFNlbGVjdGVkXTogRXh0ZXJuYWxIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlLkFsbFNlbGVjdGVkLFxuICAgIFtJbnRlcm5hbEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUuTm9uZVNlbGVjdGVkXTogRXh0ZXJuYWxIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlLk5vbmVTZWxlY3RlZCxcbiAgICBbSW50ZXJuYWxIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlLlNvbWVTZWxlY3RlZF06IEV4dGVybmFsSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZS5Tb21lU2VsZWN0ZWQsXG4gICAgW0ludGVybmFsSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZS5Vbmtub3duU2VsZWN0ZWRdOiBFeHRlcm5hbEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUuVW5rbm93blNlbGVjdGVkLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIGFubm90YXRpb25UeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxBbm5vdGF0aW9uVHlwZSwgRXh0ZXJuYWxBbm5vdGF0aW9uVHlwZT4oe1xuICAgIFtJbnRlcm5hbEFubm90YXRpb25UeXBlLkFyZWFdOiBFeHRlcm5hbEFubm90YXRpb25UeXBlLkFyZWEsXG4gICAgW0ludGVybmFsQW5ub3RhdGlvblR5cGUuTWFya106IEV4dGVybmFsQW5ub3RhdGlvblR5cGUuTWFyayxcbiAgICBbSW50ZXJuYWxBbm5vdGF0aW9uVHlwZS5Qb2ludF06IEV4dGVybmFsQW5ub3RhdGlvblR5cGUuUG9pbnQsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgbWFya1R5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbE1hcmtUeXBlLCBFeHRlcm5hbE1hcmtUeXBlPih7XG4gICAgW0ludGVybmFsTWFya1R5cGUuQXJlYV06IEV4dGVybmFsTWFya1R5cGUuQXJlYSxcbiAgICBbSW50ZXJuYWxNYXJrVHlwZS5CYXJdOiBFeHRlcm5hbE1hcmtUeXBlLkJhcixcbiAgICBbSW50ZXJuYWxNYXJrVHlwZS5DaXJjbGVdOiBFeHRlcm5hbE1hcmtUeXBlLkNpcmNsZSxcbiAgICBbSW50ZXJuYWxNYXJrVHlwZS5HYW50dEJhcl06IEV4dGVybmFsTWFya1R5cGUuR2FudHRCYXIsXG4gICAgW0ludGVybmFsTWFya1R5cGUuSGVhdG1hcF06IEV4dGVybmFsTWFya1R5cGUuSGVhdG1hcCxcbiAgICBbSW50ZXJuYWxNYXJrVHlwZS5MaW5lXTogRXh0ZXJuYWxNYXJrVHlwZS5MaW5lLFxuICAgIFtJbnRlcm5hbE1hcmtUeXBlLk1hcF06IEV4dGVybmFsTWFya1R5cGUuTWFwLFxuICAgIFtJbnRlcm5hbE1hcmtUeXBlLlBpZV06IEV4dGVybmFsTWFya1R5cGUuUGllLFxuICAgIFtJbnRlcm5hbE1hcmtUeXBlLlBvbHlnb25dOiBFeHRlcm5hbE1hcmtUeXBlLlBvbHlnb24sXG4gICAgW0ludGVybmFsTWFya1R5cGUuU2hhcGVdOiBFeHRlcm5hbE1hcmtUeXBlLlNoYXBlLFxuICAgIFtJbnRlcm5hbE1hcmtUeXBlLlNxdWFyZV06IEV4dGVybmFsTWFya1R5cGUuU3F1YXJlLFxuICAgIFtJbnRlcm5hbE1hcmtUeXBlLlRleHRdOiBFeHRlcm5hbE1hcmtUeXBlLlRleHQsXG4gICAgW0ludGVybmFsTWFya1R5cGUuVml6RXh0ZW5zaW9uXTogRXh0ZXJuYWxNYXJrVHlwZS5WaXpFeHRlbnNpb24sXG4gIH0pO1xufVxuLyogdHNsaW50OmVuYWJsZTp0eXBlZGVmICovXG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXJyb3JDb2RlcywgVGFibGVhdUV2ZW50VHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBTaW5nbGVFdmVudE1hbmFnZXIgfSBmcm9tICcuL1NpbmdsZUV2ZW50TWFuYWdlcic7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuL1RhYmxlYXVFcnJvcic7XG5cbi8qKlxuICogQ2xhc3MgZGVzaWduZWQgdG8gcmVnaXN0ZXIgYW5kIHVucmVnaXN0ZXIgaGFuZGxlcnMgZnJvbSBhIHVzZXIuIE9ubHkgdGhvc2UgZXZlbnRzXG4gKiB3aGljaCBhcmUgYWRkZWQgdmlhIEFkZE5ld0V2ZW50VHlwZSB3aWxsIGJlIHN1cHBvcnRlZCBieSB0aGlzIGluc3RhbmNlXG4gKi9cbmV4cG9ydCBjbGFzcyBFdmVudExpc3RlbmVyTWFuYWdlciBpbXBsZW1lbnRzIENvbnRyYWN0LkV2ZW50TGlzdGVuZXJNYW5hZ2VyIHtcbiAgcHJpdmF0ZSBfZXZlbnRMaXN0ZW5lck1hbmFnZXJzOiB7IFt0YWJsZWF1RXZlbnRUeXBlOiBzdHJpbmddOiBTaW5nbGVFdmVudE1hbmFnZXIgfTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5fZXZlbnRMaXN0ZW5lck1hbmFnZXJzID0ge307XG4gIH1cblxuICBwdWJsaWMgYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGU6IFRhYmxlYXVFdmVudFR5cGUsIGhhbmRsZXI6IENvbnRyYWN0LlRhYmxlYXVFdmVudEhhbmRsZXJGbik6IENvbnRyYWN0LlRhYmxlYXVFdmVudFVucmVnaXN0ZXJGbiB7XG4gICAgaWYgKCF0aGlzLl9ldmVudExpc3RlbmVyTWFuYWdlcnMuaGFzT3duUHJvcGVydHkoZXZlbnRUeXBlKSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLlVuc3VwcG9ydGVkRXZlbnROYW1lLCBgQ2Fubm90IGFkZCBldmVudCwgdW5zdXBwb3J0ZWQgZXZlbnQgdHlwZTogJHtldmVudFR5cGV9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2V2ZW50TGlzdGVuZXJNYW5hZ2Vyc1tldmVudFR5cGVdLmFkZEV2ZW50TGlzdGVuZXIoaGFuZGxlcik7XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudFR5cGU6IFRhYmxlYXVFdmVudFR5cGUsIGhhbmRsZXI6IENvbnRyYWN0LlRhYmxlYXVFdmVudEhhbmRsZXJGbik6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5fZXZlbnRMaXN0ZW5lck1hbmFnZXJzLmhhc093blByb3BlcnR5KGV2ZW50VHlwZSkpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5VbnN1cHBvcnRlZEV2ZW50TmFtZSwgYENhbm5vdCByZW1vdmUgZXZlbnQsIHVuc3VwcG9ydGVkIGV2ZW50IHR5cGU6ICR7ZXZlbnRUeXBlfWApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9ldmVudExpc3RlbmVyTWFuYWdlcnNbZXZlbnRUeXBlXS5yZW1vdmVFdmVudExpc3RlbmVyKGhhbmRsZXIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFkZE5ld0V2ZW50VHlwZShldmVudE1hbmFnZXI6IFNpbmdsZUV2ZW50TWFuYWdlcik6IHZvaWQge1xuICAgIHRoaXMuX2V2ZW50TGlzdGVuZXJNYW5hZ2Vyc1tldmVudE1hbmFnZXIuZXZlbnRUeXBlXSA9IGV2ZW50TWFuYWdlcjtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IENvbHVtblR5cGUsIERhdGFUeXBlLCBGaWVsZEFnZ3JlZ2F0aW9uVHlwZSwgRmllbGRSb2xlVHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBGaWVsZEltcGwgfSBmcm9tICcuL0ltcGwvRmllbGRJbXBsJztcblxuZXhwb3J0IGNsYXNzIEZpZWxkIGltcGxlbWVudHMgQ29udHJhY3QuRmllbGQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfZmllbGRJbXBsOiBGaWVsZEltcGwpIHt9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW1wbC5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwuaWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRlc2NyaXB0aW9uKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW1wbC5kZXNjcmlwdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGF0YVR5cGUoKTogRGF0YVR5cGUge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwuZGF0YVR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFnZ3JlZ2F0aW9uKCk6IEZpZWxkQWdncmVnYXRpb25UeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbXBsLmFnZ3JlZ2F0aW9uO1xuICB9XG5cbiAgcHVibGljIGdldCBkYXRhU291cmNlKCk6IENvbnRyYWN0LkRhdGFTb3VyY2Uge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwuZGF0YVNvdXJjZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcm9sZSgpOiBGaWVsZFJvbGVUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbXBsLnJvbGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvbHVtblR5cGUoKTogQ29sdW1uVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW1wbC5jb2x1bW5UeXBlO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0NhbGN1bGF0ZWRGaWVsZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbXBsLmlzQ2FsY3VsYXRlZEZpZWxkO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0NvbWJpbmVkRmllbGQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW1wbC5pc0NvbWJpbmVkRmllbGQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzR2VuZXJhdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwuaXNHZW5lcmF0ZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzR2Vvc3BhdGlhbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbXBsLmlzR2Vvc3BhdGlhbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNIaWRkZW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW1wbC5pc0hpZGRlbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNQcmVzZW50T25QdWJsaXNoZWREYXRhc291cmNlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwuaXNQcmVzZW50T25QdWJsaXNoZWREYXRhc291cmNlO1xuICB9XG59XG4iLCJpbXBvcnQgeyBDdXN0b21WaWV3TW9kZWwgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5LCBTZXJ2aWNlTmFtZXMsIFZpelNlcnZpY2UgfSBmcm9tICcuLi8uLi9BcGlTaGFyZWQnO1xuZXhwb3J0IGNsYXNzIEN1c3RvbVZpZXdJbXBsIHtcbiAgcHJpdmF0ZSBfbHVpZDogc3RyaW5nO1xuICBwcml2YXRlIF9uYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgX3NoYXJlZDogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfaXNEZWZhdWx0OiBib29sZWFuO1xuICBwcml2YXRlIF9vd25lck5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSBfdXJsOiBzdHJpbmc7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihjdXN0b21WaWV3TW9kZWw6IEN1c3RvbVZpZXdNb2RlbCwgcHJpdmF0ZSBfcmVnaXN0cnlJZDogbnVtYmVyKSB7XG4gICAgdGhpcy5fbHVpZCA9IGN1c3RvbVZpZXdNb2RlbC5sdWlkO1xuICAgIHRoaXMuX25hbWUgPSBjdXN0b21WaWV3TW9kZWwubmFtZTtcbiAgICB0aGlzLl9zaGFyZWQgPSBjdXN0b21WaWV3TW9kZWwuc2hhcmVkO1xuICAgIHRoaXMuX2lzRGVmYXVsdCA9IGN1c3RvbVZpZXdNb2RlbC5pc0RlZmF1bHQ7XG4gICAgdGhpcy5fb3duZXJOYW1lID0gY3VzdG9tVmlld01vZGVsLm93bmVyLnVzZXJGcmllbmRseU5hbWU7XG4gICAgdGhpcy5fdXJsID0gY3VzdG9tVmlld01vZGVsLnVybDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbHVpZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbHVpZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fbmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgbmFtZShuYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9uYW1lID0gbmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2hhcmVkKCkge1xuICAgIHJldHVybiB0aGlzLl9zaGFyZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IHNoYXJlZChzaGFyZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9zaGFyZWQgPSBzaGFyZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzRGVmYXVsdCgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNEZWZhdWx0O1xuICB9XG5cbiAgcHVibGljIHNldCBpc0RlZmF1bHQoaXNEZWZhdWx0OiBib29sZWFuKSB7XG4gICAgdGhpcy5faXNEZWZhdWx0ID0gaXNEZWZhdWx0O1xuICB9XG5cbiAgcHVibGljIGdldCBvd25lck5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX293bmVyTmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdXJsKCkge1xuICAgIHJldHVybiB0aGlzLl91cmw7XG4gIH1cblxuICBwdWJsaWMgc2F2ZUFzeW5jKCk6IFByb21pc2U8Q3VzdG9tVmlld0ltcGw+IHtcbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFZpelNlcnZpY2U+KFNlcnZpY2VOYW1lcy5WaXopO1xuICAgIHJldHVybiBzZXJ2aWNlLnNhdmVBc3luYyh0aGlzKTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIERhc2hib2FyZExheW91dENoYW5nZSxcbiAgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlRGV0YWlscyxcbiAgRXJyb3JDb2RlcyxcbiAgU2hhcmVkRXJyb3JDb2RlcyxcbiAgU2hlZXRUeXBlLFxufSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkT2JqZWN0VHlwZSwgRGFzaGJvYXJkWm9uZSwgU2hlZXRQYXRoLCBWaXN1YWxJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MgfSBmcm9tICcuLi9FbnVtTWFwcGluZ3MvSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzJztcbmltcG9ydCB7IFBvaW50IH0gZnJvbSAnLi4vUG9pbnQnO1xuaW1wb3J0IHsgQW5pbWF0aW9uU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0FuaW1hdGlvblNlcnZpY2UnO1xuaW1wb3J0IHsgRmlsdGVyU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0ZpbHRlclNlcnZpY2UnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5LCBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgWm9uZVNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9ab25lU2VydmljZSc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgRXJyb3JIZWxwZXJzIH0gZnJvbSAnLi4vVXRpbHMvRXJyb3JIZWxwZXJzJztcbmltcG9ydCB7IERhc2hib2FyZE9iamVjdEltcGwgfSBmcm9tICcuL0Rhc2hib2FyZE9iamVjdEltcGwnO1xuaW1wb3J0IHsgU2hlZXRJbXBsIH0gZnJvbSAnLi9TaGVldEltcGwnO1xuaW1wb3J0IHsgU2hlZXRJbmZvSW1wbCB9IGZyb20gJy4vU2hlZXRJbmZvSW1wbCc7XG5pbXBvcnQgeyBTdG9yeVBvaW50SW1wbCB9IGZyb20gJy4vU3RvcnlQb2ludEltcGwnO1xuaW1wb3J0IHsgV29ya3NoZWV0SW1wbCB9IGZyb20gJy4vV29ya3NoZWV0SW1wbCc7XG5cbmV4cG9ydCBjbGFzcyBEYXNoYm9hcmRJbXBsIGV4dGVuZHMgU2hlZXRJbXBsIHtcbiAgcHJpdmF0ZSBfd29ya3NoZWV0c0ltcGw6IEFycmF5PFdvcmtzaGVldEltcGw+O1xuICBwcml2YXRlIF9vYmplY3RzOiBBcnJheTxEYXNoYm9hcmRPYmplY3RJbXBsPjtcbiAgcHJpdmF0ZSB6b25lTWFwOiBNYXA8bnVtYmVyLCBEYXNoYm9hcmRPYmplY3RJbXBsPjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgX3NoZWV0SW5mbzogU2hlZXRJbmZvSW1wbCxcbiAgICBwcml2YXRlIF96b25lczogQXJyYXk8RGFzaGJvYXJkWm9uZT4sXG4gICAgcHJpdmF0ZSBfc2hlZXRQYXRoOiBTaGVldFBhdGgsXG4gICAgX3JlZ2lzdHJ5SWQ6IG51bWJlcixcbiAgICBwcml2YXRlIF9wYXJlbnRTdG9yeVBvaW50SW1wbDogU3RvcnlQb2ludEltcGwgfCBudWxsLFxuICAgIHByaXZhdGUgX2FjdGl2ZURhc2hib2FyZE9iamVjdElkOiBudW1iZXIgPSAwLFxuICApIHtcbiAgICBzdXBlcihfc2hlZXRJbmZvLCBfcmVnaXN0cnlJZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHdvcmtzaGVldHNJbXBsKCk6IEFycmF5PFdvcmtzaGVldEltcGw+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0c0ltcGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG9iamVjdHMoKTogQXJyYXk8RGFzaGJvYXJkT2JqZWN0SW1wbD4ge1xuICAgIHJldHVybiB0aGlzLl9vYmplY3RzO1xuICB9XG5cbiAgcHVibGljIGdldCBwYXJlbnRTdG9yeVBvaW50KCk6IFN0b3J5UG9pbnRJbXBsIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudFN0b3J5UG9pbnRJbXBsO1xuICB9XG5cbiAgcHVibGljIGdldCBhY3RpdmVEYXNoYm9hcmRPYmplY3RJZCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9hY3RpdmVEYXNoYm9hcmRPYmplY3RJZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWN0aXZlRGFzaGJvYXJkTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zaGVldFBhdGguc2hlZXROYW1lO1xuICB9XG5cbiAgcHVibGljIGluaXRpYWxpemVXaXRoUHVibGljSW50ZXJmYWNlcygpOiB2b2lkIHtcbiAgICB0aGlzLl93b3Jrc2hlZXRzSW1wbCA9IG5ldyBBcnJheTxXb3Jrc2hlZXRJbXBsPigpO1xuICAgIHRoaXMuX29iamVjdHMgPSBuZXcgQXJyYXk8RGFzaGJvYXJkT2JqZWN0SW1wbD4oKTtcbiAgICB0aGlzLnpvbmVNYXAgPSBuZXcgTWFwPG51bWJlciwgRGFzaGJvYXJkT2JqZWN0SW1wbD4oKTtcblxuICAgIC8vIFByb2Nlc3MgYWxsIHRoZSB6b25lcyB3aGljaCBhcmUgY29udGFpbmVkIGluIHRoaXMgZGFzaGJvYXJkXG4gICAgZm9yIChjb25zdCB6b25lIG9mIHRoaXMuX3pvbmVzKSB7XG4gICAgICBsZXQgd29ya3NoZWV0SW1wbDogV29ya3NoZWV0SW1wbCB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAgICAgY29uc3Qgem9uZVNpemU6IENvbnRyYWN0LlNpemUgPSB7IHdpZHRoOiB6b25lLndpZHRoLCBoZWlnaHQ6IHpvbmUuaGVpZ2h0IH07XG4gICAgICAvLyBBcyB0aGUgZGFzaGJvYXJkIGlzIGFjdGl2ZSwgYWxsIG90aGVyIHpvbmVzIGluIHRoZSBkYXNoYm9hcmQgYXJlIGluYWN0aXZlLlxuICAgICAgY29uc3QgaXNBY3RpdmUgPSBmYWxzZTtcblxuICAgICAgaWYgKHpvbmUuem9uZVR5cGUgPT09IERhc2hib2FyZE9iamVjdFR5cGUuV29ya3NoZWV0IHx8IHpvbmUuem9uZVR5cGUgPT09IERhc2hib2FyZE9iamVjdFR5cGUuUXVpY2tGaWx0ZXIpIHtcbiAgICAgICAgbGV0IHdvcmtzaGVldE5hbWUgPSAnJztcbiAgICAgICAgbGV0IHdvcmtzaGVldFVybCA9ICcnO1xuICAgICAgICBsZXQgaXNIaWRkZW4gPSBmYWxzZTtcbiAgICAgICAgaWYgKHpvbmUuc2hlZXRJbmZvKSB7XG4gICAgICAgICAgLy8gem9uZS5zaGVldEluZm8gd2FzIG5vdCBpbml0aWFsaXplZCBwcmlvciB0byBpbnRlcm5hbC1jb250cmFjdCAxLjYuMFxuICAgICAgICAgIHdvcmtzaGVldE5hbWUgPSB6b25lLnNoZWV0SW5mby5uYW1lO1xuXG4gICAgICAgICAgLy8gd29ya3NoZWV0VXJsICYgaXNIaWRkZW4gaXMgZm9yIEVtYmVkZGluZyBvbmx5XG4gICAgICAgICAgd29ya3NoZWV0VXJsID0gem9uZS5zaGVldEluZm8udXJsIHx8ICcnO1xuICAgICAgICAgIC8vIElmIHRoZXJlJ3MgYSB1cmwsIHRoZW4gaXQncyBub3QgaGlkZGVuXG4gICAgICAgICAgaXNIaWRkZW4gPSB3b3Jrc2hlZXRVcmwgPT09ICcnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHdvcmtzaGVldE5hbWUgPSB6b25lLm5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSW5kZXhlcywgaXNBY3RpdmUgYW5kIHNvbWUgbW9yZSBwcm9wZXJ0aWVzIGluIHNoZWV0SW5mb0ltcGwgYXJlIGVtYmVkZGluZyBzcGVjaWZpYy5cbiAgICAgICAgLy8gQnV0IHdlIGluaXQgdGhlbSBmb3IgYm90aCBleHRlbnNpb25zIGFuZCBlbWJlZGRpbmcgYXMgdGhlIE1vZGVscyB3aWxsIG9ubHkgdXNlIHdoYXQgaXMgcmVsZXZhbnQuXG4gICAgICAgIGNvbnN0IHNoZWV0SW5mb0ltcGwgPSBuZXcgU2hlZXRJbmZvSW1wbChcbiAgICAgICAgICB3b3Jrc2hlZXROYW1lLFxuICAgICAgICAgIFNoZWV0VHlwZS5Xb3Jrc2hlZXQsXG4gICAgICAgICAgem9uZVNpemUsXG4gICAgICAgICAgdGhpcy5fd29ya3NoZWV0c0ltcGwubGVuZ3RoLFxuICAgICAgICAgIGlzQWN0aXZlLFxuICAgICAgICAgIGlzSGlkZGVuLFxuICAgICAgICAgIHdvcmtzaGVldFVybCxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCB2aXpJZDogVmlzdWFsSWQgPSB7XG4gICAgICAgICAgd29ya3NoZWV0OiB3b3Jrc2hlZXROYW1lLFxuICAgICAgICAgIGRhc2hib2FyZDogdGhpcy5fc2hlZXRJbmZvSW1wbC5uYW1lLFxuICAgICAgICAgIHN0b3J5Ym9hcmQ6IHRoaXMuX3NoZWV0UGF0aC5zdG9yeWJvYXJkLFxuICAgICAgICAgIGZsaXBib2FyZFpvbmVJRDogdGhpcy5fc2hlZXRQYXRoLmZsaXBib2FyZFpvbmVJRCxcbiAgICAgICAgICBzdG9yeVBvaW50SUQ6IHRoaXMuX3NoZWV0UGF0aC5zdG9yeVBvaW50SUQsXG4gICAgICAgIH07XG5cbiAgICAgICAgd29ya3NoZWV0SW1wbCA9IG5ldyBXb3Jrc2hlZXRJbXBsKHNoZWV0SW5mb0ltcGwsIHRoaXMuX3JlZ2lzdHJ5SWQsIHZpeklkLCB0aGlzLCB0aGlzLl9wYXJlbnRTdG9yeVBvaW50SW1wbCk7XG4gICAgICAgIGlmICh6b25lLnpvbmVUeXBlID09PSBEYXNoYm9hcmRPYmplY3RUeXBlLldvcmtzaGVldCkge1xuICAgICAgICAgIHRoaXMuX3dvcmtzaGVldHNJbXBsLnB1c2god29ya3NoZWV0SW1wbCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3Qgem9uZVBvaW50ID0gbmV3IFBvaW50KHpvbmUueCwgem9uZS55KTtcblxuICAgICAgY29uc3QgZGFzaGJvYXJkT2JqZWN0SW1wbCA9IG5ldyBEYXNoYm9hcmRPYmplY3RJbXBsKFxuICAgICAgICB0aGlzLFxuICAgICAgICBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MuZGFzaGJvYXJkT2JqZWN0VHlwZS5jb252ZXJ0KHpvbmUuem9uZVR5cGUpLFxuICAgICAgICB6b25lUG9pbnQsXG4gICAgICAgIHpvbmVTaXplLFxuICAgICAgICB3b3Jrc2hlZXRJbXBsLFxuICAgICAgICB6b25lLm5hbWUsXG4gICAgICAgIHpvbmUuaXNGbG9hdGluZyAhPT0gdW5kZWZpbmVkID8gem9uZS5pc0Zsb2F0aW5nIDogZmFsc2UsIC8vIGJlZm9yZSAxLjYuMCB3ZSBkaWRuJ3QgaGF2ZSBpc0Zsb2F0aW5nLCBzbyB3ZSBhc3N1bWUgZmFsc2VcbiAgICAgICAgem9uZS5pc1Zpc2libGUgIT09IHVuZGVmaW5lZCA/IHpvbmUuaXNWaXNpYmxlIDogdHJ1ZSwgLy8gYmVmb3JlIDEuNi4wIHdlIGRpZG4ndCBoYXZlIGlzVmlzaWJsZSwgc28gd2UgYXNzdW1lIHRydWVcbiAgICAgICAgem9uZS56b25lSWQsXG4gICAgICAgIHpvbmUuZmllbGRJZCxcbiAgICAgICk7XG5cbiAgICAgIHRoaXMuX29iamVjdHMucHVzaChkYXNoYm9hcmRPYmplY3RJbXBsKTtcbiAgICAgIHRoaXMuem9uZU1hcC5zZXQoem9uZS56b25lSWQsIGRhc2hib2FyZE9iamVjdEltcGwpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXREYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5QXN5bmMoZGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eU1hcDogQ29udHJhY3QuRGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eU1hcCB8IG9iamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHpvbmVTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFpvbmVTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuWm9uZSk7XG5cbiAgICByZXR1cm4gem9uZVNlcnZpY2Uuc2V0VmlzaWJpbGl0eUFzeW5jKC8qRGFzaGJvYXJkIE5hbWUqLyB0aGlzLm5hbWUsIHRoaXMuem9uZU1hcCwgZGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eU1hcCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RGFzaGJvYXJkT2JqZWN0QnlJZChkYXNoYm9hcmRPYmplY3RJZDogbnVtYmVyKTogRGFzaGJvYXJkT2JqZWN0SW1wbCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuem9uZU1hcC5nZXQoZGFzaGJvYXJkT2JqZWN0SWQpO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZVpvbmVzKG5ld1pvbmVzOiBBcnJheTxEYXNoYm9hcmRab25lPiwgbmV3QWN0aXZlWm9uZUlkID0gMCwgbmV3QWN0aXZlRGFzaGJvYXJkTmFtZSA9ICcnKTogRGFzaGJvYXJkTGF5b3V0Q2hhbmdlRGV0YWlscyB7XG4gICAgLy8gZ2V0dGluZyBwcmV2aW91cyBkYXNoYm9hcmQgb2JqZWN0cywgYWN0aXZlIHpvbmUgSUQgYW5kIGFjdGl2ZSBkYXNoYm9hcmQgbmFtZVxuICAgIGNvbnN0IG9sZERhc2hib2FyZE9iamVjdHMgPSB0aGlzLl9vYmplY3RzO1xuICAgIGNvbnN0IG9sZFpvbmVNYXAgPSB0aGlzLnpvbmVNYXA7XG4gICAgY29uc3Qgb2xkQWN0aXZlWm9uZUlkID0gdGhpcy5fYWN0aXZlRGFzaGJvYXJkT2JqZWN0SWQ7XG4gICAgY29uc3Qgb2xkQWN0aXZlRGFzaGJvYXJkTmFtZSA9IHRoaXMuX3NoZWV0UGF0aC5zaGVldE5hbWU7XG4gICAgLy8gdXBkYXRpbmcgem9uZXMgYW5kIHJlaW5pdGlhbGl6aW5nIGluc3RhbmNlIHZhcmlhYmxlc1xuICAgIHRoaXMuX3pvbmVzID0gbmV3Wm9uZXM7XG4gICAgdGhpcy5fYWN0aXZlRGFzaGJvYXJkT2JqZWN0SWQgPSBuZXdBY3RpdmVab25lSWQ7XG4gICAgaWYgKG5ld0FjdGl2ZURhc2hib2FyZE5hbWUpIHtcbiAgICAgIHRoaXMuX3NoZWV0UGF0aC5zaGVldE5hbWUgPSBuZXdBY3RpdmVEYXNoYm9hcmROYW1lO1xuICAgICAgdGhpcy5fc2hlZXRJbmZvSW1wbC5uYW1lID0gbmV3QWN0aXZlRGFzaGJvYXJkTmFtZTtcbiAgICB9XG4gICAgdGhpcy5pbml0aWFsaXplV2l0aFB1YmxpY0ludGVyZmFjZXMoKTtcbiAgICAvLyBnZXR0aW5nIG5ldyBkYXNoYm9hcmQgb2JqZWN0c1xuICAgIGNvbnN0IG5ld0Rhc2hib2FyZE9iamVjdHMgPSB0aGlzLl9vYmplY3RzO1xuICAgIGNvbnN0IG5ld1pvbmVNYXAgPSB0aGlzLnpvbmVNYXA7XG4gICAgLy8gaW5pdGlhbGl6aW5nIG1hcCBmb3IgY2hhbmdlc1xuICAgIGNvbnN0IHpvbmVDaGFuZ2VzOiBEYXNoYm9hcmRMYXlvdXRDaGFuZ2VEZXRhaWxzID0gbmV3IE1hcCgpO1xuXG4gICAgLy8gY29tcGFyaW5nIG9sZCBkYXNoYm9hcmQgb2JqZWN0cyB3aXRoIG5ldyBvbmVzXG4gICAgb2xkRGFzaGJvYXJkT2JqZWN0cy5mb3JFYWNoKChvbGRPYmplY3QpID0+IHtcbiAgICAgIGNvbnN0IG9sZElkOiBudW1iZXIgPSBvbGRPYmplY3QuaWQ7XG5cbiAgICAgIC8vIGNoZWNraW5nIGlmIHpvbmUgd2FzIHJlbW92ZWRcbiAgICAgIGlmICghbmV3Wm9uZU1hcC5oYXMob2xkSWQpKSB7XG4gICAgICAgIHRoaXMuYWRkQ2hhbmdlKG9sZElkLCB6b25lQ2hhbmdlcywgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlLlJlbW92ZWQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5ld09iamVjdCA9IG5ld1pvbmVNYXAuZ2V0KG9sZElkKTtcbiAgICAgIGlmIChvbGRPYmplY3QuaXNGbG9hdGluZyAhPT0gbmV3T2JqZWN0IS5pc0Zsb2F0aW5nKSB7XG4gICAgICAgIHRoaXMuYWRkQ2hhbmdlKG9sZElkLCB6b25lQ2hhbmdlcywgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlLklzRmxvYXRpbmdDaGFuZ2VkKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9sZE9iamVjdC5pc1Zpc2libGUgIT09IG5ld09iamVjdCEuaXNWaXNpYmxlKSB7XG4gICAgICAgIHRoaXMuYWRkQ2hhbmdlKG9sZElkLCB6b25lQ2hhbmdlcywgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlLklzVmlzaWJsZUNoYW5nZWQpO1xuICAgICAgfVxuXG4gICAgICBpZiAob2xkT2JqZWN0Lm5hbWUgIT09IG5ld09iamVjdCEubmFtZSkge1xuICAgICAgICB0aGlzLmFkZENoYW5nZShvbGRJZCwgem9uZUNoYW5nZXMsIERhc2hib2FyZExheW91dENoYW5nZS5OYW1lQ2hhbmdlZCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvbGRPYmplY3QucG9zaXRpb24ueCAhPT0gbmV3T2JqZWN0IS5wb3NpdGlvbi54IHx8IG9sZE9iamVjdC5wb3NpdGlvbi55ICE9PSBuZXdPYmplY3QhLnBvc2l0aW9uLnkpIHtcbiAgICAgICAgdGhpcy5hZGRDaGFuZ2Uob2xkSWQsIHpvbmVDaGFuZ2VzLCBEYXNoYm9hcmRMYXlvdXRDaGFuZ2UuUG9zaXRpb25DaGFuZ2VkKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9sZE9iamVjdC5zaXplLndpZHRoICE9PSBuZXdPYmplY3QhLnNpemUud2lkdGggfHwgb2xkT2JqZWN0LnNpemUuaGVpZ2h0ICE9PSBuZXdPYmplY3QhLnNpemUuaGVpZ2h0KSB7XG4gICAgICAgIHRoaXMuYWRkQ2hhbmdlKG9sZElkLCB6b25lQ2hhbmdlcywgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlLlNpemVDaGFuZ2VkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIENoZWNraW5nIGZvciBhbnkgYWRkZWQgem9uZXNcbiAgICBuZXdEYXNoYm9hcmRPYmplY3RzLmZvckVhY2goKG5ld09iamVjdCkgPT4ge1xuICAgICAgaWYgKCFvbGRab25lTWFwLmhhcyhuZXdPYmplY3QuaWQpKSB7XG4gICAgICAgIHRoaXMuYWRkQ2hhbmdlKG5ld09iamVjdC5pZCwgem9uZUNoYW5nZXMsIERhc2hib2FyZExheW91dENoYW5nZS5BZGRlZCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBDaGVja2luZyBpZiB6b25lIHNlbGVjdGlvbiBoYXMgY2hhbmdlZFxuICAgIGlmIChvbGRBY3RpdmVab25lSWQgIT09IG5ld0FjdGl2ZVpvbmVJZCkge1xuICAgICAgaWYgKG5ld0FjdGl2ZVpvbmVJZCAhPT0gMCkge1xuICAgICAgICB0aGlzLmFkZENoYW5nZShuZXdBY3RpdmVab25lSWQsIHpvbmVDaGFuZ2VzLCBEYXNoYm9hcmRMYXlvdXRDaGFuZ2UuU2VsZWN0ZWQpO1xuICAgICAgfVxuICAgICAgaWYgKG9sZEFjdGl2ZVpvbmVJZCAhPT0gMCkge1xuICAgICAgICB0aGlzLmFkZENoYW5nZShvbGRBY3RpdmVab25lSWQsIHpvbmVDaGFuZ2VzLCBEYXNoYm9hcmRMYXlvdXRDaGFuZ2UuRGVzZWxlY3RlZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hlY2tpbmcgaWYgc3dpdGNoZWQgdG8gYW5vdGhlciBkYXNoYm9hcmRcbiAgICBpZiAobmV3QWN0aXZlRGFzaGJvYXJkTmFtZSAmJiBvbGRBY3RpdmVEYXNoYm9hcmROYW1lICE9PSBuZXdBY3RpdmVEYXNoYm9hcmROYW1lKSB7XG4gICAgICB0aGlzLmFkZENoYW5nZSgwLCB6b25lQ2hhbmdlcywgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlLkRhc2hib2FyZENoYW5nZWQpO1xuICAgIH1cblxuICAgIHJldHVybiB6b25lQ2hhbmdlcztcbiAgfVxuXG4gIHByaXZhdGUgYWRkQ2hhbmdlKHpvbmVJZDogbnVtYmVyLCB6b25lQ2hhbmdlczogRGFzaGJvYXJkTGF5b3V0Q2hhbmdlRGV0YWlscywgY2hhbmdlOiBEYXNoYm9hcmRMYXlvdXRDaGFuZ2UpOiB2b2lkIHtcbiAgICBpZiAoIXpvbmVDaGFuZ2VzLmhhcyh6b25lSWQpKSB7XG4gICAgICB6b25lQ2hhbmdlcy5zZXQoem9uZUlkLCBbXSk7XG4gICAgfVxuXG4gICAgem9uZUNoYW5nZXMuZ2V0KHpvbmVJZCkhLnB1c2goY2hhbmdlKTtcbiAgfVxuXG4gIHB1YmxpYyBtb3ZlQW5kUmVzaXplRGFzaGJvYXJkT2JqZWN0c0FzeW5jKFxuICAgIGRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUFycmF5OiBDb250cmFjdC5EYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGVBcnJheSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgem9uZVNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8Wm9uZVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5ab25lKTtcblxuICAgIHJldHVybiB6b25lU2VydmljZS5tb3ZlQW5kUmVzaXplQXN5bmMoLypEYXNoYm9hcmQgTmFtZSovIHRoaXMubmFtZSwgdGhpcy56b25lTWFwLCBkYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGVBcnJheSk7XG4gIH1cblxuICBwdWJsaWMgcmVwbGF5QW5pbWF0aW9uQXN5bmMocmVwbGF5U3BlZWQ6IENvbnRyYWN0LlJlcGxheVNwZWVkVHlwZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGFuaW1hdGlvblNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8QW5pbWF0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLkFuaW1hdGlvbik7XG5cbiAgICByZXR1cm4gYW5pbWF0aW9uU2VydmljZS5yZXBsYXlBc3luYyhyZXBsYXlTcGVlZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RmlsdGVyc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuRmlsdGVyPj4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXRPckVtYmVkZGVkSW5BY3RpdmVTdG9yeVBvaW50KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEZpbHRlclNlcnZpY2U+KFNlcnZpY2VOYW1lcy5GaWx0ZXIpO1xuICAgIHJldHVybiBzZXJ2aWNlLmdldERhc2hib2FyZEZpbHRlcnNBc3luYygpO1xuICB9XG5cbiAgcHVibGljIGFwcGx5RmlsdGVyQXN5bmMoXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgdmFsdWVzOiBBcnJheTxzdHJpbmc+LFxuICAgIHVwZGF0ZVR5cGU6IENvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGUsXG4gICAgb3B0aW9uczogQ29udHJhY3QuRmlsdGVyT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPENvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGU+KHVwZGF0ZVR5cGUsIENvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGUsICdGaWx0ZXJVcGRhdGVUeXBlJyk7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVN0cmluZ1BhcmFtZXRlcihmaWVsZE5hbWUsICdmaWVsZE5hbWUnKTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWVzKSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsICd2YWx1ZXMgcGFyYW1ldGVyIGZvciBhcHBseURhc2hib2FyZEZpbHRlckFzeW5jIG11c3QgYmUgYW4gYXJyYXknKTtcbiAgICB9XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldE9yRW1iZWRkZWRJbkFjdGl2ZVN0b3J5UG9pbnQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RmlsdGVyU2VydmljZT4oU2VydmljZU5hbWVzLkZpbHRlcik7XG4gICAgcmV0dXJuIHNlcnZpY2UuYXBwbHlEYXNoYm9hcmRGaWx0ZXJBc3luYyhmaWVsZE5hbWUsIHZhbHVlcywgdXBkYXRlVHlwZSwgb3B0aW9ucyk7XG4gIH1cblxuICAvLyBAVy0xMjk4NjQzOTogcmVtb3ZlIG9uY2UgaW5pdGlhbGl6ZVdpdGhQdWJsaWNJbnRlcmZhY2VzIGlzIG1vdmVkIHRvIHRoZSBjb25zdHJ1Y3RvciBmb3IgdGhpcyBjbGFzc1xuICAvLyBUaGlzIG1ldGhvZCBvbmx5IGV4aXN0cyBzaW5jZSB3b3Jrc2hlZXRzSW1wbCBjYW4gYmUgdW5kZWZpbmVkLCBidXQgd2UgbmVlZCB0aGUgd29ya3NoZWV0IG5hbWVzIGluIHRoZSBFeHBvcnQgQVBJc1xuICBwdWJsaWMgZ2V0V29ya3NoZWV0TmFtZXNGcm9tWm9uZXMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgY29uc3Qgd29ya3NoZWV0TmFtZXM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCB6b25lIG9mIHRoaXMuX3pvbmVzKSB7XG4gICAgICBpZiAoem9uZS56b25lVHlwZSAhPT0gRGFzaGJvYXJkT2JqZWN0VHlwZS5Xb3Jrc2hlZXQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAvLyB6b25lLnNoZWV0SW5mbyB3YXMgbm90IGluaXRpYWxpemVkIHByaW9yIHRvIGludGVybmFsLWNvbnRyYWN0IDEuNi4wXG4gICAgICBjb25zdCB3b3Jrc2hlZXROYW1lID0gem9uZS5zaGVldEluZm8gPyB6b25lLnNoZWV0SW5mby5uYW1lIDogem9uZS5uYW1lO1xuICAgICAgd29ya3NoZWV0TmFtZXMucHVzaCh3b3Jrc2hlZXROYW1lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gd29ya3NoZWV0TmFtZXM7XG4gIH1cblxuICBwcml2YXRlIHZlcmlmeUFjdGl2ZVNoZWV0T3JFbWJlZGRlZEluQWN0aXZlU3RvcnlQb2ludCgpIHtcbiAgICBjb25zdCBpc1Jvb3RBbmRBY3RpdmVEYXNoYm9hcmQgPSB0aGlzLmFjdGl2ZTtcbiAgICBjb25zdCBpc1dpdGhpbkFjdGl2ZVN0b3J5UG9pbnQgPSB0aGlzLnBhcmVudFN0b3J5UG9pbnQgIT0gbnVsbCAmJiB0aGlzLnBhcmVudFN0b3J5UG9pbnQuYWN0aXZlO1xuICAgIGlmICghaXNSb290QW5kQWN0aXZlRGFzaGJvYXJkICYmICFpc1dpdGhpbkFjdGl2ZVN0b3J5UG9pbnQpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5Ob3RBY3RpdmVTaGVldCwgJ09wZXJhdGlvbiBub3QgYWxsb3dlZCBvbiBub24tYWN0aXZlIHNoZWV0Jyk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkT2JqZWN0VHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRJbXBsIH0gZnJvbSAnLi9EYXNoYm9hcmRJbXBsJztcbmltcG9ydCB7IFdvcmtzaGVldEltcGwgfSBmcm9tICcuL1dvcmtzaGVldEltcGwnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBkYXNoYm9hcmQgb2JqZWN0cyAtIHRoZSB6b25lcyBpbiBhIGRhc2hib2FyZC5cbiAqIFRoaXMgZG9lcyBub3QgZm9sbG93IHRoZSBJbXBsIHBhdHRlcm4gYXMgaXQgaXMganVzdCBhIHByb3BlcnR5IGJhZy5cbiAqL1xuZXhwb3J0IGNsYXNzIERhc2hib2FyZE9iamVjdEltcGwge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfZGFzaGJvYXJkSW1wbDogRGFzaGJvYXJkSW1wbCxcbiAgICBwcml2YXRlIF90eXBlOiBEYXNoYm9hcmRPYmplY3RUeXBlLFxuICAgIHByaXZhdGUgX3Bvc2l0aW9uOiBDb250cmFjdC5Qb2ludCxcbiAgICBwcml2YXRlIF9zaXplOiBDb250cmFjdC5TaXplLFxuICAgIHByaXZhdGUgX3dvcmtzaGVldEltcGw6IFdvcmtzaGVldEltcGwgfCB1bmRlZmluZWQsXG4gICAgcHJpdmF0ZSBfbmFtZTogc3RyaW5nLFxuICAgIHByaXZhdGUgX2lzRmxvYXRpbmc6IGJvb2xlYW4sXG4gICAgcHJpdmF0ZSBfaXNWaXNpYmxlOiBib29sZWFuLFxuICAgIHByaXZhdGUgX2lkOiBudW1iZXIsXG4gICAgcHJpdmF0ZSBfZmllbGRJZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICApIHt9XG5cbiAgcHVibGljIGdldCBkYXNoYm9hcmRJbXBsKCk6IERhc2hib2FyZEltcGwge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRJbXBsO1xuICB9XG5cbiAgcHVibGljIGdldCB0eXBlKCk6IERhc2hib2FyZE9iamVjdFR5cGUge1xuICAgIHJldHVybiB0aGlzLl90eXBlO1xuICB9XG5cbiAgcHVibGljIGdldCBwb3NpdGlvbigpOiBDb250cmFjdC5Qb2ludCB7XG4gICAgcmV0dXJuIHRoaXMuX3Bvc2l0aW9uO1xuICB9XG5cbiAgcHVibGljIGdldCBzaXplKCk6IENvbnRyYWN0LlNpemUge1xuICAgIHJldHVybiB0aGlzLl9zaXplO1xuICB9XG5cbiAgcHVibGljIGdldCB3b3Jrc2hlZXRJbXBsKCk6IFdvcmtzaGVldEltcGwgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsO1xuICB9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX25hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzRmxvYXRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzRmxvYXRpbmc7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzVmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNWaXNpYmxlO1xuICB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9pZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmllbGRJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9maWVsZElkO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0ICogYXMgSW50ZXJuYWxDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQ29ubmVjdGlvblN1bW1hcnkgfSBmcm9tICcuLi9Db25uZWN0aW9uU3VtbWFyeSc7XG5pbXBvcnQgeyBGaWVsZCB9IGZyb20gJy4uL0ZpZWxkJztcbmltcG9ydCB7IExvZ2ljYWxUYWJsZSB9IGZyb20gJy4uL0xvZ2ljYWxUYWJsZSc7XG5pbXBvcnQgeyBEYXRhU291cmNlU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0RhdGFTb3VyY2VTZXJ2aWNlJztcbmltcG9ydCB7IEdldERhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvR2V0RGF0YVNlcnZpY2UnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5LCBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgVGFibGVTdW1tYXJ5IH0gZnJvbSAnLi4vVGFibGVTdW1tYXJ5JztcbmltcG9ydCB7IEVycm9ySGVscGVycyB9IGZyb20gJy4uL1V0aWxzL0Vycm9ySGVscGVycyc7XG5pbXBvcnQgeyBGaWVsZEltcGwgfSBmcm9tICcuL0ZpZWxkSW1wbCc7XG5cbmV4cG9ydCBjbGFzcyBEYXRhU291cmNlSW1wbCB7XG4gIHByaXZhdGUgX2ZpZWxkczogQXJyYXk8RmllbGQ+O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9kYXRhU291cmNlSW5mbzogSW50ZXJuYWxDb250cmFjdC5EYXRhU291cmNlLCBwcml2YXRlIF9yZWdpc3RyeUlkOiBudW1iZXIpIHtcbiAgICB0aGlzLl9maWVsZHMgPSBfZGF0YVNvdXJjZUluZm8uZmllbGRzLm1hcCgoZmllbGRNb2RlbCkgPT4ge1xuICAgICAgY29uc3QgZmllbGRJbXBsID0gbmV3IEZpZWxkSW1wbChmaWVsZE1vZGVsLCB0aGlzKTtcbiAgICAgIHJldHVybiBuZXcgRmllbGQoZmllbGRJbXBsKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW5mby5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW5mby5pZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZXh0cmFjdFVwZGF0ZVRpbWUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUluZm8uZXh0cmFjdFVwZGF0ZVRpbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZpZWxkcygpOiBBcnJheTxDb250cmFjdC5GaWVsZD4ge1xuICAgIHJldHVybiB0aGlzLl9maWVsZHM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzRXh0cmFjdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUluZm8uaXNFeHRyYWN0O1xuICB9XG5cbiAgcHVibGljIGdldCBpc1B1Ymxpc2hlZCgpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUluZm8uaXNQdWJsaXNoZWQ7XG4gIH1cblxuICBwdWJsaWMgcHVibGlzaGVkVXJsKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbmZvLnB1Ymxpc2hlZFVybDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRNYXhQYWdlUm93TGltaXQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gMTAwMDA7XG4gIH1cblxuICBwdWJsaWMgcmVmcmVzaEFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGRhdGFTb3VyY2VTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPERhdGFTb3VyY2VTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRGF0YVNvdXJjZVNlcnZpY2UpO1xuXG4gICAgcmV0dXJuIGRhdGFTb3VyY2VTZXJ2aWNlLnJlZnJlc2hBc3luYyh0aGlzLl9kYXRhU291cmNlSW5mby5pZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29ubmVjdGlvblN1bW1hcmllc0FzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuQ29ubmVjdGlvblN1bW1hcnlbXT4ge1xuICAgIGNvbnN0IGRhdGFTb3VyY2VTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPERhdGFTb3VyY2VTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRGF0YVNvdXJjZVNlcnZpY2UpO1xuXG4gICAgcmV0dXJuIGRhdGFTb3VyY2VTZXJ2aWNlLmdldENvbm5lY3Rpb25TdW1tYXJpZXNBc3luYyh0aGlzLl9kYXRhU291cmNlSW5mby5pZCkudGhlbjxDb250cmFjdC5Db25uZWN0aW9uU3VtbWFyeVtdPigoc3VtbWFyaWVzKSA9PiB7XG4gICAgICByZXR1cm4gc3VtbWFyaWVzLm1hcCgoc3VtbWFyeSkgPT4gbmV3IENvbm5lY3Rpb25TdW1tYXJ5KHN1bW1hcnkpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBY3RpdmVUYWJsZXNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LlRhYmxlU3VtbWFyeT4+IHtcbiAgICBjb25zdCBkYXRhU291cmNlU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxEYXRhU291cmNlU2VydmljZT4oU2VydmljZU5hbWVzLkRhdGFTb3VyY2VTZXJ2aWNlKTtcblxuICAgIHJldHVybiBkYXRhU291cmNlU2VydmljZS5nZXRBY3RpdmVUYWJsZXNBc3luYyh0aGlzLl9kYXRhU291cmNlSW5mby5pZCkudGhlbjxBcnJheTxDb250cmFjdC5UYWJsZVN1bW1hcnk+PigodGFibGVJbmZvcykgPT4ge1xuICAgICAgcmV0dXJuIHRhYmxlSW5mb3MubWFwKCh0YWJsZUluZm8pID0+IG5ldyBUYWJsZVN1bW1hcnkodGFibGVJbmZvKSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ0RhdGFBc3luYyhvcHRpb25zPzogQ29udHJhY3QuRGF0YVNvdXJjZVVuZGVybHlpbmdEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgY29uc3QgZ2V0RGF0YVNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8R2V0RGF0YVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5HZXREYXRhKTtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIHJldHVybiBnZXREYXRhU2VydmljZS5nZXREYXRhU291cmNlRGF0YUFzeW5jKFxuICAgICAgdGhpcy5pZCxcbiAgICAgICEhb3B0aW9ucy5pZ25vcmVBbGlhc2VzLFxuICAgICAgb3B0aW9ucy5tYXhSb3dzIHx8IDAsIC8vIDAgYW5kIFtdIGFyZSBkZWZhdWx0c1xuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlIHx8IFtdLFxuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlQnlJZCB8fCBbXSxcbiAgICAgIG9wdGlvbnMuaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gfHwgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uQWxsVmFsdWVzLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TG9naWNhbFRhYmxlRGF0YUFzeW5jKGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsIG9wdGlvbnM/OiBDb250cmFjdC5EYXRhU291cmNlVW5kZXJseWluZ0RhdGFPcHRpb25zKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+IHtcbiAgICBjb25zdCBnZXREYXRhU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgcmV0dXJuIGdldERhdGFTZXJ2aWNlLmdldExvZ2ljYWxUYWJsZURhdGFBc3luYyhcbiAgICAgIHRoaXMuaWQsXG4gICAgICBsb2dpY2FsVGFibGVJZCxcbiAgICAgICEhb3B0aW9ucy5pZ25vcmVBbGlhc2VzLFxuICAgICAgb3B0aW9ucy5tYXhSb3dzIHx8IDAsIC8vIDAgYW5kIFtdIGFyZSBkZWZhdWx0c1xuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlIHx8IFtdLFxuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlQnlJZCB8fCBbXSxcbiAgICAgIG9wdGlvbnMuaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gfHwgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uQWxsVmFsdWVzLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TG9naWNhbFRhYmxlRGF0YVJlYWRlckFzeW5jKFxuICAgIGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsXG4gICAgcGFnZVJvd0NvdW50PzogbnVtYmVyLFxuICAgIG9wdGlvbnM/OiBDb250cmFjdC5EYXRhU291cmNlVW5kZXJseWluZ0RhdGFPcHRpb25zLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZVJlYWRlcj4ge1xuICAgIGNvbnN0IGdldERhdGFTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEdldERhdGFTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuR2V0RGF0YSk7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICByZXR1cm4gZ2V0RGF0YVNlcnZpY2UuZ2V0TG9naWNhbFRhYmxlRGF0YVJlYWRlckFzeW5jKFxuICAgICAgdGhpcy5pZCxcbiAgICAgIGxvZ2ljYWxUYWJsZUlkLFxuICAgICAgcGFnZVJvd0NvdW50IHx8IHRoaXMuZ2V0TWF4UGFnZVJvd0xpbWl0KCksXG4gICAgICAhIW9wdGlvbnMuaWdub3JlQWxpYXNlcyxcbiAgICAgIG9wdGlvbnMuY29sdW1uc1RvSW5jbHVkZUJ5SWQgfHwgW10sXG4gICAgICBvcHRpb25zLmluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uIHx8IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLkFsbFZhbHVlcyxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGluaXRpYWxpemVXaXRoUHVibGljSW50ZXJmYWNlcyhkYXRhU291cmNlOiBDb250cmFjdC5EYXRhU291cmNlKTogdm9pZCB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUludGVybmFsVmFsdWUoZGF0YVNvdXJjZSwgJ2RhdGFTb3VyY2UnKTtcblxuICAgIHRoaXMuX2ZpZWxkcyA9IHRoaXMuX2RhdGFTb3VyY2VJbmZvLmZpZWxkcy5tYXAoKGZpZWxkTW9kZWwpID0+IHtcbiAgICAgIGNvbnN0IGZpZWxkSW1wbCA9IG5ldyBGaWVsZEltcGwoZmllbGRNb2RlbCwgZGF0YVNvdXJjZSk7XG4gICAgICByZXR1cm4gbmV3IEZpZWxkKGZpZWxkSW1wbCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TG9naWNhbFRhYmxlc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuTG9naWNhbFRhYmxlPj4ge1xuICAgIGNvbnN0IGRhdGFTb3VyY2VTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPERhdGFTb3VyY2VTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRGF0YVNvdXJjZVNlcnZpY2UpO1xuXG4gICAgcmV0dXJuIGRhdGFTb3VyY2VTZXJ2aWNlLmdldExvZ2ljYWxUYWJsZXNBc3luYyh0aGlzLmlkKS50aGVuPEFycmF5PENvbnRyYWN0LkxvZ2ljYWxUYWJsZT4+KChsb2dpY2FsVGFibGVJbmZvcykgPT4ge1xuICAgICAgcmV0dXJuIGxvZ2ljYWxUYWJsZUluZm9zLm1hcCgobG9naWNhbFRhYmxlSW5mbykgPT4gbmV3IExvZ2ljYWxUYWJsZShsb2dpY2FsVGFibGVJbmZvKSk7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgKiBhcyBJbnRlcm5hbENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MgfSBmcm9tICcuLi9FbnVtTWFwcGluZ3MvSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzJztcblxuZXhwb3J0IGNsYXNzIEZpZWxkSW1wbCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9maWVsZEluZm86IEludGVybmFsQ29udHJhY3QuRmllbGQsIHByaXZhdGUgX3BhcmVudERhdGFTb3VyY2U/OiBDb250cmFjdC5EYXRhU291cmNlKSB7fVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEluZm8ubmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbmZvLmlkO1xuICB9XG5cbiAgcHVibGljIGdldCBkZXNjcmlwdGlvbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEluZm8uZGVzY3JpcHRpb247XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRhdGFUeXBlKCk6IENvbnRyYWN0LkRhdGFUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbmZvLmRhdGFUeXBlID8/IENvbnRyYWN0LkRhdGFUeXBlLlVua25vd247XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFnZ3JlZ2F0aW9uKCk6IENvbnRyYWN0LkZpZWxkQWdncmVnYXRpb25UeXBlIHtcbiAgICByZXR1cm4gSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzLmZpZWxkQWdncmVnYXRpb25UeXBlLmNvbnZlcnQodGhpcy5fZmllbGRJbmZvLmFnZ3JlZ2F0aW9uKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGF0YVNvdXJjZSgpOiBDb250cmFjdC5EYXRhU291cmNlIHtcbiAgICBpZiAoIXRoaXMuX3BhcmVudERhdGFTb3VyY2UpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBEYXRhIHNvdXJjZSBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlIGZvciB0aGlzIGZpZWxkLiBQbGVhc2UgdXNlIGdldEZpZWxkQXN5bmMgbWV0aG9kIHRvIGdldCBmaWVsZCdzIGRhdGEgc291cmNlIGluZm9ybWF0aW9uYCxcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudERhdGFTb3VyY2U7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHJvbGUoKTogQ29udHJhY3QuRmllbGRSb2xlVHlwZSB7XG4gICAgcmV0dXJuIEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncy5maWVsZFJvbGVUeXBlLmNvbnZlcnQodGhpcy5fZmllbGRJbmZvLnJvbGUpO1xuICB9XG5cbiAgcHVibGljIGdldCBjb2x1bW5UeXBlKCk6IENvbnRyYWN0LkNvbHVtblR5cGUge1xuICAgIGxldCBkZWZpbmVkVmFsdWU6IEludGVybmFsQ29udHJhY3QuQ29sdW1uVHlwZSA9IHRoaXMuX2ZpZWxkSW5mby5jb2x1bW5UeXBlIHx8IEludGVybmFsQ29udHJhY3QuQ29sdW1uVHlwZS5Vbmtub3duO1xuICAgIHJldHVybiBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MuY29sdW1uVHlwZS5jb252ZXJ0KGRlZmluZWRWYWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzQ2FsY3VsYXRlZEZpZWxkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEluZm8uaXNDYWxjdWxhdGVkRmllbGQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzQ29tYmluZWRGaWVsZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbmZvLmlzQ29tYmluZWRGaWVsZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNHZW5lcmF0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW5mby5pc0dlbmVyYXRlZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNHZW9zcGF0aWFsKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEluZm8uaXNHZW9zcGF0aWFsO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0hpZGRlbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbmZvLmlzSGlkZGVuO1xuICB9XG5cbiAgcHVibGljIGdldCBpc1ByZXNlbnRPblB1Ymxpc2hlZERhdGFzb3VyY2UoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW5mby5pc1ByZXNlbnRPblB1Ymxpc2hlZERhdGFzb3VyY2U7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXRhVHlwZSwgUGFyYW1ldGVyVmFsdWVUeXBlLCBQZXJpb2RUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFBhcmFtZXRlckluZm8gfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzIH0gZnJvbSAnLi4vRW51bU1hcHBpbmdzL0ludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyc7XG5pbXBvcnQgeyBEYXRhVmFsdWUgfSBmcm9tICcuLi9Nb2RlbHMvR2V0RGF0YU1vZGVscyc7XG5pbXBvcnQgeyBQYXJhbWV0ZXJzU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL1BhcmFtZXRlcnNTZXJ2aWNlJztcbmltcG9ydCB7IEFwaVNlcnZpY2VSZWdpc3RyeSwgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IERhdGFWYWx1ZUZhY3RvcnkgfSBmcm9tICcuLi9VdGlscy9EYXRhVmFsdWVGYWN0b3J5JztcbmltcG9ydCB7IEVycm9ySGVscGVycyB9IGZyb20gJy4uL1V0aWxzL0Vycm9ySGVscGVycyc7XG5pbXBvcnQgeyBQYXJhbSB9IGZyb20gJy4uL1V0aWxzL1BhcmFtJztcblxuZXhwb3J0IGNsYXNzIFBhcmFtZXRlckltcGwge1xuICBwcml2YXRlIF9hbGxvd2FibGVWYWx1ZXM6IENvbnRyYWN0LlBhcmFtZXRlckRvbWFpblJlc3RyaWN0aW9uO1xuICBwcml2YXRlIF9nbG9iYWxGaWVsZE5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSBfcGFyYW1ldGVySW5mbzogUGFyYW1ldGVySW5mbztcblxuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1ldGVySW5mbzogUGFyYW1ldGVySW5mbywgcHJpdmF0ZSBfcmVnaXN0cnlJZDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRQYXJhbWV0ZXJJbmZvKHBhcmFtZXRlckluZm8pO1xuICB9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmFtZXRlckluZm8ubmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY3VycmVudFZhbHVlKCk6IERhdGFWYWx1ZSB7XG4gICAgcmV0dXJuIERhdGFWYWx1ZUZhY3RvcnkuTWFrZVBhcmFtZXRlckRhdGFWYWx1ZSh0aGlzLl9wYXJhbWV0ZXJJbmZvLmN1cnJlbnRWYWx1ZSwgdGhpcy5fcGFyYW1ldGVySW5mby5kYXRhVHlwZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRhdGFUeXBlKCk6IERhdGFUeXBlIHtcbiAgICByZXR1cm4gSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzLmRhdGFUeXBlLmNvbnZlcnQodGhpcy5fcGFyYW1ldGVySW5mby5kYXRhVHlwZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2dsb2JhbEZpZWxkTmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWxsb3dhYmxlVmFsdWVzKCk6IENvbnRyYWN0LlBhcmFtZXRlckRvbWFpblJlc3RyaWN0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5fYWxsb3dhYmxlVmFsdWVzO1xuICB9XG5cbiAgcHVibGljIGNoYW5nZVZhbHVlQXN5bmMobmV3VmFsdWU6IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBEYXRlKTogUHJvbWlzZTxEYXRhVmFsdWU+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKG5ld1ZhbHVlLCAnbmV3VmFsdWUnKTtcblxuICAgIGNvbnN0IGNvZXJjZWRWYWx1ZSA9IFBhcmFtLnNlcmlhbGl6ZVBhcmFtZXRlclZhbHVlKG5ld1ZhbHVlKTtcbiAgICBjb25zdCBwYXJhbWV0ZXJzU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxQYXJhbWV0ZXJzU2VydmljZT4oU2VydmljZU5hbWVzLlBhcmFtZXRlcnMpO1xuICAgIHJldHVybiBwYXJhbWV0ZXJzU2VydmljZS5jaGFuZ2VQYXJhbWV0ZXJWYWx1ZUFzeW5jKHRoaXMuX2dsb2JhbEZpZWxkTmFtZSwgY29lcmNlZFZhbHVlKS50aGVuKChwYXJhbWV0ZXJJbmZvKSA9PiB7XG4gICAgICB0aGlzLnNldFBhcmFtZXRlckluZm8ocGFyYW1ldGVySW5mbyk7XG4gICAgICByZXR1cm4gdGhpcy5jdXJyZW50VmFsdWU7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNldFBhcmFtZXRlckluZm8ocGFyYW1ldGVySW5mbzogUGFyYW1ldGVySW5mbyk6IHZvaWQge1xuICAgIHRoaXMuX3BhcmFtZXRlckluZm8gPSBwYXJhbWV0ZXJJbmZvO1xuICAgIHRoaXMuX2dsb2JhbEZpZWxkTmFtZSA9IHBhcmFtZXRlckluZm8uZmllbGROYW1lO1xuXG4gICAgY29uc3QgdHlwZSA9IEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncy5hbGxvd2FibGVWYWx1ZXMuY29udmVydChwYXJhbWV0ZXJJbmZvLmFsbG93YWJsZVZhbHVlc1R5cGUpO1xuICAgIGxldCBsaXN0VmFsdWVzOiBBcnJheTxEYXRhVmFsdWU+IHwgdW5kZWZpbmVkO1xuICAgIGxldCBtaW5WYWx1ZTogRGF0YVZhbHVlIHwgdW5kZWZpbmVkO1xuICAgIGxldCBtYXhWYWx1ZTogRGF0YVZhbHVlIHwgdW5kZWZpbmVkO1xuICAgIGxldCBzdGVwU2l6ZTogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIGxldCBkYXRlU3RlcFBlcmlvZDogUGVyaW9kVHlwZSB8IHVuZGVmaW5lZDtcblxuICAgIGlmICh0eXBlID09PSBQYXJhbWV0ZXJWYWx1ZVR5cGUuTGlzdCkge1xuICAgICAgY29uc3QgdmFsdWVzID0gcGFyYW1ldGVySW5mby5hbGxvd2FibGVWYWx1ZXMgfHwgW107XG4gICAgICBsaXN0VmFsdWVzID0gdmFsdWVzLm1hcCgodmFsKSA9PiBEYXRhVmFsdWVGYWN0b3J5Lk1ha2VQYXJhbWV0ZXJEYXRhVmFsdWUodmFsLCBwYXJhbWV0ZXJJbmZvLmRhdGFUeXBlKSk7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBQYXJhbWV0ZXJWYWx1ZVR5cGUuUmFuZ2UpIHtcbiAgICAgIG1pblZhbHVlID0gcGFyYW1ldGVySW5mby5taW5WYWx1ZSAmJiBEYXRhVmFsdWVGYWN0b3J5Lk1ha2VQYXJhbWV0ZXJEYXRhVmFsdWUocGFyYW1ldGVySW5mby5taW5WYWx1ZSwgcGFyYW1ldGVySW5mby5kYXRhVHlwZSk7XG4gICAgICBtYXhWYWx1ZSA9IHBhcmFtZXRlckluZm8ubWF4VmFsdWUgJiYgRGF0YVZhbHVlRmFjdG9yeS5NYWtlUGFyYW1ldGVyRGF0YVZhbHVlKHBhcmFtZXRlckluZm8ubWF4VmFsdWUsIHBhcmFtZXRlckluZm8uZGF0YVR5cGUpO1xuICAgICAgc3RlcFNpemUgPSBwYXJhbWV0ZXJJbmZvLnN0ZXBTaXplO1xuICAgICAgZGF0ZVN0ZXBQZXJpb2QgPSBwYXJhbWV0ZXJJbmZvLmRhdGVTdGVwUGVyaW9kICYmIEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncy5kYXRlU3RlcFBlcmlvZC5jb252ZXJ0KHBhcmFtZXRlckluZm8uZGF0ZVN0ZXBQZXJpb2QpO1xuICAgIH1cblxuICAgIHRoaXMuX2FsbG93YWJsZVZhbHVlcyA9IHtcbiAgICAgIHR5cGU6IHR5cGUsXG4gICAgICBhbGxvd2FibGVWYWx1ZXM6IGxpc3RWYWx1ZXMsXG4gICAgICBtaW5WYWx1ZTogbWluVmFsdWUsXG4gICAgICBtYXhWYWx1ZTogbWF4VmFsdWUsXG4gICAgICBzdGVwU2l6ZTogc3RlcFNpemUsXG4gICAgICBkYXRlU3RlcFBlcmlvZDogZGF0ZVN0ZXBQZXJpb2QsXG4gICAgfTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFNoZWV0UGF0aCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBDbGllbnRJbmZvU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0NsaWVudEluZm9TZXJ2aWNlJztcbmltcG9ydCB7IFBhcmFtZXRlcnNTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvUGFyYW1ldGVyc1NlcnZpY2UnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5LCBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgU2l6ZVNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9TaXplU2VydmljZSc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgRXJyb3JIZWxwZXJzIH0gZnJvbSAnLi4vVXRpbHMvRXJyb3JIZWxwZXJzJztcbmltcG9ydCB7IFBhcmFtIH0gZnJvbSAnLi4vVXRpbHMvUGFyYW0nO1xuaW1wb3J0IHsgU2hlZXRVdGlscyB9IGZyb20gJy4uL1V0aWxzL1NoZWV0VXRpbHMnO1xuaW1wb3J0IHsgUGFyYW1ldGVySW1wbCB9IGZyb20gJy4vUGFyYW1ldGVySW1wbCc7XG5pbXBvcnQgeyBTaGVldEluZm9JbXBsIH0gZnJvbSAnLi9TaGVldEluZm9JbXBsJztcblxuaW50ZXJmYWNlIFBhcnRpYWxTaGVldFNpemUge1xuICAvKipcbiAgICogQ29udGFpbnMgYW4gZW51bWVyYXRpb24gdmFsdWUgb2Ygb25lIG9mIHRoZSBmb2xsb3dpbmc6IEFVVE9NQVRJQywgRVhBQ1RMWSwgUkFOR0UsIEFUTEVBU1QsIGFuZCBBVE1PU1QuXG4gICAqL1xuICByZWFkb25seSBiZWhhdmlvcjogQ29udHJhY3QuU2hlZXRTaXplQmVoYXZpb3I7XG5cbiAgLyoqXG4gICAqICBUaGlzIGlzIG9ubHkgZGVmaW5lZCB3aGVuIGJlaGF2aW9yIGlzIEVYQUNUTFksIFJBTkdFLCBvciBBVExFQVNULlxuICAgKi9cbiAgcmVhZG9ubHkgbWluU2l6ZT86IFBhcnRpYWw8Q29udHJhY3QuU2l6ZT47XG5cbiAgLyoqXG4gICAqICBUaGlzIGlzIG9ubHkgZGVmaW5lZCB3aGVuIGJlaGF2aW9yIGlzIEVYQUNUTFksIFJBTkdFIG9yIEFUTU9TVC5cbiAgICovXG4gIHJlYWRvbmx5IG1heFNpemU/OiBQYXJ0aWFsPENvbnRyYWN0LlNpemU+O1xufVxuXG5leHBvcnQgY2xhc3MgU2hlZXRJbXBsIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBfc2hlZXRJbmZvSW1wbDogU2hlZXRJbmZvSW1wbCwgcHJvdGVjdGVkIF9yZWdpc3RyeUlkOiBudW1iZXIpIHt9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWV0SW5mb0ltcGwubmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2hlZXRUeXBlKCk6IENvbnRyYWN0LlNoZWV0VHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWV0SW5mb0ltcGwuc2hlZXRUeXBlO1xuICB9XG5cbiAgcHVibGljIGdldCBzaGVldFBhdGgoKTogU2hlZXRQYXRoIHtcbiAgICByZXR1cm4gdGhpcy5fc2hlZXRJbmZvSW1wbC5zaGVldFBhdGg7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNpemUoKTogQ29udHJhY3QuU2l6ZSB8IENvbnRyYWN0LlNoZWV0U2l6ZSB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWV0SW5mb0ltcGwuc2hlZXRTaXplO1xuICB9XG5cbiAgcHVibGljIGdldCBoaWRkZW4oKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuX3NoZWV0SW5mb0ltcGwuaXNIaWRkZW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3NoZWV0SW5mb0ltcGwuaXNIaWRkZW47XG4gICAgfVxuICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5JbXBsZW1lbnRhdGlvbkVycm9yLCBgaXNIaWRkZW4gbm90IGltcGxlbWVudGVkYCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFjdGl2ZSgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5fc2hlZXRJbmZvSW1wbC5pc0FjdGl2ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc2hlZXRJbmZvSW1wbC5pc0FjdGl2ZTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLkltcGxlbWVudGF0aW9uRXJyb3IsIGBhY3RpdmUgbm90IGltcGxlbWVudGVkYCk7XG4gIH1cblxuICBwdWJsaWMgc2V0IGFjdGl2ZShhY3RpdmU6IGJvb2xlYW4pIHtcbiAgICBpZiAodGhpcy5fc2hlZXRJbmZvSW1wbC5pc0FjdGl2ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9zaGVldEluZm9JbXBsLmFjdGl2ZSA9IGFjdGl2ZTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IGluZGV4KCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuX3NoZWV0SW5mb0ltcGwuaW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3NoZWV0SW5mb0ltcGwuaW5kZXg7XG4gICAgfVxuICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5JbXBsZW1lbnRhdGlvbkVycm9yLCBgaW5kZXggbm90IGltcGxlbWVudGVkYCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHVybCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLl9zaGVldEluZm9JbXBsLnVybCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc2hlZXRJbmZvSW1wbC51cmw7XG4gICAgfVxuICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5JbXBsZW1lbnRhdGlvbkVycm9yLCBgdXJsIG5vdCBpbXBsZW1lbnRlZGApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTaGVldFNpemUoKTogQ29udHJhY3QuU2hlZXRTaXplIHtcbiAgICBpZiAoIVNoZWV0VXRpbHMuaXNWYWxpZFNoZWV0U2l6ZSh0aGlzLnNpemUpKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVtYmVkZGluZ0Vycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ3NpemUgaXMgbm90IG9mIHR5cGUgU2hlZXRTaXplJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc2l6ZTtcbiAgfVxuXG4gIHB1YmxpYyBmaW5kUGFyYW1ldGVyQXN5bmMocGFyYW1ldGVyTmFtZTogc3RyaW5nKTogUHJvbWlzZTxQYXJhbWV0ZXJJbXBsIHwgdW5kZWZpbmVkPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihwYXJhbWV0ZXJOYW1lLCAncGFyYW1ldGVyTmFtZScpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxQYXJhbWV0ZXJzU2VydmljZT4oU2VydmljZU5hbWVzLlBhcmFtZXRlcnMpO1xuICAgIHJldHVybiBzZXJ2aWNlLmZpbmRQYXJhbWV0ZXJCeU5hbWVBc3luYyhwYXJhbWV0ZXJOYW1lKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRQYXJhbWV0ZXJzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxQYXJhbWV0ZXJJbXBsPj4ge1xuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8UGFyYW1ldGVyc1NlcnZpY2U+KFNlcnZpY2VOYW1lcy5QYXJhbWV0ZXJzKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRQYXJhbWV0ZXJzRm9yU2hlZXRBc3luYyh0aGlzLnNoZWV0UGF0aCk7XG4gIH1cblxuICBwdWJsaWMgY2hhbmdlU2l6ZUFzeW5jKG5ld1NpemU6IENvbnRyYWN0LlNoZWV0U2l6ZSk6IFByb21pc2U8Q29udHJhY3QuU2hlZXRTaXplPiB7XG4gICAgY29uc3QgaW52YWxpZFNpemVFcnJvciA9IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5JbnZhbGlkU2l6ZSwgJ0ludmFsaWQgc2hlZXQgc2l6ZSBwYXJhbWV0ZXInKTtcbiAgICBpZiAoIW5ld1NpemUgfHwgIW5ld1NpemUuYmVoYXZpb3IpIHtcbiAgICAgIHRocm93IGludmFsaWRTaXplRXJyb3I7XG4gICAgfVxuXG4gICAgY29uc3QgcGFydGlhbFNoZWV0U2l6ZSA9IHRoaXMubm9ybWFsaXplU2hlZXRTaXplKG5ld1NpemUpO1xuXG4gICAgY29uc3QgaXNBdXRvbWF0aWMgPSBwYXJ0aWFsU2hlZXRTaXplLmJlaGF2aW9yID09PSBDb250cmFjdC5TaGVldFNpemVCZWhhdmlvci5BdXRvbWF0aWM7XG4gICAgaWYgKCFpc0F1dG9tYXRpYyAmJiAhcGFydGlhbFNoZWV0U2l6ZS5taW5TaXplICYmICFwYXJ0aWFsU2hlZXRTaXplLm1heFNpemUpIHtcbiAgICAgIHRocm93IGludmFsaWRTaXplRXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKCFpc0F1dG9tYXRpYyAmJiB0aGlzLnNoZWV0VHlwZSA9PT0gQ29udHJhY3QuU2hlZXRUeXBlLldvcmtzaGVldCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihcbiAgICAgICAgQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5JbnZhbGlkU2l6ZUJlaGF2aW9yT25Xb3Jrc2hlZXQsXG4gICAgICAgICdPbmx5IFNoZWV0U2l6ZUJlaGF2aW9yLkF1dG9tYXRpYyBpcyBhbGxvd2VkIG9uIFdvcmtzaGVldHMnLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoaXNBdXRvbWF0aWMgJiYgdGhpcy5nZXRTaGVldFNpemUoKS5iZWhhdmlvciA9PT0gcGFydGlhbFNoZWV0U2l6ZS5iZWhhdmlvcikge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXdTaXplKTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9jZXNzZWROZXdTaXplID0gdGhpcy5wcm9jZXNzTmV3U2l6ZShwYXJ0aWFsU2hlZXRTaXplKTtcblxuICAgIGNvbnN0IHNpemVTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFNpemVTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuU2l6ZSk7XG4gICAgcmV0dXJuIHNpemVTZXJ2aWNlLmNoYW5nZVNpemVBc3luYyh0aGlzLm5hbWUsIHByb2Nlc3NlZE5ld1NpemUpLnRoZW4oKCkgPT4ge1xuICAgICAgY29uc3QgY2xpZW50SW5mb1NlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8Q2xpZW50SW5mb1NlcnZpY2U+KFNlcnZpY2VOYW1lcy5DbGllbnRJbmZvKTtcblxuICAgICAgcmV0dXJuIGNsaWVudEluZm9TZXJ2aWNlLmdldENsaWVudEluZm9Bc3luYygpLnRoZW4oKGJvb3RzdHJhcEluZm8pID0+IHtcbiAgICAgICAgY29uc3Qgc2hlZXQgPSBib290c3RyYXBJbmZvLnB1Ymxpc2hlZFNoZWV0cy5maW5kKChzKSA9PiBzLm5hbWUgPT09IHRoaXMubmFtZSk7XG4gICAgICAgIGlmICghc2hlZXQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LlNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYENhbid0IGZpbmQgc2hlZXQgd2l0aCBuYW1lICR7dGhpcy5uYW1lfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2hlZXRTaXplID0gU2hlZXRVdGlscy5nZXRTaGVldFNpemVGcm9tU2l6ZUNvbnN0cmFpbnRzKHNoZWV0LnNpemVDb25zdHJhaW50KTtcbiAgICAgICAgdGhpcy5fc2hlZXRJbmZvSW1wbC5zaGVldFNpemUgPSBzaGVldFNpemU7XG5cbiAgICAgICAgcmV0dXJuIHNoZWV0U2l6ZTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVTaGVldFNpemUobmV3U2l6ZTogQ29udHJhY3QuU2hlZXRTaXplKTogUGFydGlhbFNoZWV0U2l6ZSB7XG4gICAgY29uc3QgeyBiZWhhdmlvciB9ID0gbmV3U2l6ZTtcblxuICAgIEVycm9ySGVscGVycy52ZXJpZnlFbnVtVmFsdWU8Q29udHJhY3QuU2hlZXRTaXplQmVoYXZpb3I+KGJlaGF2aW9yLCBDb250cmFjdC5TaGVldFNpemVCZWhhdmlvciwgJ1NoZWV0U2l6ZUJlaGF2aW9yJyk7XG5cbiAgICBjb25zdCBtaW5TaXplID0gU2hlZXRJbXBsLnBhcnNlRGltZW5zaW9ucyhuZXdTaXplLm1pblNpemUpO1xuICAgIGNvbnN0IG1heFNpemUgPSBTaGVldEltcGwucGFyc2VEaW1lbnNpb25zKG5ld1NpemUubWF4U2l6ZSk7XG5cbiAgICByZXR1cm4geyBiZWhhdmlvciwgbWluU2l6ZSwgbWF4U2l6ZSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBwcm9jZXNzTmV3U2l6ZShuZXdTaXplOiBQYXJ0aWFsU2hlZXRTaXplKTogQ29udHJhY3QuU2hlZXRTaXplIHtcbiAgICBjb25zdCB7IGJlaGF2aW9yLCBtaW5TaXplOiBtaW5TaXplTWF5YmUsIG1heFNpemU6IG1heFNpemVNYXliZSB9ID0gbmV3U2l6ZTtcblxuICAgIGNvbnN0IGhhc01pbldpZHRoID0gIVBhcmFtLmlzTnVsbE9yVW5kZWZpbmVkKG1pblNpemVNYXliZT8ud2lkdGgpO1xuICAgIGNvbnN0IGhhc01pbkhlaWdodCA9ICFQYXJhbS5pc051bGxPclVuZGVmaW5lZChtaW5TaXplTWF5YmU/LmhlaWdodCk7XG4gICAgY29uc3QgaGFzTWF4V2lkdGggPSAhUGFyYW0uaXNOdWxsT3JVbmRlZmluZWQobWF4U2l6ZU1heWJlPy53aWR0aCk7XG4gICAgY29uc3QgaGFzTWF4SGVpZ2h0ID0gIVBhcmFtLmlzTnVsbE9yVW5kZWZpbmVkKG1heFNpemVNYXliZT8uaGVpZ2h0KTtcbiAgICBjb25zdCBoYXNWYWxpZE1pblNpemUgPSBoYXNNaW5XaWR0aCAmJiBoYXNNaW5IZWlnaHQ7XG4gICAgY29uc3QgaGFzVmFsaWRNYXhTaXplID0gaGFzTWF4V2lkdGggJiYgaGFzTWF4SGVpZ2h0O1xuXG4gICAgc3dpdGNoIChiZWhhdmlvcikge1xuICAgICAgY2FzZSBDb250cmFjdC5TaGVldFNpemVCZWhhdmlvci5BdXRvbWF0aWM6IHtcbiAgICAgICAgcmV0dXJuIHsgYmVoYXZpb3IgfTtcbiAgICAgIH1cblxuICAgICAgY2FzZSBDb250cmFjdC5TaGVldFNpemVCZWhhdmlvci5BdE1vc3Q6IHtcbiAgICAgICAgaWYgKCFtYXhTaXplTWF5YmUgfHwgIWhhc1ZhbGlkTWF4U2l6ZSkge1xuICAgICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5NaXNzaW5nTWF4U2l6ZSwgJ01pc3NpbmcgbWF4U2l6ZSBmb3IgU2hlZXRTaXplQmVoYXZpb3IuQXRNb3N0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtYXhTaXplID0geyB3aWR0aDogbWF4U2l6ZU1heWJlLndpZHRoISwgaGVpZ2h0OiBtYXhTaXplTWF5YmUuaGVpZ2h0ISB9O1xuICAgICAgICBpZiAobWF4U2l6ZS53aWR0aCA8IDAgfHwgbWF4U2l6ZS5oZWlnaHQgPCAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLkludmFsaWRTaXplLCAnU2l6ZSB2YWx1ZSBjYW5ub3QgYmUgbGVzcyB0aGFuIHplcm8nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IGJlaGF2aW9yLCBtYXhTaXplIH07XG4gICAgICB9XG5cbiAgICAgIGNhc2UgQ29udHJhY3QuU2hlZXRTaXplQmVoYXZpb3IuQXRMZWFzdDoge1xuICAgICAgICBpZiAoIW1pblNpemVNYXliZSB8fCAhaGFzVmFsaWRNaW5TaXplKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLk1pc3NpbmdNaW5TaXplLCAnTWlzc2luZyBtaW5TaXplIGZvciBTaGVldFNpemVCZWhhdmlvci5BdExlYXN0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtaW5TaXplID0geyB3aWR0aDogbWluU2l6ZU1heWJlLndpZHRoISwgaGVpZ2h0OiBtaW5TaXplTWF5YmUuaGVpZ2h0ISB9O1xuICAgICAgICBpZiAobWluU2l6ZS53aWR0aCA8IDAgfHwgbWluU2l6ZS5oZWlnaHQgPCAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLkludmFsaWRTaXplLCAnU2l6ZSB2YWx1ZSBjYW5ub3QgYmUgbGVzcyB0aGFuIHplcm8nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IGJlaGF2aW9yLCBtaW5TaXplIH07XG4gICAgICB9XG5cbiAgICAgIGNhc2UgQ29udHJhY3QuU2hlZXRTaXplQmVoYXZpb3IuUmFuZ2U6IHtcbiAgICAgICAgaWYgKCFtaW5TaXplTWF5YmUgfHwgIW1heFNpemVNYXliZSB8fCAhaGFzVmFsaWRNaW5TaXplIHx8ICFoYXNWYWxpZE1heFNpemUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVtYmVkZGluZ0Vycm9yQ29kZXMuTWlzc2luZ01pbk1heFNpemUsICdNaXNzaW5nIG1pblNpemUgb3IgbWF4U2l6ZSBmb3IgU2hlZXRTaXplQmVoYXZpb3IuUmFuZ2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1pblNpemUgPSB7IHdpZHRoOiBtaW5TaXplTWF5YmUud2lkdGghLCBoZWlnaHQ6IG1pblNpemVNYXliZS5oZWlnaHQhIH07XG4gICAgICAgIGNvbnN0IG1heFNpemUgPSB7IHdpZHRoOiBtYXhTaXplTWF5YmUud2lkdGghLCBoZWlnaHQ6IG1heFNpemVNYXliZS5oZWlnaHQhIH07XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIG1pblNpemUud2lkdGggPCAwIHx8XG4gICAgICAgICAgbWluU2l6ZS5oZWlnaHQgPCAwIHx8XG4gICAgICAgICAgbWF4U2l6ZS53aWR0aCA8IDAgfHxcbiAgICAgICAgICBtYXhTaXplLmhlaWdodCA8IDAgfHxcbiAgICAgICAgICBtaW5TaXplLndpZHRoID4gbWF4U2l6ZS53aWR0aCB8fFxuICAgICAgICAgIG1pblNpemUuaGVpZ2h0ID4gbWF4U2l6ZS5oZWlnaHRcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLkludmFsaWRTaXplLCAnTWlzc2luZyBtaW5TaXplIG9yIG1heFNpemUgZm9yIFNoZWV0U2l6ZUJlaGF2aW9yLlJhbmdlJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyBiZWhhdmlvciwgbWluU2l6ZSwgbWF4U2l6ZSB9O1xuICAgICAgfVxuXG4gICAgICBjYXNlIENvbnRyYWN0LlNoZWV0U2l6ZUJlaGF2aW9yLkV4YWN0bHk6IHtcbiAgICAgICAgaWYgKG1pblNpemVNYXliZSAmJiBtYXhTaXplTWF5YmUpIHtcbiAgICAgICAgICBpZiAoaGFzVmFsaWRNaW5TaXplICYmIGhhc1ZhbGlkTWF4U2l6ZSkge1xuICAgICAgICAgICAgY29uc3QgbWluU2l6ZSA9IHsgd2lkdGg6IG1pblNpemVNYXliZS53aWR0aCEsIGhlaWdodDogbWluU2l6ZU1heWJlLmhlaWdodCEgfTtcbiAgICAgICAgICAgIGNvbnN0IG1heFNpemUgPSB7IHdpZHRoOiBtYXhTaXplTWF5YmUud2lkdGghLCBoZWlnaHQ6IG1heFNpemVNYXliZS5oZWlnaHQhIH07XG5cbiAgICAgICAgICAgIGlmIChtaW5TaXplLndpZHRoICE9PSBtYXhTaXplLndpZHRoIHx8IG1pblNpemUuaGVpZ2h0ICE9PSBtYXhTaXplLmhlaWdodCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVtYmVkZGluZ0Vycm9yQ29kZXMuSW52YWxpZFNpemUsICdDb25mbGljdGluZyBzaXplIHZhbHVlcyBmb3IgU2hlZXRTaXplQmVoYXZpb3IuRXhhY3RseScpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4geyBiZWhhdmlvciwgbWluU2l6ZSwgbWF4U2l6ZSB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChoYXNWYWxpZE1pblNpemUpIHtcbiAgICAgICAgICAgIGNvbnN0IG1pblNpemUgPSB7IHdpZHRoOiBtaW5TaXplTWF5YmUud2lkdGghLCBoZWlnaHQ6IG1pblNpemVNYXliZS5oZWlnaHQhIH07XG4gICAgICAgICAgICByZXR1cm4geyBiZWhhdmlvciwgbWluU2l6ZSwgbWF4U2l6ZTogbWluU2l6ZSB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChoYXNWYWxpZE1heFNpemUpIHtcbiAgICAgICAgICAgIGNvbnN0IG1heFNpemUgPSB7IHdpZHRoOiBtYXhTaXplTWF5YmUud2lkdGghLCBoZWlnaHQ6IG1heFNpemVNYXliZS5oZWlnaHQhIH07XG4gICAgICAgICAgICByZXR1cm4geyBiZWhhdmlvciwgbWluU2l6ZTogbWF4U2l6ZSwgbWF4U2l6ZSB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5JbnZhbGlkU2l6ZSwgJ0ludmFsaWQgc2hlZXQgc2l6ZSBwYXJhbWV0ZXInKTtcbiAgICAgIH1cblxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LlNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFVuc3VwcG9ydGVkIHNoZWV0IHNpemUgYmVoYXZpb3I6ICR7YmVoYXZpb3J9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcGFyc2VEaW1lbnNpb25zID0gKHNpemU6IENvbnRyYWN0LlNpemUgfCB1bmRlZmluZWQpOiBQYXJ0aWFsPENvbnRyYWN0LlNpemU+ID0+IHtcbiAgICBjb25zdCBlbXB0eSA9IHsgd2lkdGg6IHVuZGVmaW5lZCwgaGVpZ2h0OiB1bmRlZmluZWQgfTtcblxuICAgIGlmICghc2l6ZSkge1xuICAgICAgcmV0dXJuIGVtcHR5O1xuICAgIH1cblxuICAgIGNvbnN0IHsgc3VjY2Vzczogd2lkdGhQYXJzZWQsIHBhcnNlZDogcGFyc2VkV2lkdGggfSA9IFBhcmFtLnRyeVBhcnNlTnVtYmVyKHNpemUud2lkdGgpO1xuICAgIGNvbnN0IHsgc3VjY2VzczogaGVpZ2h0UGFyc2VkLCBwYXJzZWQ6IHBhcnNlZEhlaWdodCB9ID0gUGFyYW0udHJ5UGFyc2VOdW1iZXIoc2l6ZS5oZWlnaHQpO1xuXG4gICAgaWYgKHdpZHRoUGFyc2VkICYmIGhlaWdodFBhcnNlZCkge1xuICAgICAgcmV0dXJuIHsgd2lkdGg6IHBhcnNlZFdpZHRoISwgaGVpZ2h0OiBwYXJzZWRIZWlnaHQhIH07XG4gICAgfVxuXG4gICAgaWYgKHdpZHRoUGFyc2VkKSB7XG4gICAgICByZXR1cm4geyB3aWR0aDogcGFyc2VkV2lkdGghIH07XG4gICAgfVxuXG4gICAgaWYgKGhlaWdodFBhcnNlZCkge1xuICAgICAgcmV0dXJuIHsgaGVpZ2h0OiBwYXJzZWRIZWlnaHQhIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIGVtcHR5O1xuICB9O1xufVxuIiwiaW1wb3J0IHsgU2hlZXRTaXplIGFzIEVtYmVkZGluZ1NoZWV0U2l6ZSwgU2l6ZSBhcyBFeHRlbnNpb25TaGVldFNpemUsIFNoZWV0VHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBTaGVldFBhdGggfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG5leHBvcnQgY2xhc3MgU2hlZXRJbmZvSW1wbCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9uYW1lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBfc2hlZXRUeXBlOiBTaGVldFR5cGUsXG4gICAgcHJpdmF0ZSBfc2hlZXRTaXplOiBFeHRlbnNpb25TaGVldFNpemUgfCBFbWJlZGRpbmdTaGVldFNpemUsXG4gICAgcHJpdmF0ZSBfaW5kZXg/OiBudW1iZXIsXG4gICAgcHJpdmF0ZSBfaXNBY3RpdmU/OiBib29sZWFuLFxuICAgIHByaXZhdGUgX2lzSGlkZGVuPzogYm9vbGVhbixcbiAgICBwcml2YXRlIF91cmw/OiBzdHJpbmcsXG4gICkge31cblxuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgbmFtZShzaGVldE5hbWU6IHN0cmluZykge1xuICAgIHRoaXMuX25hbWUgPSBzaGVldE5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNoZWV0U2l6ZSgpOiBFeHRlbnNpb25TaGVldFNpemUgfCBFbWJlZGRpbmdTaGVldFNpemUge1xuICAgIHJldHVybiB0aGlzLl9zaGVldFNpemU7XG4gIH1cblxuICBwdWJsaWMgc2V0IHNoZWV0U2l6ZSh2YWx1ZTogRXh0ZW5zaW9uU2hlZXRTaXplIHwgRW1iZWRkaW5nU2hlZXRTaXplKSB7XG4gICAgdGhpcy5fc2hlZXRTaXplID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNoZWV0VHlwZSgpOiBTaGVldFR5cGUge1xuICAgIHJldHVybiB0aGlzLl9zaGVldFR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNoZWV0UGF0aCgpOiBTaGVldFBhdGgge1xuICAgIHJldHVybiB7XG4gICAgICBzaGVldE5hbWU6IHRoaXMubmFtZSxcbiAgICAgIGlzRGFzaGJvYXJkOiB0aGlzLnNoZWV0VHlwZSA9PT0gU2hlZXRUeXBlLkRhc2hib2FyZCxcbiAgICAgIC8vIFRPRE8gLSBTdG9yaWVzXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW5kZXgoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5faW5kZXg7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzQWN0aXZlKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9pc0FjdGl2ZTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgYWN0aXZlKGFjdGl2ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2lzQWN0aXZlID0gYWN0aXZlO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0hpZGRlbigpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5faXNIaWRkZW47XG4gIH1cblxuICBwdWJsaWMgZ2V0IHVybCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl91cmw7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXZlbnRUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFNpbmdsZUV2ZW50TWFuYWdlciB9IGZyb20gJy4uL1NpbmdsZUV2ZW50TWFuYWdlcic7XG5cbi8qKlxuICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBTaW5nbGVFdmVudE1hbmFnZXIgaW50ZXJmYWNlIGZvciBhIHNpbmdsZSB0eXBlIG9mIFRhYmxlYXUgZXZlbnRcbiAqXG4gKiBAdGVtcGxhdGUgVEV2ZW50VHlwZSBUaGUgVGFibGVhdSBldmVudCB0eXBlIHRoaXMgY2xhc3Mgc3BlY2lhbGl6ZXNcbiAqL1xuZXhwb3J0IGNsYXNzIFNpbmdsZUV2ZW50TWFuYWdlckltcGw8VEV2ZW50VHlwZSBleHRlbmRzIENvbnRyYWN0LlRhYmxlYXVFdmVudD4gaW1wbGVtZW50cyBTaW5nbGVFdmVudE1hbmFnZXIge1xuICBwcml2YXRlIF9ldmVudFR5cGU6IFRhYmxlYXVFdmVudFR5cGU7XG4gIHByaXZhdGUgX2hhbmRsZXJzOiBBcnJheTwoZXZlbnRPYmo6IFRFdmVudFR5cGUpID0+IHZvaWQ+O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihldmVudFR5cGU6IFRhYmxlYXVFdmVudFR5cGUpIHtcbiAgICB0aGlzLl9ldmVudFR5cGUgPSBldmVudFR5cGU7XG4gICAgdGhpcy5faGFuZGxlcnMgPSBbXTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZXZlbnRUeXBlKCk6IFRhYmxlYXVFdmVudFR5cGUge1xuICAgIHJldHVybiB0aGlzLl9ldmVudFR5cGU7XG4gIH1cblxuICBwdWJsaWMgYWRkRXZlbnRMaXN0ZW5lcihoYW5kbGVyOiAoZXZlbnRPYmo6IFRFdmVudFR5cGUpID0+IHZvaWQpOiBDb250cmFjdC5UYWJsZWF1RXZlbnRVbnJlZ2lzdGVyRm4ge1xuICAgIHRoaXMuX2hhbmRsZXJzLnB1c2goaGFuZGxlcik7XG4gICAgcmV0dXJuICgpID0+IHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihoYW5kbGVyKTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVFdmVudExpc3RlbmVyKGhhbmRsZXI6IChldmVudE9iajogVEV2ZW50VHlwZSkgPT4gdm9pZCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGJlZm9yZUNvdW50ID0gdGhpcy5faGFuZGxlcnMubGVuZ3RoO1xuICAgIHRoaXMuX2hhbmRsZXJzID0gdGhpcy5faGFuZGxlcnMuZmlsdGVyKChoKSA9PiBoICE9PSBoYW5kbGVyKTtcbiAgICByZXR1cm4gYmVmb3JlQ291bnQgPiB0aGlzLl9oYW5kbGVycy5sZW5ndGg7XG4gIH1cblxuICBwdWJsaWMgdHJpZ2dlckV2ZW50KGV2ZW50R2VuZXJhdG9yOiAoKSA9PiBURXZlbnRUeXBlKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIHRoaXMuX2hhbmRsZXJzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBldmVudE1vZGVsID0gZXZlbnRHZW5lcmF0b3IoKTtcbiAgICAgICAgaGFuZGxlcihldmVudE1vZGVsKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gU2luY2UgdGhpcyBoYW5kbGVyIGNvdWxkIGJlIG91dHNpZGUgb3VyIGNvbnRyb2wsIGp1c3QgY2F0Y2ggYW55dGhpbmcgaXQgdGhyb3dzIGFuZCBjb250aW51ZSBvblxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBTaGVldEluZm8sIFN0b3J5TW9kZWwsIFN0b3J5UG9pbnRNb2RlbCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBBcGlTZXJ2aWNlUmVnaXN0cnksIFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBTdG9yeUFjdGl2YXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvU3RvcnlBY3RpdmF0aW9uU2VydmljZSc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgRXJyb3JIZWxwZXJzIH0gZnJvbSAnLi4vVXRpbHMvRXJyb3JIZWxwZXJzJztcbmltcG9ydCB7IFNob3J0TGl2ZWREZWZlcnJlZCB9IGZyb20gJy4uL1V0aWxzL1Nob3J0TGl2ZWREZWZlcnJlZCc7XG5pbXBvcnQgeyBTaGVldEltcGwgfSBmcm9tICcuL1NoZWV0SW1wbCc7XG5pbXBvcnQgeyBTaGVldEluZm9JbXBsIH0gZnJvbSAnLi9TaGVldEluZm9JbXBsJztcbmltcG9ydCB7IFN0b3J5UG9pbnRJbXBsIH0gZnJvbSAnLi9TdG9yeVBvaW50SW1wbCc7XG5pbXBvcnQgeyBTdG9yeVBvaW50SW5mb0ltcGwgfSBmcm9tICcuL1N0b3J5UG9pbnRJbmZvSW1wbCc7XG5cbmV4cG9ydCBjbGFzcyBTdG9yeUltcGwgZXh0ZW5kcyBTaGVldEltcGwge1xuICBwcml2YXRlIF9hY3RpdmVTdG9yeVBvaW50SW1wbDogU3RvcnlQb2ludEltcGw7XG4gIHByaXZhdGUgX3N0b3J5UG9pbnRJbmZvSW1wbHM6IEFycmF5PFN0b3J5UG9pbnRJbmZvSW1wbD4gPSBbXTtcbiAgcHJpdmF0ZSBfZGVmZXJyZWQ6IFNob3J0TGl2ZWREZWZlcnJlZDxTdG9yeVBvaW50SW1wbD47XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBfc2hlZXRJbmZvSW1wbDogU2hlZXRJbmZvSW1wbCxcbiAgICBzdG9yeU1vZGVsOiBTdG9yeU1vZGVsLFxuICAgIHByaXZhdGUgX3B1Ymxpc2hlZFNoZWV0SW5mb3M6IEFycmF5PFNoZWV0SW5mbz4sXG4gICAgcHJvdGVjdGVkIF9yZWdpc3RyeUlkOiBudW1iZXIsXG4gICkge1xuICAgIHN1cGVyKF9zaGVldEluZm9JbXBsLCBfcmVnaXN0cnlJZCk7XG4gICAgdGhpcy5fZGVmZXJyZWQgPSBuZXcgU2hvcnRMaXZlZERlZmVycmVkPFN0b3J5UG9pbnRJbXBsPigpO1xuICAgIHRoaXMuaW5pdGlhbGl6ZVN0b3J5KHN0b3J5TW9kZWwpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplU3Rvcnkoc3RvcnlNb2RlbDogU3RvcnlNb2RlbCkge1xuICAgIHN0b3J5TW9kZWwuc3RvcnlQb2ludHMuZm9yRWFjaCgoc3RvcnlQb2ludE1vZGVsKSA9PiB7XG4gICAgICBjb25zdCBpc0FjdGl2ZSA9IHN0b3J5UG9pbnRNb2RlbC5pbmRleCA9PT0gc3RvcnlNb2RlbC5hY3RpdmVTdG9yeVBvaW50SW5kZXg7XG4gICAgICBjb25zdCBzdG9yeVBvaW50SW5mb0ltcGwgPSBuZXcgU3RvcnlQb2ludEluZm9JbXBsKFxuICAgICAgICBzdG9yeVBvaW50TW9kZWwuY2FwdGlvbixcbiAgICAgICAgc3RvcnlQb2ludE1vZGVsLmluZGV4LFxuICAgICAgICBzdG9yeVBvaW50TW9kZWwuc3RvcnlQb2ludElkLFxuICAgICAgICBpc0FjdGl2ZSxcbiAgICAgICAgc3RvcnlQb2ludE1vZGVsLnVwZGF0ZWQsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgICAgdGhpcy5fc3RvcnlQb2ludEluZm9JbXBscy5wdXNoKHN0b3J5UG9pbnRJbmZvSW1wbCk7XG5cbiAgICAgIGlmIChpc0FjdGl2ZSkge1xuICAgICAgICB0aGlzLl9hY3RpdmVTdG9yeVBvaW50SW1wbCA9IG5ldyBTdG9yeVBvaW50SW1wbChcbiAgICAgICAgICBzdG9yeVBvaW50SW5mb0ltcGwsXG4gICAgICAgICAgdGhpcy5fcHVibGlzaGVkU2hlZXRJbmZvcyxcbiAgICAgICAgICB0aGlzLl9yZWdpc3RyeUlkLFxuICAgICAgICAgIHN0b3J5UG9pbnRNb2RlbC5jb250YWluZWRTaGVldEluZm8sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVN0b3J5SW5mbyhpbmRleDogbnVtYmVyLCBzdG9yeVBvaW50TW9kZWw6IFN0b3J5UG9pbnRNb2RlbCkge1xuICAgIGlmICghdGhpcy5fc3RvcnlQb2ludEluZm9JbXBscykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBzdG9yeUluZm9JbXBsID0gdGhpcy5fc3RvcnlQb2ludEluZm9JbXBsc1tpbmRleF07XG4gICAgaWYgKHN0b3J5SW5mb0ltcGwuc3RvcnlQb2ludElkICE9PSBzdG9yeVBvaW50TW9kZWwuc3RvcnlQb2ludElkKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgICBDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLlN0b3J5UG9pbnRJZE1pc21hdGNoLFxuICAgICAgICBgV2Ugc2hvdWxkIG5vdCBiZSB1cGRhdGluZyBhIHN0b3J5IHBvaW50IHdoZW4gdGhlIElEcyBkb24ndCBtYXRjaC4gRXhpc3Rpbmcgc3RvcnlQb2ludElEPSR7c3RvcnlJbmZvSW1wbC5zdG9yeVBvaW50SWR9LCBuZXdTdG9yeVBvaW50SUQ9JHtzdG9yeVBvaW50TW9kZWwuc3RvcnlQb2ludElkfWAsXG4gICAgICApO1xuICAgIH1cbiAgICBzdG9yeUluZm9JbXBsLmNhcHRpb24gPSBzdG9yeVBvaW50TW9kZWwuY2FwdGlvbjtcbiAgICBzdG9yeUluZm9JbXBsLnVwZGF0ZWQgPSBzdG9yeVBvaW50TW9kZWwudXBkYXRlZDtcblxuICAgIGlmICh0aGlzLl9hY3RpdmVTdG9yeVBvaW50SW1wbC5zdG9yeVBvaW50SWQgPT09IHN0b3J5UG9pbnRNb2RlbC5zdG9yeVBvaW50SWQpIHtcbiAgICAgIHRoaXMuX2FjdGl2ZVN0b3J5UG9pbnRJbXBsLnVwZGF0ZWQgPSBzdG9yeUluZm9JbXBsLnVwZGF0ZWQ7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHVwZGF0ZVN0b3J5KHN0b3J5UG9pbnRNb2RlbDogU3RvcnlQb2ludE1vZGVsKSB7XG4gICAgaWYgKCF0aGlzLl9zdG9yeVBvaW50SW5mb0ltcGxzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fc3RvcnlQb2ludEluZm9JbXBscy5mb3JFYWNoKChzdG9yeVBvaW50SW5mb0ltcGwpID0+IHtcbiAgICAgIGNvbnN0IGlzQWN0aXZlID0gc3RvcnlQb2ludEluZm9JbXBsLnN0b3J5UG9pbnRJZCA9PT0gc3RvcnlQb2ludE1vZGVsLnN0b3J5UG9pbnRJZDtcbiAgICAgIGlmIChpc0FjdGl2ZSkge1xuICAgICAgICAvLyB1cGRhdGUgdGhlIHN0YXRlXG4gICAgICAgIHN0b3J5UG9pbnRJbmZvSW1wbC5jYXB0aW9uID0gc3RvcnlQb2ludE1vZGVsLmNhcHRpb247XG4gICAgICAgIHN0b3J5UG9pbnRJbmZvSW1wbC5pbmRleCA9IHN0b3J5UG9pbnRNb2RlbC5pbmRleDtcbiAgICAgICAgc3RvcnlQb2ludEluZm9JbXBsLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgIHN0b3J5UG9pbnRJbmZvSW1wbC51cGRhdGVkID0gc3RvcnlQb2ludE1vZGVsLnVwZGF0ZWQ7XG5cbiAgICAgICAgLy8gcmUtaW5pdGlhbGl6ZSBhY3RpdmVTdG9yeVBvaW50SW1wbFxuICAgICAgICB0aGlzLl9hY3RpdmVTdG9yeVBvaW50SW1wbCA9IG5ldyBTdG9yeVBvaW50SW1wbChcbiAgICAgICAgICBzdG9yeVBvaW50SW5mb0ltcGwsXG4gICAgICAgICAgdGhpcy5fcHVibGlzaGVkU2hlZXRJbmZvcyxcbiAgICAgICAgICB0aGlzLl9yZWdpc3RyeUlkLFxuICAgICAgICAgIHN0b3J5UG9pbnRNb2RlbC5jb250YWluZWRTaGVldEluZm8sXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBzZXQgb2xkIG9uZXMgdG8gZmFsc2VcbiAgICAgICAgc3RvcnlQb2ludEluZm9JbXBsLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuYWN0aXZlU3RvcnlQb2ludCkge1xuICAgICAgdGhpcy5fZGVmZXJyZWQucmVzb2x2ZSh0aGlzLmFjdGl2ZVN0b3J5UG9pbnQpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWN0aXZlU3RvcnlQb2ludCgpOiBTdG9yeVBvaW50SW1wbCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZVN0b3J5UG9pbnRJbXBsO1xuICB9XG5cbiAgcHVibGljIGdldCBzdG9yeVBvaW50c0luZm8oKTogQXJyYXk8U3RvcnlQb2ludEluZm9JbXBsPiB7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3J5UG9pbnRJbmZvSW1wbHM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzQWN0aXZlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zaGVldEluZm9JbXBsLmFjdGl2ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNIaWRkZW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5fc2hlZXRJbmZvSW1wbC5pc0hpZGRlbjtcbiAgfVxuXG4gIHB1YmxpYyBhY3RpdmF0ZU5leHRTdG9yeVBvaW50QXN5bmMoKTogUHJvbWlzZTxTdG9yeVBvaW50SW1wbD4ge1xuICAgIGlmICh0aGlzLl9hY3RpdmVTdG9yeVBvaW50SW1wbC5pbmRleCA9PT0gdGhpcy5fc3RvcnlQb2ludEluZm9JbXBscy5sZW5ndGggLSAxKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2FjdGl2ZVN0b3J5UG9pbnRJbXBsKTtcbiAgICB9XG5cbiAgICBsZXQgcHJvbWlzZSA9IHRoaXMuX2RlZmVycmVkLmdldE5ld1Byb21pc2VPclRocm93SWZCdXN5KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFN0b3J5QWN0aXZhdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5TdG9yeUFjdGl2YXRpb24pO1xuICAgIHNlcnZpY2UuYWN0aXZhdGVOZXh0U3RvcnlQb2ludEFzeW5jKCk7XG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH1cblxuICBwdWJsaWMgYWN0aXZhdGVQcmV2aW91c1N0b3J5UG9pbnRBc3luYygpOiBQcm9taXNlPFN0b3J5UG9pbnRJbXBsPiB7XG4gICAgaWYgKHRoaXMuX2FjdGl2ZVN0b3J5UG9pbnRJbXBsLmluZGV4ID09PSAwKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2FjdGl2ZVN0b3J5UG9pbnRJbXBsKTtcbiAgICB9XG5cbiAgICBsZXQgcHJvbWlzZSA9IHRoaXMuX2RlZmVycmVkLmdldE5ld1Byb21pc2VPclRocm93SWZCdXN5KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFN0b3J5QWN0aXZhdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5TdG9yeUFjdGl2YXRpb24pO1xuICAgIHNlcnZpY2UuYWN0aXZhdGVQcmV2aW91c1N0b3J5UG9pbnRBc3luYygpO1xuICAgIHJldHVybiBwcm9taXNlO1xuICB9XG5cbiAgcHVibGljIGFjdGl2YXRlU3RvcnlQb2ludEFzeW5jKGluZGV4OiBudW1iZXIpOiBQcm9taXNlPFN0b3J5UG9pbnRJbXBsPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihpbmRleCwgJ2luZGV4Jyk7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlclR5cGUoaW5kZXgsICdudW1iZXInLCAnaW5kZXgnKTtcblxuICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5fc3RvcnlQb2ludEluZm9JbXBscy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5JbmRleE91dE9mUmFuZ2UsICdUaGUgaW5kZXggcGFzc2VkIHRvIHRoaXMgY29tbWFuZCBpcyBvdXQgb2YgcmFuZ2UuJyk7XG4gICAgfVxuXG4gICAgaWYgKGluZGV4ID09PSB0aGlzLl9hY3RpdmVTdG9yeVBvaW50SW1wbC5pbmRleCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9hY3RpdmVTdG9yeVBvaW50SW1wbCk7XG4gICAgfVxuXG4gICAgbGV0IHByb21pc2UgPSB0aGlzLl9kZWZlcnJlZC5nZXROZXdQcm9taXNlT3JUaHJvd0lmQnVzeSgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxTdG9yeUFjdGl2YXRpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuU3RvcnlBY3RpdmF0aW9uKTtcbiAgICBzZXJ2aWNlLmFjdGl2YXRlU3RvcnlQb2ludEFzeW5jKGluZGV4KTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxuXG4gIHB1YmxpYyByZXZlcnRTdG9yeVBvaW50QXN5bmMoaW5kZXg6IG51bWJlcik6IFByb21pc2U8U3RvcnlQb2ludEluZm9JbXBsPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihpbmRleCwgJ2luZGV4Jyk7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlclR5cGUoaW5kZXgsICdudW1iZXInLCAnaW5kZXgnKTtcblxuICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5fc3RvcnlQb2ludEluZm9JbXBscy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5JbmRleE91dE9mUmFuZ2UsICdUaGUgaW5kZXggcGFzc2VkIHRvIHRoaXMgY29tbWFuZCBpcyBvdXQgb2YgcmFuZ2UuJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxTdG9yeUFjdGl2YXRpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuU3RvcnlBY3RpdmF0aW9uKTtcblxuICAgIHJldHVybiBzZXJ2aWNlLnJldmVydFN0b3J5UG9pbnRBc3luYyhpbmRleCkudGhlbjxTdG9yeVBvaW50SW5mb0ltcGw+KChyZXNwb25zZSkgPT4ge1xuICAgICAgdGhpcy51cGRhdGVTdG9yeUluZm8ocmVzcG9uc2UuaW5kZXgsIHJlc3BvbnNlKTtcbiAgICAgIGNvbnN0IHN0b3J5UG9pbnRJbmZvSW1wbCA9IG5ldyBTdG9yeVBvaW50SW5mb0ltcGwoXG4gICAgICAgIHJlc3BvbnNlLmNhcHRpb24sXG4gICAgICAgIHJlc3BvbnNlLmluZGV4LFxuICAgICAgICByZXNwb25zZS5zdG9yeVBvaW50SWQsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICByZXNwb25zZS51cGRhdGVkLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICAgIHJldHVybiBzdG9yeVBvaW50SW5mb0ltcGw7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJQZW5kaW5nUHJvbWlzZXMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2RlZmVycmVkKSB7XG4gICAgICB0aGlzLl9kZWZlcnJlZC5yZWplY3QoJ0FsbCBwZW5kaW5nIHByb21pc2VzIGNsZWFyZWQnKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBDb250YWluZWRTaGVldEluZm9Nb2RlbCwgU2hlZXRJbmZvLCBTaGVldFBhdGgsIFZpc3VhbElkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uL1RhYmxlYXVFcnJvcic7XG5pbXBvcnQgeyBTaGVldFV0aWxzIH0gZnJvbSAnLi4vVXRpbHMvU2hlZXRVdGlscyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRJbXBsIH0gZnJvbSAnLi9EYXNoYm9hcmRJbXBsJztcbmltcG9ydCB7IFNoZWV0SW1wbCB9IGZyb20gJy4vU2hlZXRJbXBsJztcbmltcG9ydCB7IFNoZWV0SW5mb0ltcGwgfSBmcm9tICcuL1NoZWV0SW5mb0ltcGwnO1xuaW1wb3J0IHsgU3RvcnlJbXBsIH0gZnJvbSAnLi9TdG9yeUltcGwnO1xuaW1wb3J0IHsgU3RvcnlQb2ludEluZm9JbXBsIH0gZnJvbSAnLi9TdG9yeVBvaW50SW5mb0ltcGwnO1xuaW1wb3J0IHsgV29ya3NoZWV0SW1wbCB9IGZyb20gJy4vV29ya3NoZWV0SW1wbCc7XG5cbmV4cG9ydCBjbGFzcyBTdG9yeVBvaW50SW1wbCB7XG4gIHByaXZhdGUgX2NvbnRhaW5lZFNoZWV0SW1wbDogU2hlZXRJbXBsO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9zdG9yeVBvaW50SW5mb0ltcGw6IFN0b3J5UG9pbnRJbmZvSW1wbCxcbiAgICBzaGVldEluZm9zOiBBcnJheTxTaGVldEluZm8+LFxuICAgIHJlZ2lzdHJ5SWQ6IG51bWJlcixcbiAgICBjb250YWluZWRTaGVldEluZm8/OiBDb250YWluZWRTaGVldEluZm9Nb2RlbCxcbiAgKSB7XG4gICAgaWYgKGNvbnRhaW5lZFNoZWV0SW5mbykge1xuICAgICAgdGhpcy5fY29udGFpbmVkU2hlZXRJbXBsID0gdGhpcy5jcmVhdGVDb250YWluZWRTaGVldChjb250YWluZWRTaGVldEluZm8sIHNoZWV0SW5mb3MsIHJlZ2lzdHJ5SWQpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW5kZXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fc3RvcnlQb2ludEluZm9JbXBsLmluZGV4O1xuICB9XG5cbiAgcHVibGljIGdldCBjYXB0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3J5UG9pbnRJbmZvSW1wbC5jYXB0aW9uO1xuICB9XG5cbiAgcHVibGljIGdldCBhY3RpdmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3J5UG9pbnRJbmZvSW1wbC5hY3RpdmU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHVwZGF0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3J5UG9pbnRJbmZvSW1wbC51cGRhdGVkO1xuICB9XG5cbiAgcHVibGljIHNldCB1cGRhdGVkKHVwZGF0ZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9zdG9yeVBvaW50SW5mb0ltcGwudXBkYXRlZCA9IHVwZGF0ZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBhcmVudFN0b3J5KCk6IFN0b3J5SW1wbCB7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3J5UG9pbnRJbmZvSW1wbC5wYXJlbnRTdG9yeTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY29udGFpbmVkU2hlZXQoKTogU2hlZXRJbXBsIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fY29udGFpbmVkU2hlZXRJbXBsO1xuICB9XG5cbiAgcHVibGljIGdldCBzdG9yeVBvaW50SWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fc3RvcnlQb2ludEluZm9JbXBsLnN0b3J5UG9pbnRJZDtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQ29udGFpbmVkU2hlZXQoY29udGFpbmVkU2hlZXRJbmZvOiBDb250YWluZWRTaGVldEluZm9Nb2RlbCwgc2hlZXRJbmZvczogQXJyYXk8U2hlZXRJbmZvPiwgcmVnaXN0cnlJZDogbnVtYmVyKTogU2hlZXRJbXBsIHtcbiAgICBjb25zdCBjb250YWluZWRTaGVldElkeCA9IC0xO1xuXG4gICAgY29uc3QgcHVibGlzaGVkU2hlZXRJbmZvID0gU2hlZXRVdGlscy5nZXRQdWJsaXNoZWRTaGVldEluZm9CeU5hbWUoY29udGFpbmVkU2hlZXRJbmZvLm5hbWUsIHNoZWV0SW5mb3MpO1xuICAgIGNvbnN0IGNvbnRhaW5lZFNoZWV0U2l6ZSA9IFNoZWV0VXRpbHMuY3JlYXRlQXV0b21hdGljU2l6ZSgpO1xuICAgIGNvbnN0IGlzQ29udGFpbmVkU2hlZXRIaWRkZW4gPSBwdWJsaXNoZWRTaGVldEluZm8gPT09IHVuZGVmaW5lZDtcbiAgICBjb25zdCBjb250YWluZWRTaGVldFVybCA9IHB1Ymxpc2hlZFNoZWV0SW5mbyA/IHB1Ymxpc2hlZFNoZWV0SW5mby51cmwgOiAnJztcbiAgICAvLyBDb250YWluZWQgc2hlZXRzIGFyZW4ndCBhY3RpdmUgLSB0aGUgY29udGFpbmluZyBzaGVldCBpcyBhY3RpdmUuXG4gICAgY29uc3QgY29udGFpbmVkU2hlZXRBY3RpdmUgPSBmYWxzZTtcblxuICAgIGNvbnN0IGNvbnRhaW5lZFNoZWV0SW5mb0ltcGwgPSBuZXcgU2hlZXRJbmZvSW1wbChcbiAgICAgIGNvbnRhaW5lZFNoZWV0SW5mby5uYW1lLFxuICAgICAgU2hlZXRVdGlscy5nZXRTaGVldFR5cGVFbnVtKGNvbnRhaW5lZFNoZWV0SW5mby5zaGVldFR5cGUpLFxuICAgICAgY29udGFpbmVkU2hlZXRTaXplLFxuICAgICAgY29udGFpbmVkU2hlZXRJZHgsXG4gICAgICBjb250YWluZWRTaGVldEFjdGl2ZSxcbiAgICAgIGlzQ29udGFpbmVkU2hlZXRIaWRkZW4sXG4gICAgICBjb250YWluZWRTaGVldFVybCxcbiAgICApO1xuXG4gICAgbGV0IHNoZWV0SW1wbDogU2hlZXRJbXBsO1xuICAgIHN3aXRjaCAoY29udGFpbmVkU2hlZXRJbmZvSW1wbC5zaGVldFR5cGUpIHtcbiAgICAgIGNhc2UgQ29udHJhY3QuU2hlZXRUeXBlLldvcmtzaGVldDoge1xuICAgICAgICBjb25zdCB2aXpJZDogVmlzdWFsSWQgPSB7XG4gICAgICAgICAgd29ya3NoZWV0OiBjb250YWluZWRTaGVldEluZm9JbXBsLm5hbWUsXG4gICAgICAgIH07XG5cbiAgICAgICAgc2hlZXRJbXBsID0gbmV3IFdvcmtzaGVldEltcGwoY29udGFpbmVkU2hlZXRJbmZvSW1wbCwgcmVnaXN0cnlJZCwgdml6SWQsIG51bGwsIHRoaXMpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgQ29udHJhY3QuU2hlZXRUeXBlLkRhc2hib2FyZDoge1xuICAgICAgICBjb25zdCBzaGVldFBhdGg6IFNoZWV0UGF0aCA9IHtcbiAgICAgICAgICBzaGVldE5hbWU6IGNvbnRhaW5lZFNoZWV0SW5mb0ltcGwubmFtZSxcbiAgICAgICAgICBpc0Rhc2hib2FyZDogdHJ1ZSxcbiAgICAgICAgfTtcblxuICAgICAgICBzaGVldEltcGwgPSBuZXcgRGFzaGJvYXJkSW1wbChjb250YWluZWRTaGVldEluZm9JbXBsLCBjb250YWluZWRTaGVldEluZm8uZGFzaGJvYXJkWm9uZXMsIHNoZWV0UGF0aCwgcmVnaXN0cnlJZCwgdGhpcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LlNoYXJlZEVycm9yQ29kZXMuU2VydmVyRXJyb3IsICdJbnZhbGlkIFNoZWV0VHlwZScpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzaGVldEltcGw7XG4gIH1cbn1cbiIsImltcG9ydCB7IFN0b3J5SW1wbCB9IGZyb20gJy4vU3RvcnlJbXBsJztcblxuZXhwb3J0IGNsYXNzIFN0b3J5UG9pbnRJbmZvSW1wbCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9jYXB0aW9uOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBfaW5kZXg6IG51bWJlcixcbiAgICBwcml2YXRlIF9zdG9yeVBvaW50SWQ6IG51bWJlcixcbiAgICBwcml2YXRlIF9hY3RpdmU6IGJvb2xlYW4sXG4gICAgcHJpdmF0ZSBfdXBkYXRlZDogYm9vbGVhbixcbiAgICBwcml2YXRlIF9wYXJlbnRTdG9yeUltcGw6IFN0b3J5SW1wbCxcbiAgKSB7fVxuXG4gIHB1YmxpYyBnZXQgY2FwdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fY2FwdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgY2FwdGlvbihjYXB0aW9uOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9jYXB0aW9uID0gY2FwdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW5kZXgoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2luZGV4O1xuICB9XG5cbiAgcHVibGljIHNldCBpbmRleChpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5faW5kZXggPSBpbmRleDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc3RvcnlQb2ludElkKCkge1xuICAgIHJldHVybiB0aGlzLl9zdG9yeVBvaW50SWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFjdGl2ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlO1xuICB9XG5cbiAgcHVibGljIHNldCBhY3RpdmUoaXNBY3RpdmU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9hY3RpdmUgPSBpc0FjdGl2ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdXBkYXRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdXBkYXRlZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgdXBkYXRlZChpc1VwZGF0ZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl91cGRhdGVkID0gaXNVcGRhdGVkO1xuICB9XG5cbiAgcHVibGljIGdldCBwYXJlbnRTdG9yeSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50U3RvcnlJbXBsO1xuICB9XG59XG4iLCJleHBvcnQgY2xhc3MgV29ya2Jvb2tJbXBsIHt9XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQXBpTWVudVR5cGUsXG4gIENvbnRleHRNZW51T3B0aW9ucyxcbiAgRGF0ZVJhbmdlVHlwZSxcbiAgRXJyb3JDb2RlcyxcbiAgRmlsdGVyTnVsbE9wdGlvbixcbiAgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gIFBlcmlvZFR5cGUsXG4gIFNlbGVjdGlvblVwZGF0ZVR5cGUsXG4gIFNoYXJlZEVycm9yQ29kZXMsXG4gIFRvb2x0aXBDb250ZXh0LFxufSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGF0YVNjaGVtYSwgRGF0YVNvdXJjZSBhcyBEYXRhU291cmNlSW5mbywgVmlzdWFsSWQsIFdvcmtzaGVldERhdGFTb3VyY2VJbmZvIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IERhdGFTb3VyY2UgfSBmcm9tICcuLi9EYXRhU291cmNlJztcbmltcG9ydCB7IExvZ2ljYWxUYWJsZSB9IGZyb20gJy4uL0xvZ2ljYWxUYWJsZSc7XG5pbXBvcnQgeyBBY2Nlc3NpYmlsaXR5U2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0FjY2Vzc2liaWxpdHlTZXJ2aWNlJztcbmltcG9ydCB7IEFubm90YXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvQW5ub3RhdGlvblNlcnZpY2UnO1xuaW1wb3J0IHsgRGF0YVNvdXJjZVNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9EYXRhU291cmNlU2VydmljZSc7XG5pbXBvcnQgeyBFeHRlcm5hbENvbnRleHRNZW51U2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0V4dGVybmFsQ29udGV4dE1lbnVTZXJ2aWNlJztcbmltcG9ydCB7IEZpbHRlclNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9GaWx0ZXJTZXJ2aWNlJztcbmltcG9ydCB7IEdldERhdGFTZXJ2aWNlLCBHZXREYXRhVHlwZSB9IGZyb20gJy4uL1NlcnZpY2VzL0dldERhdGFTZXJ2aWNlJztcbmltcG9ydCB7IFNlbGVjdGlvblNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZWxlY3Rpb25TZXJ2aWNlJztcbmltcG9ydCB7IEFwaVNlcnZpY2VSZWdpc3RyeSwgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFZpc3VhbE1vZGVsU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL1Zpc3VhbE1vZGVsU2VydmljZSc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgRXJyb3JIZWxwZXJzIH0gZnJvbSAnLi4vVXRpbHMvRXJyb3JIZWxwZXJzJztcbmltcG9ydCB7IERhc2hib2FyZEltcGwgfSBmcm9tICcuL0Rhc2hib2FyZEltcGwnO1xuaW1wb3J0IHsgRGF0YVNvdXJjZUltcGwgfSBmcm9tICcuL0RhdGFTb3VyY2VJbXBsJztcbmltcG9ydCB7IFNoZWV0SW1wbCB9IGZyb20gJy4vU2hlZXRJbXBsJztcbmltcG9ydCB7IFNoZWV0SW5mb0ltcGwgfSBmcm9tICcuL1NoZWV0SW5mb0ltcGwnO1xuaW1wb3J0IHsgU3RvcnlQb2ludEltcGwgfSBmcm9tICcuL1N0b3J5UG9pbnRJbXBsJztcblxuZXhwb3J0IGNsYXNzIFdvcmtzaGVldEltcGwgZXh0ZW5kcyBTaGVldEltcGwge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgc2hlZXRJbmZvSW1wbDogU2hlZXRJbmZvSW1wbCxcbiAgICBfcmVnaXN0cnlJZDogbnVtYmVyLFxuICAgIHByaXZhdGUgX3Zpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBwcml2YXRlIF9wYXJlbnREYXNoYm9hcmRJbXBsOiBEYXNoYm9hcmRJbXBsIHwgbnVsbCxcbiAgICBwcml2YXRlIF9wYXJlbnRTdG9yeVBvaW50SW1wbDogU3RvcnlQb2ludEltcGwgfCBudWxsLFxuICAgIHByaXZhdGUgX2JhY2tncm91bmRDb2xvcjogc3RyaW5nIHwgbnVsbCA9IG51bGwsXG4gICAgcHJpdmF0ZSBfZm9ybWF0dGluZzogQ29udHJhY3QuV29ya2Jvb2tGb3JtYXR0aW5nIHwgbnVsbCA9IG51bGwsXG4gICkge1xuICAgIHN1cGVyKHNoZWV0SW5mb0ltcGwsIF9yZWdpc3RyeUlkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcGFyZW50RGFzaGJvYXJkKCk6IERhc2hib2FyZEltcGwgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50RGFzaGJvYXJkSW1wbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcGFyZW50U3RvcnlQb2ludCgpOiBTdG9yeVBvaW50SW1wbCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9wYXJlbnRTdG9yeVBvaW50SW1wbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdmlzdWFsSWQoKTogVmlzdWFsSWQge1xuICAgIHJldHVybiB0aGlzLl92aXN1YWxJZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRNYXhQYWdlUm93TGltaXQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gMTAwMDA7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGJhY2tncm91bmRDb2xvcigpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fYmFja2dyb3VuZENvbG9yO1xuICB9XG5cbiAgcHVibGljIGdldCBmb3JtYXR0aW5nKCk6IENvbnRyYWN0LldvcmtzaGVldEZvcm1hdHRpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybWF0dGluZztcbiAgfVxuXG4gIHB1YmxpYyBhcHBseUZpbHRlckFzeW5jKFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHZhbHVlczogQXJyYXk8c3RyaW5nPixcbiAgICB1cGRhdGVUeXBlOiBDb250cmFjdC5GaWx0ZXJVcGRhdGVUeXBlLFxuICAgIG9wdGlvbnM6IENvbnRyYWN0LkZpbHRlck9wdGlvbnMsXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUVudW1WYWx1ZTxDb250cmFjdC5GaWx0ZXJVcGRhdGVUeXBlPih1cGRhdGVUeXBlLCBDb250cmFjdC5GaWx0ZXJVcGRhdGVUeXBlLCAnQ29udHJhY3QuRmlsdGVyVXBkYXRlVHlwZScpO1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RmlsdGVyU2VydmljZT4oU2VydmljZU5hbWVzLkZpbHRlcik7XG4gICAgcmV0dXJuIHNlcnZpY2UuYXBwbHlGaWx0ZXJBc3luYyh0aGlzLnZpc3VhbElkLCBmaWVsZE5hbWUsIHZhbHVlcywgdXBkYXRlVHlwZSwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlSYW5nZUZpbHRlckFzeW5jKGZpZWxkTmFtZTogc3RyaW5nLCBmaWx0ZXJPcHRpb25zOiBDb250cmFjdC5SYW5nZUZpbHRlck9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIoZmllbGROYW1lLCAnZmllbGROYW1lJyk7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihmaWx0ZXJPcHRpb25zLCAnZmlsdGVyT3B0aW9ucycpO1xuICAgIGlmIChmaWx0ZXJPcHRpb25zLm51bGxPcHRpb24pIHtcbiAgICAgIEVycm9ySGVscGVycy52ZXJpZnlFbnVtVmFsdWU8RmlsdGVyTnVsbE9wdGlvbj4oZmlsdGVyT3B0aW9ucy5udWxsT3B0aW9uLCBGaWx0ZXJOdWxsT3B0aW9uLCAnRmlsdGVyTnVsbE9wdGlvbicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBFcnJvckhlbHBlcnMudmVyaWZ5UmFuZ2VQYXJhbVR5cGUoZmlsdGVyT3B0aW9ucy5taW4sIGZpbHRlck9wdGlvbnMubWF4KTtcbiAgICB9XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxGaWx0ZXJTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRmlsdGVyKTtcbiAgICByZXR1cm4gc2VydmljZS5hcHBseVJhbmdlRmlsdGVyQXN5bmModGhpcy52aXN1YWxJZCwgZmllbGROYW1lLCBmaWx0ZXJPcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseUhpZXJhcmNoaWNhbEZpbHRlckFzeW5jKFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHZhbHVlczogQXJyYXk8c3RyaW5nPiB8IENvbnRyYWN0LkhpZXJhcmNoaWNhbExldmVscyxcbiAgICB1cGRhdGVUeXBlOiBDb250cmFjdC5GaWx0ZXJVcGRhdGVUeXBlLFxuICAgIG9wdGlvbnM6IENvbnRyYWN0LkZpbHRlck9wdGlvbnMsXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihmaWVsZE5hbWUsICdmaWVsZE5hbWUnKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKHZhbHVlcywgJ3ZhbHVlcycpO1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlFbnVtVmFsdWU8Q29udHJhY3QuRmlsdGVyVXBkYXRlVHlwZT4odXBkYXRlVHlwZSwgQ29udHJhY3QuRmlsdGVyVXBkYXRlVHlwZSwgJ0NvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGUnKTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWVzKSAmJiAhdmFsdWVzLmxldmVscykge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihcbiAgICAgICAgRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLFxuICAgICAgICAndmFsdWVzIHBhcmFtZXRlciBmb3IgYXBwbHlIaWVyYXJjaGljYWxGaWx0ZXJBc3luYyBtdXN0IGJlIGFuIGFycmF5IG9yIGNvbnRhaW4gYSBsZXZlbHMga2V5JyxcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RmlsdGVyU2VydmljZT4oU2VydmljZU5hbWVzLkZpbHRlcik7XG4gICAgcmV0dXJuIHNlcnZpY2UuYXBwbHlIaWVyYXJjaGljYWxGaWx0ZXJBc3luYyh0aGlzLnZpc3VhbElkLCBmaWVsZE5hbWUsIHZhbHVlcywgdXBkYXRlVHlwZSwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJGaWx0ZXJBc3luYyhmaWVsZE5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihmaWVsZE5hbWUsICdmaWVsZE5hbWUnKTtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEZpbHRlclNlcnZpY2U+KFNlcnZpY2VOYW1lcy5GaWx0ZXIpO1xuICAgIHJldHVybiBzZXJ2aWNlLmNsZWFyRmlsdGVyQXN5bmModGhpcy52aXN1YWxJZCwgZmllbGROYW1lKTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseVJlbGF0aXZlRGF0ZUZpbHRlckFzeW5jKGZpZWxkTmFtZTogc3RyaW5nLCBvcHRpb25zOiBDb250cmFjdC5SZWxhdGl2ZURhdGVGaWx0ZXJPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5U3RyaW5nUGFyYW1ldGVyKGZpZWxkTmFtZSwgJ2ZpZWxkTmFtZScpO1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIob3B0aW9ucywgJ29wdGlvbnMnKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPFBlcmlvZFR5cGU+KG9wdGlvbnMucGVyaW9kVHlwZSwgUGVyaW9kVHlwZSwgJ1BlcmlvZFR5cGUnKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPERhdGVSYW5nZVR5cGU+KG9wdGlvbnMucmFuZ2VUeXBlLCBEYXRlUmFuZ2VUeXBlLCAnRGF0ZVJhbmdlVHlwZScpO1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RmlsdGVyU2VydmljZT4oU2VydmljZU5hbWVzLkZpbHRlcik7XG4gICAgcmV0dXJuIHNlcnZpY2UuYXBwbHlSZWxhdGl2ZURhdGVGaWx0ZXJBc3luYyh0aGlzLnZpc3VhbElkLCBmaWVsZE5hbWUsIG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGdldERhdGFTb3VyY2VzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5EYXRhU291cmNlPj4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RGF0YVNvdXJjZVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5EYXRhU291cmNlU2VydmljZSk7XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0RGF0YVNvdXJjZXNBc3luYyh0aGlzLnZpc3VhbElkKS50aGVuPEFycmF5PENvbnRyYWN0LkRhdGFTb3VyY2U+PigocmVzdWx0KSA9PiB7XG4gICAgICBjb25zdCBkYXRhU2NoZW1hOiBEYXRhU2NoZW1hID0gcmVzdWx0O1xuICAgICAgY29uc3Qgd29ya3NoZWV0RGF0YVNvdXJjZUluZm86IFdvcmtzaGVldERhdGFTb3VyY2VJbmZvID0gZGF0YVNjaGVtYS53b3Jrc2hlZXREYXRhU2NoZW1hTWFwW3RoaXMubmFtZV07XG5cbiAgICAgIGNvbnN0IGRhdGFTb3VyY2VzOiBBcnJheTxDb250cmFjdC5EYXRhU291cmNlPiA9IFtdO1xuXG4gICAgICAvLyBGaXJzdCwgYWRkIHRoZSBwcmltYXJ5IGRhdGFzb3VyY2UuICBCeSBjb252ZW50aW9uLCBpdCBjb21lcyBmaXJzdCBpbiB0aGUgcmV0dXJuZWQgYXJyYXkuXG4gICAgICBjb25zdCBwcmltYXJ5SWQ6IHN0cmluZyA9IHdvcmtzaGVldERhdGFTb3VyY2VJbmZvLnByaW1hcnlEYXRhU291cmNlO1xuICAgICAgZGF0YVNvdXJjZXMucHVzaCh0aGlzLmNyZWF0ZURhdGFTb3VyY2VGcm9tSW5mbyhkYXRhU2NoZW1hLmRhdGFTb3VyY2VzW3ByaW1hcnlJZF0pKTtcblxuICAgICAgLy8gVGhlbiwgbG9vcCB0aHJvdWdoIGFueSBzZWNvbmRhcnkgZGF0YSBzb3VyY2VzIGFuZCBhZGQgdGhlbS5cbiAgICAgIGZvciAoY29uc3Qgc2Vjb25kYXJ5SWQgb2Ygd29ya3NoZWV0RGF0YVNvdXJjZUluZm8ucmVmZXJlbmNlZERhdGFTb3VyY2VMaXN0KSB7XG4gICAgICAgIGlmIChzZWNvbmRhcnlJZCAhPT0gcHJpbWFyeUlkKSB7XG4gICAgICAgICAgZGF0YVNvdXJjZXMucHVzaCh0aGlzLmNyZWF0ZURhdGFTb3VyY2VGcm9tSW5mbyhkYXRhU2NoZW1hLmRhdGFTb3VyY2VzW3NlY29uZGFyeUlkXSkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkYXRhU291cmNlcztcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRGaWx0ZXJzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5GaWx0ZXI+PiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxGaWx0ZXJTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRmlsdGVyKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRGaWx0ZXJzQXN5bmModGhpcy52aXN1YWxJZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2VsZWN0ZWRNYXJrc0FzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuTWFya3NDb2xsZWN0aW9uPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIHJldHVybiBzZXJ2aWNlLmdldFNlbGVjdGVkTWFya3NBc3luYyh0aGlzLnZpc3VhbElkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRIaWdobGlnaHRlZE1hcmtzQXN5bmMoKTogUHJvbWlzZTxDb250cmFjdC5NYXJrc0NvbGxlY3Rpb24+IHtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEdldERhdGFTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuR2V0RGF0YSk7XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0SGlnaGxpZ2h0ZWRNYXJrc0FzeW5jKHRoaXMudmlzdWFsSWQpO1xuICB9XG5cbiAgcHVibGljIGdldFN1bW1hcnlEYXRhQXN5bmMob3B0aW9uczogQ29udHJhY3QuR2V0U3VtbWFyeURhdGFPcHRpb25zKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+IHtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEdldERhdGFTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuR2V0RGF0YSk7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICByZXR1cm4gc2VydmljZS5nZXRVbmRlcmx5aW5nRGF0YUFzeW5jKFxuICAgICAgdGhpcy52aXN1YWxJZCxcbiAgICAgIEdldERhdGFUeXBlLlN1bW1hcnksXG4gICAgICAhIW9wdGlvbnMuaWdub3JlQWxpYXNlcyxcbiAgICAgICEhb3B0aW9ucy5pZ25vcmVTZWxlY3Rpb24sXG4gICAgICB0cnVlLFxuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlQnlJZCB8fCBbXSxcbiAgICAgIG9wdGlvbnMubWF4Um93cyB8fCAwLFxuICAgICAgb3B0aW9ucy5pbmNsdWRlRGF0YVZhbHVlc09wdGlvbiB8fCBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbi5BbGxWYWx1ZXMsXG4gICAgICBvcHRpb25zLmFwcGx5V29ya3NoZWV0Rm9ybWF0dGluZyA/PyBmYWxzZSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdldFN1bW1hcnlEYXRhUmVhZGVyQXN5bmMocGFnZVJvd0NvdW50OiBudW1iZXIsIG9wdGlvbnM6IENvbnRyYWN0LkdldFN1bW1hcnlEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlUmVhZGVyPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0U3VtbWFyeURhdGFSZWFkZXJBc3luYyhcbiAgICAgIHRoaXMudmlzdWFsSWQsXG4gICAgICBwYWdlUm93Q291bnQgfHwgdGhpcy5nZXRNYXhQYWdlUm93TGltaXQoKSxcbiAgICAgICEhb3B0aW9ucy5pZ25vcmVBbGlhc2VzLFxuICAgICAgISFvcHRpb25zLmlnbm9yZVNlbGVjdGlvbixcbiAgICAgIHRydWUsIC8vIGluY2x1ZGVBbGxDb2x1bW5zIChjYW4gYmUgb3ZlcnJpZGRlbiBieSBjb2x1bW5zVG9JbmNsdWRlQnlJZClcbiAgICAgIG9wdGlvbnMuY29sdW1uc1RvSW5jbHVkZUJ5SWQgfHwgW10sXG4gICAgICBvcHRpb25zLmluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uIHx8IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLkFsbFZhbHVlcyxcbiAgICAgIG9wdGlvbnMuYXBwbHlXb3Jrc2hlZXRGb3JtYXR0aW5nID8/IGZhbHNlLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VmlzdWFsU3BlY2lmaWNhdGlvbkFzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuVmlzdWFsU3BlY2lmaWNhdGlvbj4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8VmlzdWFsTW9kZWxTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuVmlzdWFsTW9kZWwpO1xuXG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0VmlzdWFsU3BlY2lmaWNhdGlvbkFzeW5jKHRoaXMudmlzdWFsSWQpO1xuICB9XG5cbiAgcHVibGljIGFkZE1hcmtzQ2FyZEZpZWxkc0FzeW5jKFxuICAgIG1hcmtzQ2FyZEluZGV4OiBudW1iZXIsXG4gICAgZW5jb2RpbmdUeXBlOiBDb250cmFjdC5FbmNvZGluZ1R5cGUsXG4gICAgY29sdW1uczogQXJyYXk8Q29udHJhY3QuQ29sdW1uPixcbiAgICBzdGFydEluZGV4OiBudW1iZXIsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8VmlzdWFsTW9kZWxTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuVmlzdWFsTW9kZWwpO1xuXG4gICAgcmV0dXJuIHNlcnZpY2UuYWRkTWFya3NDYXJkRmllbGRzQXN5bmModGhpcy52aXN1YWxJZCwgbWFya3NDYXJkSW5kZXgsIGVuY29kaW5nVHlwZSwgY29sdW1ucywgc3RhcnRJbmRleCk7XG4gIH1cblxuICBwdWJsaWMgbW92ZU1hcmtzQ2FyZEZpZWxkQXN5bmMobWFya3NDYXJkSW5kZXg6IG51bWJlciwgZnJvbUluZGV4OiBudW1iZXIsIHRvSW5kZXg6IG51bWJlciwgZmllbGRDb3VudDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxWaXN1YWxNb2RlbFNlcnZpY2U+KFNlcnZpY2VOYW1lcy5WaXN1YWxNb2RlbCk7XG5cbiAgICByZXR1cm4gc2VydmljZS5tb3ZlTWFya3NDYXJkRmllbGRBc3luYyh0aGlzLnZpc3VhbElkLCBtYXJrc0NhcmRJbmRleCwgZnJvbUluZGV4LCB0b0luZGV4LCBmaWVsZENvdW50KTtcbiAgfVxuXG4gIHB1YmxpYyBzcGxpY2VNYXJrc0NhcmRGaWVsZHNBc3luYyhcbiAgICBtYXJrc0NhcmRJbmRleDogbnVtYmVyLFxuICAgIGVuY29kaW5nVHlwZTogQ29udHJhY3QuRW5jb2RpbmdUeXBlLFxuICAgIHN0YXJ0SW5kZXg6IG51bWJlcixcbiAgICBkZWxldGVDb3VudDogbnVtYmVyLFxuICAgIGNvbHVtbnM6IEFycmF5PENvbnRyYWN0LkNvbHVtbj4sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8VmlzdWFsTW9kZWxTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuVmlzdWFsTW9kZWwpO1xuXG4gICAgcmV0dXJuIHNlcnZpY2Uuc3BsaWNlTWFya3NDYXJkRmllbGRzQXN5bmModGhpcy52aXN1YWxJZCwgbWFya3NDYXJkSW5kZXgsIGVuY29kaW5nVHlwZSwgc3RhcnRJbmRleCwgZGVsZXRlQ291bnQsIGNvbHVtbnMpO1xuICB9XG5cbiAgcHVibGljIGdldFN1bW1hcnlDb2x1bW5zSW5mb0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuQ29sdW1uPj4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8R2V0RGF0YVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5HZXREYXRhKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRTdW1tYXJ5Q29sdW1uc0luZm9Bc3luYyh0aGlzLnZpc3VhbElkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmRlcmx5aW5nRGF0YUFzeW5jKG9wdGlvbnM6IENvbnRyYWN0LkdldFVuZGVybHlpbmdEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIHJldHVybiBzZXJ2aWNlLmdldFVuZGVybHlpbmdEYXRhQXN5bmMoXG4gICAgICB0aGlzLnZpc3VhbElkLFxuICAgICAgR2V0RGF0YVR5cGUuVW5kZXJseWluZyxcbiAgICAgICEhb3B0aW9ucy5pZ25vcmVBbGlhc2VzLFxuICAgICAgISFvcHRpb25zLmlnbm9yZVNlbGVjdGlvbixcbiAgICAgICEhb3B0aW9ucy5pbmNsdWRlQWxsQ29sdW1ucyxcbiAgICAgIG9wdGlvbnMuY29sdW1uc1RvSW5jbHVkZUJ5SWQgfHwgW10sXG4gICAgICBvcHRpb25zLm1heFJvd3MgfHwgMCxcbiAgICAgIG9wdGlvbnMuaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gfHwgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uQWxsVmFsdWVzLFxuICAgICAgb3B0aW9ucy5hcHBseVdvcmtzaGVldEZvcm1hdHRpbmcgPz8gZmFsc2UsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmRlcmx5aW5nVGFibGVzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5Mb2dpY2FsVGFibGU+PiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxEYXRhU291cmNlU2VydmljZT4oU2VydmljZU5hbWVzLkRhdGFTb3VyY2VTZXJ2aWNlKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRVbmRlcmx5aW5nVGFibGVzQXN5bmModGhpcy52aXN1YWxJZCkudGhlbjxBcnJheTxDb250cmFjdC5Mb2dpY2FsVGFibGU+PigobG9naWNhbFRhYmxlSW5mb3MpID0+IHtcbiAgICAgIHJldHVybiBsb2dpY2FsVGFibGVJbmZvcy5tYXAoKGxvZ2ljYWxUYWJsZUluZm8pID0+IG5ldyBMb2dpY2FsVGFibGUobG9naWNhbFRhYmxlSW5mbykpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldFVuZGVybHlpbmdUYWJsZURhdGFBc3luYyhsb2dpY2FsVGFibGVJZDogc3RyaW5nLCBvcHRpb25zPzogQ29udHJhY3QuR2V0VW5kZXJseWluZ0RhdGFPcHRpb25zKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+IHtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEdldERhdGFTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuR2V0RGF0YSk7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0VW5kZXJseWluZ1RhYmxlRGF0YUFzeW5jKFxuICAgICAgdGhpcy52aXN1YWxJZCxcbiAgICAgIGxvZ2ljYWxUYWJsZUlkLFxuICAgICAgISFvcHRpb25zLmlnbm9yZUFsaWFzZXMsXG4gICAgICAhIW9wdGlvbnMuaWdub3JlU2VsZWN0aW9uLFxuICAgICAgISFvcHRpb25zLmluY2x1ZGVBbGxDb2x1bW5zLFxuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlQnlJZCB8fCBbXSxcbiAgICAgIG9wdGlvbnMubWF4Um93cyB8fCAwLFxuICAgICAgb3B0aW9ucy5pbmNsdWRlRGF0YVZhbHVlc09wdGlvbiB8fCBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbi5BbGxWYWx1ZXMsXG4gICAgICBvcHRpb25zLmFwcGx5V29ya3NoZWV0Rm9ybWF0dGluZyA/PyBmYWxzZSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdldFVuZGVybHlpbmdUYWJsZURhdGFSZWFkZXJBc3luYyhcbiAgICBsb2dpY2FsVGFibGVJZDogc3RyaW5nLFxuICAgIHBhZ2VSb3dDb3VudD86IG51bWJlcixcbiAgICBvcHRpb25zPzogQ29udHJhY3QuR2V0VW5kZXJseWluZ0RhdGFPcHRpb25zLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZVJlYWRlcj4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8R2V0RGF0YVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5HZXREYXRhKTtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRVbmRlcmx5aW5nVGFibGVEYXRhUmVhZGVyQXN5bmMoXG4gICAgICB0aGlzLnZpc3VhbElkLFxuICAgICAgbG9naWNhbFRhYmxlSWQsXG4gICAgICBwYWdlUm93Q291bnQgfHwgdGhpcy5nZXRNYXhQYWdlUm93TGltaXQoKSxcbiAgICAgICEhb3B0aW9ucy5pZ25vcmVBbGlhc2VzLFxuICAgICAgISFvcHRpb25zLmlnbm9yZVNlbGVjdGlvbixcbiAgICAgICEhb3B0aW9ucy5pbmNsdWRlQWxsQ29sdW1ucyxcbiAgICAgIG9wdGlvbnMuY29sdW1uc1RvSW5jbHVkZUJ5SWQgfHwgW10sXG4gICAgICBvcHRpb25zLmluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uIHx8IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLkFsbFZhbHVlcyxcbiAgICAgIG9wdGlvbnMuYXBwbHlXb3Jrc2hlZXRGb3JtYXR0aW5nID8/IGZhbHNlLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJTZWxlY3RlZE1hcmtzQXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxTZWxlY3Rpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuU2VsZWN0aW9uKTtcbiAgICByZXR1cm4gc2VydmljZS5jbGVhclNlbGVjdGVkTWFya3NBc3luYyh0aGlzLnZpc3VhbElkKTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RNYXJrc0J5VmFsdWVBc3luYyhzZWxlY3Rpb25zOiBBcnJheTxDb250cmFjdC5TZWxlY3Rpb25Dcml0ZXJpYT4sIHNlbGVjdGlvblVwZGF0ZVR5cGU6IFNlbGVjdGlvblVwZGF0ZVR5cGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKHNlbGVjdGlvbnMsICdmaWVsZE5hbWUnKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPFNlbGVjdGlvblVwZGF0ZVR5cGU+KHNlbGVjdGlvblVwZGF0ZVR5cGUsIFNlbGVjdGlvblVwZGF0ZVR5cGUsICdTZWxlY3Rpb25VcGRhdGVUeXBlJyk7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxTZWxlY3Rpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuU2VsZWN0aW9uKTtcbiAgICByZXR1cm4gc2VydmljZS5zZWxlY3RNYXJrc0J5VmFsdWVBc3luYyh0aGlzLnZpc3VhbElkLCBzZWxlY3Rpb25zLCBzZWxlY3Rpb25VcGRhdGVUeXBlKTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RNYXJrc0J5SWRBc3luYyhzZWxlY3Rpb25zOiBBcnJheTxDb250cmFjdC5NYXJrSW5mbz4sIHNlbGVjdGlvblVwZGF0ZVR5cGU6IFNlbGVjdGlvblVwZGF0ZVR5cGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKHNlbGVjdGlvbnMsICdmaWVsZE5hbWUnKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPFNlbGVjdGlvblVwZGF0ZVR5cGU+KHNlbGVjdGlvblVwZGF0ZVR5cGUsIFNlbGVjdGlvblVwZGF0ZVR5cGUsICdTZWxlY3Rpb25VcGRhdGVUeXBlJyk7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxTZWxlY3Rpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuU2VsZWN0aW9uKTtcbiAgICByZXR1cm4gc2VydmljZS5zZWxlY3RNYXJrc0J5SWRBc3luYyh0aGlzLnZpc3VhbElkLCBzZWxlY3Rpb25zLCBzZWxlY3Rpb25VcGRhdGVUeXBlKTtcbiAgfVxuXG4gIHB1YmxpYyBhbm5vdGF0ZU1hcmtBc3luYyhtYXJrOiBDb250cmFjdC5NYXJrSW5mbywgYW5ub3RhdGlvblRleHQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIobWFyaywgJ21hcmsnKTtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEFubm90YXRpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuQW5ub3RhdGlvbik7XG4gICAgcmV0dXJuIHNlcnZpY2UuYW5ub3RhdGVNYXJrQXN5bmModGhpcy52aXN1YWxJZCwgbWFyaywgYW5ub3RhdGlvblRleHQpO1xuICB9XG5cbiAgcHVibGljIGdldEFubm90YXRpb25zQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5Bbm5vdGF0aW9uPj4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8QW5ub3RhdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5Bbm5vdGF0aW9uKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRBbm5vdGF0aW9uc0FzeW5jKHRoaXMudmlzdWFsSWQpO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUFubm90YXRpb25Bc3luYyhhbm5vdGF0aW9uOiBDb250cmFjdC5Bbm5vdGF0aW9uKSB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihhbm5vdGF0aW9uLCAnYW5ub3RhdGlvbicpO1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8QW5ub3RhdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5Bbm5vdGF0aW9uKTtcbiAgICByZXR1cm4gc2VydmljZS5yZW1vdmVBbm5vdGF0aW9uQXN5bmModGhpcy52aXN1YWxJZCwgYW5ub3RhdGlvbik7XG4gIH1cblxuICBwdWJsaWMgYXBwZW5kQ29udGV4dE1lbnVBc3luYyh0YXJnZXRNZW51OiBBcGlNZW51VHlwZSwgY29uZmlnOiBDb250ZXh0TWVudU9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RXh0ZXJuYWxDb250ZXh0TWVudVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5FeHRlcm5hbENvbnRleHRNZW51KTtcbiAgICByZXR1cm4gc2VydmljZS5hcHBlbmRDb250ZXh0TWVudUFzeW5jKHRoaXMudmlzdWFsSWQud29ya3NoZWV0LCB0YXJnZXRNZW51LCBjb25maWcpO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUNvbnRleHRNZW51QXN5bmModGFyZ2V0TWVudTogQXBpTWVudVR5cGUsIG1lbnVJdGVtSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RXh0ZXJuYWxDb250ZXh0TWVudVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5FeHRlcm5hbENvbnRleHRNZW51KTtcbiAgICByZXR1cm4gc2VydmljZS5yZW1vdmVDb250ZXh0TWVudUFzeW5jKHRoaXMudmlzdWFsSWQud29ya3NoZWV0LCB0YXJnZXRNZW51LCBtZW51SXRlbUlkKTtcbiAgfVxuXG4gIHB1YmxpYyBleGVjdXRlQ29udGV4dE1lbnVBc3luYyh0YXJnZXRNZW51OiBBcGlNZW51VHlwZSwgbWVudUl0ZW1JZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxFeHRlcm5hbENvbnRleHRNZW51U2VydmljZT4oU2VydmljZU5hbWVzLkV4dGVybmFsQ29udGV4dE1lbnUpO1xuICAgIHJldHVybiBzZXJ2aWNlLmV4ZWN1dGVDb250ZXh0TWVudUFzeW5jKHRoaXMudmlzdWFsSWQud29ya3NoZWV0LCB0YXJnZXRNZW51LCBtZW51SXRlbUlkKTtcbiAgfVxuXG4gIHB1YmxpYyByZW5hbWVDb250ZXh0TWVudUFzeW5jKHRhcmdldE1lbnU6IEFwaU1lbnVUeXBlLCBtZW51SGVhZGVyOiBzdHJpbmcsIG1lbnVEZXNjcmlwdGlvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxFeHRlcm5hbENvbnRleHRNZW51U2VydmljZT4oU2VydmljZU5hbWVzLkV4dGVybmFsQ29udGV4dE1lbnUpO1xuICAgIHJldHVybiBzZXJ2aWNlLnJlbmFtZUNvbnRleHRNZW51QXN5bmModGhpcy52aXN1YWxJZC53b3Jrc2hlZXQsIHRhcmdldE1lbnUsIG1lbnVIZWFkZXIsIG1lbnVEZXNjcmlwdGlvbik7XG4gIH1cblxuICBwdWJsaWMgaG92ZXJUdXBsZUFzeW5jKGhvdmVyZWRUdXBsZT86IG51bWJlciwgdG9vbHRpcD86IFRvb2x0aXBDb250ZXh0IHwgbnVsbCwgYWxsb3dIb3ZlckFjdGlvbnM/OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaXNJbnNpZGVEYXNoYm9hcmRFeHRlbnNpb24oKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KFxuICAgICAgICBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LlNoYXJlZEVycm9yQ29kZXMuSW1wbGVtZW50YXRpb25FcnJvciwgYGhvdmVyVHVwbGVBc3luYyBpcyBub3Qgc3VwcG9ydGVkIGluIGRhc2hib2FyZCBleHRlbnNpb25zYCksXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8U2VsZWN0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLlNlbGVjdGlvbik7XG4gICAgcmV0dXJuIHNlcnZpY2UuaG92ZXJUdXBsZUFzeW5jKHRoaXMudmlzdWFsSWQsIGhvdmVyZWRUdXBsZSwgdG9vbHRpcCwgYWxsb3dIb3ZlckFjdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIHNlbGVjdFR1cGxlc0FzeW5jKHNlbGVjdGVkVHVwbGVzOiBBcnJheTxudW1iZXI+LCBzZWxlY3RPcHRpb246IENvbnRyYWN0LlNlbGVjdE9wdGlvbnMsIHRvb2x0aXA/OiBUb29sdGlwQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmlzSW5zaWRlRGFzaGJvYXJkRXh0ZW5zaW9uKCkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcbiAgICAgICAgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5TaGFyZWRFcnJvckNvZGVzLkltcGxlbWVudGF0aW9uRXJyb3IsIGBzZWxlY3RUdXBsZXNBc3luYyBpcyBub3Qgc3VwcG9ydGVkIGluIGRhc2hib2FyZCBleHRlbnNpb25zYCksXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8U2VsZWN0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLlNlbGVjdGlvbik7XG4gICAgcmV0dXJuIHNlcnZpY2Uuc2VsZWN0VHVwbGVzQXN5bmModGhpcy52aXN1YWxJZCwgc2VsZWN0ZWRUdXBsZXMsIHNlbGVjdE9wdGlvbiwgdG9vbHRpcCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VG9vbHRpcFRleHRBc3luYyh0dXBsZUlkOiBudW1iZXIpOiBQcm9taXNlPFN0cmluZz4ge1xuICAgIGlmICh0aGlzLmlzSW5zaWRlRGFzaGJvYXJkRXh0ZW5zaW9uKCkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcbiAgICAgICAgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5TaGFyZWRFcnJvckNvZGVzLkltcGxlbWVudGF0aW9uRXJyb3IsIGBnZXRUb29sdGlwVGV4dEFzeW5jIGlzIG5vdCBzdXBwb3J0ZWQgaW4gZGFzaGJvYXJkIGV4dGVuc2lvbnNgKSxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8QWNjZXNzaWJpbGl0eVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5BY2Nlc3NpYmlsaXR5KTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRUb29sdGlwVGV4dEFzeW5jKHRoaXMudmlzdWFsSWQsIHR1cGxlSWQpO1xuICB9XG5cbiAgcHVibGljIGxlYXZlTWFya05hdmlnYXRpb25Bc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pc0luc2lkZURhc2hib2FyZEV4dGVuc2lvbigpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXG4gICAgICAgIG5ldyBUYWJsZWF1RXJyb3IoXG4gICAgICAgICAgQ29udHJhY3QuU2hhcmVkRXJyb3JDb2Rlcy5JbXBsZW1lbnRhdGlvbkVycm9yLFxuICAgICAgICAgIGBsZWF2ZU1hcmtOYXZpZ2F0aW9uQXN5bmMgaXMgbm90IHN1cHBvcnRlZCBpbiBkYXNoYm9hcmQgZXh0ZW5zaW9uc2AsXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEFjY2Vzc2liaWxpdHlTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuQWNjZXNzaWJpbGl0eSk7XG4gICAgcmV0dXJuIHNlcnZpY2UubGVhdmVNYXJrTmF2aWdhdGlvbkFzeW5jKHRoaXMudmlzdWFsSWQpO1xuICB9XG5cbiAgcHVibGljIGVkaXRBbGlhc2VzRGlhbG9nQXN5bmMoZmllbGROYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFZpc3VhbE1vZGVsU2VydmljZT4oU2VydmljZU5hbWVzLlZpc3VhbE1vZGVsKTtcbiAgICByZXR1cm4gc2VydmljZS5lZGl0QWxpYXNlc0RpYWxvZ0FzeW5jKGZpZWxkTmFtZSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZURhdGFTb3VyY2VGcm9tSW5mbyhkYXRhU291cmNlSW5mbzogRGF0YVNvdXJjZUluZm8pOiBDb250cmFjdC5EYXRhU291cmNlIHtcbiAgICBjb25zdCBkYXRhU291cmNlSW1wbCA9IG5ldyBEYXRhU291cmNlSW1wbChkYXRhU291cmNlSW5mbywgdGhpcy5fcmVnaXN0cnlJZCk7XG4gICAgY29uc3QgZGF0YVNvdXJjZSA9IG5ldyBEYXRhU291cmNlKGRhdGFTb3VyY2VJbXBsKTtcbiAgICBkYXRhU291cmNlSW1wbC5pbml0aWFsaXplV2l0aFB1YmxpY0ludGVyZmFjZXMoZGF0YVNvdXJjZSk7XG4gICAgcmV0dXJuIGRhdGFTb3VyY2U7XG4gIH1cblxuICBwcml2YXRlIHZlcmlmeUFjdGl2ZVNoZWV0KCkge1xuICAgIGNvbnN0IGlzUm9vdEFuZEFjdGl2ZVdvcmtzaGVldCA9IHRoaXMuYWN0aXZlO1xuICAgIGNvbnN0IGlzSW5zaWRlQWN0aXZlRGFzaGJvYXJkID0gdGhpcy5pc0luc2lkZUFjdGl2ZURhc2hib2FyZCgpO1xuICAgIGNvbnN0IGlzSW5zaWRlQWN0aXZlU3RvcnlQb2ludCA9IHRoaXMuaXNJbnNpZGVBY3RpdmVTdG9yeVBvaW50KCk7XG5cbiAgICBpZiAoIWlzUm9vdEFuZEFjdGl2ZVdvcmtzaGVldCAmJiAhaXNJbnNpZGVBY3RpdmVEYXNoYm9hcmQgJiYgIWlzSW5zaWRlQWN0aXZlU3RvcnlQb2ludCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLk5vdEFjdGl2ZVNoZWV0LCAnT3BlcmF0aW9uIG5vdCBhbGxvd2VkIG9uIG5vbi1hY3RpdmUgc2hlZXQnKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGlzSW5zaWRlQWN0aXZlU3RvcnlQb2ludCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50U3RvcnlQb2ludEltcGwgJiYgdGhpcy5fcGFyZW50U3RvcnlQb2ludEltcGwuYWN0aXZlO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0luc2lkZUFjdGl2ZURhc2hib2FyZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50RGFzaGJvYXJkSW1wbCAmJiB0aGlzLl9wYXJlbnREYXNoYm9hcmRJbXBsLmFjdGl2ZTtcbiAgfVxuXG4gIHByaXZhdGUgaXNJbnNpZGVEYXNoYm9hcmRFeHRlbnNpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudERhc2hib2FyZEltcGwgIT09IG51bGw7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBMb2dpY2FsVGFibGVJbmZvIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiBhIGxvZ2ljYWwgdGFibGUuXG4gKiBUaGlzIGRvZXMgbm90IGZvbGxvdyB0aGUgSW1wbCBwYXR0ZXJuIGFzIGl0IGlzIGp1c3QgYSBwcm9wZXJ0eSBiYWcuXG4gKi9cbmV4cG9ydCBjbGFzcyBMb2dpY2FsVGFibGUgaW1wbGVtZW50cyBDb250cmFjdC5Mb2dpY2FsVGFibGUge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfbG9naWNhbFRhYmxlOiBMb2dpY2FsVGFibGVJbmZvKSB7fVxuXG4gIHB1YmxpYyBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbG9naWNhbFRhYmxlLmlkO1xuICB9XG5cbiAgcHVibGljIGdldCBjYXB0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2xvZ2ljYWxUYWJsZS5jYXB0aW9uO1xuICB9XG59XG4iLCJpbXBvcnQgeyBUb29sdGlwVGV4dFJlcXVlc3QsIFZpc3VhbElkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuZXhwb3J0IGNsYXNzIFRvb2x0aXBUZXh0UmVxdWVzdE1vZGVsIGltcGxlbWVudHMgVG9vbHRpcFRleHRSZXF1ZXN0IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyB2aXN1YWxJZFByZXNNb2RlbDogVmlzdWFsSWQsIHB1YmxpYyB0dXBsZUlkOiBudW1iZXIpIHt9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGF0ZVJhbmdlVHlwZSwgRmlsdGVyRG9tYWluVHlwZSwgRmlsdGVyVHlwZSwgUGVyaW9kVHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL2xpYi9zcmMvRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvTmFtZXNwYWNlcy9UYWJsZWF1JztcbmltcG9ydCB7IERhdGFTb3VyY2VTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvRGF0YVNvdXJjZVNlcnZpY2UnO1xuaW1wb3J0IHsgRmlsdGVyU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0ZpbHRlclNlcnZpY2UnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5LCBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgRXJyb3JIZWxwZXJzIH0gZnJvbSAnLi4vVXRpbHMvRXJyb3JIZWxwZXJzJztcblxuZXhwb3J0IGNsYXNzIEZpbHRlciBpbXBsZW1lbnRzIENvbnRyYWN0LkZpbHRlciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgX3dvcmtzaGVldE5hbWU6IHN0cmluZyxcbiAgICBwcm90ZWN0ZWQgX2ZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHByb3RlY3RlZCBfZmlsdGVyVHlwZTogRmlsdGVyVHlwZSxcbiAgICBwcm90ZWN0ZWQgX2ZpZWxkSWQ6IHN0cmluZyxcbiAgICBwcm90ZWN0ZWQgX3JlZ2lzdHJ5SWQ6IG51bWJlcixcbiAgKSB7fVxuXG4gIHB1YmxpYyBnZXQgd29ya3NoZWV0TmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXROYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWVsZE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGROYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWVsZElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZpbHRlclR5cGUoKTogRmlsdGVyVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbHRlclR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0RmllbGRBc3luYygpOiBQcm9taXNlPENvbnRyYWN0LkZpZWxkPiB7XG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxEYXRhU291cmNlU2VydmljZT4oU2VydmljZU5hbWVzLkRhdGFTb3VyY2VTZXJ2aWNlKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRGaWVsZEFzeW5jKHRoaXMuX2ZpZWxkSWQpO1xuICB9XG5cbiAgcHVibGljIGdldEFwcGxpZWRXb3Jrc2hlZXRzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxzdHJpbmc+PiB7XG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxGaWx0ZXJTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRmlsdGVyKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRBcHBsaWVkV29ya3NoZWV0c0FzeW5jKHRoaXMuX3dvcmtzaGVldE5hbWUsIHRoaXMuX2ZpZWxkSWQpO1xuICB9XG5cbiAgcHVibGljIHNldEFwcGxpZWRXb3Jrc2hlZXRzQXN5bmMoYXBwbHlUb1dvcmtzaGVldHM6IEFycmF5PHN0cmluZz4pOiBQcm9taXNlPEFycmF5PHN0cmluZz4+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKGFwcGx5VG9Xb3Jrc2hlZXRzLCAnYXBwbHlUb1dvcmtzaGVldHMnKTtcbiAgICBjb25zdCB1bmlxdWVXb3Jrc2hlZXRzID0gbmV3IFNldChhcHBseVRvV29ya3NoZWV0cyk7XG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxGaWx0ZXJTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRmlsdGVyKTtcbiAgICByZXR1cm4gc2VydmljZS5zZXRBcHBsaWVkV29ya3NoZWV0c0FzeW5jKHRoaXMuX3dvcmtzaGVldE5hbWUsIHRoaXMuX2ZpZWxkTmFtZSwgdGhpcy5fZmllbGRJZCwgQXJyYXkuZnJvbSh1bmlxdWVXb3Jrc2hlZXRzKSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENhdGVnb3JpY2FsRmlsdGVyIGV4dGVuZHMgRmlsdGVyIGltcGxlbWVudHMgQ29udHJhY3QuQ2F0ZWdvcmljYWxGaWx0ZXIge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgd29ya3NoZWV0TmFtZTogc3RyaW5nLFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIGZpZWxkSWQ6IHN0cmluZyxcbiAgICBmaWx0ZXJUeXBlOiBGaWx0ZXJUeXBlLFxuICAgIHJlZ2lzdHJ5SWQ6IG51bWJlcixcbiAgICBwcml2YXRlIF9hcHBsaWVkVmFsdWVzOiBBcnJheTxDb250cmFjdC5EYXRhVmFsdWU+LFxuICAgIHByaXZhdGUgX2lzRXhjbHVkZU1vZGU6IGJvb2xlYW4sXG4gICAgcHJpdmF0ZSBfaXNBbGxTZWxlY3RlZD86IGJvb2xlYW4sXG4gICkge1xuICAgIHN1cGVyKHdvcmtzaGVldE5hbWUsIGZpZWxkTmFtZSwgZmlsdGVyVHlwZSwgZmllbGRJZCwgcmVnaXN0cnlJZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzQWxsU2VsZWN0ZWQoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2lzQWxsU2VsZWN0ZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFwcGxpZWRWYWx1ZXMoKTogQXJyYXk8Q29udHJhY3QuRGF0YVZhbHVlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwcGxpZWRWYWx1ZXM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzRXhjbHVkZU1vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzRXhjbHVkZU1vZGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0RG9tYWluQXN5bmMoZG9tYWluVHlwZT86IEZpbHRlckRvbWFpblR5cGUpOiBQcm9taXNlPENvbnRyYWN0LkNhdGVnb3JpY2FsRG9tYWluPiB7XG4gICAgaWYgKCFkb21haW5UeXBlKSB7XG4gICAgICBkb21haW5UeXBlID0gRmlsdGVyRG9tYWluVHlwZS5SZWxldmFudDtcbiAgICB9XG5cbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPEZpbHRlckRvbWFpblR5cGU+KGRvbWFpblR5cGUsIEZpbHRlckRvbWFpblR5cGUsICdGaWx0ZXJEb21haW5UeXBlJyk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEZpbHRlclNlcnZpY2U+KFNlcnZpY2VOYW1lcy5GaWx0ZXIpO1xuICAgIHJldHVybiBzZXJ2aWNlLmdldENhdGVnb3JpY2FsRG9tYWluQXN5bmModGhpcy5fd29ya3NoZWV0TmFtZSwgdGhpcy5fZmllbGRJZCwgZG9tYWluVHlwZSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEhpZXJhcmNoaWNhbERhdGFWYWx1ZSBpbXBsZW1lbnRzIENvbnRyYWN0LkhpZXJhcmNoaWNhbEZpbHRlckRhdGFWYWx1ZSB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF92YWx1ZTogQ29udHJhY3QuRGF0YVZhbHVlLCBwcml2YXRlIF9oaWVyYXJjaGljYWxQYXRoOiBzdHJpbmcsIHByaXZhdGUgX2xldmVsOiBudW1iZXIpIHt9XG5cbiAgcHVibGljIGdldCB2YWx1ZSgpOiBDb250cmFjdC5EYXRhVmFsdWUge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaGllcmFyY2hpY2FsUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9oaWVyYXJjaGljYWxQYXRoO1xuICB9XG5cbiAgcHVibGljIGdldCBsZXZlbCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9sZXZlbDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSGllcmFyY2hpY2FsTGV2ZWxEZXRhaWwgaW1wbGVtZW50cyBDb250cmFjdC5IaWVyYXJjaGljYWxMZXZlbERldGFpbCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9uYW1lOiBzdHJpbmcsIHByaXZhdGUgX2xldmVsU2VsZWN0aW9uU3RhdGU6IEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUpIHt9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX25hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGxldmVsU2VsZWN0aW9uU3RhdGUoKTogSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuX2xldmVsU2VsZWN0aW9uU3RhdGU7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEhpZXJhcmNoaWNhbEZpbHRlciBleHRlbmRzIEZpbHRlciBpbXBsZW1lbnRzIENvbnRyYWN0LkhpZXJhcmNoaWNhbEZpbHRlciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICB3b3Jrc2hlZXROYW1lOiBzdHJpbmcsXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgZmllbGRJZDogc3RyaW5nLFxuICAgIGZpbHRlclR5cGU6IEZpbHRlclR5cGUsXG4gICAgcmVnaXN0cnlJZDogbnVtYmVyLFxuICAgIHByaXZhdGUgX2RpbWVuc2lvbk5hbWU6IHN0cmluZyxcbiAgICBwcml2YXRlIF9oaWVyYXJjaHlDYXB0aW9uOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBfbnVtYmVyT2ZMZXZlbHM6IG51bWJlcixcbiAgICBwcml2YXRlIF9sZXZlbERldGFpbHM6IEFycmF5PENvbnRyYWN0LkhpZXJhcmNoaWNhbExldmVsRGV0YWlsPixcbiAgICBwcml2YXRlIF9hcHBsaWVkVmFsdWVzOiBBcnJheTxDb250cmFjdC5IaWVyYXJjaGljYWxGaWx0ZXJEYXRhVmFsdWU+LFxuICAgIHByaXZhdGUgX2lzQWxsU2VsZWN0ZWQ6IGJvb2xlYW4sXG4gICkge1xuICAgIHN1cGVyKHdvcmtzaGVldE5hbWUsIGZpZWxkTmFtZSwgZmlsdGVyVHlwZSwgZmllbGRJZCwgcmVnaXN0cnlJZCk7XG4gIH1cbiAgZ2V0RG9tYWluQXN5bmMoZG9tYWluVHlwZT86IENvbnRyYWN0LkZpbHRlckRvbWFpblR5cGUpOiBQcm9taXNlPENvbnRyYWN0LkNhdGVnb3JpY2FsRG9tYWluPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG5cbiAgcHVibGljIGdldCBkaW1lbnNpb25OYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2RpbWVuc2lvbk5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGhpZXJhcmNoeUNhcHRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5faGllcmFyY2h5Q2FwdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbnVtYmVyT2ZMZXZlbHMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fbnVtYmVyT2ZMZXZlbHM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGxldmVsRGV0YWlscygpOiBDb250cmFjdC5IaWVyYXJjaGljYWxMZXZlbERldGFpbFtdIHtcbiAgICByZXR1cm4gdGhpcy5fbGV2ZWxEZXRhaWxzO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0FsbFNlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc0FsbFNlbGVjdGVkO1xuICB9XG5cbiAgcHVibGljIGdldCBhcHBsaWVkVmFsdWVzKCk6IEFycmF5PENvbnRyYWN0LkhpZXJhcmNoaWNhbEZpbHRlckRhdGFWYWx1ZT4ge1xuICAgIHJldHVybiB0aGlzLl9hcHBsaWVkVmFsdWVzO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSYW5nZUZpbHRlciBleHRlbmRzIEZpbHRlciBpbXBsZW1lbnRzIENvbnRyYWN0LlJhbmdlRmlsdGVyIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHdvcmtzaGVldE5hbWU6IHN0cmluZyxcbiAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICBmaWVsZElkOiBzdHJpbmcsXG4gICAgZmlsdGVyVHlwZTogRmlsdGVyVHlwZSxcbiAgICByZWdpc3RyeUlkOiBudW1iZXIsXG4gICAgcHJpdmF0ZSBfbWluOiBDb250cmFjdC5EYXRhVmFsdWUsXG4gICAgcHJpdmF0ZSBfbWF4OiBDb250cmFjdC5EYXRhVmFsdWUsXG4gICAgcHJpdmF0ZSBfaW5jbHVkZU51bGxWYWx1ZXM6IGJvb2xlYW4sXG4gICkge1xuICAgIHN1cGVyKHdvcmtzaGVldE5hbWUsIGZpZWxkTmFtZSwgZmlsdGVyVHlwZSwgZmllbGRJZCwgcmVnaXN0cnlJZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG1pblZhbHVlKCk6IENvbnRyYWN0LkRhdGFWYWx1ZSB7XG4gICAgcmV0dXJuIHRoaXMuX21pbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbWF4VmFsdWUoKTogQ29udHJhY3QuRGF0YVZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5fbWF4O1xuICB9XG5cbiAgcHVibGljIGdldCBpbmNsdWRlTnVsbFZhbHVlcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faW5jbHVkZU51bGxWYWx1ZXM7XG4gIH1cblxuICBwdWJsaWMgZ2V0RG9tYWluQXN5bmMoZG9tYWluVHlwZT86IEZpbHRlckRvbWFpblR5cGUpOiBQcm9taXNlPENvbnRyYWN0LlJhbmdlRG9tYWluPiB7XG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxGaWx0ZXJTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRmlsdGVyKTtcbiAgICBpZiAoIWRvbWFpblR5cGUpIHtcbiAgICAgIGRvbWFpblR5cGUgPSBGaWx0ZXJEb21haW5UeXBlLlJlbGV2YW50O1xuICAgIH1cblxuICAgIEVycm9ySGVscGVycy52ZXJpZnlFbnVtVmFsdWU8RmlsdGVyRG9tYWluVHlwZT4oZG9tYWluVHlwZSwgRmlsdGVyRG9tYWluVHlwZSwgJ0ZpbHRlckRvbWFpblR5cGUnKTtcblxuICAgIHJldHVybiBzZXJ2aWNlLmdldFJhbmdlRG9tYWluQXN5bmModGhpcy5fd29ya3NoZWV0TmFtZSwgdGhpcy5fZmllbGRJZCwgZG9tYWluVHlwZSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJlbGF0aXZlRGF0ZUZpbHRlciBleHRlbmRzIEZpbHRlciBpbXBsZW1lbnRzIENvbnRyYWN0LlJlbGF0aXZlRGF0ZUZpbHRlciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICB3b3Jrc2hlZXROYW1lOiBzdHJpbmcsXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgZmllbGRJZDogc3RyaW5nLFxuICAgIGZpbHRlclR5cGU6IEZpbHRlclR5cGUsXG4gICAgcmVnaXN0cnlJZDogbnVtYmVyLFxuICAgIHByaXZhdGUgX2FuY2hvckRhdGU6IENvbnRyYWN0LkRhdGFWYWx1ZSxcbiAgICBwcml2YXRlIF9wZXJpb2RUeXBlOiBQZXJpb2RUeXBlLFxuICAgIHByaXZhdGUgX3JhbmdlVHlwZTogRGF0ZVJhbmdlVHlwZSxcbiAgICBwcml2YXRlIF9yYW5nZU46IG51bWJlcixcbiAgKSB7XG4gICAgc3VwZXIod29ya3NoZWV0TmFtZSwgZmllbGROYW1lLCBmaWx0ZXJUeXBlLCBmaWVsZElkLCByZWdpc3RyeUlkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYW5jaG9yRGF0ZSgpOiBDb250cmFjdC5EYXRhVmFsdWUge1xuICAgIHJldHVybiB0aGlzLl9hbmNob3JEYXRlO1xuICB9XG5cbiAgcHVibGljIGdldCBwZXJpb2RUeXBlKCk6IFBlcmlvZFR5cGUge1xuICAgIHJldHVybiB0aGlzLl9wZXJpb2RUeXBlO1xuICB9XG5cbiAgcHVibGljIGdldCByYW5nZVR5cGUoKTogRGF0ZVJhbmdlVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX3JhbmdlVHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcmFuZ2VOKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3JhbmdlTjtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ2F0ZWdvcmljYWxEb21haW4gaW1wbGVtZW50cyBDb250cmFjdC5DYXRlZ29yaWNhbERvbWFpbiB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF92YWx1ZXM6IEFycmF5PENvbnRyYWN0LkRhdGFWYWx1ZT4sIHByaXZhdGUgX2RvbWFpblR5cGU6IEZpbHRlckRvbWFpblR5cGUpIHt9XG5cbiAgcHVibGljIGdldCB2YWx1ZXMoKTogQXJyYXk8Q29udHJhY3QuRGF0YVZhbHVlPiB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlcztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdHlwZSgpOiBGaWx0ZXJEb21haW5UeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fZG9tYWluVHlwZTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmFuZ2VEb21haW4gaW1wbGVtZW50cyBDb250cmFjdC5SYW5nZURvbWFpbiB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9taW46IENvbnRyYWN0LkRhdGFWYWx1ZSwgcHJpdmF0ZSBfbWF4OiBDb250cmFjdC5EYXRhVmFsdWUsIHByaXZhdGUgX2RvbWFpblR5cGU6IEZpbHRlckRvbWFpblR5cGUpIHt9XG5cbiAgcHVibGljIGdldCB0eXBlKCk6IEZpbHRlckRvbWFpblR5cGUge1xuICAgIHJldHVybiB0aGlzLl9kb21haW5UeXBlO1xuICB9XG5cbiAgcHVibGljIGdldCBtaW4oKTogQ29udHJhY3QuRGF0YVZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5fbWluO1xuICB9XG5cbiAgcHVibGljIGdldCBtYXgoKTogQ29udHJhY3QuRGF0YVZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5fbWF4O1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGF0YVR5cGUsIE1hcmtUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcblxuZXhwb3J0IGNsYXNzIERhdGFUYWJsZSBpbXBsZW1lbnRzIENvbnRyYWN0LkRhdGFUYWJsZSB7XG4gIHByaXZhdGUgX25hbWU6IHN0cmluZztcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfZGF0YTogQXJyYXk8QXJyYXk8Q29udHJhY3QuRGF0YVZhbHVlPj4sXG4gICAgcHJpdmF0ZSBfY29sdW1uczogQXJyYXk8Q29udHJhY3QuQ29sdW1uPixcbiAgICBwcml2YXRlIF90b3RhbFJvd0NvdW50OiBudW1iZXIsXG4gICAgcHJpdmF0ZSBfaXNUb3RhbFJvd0NvdW50TGltaXRlZDogYm9vbGVhbixcbiAgICBwcml2YXRlIF9pc1N1bW1hcnlEYXRhOiBib29sZWFuLFxuICAgIHByaXZhdGUgX21hcmtzSW5mbz86IEFycmF5PE1hcmtJbmZvPixcbiAgKSB7XG4gICAgdGhpcy5fbmFtZSA9IF9pc1N1bW1hcnlEYXRhID8gJ1N1bW1hcnkgRGF0YSBUYWJsZScgOiAnVW5kZXJseWluZyBEYXRhIFRhYmxlJztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBkYXRhKCk6IEFycmF5PEFycmF5PENvbnRyYWN0LkRhdGFWYWx1ZT4+IHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY29sdW1ucygpOiBBcnJheTxDb250cmFjdC5Db2x1bW4+IHtcbiAgICByZXR1cm4gdGhpcy5fY29sdW1ucztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbWFya3NJbmZvKCk6IEFycmF5PENvbnRyYWN0Lk1hcmtJbmZvPiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX21hcmtzSW5mbztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdG90YWxSb3dDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl90b3RhbFJvd0NvdW50O1xuICB9XG5cbiAgcHVibGljIGdldCBpc1RvdGFsUm93Q291bnRMaW1pdGVkKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9pc1RvdGFsUm93Q291bnRMaW1pdGVkO1xuICB9XG5cbiAgcHVibGljIGdldCBpc1N1bW1hcnlEYXRhKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9pc1N1bW1hcnlEYXRhO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNYXJrSW5mbyBpbXBsZW1lbnRzIENvbnRyYWN0Lk1hcmtJbmZvIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX3R5cGU6IE1hcmtUeXBlLCBwcml2YXRlIF9jb2xvcjogc3RyaW5nLCBwcml2YXRlIF90dXBsZUlkPzogbnVtYmVyKSB7fVxuXG4gIHB1YmxpYyBnZXQgdHlwZSgpOiBNYXJrVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX3R5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvbG9yKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbG9yO1xuICB9XG5cbiAgcHVibGljIGdldCB0dXBsZUlkKCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3R1cGxlSWQ7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbHVtbiBpbXBsZW1lbnRzIENvbnRyYWN0LkNvbHVtbiB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9maWVsZE5hbWU6IHN0cmluZyxcbiAgICBwcml2YXRlIF9maWVsZElkOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBfZGF0YVR5cGU6IERhdGFUeXBlLFxuICAgIHByaXZhdGUgX2lzUmVmZXJlbmNlZDogYm9vbGVhbixcbiAgICBwcml2YXRlIF9pbmRleDogbnVtYmVyLFxuICApIHt9XG5cbiAgcHVibGljIGdldCBmaWVsZE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGROYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWVsZElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRhdGFUeXBlKCk6IERhdGFUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzUmVmZXJlbmNlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNSZWZlcmVuY2VkO1xuICB9XG5cbiAgcHVibGljIGdldCBpbmRleCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9pbmRleDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRGF0YVZhbHVlIGltcGxlbWVudHMgQ29udHJhY3QuRGF0YVZhbHVlIHtcbiAgLyogdHNsaW50OmRpc2FibGU6bm8tYW55ICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF92YWx1ZTogYW55LFxuICAgIHByaXZhdGUgX25hdGl2ZVZhbHVlOiBhbnksXG4gICAgcHJpdmF0ZSBfZm9ybWF0dGVkVmFsdWU/OiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBfYWxpYXNWYWx1ZT86IHN0cmluZyxcbiAgICBwcml2YXRlIF9oYXNBbGlhcz86IGJvb2xlYW4sXG4gICkge31cblxuICBwdWJsaWMgZ2V0IHZhbHVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCBuYXRpdmVWYWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl9uYXRpdmVWYWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZm9ybWF0dGVkVmFsdWUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybWF0dGVkVmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFsaWFzVmFsdWUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fYWxpYXNWYWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaGFzQWxpYXMoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2hhc0FsaWFzO1xuICB9XG4gIC8qIHRzbGludDplbmFibGU6bm8tYW55ICovXG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgR2V0RGF0YVNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9HZXREYXRhU2VydmljZSc7XG5pbXBvcnQgeyBBcGlTZXJ2aWNlUmVnaXN0cnksIFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBFcnJvckhlbHBlcnMgfSBmcm9tICcuLi9VdGlscy9FcnJvckhlbHBlcnMnO1xuXG5leHBvcnQgY2xhc3MgRGF0YVRhYmxlUmVhZGVyIGltcGxlbWVudHMgQ29udHJhY3QuRGF0YVRhYmxlUmVhZGVyIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBfaWQ6IHN0cmluZywgcHJvdGVjdGVkIF90b3RhbFJvd0NvdW50OiBudW1iZXIsIHByb3RlY3RlZCBfcGFnZVJvd0NvdW50LCBwcml2YXRlIF9yZWdpc3RyeUlkOiBudW1iZXIpIHtcbiAgICB0aGlzLl9wYWdlQ291bnQgPSBNYXRoLmNlaWwoX3RvdGFsUm93Q291bnQgLyBfcGFnZVJvd0NvdW50KTtcbiAgfVxuICBwcm90ZWN0ZWQgX3BhZ2VDb3VudDogbnVtYmVyO1xuXG4gIHB1YmxpYyBnZXQgdG90YWxSb3dDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl90b3RhbFJvd0NvdW50O1xuICB9XG5cbiAgcHVibGljIGdldCBwYWdlQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fcGFnZUNvdW50O1xuICB9XG5cbiAgcHVibGljIGdldFBhZ2VBc3luYyhwYWdlTnVtYmVyOiBudW1iZXIpOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlSYW5nZShwYWdlTnVtYmVyLCAwLCB0aGlzLl9wYWdlQ291bnQpO1xuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8R2V0RGF0YVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5HZXREYXRhKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRQYWdlQXN5bmModGhpcy5faWQsIHBhZ2VOdW1iZXIsIHRoaXMuX3BhZ2VSb3dDb3VudCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0QWxsUGFnZXNBc3luYyhtYXhSb3dzPzogbnVtYmVyKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+IHtcbiAgICBjb25zdCBmaXJzdFBhZ2U6IENvbnRyYWN0LkRhdGFUYWJsZSA9IGF3YWl0IHRoaXMuZ2V0UGFnZUFzeW5jKDApO1xuICAgIG1heFJvd3MgPSBtYXhSb3dzIHx8IHRoaXMudG90YWxSb3dDb3VudDtcbiAgICBjb25zdCByb3dzUmVxdWVzdGVkID0gTWF0aC5taW4obWF4Um93cywgdGhpcy50b3RhbFJvd0NvdW50KTtcbiAgICBjb25zdCBwYWdlc1JlcXVlc3RlZCA9IE1hdGguY2VpbChyb3dzUmVxdWVzdGVkIC8gdGhpcy5fcGFnZVJvd0NvdW50KTtcblxuICAgIC8vIEZldGNoIHVwIHRvIDQwMCBwYWdlcywgd2l0aCBhIGRlZmF1bHQgb2YgMTAsMDAwIHBhZ2VSb3dDb3VudCB0aGF0IGdpdmVzIHVzIDQsMDAwLDAwMCByb3dzXG4gICAgY29uc3QgcGFnZXNUb0ZldGNoID0gTWF0aC5taW4ocGFnZXNSZXF1ZXN0ZWQsIDQwMCk7XG4gICAgY29uc3QgaXNEYXRhTGltaXRlZCA9IHBhZ2VzVG9GZXRjaCA8IHBhZ2VzUmVxdWVzdGVkO1xuICAgIGxldCByZW1haW5pbmdEYXRhOiBBcnJheTxBcnJheTxBcnJheTxDb250cmFjdC5EYXRhVmFsdWU+Pj4gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHBhZ2VzVG9GZXRjaDsgaSsrKSB7XG4gICAgICBjb25zdCBwYWdlID0gYXdhaXQgdGhpcy5nZXRQYWdlQXN5bmMoaSk7XG4gICAgICByZW1haW5pbmdEYXRhLnB1c2gocGFnZS5kYXRhKTtcbiAgICB9XG5cbiAgICBsZXQgZnVsbERhdGEgPSBmaXJzdFBhZ2UuZGF0YS5jb25jYXQoLi4ucmVtYWluaW5nRGF0YSk7XG4gICAgLy8gVGhpcyBzbGljZXMgdGhlIGFycmF5IG9ubHkgaWYgbWF4Um93cyBoYXMgYmVlbiBzZXQgYW5kIGlzIGxlc3MgdGhhbiB0b3RhbFJvd0NvdW50XG4gICAgZnVsbERhdGEubGVuZ3RoID0gcm93c1JlcXVlc3RlZDtcblxuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBmaXJzdFBhZ2UubmFtZSxcbiAgICAgIGRhdGE6IGZ1bGxEYXRhLFxuICAgICAgY29sdW1uczogZmlyc3RQYWdlLmNvbHVtbnMsXG4gICAgICB0b3RhbFJvd0NvdW50OiBpc0RhdGFMaW1pdGVkID8gcGFnZXNUb0ZldGNoICogdGhpcy5fcGFnZVJvd0NvdW50IDogcm93c1JlcXVlc3RlZCxcbiAgICAgIGlzVG90YWxSb3dDb3VudExpbWl0ZWQ6IGlzRGF0YUxpbWl0ZWQsXG4gICAgICBpc1N1bW1hcnlEYXRhOiBmaXJzdFBhZ2UuaXNTdW1tYXJ5RGF0YSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIHJlbGVhc2VBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEdldERhdGFTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuR2V0RGF0YSk7XG4gICAgcmV0dXJuIHNlcnZpY2UucmVsZWFzZUFzeW5jKHRoaXMuX2lkKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVG9vbHRpcENvbnRleHQgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgSG92ZXJUdXBsZUludGVyYWN0aW9uLCBTZWxlY3RPcHRpb25zLCBTZWxlY3RUdXBsZXNJbnRlcmFjdGlvbiwgVmlzdWFsSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG4vKipcbiAqIFNlbGVjdGlvbiBNb2RlbC5cbiAqL1xuZXhwb3J0IGNsYXNzIFNlbGVjdGlvbk1vZGVsIHtcbiAgcHVibGljIHF1YWxpZmllZEZpZWxkQ2FwdGlvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFZhbHVlIGJhc2VkIHNlbGVjdGlvbiBtb2RlbC4gTWVhbnQgZm9yIGhpZXJhcmNoaWNhbCwgcmFuZ2UgYW5kIGNhdGVnb3JpY2FsIHNlbGVjdGlvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBWYWx1ZVNlbGVjdGlvbk1vZGVsIGV4dGVuZHMgU2VsZWN0aW9uTW9kZWwge1xuICBwdWJsaWMgc2VsZWN0VmFsdWVzOiBBcnJheTxzdHJpbmc+ID0gW107XG59XG5cbi8qKlxuICogSGllcmFyY2hpY2FsIHZhbHVlIHNlbGVjdGlvbiBtb2RlbFxuICovXG5leHBvcnQgY2xhc3MgSGllcmFyY2hpY2FsU2VsZWN0aW9uTW9kZWwgZXh0ZW5kcyBWYWx1ZVNlbGVjdGlvbk1vZGVsIHt9XG5cbi8qKlxuICogUmFuZ2UgYmFzZWQgdmFsdWUgc2VsZWN0aW9uIG1vZGVsXG4gKi9cbmV4cG9ydCBjbGFzcyBSYW5nZVNlbGVjdGlvbk1vZGVsIGV4dGVuZHMgU2VsZWN0aW9uTW9kZWwge1xuICBwdWJsaWMgbWluVmFsdWU6IHN0cmluZztcbiAgcHVibGljIG1heFZhbHVlOiBzdHJpbmc7XG4gIHB1YmxpYyBpbmNsdWRlZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIERpbWVuc2lvbiB2YWx1ZSBzZWxlY3Rpb24gbW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIERpbWVuc2lvblNlbGVjdGlvbk1vZGVsIGV4dGVuZHMgVmFsdWVTZWxlY3Rpb25Nb2RlbCB7fVxuLyoqXG4gKiBUdXBsZSBiYXNlZCBzZWxlY3Rpb24gbW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIFR1cGxlU2VsZWN0aW9uTW9kZWwge1xuICBwdWJsaWMgc2VsZWN0aW9uVHlwZTogc3RyaW5nO1xuICBwdWJsaWMgb2JqZWN0SWRzOiBBcnJheTxzdHJpbmc+ID0gW107XG59XG5cbi8qKlxuICogQ29udGFpbmVyIGNsYXNzIHRvIHBvcHVsYXRlIGFsbCB0aGUgc2VsZWN0aW9uIG1vZGVscyB3aGVuIHBhcnNpbmcgaW5wdXRcbiAqL1xuZXhwb3J0IGNsYXNzIFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lciB7XG4gIHB1YmxpYyBoaWVyTW9kZWxBcnI6IEFycmF5PEhpZXJhcmNoaWNhbFNlbGVjdGlvbk1vZGVsPiA9IFtdO1xuICBwdWJsaWMgZGltTW9kZWxBcnI6IEFycmF5PERpbWVuc2lvblNlbGVjdGlvbk1vZGVsPiA9IFtdO1xuICBwdWJsaWMgcXVhbnRNb2RlbEFycjogQXJyYXk8UmFuZ2VTZWxlY3Rpb25Nb2RlbD4gPSBbXTtcbiAgcHVibGljIHNlbGVjdGlvbjogVHVwbGVTZWxlY3Rpb25Nb2RlbDtcbn1cblxuZXhwb3J0IGNsYXNzIFNlbGVjdFR1cGxlc0ludGVyYWN0aW9uTW9kZWwgaW1wbGVtZW50cyBTZWxlY3RUdXBsZXNJbnRlcmFjdGlvbiB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgdmlzdWFsSWRQcmVzTW9kZWw6IFZpc3VhbElkLFxuICAgIHB1YmxpYyB0dXBsZUlkczogQXJyYXk8bnVtYmVyPiA9IFtdLFxuICAgIHB1YmxpYyBzZWxlY3RPcHRpb25zOiBTZWxlY3RPcHRpb25zLFxuICAgIHB1YmxpYyB0b29sdGlwQ29udGV4dD86IFRvb2x0aXBDb250ZXh0LFxuICApIHt9XG59XG5cbmV4cG9ydCBjbGFzcyBIb3ZlclR1cGxlSW50ZXJhY3Rpb25Nb2RlbCBpbXBsZW1lbnRzIEhvdmVyVHVwbGVJbnRlcmFjdGlvbiB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgdmlzdWFsSWRQcmVzTW9kZWw6IFZpc3VhbElkLFxuICAgIHB1YmxpYyB0dXBsZUlkOiBudW1iZXIsXG4gICAgcHVibGljIHRvb2x0aXBDb250ZXh0PzogVG9vbHRpcENvbnRleHQgfCBudWxsLFxuICAgIHB1YmxpYyBhbGxvd0hvdmVyQWN0aW9ucz86IGJvb2xlYW4sXG4gICkge31cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmV4cG9ydCBjbGFzcyBQb2ludCBpbXBsZW1lbnRzIENvbnRyYWN0LlBvaW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX3g6IG51bWJlciwgcHJpdmF0ZSBfeTogbnVtYmVyKSB7fVxuXG4gIHB1YmxpYyBnZXQgeCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl94O1xuICB9XG5cbiAgcHVibGljIGdldCB5KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3k7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbiB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBWaXN1YWxJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBBcGlTZXJ2aWNlIH0gZnJvbSAnLi9TZXJ2aWNlUmVnaXN0cnknO1xuXG4vKipcbiAqIERlZmluZXMgd2hpY2ggdHlwZSBvZiBnZXREYXRhIGNhbGwgdG8gbWFrZS5cbiAqL1xuZXhwb3J0IGVudW0gR2V0RGF0YVR5cGUge1xuICBTdW1tYXJ5ID0gJ3N1bW1hcnknLFxuICBVbmRlcmx5aW5nID0gJ3VuZGVybHlpbmcnLFxufVxuXG4vKipcbiAqIFNlcnZpY2UgZm9yIGltcGxlbWVudGluZyB0aGUgbG9naWMgZm9yIHZhcmlvdXMgZ2V0RGF0YSBjYWxsc1xuICpcbiAqIEBpbnRlcmZhY2UgR2V0RGF0YVNlcnZpY2VcbiAqIEBleHRlbmRzIHtBcGlTZXJ2aWNlfVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldERhdGFTZXJ2aWNlIGV4dGVuZHMgQXBpU2VydmljZSB7XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBsaW1pdCBvZiByb3dzIGZvciBnZXRVbmRlcmx5aW5nRGF0YUFzeW5jXG4gICAqL1xuICBnZXRNYXhSb3dMaW1pdCgpOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHVuZGVybHlpbmcgZGF0YSBmb3IgYSBwYXJ0aWN1bGFyIHZpc3VhbFxuICAgKlxuICAgKiBAcGFyYW0ge1Zpc3VhbElkfSB2aXN1YWxJZCAgVGhlIHZpc3VhbCBpZFxuICAgKiBAcGFyYW0ge0dldERhdGFUeXBlfSBnZXRUeXBlICBUaGUgdHlwZSBvZiBnZXREYXRhIGNhbGwgdG8gbWFrZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZUFsaWFzZXMgIFdoZXRoZXIgb3Igbm90IGFsaWFzZXMgc2hvdWxkIGJlIGlnbm9yZWRcbiAgICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVTZWxlY3Rpb24gIFdoZXRoZXIgb3Igbm90IHNlbGVjdGlvbiBzaG91bGQgYmUgaWdub3JlZFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGluY2x1ZGVBbGxDb2x1bW5zICBTaG91bGQgYWxsIGNvbHVtbnMgYmUgaW5jbHVkZWRcbiAgICogQHBhcmFtIHtBcnJheX0gY29sdW1uc1RvSW5jbHVkZUJ5SWQgT3ZlcnJpZGVzIGluY2x1ZGVBbGxDb2x1bW5zLCBsaXN0cyB0aGUgY29sdW1ucyB0byBpbmNsdWRlLiBFbXB0eSBtZWFucyBhbGwgY29sdW1ucy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IG1heFJvd3MgIE1heGltdW0gbnVtYmVyIG9mIHJvd3MgdG8gcmV0dXJuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT59ICBEYXRhIHRhYmxlIHdpdGggdGhlIHJlcXVlc3RlZCBkYXRhXG4gICAqL1xuICBnZXRVbmRlcmx5aW5nRGF0YUFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBnZXRUeXBlOiBHZXREYXRhVHlwZSxcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIGlnbm9yZVNlbGVjdGlvbjogYm9vbGVhbixcbiAgICBpbmNsdWRlQWxsQ29sdW1uczogYm9vbGVhbixcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogQXJyYXk8c3RyaW5nPixcbiAgICBtYXhSb3dzOiBudW1iZXIsXG4gICAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb246IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICAgIGFwcGx5V29ya3NoZWV0Rm9ybWF0dGluZzogYm9vbGVhbixcbiAgKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1Zpc3VhbElkfSB2aXN1YWxJZCAgVGhlIHZpc3VhbCBpZFxuICAgKiBAcGFyYW0ge251bWJlcn0gcGFnZVJvd0NvdW50IFRoZSBudW1iZXIgb2Ygcm93cyBwZXIgcGFnZS4gVGhlIGRlZmF1bHQgYW5kIG1heGltdW0gaXMgMTAsMDAwIHJvd3MuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaWdub3JlQWxpYXNlcyAgV2hldGhlciBhbGlhcyB2YWx1ZXMgc2hvdWxkIGJlIGlnbm9yZWQgaW4gdGhlIHJldHVybmVkIGRhdGFcbiAgICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVTZWxlY3Rpb24gIFdoZXRoZXIgc2VsZWN0aW9ucyBpbiB0aGlzIHZpeiBzaG91bGQgYmUgaWdub3JlZCBpbiB0aGUgcmV0dXJuZWQgZGF0YVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGluY2x1ZGVBbGxDb2x1bW5zICBTaG91bGQgYWxsIGNvbHVtbnMgYmUgaW5jbHVkZWRcbiAgICogQHBhcmFtIHtBcnJheX0gY29sdW1uc1RvSW5jbHVkZUJ5SWQgT3ZlcnJpZGVzIGluY2x1ZGVBbGxDb2x1bW5zLCBsaXN0cyB0aGUgY29sdW1ucyB0byBpbmNsdWRlLiBFbXB0eSBtZWFucyBhbGwgY29sdW1uc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGVSZWFkZXI+fSAgRGF0YSB0YWJsZSByZWFkZXIgdG8gYWNjZXNzIHRoZSB1bmRlcmx5aW5nIGRhdGFcbiAgICovXG4gIGdldFN1bW1hcnlEYXRhUmVhZGVyQXN5bmMoXG4gICAgdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIHBhZ2VSb3dDb3VudDogbnVtYmVyLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgaWdub3JlU2VsZWN0aW9uOiBib29sZWFuLFxuICAgIGluY2x1ZGVBbGxDb2x1bW5zOiBib29sZWFuLFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uOiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgICBhcHBseVdvcmtzaGVldEZvcm1hdHRpbmc6IGJvb2xlYW4sXG4gICk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlUmVhZGVyPjtcblxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG1hcmtzIGZvciBhIGdpdmVuIHZpc3VhbFxuICAgKlxuICAgKiBAcGFyYW0ge1Zpc3VhbElkfSB2aXN1YWxJZCAgVGhlIHZpc3VhbCBpZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBY3RpdmVNYXJrcz59ICBDb2xsZWN0aW9uIG9mIGRhdGEgdGFibGVzIHdpdGggdGhlIGFjdGl2ZSBtYXJrc1xuICAgKi9cbiAgZ2V0U2VsZWN0ZWRNYXJrc0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8Q29udHJhY3QuTWFya3NDb2xsZWN0aW9uPjtcblxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudGx5IGhpZ2hsaWdodGVkIG1hcmtzIGZvciBhIGdpdmVuIHZpc3VhbFxuICAgKlxuICAgKiBAcGFyYW0ge1Zpc3VhbElkfSB2aXN1YWxJZCAgVGhlIHZpc3VhbCBpZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBY3RpdmVNYXJrcz59ICBDb2xsZWN0aW9uIG9mIGRhdGEgdGFibGVzIHdpdGggdGhlIGFjdGl2ZSBtYXJrc1xuICAgKi9cbiAgZ2V0SGlnaGxpZ2h0ZWRNYXJrc0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8Q29udHJhY3QuTWFya3NDb2xsZWN0aW9uPjtcblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGFzb3VyY2VJZCAgVGhlIGlkIG9mIHRoZSBkYXRhc291cmNlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaWdub3JlQWxpYXNlcyAgV2hldGhlciBhbGlhcyB2YWx1ZXMgc2hvdWxkIGJlIGlnbm9yZWQgaW4gdGhlIHJldHVybmVkIGRhdGFcbiAgICogQHBhcmFtIHtudW1iZXJ9IG1heFJvd3MgVGhlIG1heGltdW0gbnVtYmVyIG9mIHJvd3MgdG8gcmV0cmlldmVcbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBjb2x1bW5zVG9JbmNsdWRlIENvbHVtbnMgd2hpY2ggc2hvdWxkIGJlIHJldHVybmVkIHNwZWNpZmllZCBieSBjYXB0aW9uLiBFbXB0eSBtZWFucyBhbGwgY29sdW1uc1xuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGNvbHVtbnNUb0luY2x1ZGVCeUlkIENvbHVtbnMgd2hpY2ggc2hvdWxkIGJlIHJldHVybmVkIHNwZWNpZmllZCBieSBuYW1lLiBFbXB0eSBtZWFucyBhbGwgY29sdW1uc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+fSAgRGF0YSB0YWJsZSB3aXRoIHRoZSByZXF1ZXN0ZWQgZGF0YVxuICAgKi9cbiAgZ2V0RGF0YVNvdXJjZURhdGFBc3luYyhcbiAgICBkYXRhc291cmNlSWQ6IHN0cmluZyxcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIG1heFJvd3M6IG51bWJlcixcbiAgICBjb2x1bW5zVG9JbmNsdWRlOiBBcnJheTxzdHJpbmc+LFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uOiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0YXNvdXJjZUlkICBUaGUgaWQgb2YgdGhlIGRhdGFzb3VyY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxvZ2ljYWxUYWJsZUlkICBUaGUgaWQgb2YgdGhlIGxvZ2NpYWwgdGFibGVcbiAgICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVBbGlhc2VzICBXaGV0aGVyIGFsaWFzIHZhbHVlcyBzaG91bGQgYmUgaWdub3JlZCBpbiB0aGUgcmV0dXJuZWQgZGF0YVxuICAgKiBAcGFyYW0ge251bWJlcn0gbWF4Um93cyBUaGUgbWF4aW11bSBudW1iZXIgb2Ygcm93cyB0byByZXRyaWV2ZVxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGNvbHVtbnNUb0luY2x1ZGUgQ29sdW1ucyB3aGljaCBzaG91bGQgYmUgcmV0dXJuZWQgc3BlY2lmaWVkIGJ5IGNhcHRpb24uIEVtcHR5IG1lYW5zIGFsbCBjb2x1bW5zXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gY29sdW1uc1RvSW5jbHVkZUJ5SWQgQ29sdW1ucyB3aGljaCBzaG91bGQgYmUgcmV0dXJuZWQgc3BlY2lmaWVkIGJ5IG5hbWUuIEVtcHR5IG1lYW5zIGFsbCBjb2x1bW5zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT59ICBEYXRhIHRhYmxlIHdpdGggdGhlIHJlcXVlc3RlZCBkYXRhXG4gICAqL1xuICBnZXRMb2dpY2FsVGFibGVEYXRhQXN5bmMoXG4gICAgZGF0YXNvdXJjZUlkOiBzdHJpbmcsXG4gICAgbG9naWNhbFRhYmxlSWQ6IHN0cmluZyxcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIG1heFJvd3M6IG51bWJlcixcbiAgICBjb2x1bW5zVG9JbmNsdWRlOiBBcnJheTxzdHJpbmc+LFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uOiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0YXNvdXJjZUlkICBUaGUgaWQgb2YgdGhlIGRhdGFzb3VyY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxvZ2ljYWxUYWJsZUlkICBUaGUgaWQgb2YgdGhlIGxvZ2NpYWwgdGFibGVcbiAgICogQHBhcmFtIHtudW1iZXJ9IHBhZ2VSb3dDb3VudCBUaGUgbnVtYmVyIG9mIHJvd3MgcGVyIHBhZ2UuIFRoZSBkZWZhdWx0IGFuZCBtYXhpbXVtIGlzIDEwLDAwMCByb3dzLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZUFsaWFzZXMgIFdoZXRoZXIgYWxpYXMgdmFsdWVzIHNob3VsZCBiZSBpZ25vcmVkIGluIHRoZSByZXR1cm5lZCBkYXRhXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gY29sdW1uc1RvSW5jbHVkZUJ5SWQgQ29sdW1ucyB3aGljaCBzaG91bGQgYmUgcmV0dXJuZWQgc3BlY2lmaWVkIGJ5IG5hbWUuIEVtcHR5IG1lYW5zIGFsbCBjb2x1bW5zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT59ICBEYXRhIHRhYmxlIHdpdGggdGhlIHJlcXVlc3RlZCBkYXRhXG4gICAqL1xuICBnZXRMb2dpY2FsVGFibGVEYXRhUmVhZGVyQXN5bmMoXG4gICAgZGF0YXNvdXJjZUlkOiBzdHJpbmcsXG4gICAgbG9naWNhbFRhYmxlSWQ6IHN0cmluZyxcbiAgICBwYWdlUm93Q291bnQ6IG51bWJlcixcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uOiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGVSZWFkZXI+O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1Zpc3VhbElkfSB2aXN1YWxJZCAgVGhlIHZpc3VhbCBpZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbG9naWNhbFRhYmxlSWQgIFRoZSBpZCBvZiB0aGUgbG9nY2lhbCB0YWJsZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZUFsaWFzZXMgIFdoZXRoZXIgYWxpYXMgdmFsdWVzIHNob3VsZCBiZSBpZ25vcmVkIGluIHRoZSByZXR1cm5lZCBkYXRhXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaWdub3JlU2VsZWN0aW9uICBXaGV0aGVyIHNlbGVjdGlvbnMgaW4gdGhpcyB2aXogc2hvdWxkIGJlIGlnbm9yZWQgaW4gdGhlIHJldHVybmVkIGRhdGFcbiAgICogQHBhcmFtIHtib29sZWFufSBpbmNsdWRlQWxsQ29sdW1ucyAgV2hldGhlciB0byBpbmNsdWRlIGFsbCBjb2x1bW5zIG9yIG9ubHkgdGhlIHJlZmVyZW5jZWQgY29sdW1uc1xuICAgKiBAcGFyYW0ge0FycmF5fSBjb2x1bW5zVG9JbmNsdWRlQnlJZCBPdmVycmlkZXMgaW5jbHVkZUFsbENvbHVtbnMsIGxpc3RzIHRoZSBjb2x1bW5zIHRvIGluY2x1ZGUuIEVtcHR5IG1lYW5zIGFsbCBjb2x1bW5zLlxuICAgKiBAcGFyYW0ge251bWJlcn0gbWF4Um93cyBUaGUgbWF4aW11bSBudW1iZXIgb2Ygcm93cyB0byByZXRyaWV2ZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+fSAgRGF0YSB0YWJsZSB3aXRoIHRoZSByZXF1ZXN0ZWQgZGF0YVxuICAgKi9cbiAgZ2V0VW5kZXJseWluZ1RhYmxlRGF0YUFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBsb2dpY2FsVGFibGVJZDogc3RyaW5nLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgaWdub3JlU2VsZWN0aW9uOiBib29sZWFuLFxuICAgIGluY2x1ZGVBbGxDb2x1bW5zOiBib29sZWFuLFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIG1heFJvd3M6IG51bWJlcixcbiAgICBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gICAgYXBwbHlXb3Jrc2hlZXRGb3JtYXR0aW5nOiBib29sZWFuLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT47XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7VmlzdWFsSWR9IHZpc3VhbElkICBUaGUgdmlzdWFsIGlkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsb2dpY2FsVGFibGVJZCAgVGhlIGlkIG9mIHRoZSBsb2djaWFsIHRhYmxlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBwYWdlUm93Q291bnQgVGhlIG51bWJlciBvZiByb3dzIHBlciBwYWdlLiBUaGUgZGVmYXVsdCBhbmQgbWF4aW11bSBpcyAxMCwwMDAgcm93cy5cbiAgICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVBbGlhc2VzICBXaGV0aGVyIGFsaWFzIHZhbHVlcyBzaG91bGQgYmUgaWdub3JlZCBpbiB0aGUgcmV0dXJuZWQgZGF0YVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZVNlbGVjdGlvbiAgV2hldGhlciBzZWxlY3Rpb25zIGluIHRoaXMgdml6IHNob3VsZCBiZSBpZ25vcmVkIGluIHRoZSByZXR1cm5lZCBkYXRhXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5jbHVkZUFsbENvbHVtbnMgIFdoZXRoZXIgdG8gaW5jbHVkZSBhbGwgY29sdW1ucyBvciBvbmx5IHRoZSByZWZlcmVuY2VkIGNvbHVtbnNcbiAgICogQHBhcmFtIHtBcnJheX0gY29sdW1uc1RvSW5jbHVkZUJ5SWQgT3ZlcnJpZGVzIGluY2x1ZGVBbGxDb2x1bW5zLCBsaXN0cyB0aGUgY29sdW1ucyB0byBpbmNsdWRlLiBFbXB0eSBtZWFucyBhbGwgY29sdW1ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPn0gIERhdGEgdGFibGUgd2l0aCB0aGUgcmVxdWVzdGVkIGRhdGFcbiAgICovXG4gIGdldFVuZGVybHlpbmdUYWJsZURhdGFSZWFkZXJBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgbG9naWNhbFRhYmxlSWQ6IHN0cmluZyxcbiAgICBwYWdlUm93Q291bnQ6IG51bWJlcixcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIGlnbm9yZVNlbGVjdGlvbjogYm9vbGVhbixcbiAgICBpbmNsdWRlQWxsQ29sdW1uczogYm9vbGVhbixcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogQXJyYXk8c3RyaW5nPixcbiAgICBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gICAgYXBwbHlXb3Jrc2hlZXRGb3JtYXR0aW5nLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZVJlYWRlcj47XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7VmlzdWFsSWR9IHZpc3VhbElkICBUaGUgdmlzdWFsIGlkXG4gICAqL1xuICBnZXRTdW1tYXJ5Q29sdW1uc0luZm9Bc3luYyh2aXN1YWxJZDogVmlzdWFsSWQpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkNvbHVtbj4+O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gdGFibGVJZCAgICAgVGhlIHRhYmxlIGlkIHVzZWQgdG8gZmV0Y2ggZGF0YS5cbiAgICogQHBhcmFtIHBhZ2VOdW1iZXIgIFRoZSBwYWdlIG51bWJlciAoemVyby1iYXNlZCkuXG4gICAqIEBwYXJhbSBwYWdlU2l6ZSAgICBUaGUgcGFnZSBzaXplIG9mIHRoZSBvd25pbmcgRGF0YVRhYmxlUmVhZGVyXG4gICAqIEByZXR1cm5zICAgICAgICAgICBBIERhdGFUYWJsZSBjb250YWluaW5nIHRoZSByZXF1ZXN0ZWQgcGFnZS4gVGhlIG51bWJlciBvZiByb3dzIHJldHVybmVkXG4gICAqICAgICAgICAgICAgICAgICAgICBjYW4gYmUgbGVzcyB0aGFuIHJlcXVlc3RlZCBhdCB0aGUgZW5kIG9mIHRoZSBkYXRhLlxuICAgKi9cbiAgZ2V0UGFnZUFzeW5jKHRhYmxlSWQ6IHN0cmluZywgcGFnZU51bWJlcjogbnVtYmVyLCBwYWdlU2l6ZTogbnVtYmVyKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gdGFibGVJZCAgICAgVGhlIHRhYmxlIGlkIHVzZWQgdG8gZmV0Y2ggZGF0YS5cbiAgICovXG4gIHJlbGVhc2VBc3luYyh0YWJsZUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xufVxuIiwiaW1wb3J0IHsgSW50ZXJuYWxBcGlEaXNwYXRjaGVyIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEFwaVNlcnZpY2VSZWdpc3RyeSB9IGZyb20gJy4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9BY2Nlc3NpYmlsaXR5U2VydmljZUltcGwnO1xuaW1wb3J0IHsgQW5pbWF0aW9uU2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvQW5pbWF0aW9uU2VydmljZUltcGwnO1xuaW1wb3J0IHsgQW5ub3RhdGlvblNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL0Fubm90YXRpb25TZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBEYXRhU291cmNlU2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvRGF0YVNvdXJjZVNlcnZpY2VJbXBsJztcbmltcG9ydCB7IEV4cG9ydFNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL0V4cG9ydFNlcnZpY2VJbXBsJztcbmltcG9ydCB7IEV4dGVybmFsQ29udGV4dE1lbnVTZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9FeHRlcm5hbENvbnRleHRNZW51U2VydmljZUltcGwnO1xuaW1wb3J0IHsgRmlsdGVyU2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvRmlsdGVyU2VydmljZUltcGwnO1xuaW1wb3J0IHsgR2V0RGF0YVNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL0dldERhdGFTZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25TZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9Ob3RpZmljYXRpb25TZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBQYXJhbWV0ZXJzU2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvUGFyYW1ldGVyc1NlcnZpY2VJbXBsJztcbmltcG9ydCB7IFNlbGVjdGlvblNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL1NlbGVjdGlvblNlcnZpY2VJbXBsJztcbmltcG9ydCB7IFNpemVTZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9TaXplU2VydmljZUltcGwnO1xuaW1wb3J0IHsgVmlzdWFsTW9kZWxTZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9WaXN1YWxNb2RlbFNlcnZpY2VJbXBsJztcbmltcG9ydCB7IFZpelNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL1ZpelNlcnZpY2VJbXBsJztcbmltcG9ydCB7IFpvbmVTZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9ab25lU2VydmljZUltcGwnO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJBbGxTaGFyZWRTZXJ2aWNlcyhkaXNwYXRjaGVyOiBJbnRlcm5hbEFwaURpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQ6IG51bWJlcik6IHZvaWQge1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgQW5pbWF0aW9uU2VydmljZUltcGwoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCkpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgRGF0YVNvdXJjZVNlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQpKTtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChyZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IEV4cG9ydFNlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQpKTtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChyZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IEdldERhdGFTZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCByZWdpc3RyeUlkKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBGaWx0ZXJTZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCByZWdpc3RyeUlkKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBOb3RpZmljYXRpb25TZXJ2aWNlSW1wbChkaXNwYXRjaGVyKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBQYXJhbWV0ZXJzU2VydmljZUltcGwoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCkpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgU2VsZWN0aW9uU2VydmljZUltcGwoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCkpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgQW5ub3RhdGlvblNlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQpKTtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChyZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IFpvbmVTZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCByZWdpc3RyeUlkKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBTaXplU2VydmljZUltcGwoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCkpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgVmlzdWFsTW9kZWxTZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCByZWdpc3RyeUlkKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBWaXpTZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCByZWdpc3RyeUlkKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBFeHRlcm5hbENvbnRleHRNZW51U2VydmljZUltcGwoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCkpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQpKTtcbn1cbiIsImltcG9ydCB7IEVycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vVGFibGVhdUVycm9yJztcblxuLyoqXG4gKiBCYXNlIGludGVyZmFjZSBmb3IgYW4gYXBpIHNlcnZpY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcGlTZXJ2aWNlIHtcbiAgLyoqXG4gICAqIEdldHMgdGhlIG5hbWUgZm9yIHRoaXMgc2VydmljZS5cbiAgICovXG4gIHJlYWRvbmx5IHNlcnZpY2VOYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29sbGVjdGlvbiBvZiBzZXJ2aWNlIG5hbWUgd2hpY2ggd2lsbCBiZSByZWdpc3RlcmVkIGluIHRoZSBhcGktc2hhcmVkIHByb2plY3RcbiAqL1xuZXhwb3J0IGNvbnN0IGVudW0gU2VydmljZU5hbWVzIHtcbiAgQWNjZXNzaWJpbGl0eSA9ICdhY2Nlc3NpYmlsaXR5JyxcbiAgQXV0aGVudGljYXRpb24gPSAnYXV0aGVudGljYXRpb24nLFxuICBDbGllbnRJbmZvID0gJ2NsaWVudC1pbmZvLXNlcnZpY2UnLFxuICBEYXRhU291cmNlU2VydmljZSA9ICdkYXRhLXNvdXJjZS1zZXJ2aWNlJyxcbiAgR2V0RGF0YSA9ICdnZXQtZGF0YS1zZXJ2aWNlJyxcbiAgRmlsdGVyID0gJ2ZpbHRlci1zZXJ2aWNlJyxcbiAgTm90aWZpY2F0aW9uID0gJ25vdGlmaWNhdGlvbi1zZXJ2aWNlJyxcbiAgUGFyYW1ldGVycyA9ICdwYXJhbWV0ZXJzLXNlcnZpY2UnLFxuICBTZWxlY3Rpb24gPSAnc2VsZWN0aW9uLXNlcnZpY2UnLFxuICBBbm5vdGF0aW9uID0gJ2Fubm90YXRpb24tc2VydmljZScsXG4gIFpvbmUgPSAnem9uZS1zZXJ2aWNlJyxcbiAgQW5pbWF0aW9uID0gJ2FuaW1hdGlvbi1zZXJ2aWNlJyxcbiAgVml6ID0gJ3Zpei1zZXJ2aWNlJyxcbiAgRXh0ZXJuYWxDb250ZXh0TWVudSA9ICdleHRlcm5hbC1jb250ZXh0LW1lbnUtc2VydmljZScsXG4gIEluaXRpYWxpemF0aW9uID0gJ2luaXRpYWxpemF0aW9uLXNlcnZpY2UnLFxuICBTdG9yeUFjdGl2YXRpb24gPSAnc3RvcnktYWN0aXZhdGlvbi1zZXJ2aWNlJyxcbiAgU2l6ZSA9ICdzaXplLXNlcnZpY2UnLFxuICBFeHBvcnQgPSAnZXhwb3J0LXNlcnZpY2UnLFxuICBWaXN1YWxNb2RlbCA9ICd2aXN1YWwtbW9kZWwtc2VydmljZScsXG59XG5cbi8qKlxuICogRG8gc29tZSBnbG9iYWwgZGVjbGFyYXRpb25zIHNvIHdlIGNhbiBjcmVhdGUgYSBzaW5nbGV0b24gb24gdGhlIHdpbmRvdyBvYmplY3RcbiAqL1xuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgV2luZG93IHtcbiAgICBfX3RhYmxlYXVBcGlTZXJ2aWNlUmVnaXN0cnk6IHsgW3JlZ2lzdHJ5SWQ6IG51bWJlcl06IFNlcnZpY2VSZWdpc3RyeSB9O1xuICB9XG59XG5cbmlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICB3aW5kb3cuX190YWJsZWF1QXBpU2VydmljZVJlZ2lzdHJ5ID0gd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeSB8fCB7fTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlUmVnaXN0cnkge1xuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgbmV3IHNlcnZpY2UgaW50byB0aGUgc2VydmljZSByZWdpc3RyeS4gQW55IGV4aXN0aW5nIG9uZSB3aWxsXG4gICAqIGJlIG92ZXJ3cml0dGVuLiB0aGUgc2VydmljZSBpcyByZWdpc3RlcmVkIHVuZGVyIHNlcnZpY2Uuc2VydmljZU5hbWVcbiAgICpcbiAgICogQHBhcmFtIHtBcGlTZXJ2aWNlfSBzZXJ2aWNlIFRoZSBzZXJ2aXZlIHRvIHJlZ2lzdGVyXG4gICAqL1xuICByZWdpc3RlclNlcnZpY2Uoc2VydmljZTogQXBpU2VydmljZSk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgZ2l2ZW4gc2VydmljZSBmcm9tIHRoZSByZWdpc3RyeS4gSWYgdGhlcmUgaXMgbm90IGFcbiAgICogc2VydmljZSByZWdpc3RlcmVkIHVuZGVyIHRoYXQgbmFtZSwgdGhyb3dzIGFuZCBlcnJvclxuICAgKlxuICAgKiBAdGVtcGxhdGUgVCBUaGUgdHlwZSBvZiB0aGUgc2VydmljZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VydmljZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHNlcnZpY2UuXG4gICAqIEByZXR1cm5zIHtUfSBUaGUgcmVxdWVzdGVkIHNlcnZpY2VcbiAgICovXG4gIGdldFNlcnZpY2U8VCBleHRlbmRzIEFwaVNlcnZpY2U+KHNlcnZpY2VOYW1lOiBzdHJpbmcpOiBUO1xufVxuXG5jbGFzcyBTZXJ2aWNlUmVnaXN0cnlJbXBsIGltcGxlbWVudHMgU2VydmljZVJlZ2lzdHJ5IHtcbiAgcHJpdmF0ZSBfc2VydmljZXM6IHsgW3NlcnZpY2VOYW1lOiBzdHJpbmddOiBBcGlTZXJ2aWNlIH07XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX3NlcnZpY2VzID0ge307XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJTZXJ2aWNlKHNlcnZpY2U6IEFwaVNlcnZpY2UpOiB2b2lkIHtcbiAgICB0aGlzLl9zZXJ2aWNlc1tzZXJ2aWNlLnNlcnZpY2VOYW1lXSA9IHNlcnZpY2U7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2VydmljZTxUIGV4dGVuZHMgQXBpU2VydmljZT4oc2VydmljZU5hbWU6IHN0cmluZyk6IFQge1xuICAgIGlmICghdGhpcy5fc2VydmljZXMuaGFzT3duUHJvcGVydHkoc2VydmljZU5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFNlcnZpY2Ugbm90IHJlZ2lzdGVyZWQ6ICR7c2VydmljZU5hbWV9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3NlcnZpY2VzW3NlcnZpY2VOYW1lXSBhcyBUO1xuICB9XG59XG5cbi8qKlxuICogU3RhdGljIGNsYXNzIHVzZWQgZm9yIGdldHRpbmcgYWNjZXNzIHRvIHRoZSBzaW5nbGUgaW5zdGFuY2VcbiAqIG9mIHRoZSBBcGlTZXJ2aWNlUmVnaXN0cnkgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWdpc3RyeUlkLlxuICpcbiAqIEV4dGVuc2lvbnMgYnkgZGVzaWduIGRvbid0IG5lZWQgdG8gc3RvcmUvYWNjZXNzIG11bHRpcGxlIHNlcnZpY2UgcmVnaXN0cmllcy4gVGhlaXIgc2luZ2xlIGluc3RhbmNlIG9mIFNlcnZpY2VSZWdpc3RyeSBpc1xuICogc3RvcmVkL2FjY2VzcyB3aXRoIHJlZ2lzdHJ5SWQgPSAwLlxuICpcbiAqIFdoZXJlYXMgRW1iZWRkaW5nIG5lZWRzIHRvIGJlIGF3YXJlIG9mIHdoaWNoIFNlcnZpY2VSZWdpc3RyeSB0byB1c2Ugd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgdml6emVzIGVtYmVkZGVkLlxuICogQW4gZXhhbXBsZSBvZiBob3cgd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeSB3aWxsIGxvb2sgd2hlbiB0aGVyZSBhcmUgdHdvIHZpenplczogeyAwIDogU2VydmljZVJlZ2lzdHJ5LCAxIDogU2VydmljZVJlZ2lzdHJ5fVxuICogd2hlcmUgcmVnaXN0cnkgSUQgb2YgMCAmIDEgcmVmZXJzIHRvIHZpeidzIGludGVybmFsIGlkZW50aWZpZXIgKHdoaWNoIGlzIGdlbmVyYXRlZCBieSBWaXpNYW5hZ2VyKS5cbiAqL1xuZXhwb3J0IGNsYXNzIEFwaVNlcnZpY2VSZWdpc3RyeSB7XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIFNlcnZpY2VSZWdpc3RyeVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBnZXQocmVnaXN0cnlJZDogbnVtYmVyKTogU2VydmljZVJlZ2lzdHJ5IHtcbiAgICBpZiAoIXdpbmRvdy5fX3RhYmxlYXVBcGlTZXJ2aWNlUmVnaXN0cnkgfHwgIXdpbmRvdy5fX3RhYmxlYXVBcGlTZXJ2aWNlUmVnaXN0cnlbcmVnaXN0cnlJZF0pIHtcbiAgICAgIEFwaVNlcnZpY2VSZWdpc3RyeS5zZXRJbnN0YW5jZShyZWdpc3RyeUlkLCBuZXcgU2VydmljZVJlZ2lzdHJ5SW1wbCgpKTtcbiAgICB9XG5cbiAgICBpZiAoIXdpbmRvdy5fX3RhYmxlYXVBcGlTZXJ2aWNlUmVnaXN0cnlbcmVnaXN0cnlJZF0pIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnU2VydmljZSByZWdpc3RyeSBmYWlsZWQnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeVtyZWdpc3RyeUlkXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgbWV0aG9kIHRoYXQgc2V0cyB0aGUgc2VydmljZSByZWdpc3RyeSBpbnN0YW5jZSBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgcmVnaXN0cnlJZC4gQ2FuIGJlIHVzZWQgYnkgdW5pdCB0ZXN0c1xuICAgKlxuICAgKiBAcGFyYW0ge1NlcnZpY2VSZWdpc3RyeX0gc2VydmljZVJlZ2lzdHJ5IFRoZSBuZXcgcmVnaXN0cnlcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgc2V0SW5zdGFuY2UocmVnaXN0cnlJZDogbnVtYmVyLCBzZXJ2aWNlUmVnaXN0cnk6IFNlcnZpY2VSZWdpc3RyeSk6IHZvaWQge1xuICAgIGlmICghd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeSkge1xuICAgICAgd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeSA9IHt9O1xuICAgIH1cbiAgICB3aW5kb3cuX190YWJsZWF1QXBpU2VydmljZVJlZ2lzdHJ5W3JlZ2lzdHJ5SWRdID0gc2VydmljZVJlZ2lzdHJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIE9ubHkgdXNlZCBieSB1bml0IHRlc3RzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGNsZWFyUmVnaXN0cnkoKTogdm9pZCB7XG4gICAgd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeSA9IHt9O1xuICB9XG5cbiAgLy8gUHJpdmF0ZSB0byBhdm9pZCBhbnlvbmUgY29uc3RydWN0aW5nIHRoaXNcbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG59XG4iLCJpbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgUGFyYW1ldGVySWQsIFZlcmJJZCwgVmlzdWFsSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVG9vbHRpcFRleHRSZXF1ZXN0TW9kZWwgfSBmcm9tICcuLi8uLi9Nb2RlbHMvQWNjZXNzaWJpbGl0eU1vZGVscyc7XG5pbXBvcnQgeyBBY2Nlc3NpYmlsaXR5U2VydmljZSB9IGZyb20gJy4uL0FjY2Vzc2liaWxpdHlTZXJ2aWNlJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBBY2Nlc3NpYmlsaXR5U2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBBY2Nlc3NpYmlsaXR5U2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLkFjY2Vzc2liaWxpdHk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VG9vbHRpcFRleHRBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQsIHR1cGxlSWQ6IG51bWJlcik6IFByb21pc2U8U3RyaW5nPiB7XG4gICAgbGV0IHRvb2x0aXBUZXh0UmVxdWVzdCA9IG5ldyBUb29sdGlwVGV4dFJlcXVlc3RNb2RlbCh2aXN1YWxJZCwgdHVwbGVJZCk7XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0VG9vbHRpcFRleHRBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVG9vbHRpcFRleHRSZXF1ZXN0XTogdG9vbHRpcFRleHRSZXF1ZXN0LFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRUb29sdGlwVGV4dCwgcGFyYW1ldGVycykudGhlbjxTdHJpbmc+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLnJlc3VsdCBhcyBTdHJpbmc7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbGVhdmVNYXJrTmF2aWdhdGlvbkFzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdsZWF2ZU1hcmtOYXZpZ2F0aW9uQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlJhaXNlTGVhdmVNYXJrTmF2Tm90aWZpY2F0aW9uLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBSZXBsYXlTcGVlZFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgUGFyYW1ldGVySWQsIFZlcmJJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MgYXMgRXh0ZXJuYWxFbnVtQ29udmVydGVyIH0gZnJvbSAnLi4vLi4vRW51bU1hcHBpbmdzL0V4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyc7XG5pbXBvcnQgeyBFcnJvckhlbHBlcnMgfSBmcm9tICcuLi8uLi9VdGlscy9FcnJvckhlbHBlcnMnO1xuaW1wb3J0IHsgQW5pbWF0aW9uU2VydmljZSB9IGZyb20gJy4uL0FuaW1hdGlvblNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vU2VydmljZUltcGxCYXNlJztcblxuZXhwb3J0IGNsYXNzIEFuaW1hdGlvblNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgQW5pbWF0aW9uU2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLkFuaW1hdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyByZXBsYXlBc3luYyhyZXBsYXlTcGVlZDogUmVwbGF5U3BlZWRUeXBlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5SZXBsYXlTcGVlZF06IDEuMCxcbiAgICB9O1xuXG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUVudW1WYWx1ZTxSZXBsYXlTcGVlZFR5cGU+KHJlcGxheVNwZWVkLCBSZXBsYXlTcGVlZFR5cGUsICdSZXBsYXlTcGVlZFR5cGUnKTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlJlcGxheVNwZWVkXSA9IEV4dGVybmFsRW51bUNvbnZlcnRlci5zZXRSZXBsYXlTcGVlZFR5cGUuY29udmVydChyZXBsYXlTcGVlZCk7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5SZXBsYXlBbmltYXRpb24sIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBBbm5vdGF0ZUVudW0sIEFubm90YXRpb24sIEV4ZWN1dGVQYXJhbWV0ZXJzLCBQYXJhbWV0ZXJJZCwgVmVyYklkLCBWaXN1YWxJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MgfSBmcm9tICcuLi8uLi9FbnVtTWFwcGluZ3MvSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzJztcbmltcG9ydCB7IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lciwgVHVwbGVTZWxlY3Rpb25Nb2RlbCB9IGZyb20gJy4uLy4uL01vZGVscy9TZWxlY3Rpb25Nb2RlbHMnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vLi4vVGFibGVhdUVycm9yJztcbmltcG9ydCB7IEFubm90YXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vQW5ub3RhdGlvblNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vU2VydmljZUltcGxCYXNlJztcblxuZXhwb3J0IGNsYXNzIEFubm90YXRpb25TZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIEFubm90YXRpb25TZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTZXJ2aWNlTmFtZXMuQW5ub3RhdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gYW5ub3RhdGUgYSBtYXJrIG9uIHRoZSBnaXZlbiB3b3Jrc2hlZXQuXG4gICAqXG4gICAqIEBwYXJhbSB2aXN1YWxJZFxuICAgKiBAcGFyYW0gbWFya1xuICAgKiBAcGFyYW0gYW5ub3RhdGlvblRleHRcbiAgICovXG4gIHB1YmxpYyBhbm5vdGF0ZU1hcmtBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQsIG1hcms6IENvbnRyYWN0Lk1hcmtJbmZvLCBhbm5vdGF0aW9uVGV4dDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc2VsZWN0aW9uTW9kZWxDb250YWluZXI6IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lciA9IHRoaXMucGFyc2VNYXJrU2VsZWN0aW9uSWRzKFttYXJrXSk7XG4gICAgY29uc3QgZHVtbXlUYXJnZXRQb2ludCA9IHsgeDogMCwgeTogMCB9O1xuICAgIGNvbnN0IGZvcm1hdHRlZFRleHQgPSBgPGZvcm1hdHRlZC10ZXh0PjxydW4+JHthbm5vdGF0aW9uVGV4dH08L3J1bj48L2Zvcm1hdHRlZC10ZXh0PmA7XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYW5ub3RhdGVNYXJrQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQsXG4gICAgICBbUGFyYW1ldGVySWQuQW5ub3RhdGVFbnVtXTogQW5ub3RhdGVFbnVtLk1hcmssXG4gICAgICBbUGFyYW1ldGVySWQuVGFyZ2V0UG9pbnRdOiBkdW1teVRhcmdldFBvaW50LFxuICAgICAgW1BhcmFtZXRlcklkLlNlbGVjdGlvbkxpc3RdOiBbc2VsZWN0aW9uTW9kZWxDb250YWluZXIuc2VsZWN0aW9uXSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Gb3JtYXR0ZWRUZXh0XTogZm9ybWF0dGVkVGV4dCxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkNyZWF0ZUFubm90YXRpb24sIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAvLyBFeHBlY3RpbmcgYW4gZW1wdHkgbW9kZWwgYW5kIGhlbmNlIHRoZSB2b2lkIHJlc3BvbnNlLlxuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byByZXRyaWV2ZSBhbm5vdGF0aW9ucyBmb3IgdGhlIGdpdmVuIHdvcmtzaGVldC5cbiAgICpcbiAgICogQHBhcmFtIHZpc3VhbElkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEFycmF5PEFubm90YXRpb24+Pn1cbiAgICovXG4gIHB1YmxpYyBnZXRBbm5vdGF0aW9uc0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuQW5ub3RhdGlvbj4+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0QW5ub3RhdGlvbnNBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldEFubm90YXRpb25zLCBwYXJhbWV0ZXJzKS50aGVuPEFycmF5PENvbnRyYWN0LkFubm90YXRpb24+PigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGFubm90YXRpb25zTGlzdCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBBcnJheTxBbm5vdGF0aW9uPjtcbiAgICAgIHJldHVybiB0aGlzLmFubm90YXRpb25GaWx0ZXJNYXAoYW5ub3RhdGlvbnNMaXN0KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gcmVtb3ZlIGFuIGFubm90YXRpb24gZnJvbSBhIGdpdmVuIHdvcmtzaGVldC5cbiAgICpcbiAgICogQHBhcmFtIHZpc3VhbElkXG4gICAqIEBwYXJhbSBhbm5vdGF0aW9uXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlQW5ub3RhdGlvbkFzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCwgYW5ub3RhdGlvbjogQ29udHJhY3QuQW5ub3RhdGlvbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyOiBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIgPSB0aGlzLnBhcnNlQW5ub3RhdGlvblNlbGVjdGlvbklkcyhbYW5ub3RhdGlvbl0pO1xuXG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3JlbW92ZUFubm90YXRpb25Bc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TZWxlY3Rpb25MaXN0XTogW3NlbGVjdGlvbk1vZGVsQ29udGFpbmVyLnNlbGVjdGlvbl0sXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5SZW1vdmVBbm5vdGF0aW9uLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgLy8gRXhwZWN0aW5nIGFuIGVtcHR5IG1vZGVsIGFuZCBoZW5jZSB0aGUgdm9pZCByZXNwb25zZS5cbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gcHJlcGFyZSB0aGUgcHJlcyBtb2RlbHMgZm9yIHNlbGVjdGlvbiBieSBNYXJrc0luZm9cbiAgICogQHBhcmFtIG1hcmtzXG4gICAqL1xuICBwcml2YXRlIHBhcnNlTWFya1NlbGVjdGlvbklkcyhtYXJrczogQXJyYXk8Q29udHJhY3QuTWFya0luZm8+KTogU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyIHtcbiAgICBjb25zdCBpZHM6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgICBjb25zdCBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lcjogU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyID0gbmV3IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lcigpO1xuICAgIG1hcmtzLmZvckVhY2goKG1hcmspID0+IHtcbiAgICAgIGNvbnN0IHR1cGxlSWQ6IG51bWJlciB8IHVuZGVmaW5lZCA9IG1hcmsudHVwbGVJZDtcbiAgICAgIGlmICh0dXBsZUlkICE9PSB1bmRlZmluZWQgJiYgdHVwbGVJZCAhPT0gbnVsbCAmJiB0dXBsZUlkID4gMCkge1xuICAgICAgICBpZHMucHVzaCh0dXBsZUlkLnRvU3RyaW5nKCkpOyAvLyBjb2xsZWN0IHRoZSB0dXBsZSBpZHNcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnaW52YWxpZCB0dXBsZUlkJyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKGlkcy5sZW5ndGggIT09IDApIHtcbiAgICAgIC8vIHR1cGxlIGlkcyBiYXNlZCBzZWxlY3Rpb25cbiAgICAgIGNvbnN0IHR1cGxlU2VsZWN0aW9uTW9kZWw6IFR1cGxlU2VsZWN0aW9uTW9kZWwgPSBuZXcgVHVwbGVTZWxlY3Rpb25Nb2RlbCgpO1xuICAgICAgdHVwbGVTZWxlY3Rpb25Nb2RlbC5zZWxlY3Rpb25UeXBlID0gJ3R1cGxlcyc7XG4gICAgICB0dXBsZVNlbGVjdGlvbk1vZGVsLm9iamVjdElkcyA9IGlkcztcbiAgICAgIHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLnNlbGVjdGlvbiA9IHR1cGxlU2VsZWN0aW9uTW9kZWw7XG4gICAgfVxuICAgIHJldHVybiBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gcHJlcGFyZSB0aGUgcHJlcyBtb2RlbHMgZm9yIHNlbGVjdGlvbiBieSBNYXJrQW5ub3RhdGlvbkluZm9cbiAgICogQHBhcmFtIG1hcmtzXG4gICAqL1xuICBwcml2YXRlIHBhcnNlQW5ub3RhdGlvblNlbGVjdGlvbklkcyhhbm5vdGF0aW9uczogQXJyYXk8Q29udHJhY3QuQW5ub3RhdGlvbj4pOiBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIge1xuICAgIGNvbnN0IGlkczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICAgIGNvbnN0IHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyOiBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIgPSBuZXcgU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyKCk7XG4gICAgYW5ub3RhdGlvbnMuZm9yRWFjaCgoYW5ub3RhdGlvbikgPT4ge1xuICAgICAgY29uc3QgYW5ub3RhdGlvbklkOiBudW1iZXIgfCB1bmRlZmluZWQgPSBhbm5vdGF0aW9uLmFubm90YXRpb25JZDtcbiAgICAgIGlmIChhbm5vdGF0aW9uSWQgIT09IHVuZGVmaW5lZCAmJiBhbm5vdGF0aW9uSWQgIT09IG51bGwgJiYgYW5ub3RhdGlvbklkID49IDApIHtcbiAgICAgICAgaWRzLnB1c2goYW5ub3RhdGlvbklkLnRvU3RyaW5nKCkpOyAvLyBjb2xsZWN0IHRoZSBhbm5vdGF0aW9uIGlkc1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FcnJvckNvZGVzLkludGVybmFsRXJyb3IsICdpbnZhbGlkIGFubm90YXRpb25JZCcpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChpZHMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAvLyBhbm5vdGF0aW9uIGlkcyBiYXNlZCBzZWxlY3Rpb25cbiAgICAgIGNvbnN0IHR1cGxlU2VsZWN0aW9uTW9kZWw6IFR1cGxlU2VsZWN0aW9uTW9kZWwgPSBuZXcgVHVwbGVTZWxlY3Rpb25Nb2RlbCgpO1xuICAgICAgdHVwbGVTZWxlY3Rpb25Nb2RlbC5zZWxlY3Rpb25UeXBlID0gJ2Fubm90YXRpb25zJztcbiAgICAgIHR1cGxlU2VsZWN0aW9uTW9kZWwub2JqZWN0SWRzID0gaWRzO1xuICAgICAgc2VsZWN0aW9uTW9kZWxDb250YWluZXIuc2VsZWN0aW9uID0gdHVwbGVTZWxlY3Rpb25Nb2RlbDtcbiAgICB9XG4gICAgcmV0dXJuIHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byBtYXAgQW5ub3RhdGlvbiB0byBNYXJrQW5ub3RhdGlvbkluZm9cbiAgICogQHBhcmFtIGFubm90YXRpb25cbiAgICogQHJldHVybnMge0Fubm90YXRpb259XG4gICAqL1xuICBwcml2YXRlIG1hcEFubm90YXRpb24oYW5ub3RhdGlvbjogQW5ub3RhdGlvbik6IENvbnRyYWN0LkFubm90YXRpb24ge1xuICAgIHJldHVybiB7XG4gICAgICBhbm5vdGF0aW9uSFRNTDogYW5ub3RhdGlvbi5hbm5vdGF0aW9uVGV4dCxcbiAgICAgIGFubm90YXRpb25JZDogYW5ub3RhdGlvbi5hbm5vdGF0aW9uSWQsXG4gICAgICBhbm5vdGF0aW9uVGV4dDogYW5ub3RhdGlvbi5hbm5vdGF0aW9uUGxhaW5UZXh0LFxuICAgICAgYW5ub3RhdGlvblR5cGU6IEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncy5hbm5vdGF0aW9uVHlwZS5jb252ZXJ0KGFubm90YXRpb24uYW5ub3RhdGVFbnVtKSxcbiAgICAgIHR1cGxlSWQ6IGFubm90YXRpb24udHVwbGVJZCEsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXIgdGhlIEFubm90YXRpb25zIHRvIE1hcmsgQW5ub3RhdGlvbnMsIGFuZCBtYXAgdGhlbSB0byBNYXJrQW5ub3RhdGlvbkluZm9cbiAgICogQHBhcmFtIGFubm90YXRpb25zXG4gICAqIEByZXR1cm5zIHtBcnJheTxBbm5vdGF0aW9uPn1cbiAgICovXG4gIHByaXZhdGUgYW5ub3RhdGlvbkZpbHRlck1hcChhbm5vdGF0aW9uczogQXJyYXk8QW5ub3RhdGlvbj4pOiBBcnJheTxDb250cmFjdC5Bbm5vdGF0aW9uPiB7XG4gICAgY29uc3QgYW5ub3RhdGlvbkluZm9zID0gYW5ub3RhdGlvbnMubWFwKChhbm5vdGF0aW9uKSA9PiB0aGlzLm1hcEFubm90YXRpb24oYW5ub3RhdGlvbikpO1xuXG4gICAgcmV0dXJuIGFubm90YXRpb25JbmZvcztcbiAgfVxufVxuIiwiaW1wb3J0IHsgRW1iZWRkaW5nQm9vdHN0cmFwSW5mbywgRXhlY3V0ZVBhcmFtZXRlcnMsIFBhcmFtZXRlcklkLCBWZXJiSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQ2xpZW50SW5mb1NlcnZpY2UgfSBmcm9tICcuLi9DbGllbnRJbmZvU2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuXG5leHBvcnQgY2xhc3MgQ2xpZW50SW5mb1NlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgQ2xpZW50SW5mb1NlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5DbGllbnRJbmZvO1xuICB9XG5cbiAgcHVibGljIGdldENsaWVudEluZm9Bc3luYygpOiBQcm9taXNlPEVtYmVkZGluZ0Jvb3RzdHJhcEluZm8+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkdldEVtYmVkZGluZ0NsaWVudEluZm87XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldENsaWVudEluZm9Bc3luYycsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxFbWJlZGRpbmdCb290c3RyYXBJbmZvPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGNsaWVudEluZm8gPSByZXNwb25zZS5yZXN1bHQgYXMgRW1iZWRkaW5nQm9vdHN0cmFwSW5mbztcbiAgICAgIHJldHVybiBjbGllbnRJbmZvO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgKiBhcyBJbnRlcm5hbENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBDb25uZWN0aW9uRGVzY3JpcHRpb25TdW1tYXJ5LFxuICBEYXRhU2NoZW1hLFxuICBFeGVjdXRlUGFyYW1ldGVycyxcbiAgSW50ZXJuYWxBcGlEaXNwYXRjaGVyLFxuICBMb2dpY2FsVGFibGVJbmZvLFxuICBQYXJhbWV0ZXJJZCxcbiAgVGFibGVJbmZvLFxuICBUYWJsZUluZm9zLFxuICBWZXJiSWQsXG4gIFZpc3VhbElkLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGF0YVNvdXJjZSB9IGZyb20gJy4uLy4uL0RhdGFTb3VyY2UnO1xuaW1wb3J0IHsgRmllbGQgfSBmcm9tICcuLi8uLi9GaWVsZCc7XG5pbXBvcnQgeyBEYXRhU291cmNlSW1wbCB9IGZyb20gJy4uLy4uL0ltcGwvRGF0YVNvdXJjZUltcGwnO1xuaW1wb3J0IHsgRmllbGRJbXBsIH0gZnJvbSAnLi4vLi4vSW1wbC9GaWVsZEltcGwnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vLi4vVGFibGVhdUVycm9yJztcbmltcG9ydCB7IERhdGFTb3VyY2VTZXJ2aWNlIH0gZnJvbSAnLi4vRGF0YVNvdXJjZVNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vU2VydmljZUltcGxCYXNlJztcbmV4cG9ydCBjbGFzcyBEYXRhU291cmNlU2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBEYXRhU291cmNlU2VydmljZSB7XG4gIC8vIFNpbmNlIE9iamVjdCBNb2RlbCBpcyBzdXBwb3J0ZWQgc2luY2UgVGFibGVhdSAyMDIwLjIsIERhdGFTb3VyY2VTZXJ2aWNlSW1wbCBjYW4gYmUgaW5pdGlhbGl6ZWQgd2l0aCB0aGVcbiAgLy8gcGxhdGZvcm0gdmVyc2lvbiB3aGVuIE9NIHdhcyBzdXBwb3J0ZWQuIE9uY2Ugd2UgZHJvcCBzdXBwb3J0IGZvciBUYWJsZWF1IHZlcnNpb25zIDw9IDIwMjAuMSwgYWxsIGFkZGl0aW9uYWxcbiAgLy8gY29kZSBpbiBoZXJlIGZvciBPYmplY3QgTW9kZWwgY2FuIGJlIHJlbW92ZWQuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihkaXNwYXRjaGVyOiBJbnRlcm5hbEFwaURpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQ6IG51bWJlcikge1xuICAgIHN1cGVyKGRpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQpO1xuICB9XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLkRhdGFTb3VyY2VTZXJ2aWNlO1xuICB9XG5cbiAgcHVibGljIHJlZnJlc2hBc3luYyhkYXRhU291cmNlSWQ/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAncmVmcmVzaEFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EZWx0YVRpbWVNc106IDAsXG4gICAgICBbUGFyYW1ldGVySWQuU2hvdWxkUmVmcmVzaERTXTogdHJ1ZSxcbiAgICB9O1xuXG4gICAgLy8gT24gc2VydmVyOiBOb3QgcGFzc2luZyB0aGUgZGF0YXNvdXJjZSBpZCB3aWxsIHJlZnJlc2ggYWxsIGRhdGFzb3VyY2VzLlxuICAgIGlmIChkYXRhU291cmNlSWQpIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRGF0YVNvdXJjZUlkXSA9IGRhdGFTb3VyY2VJZDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5SZWZyZXNoRGF0YVNvdXJjZSwgcGFyYW1ldGVycykudGhlbjx2b2lkPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBY3RpdmVUYWJsZXNBc3luYyhkYXRhU291cmNlSWQ6IHN0cmluZyk6IFByb21pc2U8QXJyYXk8VGFibGVJbmZvPj4ge1xuICAgIGNvbnN0IGpvaW5QYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0QWN0aXZlVGFibGVzQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkRhdGFTb3VyY2VJZF06IGRhdGFTb3VyY2VJZCxcbiAgICB9O1xuXG4gICAgLy8gR2V0IHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgdGFibGVzIHVzZWQgYnkgdGhpcyBjb25uZWN0aW9uXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0QWN0aXZlVGFibGVzLCBqb2luUGFyYW1ldGVycykudGhlbjxBcnJheTxUYWJsZUluZm8+Pigoam9pblJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCB0YWJsZUluZm9zID0gam9pblJlc3BvbnNlLnJlc3VsdCBhcyBUYWJsZUluZm9zO1xuXG4gICAgICAvLyBnZXRBY3RpdmVUYWJsZXMgaXMgdW5zdXBwb3J0ZWQgZm9yIGN1YmVzIGFuZCBHQS4gV2UgZG8gbm90IGhhdmUgYSBjb25uZWN0aW9uIHR5cGUgcHJvcGVydHlcbiAgICAgIC8vIGF2YWlsYWJsZSBmcm9tIHRoZSBwbGF0Zm9ybSAoaW50ZW50aW9uYWxseSwgdG8gcmVkdWNlIGNvZGUgY2h1cm4gYXMgbmV3IGNvbm5lY3Rpb25zIGFyZSBhZGRlZCkuXG4gICAgICAvLyBJbnN0ZWFkLGp1c3QgY2hlY2sgaWYgYW55IHRhYmxlcyBhcmUgcmV0dXJuZWQuIFRoaXMgYXJyYXkgd2lsbCBiZSBlbXB0eSBmb3IgYW55IG5vbi10YWJsZSBiYXNlZCBkYXRhc291cmNlLlxuICAgICAgaWYgKHRhYmxlSW5mb3MudGFibGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuVW5zdXBwb3J0ZWRNZXRob2RGb3JEYXRhU291cmNlVHlwZSwgYGdldEFjdGl2ZVRhYmxlcyBpcyBub3Qgc3VwcG9ydGVkIGZvcjogJHtkYXRhU291cmNlSWR9YCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0YWJsZUluZm9zLnRhYmxlcztcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXREYXRhU291cmNlc0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8RGF0YVNjaGVtYT4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXREYXRhU291cmNlc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0RGF0YVNvdXJjZXMsIHBhcmFtZXRlcnMpLnRoZW48RGF0YVNjaGVtYT4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBkYXRhU2NoZW1hID0gcmVzcG9uc2UucmVzdWx0IGFzIERhdGFTY2hlbWE7XG4gICAgICByZXR1cm4gZGF0YVNjaGVtYTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBbGxEYXRhU291cmNlc0FzeW5jKCk6IFByb21pc2U8RGF0YVNjaGVtYT4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRBbGxEYXRhU291cmNlc0FzeW5jJyxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldEFsbERhdGFTb3VyY2VzLCBwYXJhbWV0ZXJzKS50aGVuPERhdGFTY2hlbWE+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgZGF0YVNjaGVtYSA9IHJlc3BvbnNlLnJlc3VsdCBhcyBEYXRhU2NoZW1hO1xuICAgICAgcmV0dXJuIGRhdGFTY2hlbWE7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29ubmVjdGlvblN1bW1hcmllc0FzeW5jKGRhdGFTb3VyY2VJZDogc3RyaW5nKTogUHJvbWlzZTxDb25uZWN0aW9uRGVzY3JpcHRpb25TdW1tYXJ5W10+IHtcbiAgICBjb25zdCBwYXJhbXM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRDb25uZWN0aW9uU3VtbWFyaWVzQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkRhdGFTb3VyY2VJZF06IGRhdGFTb3VyY2VJZCxcbiAgICB9O1xuXG4gICAgLy8gR2V0IHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgdGFibGVzIHVzZWQgYnkgdGhpcyBjb25uZWN0aW9uXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0Q29ubmVjdGlvbkRlc2NyaXB0aW9uU3VtbWFyaWVzLCBwYXJhbXMpLnRoZW48Q29ubmVjdGlvbkRlc2NyaXB0aW9uU3VtbWFyeVtdPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGRlc2NyaXB0aW9uU3VtbWFyaWVzID0gcmVzcG9uc2UucmVzdWx0IGFzIENvbm5lY3Rpb25EZXNjcmlwdGlvblN1bW1hcnlbXTtcbiAgICAgIHJldHVybiBkZXNjcmlwdGlvblN1bW1hcmllcztcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRGaWVsZEFzeW5jKGdsb2JhbGZpZWxkTmFtZTogc3RyaW5nKTogUHJvbWlzZTxDb250cmFjdC5GaWVsZD4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuR2V0RmllbGRBbmREYXRhU291cmNlO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRGaWVsZEFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5GaWVsZElkXTogZ2xvYmFsZmllbGROYW1lLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48Q29udHJhY3QuRmllbGQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgZGF0YVNvdXJjZSA9IHJlc3BvbnNlLnJlc3VsdFtQYXJhbWV0ZXJJZC5EYXRhU291cmNlXSBhcyBJbnRlcm5hbENvbnRyYWN0LkRhdGFTb3VyY2U7XG4gICAgICBjb25zdCBmaWVsZCA9IHJlc3BvbnNlLnJlc3VsdFtQYXJhbWV0ZXJJZC5GaWVsZF0gYXMgRmllbGQ7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0RmllbGQoZmllbGQsIHRoaXMuY29udmVydERhdGFTb3VyY2UoZGF0YVNvdXJjZSkpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldExvZ2ljYWxUYWJsZXNBc3luYyhkYXRhU291cmNlSWQ6IHN0cmluZyk6IFByb21pc2U8QXJyYXk8TG9naWNhbFRhYmxlSW5mbz4+IHtcbiAgICBjb25zdCBwYXJhbXM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRMb2dpY2FsVGFibGVzQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkRhdGFTb3VyY2VJZF06IGRhdGFTb3VyY2VJZCxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldExvZ2ljYWxUYWJsZXMsIHBhcmFtcykudGhlbjxBcnJheTxMb2dpY2FsVGFibGVJbmZvPj4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm4gcmVzcG9uc2UucmVzdWx0IGFzIEFycmF5PExvZ2ljYWxUYWJsZUluZm8+O1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldFVuZGVybHlpbmdUYWJsZXNBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQpOiBQcm9taXNlPEFycmF5PExvZ2ljYWxUYWJsZUluZm8+PiB7XG4gICAgY29uc3QgcGFyYW1zOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0VW5kZXJseWluZ1RhYmxlc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0VW5kZXJseWluZ1RhYmxlcywgcGFyYW1zKS50aGVuPEFycmF5PExvZ2ljYWxUYWJsZUluZm8+PigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybiByZXNwb25zZS5yZXN1bHQgYXMgQXJyYXk8TG9naWNhbFRhYmxlSW5mbz47XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRGaWVsZChmaWVsZDogSW50ZXJuYWxDb250cmFjdC5GaWVsZCwgZGF0YVNvdXJjZTogQ29udHJhY3QuRGF0YVNvdXJjZSk6IENvbnRyYWN0LkZpZWxkIHtcbiAgICByZXR1cm4gbmV3IEZpZWxkKG5ldyBGaWVsZEltcGwoZmllbGQsIGRhdGFTb3VyY2UpKTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydERhdGFTb3VyY2UoZGF0YVNvdXJjZTogSW50ZXJuYWxDb250cmFjdC5EYXRhU291cmNlKTogQ29udHJhY3QuRGF0YVNvdXJjZSB7XG4gICAgcmV0dXJuIG5ldyBEYXRhU291cmNlKG5ldyBEYXRhU291cmNlSW1wbChkYXRhU291cmNlLCB0aGlzLl9yZWdpc3RyeUlkKSk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEV4ZWN1dGVQYXJhbWV0ZXJzLFxuICBFeHBvcnRDcm9zc3RhYlNoZWV0TWFwLFxuICBFeHBvcnRGaWxlLFxuICBFeHBvcnRQREZPcHRpb25zIGFzIEludGVybmFsRXhwb3J0UERGT3B0aW9ucyxcbiAgUGFyYW1ldGVySWQsXG4gIFZlcmJJZCxcbiAgVmlzdWFsSWQsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBDcm9zc3RhYkZpbGVGb3JtYXQsXG4gIEV4cG9ydERhdGFPcHRpb25zLFxuICBFeHBvcnRQREZPcHRpb25zIGFzIEV4dGVybmFsRXhwb3J0UERGT3B0aW9ucyxcbiAgRXhwb3J0U2NlbmFyaW9zRm9yUERGQW5kUG93ZXJQb2ludCxcbiAgU2hhcmVkRXJyb3JDb2RlcyxcbiAgU2hlZXRUeXBlIGFzIEV4dGVybmFsU2hlZXRUeXBlLFxufSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzIH0gZnJvbSAnLi4vLi4vRW51bU1hcHBpbmdzL0V4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyc7XG5pbXBvcnQgeyBFeHBvcnRIZWxwZXJzIH0gZnJvbSAnLi4vLi4vVXRpbHMvRXhwb3J0SGVscGVycyc7XG5pbXBvcnQgeyBFeHBvcnRTZXJ2aWNlIH0gZnJvbSAnLi4vRXhwb3J0U2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgRXJyb3JIZWxwZXJzIH0gZnJvbSAnLi4vLi4vVXRpbHMvRXJyb3JIZWxwZXJzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uLy4uL1RhYmxlYXVFcnJvcic7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBFeHBvcnRTZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIEV4cG9ydFNlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5FeHBvcnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0RXhwb3J0Q3Jvc3N0YWJTaGVldE1hcEFzeW5jKGN1cnJlbnRTaGVldFR5cGU6IEV4dGVybmFsU2hlZXRUeXBlKTogUHJvbWlzZTxFeHBvcnRDcm9zc3RhYlNoZWV0TWFwPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5HZXRFeHBvcnRDcm9zc3RhYlNoZWV0TWFwO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRFeHBvcnRDcm9zc3RhYlNoZWV0TWFwQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkN1cnJlbnRTaGVldFR5cGVdOiBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3Muc2hlZXRUeXBlLmNvbnZlcnQoY3VycmVudFNoZWV0VHlwZSksXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48RXhwb3J0Q3Jvc3N0YWJTaGVldE1hcD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQgYXMgRXhwb3J0Q3Jvc3N0YWJTaGVldE1hcDtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZXhwb3J0Q3Jvc3N0YWJBc3luYyhcbiAgICBzaGVldE5hbWU6IHN0cmluZyxcbiAgICBmb3JtYXQ6IENyb3NzdGFiRmlsZUZvcm1hdCxcbiAgICBleHBvcnRhYmxlV29ya3NoZWV0TmFtZXM6IEFycmF5PHN0cmluZz4sXG4gICAgY3VycmVudFNoZWV0VHlwZTogRXh0ZXJuYWxTaGVldFR5cGUsXG4gICk6IFByb21pc2U8RXhwb3J0RmlsZT4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlTaGVldE5hbWUoZXhwb3J0YWJsZVdvcmtzaGVldE5hbWVzLCBzaGVldE5hbWUpO1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlFbnVtVmFsdWU8Q3Jvc3N0YWJGaWxlRm9ybWF0Pihmb3JtYXQsIENyb3NzdGFiRmlsZUZvcm1hdCwgJ0Nyb3NzdGFiRmlsZUZvcm1hdCcpO1xuXG4gICAgLy8gVGhlIHByZXMgbGF5ZXIgY29tbWFuZCBmb3IgZXhwb3J0aW5nIENyb3NzdGFiIHVzZXMgU2ltcGxlU2hlZXRJZGVudGlmaWVycyBpbnN0ZWFkIG9mIHNoZWV0IG5hbWVzLlxuICAgIC8vIFRoZSBleHRlbnNpb25zLWFuZC1lbWJlZGRpbmctYXBpIGN1cnJlbnQgZG9lcyBub3Qgc3RvcmUgcmVmZXJlbmNlcyB0byB0aGUgU2ltcGxlU2hlZXRJZGVudGlmaWVycyBvZiBpdHMgc2hlZXRzXG4gICAgLy8gc28gd2UgY2FsbCBhIHByZXMgbGF5ZXIgY29tbWFuZCB0aGF0IGdpdmVzIHVzIHRoZSBTaW1wbGVTaGVldElkZW50aWZpZXIgZm9yIGVhY2ggc2hlZXQgbmFtZSB0aGF0IGFwcGVhcnMgaW4gdGhlXG4gICAgLy8gZXhwb3J0IENyb3NzdGFiIGRpYWxvZyBwb3B1cC5cbiAgICBjb25zdCBzaGVldE5hbWVUb0lkTWFwID0gYXdhaXQgdGhpcy5nZXRFeHBvcnRDcm9zc3RhYlNoZWV0TWFwQXN5bmMoY3VycmVudFNoZWV0VHlwZSk7XG4gICAgaWYgKCFzaGVldE5hbWVUb0lkTWFwW3NoZWV0TmFtZV0pIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnbWlzc2luZyBzaGVldCBkb2MgaWQgZnJvbSBzaGVldE1hcCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdleHBvcnRDcm9zc3RhYkFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TaGVldElkZW50aWZpZXJdOiBzaGVldE5hbWVUb0lkTWFwW3NoZWV0TmFtZV0sXG4gICAgICBbUGFyYW1ldGVySWQuU2VuZE5vdGlmaWNhdGlvbnNdOiB0cnVlLCAvLyBzZW5kIG5vdGlmaWNhdGlvbiBvbiBwcmVzIGxheWVyIHRoYXQgdHJpZ2dlcnMgZmlsZSBkb3dubG9hZFxuICAgIH07XG5cbiAgICAvLyBwcmVzIGxheWVyIGNvbW1hbmQgaW52b2tlZCBkZXBlbmRzIG9uIHRoZSBjcm9zc3RhYiBmaWxlIGZvcm1hdFxuICAgIGxldCB2ZXJiO1xuICAgIHN3aXRjaCAoZm9ybWF0KSB7XG4gICAgICBjYXNlIENyb3NzdGFiRmlsZUZvcm1hdC5DU1Y6XG4gICAgICAgIHZlcmIgPSBWZXJiSWQuRXhwb3J0Q3Jvc3N0YWJDc3ZEb3dubG9hZDtcbiAgICAgICAgLy8gQ1NWIG9ubHkgcGFyYW1ldGVyOiBzZWUgYnJvd3Nlci1jbGllbnRzL2V4cG9ydC1jcm9zc3RhYi1vcHRpb25zLWRpYWxvZyByZXBvXG4gICAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuVXNlVGFiRGVsaW1pdGVyc10gPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQ3Jvc3N0YWJGaWxlRm9ybWF0LkV4Y2VsOlxuICAgICAgICB2ZXJiID0gVmVyYklkLkV4cG9ydENyb3NzdGFiRXhjZWxEb3dubG9hZDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ3Vuc3VwcG9ydGVkIENyb3NzdGFiIGZpbGUgZm9ybWF0LicpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycylcbiAgICAgIC50aGVuPEV4cG9ydEZpbGU+KChyZXNwb25zZSkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQgYXMgRXhwb3J0RmlsZTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKCkgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuQ3Jvc3N0YWJDcmVhdGlvbkVycm9yLCAnQW4gdW5leHBlY3RlZCBlcnJvciBvY2N1cnJlZCB3aGlsZSBnZW5lcmF0aW5nIHRoZSBkb2N1bWVudC4nKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGV4cG9ydERhdGFBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQsIG9wdGlvbnM6IEV4cG9ydERhdGFPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUV4cG9ydERhdGFPcHRpb25zKG9wdGlvbnMpO1xuXG4gICAgLy8gUmVtb3ZlIGFueSBkdXBsaWNhdGVzIGZyb20gdGhlIGlucHV0IGFycmF5XG4gICAgY29uc3QgY29sdW1uc0FzU2V0OiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQob3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlQnlJZCk7XG4gICAgY29uc3QgY29sdW1uc1RvSW5jbHVkZUJ5SWQgPSBBcnJheS5mcm9tKGNvbHVtbnNBc1NldCk7XG5cbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkV4cG9ydERhdGFEb3dubG9hZDtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZXhwb3J0RGF0YUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkLFxuICAgICAgW1BhcmFtZXRlcklkLklnbm9yZUFsaWFzZXNdOiBvcHRpb25zLmlnbm9yZUFsaWFzZXMgPz8gZmFsc2UsXG4gICAgICBbUGFyYW1ldGVySWQuQ29sdW1uc1RvSW5jbHVkZUJ5SWRdOiBjb2x1bW5zVG9JbmNsdWRlQnlJZCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKVxuICAgICAgLnRoZW48dm9pZD4oKCkgPT4ge30pXG4gICAgICAuY2F0Y2goKCkgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuRGF0YUNyZWF0aW9uRXJyb3IsICdBbiB1bmV4cGVjdGVkIGVycm9yIG9jY3VycmVkIHdoaWxlIGdlbmVyYXRpbmcgdGhlIGRvY3VtZW50LicpO1xuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZXhwb3J0UG93ZXJQb2ludEFzeW5jKHNoZWV0TmFtZXM6IEFycmF5PHN0cmluZz4sIGV4cG9ydFNjZW5hcmlvczogRXhwb3J0U2NlbmFyaW9zRm9yUERGQW5kUG93ZXJQb2ludCk6IFByb21pc2U8RXhwb3J0RmlsZT4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlTaGVldE5hbWVzRm9yUERGQW5kUFBUKHNoZWV0TmFtZXMsIGV4cG9ydFNjZW5hcmlvcyk7XG5cbiAgICAvLyBOb3RlOiB0aGUgRXhwb3J0T3JpZ2luVXJsIHBhcmFtIGlzIGxpc3RlZCBhcyBvcHRpb25hbCBmb3IgdGhlIHByZXMgbGF5ZXIgY29tbWFuZCB3ZSBhcmUgaW52b2tpbmc7IGhvd2V2ZXIsXG4gICAgLy8gcmVjZW50IGNoYW5nZXMgd2VyZSBtYWRlIHRoYXQgZW5mb3JjZWQgdGhlIHVzZSBvZiB0aGUgZW1wdHkgc3RyaW5nIHdoZW4gaW52b2tpbmcgdGhpcyBjb21tYW5kIHdpdGggbm8gRXhwb3J0T3JpZ2luVXJsLlxuICAgIC8vIHNlZSBicm93c2VyLWNsaWVudHMvZXhwb3J0LXBvd2VycG9pbnQtb3B0aW9ucy1kaWFsb2cgcmVwby5cbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkV4cG9ydFBvd2VycG9pbnREb3dubG9hZDtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZXhwb3J0UG93ZXJQb2ludEFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5FeHBvcnRPcmlnaW5VcmxdOiAnJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TZWxlY3RlZFNoZWV0TmFtZXNdOiBzaGVldE5hbWVzLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpXG4gICAgICAudGhlbjxFeHBvcnRGaWxlPigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0IGFzIEV4cG9ydEZpbGU7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKCgpID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihcbiAgICAgICAgICBTaGFyZWRFcnJvckNvZGVzLlBvd2VyUG9pbnRDcmVhdGlvbkVycm9yLFxuICAgICAgICAgICdBbiBlcnJvciBvY2N1cmVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gZ2VuZXJhdGUgdGhlIFBvd2VyUG9pbnQgZmlsZS4nLFxuICAgICAgICApO1xuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZXhwb3J0UERGQXN5bmMoXG4gICAgc2hlZXROYW1lczogQXJyYXk8c3RyaW5nPixcbiAgICBleHRlcm5hbEV4cG9ydFBkZk9wdGlvbnM6IEV4dGVybmFsRXhwb3J0UERGT3B0aW9ucyxcbiAgICBleHBvcnRTY2VuYXJpb3M6IEV4cG9ydFNjZW5hcmlvc0ZvclBERkFuZFBvd2VyUG9pbnQsXG4gICk6IFByb21pc2U8RXhwb3J0RmlsZT4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlFeHBvcnRQREZPcHRpb25zKGV4dGVybmFsRXhwb3J0UGRmT3B0aW9ucyk7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVNoZWV0TmFtZXNGb3JQREZBbmRQUFQoc2hlZXROYW1lcywgZXhwb3J0U2NlbmFyaW9zKTtcblxuICAgIGNvbnN0IGludGVybmFsRXhwb3J0UGRmT3B0aW9uczogSW50ZXJuYWxFeHBvcnRQREZPcHRpb25zID0gYXdhaXQgdGhpcy5nZXRFeHBvcnRQREZPcHRpb25zQXN5bmMoKTtcbiAgICBFeHBvcnRIZWxwZXJzLnVwZGF0ZUludGVybmFsRXhwb3J0UERGT3B0aW9ucyhpbnRlcm5hbEV4cG9ydFBkZk9wdGlvbnMsIGV4dGVybmFsRXhwb3J0UGRmT3B0aW9ucywgc2hlZXROYW1lcyk7XG5cbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkV4cG9ydFBkZkRvd25sb2FkO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdleHBvcnRQREZBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuRXhwb3J0UGRmT3B0aW9uc106IGludGVybmFsRXhwb3J0UGRmT3B0aW9ucyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKVxuICAgICAgLnRoZW48RXhwb3J0RmlsZT4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBFeHBvcnRGaWxlO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5QREZDcmVhdGlvbkVycm9yLCAnVW5hYmxlIHRvIGNyZWF0ZSBQREYgYmVjYXVzZSBzb21ldGhpbmcgd2VudCB3cm9uZy4gVHJ5IGFnYWluLicpO1xuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RXhwb3J0UERGT3B0aW9uc0FzeW5jKCk6IFByb21pc2U8SW50ZXJuYWxFeHBvcnRQREZPcHRpb25zPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5HZXRFeHBvcnRQZGZPcHRpb25zO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRFeHBvcnRQZGZPcHRpb25zQXN5bmMnLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPEludGVybmFsRXhwb3J0UERGT3B0aW9ucz4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQgYXMgSW50ZXJuYWxFeHBvcnRQREZPcHRpb25zO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQXBpTWVudVR5cGUsIENvbnRleHRNZW51T3B0aW9ucyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgUGFyYW1ldGVySWQsIFZlcmJJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeHRlcm5hbENvbnRleHRNZW51U2VydmljZSB9IGZyb20gJy4uL0V4dGVybmFsQ29udGV4dE1lbnVTZXJ2aWNlJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBFeHRlcm5hbENvbnRleHRNZW51U2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBFeHRlcm5hbENvbnRleHRNZW51U2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLkV4dGVybmFsQ29udGV4dE1lbnU7XG4gIH1cblxuICBwdWJsaWMgYXBwZW5kQ29udGV4dE1lbnVBc3luYyhzaGVldE5hbWU6IHN0cmluZywgdGFyZ2V0TWVudTogQXBpTWVudVR5cGUsIGNvbmZpZzogQ29udGV4dE1lbnVPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkFwcGVuZEV4dGVybmFsTWVudUl0ZW07XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2FwcGVuZENvbnRleHRNZW51QXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLldvcmtzaGVldE5hbWVdOiBzaGVldE5hbWUsXG4gICAgICBbUGFyYW1ldGVySWQuRXh0ZXJuYWxNZW51SXRlbURpc3BsYXlOYW1lXTogY29uZmlnLmRpc3BsYXlOYW1lLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48c3RyaW5nPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IG5ld01lbnVJdGVtSWQgPSByZXNwb25zZS5yZXN1bHQgYXMgc3RyaW5nO1xuICAgICAgcmV0dXJuIG5ld01lbnVJdGVtSWQ7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlQ29udGV4dE1lbnVBc3luYyhzaGVldE5hbWU6IHN0cmluZywgdGFyZ2V0TWVudTogQXBpTWVudVR5cGUsIG1lbnVJdGVtSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuUmVtb3ZlRXh0ZXJuYWxNZW51SXRlbTtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAncmVtb3ZlQ29udGV4dE1lbnVBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuV29ya3NoZWV0TmFtZV06IHNoZWV0TmFtZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5FeHRlcm5hbE1lbnVJdGVtSWRdOiBtZW51SXRlbUlkLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZXhlY3V0ZUNvbnRleHRNZW51QXN5bmMoc2hlZXROYW1lOiBzdHJpbmcsIHRhcmdldE1lbnU6IEFwaU1lbnVUeXBlLCBtZW51SXRlbUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkV4ZWN1dGVFeHRlcm5hbE1lbnVJdGVtO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdleGVjdXRlQ29udGV4dE1lbnVBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuV29ya3NoZWV0TmFtZV06IHNoZWV0TmFtZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5FeHRlcm5hbE1lbnVJdGVtSWRdOiBtZW51SXRlbUlkLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgcmVuYW1lQ29udGV4dE1lbnVBc3luYyhzaGVldE5hbWU6IHN0cmluZywgdGFyZ2V0TWVudTogQXBpTWVudVR5cGUsIG1lbnVIZWFkZXI6IHN0cmluZywgbWVudURlc2NyaXB0aW9uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLlJlbmFtZUV4dGVybmFsTWVudTtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAncmVuYW1lQ29udGV4dE1lbnVBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuV29ya3NoZWV0TmFtZV06IHNoZWV0TmFtZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5FeHRlcm5hbE1lbnVIZWFkZXJdOiBtZW51SGVhZGVyLFxuICAgICAgW1BhcmFtZXRlcklkLkV4dGVybmFsTWVudURlc2NyaXB0aW9uXTogbWVudURlc2NyaXB0aW9uLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBEYXRlUmFuZ2VUeXBlLFxuICBFbWJlZGRpbmdFcnJvckNvZGVzLFxuICBFcnJvckNvZGVzLFxuICBGaWx0ZXJEb21haW5UeXBlLFxuICBGaWx0ZXJUeXBlIGFzIEV4dGVybmFsRmlsdGVyVHlwZSxcbiAgU2hhcmVkRXJyb3JDb2Rlcyxcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCAqIGFzIEludGVybmFsQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBGaWx0ZXJUeXBlLCBQYXJhbWV0ZXJJZCwgVmVyYklkLCBWaXN1YWxJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi8uLi8uLi9BcGlTaGFyZWQnO1xuaW1wb3J0IHsgRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzIGFzIEV4dGVybmFsRW51bUNvbnZlcnRlciB9IGZyb20gJy4uLy4uL0VudW1NYXBwaW5ncy9FeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MnO1xuaW1wb3J0IHsgSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzIGFzIEludGVybmFsRW51bUNvbnZlcnRlciB9IGZyb20gJy4uLy4uL0VudW1NYXBwaW5ncy9JbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MnO1xuaW1wb3J0IHtcbiAgQ2F0ZWdvcmljYWxEb21haW4sXG4gIENhdGVnb3JpY2FsRmlsdGVyLFxuICBIaWVyYXJjaGljYWxEYXRhVmFsdWUsXG4gIEhpZXJhcmNoaWNhbEZpbHRlcixcbiAgSGllcmFyY2hpY2FsTGV2ZWxEZXRhaWwsXG4gIFJhbmdlRG9tYWluLFxuICBSYW5nZUZpbHRlcixcbiAgUmVsYXRpdmVEYXRlRmlsdGVyLFxufSBmcm9tICcuLi8uLi9Nb2RlbHMvRmlsdGVyTW9kZWxzJztcbmltcG9ydCB7IERhdGFWYWx1ZSB9IGZyb20gJy4uLy4uL01vZGVscy9HZXREYXRhTW9kZWxzJztcbmltcG9ydCB7IERhdGFWYWx1ZUZhY3RvcnkgfSBmcm9tICcuLi8uLi9VdGlscy9EYXRhVmFsdWVGYWN0b3J5JztcbmltcG9ydCB7IFBhcmFtIH0gZnJvbSAnLi4vLi4vVXRpbHMvUGFyYW0nO1xuaW1wb3J0IHsgRmlsdGVyU2VydmljZSB9IGZyb20gJy4uL0ZpbHRlclNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vU2VydmljZUltcGxCYXNlJztcblxuZXhwb3J0IGNsYXNzIEZpbHRlclNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgRmlsdGVyU2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLkZpbHRlcjtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseUZpbHRlckFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZXM6IEFycmF5PHN0cmluZz4sXG4gICAgdXBkYXRlVHlwZTogQ29udHJhY3QuRmlsdGVyVXBkYXRlVHlwZSxcbiAgICBmaWx0ZXJPcHRpb25zOiBDb250cmFjdC5GaWx0ZXJPcHRpb25zLFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuQXBwbHlDYXRlZ29yaWNhbEZpbHRlcjtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYXBwbHlGaWx0ZXJBc3luYycsXG4gICAgfTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlZpc3VhbElkXSA9IHZpc3VhbElkO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmllbGROYW1lXSA9IGZpZWxkTmFtZTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWVzKSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsICd2YWx1ZXMgcGFyYW1ldGVyIGZvciBhcHBseUZpbHRlckFzeW5jIG11c3QgYmUgYW4gYXJyYXknKTtcbiAgICB9XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWx0ZXJWYWx1ZXNdID0gdmFsdWVzO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmlsdGVyVXBkYXRlVHlwZV0gPSBFeHRlcm5hbEVudW1Db252ZXJ0ZXIuZmlsdGVyVXBkYXRlVHlwZS5jb252ZXJ0KHVwZGF0ZVR5cGUpO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuSXNFeGNsdWRlTW9kZV0gPVxuICAgICAgZmlsdGVyT3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8IGZpbHRlck9wdGlvbnMuaXNFeGNsdWRlTW9kZSA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiBmaWx0ZXJPcHRpb25zLmlzRXhjbHVkZU1vZGU7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48c3RyaW5nPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybiBmaWVsZE5hbWU7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlSYW5nZUZpbHRlckFzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCwgZmllbGROYW1lOiBzdHJpbmcsIGZpbHRlck9wdGlvbnM6IENvbnRyYWN0LlJhbmdlRmlsdGVyT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5BcHBseVJhbmdlRmlsdGVyO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdhcHBseVJhbmdlRmlsdGVyQXN5bmMnLFxuICAgIH07XG5cbiAgICBpZiAoZmlsdGVyT3B0aW9ucy5taW4gIT09IHVuZGVmaW5lZCAmJiBmaWx0ZXJPcHRpb25zLm1pbiAhPT0gbnVsbCkge1xuICAgICAgbGV0IG1pbjogc3RyaW5nIHwgbnVtYmVyO1xuICAgICAgaWYgKGZpbHRlck9wdGlvbnMubWluIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICBtaW4gPSBQYXJhbS5zZXJpYWxpemVEYXRlRm9yUGxhdGZvcm0oZmlsdGVyT3B0aW9ucy5taW4pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWluID0gZmlsdGVyT3B0aW9ucy5taW47XG4gICAgICB9XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpbHRlclJhbmdlTWluXSA9IG1pbjtcbiAgICB9XG5cbiAgICBpZiAoZmlsdGVyT3B0aW9ucy5tYXggIT09IHVuZGVmaW5lZCAmJiBmaWx0ZXJPcHRpb25zLm1heCAhPT0gbnVsbCkge1xuICAgICAgbGV0IG1heDogc3RyaW5nIHwgbnVtYmVyO1xuICAgICAgaWYgKGZpbHRlck9wdGlvbnMubWF4IGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICBtYXggPSBQYXJhbS5zZXJpYWxpemVEYXRlRm9yUGxhdGZvcm0oZmlsdGVyT3B0aW9ucy5tYXgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWF4ID0gZmlsdGVyT3B0aW9ucy5tYXg7XG4gICAgICB9XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpbHRlclJhbmdlTWF4XSA9IG1heDtcbiAgICB9XG5cbiAgICAvLyBUaGUgbnVsbCBvcHRpb24gaXMgdXNlZCB3aXRoIG1pbittYXggZm9yICdpbmNsdWRlLXJhbmdlJyBvciAnaW5jbHVkZS1yYW5nZS1vci1udWxsJ1xuICAgIGlmIChmaWx0ZXJPcHRpb25zLm51bGxPcHRpb24pIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmlsdGVyUmFuZ2VOdWxsT3B0aW9uXSA9IEV4dGVybmFsRW51bUNvbnZlcnRlci5udWxsT3B0aW9ucy5jb252ZXJ0KGZpbHRlck9wdGlvbnMubnVsbE9wdGlvbik7XG4gICAgfVxuXG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWVsZE5hbWVdID0gZmllbGROYW1lO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuVmlzdWFsSWRdID0gdmlzdWFsSWQ7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48c3RyaW5nPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHRoaXMuYXBpRmlsdGVySGFuZGxlckNoZWNrRm9yQ29tbWFuZEVycm9yKHJlc3BvbnNlLnJlc3VsdCBhcyB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9KTtcbiAgICAgIHJldHVybiBmaWVsZE5hbWU7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlIaWVyYXJjaGljYWxGaWx0ZXJBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgdmFsdWVzOiBBcnJheTxzdHJpbmc+IHwgQ29udHJhY3QuSGllcmFyY2hpY2FsTGV2ZWxzLFxuICAgIHVwZGF0ZVR5cGU6IENvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGUsXG4gICAgZmlsdGVyT3B0aW9uczogQ29udHJhY3QuRmlsdGVyT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkhpZXJhcmNoaWNhbEZpbHRlcjtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYXBwbHlIaWVyYXJjaGljYWxGaWx0ZXJBc3luYycsXG4gICAgfTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlZpc3VhbElkXSA9IHZpc3VhbElkO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmllbGROYW1lXSA9IGZpZWxkTmFtZTtcblxuICAgIGNvbnN0IGhpZXJhcmNoaWNhbExldmVscyA9ICh2YWx1ZXMgYXMgQ29udHJhY3QuSGllcmFyY2hpY2FsTGV2ZWxzKS5sZXZlbHM7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShoaWVyYXJjaGljYWxMZXZlbHMpICYmIGhpZXJhcmNoaWNhbExldmVscy5sZW5ndGggPiAwKSB7XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpbHRlckxldmVsc10gPSBoaWVyYXJjaGljYWxMZXZlbHM7XG4gICAgfSBlbHNlIGlmICgodmFsdWVzIGFzIEFycmF5PFN0cmluZz4pLmxlbmd0aCA+IDApIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmlsdGVyVmFsdWVzXSA9IHZhbHVlcztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdGhlIHNlcnZlciBjb21tYW5kIGV4cGVjdHMgZW1wdHkgbGlzdCBmb3IgY2xlYXJpbmcgdGhlIGZpbHRlclxuICAgICAgLy8gaXQgYWxzbyBleHBlY3RzIGVpdGhlcnMgRmlsdGVyTGV2ZWxzIG9yIEZpbHRlclZhbHVlcyB0byBiZSBzZXRcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmlsdGVyTGV2ZWxzXSA9IFtdO1xuICAgIH1cblxuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmlsdGVyVXBkYXRlVHlwZV0gPSBFeHRlcm5hbEVudW1Db252ZXJ0ZXIuZmlsdGVyVXBkYXRlVHlwZS5jb252ZXJ0KHVwZGF0ZVR5cGUpO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuSXNFeGNsdWRlTW9kZV0gPSBmaWx0ZXJPcHRpb25zICYmICEhZmlsdGVyT3B0aW9ucy5pc0V4Y2x1ZGVNb2RlO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHN0cmluZz4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm4gZmllbGROYW1lO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGNsZWFyRmlsdGVyQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkLCBmaWVsZE5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5DbGVhckZpbHRlcjtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnY2xlYXJGaWx0ZXJBc3luYycsXG4gICAgfTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlZpc3VhbElkXSA9IHZpc3VhbElkO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmllbGROYW1lXSA9IGZpZWxkTmFtZTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48c3RyaW5nPigocmVzcG9zbmUpID0+IHtcbiAgICAgIHJldHVybiBmaWVsZE5hbWU7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlSZWxhdGl2ZURhdGVGaWx0ZXJBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQsIGZpZWxkTmFtZTogc3RyaW5nLCBvcHRpb25zOiBDb250cmFjdC5SZWxhdGl2ZURhdGVGaWx0ZXJPcHRpb25zKSB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5BcHBseVJlbGF0aXZlRGF0ZUZpbHRlcjtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYXBwbHlSZWxhdGl2ZURhdGVGaWx0ZXJBc3luYycsXG4gICAgfTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlZpc3VhbElkXSA9IHZpc3VhbElkO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmllbGROYW1lXSA9IGZpZWxkTmFtZTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlBlcmlvZFR5cGVdID0gRXh0ZXJuYWxFbnVtQ29udmVydGVyLnBlcmlvZFR5cGUuY29udmVydChvcHRpb25zLnBlcmlvZFR5cGUpO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRGF0ZVJhbmdlVHlwZV0gPSBFeHRlcm5hbEVudW1Db252ZXJ0ZXIuZGF0ZVJhbmdlVHlwZS5jb252ZXJ0KG9wdGlvbnMucmFuZ2VUeXBlKTtcbiAgICBpZiAob3B0aW9ucy5yYW5nZVR5cGUgPT09IERhdGVSYW5nZVR5cGUuTGFzdE4gfHwgb3B0aW9ucy5yYW5nZVR5cGUgPT09IERhdGVSYW5nZVR5cGUuTmV4dE4pIHtcbiAgICAgIGlmIChvcHRpb25zLnJhbmdlTiA9PT0gdW5kZWZpbmVkIHx8IG9wdGlvbnMucmFuZ2VOID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoXG4gICAgICAgICAgRW1iZWRkaW5nRXJyb3JDb2Rlcy5NaXNzaW5nUmFuZ2VORm9yUmVsYXRpdmVEYXRlRmlsdGVycyxcbiAgICAgICAgICAnTWlzc2luZyByYW5nZU4gZmllbGQgZm9yIGEgcmVsYXRpdmUgZGF0ZSBmaWx0ZXIgb2YgTEFTVE4gb3IgTkVYVE4uJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuUmFuZ2VOXSA9IG9wdGlvbnMucmFuZ2VOO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmFuY2hvckRhdGUgIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLmFuY2hvckRhdGUgIT09IG51bGwpIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuQW5jaG9yRGF0ZV0gPSB0aGlzLmNvbnZlcnRBbmNob3JEYXRlKG9wdGlvbnMuYW5jaG9yRGF0ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHN0cmluZz4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm4gcmVzcG9uc2UucmVzdWx0IGFzIHN0cmluZztcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRGaWx0ZXJzQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5GaWx0ZXI+PiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5HZXRGaWx0ZXJzO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRGaWx0ZXJzQXN5bmMnLFxuICAgIH07XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5WaXN1YWxJZF0gPSB2aXN1YWxJZDtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48QXJyYXk8Q29udHJhY3QuRmlsdGVyPj4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBmaWx0ZXJzID0gcmVzcG9uc2UucmVzdWx0IGFzIEFycmF5PEludGVybmFsQ29udHJhY3QuRmlsdGVyPjtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnREb21haW5GaWx0ZXJzKGZpbHRlcnMpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldENhdGVnb3JpY2FsRG9tYWluQXN5bmMoXG4gICAgd29ya3NoZWV0TmFtZTogc3RyaW5nLFxuICAgIGZpZWxkSWQ6IHN0cmluZyxcbiAgICBkb21haW5UeXBlOiBGaWx0ZXJEb21haW5UeXBlLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkNhdGVnb3JpY2FsRG9tYWluPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5HZXRDYXRlZ29yaWNhbERvbWFpbjtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0Q2F0ZWdvcmljYWxEb21haW5Bc3luYycsXG4gICAgfTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlZpc3VhbElkXSA9IHtcbiAgICAgIHdvcmtzaGVldDogd29ya3NoZWV0TmFtZSxcbiAgICB9O1xuXG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWVsZElkXSA9IGZpZWxkSWQ7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5Eb21haW5UeXBlXSA9IEV4dGVybmFsRW51bUNvbnZlcnRlci5maWx0ZXJEb21haW5UeXBlLmNvbnZlcnQoZG9tYWluVHlwZSk7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPENvbnRyYWN0LkNhdGVnb3JpY2FsRG9tYWluPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGRvbWFpbiA9IHJlc3BvbnNlLnJlc3VsdCBhcyBJbnRlcm5hbENvbnRyYWN0LkNhdGVnb3JpY2FsRG9tYWluO1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVydENhdGVnb3JpY2FsRG9tYWluKGRvbWFpbiwgZG9tYWluVHlwZSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0UmFuZ2VEb21haW5Bc3luYyh3b3Jrc2hlZXROYW1lOiBzdHJpbmcsIGZpZWxkSWQ6IHN0cmluZywgZG9tYWluVHlwZTogRmlsdGVyRG9tYWluVHlwZSk6IFByb21pc2U8Q29udHJhY3QuUmFuZ2VEb21haW4+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkdldFJhbmdlRG9tYWluO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRSYW5nZURvbWFpbkFzeW5jJyxcbiAgICB9O1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuVmlzdWFsSWRdID0ge1xuICAgICAgd29ya3NoZWV0OiB3b3Jrc2hlZXROYW1lLFxuICAgIH07XG5cbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpZWxkSWRdID0gZmllbGRJZDtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkRvbWFpblR5cGVdID0gRXh0ZXJuYWxFbnVtQ29udmVydGVyLmZpbHRlckRvbWFpblR5cGUuY29udmVydChkb21haW5UeXBlKTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48Q29udHJhY3QuUmFuZ2VEb21haW4+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgZG9tYWluID0gcmVzcG9uc2UucmVzdWx0IGFzIEludGVybmFsQ29udHJhY3QuUmFuZ2VEb21haW47XG5cbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRSYW5nZURvbWFpbihkb21haW4sIGRvbWFpblR5cGUpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldERhc2hib2FyZEZpbHRlcnNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkZpbHRlcj4+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkdldERhc2hib2FyZEZpbHRlcnM7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldERhc2hib2FyZEZpbHRlcnNBc3luYycsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48QXJyYXk8Q29udHJhY3QuRmlsdGVyPj4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBmaWx0ZXJzID0gcmVzcG9uc2UucmVzdWx0IGFzIEFycmF5PEludGVybmFsQ29udHJhY3QuRmlsdGVyPjtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnREb21haW5GaWx0ZXJzKGZpbHRlcnMpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFwcGx5RGFzaGJvYXJkRmlsdGVyQXN5bmMoXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgdmFsdWVzOiBBcnJheTxzdHJpbmc+LFxuICAgIHVwZGF0ZVR5cGU6IENvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGUsXG4gICAgZmlsdGVyT3B0aW9uczogQ29udHJhY3QuRmlsdGVyT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkRhc2hib2FyZENhdGVnb3JpY2FsRmlsdGVyO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdhcHBseURhc2hib2FyZEZpbHRlckFzeW5jJyxcbiAgICB9O1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmllbGROYW1lXSA9IGZpZWxkTmFtZTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpbHRlclZhbHVlc10gPSB2YWx1ZXM7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWx0ZXJVcGRhdGVUeXBlXSA9IEV4dGVybmFsRW51bUNvbnZlcnRlci5maWx0ZXJVcGRhdGVUeXBlLmNvbnZlcnQodXBkYXRlVHlwZSk7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5Jc0V4Y2x1ZGVNb2RlXSA9IGZpbHRlck9wdGlvbnMgJiYgISFmaWx0ZXJPcHRpb25zLmlzRXhjbHVkZU1vZGU7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48c3RyaW5nPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybiByZXNwb25zZS5yZXN1bHQgYXMgc3RyaW5nO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldEFwcGxpZWRXb3Jrc2hlZXRzQXN5bmMod29ya3NoZWV0TmFtZTogc3RyaW5nLCBmaWVsZElkOiBzdHJpbmcpOiBQcm9taXNlPEFycmF5PHN0cmluZz4+IHtcbiAgICBjb25zdCBzaGFyZWRGaWx0ZXJNb2RlbCA9IGF3YWl0IHRoaXMuZXhlY3V0ZUdldEFwcGxpZWRXb3Jrc2hlZXRzKHdvcmtzaGVldE5hbWUsIGZpZWxkSWQsICdnZXRBcHBsaWVkV29ya3NoZWV0c0FzeW5jJyk7XG4gICAgY29uc3Qgd29ya3NoZWV0TmFtZXM6IHN0cmluZ1tdID0gW107XG4gICAgc2hhcmVkRmlsdGVyTW9kZWwud29ya3NoZWV0cz8ubWFwKCh3b3Jrc2hlZXRJbmZvOiBJbnRlcm5hbENvbnRyYWN0LlNoYXJlZEZpbHRlcldvcmtzaGVldE1vZGVsKSA9PiB7XG4gICAgICBpZiAod29ya3NoZWV0SW5mby5pc1NlbGVjdGVkKSB7XG4gICAgICAgIHdvcmtzaGVldE5hbWVzLnB1c2god29ya3NoZWV0SW5mby53b3Jrc2hlZXROYW1lKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gd29ya3NoZWV0TmFtZXM7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc2V0QXBwbGllZFdvcmtzaGVldHNBc3luYyhcbiAgICB3b3Jrc2hlZXROYW1lOiBzdHJpbmcsXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgZmllbGRJZDogc3RyaW5nLFxuICAgIGFwcGx5VG9Xb3Jrc2hlZXRzOiBBcnJheTxzdHJpbmc+LFxuICApOiBQcm9taXNlPEFycmF5PHN0cmluZz4+IHtcbiAgICBjb25zdCBzaGFyZWRGaWx0ZXJNb2RlbCA9IGF3YWl0IHRoaXMuZXhlY3V0ZUdldEFwcGxpZWRXb3Jrc2hlZXRzKHdvcmtzaGVldE5hbWUsIGZpZWxkSWQsICdnZXRBcHBsaWVkV29ya3NoZWV0c0FzeW5jSW50ZXJuYWwnKTtcbiAgICBpZiAoIXNoYXJlZEZpbHRlck1vZGVsIHx8ICFzaGFyZWRGaWx0ZXJNb2RlbC53b3Jrc2hlZXRzKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ1RoaXMgZmlsdGVyIGRvZXMgbm90IGFwcGx5IHRvIG11bHRpcGxlIHdvcmtzaGVldHMnKTtcbiAgICB9XG5cbiAgICBjb25zdCBhbGxvd2VkV29ya3NoZWV0czogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgYWN0aXZlV29ya3NoZWV0ID0gJyc7XG4gICAgc2hhcmVkRmlsdGVyTW9kZWwud29ya3NoZWV0cy5mb3JFYWNoKCh3b3Jrc2hlZXQpID0+IHtcbiAgICAgIC8vIEdldCBhY3RpdmUgd29ya3NoZWV0XG4gICAgICBpZiAod29ya3NoZWV0LmlzQWN0aXZlKSB7XG4gICAgICAgIGFjdGl2ZVdvcmtzaGVldCA9IHdvcmtzaGVldC53b3Jrc2hlZXROYW1lO1xuICAgICAgfVxuXG4gICAgICAvLyBQb3B1bGF0ZSBhbGxvd2VkIHdvcmtzaGVldHNcbiAgICAgIGlmICh3b3Jrc2hlZXQuaXNTZWxlY3RlZCB8fCB3b3Jrc2hlZXQuaXNFbmFibGVkKSB7XG4gICAgICAgIGFsbG93ZWRXb3Jrc2hlZXRzLnB1c2god29ya3NoZWV0LndvcmtzaGVldE5hbWUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKGFjdGl2ZVdvcmtzaGVldCA9PT0gJycpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnTm8gYWN0aXZlIHdvcmtzaGVldCcpO1xuICAgIH1cblxuICAgIGlmICghYXBwbHlUb1dvcmtzaGVldHMuaW5jbHVkZXMoYWN0aXZlV29ya3NoZWV0KSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludGVybmFsRXJyb3IsIGAke2FjdGl2ZVdvcmtzaGVldH0gbXVzdCBiZSBpbmNsdWRlZCBpbiB0aGUgYXBwbGllZCB3b3Jrc2hlZXRzYCk7XG4gICAgfVxuXG4gICAgYXBwbHlUb1dvcmtzaGVldHMuZm9yRWFjaCgoc2hlZXQpID0+IHtcbiAgICAgIC8vIGNoZWNrIGlmIGl0J3MgcHJlc2VudCB3aXRoaW4gY29tcGF0aWJsZSBzaGVldHNcbiAgICAgIGlmICghYWxsb3dlZFdvcmtzaGVldHMuaW5jbHVkZXMoc2hlZXQpKSB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgVGhlIGZpZWxkICR7ZmllbGROYW1lfSBpc24ndCBhcHBsaWNhYmxlIHRvIHRoZSB3b3Jrc2hlZXQgJHtzaGVldH1gKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuQ2hhbmdlU2hhcmVkRmlsdGVyO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge307XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdID0gJ3NldEFwcGxpZWRXb3Jrc2hlZXRzQXN5bmMnO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuVmlzdWFsSWRdID0ge1xuICAgICAgd29ya3NoZWV0OiB3b3Jrc2hlZXROYW1lLFxuICAgIH07XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWVsZElkXSA9IGZpZWxkSWQ7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5TaGFyZWRGaWx0ZXJTaGVldHNdID0gYXBwbHlUb1dvcmtzaGVldHM7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48c3RyaW5nW10+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuIGFwcGx5VG9Xb3Jrc2hlZXRzO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gSGVscGVyIE1ldGhvZHNcblxuICBwcml2YXRlIGV4ZWN1dGVHZXRBcHBsaWVkV29ya3NoZWV0cyhcbiAgICB3b3Jrc2hlZXROYW1lOiBzdHJpbmcsXG4gICAgZmllbGRJZDogc3RyaW5nLFxuICAgIHRlbGVtZXRyeUZ1bmN0aW9uTmFtZTogc3RyaW5nLFxuICApOiBQcm9taXNlPEludGVybmFsQ29udHJhY3QuU2hhcmVkRmlsdGVyTW9kZWw+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkdldFNoYXJlZEZpbHRlcjtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHt9O1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXSA9IHRlbGVtZXRyeUZ1bmN0aW9uTmFtZTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlZpc3VhbElkXSA9IHtcbiAgICAgIHdvcmtzaGVldDogd29ya3NoZWV0TmFtZSxcbiAgICB9O1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmllbGRJZF0gPSBmaWVsZElkO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPEludGVybmFsQ29udHJhY3QuU2hhcmVkRmlsdGVyTW9kZWw+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3Qgc2hhcmVkRmlsdGVyTW9kZWwgPSByZXNwb25zZS5yZXN1bHQgYXMgSW50ZXJuYWxDb250cmFjdC5TaGFyZWRGaWx0ZXJNb2RlbDtcbiAgICAgIHJldHVybiBzaGFyZWRGaWx0ZXJNb2RlbDtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydERvbWFpbkZpbHRlcnMoZG9tYWluRmlsdGVyczogQXJyYXk8SW50ZXJuYWxDb250cmFjdC5GaWx0ZXI+KTogQXJyYXk8Q29udHJhY3QuRmlsdGVyPiB7XG4gICAgY29uc3QgZmlsdGVyczogQXJyYXk8Q29udHJhY3QuRmlsdGVyPiA9IFtdO1xuICAgIGRvbWFpbkZpbHRlcnMuZm9yRWFjaCgoZG9tYWluRmlsdGVyKSA9PiB7XG4gICAgICBzd2l0Y2ggKGRvbWFpbkZpbHRlci5maWx0ZXJUeXBlKSB7XG4gICAgICAgIGNhc2UgRmlsdGVyVHlwZS5DYXRlZ29yaWNhbDoge1xuICAgICAgICAgIGNvbnN0IGZpbHRlciA9IGRvbWFpbkZpbHRlciBhcyBJbnRlcm5hbENvbnRyYWN0LkNhdGVnb3JpY2FsRmlsdGVyO1xuICAgICAgICAgIGlmIChmaWx0ZXIpIHtcbiAgICAgICAgICAgIGZpbHRlcnMucHVzaCh0aGlzLmNvbnZlcnRDYXRlZ29yaWNhbEZpbHRlcihmaWx0ZXIpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIENhdGVnb3JpY2FsIEZpbHRlcicpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgRmlsdGVyVHlwZS5IaWVyYXJjaGljYWw6IHtcbiAgICAgICAgICBjb25zdCBmaWx0ZXIgPSBkb21haW5GaWx0ZXIgYXMgSW50ZXJuYWxDb250cmFjdC5IaWVyYXJjaGljYWxGaWx0ZXI7XG4gICAgICAgICAgaWYgKGZpbHRlcikge1xuICAgICAgICAgICAgZmlsdGVycy5wdXNoKHRoaXMuY29udmVydEhpZXJhcmNoaWNhbEZpbHRlcihmaWx0ZXIpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIEhpZXJhcmNoaWNhbCBGaWx0ZXInKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlIEZpbHRlclR5cGUuUmFuZ2U6IHtcbiAgICAgICAgICBjb25zdCBmaWx0ZXIgPSBkb21haW5GaWx0ZXIgYXMgSW50ZXJuYWxDb250cmFjdC5SYW5nZUZpbHRlcjtcbiAgICAgICAgICBpZiAoZmlsdGVyKSB7XG4gICAgICAgICAgICBmaWx0ZXJzLnB1c2godGhpcy5jb252ZXJ0UmFuZ2VGaWx0ZXIoZmlsdGVyKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBSYW5nZSBGaWx0ZXInKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlIEZpbHRlclR5cGUuUmVsYXRpdmVEYXRlOiB7XG4gICAgICAgICAgY29uc3QgZmlsdGVyID0gZG9tYWluRmlsdGVyIGFzIEludGVybmFsQ29udHJhY3QuUmVsYXRpdmVEYXRlRmlsdGVyO1xuICAgICAgICAgIGlmIChmaWx0ZXIpIHtcbiAgICAgICAgICAgIGZpbHRlcnMucHVzaCh0aGlzLmNvbnZlcnRSZWxhdGl2ZURhdGVGaWx0ZXIoZmlsdGVyKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBSZWxhdGl2ZSBEYXRlIEZpbHRlcicpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBmaWx0ZXJzO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0Q2F0ZWdvcmljYWxGaWx0ZXIoZG9tYWluRmlsdGVyOiBJbnRlcm5hbENvbnRyYWN0LkNhdGVnb3JpY2FsRmlsdGVyKTogQ29udHJhY3QuQ2F0ZWdvcmljYWxGaWx0ZXIge1xuICAgIGNvbnN0IGFwcGxpZWRWYWx1ZXM6IEFycmF5PENvbnRyYWN0LkRhdGFWYWx1ZT4gPSBkb21haW5GaWx0ZXIudmFsdWVzLm1hcCgoZHYpID0+IHtcbiAgICAgIHJldHVybiBEYXRhVmFsdWVGYWN0b3J5Lk1ha2VGaWx0ZXJEYXRhVmFsdWUoZHYpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBDYXRlZ29yaWNhbEZpbHRlcihcbiAgICAgIGRvbWFpbkZpbHRlci52aXN1YWxJZC53b3Jrc2hlZXQsXG4gICAgICBkb21haW5GaWx0ZXIuZmllbGRDYXB0aW9uLFxuICAgICAgZG9tYWluRmlsdGVyLmZpZWxkTmFtZSxcbiAgICAgIEZpbHRlclR5cGUuQ2F0ZWdvcmljYWwsXG4gICAgICB0aGlzLl9yZWdpc3RyeUlkLFxuICAgICAgYXBwbGllZFZhbHVlcyxcbiAgICAgIGRvbWFpbkZpbHRlci5pc0V4Y2x1ZGUsXG4gICAgICBkb21haW5GaWx0ZXIuaXNBbGxTZWxlY3RlZCxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0SGllcmFyY2hpY2FsRmlsdGVyKGRvbWFpbkZpbHRlcjogSW50ZXJuYWxDb250cmFjdC5IaWVyYXJjaGljYWxGaWx0ZXIpOiBDb250cmFjdC5IaWVyYXJjaGljYWxGaWx0ZXIge1xuICAgIGNvbnN0IGFwcGxpZWRWYWx1ZXM6IEFycmF5PENvbnRyYWN0LkhpZXJhcmNoaWNhbEZpbHRlckRhdGFWYWx1ZT4gPSBkb21haW5GaWx0ZXIudmFsdWVzLm1hcCgoaGllcmFyY2hpY2FsRGF0YVZhbHVlKSA9PiB7XG4gICAgICByZXR1cm4gbmV3IEhpZXJhcmNoaWNhbERhdGFWYWx1ZShcbiAgICAgICAgRGF0YVZhbHVlRmFjdG9yeS5NYWtlRmlsdGVyRGF0YVZhbHVlKGhpZXJhcmNoaWNhbERhdGFWYWx1ZS52YWx1ZSksXG4gICAgICAgIGhpZXJhcmNoaWNhbERhdGFWYWx1ZS5oaWVyYXJjaGljYWxQYXRoLFxuICAgICAgICBoaWVyYXJjaGljYWxEYXRhVmFsdWUubGV2ZWwsXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgY29uc3QgbGV2ZWxEZXRhaWxzOiBBcnJheTxDb250cmFjdC5IaWVyYXJjaGljYWxMZXZlbERldGFpbD4gPSBkb21haW5GaWx0ZXIubGV2ZWxJbmZvLm1hcCgoYUxldmVsKSA9PiB7XG4gICAgICByZXR1cm4gbmV3IEhpZXJhcmNoaWNhbExldmVsRGV0YWlsKFxuICAgICAgICBhTGV2ZWwubmFtZSxcbiAgICAgICAgSW50ZXJuYWxFbnVtQ29udmVydGVyLmhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUuY29udmVydChhTGV2ZWwubGV2ZWxTZWxlY3Rpb25TdGF0ZSksXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBIaWVyYXJjaGljYWxGaWx0ZXIoXG4gICAgICBkb21haW5GaWx0ZXIudmlzdWFsSWQud29ya3NoZWV0LFxuICAgICAgZG9tYWluRmlsdGVyLmZpZWxkQ2FwdGlvbixcbiAgICAgIGRvbWFpbkZpbHRlci5maWVsZE5hbWUsXG4gICAgICBGaWx0ZXJUeXBlLkhpZXJhcmNoaWNhbCxcbiAgICAgIHRoaXMuX3JlZ2lzdHJ5SWQsXG4gICAgICBkb21haW5GaWx0ZXIuZGltZW5zaW9uTmFtZSxcbiAgICAgIGRvbWFpbkZpbHRlci5oaWVyYXJjaHlDYXB0aW9uLFxuICAgICAgZG9tYWluRmlsdGVyLmxldmVscyxcbiAgICAgIGxldmVsRGV0YWlscyxcbiAgICAgIGFwcGxpZWRWYWx1ZXMsXG4gICAgICBkb21haW5GaWx0ZXIuaXNBbGxTZWxlY3RlZCxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0UmFuZ2VGaWx0ZXIoZG9tYWluRmlsdGVyOiBJbnRlcm5hbENvbnRyYWN0LlJhbmdlRmlsdGVyKTogQ29udHJhY3QuUmFuZ2VGaWx0ZXIge1xuICAgIGNvbnN0IG1pblZhbHVlOiBEYXRhVmFsdWUgPSBEYXRhVmFsdWVGYWN0b3J5Lk1ha2VGaWx0ZXJEYXRhVmFsdWUoZG9tYWluRmlsdGVyLm1pbik7XG4gICAgY29uc3QgbWF4VmFsdWU6IERhdGFWYWx1ZSA9IERhdGFWYWx1ZUZhY3RvcnkuTWFrZUZpbHRlckRhdGFWYWx1ZShkb21haW5GaWx0ZXIubWF4KTtcbiAgICByZXR1cm4gbmV3IFJhbmdlRmlsdGVyKFxuICAgICAgZG9tYWluRmlsdGVyLnZpc3VhbElkLndvcmtzaGVldCxcbiAgICAgIGRvbWFpbkZpbHRlci5maWVsZENhcHRpb24sXG4gICAgICBkb21haW5GaWx0ZXIuZmllbGROYW1lLFxuICAgICAgRmlsdGVyVHlwZS5SYW5nZSxcbiAgICAgIHRoaXMuX3JlZ2lzdHJ5SWQsXG4gICAgICBtaW5WYWx1ZSxcbiAgICAgIG1heFZhbHVlLFxuICAgICAgZG9tYWluRmlsdGVyLmluY2x1ZGVOdWxsVmFsdWVzLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRSZWxhdGl2ZURhdGVGaWx0ZXIoZG9tYWluRmlsdGVyOiBJbnRlcm5hbENvbnRyYWN0LlJlbGF0aXZlRGF0ZUZpbHRlcik6IENvbnRyYWN0LlJlbGF0aXZlRGF0ZUZpbHRlciB7XG4gICAgY29uc3QgYW5jaG9yRGF0ZVZhbHVlOiBEYXRhVmFsdWUgPSBEYXRhVmFsdWVGYWN0b3J5Lk1ha2VGaWx0ZXJEYXRhVmFsdWUoZG9tYWluRmlsdGVyLmFuY2hvckRhdGUpO1xuICAgIHJldHVybiBuZXcgUmVsYXRpdmVEYXRlRmlsdGVyKFxuICAgICAgZG9tYWluRmlsdGVyLnZpc3VhbElkLndvcmtzaGVldCxcbiAgICAgIGRvbWFpbkZpbHRlci5maWVsZENhcHRpb24sXG4gICAgICBkb21haW5GaWx0ZXIuZmllbGROYW1lLFxuICAgICAgRXh0ZXJuYWxGaWx0ZXJUeXBlLlJlbGF0aXZlRGF0ZSxcbiAgICAgIHRoaXMuX3JlZ2lzdHJ5SWQsXG4gICAgICBhbmNob3JEYXRlVmFsdWUsXG4gICAgICBJbnRlcm5hbEVudW1Db252ZXJ0ZXIuZGF0ZVN0ZXBQZXJpb2QuY29udmVydChkb21haW5GaWx0ZXIucGVyaW9kVHlwZSksXG4gICAgICBJbnRlcm5hbEVudW1Db252ZXJ0ZXIuZGF0ZVJhbmdlVHlwZS5jb252ZXJ0KGRvbWFpbkZpbHRlci5yYW5nZVR5cGUpLFxuICAgICAgZG9tYWluRmlsdGVyLnJhbmdlTixcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0Q2F0ZWdvcmljYWxEb21haW4oZG9tYWluOiBJbnRlcm5hbENvbnRyYWN0LkNhdGVnb3JpY2FsRG9tYWluLCBkb21haW5UeXBlOiBGaWx0ZXJEb21haW5UeXBlKTogQ29udHJhY3QuQ2F0ZWdvcmljYWxEb21haW4ge1xuICAgIGNvbnN0IHZhbHVlczogQXJyYXk8RGF0YVZhbHVlPiA9IGRvbWFpbi52YWx1ZXMubWFwKChkb21haW5EdikgPT4ge1xuICAgICAgcmV0dXJuIERhdGFWYWx1ZUZhY3RvcnkuTWFrZUZpbHRlckRhdGFWYWx1ZShkb21haW5Edik7XG4gICAgfSk7XG4gICAgcmV0dXJuIG5ldyBDYXRlZ29yaWNhbERvbWFpbih2YWx1ZXMsIGRvbWFpblR5cGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0UmFuZ2VEb21haW4oZG9tYWluOiBJbnRlcm5hbENvbnRyYWN0LlJhbmdlRG9tYWluLCBkb21haW5UeXBlOiBGaWx0ZXJEb21haW5UeXBlKTogQ29udHJhY3QuUmFuZ2VEb21haW4ge1xuICAgIGNvbnN0IG1pbjogRGF0YVZhbHVlID0gRGF0YVZhbHVlRmFjdG9yeS5NYWtlRmlsdGVyRGF0YVZhbHVlKGRvbWFpbi5taW4pO1xuICAgIGNvbnN0IG1heDogRGF0YVZhbHVlID0gRGF0YVZhbHVlRmFjdG9yeS5NYWtlRmlsdGVyRGF0YVZhbHVlKGRvbWFpbi5tYXgpO1xuICAgIHJldHVybiBuZXcgUmFuZ2VEb21haW4obWluLCBtYXgsIGRvbWFpblR5cGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0QW5jaG9yRGF0ZShhbmNob3JEYXRlOiBEYXRlKTogc3RyaW5nIHtcbiAgICAvLyBDb252ZXJ0cyBhIERhdGUgb2JqZWN0IGludG8gYSBzdHJpbmcgZm9ybWF0IHRoYXQgdGhlIHNlcnZlciBleHBlY3RzIGZvciBkYXRlL3RpbWUgdmFsdWVzLlxuICAgIC8vIElmIGFuY2hvckRhdGUgZG9lc24ndCByZXByZXNlbnQgYSB2YWxpZCBEYXRlIG9iamVjdCwgYW55IG9mIHRoZXNlIHdvdWxkIGJlIE5hTi5cbiAgICBjb25zdCB5ZWFyID0gYW5jaG9yRGF0ZS5nZXRVVENGdWxsWWVhcigpO1xuICAgIGNvbnN0IG1vbnRoID0gYW5jaG9yRGF0ZS5nZXRVVENNb250aCgpICsgMTtcbiAgICBjb25zdCBkYXkgPSBhbmNob3JEYXRlLmdldFVUQ0RhdGUoKTtcbiAgICBjb25zdCBoaCA9IGFuY2hvckRhdGUuZ2V0VVRDSG91cnMoKTtcbiAgICBjb25zdCBtbSA9IGFuY2hvckRhdGUuZ2V0VVRDTWludXRlcygpO1xuICAgIGNvbnN0IHNlYyA9IGFuY2hvckRhdGUuZ2V0VVRDU2Vjb25kcygpO1xuXG4gICAgaWYgKGlzTmFOKHllYXIpIHx8IGlzTmFOKG1vbnRoKSB8fCBpc05hTihkYXkpIHx8IGlzTmFOKGhoKSB8fCBpc05hTihtbSkgfHwgaXNOYU4oc2VjKSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFbWJlZGRpbmdFcnJvckNvZGVzLkludmFsaWREYXRlUGFyYW1ldGVyLCAnSW52YWxpZCBkYXRlIHBhcmFtZXRlcjogYW5jaG9yRGF0ZScpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGAke3llYXJ9LSR7bW9udGh9LSR7ZGF5fSAke2hofToke21tfToke3NlY31gO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIGFwaUZpbHRlckhhbmRsZXJDaGVja0ZvckNvbW1hbmRFcnJvcihzZXJ2ZXJQbTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSkge1xuICAgIGlmICghc2VydmVyUG1bSW50ZXJuYWxDb250cmFjdC5QYXJhbWV0ZXJJZC5QYXJhbWV0ZXJFcnJvcl0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHNlcnZlclBtW0ludGVybmFsQ29udHJhY3QuUGFyYW1ldGVySWQuSW52YWxpZEZpZWxkQ2FwdGlvbl0pIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkRmlsdGVyRmllbGROYW1lLCBzZXJ2ZXJQbVtJbnRlcm5hbENvbnRyYWN0LlBhcmFtZXRlcklkLkludmFsaWRGaWVsZENhcHRpb25dKTtcbiAgICB9XG4gICAgaWYgKHNlcnZlclBtW0ludGVybmFsQ29udHJhY3QuUGFyYW1ldGVySWQuSW52YWxpZFZhbHVlc10pIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkRmlsdGVyRmllbGRWYWx1ZSwgc2VydmVyUG1bSW50ZXJuYWxDb250cmFjdC5QYXJhbWV0ZXJJZC5JbnZhbGlkVmFsdWVzXSk7XG4gICAgfVxuICAgIGlmIChzZXJ2ZXJQbVtJbnRlcm5hbENvbnRyYWN0LlBhcmFtZXRlcklkLkludmFsaWRBZ2dGaWVsZE5hbWVdKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW52YWxpZEFnZ3JlZ2F0aW9uRmllbGROYW1lLCBzZXJ2ZXJQbVtJbnRlcm5hbENvbnRyYWN0LlBhcmFtZXRlcklkLkludmFsaWRBZ2dGaWVsZE5hbWVdKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLlNlcnZlckVycm9yLCAnU2VydmVyIEVycm9yJyk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFcnJvckNvZGVzLCBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbiB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBBcGlTaG93RGF0YVRhYmxlRm9ybWF0LFxuICBEYXRhVGFibGUgYXMgRGF0YVRhYmxlSW50ZXJuYWxDb250cmFjdCxcbiAgRGF0YVRhYmxlUmVhZGVyIGFzIERhdGFUYWJsZVJlYWRlckludGVybmFsQ29udHJhY3QsXG4gIEV4ZWN1dGVQYXJhbWV0ZXJzLFxuICBIaWdobGlnaHRlZE1hcmtzVGFibGUsXG4gIFBhcmFtZXRlcklkLFxuICBTZWxlY3RlZE1hcmtzVGFibGUsXG4gIFVuZGVybHlpbmdEYXRhVGFibGUsXG4gIFZlcmJJZCxcbiAgVmlzdWFsSWQsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyB2NCBhcyB1dWlkdjQgfSBmcm9tICd1dWlkJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uLy4uLy4uL0FwaVNoYXJlZCc7XG5pbXBvcnQgeyBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MgfSBmcm9tICcuLi8uLi9FbnVtTWFwcGluZ3MvRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzJztcbmltcG9ydCB7IENvbHVtbiwgRGF0YVRhYmxlLCBNYXJrSW5mbyB9IGZyb20gJy4uLy4uL01vZGVscy9HZXREYXRhTW9kZWxzJztcbmltcG9ydCB7IERhdGFUYWJsZVJlYWRlciB9IGZyb20gJy4uLy4uL01vZGVscy9HZXREYXRhVGFibGVSZWFkZXJNb2RlbHMnO1xuaW1wb3J0IHsgRGF0YVZhbHVlRmFjdG9yeSB9IGZyb20gJy4uLy4uL1V0aWxzL0RhdGFWYWx1ZUZhY3RvcnknO1xuaW1wb3J0IHsgR2V0RGF0YVNlcnZpY2UsIEdldERhdGFUeXBlIH0gZnJvbSAnLi4vR2V0RGF0YVNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vU2VydmljZUltcGxCYXNlJztcblxuZXhwb3J0IGNsYXNzIEdldERhdGFTZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIEdldERhdGFTZXJ2aWNlIHtcbiAgLy8gVGhlIGV4dGVuc2lvbi9lbWJlZGRpbmcgaW5zdGFuY2UgdXNlcyB0aGUgc2FtZSBjYWNoZSBmb3IgYWxsIERhdGFUYWJsZVJlYWRlcnMuXG4gIHByaXZhdGUgdmlld0RhdGFUYWJsZUNhY2hlSWQ6IHN0cmluZyA9IHV1aWR2NCgpO1xuXG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLkdldERhdGE7XG4gIH1cblxuICBwdWJsaWMgZ2V0TWF4Um93TGltaXQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gMTAwMDA7XG4gIH1cblxuICBwdWJsaWMgZ2V0Vmlld0RhdGFUYWJsZUNhY2hlSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy52aWV3RGF0YVRhYmxlQ2FjaGVJZDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TGltaXRlZE1heFJvd3MocmVxdWVzdGVkUm93czogbnVtYmVyLCByb3dDb3VudExpbWl0OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiByZXF1ZXN0ZWRSb3dzID4gMCAmJiByZXF1ZXN0ZWRSb3dzIDwgcm93Q291bnRMaW1pdCA/IHJlcXVlc3RlZFJvd3MgOiByb3dDb3VudExpbWl0O1xuICB9XG5cbiAgcHVibGljIGdldFVuZGVybHlpbmdEYXRhQXN5bmMoXG4gICAgdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIGdldFR5cGU6IEdldERhdGFUeXBlLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgaWdub3JlU2VsZWN0aW9uOiBib29sZWFuLFxuICAgIGluY2x1ZGVBbGxDb2x1bW5zOiBib29sZWFuLFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIG1heFJvd3M6IG51bWJlcixcbiAgICBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gICAgYXBwbHlXb3Jrc2hlZXRGb3JtYXR0aW5nOiBib29sZWFuLFxuICApOiBQcm9taXNlPERhdGFUYWJsZT4ge1xuICAgIC8vIENyZWF0ZSBhbGwgb2Ygb3VyIHBhcmFtZXRlcnNcbiAgICBjb25zdCBzdW1tYXJ5RGF0YSA9IGdldFR5cGUgPT09IEdldERhdGFUeXBlLlN1bW1hcnk7XG4gICAgY29uc3QgZnVuY3Rpb25OYW1lID0gc3VtbWFyeURhdGEgPyAnZ2V0U3VtbWFyeURhdGFBc3luYycgOiAnZ2V0VW5kZXJseWluZ0RhdGFBc3luYyc7XG4gICAgY29uc3QgdmVyYiA9IHN1bW1hcnlEYXRhID8gVmVyYklkLkdldERhdGFTdW1tYXJ5RGF0YSA6IFZlcmJJZC5HZXRVbmRlcmx5aW5nRGF0YTtcbiAgICBjb25zdCByZXF1ZXN0TWF4Um93cyA9IHZlcmIgPT09IFZlcmJJZC5HZXRVbmRlcmx5aW5nRGF0YSA/IHRoaXMuZ2V0TGltaXRlZE1heFJvd3MobWF4Um93cywgdGhpcy5nZXRNYXhSb3dMaW1pdCgpICsgMSkgOiBtYXhSb3dzO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06IGZ1bmN0aW9uTmFtZSxcbiAgICB9O1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuVmlzdWFsSWRdID0gdmlzdWFsSWQ7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5JZ25vcmVBbGlhc2VzXSA9IGlnbm9yZUFsaWFzZXM7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5JZ25vcmVTZWxlY3Rpb25dID0gaWdub3JlU2VsZWN0aW9uO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuSW5jbHVkZUFsbENvbHVtbnNdID0gaW5jbHVkZUFsbENvbHVtbnM7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5Db2x1bW5zVG9JbmNsdWRlQnlJZF0gPSB0aGlzLnZlcmlmeUluY2x1ZGVDb2x1bW5BcnJheShjb2x1bW5zVG9JbmNsdWRlQnlJZCk7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5NYXhSb3dzXSA9IHJlcXVlc3RNYXhSb3dzO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuU2hvd0RhdGFUYWJsZUZvcm1hdF0gPSBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3Muc2hvd0RhdGFUYWJsZUZvcm1hdFR5cGUuY29udmVydChpbmNsdWRlRGF0YVZhbHVlc09wdGlvbik7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5BcHBseVdvcmtzaGVldEZvcm1hdHRpbmddID0gYXBwbHlXb3Jrc2hlZXRGb3JtYXR0aW5nO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPERhdGFUYWJsZT4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZURhdGEgPSByZXNwb25zZS5yZXN1bHQgYXMgVW5kZXJseWluZ0RhdGFUYWJsZTtcbiAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NSZXN1bHRzVGFibGUocmVzcG9uc2VEYXRhLmRhdGEsIHJlc3BvbnNlRGF0YS5pc1N1bW1hcnkpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldFN1bW1hcnlEYXRhUmVhZGVyQXN5bmMoXG4gICAgdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIHBhZ2VSb3dDb3VudDogbnVtYmVyLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgaWdub3JlU2VsZWN0aW9uOiBib29sZWFuLFxuICAgIGluY2x1ZGVBbGxDb2x1bW5zOiBib29sZWFuLFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uOiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgICBhcHBseVdvcmtzaGVldEZvcm1hdHRpbmc6IGJvb2xlYW4sXG4gICk6IFByb21pc2U8RGF0YVRhYmxlUmVhZGVyPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldFN1bW1hcnlEYXRhUmVhZGVyQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpZXdEYXRhVGFibGVDYWNoZUlkXTogdGhpcy5nZXRWaWV3RGF0YVRhYmxlQ2FjaGVJZCgpLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQsXG4gICAgICBbUGFyYW1ldGVySWQuUGFnZVJvd0NvdW50XTogcGFnZVJvd0NvdW50LFxuICAgICAgW1BhcmFtZXRlcklkLklnbm9yZUFsaWFzZXNdOiBpZ25vcmVBbGlhc2VzLFxuICAgICAgW1BhcmFtZXRlcklkLklnbm9yZVNlbGVjdGlvbl06IGlnbm9yZVNlbGVjdGlvbixcbiAgICAgIFtQYXJhbWV0ZXJJZC5JbmNsdWRlQWxsQ29sdW1uc106IGluY2x1ZGVBbGxDb2x1bW5zLFxuICAgICAgW1BhcmFtZXRlcklkLkNvbHVtbnNUb0luY2x1ZGVCeUlkXTogdGhpcy52ZXJpZnlJbmNsdWRlQ29sdW1uQXJyYXkoY29sdW1uc1RvSW5jbHVkZUJ5SWQpLFxuICAgICAgW1BhcmFtZXRlcklkLlNob3dEYXRhVGFibGVGb3JtYXRdOiBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3Muc2hvd0RhdGFUYWJsZUZvcm1hdFR5cGUuY29udmVydChpbmNsdWRlRGF0YVZhbHVlc09wdGlvbiksXG4gICAgICBbUGFyYW1ldGVySWQuQXBwbHlXb3Jrc2hlZXRGb3JtYXR0aW5nXTogYXBwbHlXb3Jrc2hlZXRGb3JtYXR0aW5nLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXREYXRhU3VtbWFyeURhdGFSZWFkZXIsIHBhcmFtZXRlcnMpLnRoZW48RGF0YVRhYmxlUmVhZGVyPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9IHJlc3BvbnNlLnJlc3VsdCBhcyBEYXRhVGFibGVSZWFkZXJJbnRlcm5hbENvbnRyYWN0O1xuXG4gICAgICByZXR1cm4gbmV3IERhdGFUYWJsZVJlYWRlcihyZXNwb25zZURhdGEuaWQsIHJlc3BvbnNlRGF0YS50b3RhbFJvd0NvdW50LCBwYWdlUm93Q291bnQsIHRoaXMuX3JlZ2lzdHJ5SWQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldFN1bW1hcnlDb2x1bW5zSW5mb0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuQ29sdW1uPj4ge1xuICAgIC8vIENyZWF0ZSBhbGwgdGhlIHBhcmFtZXRlcnMgZm9yIEdldERhdGFUeXBlIG9mIFN1bW1hcnkgd2l0aCAxIHJvdywgYW5kIG9ubHkgbmF0aXZlIHZhbHVlc1xuICAgIC8vIFRoZW4gcmV0dXJuIGp1c3QgdGhlIGNvbHVtbnNcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkdldERhdGFTdW1tYXJ5RGF0YTtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0U3VtbWFyeUNvbHVtbnNJbmZvQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQsXG4gICAgICBbUGFyYW1ldGVySWQuSWdub3JlQWxpYXNlc106IHRydWUsXG4gICAgICBbUGFyYW1ldGVySWQuSWdub3JlU2VsZWN0aW9uXTogdHJ1ZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5JbmNsdWRlQWxsQ29sdW1uc106IHRydWUsXG4gICAgICBbUGFyYW1ldGVySWQuTWF4Um93c106IDEsXG4gICAgICBbUGFyYW1ldGVySWQuU2hvd0RhdGFUYWJsZUZvcm1hdF06IEFwaVNob3dEYXRhVGFibGVGb3JtYXQuTmF0aXZlVmFsdWVzT25seSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPEFycmF5PENvbnRyYWN0LkNvbHVtbj4+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgdW5kZXJseWluZ0RhdGFUYWJsZSA9IHJlc3BvbnNlLnJlc3VsdCBhcyBVbmRlcmx5aW5nRGF0YVRhYmxlO1xuICAgICAgY29uc3QgZGF0YVRhYmxlID0gdW5kZXJseWluZ0RhdGFUYWJsZS5kYXRhO1xuICAgICAgY29uc3QgY29sdW1ucyA9IGRhdGFUYWJsZS5oZWFkZXJzLm1hcCgoaCkgPT4gbmV3IENvbHVtbihoLmZpZWxkQ2FwdGlvbiwgaC5maWVsZE5hbWUsIGguZGF0YVR5cGUsIGguaXNSZWZlcmVuY2VkLCBoLmluZGV4KSk7XG4gICAgICByZXR1cm4gY29sdW1ucztcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTZWxlY3RlZE1hcmtzQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkKTogUHJvbWlzZTxDb250cmFjdC5NYXJrc0NvbGxlY3Rpb24+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0U2VsZWN0ZWRNYXJrc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0U2VsZWN0ZWRNYXJrcywgcGFyYW1ldGVycykudGhlbjxDb250cmFjdC5NYXJrc0NvbGxlY3Rpb24+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gcmVzcG9uc2UucmVzdWx0IGFzIFNlbGVjdGVkTWFya3NUYWJsZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IHJlc3BvbnNlRGF0YS5kYXRhLm1hcCgodGFibGUpID0+IHRoaXMucHJvY2Vzc1Jlc3VsdHNUYWJsZSh0YWJsZSwgdHJ1ZSkpLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRIaWdobGlnaHRlZE1hcmtzQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkKTogUHJvbWlzZTxDb250cmFjdC5NYXJrc0NvbGxlY3Rpb24+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0SGlnaGxpZ2h0ZWRNYXJrc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0SGlnaGxpZ2h0ZWRNYXJrcywgcGFyYW1ldGVycykudGhlbjxDb250cmFjdC5NYXJrc0NvbGxlY3Rpb24+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gcmVzcG9uc2UucmVzdWx0IGFzIEhpZ2hsaWdodGVkTWFya3NUYWJsZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IHJlc3BvbnNlRGF0YS5kYXRhLm1hcCgodGFibGUpID0+IHRoaXMucHJvY2Vzc1Jlc3VsdHNUYWJsZSh0YWJsZSwgdHJ1ZSkpLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXREYXRhU291cmNlRGF0YUFzeW5jKFxuICAgIGRhdGFTb3VyY2VJZDogc3RyaW5nLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgbWF4Um93czogbnVtYmVyLFxuICAgIGNvbHVtbnNUb0luY2x1ZGU6IEFycmF5PHN0cmluZz4sXG4gICAgY29sdW1uc1RvSW5jbHVkZUJ5SWQ6IEFycmF5PHN0cmluZz4sXG4gICAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb246IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICApOiBQcm9taXNlPERhdGFUYWJsZT4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXREYXRhU291cmNlRGF0YUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EYXRhU291cmNlSWRdOiBkYXRhU291cmNlSWQsXG4gICAgICBbUGFyYW1ldGVySWQuSWdub3JlQWxpYXNlc106IGlnbm9yZUFsaWFzZXMsXG4gICAgICBbUGFyYW1ldGVySWQuTWF4Um93c106IHRoaXMuZ2V0TGltaXRlZE1heFJvd3MobWF4Um93cywgdGhpcy5nZXRNYXhSb3dMaW1pdCgpICsgMSksXG4gICAgICBbUGFyYW1ldGVySWQuQ29sdW1uc1RvSW5jbHVkZV06IHRoaXMudmVyaWZ5SW5jbHVkZUNvbHVtbkFycmF5KGNvbHVtbnNUb0luY2x1ZGUpLFxuICAgICAgW1BhcmFtZXRlcklkLkNvbHVtbnNUb0luY2x1ZGVCeUlkXTogdGhpcy52ZXJpZnlJbmNsdWRlQ29sdW1uQXJyYXkoY29sdW1uc1RvSW5jbHVkZUJ5SWQpLFxuICAgICAgW1BhcmFtZXRlcklkLlNob3dEYXRhVGFibGVGb3JtYXRdOiBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3Muc2hvd0RhdGFUYWJsZUZvcm1hdFR5cGUuY29udmVydChpbmNsdWRlRGF0YVZhbHVlc09wdGlvbiksXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldERhdGFTb3VyY2VEYXRhLCBwYXJhbWV0ZXJzKS50aGVuPERhdGFUYWJsZT4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZURhdGEgPSByZXNwb25zZS5yZXN1bHQgYXMgVW5kZXJseWluZ0RhdGFUYWJsZTtcbiAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NSZXN1bHRzVGFibGUocmVzcG9uc2VEYXRhLmRhdGEsIGZhbHNlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMb2dpY2FsVGFibGVEYXRhQXN5bmMoXG4gICAgZGF0YXNvdXJjZUlkOiBzdHJpbmcsXG4gICAgbG9naWNhbFRhYmxlSWQ6IHN0cmluZyxcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIG1heFJvd3M6IG51bWJlcixcbiAgICBjb2x1bW5zVG9JbmNsdWRlOiBBcnJheTxzdHJpbmc+LFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uOiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgKTogUHJvbWlzZTxEYXRhVGFibGU+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0TG9naWNhbFRhYmxlRGF0YUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Db2x1bW5zVG9JbmNsdWRlXTogY29sdW1uc1RvSW5jbHVkZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Db2x1bW5zVG9JbmNsdWRlQnlJZF06IHRoaXMudmVyaWZ5SW5jbHVkZUNvbHVtbkFycmF5KGNvbHVtbnNUb0luY2x1ZGVCeUlkKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EYXRhU291cmNlSWRdOiBkYXRhc291cmNlSWQsXG4gICAgICBbUGFyYW1ldGVySWQuSWdub3JlQWxpYXNlc106IGlnbm9yZUFsaWFzZXMsXG4gICAgICBbUGFyYW1ldGVySWQuTG9naWNhbFRhYmxlSWRdOiBsb2dpY2FsVGFibGVJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5NYXhSb3dzXTogdGhpcy5nZXRMaW1pdGVkTWF4Um93cyhtYXhSb3dzLCB0aGlzLmdldE1heFJvd0xpbWl0KCkgKyAxKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TaG93RGF0YVRhYmxlRm9ybWF0XTogRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzLnNob3dEYXRhVGFibGVGb3JtYXRUeXBlLmNvbnZlcnQoaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24pLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRMb2dpY2FsVGFibGVEYXRhLCBwYXJhbWV0ZXJzKS50aGVuPERhdGFUYWJsZT4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZURhdGEgPSByZXNwb25zZS5yZXN1bHQgYXMgVW5kZXJseWluZ0RhdGFUYWJsZTtcbiAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NSZXN1bHRzVGFibGUocmVzcG9uc2VEYXRhLmRhdGEsIGZhbHNlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMb2dpY2FsVGFibGVEYXRhUmVhZGVyQXN5bmMoXG4gICAgZGF0YXNvdXJjZUlkOiBzdHJpbmcsXG4gICAgbG9naWNhbFRhYmxlSWQ6IHN0cmluZyxcbiAgICBwYWdlUm93Q291bnQ6IG51bWJlcixcbiAgICBpZ25vcmVBbGlhc2VzOiBib29sZWFuLFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uOiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgKTogUHJvbWlzZTxEYXRhVGFibGVSZWFkZXI+IHtcbiAgICBwYWdlUm93Q291bnQgPSB0aGlzLmdldExpbWl0ZWRNYXhSb3dzKHBhZ2VSb3dDb3VudCwgdGhpcy5nZXRNYXhSb3dMaW1pdCgpKTtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0TG9naWNhbFRhYmxlRGF0YVJlYWRlckFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaWV3RGF0YVRhYmxlQ2FjaGVJZF06IHRoaXMuZ2V0Vmlld0RhdGFUYWJsZUNhY2hlSWQoKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EYXRhU291cmNlSWRdOiBkYXRhc291cmNlSWQsXG4gICAgICBbUGFyYW1ldGVySWQuTG9naWNhbFRhYmxlSWRdOiBsb2dpY2FsVGFibGVJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5QYWdlUm93Q291bnRdOiBwYWdlUm93Q291bnQsXG4gICAgICBbUGFyYW1ldGVySWQuSWdub3JlQWxpYXNlc106IGlnbm9yZUFsaWFzZXMsXG4gICAgICBbUGFyYW1ldGVySWQuQ29sdW1uc1RvSW5jbHVkZUJ5SWRdOiB0aGlzLnZlcmlmeUluY2x1ZGVDb2x1bW5BcnJheShjb2x1bW5zVG9JbmNsdWRlQnlJZCksXG4gICAgICBbUGFyYW1ldGVySWQuU2hvd0RhdGFUYWJsZUZvcm1hdF06IEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncy5zaG93RGF0YVRhYmxlRm9ybWF0VHlwZS5jb252ZXJ0KGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uKSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0TG9naWNhbFRhYmxlRGF0YVJlYWRlciwgcGFyYW1ldGVycykudGhlbjxEYXRhVGFibGVSZWFkZXI+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gcmVzcG9uc2UucmVzdWx0IGFzIERhdGFUYWJsZVJlYWRlckludGVybmFsQ29udHJhY3Q7XG5cbiAgICAgIHJldHVybiBuZXcgRGF0YVRhYmxlUmVhZGVyKHJlc3BvbnNlRGF0YS5pZCwgcmVzcG9uc2VEYXRhLnRvdGFsUm93Q291bnQsIHBhZ2VSb3dDb3VudCwgdGhpcy5fcmVnaXN0cnlJZCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ1RhYmxlRGF0YUFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBsb2dpY2FsVGFibGVJZDogc3RyaW5nLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgaWdub3JlU2VsZWN0aW9uOiBib29sZWFuLFxuICAgIGluY2x1ZGVBbGxDb2x1bW5zOiBib29sZWFuLFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIG1heFJvd3M6IG51bWJlcixcbiAgICBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gICAgYXBwbHlXb3Jrc2hlZXRGb3JtYXR0aW5nOiBib29sZWFuLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRVbmRlcmx5aW5nVGFibGVEYXRhQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQsXG4gICAgICBbUGFyYW1ldGVySWQuTG9naWNhbFRhYmxlSWRdOiBsb2dpY2FsVGFibGVJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5JZ25vcmVBbGlhc2VzXTogaWdub3JlQWxpYXNlcyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5JZ25vcmVTZWxlY3Rpb25dOiBpZ25vcmVTZWxlY3Rpb24sXG4gICAgICBbUGFyYW1ldGVySWQuSW5jbHVkZUFsbENvbHVtbnNdOiBpbmNsdWRlQWxsQ29sdW1ucyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Db2x1bW5zVG9JbmNsdWRlQnlJZF06IHRoaXMudmVyaWZ5SW5jbHVkZUNvbHVtbkFycmF5KGNvbHVtbnNUb0luY2x1ZGVCeUlkKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5NYXhSb3dzXTogdGhpcy5nZXRMaW1pdGVkTWF4Um93cyhtYXhSb3dzLCB0aGlzLmdldE1heFJvd0xpbWl0KCkgKyAxKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TaG93RGF0YVRhYmxlRm9ybWF0XTogRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzLnNob3dEYXRhVGFibGVGb3JtYXRUeXBlLmNvbnZlcnQoaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24pLFxuICAgICAgW1BhcmFtZXRlcklkLkFwcGx5V29ya3NoZWV0Rm9ybWF0dGluZ106IGFwcGx5V29ya3NoZWV0Rm9ybWF0dGluZyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0VW5kZXJseWluZ1RhYmxlRGF0YSwgcGFyYW1ldGVycykudGhlbjxEYXRhVGFibGU+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gcmVzcG9uc2UucmVzdWx0IGFzIFVuZGVybHlpbmdEYXRhVGFibGU7XG4gICAgICByZXR1cm4gdGhpcy5wcm9jZXNzUmVzdWx0c1RhYmxlKHJlc3BvbnNlRGF0YS5kYXRhLCBmYWxzZSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ1RhYmxlRGF0YVJlYWRlckFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBsb2dpY2FsVGFibGVJZDogc3RyaW5nLFxuICAgIHBhZ2VSb3dDb3VudDogbnVtYmVyLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgaWdub3JlU2VsZWN0aW9uOiBib29sZWFuLFxuICAgIGluY2x1ZGVBbGxDb2x1bW5zOiBib29sZWFuLFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uOiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgICBhcHBseVdvcmtzaGVldEZvcm1hdHRpbmc6IGJvb2xlYW4sXG4gICk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlUmVhZGVyPiB7XG4gICAgcGFnZVJvd0NvdW50ID0gdGhpcy5nZXRMaW1pdGVkTWF4Um93cyhwYWdlUm93Q291bnQsIHRoaXMuZ2V0TWF4Um93TGltaXQoKSk7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldFVuZGVybHlpbmdUYWJsZURhdGFSZWFkZXJBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlld0RhdGFUYWJsZUNhY2hlSWRdOiB0aGlzLmdldFZpZXdEYXRhVGFibGVDYWNoZUlkKCksXG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Mb2dpY2FsVGFibGVJZF06IGxvZ2ljYWxUYWJsZUlkLFxuICAgICAgW1BhcmFtZXRlcklkLklnbm9yZUFsaWFzZXNdOiBpZ25vcmVBbGlhc2VzLFxuICAgICAgW1BhcmFtZXRlcklkLklnbm9yZVNlbGVjdGlvbl06IGlnbm9yZVNlbGVjdGlvbixcbiAgICAgIFtQYXJhbWV0ZXJJZC5JbmNsdWRlQWxsQ29sdW1uc106IGluY2x1ZGVBbGxDb2x1bW5zLFxuICAgICAgW1BhcmFtZXRlcklkLkNvbHVtbnNUb0luY2x1ZGVCeUlkXTogdGhpcy52ZXJpZnlJbmNsdWRlQ29sdW1uQXJyYXkoY29sdW1uc1RvSW5jbHVkZUJ5SWQpLFxuICAgICAgW1BhcmFtZXRlcklkLlNob3dEYXRhVGFibGVGb3JtYXRdOiBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3Muc2hvd0RhdGFUYWJsZUZvcm1hdFR5cGUuY29udmVydChpbmNsdWRlRGF0YVZhbHVlc09wdGlvbiksXG4gICAgICBbUGFyYW1ldGVySWQuUGFnZVJvd0NvdW50XTogcGFnZVJvd0NvdW50LFxuICAgICAgW1BhcmFtZXRlcklkLkFwcGx5V29ya3NoZWV0Rm9ybWF0dGluZ106IGFwcGx5V29ya3NoZWV0Rm9ybWF0dGluZyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0VW5kZXJseWluZ1RhYmxlRGF0YVJlYWRlciwgcGFyYW1ldGVycykudGhlbjxEYXRhVGFibGVSZWFkZXI+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gcmVzcG9uc2UucmVzdWx0IGFzIERhdGFUYWJsZVJlYWRlckludGVybmFsQ29udHJhY3Q7XG5cbiAgICAgIHJldHVybiBuZXcgRGF0YVRhYmxlUmVhZGVyKHJlc3BvbnNlRGF0YS5pZCwgcmVzcG9uc2VEYXRhLnRvdGFsUm93Q291bnQsIHBhZ2VSb3dDb3VudCwgdGhpcy5fcmVnaXN0cnlJZCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBzdW1tYXJ5VGFibGVJZCA9ICcnO1xuXG4gIHB1YmxpYyBnZXRQYWdlQXN5bmModGFibGVJZDogc3RyaW5nLCBwYWdlTnVtYmVyOiBudW1iZXIsIHBhZ2VTaXplOiBudW1iZXIpOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRQYWdlQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpZXdEYXRhVGFibGVDYWNoZUlkXTogdGhpcy5nZXRWaWV3RGF0YVRhYmxlQ2FjaGVJZCgpLFxuICAgICAgW1BhcmFtZXRlcklkLlZpZXdEYXRhVGFibGVJZF06IHRhYmxlSWQsXG4gICAgICBbUGFyYW1ldGVySWQuRGF0YVJvd0luZGV4XTogcGFnZU51bWJlciAqIHBhZ2VTaXplLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXREYXRhVGFibGVSZWFkZXJQYWdlLCBwYXJhbWV0ZXJzKS50aGVuPERhdGFUYWJsZT4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZURhdGEgPSByZXNwb25zZS5yZXN1bHQgYXMgRGF0YVRhYmxlSW50ZXJuYWxDb250cmFjdDtcbiAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NSZXN1bHRzUGFnZShyZXNwb25zZURhdGEsIHRhYmxlSWQgPT09IEdldERhdGFTZXJ2aWNlSW1wbC5zdW1tYXJ5VGFibGVJZCA/IHRydWUgOiBmYWxzZSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgcmVsZWFzZUFzeW5jKHRhYmxlSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdyZWxlYXNlJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaWV3RGF0YVRhYmxlQ2FjaGVJZF06IHRoaXMuZ2V0Vmlld0RhdGFUYWJsZUNhY2hlSWQoKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaWV3RGF0YVRhYmxlSWRdOiB0YWJsZUlkLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5SZWxlYXNlRGF0YVRhYmxlUmVhZGVyLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB2ZXJpZnlJbmNsdWRlQ29sdW1uQXJyYXkoY29sdW1uczogQXJyYXk8c3RyaW5nPik6IEFycmF5PHN0cmluZz4ge1xuICAgIC8vIGNvbHVtbnMgbXVzdCBiZSBhIHZhbGlkIGFycmF5XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbHVtbnMpKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgJ2NvbHVtbnNUb0luY2x1ZGUgYW5kIGNvbHVtbnNUb0luY2x1ZGVCeUlkIG11c3QgYmUgdmFsaWQgYXJyYXlzJyk7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGFueSBkdXBsaWNhdGVzIGZyb20gdGhlIGlucHV0IGFycmF5XG4gICAgY29uc3QgY29sdW1uc0FzU2V0OiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoY29sdW1ucyk7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oY29sdW1uc0FzU2V0KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwcm9jZXNzUmVzdWx0c1RhYmxlKHJlc3BvbnNlRGF0YTogRGF0YVRhYmxlSW50ZXJuYWxDb250cmFjdCwgaXNTdW1tYXJ5OiBib29sZWFuKTogRGF0YVRhYmxlIHtcbiAgICBjb25zdCBoZWFkZXJzID0gcmVzcG9uc2VEYXRhLmhlYWRlcnMubWFwKChoKSA9PiBuZXcgQ29sdW1uKGguZmllbGRDYXB0aW9uLCBoLmZpZWxkTmFtZSwgaC5kYXRhVHlwZSwgaC5pc1JlZmVyZW5jZWQsIGguaW5kZXgpKTtcblxuICAgIC8vIFRPRE8gVGhpcyBzaG91bGQgYmUgY29udHJvbGxlZCBieSBhIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoaXMgYXBpIHdpbGwgcmVzcG9uZCBtYXJrcyBpbmZvIG9yIG5vdFxuICAgIGxldCBtYXJrcztcbiAgICBpZiAocmVzcG9uc2VEYXRhLm1hcmtzKSB7XG4gICAgICBtYXJrcyA9IHJlc3BvbnNlRGF0YS5tYXJrcy5tYXAoKGgpID0+IG5ldyBNYXJrSW5mbyhoLnR5cGUsIGguY29sb3IsIGgudHVwbGVJZCkpO1xuICAgIH1cblxuICAgIC8vIExpbWl0KzEgaXMgb3VyIHNlbnRpbmFsIHRoYXQgdW5kZXJseWluZyBkYXRhIGNvbnRhaW5zIG1vcmUgcm93cyB0aGFuIHVzZXIgaXMgYWxsb3dlZCB0byBmZXRjaC5cbiAgICAvLyBSZW1vdmUgdGhlIGxhc3QgZWxlbWVudCBzbyB3ZSBhbHdheXMgcmV0dXJuIE1heFJvd0xpbWl0XG4gICAgY29uc3QgaXNUb3RhbFJvd0NvdW50TGltaXRlZCA9IGlzU3VtbWFyeSA9PT0gZmFsc2UgJiYgcmVzcG9uc2VEYXRhLmRhdGFUYWJsZS5sZW5ndGggPT09IHRoaXMuZ2V0TWF4Um93TGltaXQoKSArIDE7XG4gICAgaWYgKGlzVG90YWxSb3dDb3VudExpbWl0ZWQpIHtcbiAgICAgIHJlc3BvbnNlRGF0YS5kYXRhVGFibGUubGVuZ3RoIC09IDE7XG4gICAgfVxuXG4gICAgY29uc3QgdGFibGUgPSByZXNwb25zZURhdGEuZGF0YVRhYmxlLm1hcCgocm93KSA9PiB7XG4gICAgICByZXR1cm4gcm93Lm1hcCgoY2VsbCwgaW5kZXgpID0+IHtcbiAgICAgICAgcmV0dXJuIERhdGFWYWx1ZUZhY3RvcnkuTWFrZVRhYmxlRGF0YVZhbHVlKGNlbGwsIGhlYWRlcnNbaW5kZXhdLmRhdGFUeXBlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaWYgKG1hcmtzKSB7XG4gICAgICByZXR1cm4gbmV3IERhdGFUYWJsZSh0YWJsZSwgaGVhZGVycywgdGFibGUubGVuZ3RoLCBpc1RvdGFsUm93Q291bnRMaW1pdGVkLCBpc1N1bW1hcnksIG1hcmtzKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBEYXRhVGFibGUodGFibGUsIGhlYWRlcnMsIHRhYmxlLmxlbmd0aCwgaXNUb3RhbFJvd0NvdW50TGltaXRlZCwgaXNTdW1tYXJ5KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwcm9jZXNzUmVzdWx0c1BhZ2UocmVzcG9uc2VEYXRhOiBEYXRhVGFibGVJbnRlcm5hbENvbnRyYWN0LCBpc1N1bW1hcnk6IGJvb2xlYW4pOiBEYXRhVGFibGUge1xuICAgIGNvbnN0IGhlYWRlcnMgPSByZXNwb25zZURhdGEuaGVhZGVycy5tYXAoKGgpID0+IG5ldyBDb2x1bW4oaC5maWVsZENhcHRpb24sIGguZmllbGROYW1lLCBoLmRhdGFUeXBlLCBoLmlzUmVmZXJlbmNlZCwgaC5pbmRleCkpO1xuXG4gICAgbGV0IG1hcmtzO1xuICAgIGlmIChyZXNwb25zZURhdGEubWFya3MpIHtcbiAgICAgIG1hcmtzID0gcmVzcG9uc2VEYXRhLm1hcmtzLm1hcCgoaCkgPT4gbmV3IE1hcmtJbmZvKGgudHlwZSwgaC5jb2xvciwgaC50dXBsZUlkKSk7XG4gICAgfVxuXG4gICAgY29uc3QgdGFibGUgPSByZXNwb25zZURhdGEuZGF0YVRhYmxlLm1hcCgocm93KSA9PiB7XG4gICAgICByZXR1cm4gcm93Lm1hcCgoY2VsbCwgaW5kZXgpID0+IHtcbiAgICAgICAgcmV0dXJuIERhdGFWYWx1ZUZhY3RvcnkuTWFrZVRhYmxlRGF0YVZhbHVlKGNlbGwsIGhlYWRlcnNbaW5kZXhdLmRhdGFUeXBlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaWYgKG1hcmtzKSB7XG4gICAgICByZXR1cm4gbmV3IERhdGFUYWJsZSh0YWJsZSwgaGVhZGVycywgdGFibGUubGVuZ3RoLCBmYWxzZSwgaXNTdW1tYXJ5LCBtYXJrcyk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRGF0YVRhYmxlKHRhYmxlLCBoZWFkZXJzLCB0YWJsZS5sZW5ndGgsIGZhbHNlLCBpc1N1bW1hcnkpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBOb3RpZmljYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vTm90aWZpY2F0aW9uU2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgTm90aWZpY2F0aW9uU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9Ob3RpZmljYXRpb25TZXJ2aWNlSW1wbEJhc2UnO1xuXG5leHBvcnQgY2xhc3MgTm90aWZpY2F0aW9uU2VydmljZUltcGwgZXh0ZW5kcyBOb3RpZmljYXRpb25TZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBOb3RpZmljYXRpb25TZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTZXJ2aWNlTmFtZXMuTm90aWZpY2F0aW9uO1xuICB9XG59XG4iLCJpbXBvcnQgeyBJbnRlcm5hbEFwaURpc3BhdGNoZXIsIE1vZGVsLCBOb3RpZmljYXRpb24sIE5vdGlmaWNhdGlvbklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFVucmVnaXN0ZXJGbiB9IGZyb20gJy4uL05vdGlmaWNhdGlvblNlcnZpY2UnO1xuXG5leHBvcnQgY2xhc3MgUmVnaXN0cmF0aW9uIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2ZpbHRlckZuOiAobm90aWZpY2F0aW9uTW9kZWw6IE1vZGVsKSA9PiBib29sZWFuLCBwcml2YXRlIF9jYWxsYmFja0ZuOiAobm90aWZpY2F0aW9uTW9kZWw6IE1vZGVsKSA9PiB2b2lkKSB7XG4gICAgLy8gTm90aGluZyBIZXJlXG4gIH1cblxuICBwdWJsaWMgb25Ob3RpZmljYXRpb24obm90aWZpY2F0aW9uTW9kZWw6IE1vZGVsKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2ZpbHRlckZuKG5vdGlmaWNhdGlvbk1vZGVsKSkge1xuICAgICAgdGhpcy5fY2FsbGJhY2tGbihub3RpZmljYXRpb25Nb2RlbCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOb3RpZmljYXRpb25TZXJ2aWNlSW1wbEJhc2Uge1xuICBwcml2YXRlIF9oYW5kbGVyczogeyBbbm90aWZpY2F0aW9uSWQ6IHN0cmluZ106IEFycmF5PFJlZ2lzdHJhdGlvbj4gfTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBkaXNwYXRjaGVyOiBJbnRlcm5hbEFwaURpc3BhdGNoZXIpIHtcbiAgICB0aGlzLl9oYW5kbGVycyA9IHt9O1xuICAgIHRoaXMuZGlzcGF0Y2hlci5yZWdpc3Rlck5vdGlmaWNhdGlvbkhhbmRsZXIodGhpcy5vbk5vdGlmaWNhdGlvbi5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3RlckhhbmRsZXIoaWQ6IE5vdGlmaWNhdGlvbklkLCBmaWx0ZXJGbjogKG1vZGVsOiBNb2RlbCkgPT4gYm9vbGVhbiwgaGFuZGxlcjogKG1vZGVsOiBNb2RlbCkgPT4gdm9pZCk6IFVucmVnaXN0ZXJGbiB7XG4gICAgY29uc3QgaGFuZGxlcnMgPSB0aGlzLl9oYW5kbGVyc1tpZF0gfHwgbmV3IEFycmF5PFJlZ2lzdHJhdGlvbj4oKTtcbiAgICBjb25zdCByZWdpc3RyYXRpb24gPSBuZXcgUmVnaXN0cmF0aW9uKGZpbHRlckZuLCBoYW5kbGVyKTtcbiAgICBoYW5kbGVycy5wdXNoKHJlZ2lzdHJhdGlvbik7XG4gICAgdGhpcy5faGFuZGxlcnNbaWRdID0gaGFuZGxlcnM7XG4gICAgcmV0dXJuICgpID0+IHRoaXMucmVtb3ZlUmVnaXN0cmF0aW9uKGlkLCByZWdpc3RyYXRpb24pO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNIYW5kbGVyc0Zvck5vdGlmaWNhdGlvblR5cGUoaWQ6IE5vdGlmaWNhdGlvbklkKTogYm9vbGVhbiB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgIHJldHVybiB0aGlzLl9oYW5kbGVycy5oYXNPd25Qcm9wZXJ0eShpZCk7XG4gIH1cblxuICBwcml2YXRlIG9uTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmhhc0hhbmRsZXJzRm9yTm90aWZpY2F0aW9uVHlwZShub3RpZmljYXRpb24ubm90aWZpY2F0aW9uSWQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gR28gdGhyb3VnaCBhbmQgY2hlY2sgZm9yIGFsbCB0aGUgaGFuZGxlcnMgb2YgdGhpcyBwYXJ0aWN1bGFyIG5vdGlmaWNhdGlvblxuICAgIHRoaXMuX2hhbmRsZXJzW25vdGlmaWNhdGlvbi5ub3RpZmljYXRpb25JZF0uZm9yRWFjaCgoaCkgPT4gaC5vbk5vdGlmaWNhdGlvbihub3RpZmljYXRpb24uZGF0YSkpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVSZWdpc3RyYXRpb24oaWQ6IE5vdGlmaWNhdGlvbklkLCByZWdpc3RyYXRpb246IFJlZ2lzdHJhdGlvbik6IHZvaWQge1xuICAgIGlmICghdGhpcy5oYXNIYW5kbGVyc0Zvck5vdGlmaWNhdGlvblR5cGUoaWQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5faGFuZGxlcnNbaWRdID0gdGhpcy5faGFuZGxlcnNbaWRdLmZpbHRlcigocmVnKSA9PiByZWcgIT09IHJlZ2lzdHJhdGlvbik7XG4gIH1cbn1cbiIsImltcG9ydCB7IEVycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXhlY3V0ZVBhcmFtZXRlcnMsIE1vZGVsLCBQYXJhbWV0ZXJJZCwgUGFyYW1ldGVySW5mbywgU2hlZXRQYXRoLCBWZXJiSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgUGFyYW1ldGVySW1wbCB9IGZyb20gJy4uLy4uL0ltcGwvUGFyYW1ldGVySW1wbCc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi8uLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgUGFyYW1ldGVyc1NlcnZpY2UgfSBmcm9tICcuLi9QYXJhbWV0ZXJzU2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuXG5leHBvcnQgY2xhc3MgUGFyYW1ldGVyc1NlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgUGFyYW1ldGVyc1NlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5QYXJhbWV0ZXJzO1xuICB9XG5cbiAgcHVibGljIGdldFBhcmFtZXRlcnNGb3JTaGVldEFzeW5jKHNoZWV0UGF0aDogU2hlZXRQYXRoKTogUHJvbWlzZTxBcnJheTxQYXJhbWV0ZXJJbXBsPj4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldFBhcmFtZXRlcnNGb3JTaGVldEFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TaGVldFBhdGhdOiBzaGVldFBhdGgsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcnNBc3luYyhwYXJhbWV0ZXJzKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBbGxQYXJhbWV0ZXJzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxQYXJhbWV0ZXJJbXBsPj4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldFBhcmFtZXRlcnNGb3JTaGVldEFzeW5jJyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyc0FzeW5jKHBhcmFtZXRlcnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQYXJhbWV0ZXJzQXN5bmMoaW5wdXRQYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyk6IFByb21pc2U8QXJyYXk8UGFyYW1ldGVySW1wbD4+IHtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRQYXJhbWV0ZXJzRm9yU2hlZXQsIGlucHV0UGFyYW1ldGVycykudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBBcnJheTxQYXJhbWV0ZXJJbmZvPjtcbiAgICAgIHJldHVybiByZXN1bHQubWFwKChwYXJhbWV0ZXJJbmZvKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgUGFyYW1ldGVySW1wbChwYXJhbWV0ZXJJbmZvLCB0aGlzLl9yZWdpc3RyeUlkKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGNoYW5nZVBhcmFtZXRlclZhbHVlQXN5bmMoZmllbGROYW1lOiBzdHJpbmcsIG5ld1ZhbHVlOiBzdHJpbmcpOiBQcm9taXNlPFBhcmFtZXRlckluZm8+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdjaGFuZ2VQYXJhbWV0ZXJWYWx1ZUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5QYXJhbWV0ZXJGaWVsZE5hbWVdOiBmaWVsZE5hbWUsXG4gICAgICBbUGFyYW1ldGVySWQuUGFyYW1ldGVyVmFsdWVdOiBuZXdWYWx1ZSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuQ2hhbmdlUGFyYW1ldGVyVmFsdWUsIHBhcmFtZXRlcnMpLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQgYXMgUGFyYW1ldGVySW5mbztcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZmluZFBhcmFtZXRlckJ5TmFtZUFzeW5jKG5hbWU6IHN0cmluZyk6IFByb21pc2U8UGFyYW1ldGVySW1wbCB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiB0aGlzLmZpbmRQYXJhbWV0ZXJBc3luYyhuYW1lLCB1bmRlZmluZWQpO1xuICB9XG5cbiAgcHVibGljIGZpbmRQYXJhbWV0ZXJCeUdsb2JhbEZpZWxkTmFtZUFzeW5jKGZpZWxkTmFtZTogc3RyaW5nKTogUHJvbWlzZTxQYXJhbWV0ZXJJbXBsIHwgdW5kZWZpbmVkPiB7XG4gICAgcmV0dXJuIHRoaXMuZmluZFBhcmFtZXRlckFzeW5jKHVuZGVmaW5lZCwgZmllbGROYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZFBhcmFtZXRlckFzeW5jKG5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCwgZmllbGROYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBQcm9taXNlPFBhcmFtZXRlckltcGwgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZmluZFBhcmFtZXRlckFzeW5jJyxcbiAgICB9O1xuICAgIGlmIChuYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuUGFyYW1ldGVyQ2FwdGlvbl0gPSBuYW1lO1xuICAgIH0gZWxzZSBpZiAoZmllbGROYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuUGFyYW1ldGVyRmllbGROYW1lXSA9IGZpZWxkTmFtZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsICduYW1lIG9yIGZpZWxkTmFtZSBtdXN0IGJlIHByb3ZpZGVkIHRvIGZpbmQgcGFyYW1ldGVyJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuRmluZFBhcmFtZXRlciwgcGFyYW1ldGVycykudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGluc3RhbmNlT2ZQYXJhbWV0ZXJJbmZvID0gKG9iamVjdDogTW9kZWwpOiBvYmplY3QgaXMgUGFyYW1ldGVySW5mbyA9PiB7XG4gICAgICAgIHJldHVybiAnZmllbGROYW1lJyBpbiBvYmplY3Q7XG4gICAgICB9O1xuXG4gICAgICAvLyBXZSBuZWVkIHRvIGNoZWNrIHRvIHNlZSBpZiB3ZSBnb3QgYSB2YWxpZCByZXNwb25zZSBiYWNrIGFnYWluXG4gICAgICBpZiAoaW5zdGFuY2VPZlBhcmFtZXRlckluZm8ocmVzcG9uc2UucmVzdWx0KSkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQ7XG4gICAgICAgIHJldHVybiBuZXcgUGFyYW1ldGVySW1wbChyZXN1bHQsIHRoaXMuX3JlZ2lzdHJ5SWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIEV4ZWN1dGVQYXJhbWV0ZXJzLFxuICBQYXJhbWV0ZXJJZCxcbiAgUXVhbnRpdGF0aXZlSW5jbHVkZWRWYWx1ZXMsXG4gIFNlbGVjdGlvblVwZGF0ZVR5cGUgYXMgU2VsZWN0aW9uVXBkYXRlVHlwZUludGVybmFsLFxuICBWZXJiSWQsXG4gIFZpc3VhbElkLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgRGltZW5zaW9uU2VsZWN0aW9uTW9kZWwsXG4gIEhpZXJhcmNoaWNhbFNlbGVjdGlvbk1vZGVsLFxuICBIb3ZlclR1cGxlSW50ZXJhY3Rpb25Nb2RlbCxcbiAgUmFuZ2VTZWxlY3Rpb25Nb2RlbCxcbiAgU2VsZWN0VHVwbGVzSW50ZXJhY3Rpb25Nb2RlbCxcbiAgU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyLFxuICBUdXBsZVNlbGVjdGlvbk1vZGVsLFxuICBWYWx1ZVNlbGVjdGlvbk1vZGVsLFxufSBmcm9tICcuLi8uLi9Nb2RlbHMvU2VsZWN0aW9uTW9kZWxzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uLy4uL1RhYmxlYXVFcnJvcic7XG5pbXBvcnQgeyBQYXJhbSB9IGZyb20gJy4uLy4uL1V0aWxzL1BhcmFtJztcbmltcG9ydCB7IFNlbGVjdGlvblNlcnZpY2UgfSBmcm9tICcuLi9TZWxlY3Rpb25TZXJ2aWNlJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBTZWxlY3Rpb25TZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIFNlbGVjdGlvblNlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5TZWxlY3Rpb247XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIGNsZWFyIGFsbCB0aGUgc2VsZWN0ZWQgbWFya3MgZm9yIHRoZSBnaXZlbiB3b3Jrc2hlZXQuXG4gICAqXG4gICAqIEBwYXJhbSB2aXN1YWxJZFxuICAgKi9cbiAgcHVibGljIGNsZWFyU2VsZWN0ZWRNYXJrc0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdjbGVhclNlbGVjdGVkTWFya3NBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkNsZWFyU2VsZWN0ZWRNYXJrcywgcGFyYW1ldGVycykudGhlbjx2b2lkPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybjsgLy8gRXhwZWN0aW5nIGFuIGVtcHR5IG1vZGVsIGFuZCBoZW5jZSB0aGUgdm9pZCByZXNwb25zZS5cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gc2VsZWN0IG1hcmtzIGZvciB0aGUgZ2l2ZW4gd29ya3NoZWV0LlxuICAgKlxuICAgKiBAcGFyYW0gdmlzdWFsSWRcbiAgICogQHBhcmFtIHNlbGVjdGlvbkNyaXRlcmlhXG4gICAqIEBwYXJhbSBzZWxlY3Rpb25VcGRhdGVUeXBlXG4gICAqL1xuICBwdWJsaWMgc2VsZWN0TWFya3NCeVZhbHVlQXN5bmMoXG4gICAgdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIHNlbGVjdGlvbkNyaXRlcmlhczogQXJyYXk8Q29udHJhY3QuU2VsZWN0aW9uQ3JpdGVyaWE+LFxuICAgIHNlbGVjdGlvblVwZGF0ZVR5cGU6IENvbnRyYWN0LlNlbGVjdGlvblVwZGF0ZVR5cGUsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChzZWxlY3Rpb25Dcml0ZXJpYXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgJ1NlbGVjdGlvbiBjcml0ZXJpYSBtaXNzaW5nIGZvciBzZWxlY3RpbmcgbWFya3MgYnkgdmFsdWUnKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3Rpb25UeXBlOiBzdHJpbmcgPSB0aGlzLnZhbGlkYXRlU2VsZWN0aW9uVXBkYXRlVHlwZShzZWxlY3Rpb25VcGRhdGVUeXBlKTtcbiAgICBjb25zdCBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lcjogU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyID0gdGhpcy5wYXJzZVNlbGVjdGlvbk1hcmtzKHNlbGVjdGlvbkNyaXRlcmlhcyk7XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnc2VsZWN0TWFya3NCeVZhbHVlQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQsXG4gICAgICBbUGFyYW1ldGVySWQuU2VsZWN0aW9uVXBkYXRlVHlwZV06IHNlbGVjdGlvblR5cGUsXG4gICAgfTtcblxuICAgIGlmIChzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5oaWVyTW9kZWxBcnIgJiYgc2VsZWN0aW9uTW9kZWxDb250YWluZXIuaGllck1vZGVsQXJyLmxlbmd0aCkge1xuICAgICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5IaWVyVmFsU2VsZWN0aW9uTW9kZWxzXSA9IHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLmhpZXJNb2RlbEFycjtcbiAgICB9XG4gICAgaWYgKHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLnF1YW50TW9kZWxBcnIgJiYgc2VsZWN0aW9uTW9kZWxDb250YWluZXIucXVhbnRNb2RlbEFyci5sZW5ndGgpIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuUXVhbnRSYW5nZVNlbGVjdGlvbk1vZGVsc10gPSBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5xdWFudE1vZGVsQXJyO1xuICAgIH1cbiAgICBpZiAoc2VsZWN0aW9uTW9kZWxDb250YWluZXIuZGltTW9kZWxBcnIgJiYgc2VsZWN0aW9uTW9kZWxDb250YWluZXIuZGltTW9kZWxBcnIubGVuZ3RoKSB7XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkRpbVZhbFNlbGVjdGlvbk1vZGVsc10gPSBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5kaW1Nb2RlbEFycjtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5TZWxlY3RCeVZhbHVlLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgdGhpcy5hcGlGaWx0ZXJIYW5kbGVyQ2hlY2tGb3JDb21tYW5kRXJyb3IocmVzcG9uc2UucmVzdWx0IGFzIHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byBleGVjdXRlIGhvdmVyIGFjdGlvbnMgYW5kIHJlbmRlciB0b29sdGlwIGZvciBhIGdpdmVuIHR1cGxlIHJlcHJlc2VudGluZyBhIG1hcmsgaW4gdGhlIHZpc3VhbGl6YXRpb24uXG4gICAqIElmIHRoZSB0b29sdGlwIHBhcmFtZXRlciBpcyBpbmNsdWRlZCBpdCB3aWxsIHNob3cgdGhlIHRvb2x0aXAgb24gaG92ZXIuIElmIG5vdCwgbm8gdG9vbHRpcCBpcyBzaG93bi5cbiAgICpcbiAgICogQHBhcmFtIHZpc3VhbElkXG4gICAqIEBwYXJhbSBob3ZlcmVkVHVwbGVcbiAgICogQHBhcmFtIHRvb2x0aXBcbiAgICogQHJldHVybnMgZW1wdHkgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGV4dGVuc2lvbiBob3N0IGhhcyBzdWNjZXNzZnVsbHkgYmVlbiBpbmZvcm1lZCBvZiB0aGUgcmVxdWVzdCBhbmQgcmVqZWN0cyBvbiBlcnJvclxuICAgKi9cbiAgcHVibGljIGhvdmVyVHVwbGVBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgaG92ZXJlZFR1cGxlPzogbnVtYmVyLFxuICAgIHRvb2x0aXA/OiBDb250cmFjdC5Ub29sdGlwQ29udGV4dCB8IG51bGwsXG4gICAgYWxsb3dIb3ZlckFjdGlvbnM/OiBib29sZWFuLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgaW50ZXJhY3Rpb25Nb2RlbCA9IG5ldyBIb3ZlclR1cGxlSW50ZXJhY3Rpb25Nb2RlbChcbiAgICAgIHZpc3VhbElkLFxuICAgICAgdGhpcy5lbnN1cmVUdXBsZUlESXNOb25OZWdhdGl2ZShob3ZlcmVkVHVwbGUpLFxuICAgICAgdG9vbHRpcCxcbiAgICAgIGFsbG93SG92ZXJBY3Rpb25zLFxuICAgICk7XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnaG92ZXJUdXBsZUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Ib3ZlclR1cGxlSW50ZXJhY3Rpb25dOiBpbnRlcmFjdGlvbk1vZGVsLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5SYWlzZUhvdmVyVHVwbGVOb3RpZmljYXRpb24sIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIG1vZGlmeSBzZWxlY3Rpb24sIGV4ZWN1dGUgc2VsZWN0IGFjdGlvbnMgYW5kIHJlbmRlciB0b29sdGlwIGZvciBhIGdpdmVuIGxpc3Qgb2YgdHVwbGVzIHJlcHJlc2VudGluZyBhIG1hcmsgb3IgbWFya3MgaW4gdGhlIHZpc3VhbGl6YXRpb24uXG4gICAqIElmIHRoZSB0b29sdGlwIHBhcmFtZXRlciBpcyBpbmNsdWRlZCBpdCB3aWxsIHNob3cgdGhlIHRvb2x0aXAgb24gc2VsZWN0LiBJZiBub3QsIG5vIHRvb2x0aXAgaXMgc2hvd24uXG4gICAqXG4gICAqIEBwYXJhbSB2aXN1YWxJZFxuICAgKiBAcGFyYW0gc2VsZWN0ZWRUdXBsZXNcbiAgICogQHBhcmFtIHNlbGVjdE9wdGlvblxuICAgKiBAcGFyYW0gdG9vbHRpcFxuICAgKiBAcmV0dXJucyBlbXB0eSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZXh0ZW5zaW9uIGhvc3QgaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIGluZm9ybWVkIG9mIHRoZSByZXF1ZXN0IGFuZCByZWplY3RzIG9uIGVycm9yXG4gICAqL1xuICBwdWJsaWMgc2VsZWN0VHVwbGVzQXN5bmMoXG4gICAgdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIHNlbGVjdGVkVHVwbGVzOiBBcnJheTxudW1iZXI+LFxuICAgIHNlbGVjdE9wdGlvbjogQ29udHJhY3QuU2VsZWN0T3B0aW9ucyxcbiAgICB0b29sdGlwPzogQ29udHJhY3QuVG9vbHRpcENvbnRleHQsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBpbnRlcmFjdGlvbk1vZGVsID0gbmV3IFNlbGVjdFR1cGxlc0ludGVyYWN0aW9uTW9kZWwodmlzdWFsSWQsIHNlbGVjdGVkVHVwbGVzLCBzZWxlY3RPcHRpb24sIHRvb2x0aXApO1xuXG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3NlbGVjdFR1cGxlc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TZWxlY3RUdXBsZXNJbnRlcmFjdGlvbl06IGludGVyYWN0aW9uTW9kZWwsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlJhaXNlU2VsZWN0VHVwbGVzTm90aWZpY2F0aW9uLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhcGlGaWx0ZXJIYW5kbGVyQ2hlY2tGb3JDb21tYW5kRXJyb3Ioc2VydmVyUG06IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0pIHtcbiAgICBpZiAoIXNlcnZlclBtW1BhcmFtZXRlcklkLlBhcmFtZXRlckVycm9yXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoc2VydmVyUG1bUGFyYW1ldGVySWQuSW52YWxpZEZpZWxkc10pIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkU2VsZWN0aW9uRmllbGROYW1lLCBzZXJ2ZXJQbVtQYXJhbWV0ZXJJZC5JbnZhbGlkRmllbGRzXSk7XG4gICAgfVxuICAgIGlmIChzZXJ2ZXJQbVtQYXJhbWV0ZXJJZC5JbnZhbGlkVmFsdWVzXSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5TaGFyZWRFcnJvckNvZGVzLkludmFsaWRTZWxlY3Rpb25WYWx1ZSwgc2VydmVyUG1bUGFyYW1ldGVySWQuSW52YWxpZFZhbHVlc10pO1xuICAgIH1cbiAgICBpZiAoc2VydmVyUG1bUGFyYW1ldGVySWQuSW52YWxpZERhdGVzXSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5TaGFyZWRFcnJvckNvZGVzLkludmFsaWRTZWxlY3Rpb25EYXRlLCBzZXJ2ZXJQbVtQYXJhbWV0ZXJJZC5JbnZhbGlkRGF0ZXNdKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIHNlbGVjdCBtYXJrcyBmb3IgdGhlIGdpdmVuIHdvcmtzaGVldC5cbiAgICpcbiAgICogQHBhcmFtIHZpc3VhbElkXG4gICAqIEBwYXJhbSBNYXJrSW5mb1xuICAgKiBAcGFyYW0gc2VsZWN0aW9uVXBkYXRlVHlwZVxuICAgKi9cbiAgcHVibGljIHNlbGVjdE1hcmtzQnlJZEFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBtYXJrczogQXJyYXk8Q29udHJhY3QuTWFya0luZm8+LFxuICAgIHNlbGVjdGlvblVwZGF0ZVR5cGU6IENvbnRyYWN0LlNlbGVjdGlvblVwZGF0ZVR5cGUsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChtYXJrcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLCAnTWFya3MgaW5mbyBtaXNzaW5nIGZvciBzZWxlY3RpbmcgbWFya3MgYnkgSWQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3Rpb25UeXBlOiBzdHJpbmcgPSB0aGlzLnZhbGlkYXRlU2VsZWN0aW9uVXBkYXRlVHlwZShzZWxlY3Rpb25VcGRhdGVUeXBlKTtcbiAgICBjb25zdCBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lcjogU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyID0gdGhpcy5wYXJzZVNlbGVjdGlvbklkcyhtYXJrcyk7XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnc2VsZWN0TWFya3NCeUlkQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQsXG4gICAgICBbUGFyYW1ldGVySWQuU2VsZWN0aW9uVXBkYXRlVHlwZV06IHNlbGVjdGlvblR5cGUsXG4gICAgICBbUGFyYW1ldGVySWQuU2VsZWN0aW9uXTogc2VsZWN0aW9uTW9kZWxDb250YWluZXIuc2VsZWN0aW9uLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuU2VsZWN0QnlWYWx1ZSwgcGFyYW1ldGVycykudGhlbjx2b2lkPigocmVzcG9uc2UpID0+IHtcbiAgICAgIC8vIEV4cGVjdGluZyBhbiBlbXB0eSBtb2RlbCBhbmQgaGVuY2UgdGhlIHZvaWQgcmVzcG9uc2UuXG4gICAgICByZXR1cm47XG4gICAgICAvLyBUT0RPIEludmVzdGlnYXRlIHRoZSBlcnJvciByZXNwb25zZSB3aXRoIG11bHRpcGxlIG91dHB1dCBwYXJhbXMgYW5kIHRocm93IGVycm9yIGFjY29yZGluZ2x5LlxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byBwcmVwYXJlIHRoZSBwcmVzIG1vZGVscyBmb3Igc2VsZWN0aW9uIGJ5IE1hcmtzSW5mb1xuICAgKiBAcGFyYW0gbWFya3NcbiAgICovXG4gIHByaXZhdGUgcGFyc2VTZWxlY3Rpb25JZHMobWFya3M6IEFycmF5PENvbnRyYWN0Lk1hcmtJbmZvPik6IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lciB7XG4gICAgY29uc3QgaWRzOiBBcnJheTxzdHJpbmc+ID0gW107XG4gICAgY29uc3Qgc2VsZWN0aW9uTW9kZWxDb250YWluZXI6IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lciA9IG5ldyBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1hcmtzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCB0dXBsZUlkOiBudW1iZXIgfCB1bmRlZmluZWQgPSBtYXJrc1tpXS50dXBsZUlkO1xuICAgICAgaWYgKHR1cGxlSWQgIT09IHVuZGVmaW5lZCAmJiB0dXBsZUlkICE9PSBudWxsKSB7XG4gICAgICAgIC8vIElmIHR1cGxlIGlkIGlzIHByb3ZpZGVkIHVzZSB0aGF0IGluc3RlYWQgb2YgcGFpclxuICAgICAgICBpZHMucHVzaCh0dXBsZUlkLnRvU3RyaW5nKCkpOyAvLyBjb2xsZWN0IHRoZSB0dXBsZSBpZHNcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAndHVwbGVJZCBwYXJzaW5nIGVycm9yJyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpZHMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAvLyB0dXBsZSBpZHMgYmFzZWQgc2VsZWN0aW9uXG4gICAgICBjb25zdCB0dXBsZVNlbGVjdGlvbk1vZGVsOiBUdXBsZVNlbGVjdGlvbk1vZGVsID0gbmV3IFR1cGxlU2VsZWN0aW9uTW9kZWwoKTtcbiAgICAgIHR1cGxlU2VsZWN0aW9uTW9kZWwuc2VsZWN0aW9uVHlwZSA9ICd0dXBsZXMnO1xuICAgICAgdHVwbGVTZWxlY3Rpb25Nb2RlbC5vYmplY3RJZHMgPSBpZHM7XG4gICAgICBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5zZWxlY3Rpb24gPSB0dXBsZVNlbGVjdGlvbk1vZGVsO1xuICAgIH1cbiAgICByZXR1cm4gc2VsZWN0aW9uTW9kZWxDb250YWluZXI7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIHByZXBhcmUgdGhlIHByZXMgbW9kZWxzIGZvciBzZWxlY3Rpb24gYnkgdmFsdWVzLlxuICAgKlxuICAgKiBTdXBwb3J0cyAzIHR5cGVzIGZvciBzZWxlY3Rpb246XG4gICAqIDEpIEhpZXJhcmNoaWNhbCB2YWx1ZSBiYXNlZCBzZWxlY3Rpb25cbiAgICogMikgUmFuZ2UgdmFsdWUgYmFzZWQgc2VsZWN0aW9uXG4gICAqIDMpIERpbWVuc2lvbiB2YWx1ZSBiYXNlZCBzZWxlY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIG1hcmtzXG4gICAqL1xuICBwcml2YXRlIHBhcnNlU2VsZWN0aW9uTWFya3Moc2VsZWN0aW9uQ3JpdGVyaWFzOiBBcnJheTxDb250cmFjdC5TZWxlY3Rpb25Dcml0ZXJpYT4pOiBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIge1xuICAgIGNvbnN0IHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyOiBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIgPSBuZXcgU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyKCk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlbGVjdGlvbkNyaXRlcmlhcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgc3QgPSBzZWxlY3Rpb25Dcml0ZXJpYXNbaV07XG4gICAgICBpZiAoIShzdC5maWVsZE5hbWUgJiYgc3QudmFsdWUgIT09IHVuZGVmaW5lZCAmJiBzdC52YWx1ZSAhPT0gbnVsbCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FcnJvckNvZGVzLkludGVybmFsRXJyb3IsICdTZWxlY3Rpb24gQ3JpdGVyaWEgcGFyc2luZyBlcnJvcicpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjYXRSZWdleCA9IG5ldyBSZWdFeHAoJyhbW0EtWmEtejAtOV0rXSkuKicsICdnJyk7XG4gICAgICBjb25zdCByYW5nZU9wdGlvbiA9IHN0LnZhbHVlIGFzIENvbnRyYWN0LlJhbmdlVmFsdWU7XG4gICAgICBpZiAoY2F0UmVnZXgudGVzdChzdC5maWVsZE5hbWUpKSB7XG4gICAgICAgIC8vIEhpZXJhcmNoaWNhbCB2YWx1ZSBzZWxlY3Rpb25cbiAgICAgICAgY29uc3QgaGllck1vZGVsOiBIaWVyYXJjaGljYWxTZWxlY3Rpb25Nb2RlbCA9IHRoaXMuYWRkVG9QYXJhbXNMaXN0KHN0LmZpZWxkTmFtZSwgc3QudmFsdWUpIGFzIEhpZXJhcmNoaWNhbFNlbGVjdGlvbk1vZGVsO1xuICAgICAgICBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5oaWVyTW9kZWxBcnIucHVzaChoaWVyTW9kZWwpO1xuICAgICAgfSBlbHNlIGlmIChyYW5nZU9wdGlvbi5taW4gIT09IHVuZGVmaW5lZCAmJiByYW5nZU9wdGlvbi5tYXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBSYW5nZSB2YWx1ZSBzZWxlY3Rpb25cbiAgICAgICAgY29uc3QgcXVhbnRNb2RlbDogUmFuZ2VTZWxlY3Rpb25Nb2RlbCA9IHRoaXMuYWRkVG9SYW5nZVBhcmFtc0xpc3Qoc3QuZmllbGROYW1lLCByYW5nZU9wdGlvbik7XG4gICAgICAgIHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLnF1YW50TW9kZWxBcnIucHVzaChxdWFudE1vZGVsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIERpbWVuc2lvbiB2YWx1ZSBzZWxlY3Rpb25cbiAgICAgICAgY29uc3QgZGltTW9kZWw6IERpbWVuc2lvblNlbGVjdGlvbk1vZGVsID0gdGhpcy5hZGRUb1BhcmFtc0xpc3Qoc3QuZmllbGROYW1lLCBzdC52YWx1ZSkgYXMgRGltZW5zaW9uU2VsZWN0aW9uTW9kZWw7XG4gICAgICAgIHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLmRpbU1vZGVsQXJyLnB1c2goZGltTW9kZWwpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gdHJhbnNmb3JtIHRoZSBrZXkgdmFsdWUgcGFpciBpbnRvIHZhbHVlIGJhc2VkIHByZXMgbW9kZWwgb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWVTZWxlY3Rpb25Nb2RlbFxuICAgKiBAcGFyYW0gZmllbGROYW1lXG4gICAqIEBwYXJhbSB2YWx1ZVxuICAgKi9cbiAgcHJpdmF0ZSBhZGRUb1BhcmFtc0xpc3QoZmllbGROYW1lOiBzdHJpbmcsIHZhbHVlOiBDb250cmFjdC5DYXRlZ29yaWNhbFZhbHVlIHwgQ29udHJhY3QuUmFuZ2VWYWx1ZSk6IFZhbHVlU2VsZWN0aW9uTW9kZWwge1xuICAgIGNvbnN0IHZhbHVlU2VsZWN0aW9uTW9kZWw6IFZhbHVlU2VsZWN0aW9uTW9kZWwgPSBuZXcgVmFsdWVTZWxlY3Rpb25Nb2RlbCgpO1xuICAgIGNvbnN0IG1hcmtWYWx1ZXM6IEFycmF5PHN0cmluZz4gPSBbXTtcblxuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICBjb25zdCB2YWx1ZUFycjogQXJyYXk8c3RyaW5nPiA9IHZhbHVlO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZUFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICBtYXJrVmFsdWVzLnB1c2goUGFyYW0uc2VyaWFsaXplUGFyYW1ldGVyVmFsdWUodmFsdWVBcnJbaV0pKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbWFya1ZhbHVlcy5wdXNoKFBhcmFtLnNlcmlhbGl6ZVBhcmFtZXRlclZhbHVlKHZhbHVlKSk7XG4gICAgfVxuXG4gICAgdmFsdWVTZWxlY3Rpb25Nb2RlbC5xdWFsaWZpZWRGaWVsZENhcHRpb24gPSBmaWVsZE5hbWU7XG4gICAgdmFsdWVTZWxlY3Rpb25Nb2RlbC5zZWxlY3RWYWx1ZXMgPSBtYXJrVmFsdWVzO1xuICAgIHJldHVybiB2YWx1ZVNlbGVjdGlvbk1vZGVsO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byB0cmFuc2Zvcm0gdGhlIGtleSB2YWx1ZSBwYWlyIGludG8gcmFuZ2UgYmFzZWQgc2VsZWN0aW9uIHByZXMgbW9kZWwuXG4gICAqXG4gICAqIFRPRE86IE5lZWQgdG8gaGFuZGxlIHRoZSBwYXJzaW5nIG9mIGRhdGUgdHlwZSB2YWx1ZXMuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZVNlbGVjdGlvbk1vZGVsXG4gICAqIEBwYXJhbSBmaWVsZE5hbWVcbiAgICogQHBhcmFtIHZhbHVlXG4gICAqL1xuICBwcml2YXRlIGFkZFRvUmFuZ2VQYXJhbXNMaXN0KGZpZWxkTmFtZTogc3RyaW5nLCB2YWx1ZTogQ29udHJhY3QuUmFuZ2VWYWx1ZSk6IFJhbmdlU2VsZWN0aW9uTW9kZWwge1xuICAgIGNvbnN0IHJhbmdlU2VsZWN0aW9uTW9kZWw6IFJhbmdlU2VsZWN0aW9uTW9kZWwgPSBuZXcgUmFuZ2VTZWxlY3Rpb25Nb2RlbCgpO1xuICAgIHJhbmdlU2VsZWN0aW9uTW9kZWwucXVhbGlmaWVkRmllbGRDYXB0aW9uID0gZmllbGROYW1lO1xuICAgIGlmICh2YWx1ZS5tYXggIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS5tYXggIT09IG51bGwpIHtcbiAgICAgIHJhbmdlU2VsZWN0aW9uTW9kZWwubWF4VmFsdWUgPSBQYXJhbS5zZXJpYWxpemVQYXJhbWV0ZXJWYWx1ZSh2YWx1ZS5tYXgpO1xuICAgIH1cbiAgICBpZiAodmFsdWUubWluICE9PSB1bmRlZmluZWQgJiYgdmFsdWUubWluICE9PSBudWxsKSB7XG4gICAgICByYW5nZVNlbGVjdGlvbk1vZGVsLm1pblZhbHVlID0gUGFyYW0uc2VyaWFsaXplUGFyYW1ldGVyVmFsdWUodmFsdWUubWluKTtcbiAgICB9XG4gICAgcmFuZ2VTZWxlY3Rpb25Nb2RlbC5pbmNsdWRlZCA9IHRoaXMudmFsaWRhdGVOdWxsT3B0aW9uVHlwZSh2YWx1ZS5udWxsT3B0aW9uKTtcbiAgICByZXR1cm4gcmFuZ2VTZWxlY3Rpb25Nb2RlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gdmFsaWRhdGUgdGhlIHNlbGVjdGlvbiB1cGRhdGUgdHlwZS5cbiAgICpcbiAgICogQHBhcmFtIHNlbGVjdGlvblVwZGF0ZVR5cGVcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVTZWxlY3Rpb25VcGRhdGVUeXBlKHNlbGVjdGlvblVwZGF0ZVR5cGU6IENvbnRyYWN0LlNlbGVjdGlvblVwZGF0ZVR5cGUpOiBzdHJpbmcge1xuICAgIGlmIChzZWxlY3Rpb25VcGRhdGVUeXBlID09PSBDb250cmFjdC5TZWxlY3Rpb25VcGRhdGVUeXBlLlJlcGxhY2UpIHtcbiAgICAgIHJldHVybiBTZWxlY3Rpb25VcGRhdGVUeXBlSW50ZXJuYWwuUmVwbGFjZTtcbiAgICB9IGVsc2UgaWYgKHNlbGVjdGlvblVwZGF0ZVR5cGUgPT09IENvbnRyYWN0LlNlbGVjdGlvblVwZGF0ZVR5cGUuQWRkKSB7XG4gICAgICByZXR1cm4gU2VsZWN0aW9uVXBkYXRlVHlwZUludGVybmFsLkFkZDtcbiAgICB9IGVsc2UgaWYgKHNlbGVjdGlvblVwZGF0ZVR5cGUgPT09IENvbnRyYWN0LlNlbGVjdGlvblVwZGF0ZVR5cGUuUmVtb3ZlKSB7XG4gICAgICByZXR1cm4gU2VsZWN0aW9uVXBkYXRlVHlwZUludGVybmFsLlJlbW92ZTtcbiAgICB9XG4gICAgcmV0dXJuIFNlbGVjdGlvblVwZGF0ZVR5cGVJbnRlcm5hbC5SZXBsYWNlO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byB2YWxpZGF0ZSB0aGUgaW5jbHVkZSB0eXBlIGZvciByYW5nZSBzZWxlY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSBudWxsT3B0aW9uXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlTnVsbE9wdGlvblR5cGUobnVsbE9wdGlvbjogQ29udHJhY3QuRmlsdGVyTnVsbE9wdGlvbiB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gICAgaWYgKG51bGxPcHRpb24pIHtcbiAgICAgIGlmIChudWxsT3B0aW9uID09PSBDb250cmFjdC5GaWx0ZXJOdWxsT3B0aW9uLk51bGxWYWx1ZXMpIHtcbiAgICAgICAgcmV0dXJuIFF1YW50aXRhdGl2ZUluY2x1ZGVkVmFsdWVzLkluY2x1ZGVOdWxsO1xuICAgICAgfSBlbHNlIGlmIChudWxsT3B0aW9uID09PSBDb250cmFjdC5GaWx0ZXJOdWxsT3B0aW9uLk5vbk51bGxWYWx1ZXMpIHtcbiAgICAgICAgcmV0dXJuIFF1YW50aXRhdGl2ZUluY2x1ZGVkVmFsdWVzLkluY2x1ZGVOb25OdWxsO1xuICAgICAgfSBlbHNlIGlmIChudWxsT3B0aW9uID09PSBDb250cmFjdC5GaWx0ZXJOdWxsT3B0aW9uLkFsbFZhbHVlcykge1xuICAgICAgICByZXR1cm4gUXVhbnRpdGF0aXZlSW5jbHVkZWRWYWx1ZXMuSW5jbHVkZUFsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gUXVhbnRpdGF0aXZlSW5jbHVkZWRWYWx1ZXMuSW5jbHVkZUFsbDtcbiAgfVxuXG4gIHByaXZhdGUgZW5zdXJlVHVwbGVJRElzTm9uTmVnYXRpdmUodHVwbGVJZD86IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKHR1cGxlSWQgJiYgdHVwbGVJZCA+IDApIHtcbiAgICAgIHJldHVybiB0dXBsZUlkO1xuICAgIH1cblxuICAgIC8vIDAgd2lsbCBub3QgcmVmZXIgdG8gYSB2YWxpZCB0dXBsZSAoc2luY2UgdHVwbGUgaWRzIGFyZSAxLWJhc2VkKSxcbiAgICAvLyBidXQgY2FuIGJlIHVzZWQgZm9yIGNsZWFyaW5nIHRoZSBjdXJyZW50IGhvdmVyIG9yIHNlbGVjdGlvblxuICAgIHJldHVybiAwO1xuICB9XG59XG4iLCJpbXBvcnQgeyBFcnJvckNvZGVzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBFeGVjdXRlUmVzcG9uc2UsIEludGVybmFsQXBpRGlzcGF0Y2hlciwgSW50ZXJuYWxUYWJsZWF1RXJyb3IsIFZlcmJJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MgfSBmcm9tICcuLi8uLi9FbnVtTWFwcGluZ3MvSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uLy4uL1RhYmxlYXVFcnJvcic7XG5pbXBvcnQgeyBTaG91bGRUaHJvdyB9IGZyb20gJy4uLy4uL1V0aWxzL0VudW1Db252ZXJ0ZXInO1xuXG4vKipcbiAqIEVhY2ggU2VydmNlSW1wbCBzaG91bGQgZXh0ZW5kIHRoaXMgYmFzZSBjbGFzcyBmb3IgdGhlIHNha2Ugb2ZcbiAqIHByb3BlciBlcnJvciBoYW5kbGluZy4gIFRoaXMgYmFzZSBoYW5kbGVzIHRoZSBjb252ZXJzaW9uXG4gKiBmcm9tIGludGVybmFsIGVycm9ycyB0byBleHRlcm5hbCBlcnJvcnMgdGhhdCB3ZSB0aHJvdyB0byBkZXZlbG9wZXJzXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXJ2aWNlSW1wbEJhc2Uge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfZGlzcGF0Y2hlcjogSW50ZXJuYWxBcGlEaXNwYXRjaGVyLCBwcm90ZWN0ZWQgX3JlZ2lzdHJ5SWQ6IG51bWJlcikge31cblxuICBwcm90ZWN0ZWQgZXhlY3V0ZSh2ZXJiOiBWZXJiSWQsIHBhcmFtczogRXhlY3V0ZVBhcmFtZXRlcnMpOiBQcm9taXNlPEV4ZWN1dGVSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLl9kaXNwYXRjaGVyLmV4ZWN1dGUodmVyYiwgcGFyYW1zKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgIC8vIEFueSBpbnRlcm5hbCBlcnJvciB0aGF0IGNvbWVzIGZyb20gdGhlIGRpc3BhdGNoZXIgc2hvdWxkIGJlIGNvbnZlcnRlZFxuICAgICAgLy8gdG8gYW4gZXh0ZXJuYWwgZXJyb3IgdXNpbmcgdGhlIGVudW0gbWFwcGVyIGZvciBlcnJvciBjb2Rlcy5cbiAgICAgIGNvbnN0IGludGVybmFsRXJyb3IgPSBlcnJvciBhcyBJbnRlcm5hbFRhYmxlYXVFcnJvcjtcbiAgICAgIGNvbnN0IGV4dGVybmFsRXJyb3JDb2RlOiBFcnJvckNvZGVzID0gSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzLmVycm9yQ29kZS5jb252ZXJ0KGludGVybmFsRXJyb3IuZXJyb3JDb2RlLCBTaG91bGRUaHJvdy5Obyk7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKGV4dGVybmFsRXJyb3JDb2RlLCBpbnRlcm5hbEVycm9yLm1lc3NhZ2UpO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBTaGVldFNpemUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXhlY3V0ZVBhcmFtZXRlcnMsIFBhcmFtZXRlcklkLCBWZXJiSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFNpemVTZXJ2aWNlIH0gZnJvbSAnLi4vU2l6ZVNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuXG5leHBvcnQgY2xhc3MgU2l6ZVNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgU2l6ZVNlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5TaXplO1xuICB9XG5cbiAgY2hhbmdlU2l6ZUFzeW5jKG5hbWU6IHN0cmluZywgbmV3U2l6ZTogU2hlZXRTaXplKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2NoYW5nZVNpemVBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuU2hlZXROYW1lXTogbmFtZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5NaW5IZWlnaHRdOiBuZXdTaXplLm1pblNpemU/LmhlaWdodCB8fCAwLFxuICAgICAgW1BhcmFtZXRlcklkLk1pbldpZHRoXTogbmV3U2l6ZS5taW5TaXplPy53aWR0aCB8fCAwLFxuICAgICAgW1BhcmFtZXRlcklkLk1heEhlaWdodF06IG5ld1NpemUubWF4U2l6ZT8uaGVpZ2h0IHx8IDAsXG4gICAgICBbUGFyYW1ldGVySWQuTWF4V2lkdGhdOiBuZXdTaXplLm1heFNpemU/LndpZHRoIHx8IDAsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlNldFNoZWV0U2l6ZSwgcGFyYW1ldGVycykudGhlbjx2b2lkPigoX3Jlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBQYXJhbWV0ZXJJZCwgU3RvcnlQb2ludE1vZGVsLCBWZXJiSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFN0b3J5QWN0aXZhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9TdG9yeUFjdGl2YXRpb25TZXJ2aWNlJztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vU2VydmljZUltcGxCYXNlJztcblxuZXhwb3J0IGNsYXNzIFN0b3J5QWN0aXZhdGlvblNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgU3RvcnlBY3RpdmF0aW9uU2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLlN0b3J5QWN0aXZhdGlvbjtcbiAgfVxuXG4gIGFjdGl2YXRlTmV4dFN0b3J5UG9pbnRBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkFjdGl2YXRlTmV4dFN0b3J5UG9pbnQ7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2FjdGl2YXRlTmV4dFN0b3J5UG9pbnRBc3luYycsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjx2b2lkPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIGFjdGl2YXRlUHJldmlvdXNTdG9yeVBvaW50QXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5BY3RpdmF0ZVByZXZpb3VzU3RvcnlQb2ludDtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYWN0aXZhdGVQcmV2aW91c1N0b3J5UG9pbnRBc3luYycsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjx2b2lkPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIGFjdGl2YXRlU3RvcnlQb2ludEFzeW5jKGluZGV4OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkFjdGl2YXRlU3RvcnlQb2ludDtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYWN0aXZhdGVTdG9yeVBvaW50QXN5bmMnLFxuICAgIH07XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5TdG9yeVBvaW50SW5kZXhdID0gaW5kZXg7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cblxuICByZXZlcnRTdG9yeVBvaW50QXN5bmMoaW5kZXg6IG51bWJlcik6IFByb21pc2U8U3RvcnlQb2ludE1vZGVsPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5SZXZlcnRTdG9yeVBvaW50O1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdyZXZlcnRTdG9yeVBvaW50QXN5bmMnLFxuICAgIH07XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5TdG9yeVBvaW50SW5kZXhdID0gaW5kZXg7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48U3RvcnlQb2ludE1vZGVsPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybiByZXNwb25zZS5yZXN1bHQgYXMgU3RvcnlQb2ludE1vZGVsO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXhlY3V0ZVBhcmFtZXRlcnMsIFBhcmFtZXRlcklkLCBWZXJiSWQsIFZpc3VhbElkLCBWaXN1YWxTcGVjaWZpY2F0aW9uIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBWaXN1YWxNb2RlbFNlcnZpY2UgfSBmcm9tICcuLi9WaXN1YWxNb2RlbFNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuXG5leHBvcnQgY2xhc3MgVmlzdWFsTW9kZWxTZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIFZpc3VhbE1vZGVsU2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLlZpc3VhbE1vZGVsO1xuICB9XG5cbiAgcHVibGljIGdldFZpc3VhbFNwZWNpZmljYXRpb25Bc3luYyh2aXN1YWxJZDogVmlzdWFsSWQpOiBQcm9taXNlPENvbnRyYWN0LlZpc3VhbFNwZWNpZmljYXRpb24+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0VmlzdWFsU3BlY2lmaWNhdGlvbkFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Xb3Jrc2hlZXROYW1lXTogdmlzdWFsSWQud29ya3NoZWV0LFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRWaXN1YWxTcGVjaWZpY2F0aW9uLCBwYXJhbWV0ZXJzKS50aGVuPENvbnRyYWN0LlZpc3VhbFNwZWNpZmljYXRpb24+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0IGFzIFZpc3VhbFNwZWNpZmljYXRpb247XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFkZE1hcmtzQ2FyZEZpZWxkc0FzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBtYXJrc0NhcmRJbmRleDogbnVtYmVyLFxuICAgIGVuY29kaW5nVHlwZTogQ29udHJhY3QuRW5jb2RpbmdUeXBlLFxuICAgIGNvbHVtbnM6IEFycmF5PENvbnRyYWN0LkNvbHVtbj4sXG4gICAgc3RhcnRJbmRleDogbnVtYmVyLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYWRkTWFya3NDYXJkRmllbGRzQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLldvcmtzaGVldE5hbWVdOiB2aXN1YWxJZC53b3Jrc2hlZXQsXG4gICAgICBbUGFyYW1ldGVySWQuTWFya3NDYXJkSW5kZXhdOiBtYXJrc0NhcmRJbmRleCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5FbmNvZGluZ1R5cGVdOiBlbmNvZGluZ1R5cGUsXG4gICAgICBbUGFyYW1ldGVySWQuQ29sdW1uc106IGNvbHVtbnMsXG4gICAgICBbUGFyYW1ldGVySWQuU3RhcnRJbmRleF06IHN0YXJ0SW5kZXgsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5BZGRNYXJrc0NhcmRGaWVsZHMsIHBhcmFtZXRlcnMpLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG1vdmVNYXJrc0NhcmRGaWVsZEFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBtYXJrc0NhcmRJbmRleDogbnVtYmVyLFxuICAgIGZyb21JbmRleDogbnVtYmVyLFxuICAgIHRvSW5kZXg6IG51bWJlcixcbiAgICBmaWVsZENvdW50ID0gMSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2FkZE1hcmtzQ2FyZEZpZWxkc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Xb3Jrc2hlZXROYW1lXTogdmlzdWFsSWQud29ya3NoZWV0LFxuICAgICAgW1BhcmFtZXRlcklkLk1hcmtzQ2FyZEluZGV4XTogbWFya3NDYXJkSW5kZXgsXG4gICAgICBbUGFyYW1ldGVySWQuRnJvbUluZGV4XTogZnJvbUluZGV4LFxuICAgICAgW1BhcmFtZXRlcklkLlRvSW5kZXhdOiB0b0luZGV4LFxuICAgICAgW1BhcmFtZXRlcklkLkZpZWxkQ291bnRdOiBmaWVsZENvdW50LFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuTW92ZU1hcmtzQ2FyZEZpZWxkLCBwYXJhbWV0ZXJzKS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzcGxpY2VNYXJrc0NhcmRGaWVsZHNBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgbWFya3NDYXJkSW5kZXg6IG51bWJlcixcbiAgICBlbmNvZGluZ1R5cGU6IENvbnRyYWN0LkVuY29kaW5nVHlwZSxcbiAgICBzdGFydEluZGV4OiBudW1iZXIsXG4gICAgZGVsZXRlQ291bnQ6IG51bWJlcixcbiAgICBjb2x1bW5zOiBBcnJheTxDb250cmFjdC5Db2x1bW4+LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnc3BsaWNlTWFya3NDYXJkRmllbGRzQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLldvcmtzaGVldE5hbWVdOiB2aXN1YWxJZC53b3Jrc2hlZXQsXG4gICAgICBbUGFyYW1ldGVySWQuTWFya3NDYXJkSW5kZXhdOiBtYXJrc0NhcmRJbmRleCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5FbmNvZGluZ1R5cGVdOiBlbmNvZGluZ1R5cGUsXG4gICAgICBbUGFyYW1ldGVySWQuU3RhcnRJbmRleF06IHN0YXJ0SW5kZXgsXG4gICAgICBbUGFyYW1ldGVySWQuRGVsZXRlQ291bnRdOiBkZWxldGVDb3VudCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Db2x1bW5zXTogY29sdW1ucyxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlNwbGljZU1hcmtzQ2FyZEZpZWxkcywgcGFyYW1ldGVycykudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cblxuICBlZGl0QWxpYXNlc0RpYWxvZ0FzeW5jKGZpZWxkTmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2VkaXRBbGlhc2VzRGlhbG9nQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkZpZWxkSWRdOiBmaWVsZE5hbWUsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5FZGl0QWxpYXNlc0RpYWxvZywgcGFyYW1ldGVycykudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEN1c3RvbVZpZXdNb2RlbCwgRXhlY3V0ZVBhcmFtZXRlcnMsIFBhcmFtZXRlcklkLCBWZXJiSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQ3VzdG9tVmlld0ltcGwgfSBmcm9tICcuLi8uLi9JbXBsL0N1c3RvbVZpZXdJbXBsJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBWaXpTZXJ2aWNlIH0gZnJvbSAnLi4vVml6U2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBWaXpTZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIFZpelNlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5WaXo7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlVml6SW1hZ2VBc3luYyhpbnB1dFNwZWM6IG9iamVjdCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2NyZWF0ZVZpekltYWdlQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpekFQSUlucHV0SnNvbl06IEpTT04uc3RyaW5naWZ5KGlucHV0U3BlYyksXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlZpekFQSSwgcGFyYW1ldGVycykudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBzdHJpbmc7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFjdGl2YXRlU2hlZXRBc3luYyhuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYWN0aXZhdGVTaGVldEFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Td2l0Y2hUb1NoZWV0TmFtZV06IG5hbWUsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkFjdGl2YXRlU2hlZXQsIHBhcmFtZXRlcnMpLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldEN1c3RvbVZpZXdzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDdXN0b21WaWV3SW1wbD4+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0Q3VzdG9tVmlld3NBc3luYycsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldEN1c3RvbVZpZXdzLCBwYXJhbWV0ZXJzKS50aGVuPEFycmF5PEN1c3RvbVZpZXdJbXBsPj4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBjdXN0b21WaWV3cyA9IHJlc3BvbnNlLnJlc3VsdCBhcyBBcnJheTxDdXN0b21WaWV3TW9kZWw+O1xuICAgICAgcmV0dXJuIGN1c3RvbVZpZXdzLm1hcCgoY3VzdG9tVmlldzogQ3VzdG9tVmlld01vZGVsKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgQ3VzdG9tVmlld0ltcGwoY3VzdG9tVmlldywgdGhpcy5fcmVnaXN0cnlJZCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzaG93Q3VzdG9tVmlld0FzeW5jKGN1c3RvbVZpZXdOYW1lPzogc3RyaW5nIHwgbnVsbCk6IFByb21pc2U8Q3VzdG9tVmlld0ltcGwgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnc2hvd0N1c3RvbVZpZXdBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuQ3VzdG9tVmlld05hbWVdOiBjdXN0b21WaWV3TmFtZSB8fCAnJywgLy8gYSBmYWxzZXkgdmFsdWUgbWVhbnMgXCJzaG93IG9yaWdpbmFsIHZpZXdcIlxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5TaG93Q3VzdG9tVmlldywgcGFyYW1ldGVycykudGhlbjxDdXN0b21WaWV3SW1wbCB8IHVuZGVmaW5lZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBjdXN0b21WaWV3ID0gcmVzcG9uc2UucmVzdWx0IGFzIEN1c3RvbVZpZXdNb2RlbDtcbiAgICAgIHJldHVybiBjdXN0b21WaWV3Py5sdWlkID8gbmV3IEN1c3RvbVZpZXdJbXBsKGN1c3RvbVZpZXcsIHRoaXMuX3JlZ2lzdHJ5SWQpIDogdW5kZWZpbmVkO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUN1c3RvbVZpZXdBc3luYyhjdXN0b21WaWV3TmFtZTogc3RyaW5nKTogUHJvbWlzZTxDdXN0b21WaWV3SW1wbD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdyZW1vdmVDdXN0b21WaWV3QXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkN1c3RvbVZpZXdOYW1lXTogY3VzdG9tVmlld05hbWUsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlJlbW92ZUN1c3RvbVZpZXcsIHBhcmFtZXRlcnMpLnRoZW48Q3VzdG9tVmlld0ltcGw+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgY3VzdG9tVmlldyA9IHJlc3BvbnNlLnJlc3VsdCBhcyBDdXN0b21WaWV3TW9kZWw7XG4gICAgICByZXR1cm4gbmV3IEN1c3RvbVZpZXdJbXBsKGN1c3RvbVZpZXcsIHRoaXMuX3JlZ2lzdHJ5SWQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNhdmVDdXN0b21WaWV3QXN5bmMoY3VzdG9tVmlld05hbWU6IHN0cmluZyk6IFByb21pc2U8Q3VzdG9tVmlld0ltcGw+IHtcbiAgICAvLyBDdXN0b21WaWV3SXNEZWZhdWx0IGlzIGEgcmVxdWlyZWQgcGFyYW1ldGVyLCBidXQgb3VyIEFQSSBoYXMgbm90IGJlZW4gdXBkYXRlZCB0byBhbGxvdyBpdCB0byBiZSBzcGVjaWZpZWQgeWV0LlxuICAgIC8vIFdlIHNob3VsZCBhZGQgYSAnZGVmYXVsdCcgcGFyYW1ldGVyIHRvIHRoZSBpbnRlcmZhY2UuXG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3NhdmVDdXN0b21WaWV3QXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkN1c3RvbVZpZXdOYW1lXTogY3VzdG9tVmlld05hbWUsXG4gICAgICBbUGFyYW1ldGVySWQuQ3VzdG9tVmlld0lzRGVmYXVsdF06IGZhbHNlLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5TYXZlV29ya2Jvb2tBc0N1c3RvbVZpZXcsIHBhcmFtZXRlcnMpLnRoZW48Q3VzdG9tVmlld0ltcGw+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgY3VzdG9tVmlldyA9IHJlc3BvbnNlLnJlc3VsdCBhcyBDdXN0b21WaWV3TW9kZWw7XG4gICAgICByZXR1cm4gbmV3IEN1c3RvbVZpZXdJbXBsKGN1c3RvbVZpZXcsIHRoaXMuX3JlZ2lzdHJ5SWQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNldEFjdGl2ZUN1c3RvbVZpZXdBc0RlZmF1bHRBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnc2V0QWN0aXZlQ3VzdG9tVmlld0FzRGVmYXVsdEFzeW5jJyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuU2V0QWN0aXZlQ3VzdG9tVmlld0FzRGVmYXVsdCwgcGFyYW1ldGVycykudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc2F2ZUFzeW5jKGN1c3RvbVZpZXc6IEN1c3RvbVZpZXdJbXBsKTogUHJvbWlzZTxDdXN0b21WaWV3SW1wbD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdzYXZlQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkN1c3RvbVZpZXdMdWlkXTogY3VzdG9tVmlldy5sdWlkLFxuICAgICAgW1BhcmFtZXRlcklkLkN1c3RvbVZpZXdOYW1lXTogY3VzdG9tVmlldy5uYW1lLFxuICAgICAgW1BhcmFtZXRlcklkLkN1c3RvbVZpZXdJc0RlZmF1bHRdOiBjdXN0b21WaWV3LmlzRGVmYXVsdCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5DdXN0b21WaWV3SXNQdWJsaWNdOiBjdXN0b21WaWV3LnNoYXJlZCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuVXBkYXRlQ3VzdG9tVmlldywgcGFyYW1ldGVycykudGhlbjxDdXN0b21WaWV3SW1wbD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBjdXN0b21WaWV3ID0gcmVzcG9uc2UucmVzdWx0IGFzIEN1c3RvbVZpZXdNb2RlbDtcbiAgICAgIHJldHVybiBuZXcgQ3VzdG9tVmlld0ltcGwoY3VzdG9tVmlldywgdGhpcy5fcmVnaXN0cnlJZCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q3VycmVudFNyY0FzeW5jKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldEN1cnJlbnRTcmNBc3luYycsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldEN1cnJlbnRTcmMsIHBhcmFtZXRlcnMpLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5yZXN1bHQgYXMgc3RyaW5nKTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IERhc2hib2FyZE9iamVjdFZpc2liaWxpdHlUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFBhcmFtZXRlcklkLCBWZXJiSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzIGFzIEV4dGVybmFsRW51bUNvbnZlcnRlciB9IGZyb20gJy4uLy4uL0VudW1NYXBwaW5ncy9FeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MnO1xuaW1wb3J0IHsgRGFzaGJvYXJkT2JqZWN0SW1wbCB9IGZyb20gJy4uLy4uL0ltcGwvRGFzaGJvYXJkT2JqZWN0SW1wbCc7XG5pbXBvcnQgeyBFcnJvckhlbHBlcnMgfSBmcm9tICcuLi8uLi9VdGlscy9FcnJvckhlbHBlcnMnO1xuaW1wb3J0IHsgUGFyYW0gfSBmcm9tICcuLi8uLi9VdGlscy9QYXJhbSc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgWm9uZVNlcnZpY2UgfSBmcm9tICcuLi9ab25lU2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBab25lU2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBab25lU2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLlpvbmU7XG4gIH1cblxuICBwdWJsaWMgc2V0VmlzaWJpbGl0eUFzeW5jKFxuICAgIGRhc2hib2FyZDogc3RyaW5nLFxuICAgIGRhc2hib2FyZFpvbmVNYXA6IE1hcDxudW1iZXIsIERhc2hib2FyZE9iamVjdEltcGw+LFxuICAgIHpvbmVWaXNpYmlsaXR5TWFwOiBDb250cmFjdC5ab25lVmlzaWJpbGl0eU1hcCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnc2V0VmlzaWJpbGl0eUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EYXNoYm9hcmRdOiBkYXNoYm9hcmQsXG4gICAgICBbUGFyYW1ldGVySWQuWm9uZUlkc1Zpc2liaWxpdHlNYXBdOiB7fSxcbiAgICB9O1xuXG4gICAgLy8gem9uZVZpc2liaWxpdHlNYXAgY2FuIGJlIGVpdGhlciBhbiBvYmplY3Qgb3IgYSBNYXAgLSBjb252ZXJ0IGl0IHRvIGEgTWFwXG4gICAgY29uc3QgcGFyYW1ldGVyQXNNYXAgPSBQYXJhbS5jb252ZXJ0UGFyYW1ldGVyVG9NYXAoem9uZVZpc2liaWxpdHlNYXAsICd6b25lVmlzaWJpbGl0eU1hcCcpO1xuXG4gICAgcGFyYW1ldGVyQXNNYXAuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgRXJyb3JIZWxwZXJzLnZlcmlmeVpvbmVJc1ZhbGlkKGRhc2hib2FyZFpvbmVNYXAsIE51bWJlci5wYXJzZUludChrZXksIDEwKSk7XG4gICAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPERhc2hib2FyZE9iamVjdFZpc2liaWxpdHlUeXBlPih2YWx1ZSwgRGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eVR5cGUsICdEYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5VHlwZScpO1xuICAgICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5ab25lSWRzVmlzaWJpbGl0eU1hcF1ba2V5XSA9IEV4dGVybmFsRW51bUNvbnZlcnRlci5zZXRWaXNpYmlsaXR5VHlwZS5jb252ZXJ0KHZhbHVlKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlNldFpvbmVWaXNpYmlsaXR5LCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG1vdmVBbmRSZXNpemVBc3luYyhcbiAgICBkYXNoYm9hcmQ6IHN0cmluZyxcbiAgICBkYXNoYm9hcmRab25lTWFwOiBNYXA8bnVtYmVyLCBEYXNoYm9hcmRPYmplY3RJbXBsPixcbiAgICBkYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGVBcnJheTogQ29udHJhY3QuRGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlQXJyYXksXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRGFzaGJvYXJkXTogZGFzaGJvYXJkLFxuICAgICAgW1BhcmFtZXRlcklkLkRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUxpc3RdOiBkYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGVBcnJheSxcbiAgICB9O1xuXG4gICAgZGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlQXJyYXkuZm9yRWFjaCgoZGFzaGJvYXJkT2JqZWN0OiBDb250cmFjdC5EYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUpID0+IHtcbiAgICAgIEVycm9ySGVscGVycy52ZXJpZnlab25lSXNWYWxpZEFuZEZsb2F0aW5nKGRhc2hib2FyZFpvbmVNYXAsIGRhc2hib2FyZE9iamVjdC5kYXNoYm9hcmRPYmplY3RJRCk7XG4gICAgICBFcnJvckhlbHBlcnMudmVyaWZ5V2lkdGhBbmRIZWlnaHRPZkRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZShkYXNoYm9hcmRPYmplY3QpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuTW92ZUFuZFJlc2l6ZVpvbmVzLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVJbmZvIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiBhIHRhYmxlIHN1bW1hcnkuXG4gKiBUaGlzIGRvZXMgbm90IGZvbGxvdyB0aGUgSW1wbCBwYXR0ZXJuIGFzIGl0IGlzIGp1c3QgYSBwcm9wZXJ0eSBiYWcuXG4gKi9cbmV4cG9ydCBjbGFzcyBUYWJsZVN1bW1hcnkgaW1wbGVtZW50cyBDb250cmFjdC5UYWJsZVN1bW1hcnkge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfdGFibGVJbmZvOiBUYWJsZUluZm8pIHt9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3RhYmxlSW5mby5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90YWJsZUluZm8uaWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvbm5lY3Rpb25JZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90YWJsZUluZm8uY29ubmVjdGlvbklkO1xuICB9XG5cbiAgcHVibGljIGdldCBjdXN0b21TUUwoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fdGFibGVJbmZvLmN1c3RvbVNRTDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRW1iZWRkaW5nRXJyb3JDb2RlcywgRXJyb3JDb2RlcywgU2hhcmVkRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbi8qKlxuICogQ3VzdG9tIGVycm9yIGNsYXNzIHRoYXQgZXh0ZW5kcyB0aGUgZGVmYXVsdCBKYXZhU2NyaXB0IEVycm9yIG9iamVjdC5cbiAqIFRoaXMgYWxsb3dzIHVzIHRvIHByb3ZpZGUgYSBmaWVsZCB3aXRoIGEgc3BlY2lmaWMgZXJyb3IgY29kZVxuICogc28gdGhhdCBkZXZlbG9wZXJzIGNhbiBtb3JlIGVhc2lseSBwcm9ncmFtbWF0aWNhbGx5IHJlc3BvbmRcbiAqIHRvIGVycm9yIHNjZW5hcmlvcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFRhYmxlYXVFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2Vycm9yQ29kZTogRXJyb3JDb2RlcyB8IEVtYmVkZGluZ0Vycm9yQ29kZXMgfCBTaGFyZWRFcnJvckNvZGVzLCBtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihgJHtfZXJyb3JDb2RlfTogJHttZXNzYWdlfWApO1xuXG4gICAgLyp0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgKi9cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vTWljcm9zb2Z0L1R5cGVTY3JpcHQtd2lraS9ibG9iL21hc3Rlci9CcmVha2luZy1DaGFuZ2VzLm1kI2V4dGVuZGluZy1idWlsdC1pbnMtbGlrZS1lcnJvci1hcnJheS1hbmQtbWFwLW1heS1uby1sb25nZXItd29ya1xuICAgIC8vIEVycm9yIGluaGVyaXRhbmNlIGRvZXMgbm90IHdvcmsgcHJvcGVydGx5IHdoZW4gY29tcGlsaW5nIHRvIEVTNSwgdGhpcyBpcyBhIHdvcmthcm91bmQgdG8gZm9yY2VcbiAgICAvLyB0aGUgcHJvdG8gY2hhaW4gdG8gYmUgYnVpbHQgY29ycmVjdGx5LiAgU2VlIHRoZSBnaXRodWIgbGluayBhYm92ZSBmb3IgZGV0YWlscy5cbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgVGFibGVhdUVycm9yLnByb3RvdHlwZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGVycm9yQ29kZSgpOiBFcnJvckNvZGVzIHwgRW1iZWRkaW5nRXJyb3JDb2RlcyB8IFNoYXJlZEVycm9yQ29kZXMge1xuICAgIHJldHVybiB0aGlzLl9lcnJvckNvZGU7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIEludGVybmFsQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IERhdGFWYWx1ZSB9IGZyb20gJy4uL01vZGVscy9HZXREYXRhTW9kZWxzJztcblxuLyoqXG4gKiBJbiB2ZXJzaW9uIDIgb2YgdGhlIGludGVyZmFjZSwgd2Ugc2hvdWxkIGNvbGxhcHNlIHZhbHVlIGludG8gbmF0aXZlVmFsdWUsIGFuZCBkbyBhbGwgdGhpcyB3b3JrIG92ZXJcbiAqIGluIHRoZSBwbGF0Zm9ybS5cbiAqL1xuZXhwb3J0IGNsYXNzIERhdGFWYWx1ZUZhY3Rvcnkge1xuICBwdWJsaWMgc3RhdGljIE1ha2VQYXJhbWV0ZXJEYXRhVmFsdWUoaW50ZXJuYWxEYXRhVmFsdWU6IEludGVybmFsQ29udHJhY3QuRGF0YVZhbHVlLCBkYXRhVHlwZTogSW50ZXJuYWxDb250cmFjdC5EYXRhVHlwZSk6IERhdGFWYWx1ZSB7XG4gICAgLy8gUGFyYW1ldGVyIHZhbHVlcyBhcmUgYWxsIHN0cmluZ3MsIGNvbnZlcnQgZnJvbSBzdHJpbmcgdG8gdmFsdWVcbiAgICByZXR1cm4gbmV3IERhdGFWYWx1ZShcbiAgICAgIGludGVybmFsRGF0YVZhbHVlLnZhbHVlLFxuICAgICAgSW50ZXJuYWxDb250cmFjdC5EYXRhVHlwZUNvbnZlcnRlci5jb252ZXJ0U3RyaW5nVmFsdWVUb05hdGl2ZVZhbHVlKGludGVybmFsRGF0YVZhbHVlLnZhbHVlLCBkYXRhVHlwZSksXG4gICAgICBpbnRlcm5hbERhdGFWYWx1ZS5mb3JtYXR0ZWRWYWx1ZSxcbiAgICAgIGludGVybmFsRGF0YVZhbHVlLmFsaWFzZWRWYWx1ZSxcbiAgICAgIGludGVybmFsRGF0YVZhbHVlLmhhc0FsaWFzLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIE1ha2VGaWx0ZXJEYXRhVmFsdWUoaW50ZXJuYWxEYXRhVmFsdWU6IEludGVybmFsQ29udHJhY3QuRGF0YVZhbHVlKTogRGF0YVZhbHVlIHtcbiAgICAvLyBGaWx0ZXJzIGFscmVhZHkgaGF2ZSBuYXRpdmUgdHlwZSBpbiB2YWx1ZSwganVzdCB1c2UgdGhhdCBmb3IgbmF0aXZlVmFsdWUgYWxzb1xuICAgIHJldHVybiBuZXcgRGF0YVZhbHVlKGludGVybmFsRGF0YVZhbHVlLnZhbHVlLCBpbnRlcm5hbERhdGFWYWx1ZS52YWx1ZSwgaW50ZXJuYWxEYXRhVmFsdWUuZm9ybWF0dGVkVmFsdWUpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBNYWtlVGFibGVEYXRhVmFsdWUoaW50ZXJuYWxEYXRhVmFsdWU6IEludGVybmFsQ29udHJhY3QuRGF0YVZhbHVlLCBkYXRhVHlwZTogSW50ZXJuYWxDb250cmFjdC5EYXRhVHlwZSk6IERhdGFWYWx1ZSB7XG4gICAgLy8gRGF0YVRhYmxlcyBjb250YWluIGJvb2xlYW4gfCBudW1iZXIgfCBzdHJpbmcgfCBkYXRlIGFzIHN0cmluZyB8ICclbnVsbCVcbiAgICAvLyBjb252ZXJ0VmFsdWVUb05hdGl2ZVZhbHVlIGNvbnZlcnRzIGRhdGVzIGFzIHN0cmluZyB0byBkYXRlcywgYW5kIGFueSBzcGVjaWFsIHRvIG51bGxcbiAgICAvLyAoYm9vbGVhbiwgbnVtYmVycywgc3RyaW5ncyBhcmUgcGFzc2VkIHRocm91Z2gpXG4gICAgLy8gQmVjYXVzZSBvZiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbiAtIHdlIGNhbiBoYXZlIHVuZGVmaW5lZCB2YWx1ZXMsIHdoaWNoIGFyZSBkaWZmZXJlbnQgdGhhbiBhbnkgc3BlY2lhbFxuICAgIHJldHVybiBuZXcgRGF0YVZhbHVlKFxuICAgICAgaW50ZXJuYWxEYXRhVmFsdWUudmFsdWUsXG4gICAgICBpbnRlcm5hbERhdGFWYWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gSW50ZXJuYWxDb250cmFjdC5EYXRhVHlwZUNvbnZlcnRlci5jb252ZXJ0VmFsdWVUb05hdGl2ZVZhbHVlKGludGVybmFsRGF0YVZhbHVlLnZhbHVlLCBkYXRhVHlwZSlcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBpbnRlcm5hbERhdGFWYWx1ZS5mb3JtYXR0ZWRWYWx1ZSxcbiAgICApO1xuICB9XG59XG4iLCIvKipcbiAqIEEgUHJvbWlzZSB3cmFwcGVyIGNsYXNzIGFsbG93aW5nIGZvciByZXNvbHZpbmcvcmVqZWN0aW5nIHRoZSBQcm9taXNlIG91dHNpZGUgdGhlIGNvbnRleHQgb2YgaXRzIGNvbnN0cnVjdG9yLlxuICpcbiAqIEBleHBvcnRcbiAqIEBjbGFzcyBEZWZlcnJlZFxuICogQHRlbXBsYXRlIFRSZXNvbHZlIFRoZSB0eXBlIHVzZWQgdG8gcmVzb2x2ZSB0aGUgcHJvbWlzZS5cbiAqIEB0ZW1wbGF0ZSBUUmVqZWN0IFRoZSB0eXBlIHVzZWQgdG8gcmVqZWN0IHRoZSBwcm9taXNlLiBEZWZhdWx0cyB0byBhbnkuXG4gKiBAbGluayBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzQ2Mzc0MzZcbiAqL1xuZXhwb3J0IGNsYXNzIERlZmVycmVkPFRSZXNvbHZlLCBUUmVqZWN0ID0gYW55PiB7XG4gIHByaXZhdGUgX3Byb21pc2U6IFByb21pc2U8VFJlc29sdmU+O1xuICBwcml2YXRlIF9yZXNvbHZlOiAocmVzcG9uc2U6IFRSZXNvbHZlIHwgUHJvbWlzZUxpa2U8VFJlc29sdmU+KSA9PiB2b2lkO1xuICBwcml2YXRlIF9yZWplY3Q6IChyZWFzb24/OiBUUmVqZWN0KSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIERlZmVycmVkLlxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5fcHJvbWlzZSA9IG5ldyBQcm9taXNlPFRSZXNvbHZlPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLl9yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgIHRoaXMuX3JlamVjdCA9IHJlamVjdDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBQcm9taXNlLlxuICAgKlxuICAgKiBAcmVhZG9ubHlcbiAgICogQHR5cGUge1Byb21pc2U8VFJlc29sdmU+fVxuICAgKi9cbiAgZ2V0IHByb21pc2UoKTogUHJvbWlzZTxUUmVzb2x2ZT4ge1xuICAgIHJldHVybiB0aGlzLl9wcm9taXNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSB3cmFwcGVkIFByb21pc2UuXG4gICAqXG4gICAqIEBwYXJhbSB7KFRSZXNvbHZlIHwgUHJvbWlzZUxpa2U8VFJlc29sdmU+KX0gcmVzcG9uc2UgVGhlIGFyZ3VtZW50IHRvIGJlIHJlc29sdmVkIGJ5IHRoZSBQcm9taXNlLlxuICAgKiBAcmV0dXJucyB7Kn0gIHt2b2lkfVxuICAgKi9cbiAgcmVzb2x2ZShyZXNwb25zZTogVFJlc29sdmUgfCBQcm9taXNlTGlrZTxUUmVzb2x2ZT4pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3Jlc29sdmUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9yZXNvbHZlKHJlc3BvbnNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKlxuICAgKiBAcGFyYW0ge1RSZWplY3R9IFtyZWFzb25dIFRoZSByZWFzb24gd2h5IHRoZSBQcm9taXNlIHJlamVjdGVkLlxuICAgKiBAcmV0dXJucyB7Kn0gIHt2b2lkfVxuICAgKi9cbiAgcmVqZWN0KHJlYXNvbj86IFRSZWplY3QpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3JlamVjdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3JlamVjdChyZWFzb24pO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBVbnJlZ2lzdGVyVGltZW91dEluTWlsbGlzZWNvbmRzID0gMzAwMDA7XG4iLCJpbXBvcnQgeyBFcnJvckNvZGVzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uL1RhYmxlYXVFcnJvcic7XG5cbi8qKlxuICogVGhpcyBjbGFzcyBjb252ZXJ0cyBmcm9tIGEgc291cmNlIGVudW0gdmFsdWUgdG8gZGVzdGluYXRpb24gZW51bVxuICogdmFsdWUgZ2l2ZW4gYSBtYXBwaW5nIGZyb20gc291cmNlIHRvIGRlc3RpbmF0aW9uIHdoZW4gY29uc3RydWN0ZWQuXG4gKlxuICogTm90ZTogVGhpcyBleGFjdCBzYW1lIGNsYXNzIGlzIGRlZmluZWQgaW4gYXBpLWNvcmUuICBHaXZlbiBpdHMgc21hbGxcbiAqIG5hdHVyZSwgaXQgaXMgbm90IHdvcnRoIGhhdmluZyBpbiBhIHNlcGFyYXRlIHByb2plY3QgdG8gc2hhcmUgdGhpcyBiZXR3ZWVuXG4gKiBhcGktY29yZSBhbmQgYXBpLXNoYXJlZC4gIElmIG1vcmUgdXRpbGl0eSBmdW5jdGlvbmFsaXR5IGlzIGFkZGVkIHRoYXQgaXMgdXNlZCBieSBhcGktY29yZVxuICogYW5kIGFwaS1zaGFyZWQgYnV0IGhhcyBubyBvdGhlciBkZXBlbmRlY2llcywgYSB1dGlsdGl0eSBwcm9qZWN0IG1pZ2h0IGJlIG1lcml0ZWQsXG4gKiBhbmQgdGhpcyBjbGFzcyBjb3VsZCBiZSBtb3ZlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIEVudW1Db252ZXJ0ZXI8VFNvdXJjZVR5cGUgZXh0ZW5kcyBzdHJpbmcsIFREZXN0aW5hdGlvblR5cGU+IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX21hcHBpbmdzOiB7IFtlbnVtVmFsOiBzdHJpbmddOiBURGVzdGluYXRpb25UeXBlIH0sIHByaXZhdGUgX2RlZmF1bHRWYWw/OiBURGVzdGluYXRpb25UeXBlKSB7fVxuXG4gIHB1YmxpYyBjb252ZXJ0KGVudW1WYWw6IFRTb3VyY2VUeXBlLCB0aHJvd0lmTWlzc2luZzogU2hvdWxkVGhyb3cgPSBTaG91bGRUaHJvdy5ZZXMpOiBURGVzdGluYXRpb25UeXBlIHtcbiAgICBpZiAodGhpcy5fbWFwcGluZ3MuaGFzT3duUHJvcGVydHkoZW51bVZhbCkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9tYXBwaW5nc1tlbnVtVmFsIGFzIHN0cmluZ107XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2RlZmF1bHRWYWwgIT09IHVuZGVmaW5lZCAmJiB0aHJvd0lmTWlzc2luZyAhPT0gU2hvdWxkVGhyb3cuWWVzKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZGVmYXVsdFZhbDtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYEVudW0gTWFwcGluZyBub3QgZm91bmQgZm9yOiAke2VudW1WYWx9YCk7XG4gIH1cbn1cblxuZXhwb3J0IGVudW0gU2hvdWxkVGhyb3cge1xuICBZZXMgPSAneWVzJyxcbiAgTm8gPSAnbm8nLFxufVxuIiwiaW1wb3J0IHtcbiAgRGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlLFxuICBFeHBvcnREYXRhT3B0aW9ucyxcbiAgRXhwb3J0U2NlbmFyaW9zRm9yUERGQW5kUG93ZXJQb2ludCxcbiAgRXhwb3J0UERGT3B0aW9ucyBhcyBFeHRlcm5hbEV4cG9ydFBERk9wdGlvbnMsXG4gIFByaW50T3JpZW50YXRpb24sXG4gIFByaW50UGFnZVNpemUsXG4gIFByaW50U2NhbGluZyxcbiAgUmFuZ2VGaWx0ZXJPcHRpb25zLFxuICBTaGFyZWRFcnJvckNvZGVzLFxufSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkT2JqZWN0SW1wbCB9IGZyb20gJy4uL0ltcGwvRGFzaGJvYXJkT2JqZWN0SW1wbCc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgUGFyYW0gfSBmcm9tICcuL1BhcmFtJztcblxuaW50ZXJmYWNlIEVudW1MaWtlIHtcbiAgdG9TdHJpbmcoKTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBjb25zdHJ1Y3QgY29tbW9uIGVycm9ycyB0aHJvdWdob3V0IHRoZSBleHRlcm5hbFxuICogcHJvamVjdHMgKGFwaS1zaGFyZWQsIGV4dGVuc2lvbnMtYXBpLCBldGMuKS4gIEl0IGhhcyBzb21lIGR1cGxpY2F0aW9uIHdpdGhcbiAqIHRoZSBFcnJvckhlbHBlcnMgY2xhc3MgaW4gYXBpLWNvcmUsIGJ1dCBpcyBzZXBhcmF0ZSBkdWUgdG8gdGhlIG5lZWQgdG8gdGhyb3dcbiAqIGFuIGV4dGVybmFsIFRhYmxlYXVFcnJvciB2cy4gYW4gSW50ZXJuYWxUYWJsZWF1RXJyb3IuXG4gKi9cbmV4cG9ydCBjbGFzcyBFcnJvckhlbHBlcnMge1xuICAvKipcbiAgICogVGhyb3dzIHdpdGggY29kZSBJbnRlcm5hbEVycm9yLlxuICAgKlxuICAgKiBAcGFyYW0gYXBpTmFtZSBuYW1lIG9mIGFwaSB0aGF0IHdhcyBjYWxsZWQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFwaU5vdEltcGxlbWVudGVkKGFwaU5hbWU6IHN0cmluZyk6IFRhYmxlYXVFcnJvciB7XG4gICAgcmV0dXJuIG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgJHthcGlOYW1lfSBBUEkgbm90IHlldCBpbXBsZW1lbnRlZC5gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd3MgYW4gaW50ZXJuYWwgZXJyb3IgaWYgYXJndW1lbnQgaXMgbnVsbCBvciB1bmRlZmluZWQuXG4gICAqXG4gICAqIEBwYXJhbSBhcmd1bWVudFZhbHVlIHZhbHVlIHRvIHZlcmlmeVxuICAgKiBAcGFyYW0gYXJndW1lbnROYW1lIG5hbWUgb2YgYXJndW1lbnQgdG8gdmVyaWZ5XG4gICAqL1xuICAvKnRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeUludGVybmFsVmFsdWUoYXJndW1lbnRWYWx1ZTogYW55LCBhcmd1bWVudE5hbWU6IHN0cmluZykge1xuICAgIGlmIChhcmd1bWVudFZhbHVlID09PSBudWxsIHx8IGFyZ3VtZW50VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludGVybmFsRXJyb3IsIGAke2FyZ3VtZW50VmFsdWV9IGlzIGludmFsaWQgdmFsdWUgZm9yOiAke2FyZ3VtZW50TmFtZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhyb3dzIGFuIEludmFsaWRQYXJhbWV0ZXIgZXJyb3IgaWYgYXJndW1lbnQgaXMgbnVsbCBvciB1bmRlZmluZWQuXG4gICAqXG4gICAqIEBwYXJhbSBhcmd1bWVudFZhbHVlIHZhbHVlIHRvIHZlcmlmeVxuICAgKiBAcGFyYW0gYXJndW1lbnROYW1lIG5hbWUgb2YgYXJndW1lbnQgdG8gdmVyaWZ5XG4gICAqL1xuICAvKnRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeVBhcmFtZXRlcihhcmd1bWVudFZhbHVlOiBhbnksIGFyZ3VtZW50TmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKGFyZ3VtZW50VmFsdWUgPT09IG51bGwgfHwgYXJndW1lbnRWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgYCR7YXJndW1lbnRWYWx1ZX0gaXMgaW52YWxpZCB2YWx1ZSBmb3IgcGFyYW1ldGVyOiAke2FyZ3VtZW50TmFtZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhyb3dzIGFuIEludmFsaWRQYXJhbWV0ZXIgZXJyb3IgaWYgYXJndW1lbnQgaXMgbm90IHRoZSBzcGVjaWZpZWQgdHlwZS5cbiAgICogRm9yIG9iamVjdHMsIGl0IGp1c3QgdGVzdHMgdGhhdCBpdCBpcyBhbiBvYmplY3RcbiAgICpcbiAgICogQHBhcmFtIGFyZ3VtZW50VmFsdWUgdmFsdWUgdG8gdmVyaWZ5XG4gICAqIEBwYXJhbSBleHBlY3RlZFR5cGUgZXhwZWN0ZWQgcmVzdWx0IG9mIHR5cGVvZlxuICAgKiBAcGFyYW0gYXJndW1lbnROYW1lIG5hbWUgb2YgYXJndW1lbnQgdG8gdmVyaWZ5XG4gICAqL1xuICAvKnRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeVBhcmFtZXRlclR5cGUoYXJndW1lbnRWYWx1ZTogYW55LCBleHBlY3RlZFR5cGU6IHN0cmluZywgYXJndW1lbnROYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50VmFsdWUgIT09IGV4cGVjdGVkVHlwZSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsIGAke2FyZ3VtZW50VmFsdWV9IGhhcyBpbnZhbGlkIHR5cGUgZm9yIHBhcmFtZXRlcjogJHthcmd1bWVudE5hbWV9LmApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd3MgYW4gSW52YWxpZFBhcmFtZXRlciBlcnJvciBpZiBhcmd1bWVudCBpcyBlbXB0eSBzdHJpbmcsIG51bGwgb3IgdW5kZWZpbmVkLlxuICAgKlxuICAgKiBAcGFyYW0gYXJndW1lbnRWYWx1ZSB2YWx1ZSB0byB2ZXJpZnlcbiAgICogQHBhcmFtIGFyZ3VtZW50TmFtZSBuYW1lIG9mIGFyZ3VtZW50IHRvIHZlcmlmeVxuICAgKi9cbiAgLyp0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlTdHJpbmdQYXJhbWV0ZXIoYXJndW1lbnRWYWx1ZTogc3RyaW5nLCBhcmd1bWVudE5hbWU6IHN0cmluZykge1xuICAgIGlmIChhcmd1bWVudFZhbHVlID09PSBudWxsIHx8IGFyZ3VtZW50VmFsdWUgPT09IHVuZGVmaW5lZCB8fCBhcmd1bWVudFZhbHVlID09PSAnJykge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsIGAke2FyZ3VtZW50VmFsdWV9IGlzIGludmFsaWQgdmFsdWUgZm9yIHBhcmFtdGVyOiAke2FyZ3VtZW50TmFtZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgcGFzc2VkIHZhbHVlIGlzIGEgdmFsaWQgdmFsdWUgZm9yIHRoYXQgZW51bS5cbiAgICpcbiAgICogU3RyaW5nIGVudW1zIGFyZSB7c3RyaW5nIDogc3RyaW5nfSBkaWN0aW9uYXJpZXMgd2hpY2ggYXJlIG5vdCByZXZlcnNlIG1hcHBhYmxlXG4gICAqIFRoaXMgaXMgYW4gdWdseSB3b3JrYXJvdW5kXG4gICAqXG4gICAqIEBwYXJhbSBlbnVtVmFsdWUgdmFsdWUgdG8gdmVyaWZ5XG4gICAqIEBwYXJhbSBlbnVtVHlwZSBlbnVtIHRvIHZlcmlmeSBhZ2FpbnN0XG4gICAqL1xuICAvKnRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICBwdWJsaWMgc3RhdGljIGlzVmFsaWRFbnVtVmFsdWU8RW51bVR5cGUgZXh0ZW5kcyBFbnVtTGlrZT4oZW51bVZhbHVlOiBFbnVtVHlwZSwgZW51bVR5cGU6IGFueSk6IGJvb2xlYW4ge1xuICAgIGxldCBpc1ZhbGlkID0gZmFsc2U7XG4gICAgT2JqZWN0LmtleXMoZW51bVR5cGUpLmZvckVhY2goKGVudW1LZXkpID0+IHtcbiAgICAgIGlmIChlbnVtVHlwZVtlbnVtS2V5XSA9PT0gZW51bVZhbHVlLnRvU3RyaW5nKCkpIHtcbiAgICAgICAgaXNWYWxpZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gaXNWYWxpZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyBwYXNzZWQgdmFsdWUgaXMgYSB2YWxpZCB2YWx1ZSBmb3IgdGhhdCBlbnVtLlxuICAgKiBUaHJvd3MgYW4gSW52YWxpZFBhcmFtZXRlciBlcnJvciBpZiB0aGUgZW51bSB2YWx1ZSBpcyBub3QgdmFsaWQuXG4gICAqXG4gICAqIFN0cmluZyBlbnVtcyBhcmUge3N0cmluZyA6IHN0cmluZ30gZGljdGlvbmFyaWVzIHdoaWNoIGFyZSBub3QgcmV2ZXJzZSBtYXBwYWJsZVxuICAgKiBUaGlzIGlzIGFuIHVnbHkgd29ya2Fyb3VuZFxuICAgKlxuICAgKiBAcGFyYW0gZW51bVZhbHVlIHZhbHVlIHRvIHZlcmlmeVxuICAgKiBAcGFyYW0gZW51bVR5cGUgZW51bSB0byB2ZXJpZnkgYWdhaW5zdFxuICAgKiBAcGFyYW0gZW51bU5hbWUgZW51bSBuYW1lIGZvciBjbGVhciBlcnJvciBtZXNzYWdlXG4gICAqL1xuICAvKnRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeUVudW1WYWx1ZTxFbnVtVHlwZSBleHRlbmRzIEVudW1MaWtlPihlbnVtVmFsdWU6IEVudW1UeXBlLCBlbnVtVHlwZTogYW55LCBlbnVtTmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKCFFcnJvckhlbHBlcnMuaXNWYWxpZEVudW1WYWx1ZShlbnVtVmFsdWUsIGVudW1UeXBlKSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsIGAke2VudW1WYWx1ZX0gaXMgaW52YWxpZCB2YWx1ZSBmb3IgZW51bTogJHtlbnVtTmFtZX0uYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHBhc3NlZCB2YWx1ZSBpcyBiZXR3ZWVuIFttaW4sIG1heCkgLi4uIG1pbiA8PSB2YWx1ZSA8IG1heFxuICAgKiBUaHJvd3MgYW4gSW52YWxpZFBhcmFtZXRlciBlcnJvciBpZiB0aGUgdmFsdWUgaXMgbm90IHZhbGlkLlxuICAgKlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgdmFsdWUgdG8gdmVyaWZ5XG4gICAqIEBwYXJhbSBtaW4gICB2YWx1ZSBtdXN0IGJlID49IG1pblxuICAgKiBAcGFyYW0gbWF4ICAgdmFsdWUgbXVzdCBiZSA8IG1heFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlSYW5nZSh2YWx1ZTogbnVtYmVyLCBtaW46IG51bWJlciwgbWF4OiBudW1iZXIpIHtcbiAgICBsZXQgaXNWYWxpZCA9IG1pbiA8PSB2YWx1ZSAmJiB2YWx1ZSA8IG1heDtcblxuICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsIGAke3ZhbHVlfSBpcyBpbnZhbGlkIHZhbHVlIGZvciByYW5nZTogWyR7bWlufS4uJHttYXh9KWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGUgcGFyYW1zIG1pbiBhbmQgbWF4IGZvciBhcHBseWluZyByYW5nZSBmaWx0ZXIuXG4gICAqIFRocm93cyB3aXRoIGVycm9yIGNvZGUgSW52YWxpZFBhcmFtZXRlciBpZiByYW5nZSBpcyBpbnZhbGlkLlxuICAgKlxuICAgKiBAcGFyYW0gbWluIHJhbmdlIG1pblxuICAgKiBAcGFyYW0gbWF4IHJhbmdlIG1heFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlSYW5nZVBhcmFtVHlwZShtaW46IFJhbmdlRmlsdGVyT3B0aW9uc1snbWluJ10sIG1heDogUmFuZ2VGaWx0ZXJPcHRpb25zWydtYXgnXSk6IHZvaWQge1xuICAgIGNvbnN0IGlzTWluRGVmaW5lZCA9IG1pbiAhPT0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGlzTWF4RGVmaW5lZCA9IG1heCAhPT0gdW5kZWZpbmVkO1xuXG4gICAgaWYgKCFpc01pbkRlZmluZWQgJiYgIWlzTWF4RGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsICdVbmV4cGVjdGVkIGludmFsaWQgcGFyYW0gdmFsdWUsIGF0IGxlYXN0IG9uZSBvZiBtaW4gb3IgbWF4IGlzIHJlcXVpcmVkLicpO1xuICAgIH1cblxuICAgIGlmIChpc01pbkRlZmluZWQgJiYgIVBhcmFtLmlzVHlwZU51bWJlcihtaW4pICYmICFQYXJhbS5pc1R5cGVEYXRlKG1pbikpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoXG4gICAgICAgIFNoYXJlZEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlcixcbiAgICAgICAgJ1VuZXhwZWN0ZWQgaW52YWxpZCBwYXJhbSB2YWx1ZSwgb25seSBEYXRlIGFuZCBudW1iZXIgYXJlIGFsbG93ZWQgZm9yIHBhcmFtZXRlciBtaW4uJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGlzTWF4RGVmaW5lZCAmJiAhUGFyYW0uaXNUeXBlTnVtYmVyKG1heCkgJiYgIVBhcmFtLmlzVHlwZURhdGUobWF4KSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihcbiAgICAgICAgU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLFxuICAgICAgICAnVW5leHBlY3RlZCBpbnZhbGlkIHBhcmFtIHZhbHVlLCBvbmx5IERhdGUgYW5kIG51bWJlciBhcmUgYWxsb3dlZCBmb3IgcGFyYW1ldGVyIG1heC4nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoaXNNaW5EZWZpbmVkICYmIGlzTWF4RGVmaW5lZCAmJiB0eXBlb2YgbWluICE9PSB0eXBlb2YgbWF4KSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgICBTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsXG4gICAgICAgICdVbmV4cGVjdGVkIGludmFsaWQgcGFyYW0gdmFsdWUsIHBhcmFtZXRlcnMgbWluIGFuZCBtYXggc2hvdWxkIGJlIG9mIHRoZSBzYW1lIHR5cGUuJyxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoYXQgdGhlIHpvbmVJZCBpcyBwcmVzZW50IGluIHRoZSBjdXJyZW50IGRhc2hib2FyZC5cbiAgICogVGhyb3dzIHdpdGggZXJyb3IgY29kZSBJbnZhbGlkUGFyYW1ldGVyIGlmIGVpdGhlciBjb25kaXRpb24gaXMgZmFsc2UuXG4gICAqXG4gICAqIEBwYXJhbSBkYXNoYm9hcmRab25lTWFwIEEgbWFwIG9mIHpvbmVJZCdzIHRvIHRoZSBjb3JyZXNwb25kaW5nIGRhc2hib2FyZCBvYmplY3QuXG4gICAqIEBwYXJhbSB6b25lSUQgWm9uZUlkIHRvIGJlIHZhbGlkYXRlZFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlab25lSXNWYWxpZChkYXNoYm9hcmRab25lTWFwOiBNYXA8bnVtYmVyLCBEYXNoYm9hcmRPYmplY3RJbXBsPiwgem9uZUlEOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoZGFzaGJvYXJkWm9uZU1hcC5oYXMoem9uZUlEKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoXG4gICAgICBTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsXG4gICAgICBgVW5leHBlY3RlZCBpbnZhbGlkIHBhcmFtIHZhbHVlLCBEYXNoYm9hcmQgT2JqZWN0IElkOiAke3pvbmVJRH0gaXMgbm90IHByZXNlbnQgaW4gZGFzaGJvYXJkLmAsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGF0IHRoZSB6b25lIGlzIHByZXNlbnQgYW5kIGZsb2F0aW5nIGluIHRoZSBjdXJyZW50IGRhc2hib2FyZC5cbiAgICogVGhyb3dzIHdpdGggZXJyb3IgY29kZSBJbnZhbGlkUGFyYW1ldGVyIGlmIGVpdGhlciBjb25kaXRpb24gaXMgZmFsc2UuXG4gICAqXG4gICAqIEBwYXJhbSBkYXNoYm9hcmRab25lTWFwIEEgbWFwIG9mIHpvbmVJZCdzIHRvIHRoZSBjb3JyZXNwb25kaW5nIGRhc2hib2FyZCBvYmplY3QuXG4gICAqIEBwYXJhbSB6b25lSUQgWm9uZUlkIHRvIGJlIHZhbGlkYXRlZFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlab25lSXNWYWxpZEFuZEZsb2F0aW5nKGRhc2hib2FyZFpvbmVNYXA6IE1hcDxudW1iZXIsIERhc2hib2FyZE9iamVjdEltcGw+LCB6b25lSUQ6IG51bWJlcik6IHZvaWQge1xuICAgIGlmIChkYXNoYm9hcmRab25lTWFwLmhhcyh6b25lSUQpICYmIGRhc2hib2FyZFpvbmVNYXAuZ2V0KHpvbmVJRCkhLmlzRmxvYXRpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLFxuICAgICAgYFVuZXhwZWN0ZWQgaW52YWxpZCBwYXJhbSB2YWx1ZSwgRGFzaGJvYXJkIE9iamVjdCBJZDogJHt6b25lSUR9IGlzIG5vdCBwcmVzZW50IG9yIGlzIGEgZml4ZWQgem9uZSBpbiB0aGUgZGFzaGJvYXJkLmAsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGF0IHdpZHRoIGFuZCBoZWlnaHQgYXJlID4gMCBmb3IgZWFjaCBEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUgb2JqZWN0LlxuICAgKiBUaHJvd3Mgd2l0aCBlcnJvciBjb2RlIEludmFsaWRQYXJhbWV0ZXIgaWYgZWl0aGVyIGNvbmRpdGlvbiBpcyBmYWxzZS5cbiAgICpcbiAgICogQHBhcmFtIGRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZSBEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUgb2JqZWN0IGZvciB3aGljaCB3aWR0aCBhbmQgaGVpZ2h0IHdpbGwgYmUgdmFsaWRhdGVkXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeVdpZHRoQW5kSGVpZ2h0T2ZEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUoXG4gICAgZGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlOiBEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUsXG4gICk6IHZvaWQge1xuICAgIGlmIChkYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUud2lkdGggPCAwIHx8IGRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZS5oZWlnaHQgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgICBTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsXG4gICAgICAgIGBVbmV4cGVjdGVkIGludmFsaWQgcGFyYW0gdmFsdWUgZm9yIGRhc2hib2FyZCBvYmplY3QgSUQgJHtkYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUuZGFzaGJvYXJkT2JqZWN0SUR9OmAgK1xuICAgICAgICAgIGAgbmVnYXRpdmUgd2lkdGhzIGFuZCBoZWlnaHRzIGFyZSBub3QgYWxsb3dlZC5gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgaXMgdGhlIGdpdmVuIHNoZWV0IG5hbWUgaXMgaW4gdGhlIGxpc3Qgb2Ygc2hlZXRzIG5hbWVzIGFsbG93ZWQgZm9yIGV4cG9ydGluZy5cbiAgICogVGhyb3dzIHdpdGggZXJyb3IgY29kZSBJbnZhbGlkUGFyYW1ldGVyIGlmIHRoZSBjb25kaXRpb24gYWJvdmUgaXMgZmFsc2UuXG4gICAqXG4gICAqIEBwYXJhbSBleHBvcnRhYmxlU2hlZXROYW1lcyBBIGxpc3Qgb2Ygc2hlZXQgbmFtZXMgYWxsb3dlZCBmb3IgZXhwb3J0aW5nXG4gICAqIEBwYXJhbSBzaGVldE5hbWUgdGhlIG5hbWUgb2YgdGhlIHNoZWV0IHNlbGVjdGVkIGZvciBleHBvcnRcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdmVyaWZ5U2hlZXROYW1lKGV4cG9ydGFibGVTaGVldE5hbWVzOiBBcnJheTxzdHJpbmc+LCBzaGVldE5hbWU6IHN0cmluZykge1xuICAgIGlmICghZXhwb3J0YWJsZVNoZWV0TmFtZXMuaW5jbHVkZXMoc2hlZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihcbiAgICAgICAgU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkU2VsZWN0aW9uU2hlZXQsXG4gICAgICAgICdzaGVldE5hbWUgcGFyYW1ldGVyIG11c3QgYmVsb25nIHRvIGEgd29ya3NoZWV0IHdpdGhpbiB0aGUgY3VycmVudCB2aWV3JyxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoZSBFeHBvcnREYXRhT3B0aW9ucyBvYmplY3RcbiAgICogVGhyb3dzIHdpdGggZXJyb3IgY29kZSBJbnZhbGlkUGFyYW1ldGVyIGlmIHRoZSBwYXJhbWV0ZXIgaXMgbm90IG9mIEV4cG9ydERhdGFPcHRpb25zIHR5cGUuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSBFeHBvcnREYXRhT3B0aW9ucyBvYmplY3QgdXNlZCB0byBjb25maWd1cmUgdGhlIG91dHB1dCBDU1YgZmlsZSBmb3IgZXhwb3J0RGF0YUFzeW5jLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlFeHBvcnREYXRhT3B0aW9ucyhvcHRpb25zOiBFeHBvcnREYXRhT3B0aW9ucyk6IHZvaWQge1xuICAgIGlmIChcbiAgICAgICghUGFyYW0uaXNOdWxsT3JVbmRlZmluZWQob3B0aW9ucy5pZ25vcmVBbGlhc2VzKSAmJiAhUGFyYW0uaXNUeXBlQm9vbChvcHRpb25zLmlnbm9yZUFsaWFzZXMpKSB8fFxuICAgICAgKCFQYXJhbS5pc051bGxPclVuZGVmaW5lZChvcHRpb25zLmNvbHVtbnNUb0luY2x1ZGVCeUlkKSAmJiAhQXJyYXkuaXNBcnJheShvcHRpb25zLmNvbHVtbnNUb0luY2x1ZGVCeUlkKSlcbiAgICApXG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgJ29wdGlvbnMgcGFyYW1hdGVyIG11c3QgYmUgb2YgdHlwZSBFeHBvcnREYXRhT3B0aW9ucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIGlmIHRoZSBzaGVldCBuYW1lcyBhcmUgaW5jbHVkZWQgaW4gYW55IG9mIHRoZSBleHBvcnQgc2NlbmFyaW9zLlxuICAgKiBUaHJvd3Mgd2l0aCBlcnJvciBjb2RlIEludmFsaWRQYXJhbWV0ZXIgaWYgdGhlIHBhcmFtZXRlciBpcyBub3QgYW4gYXJyYXkuXG4gICAqIFRocm93cyB3aXRoIGVycm9yIGNvZGUgSW52YWxpZFNlbGVjdGlvblNoZWV0IGlmIHRoZXJlIGFyZSBhcnJheSBlbnRyaWVzIHRoYXQgZG9udCBleGlzdCBvciBpZiB0aGVyZSBpcyBtaXhpbmcgYmV0d2VlbiBzaGVldHMgZnJvbSB0aGUgZGFzaGJvYXJkIGFuZCBzaGVldCBmcm9tIHRoZSB3b3JrYm9vay5cbiAgICpcbiAgICogQHBhcmFtIHNoZWV0TmFtZXMgTGlzdCBvZiBzaGVldCBuYW1lcyBzZWxlY3RlZCBmb3IgZXhwb3J0aW5nLlxuICAgKiBAcGFyYW0gZXhwb3J0U2NlbmFyaW9zIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBjdXJyZW50IHNoZWV0IG5hbWUsIGV4cG9ydGFibGUgc2hlZXRzIGZyb20gdGhlIGRhc2hib2FyZCwgYW5kIGV4cG9ydGFibGUgc2hlZXRzIGZyb20gdGhlIHdvcmtib29rLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlTaGVldE5hbWVzRm9yUERGQW5kUFBUKHNoZWV0TmFtZXM6IEFycmF5PHN0cmluZz4sIGV4cG9ydFNjZW5hcmlvczogRXhwb3J0U2NlbmFyaW9zRm9yUERGQW5kUG93ZXJQb2ludCk6IHZvaWQge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShzaGVldE5hbWVzKSkgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsICdzaGVldE5hbWVzIHBhcmFtZXRlciBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gICAgaWYgKHNoZWV0TmFtZXMubGVuZ3RoID09PSAwKSB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ3NoZWV0TmFtZXMgc2hvdWxkIG5vdCBiZSBlbXB0eScpO1xuXG4gICAgY29uc3QgaXNJbmNsdWRlZEluRGFzaGJvYXJkID0gc2hlZXROYW1lcy5ldmVyeSgoc2hlZXROYW1lOiBzdHJpbmcpID0+XG4gICAgICBleHBvcnRTY2VuYXJpb3MuZXhwb3J0YWJsZVNoZWV0TmFtZXNGcm9tRGFzaGJvYXJkLmluY2x1ZGVzKHNoZWV0TmFtZSksXG4gICAgKTtcbiAgICBpZiAoaXNJbmNsdWRlZEluRGFzaGJvYXJkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGlzSW5jbHVkZWRJbldvcmtib29rID0gc2hlZXROYW1lcy5ldmVyeSgoc2hlZXROYW1lOiBzdHJpbmcpID0+XG4gICAgICBleHBvcnRTY2VuYXJpb3MuZXhwb3J0YWJsZVNoZWV0TmFtZXNGcm9tV29ya2Jvb2suaW5jbHVkZXMoc2hlZXROYW1lKSxcbiAgICApO1xuICAgIGlmIChpc0luY2x1ZGVkSW5Xb3JrYm9vaykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpc0N1cnJlbnRTaGVldCA9IHNoZWV0TmFtZXMubGVuZ3RoID09PSAxICYmIHNoZWV0TmFtZXNbMF0gPT09IGV4cG9ydFNjZW5hcmlvcy5jdXJyZW50U2hlZXROYW1lO1xuICAgIGlmIChpc0N1cnJlbnRTaGVldCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEV4cG9ydCByZXF1aXJlbWVudDogYWxsIHNoZWV0IG5hbWVzIG11c3QgYmUgaW5jbHVkZWQgaW4gdGhlIGxpc3Qgb2YgZXhwb3J0YWJsZSBzaGVldHMgaW4gdGhlIGRhc2hib2FyZCBvclxuICAgIC8vIGFsbCBzaGVldCBuYW1lcyBtdXN0IGJlIGluY2x1ZGVkIGluIHRoZSBsaXN0IG9mIGV4cG9ydGFibGUgc2hlZXRzIGluIHRoZSB3b3JrYm9vaywgb3IgdGhlIHNoZWV0IG5hbWUgaXMgdGhlIGN1cnJlbnQgc2hlZXRcbiAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkU2VsZWN0aW9uU2hlZXQsXG4gICAgICAnc2hlZXROYW1lcyBwYXJhbWV0ZXIgbXVzdCBoYXZlIGFsbCBpdHMgZW50cmllcyBiZSBleHBvcnRhYmxlIHNoZWV0IG5hbWVzIGZyb20gdGhlIGRhc2hib2FyZCBvciBhbGwgaXRzIGVudHJpZXMgYmUgZXhwb3J0YWJsZSBzaGVldCBuYW1lcyBmcm9tIHRoZSB3b3JrYm9vaycsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGUgZXh0ZXJuYWwgRXhwb3J0UERGT3B0aW9ucyBvYmplY3QncyBwcm9wZXJ0aWVzLlxuICAgKiBUaHJvd3Mgd2l0aCBlcnJvciBjb2RlIEludmFsaWRQYXJhbWV0ZXIgaWYgdGhlIHBhcmFtZXRlciBpcyBub3Qgb2YgZXh0ZXJuYWwgRXhwb3J0UERGT3B0aW9ucyB0eXBlLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgZXh0ZXJuYWwgdXNlci1mYWNpbmcgRXhwb3J0UERGT3B0aW9ucyBvYmplY3QgdXNlZCB0byBjb25maWd1cmUgdGhlIG91dHB1dCBQREYgZmlsZSBmb3IgZXhwb3J0UERGQXN5bmMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeUV4cG9ydFBERk9wdGlvbnMob3B0aW9uczogRXh0ZXJuYWxFeHBvcnRQREZPcHRpb25zKSB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMudmVyaWZ5RW51bVZhbHVlPFByaW50T3JpZW50YXRpb24+KG9wdGlvbnMub3JpZW50YXRpb24sIFByaW50T3JpZW50YXRpb24sICdQcmludE9yaWVudGF0aW9uJyk7XG4gICAgICB0aGlzLnZlcmlmeUVudW1WYWx1ZTxQcmludFBhZ2VTaXplPihvcHRpb25zLnBhZ2VTaXplLCBQcmludFBhZ2VTaXplLCAnUHJpbnRQYWdlU2l6ZScpO1xuICAgICAgdGhpcy52ZXJpZnlFbnVtVmFsdWU8UHJpbnRTY2FsaW5nPihvcHRpb25zLnNjYWxpbmcsIFByaW50U2NhbGluZywgJ1ByaW50U2NhbGluZycpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsICdvcHRpb25zIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgRXhwb3J0UERGT3B0aW9ucycpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgRXhwb3J0TGF5b3V0T3B0aW9ucyxcbiAgRXhwb3J0UERGT3B0aW9ucyBhcyBJbnRlcm5hbEV4cG9ydFBERk9wdGlvbnMsXG4gIEZpdFBhZ2VzLFxuICBQYWdlT3JpZW50YXRpb24sXG4gIFBhZ2VTY2FsaW5nT3B0aW9uLFxuICBQYWdlU2l6ZU9wdGlvbixcbiAgU2NhbGVNb2RlLFxuICBTY2FsaW5nU2VsZWN0aW9uLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgRXhwb3J0RGF0YU9wdGlvbnMsXG4gIEV4cG9ydFBERk9wdGlvbnMgYXMgRXh0ZXJuYWxFeHBvcnRQREZPcHRpb25zLFxuICBQcmludE9yaWVudGF0aW9uLFxuICBQcmludFBhZ2VTaXplLFxuICBQcmludFNjYWxpbmcsXG4gIFNoYXJlZEVycm9yQ29kZXMsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuXG4vKipcbiAqIEhlbHBlciBtZXRob2RzIGZvciBFeHBvcnQgQVBJcy5cbiAqXG4gKiBAY2xhc3MgRXhwb3J0SGVscGVyc1xuICovXG5leHBvcnQgY2xhc3MgRXhwb3J0SGVscGVycyB7XG4gIHB1YmxpYyBzdGF0aWMgRGVmYXVsdERhdGFPcHRpb25zOiBFeHBvcnREYXRhT3B0aW9ucyA9IHtcbiAgICBpZ25vcmVBbGlhc2VzOiBmYWxzZSxcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogW10sXG4gIH07XG5cbiAgcHVibGljIHN0YXRpYyBEZWZhdWx0UERGT3B0aW9uczogRXh0ZXJuYWxFeHBvcnRQREZPcHRpb25zID0ge1xuICAgIHNjYWxpbmc6IFByaW50U2NhbGluZy5BdXRvbWF0aWMsXG4gICAgcGFnZVNpemU6IFByaW50UGFnZVNpemUuTGV0dGVyLFxuICAgIG9yaWVudGF0aW9uOiBQcmludE9yaWVudGF0aW9uLlBvcnRyYWl0LFxuICB9O1xuXG4gIHByaXZhdGUgc3RhdGljIERlZmF1bHRMYXlvdXRPcHRpb25zOiBFeHBvcnRMYXlvdXRPcHRpb25zID0ge1xuICAgIGltYWdlSGVpZ2h0OiAwLFxuICAgIGltYWdlV2lkdGg6IDAsXG4gICAgcGFnZUZpdEhvcml6b250YWw6IDEsXG4gICAgcGFnZUZpdFZlcnRpY2FsOiAxLFxuICAgIHBhZ2VPcmllbnRhdGlvbk9wdGlvbjogUGFnZU9yaWVudGF0aW9uLlBvcnRyYWl0LFxuICAgIHBhZ2VTY2FsZU1vZGU6IFNjYWxlTW9kZS5TY2FsZUF1dG8sXG4gICAgcGFnZVNjYWxlUGVyY2VudDogMTAwLFxuICAgIHBhZ2VTaXplT3B0aW9uOiBQYWdlU2l6ZU9wdGlvbi5MZXR0ZXIsXG4gIH07XG5cbiAgLyoqXG4gICAqIE1vZGlmaWVzIHRoZSBpbnRlcm5hbCBFeHBvcnRQREZPcHRpb25zJyBwcm9wZXJ0aWVzIGJhc2VkIG9uIHRoZSBnaXZlbiBQREYgZXhwb3J0IGNvbmZpZ3VyYXRpb24uXG4gICAqIFRoaXMgbWV0aG9kIHdpbGwgY29uc3RydWN0IHRoZSBpbnRlcm5hbCBFeHBvcnRQREZPcHRpb25zIGlkZW50aWNhbGx5IHRvIGhvdyB0aGUgJ0V4cG9ydCBQREYnIGRpYWxvZyBjb25zdHJ1Y3RzIHRoZSBFeHBvcnRQZGZPcHRpb25zUHJlc01vZGVsLlxuICAgKiBTZWUgdGhlIGhhbmRsZUV4cG9ydENsaWNrIG1ldGhvZCBpbiBAYnJvd3Nlci1jbGllbnRzL2V4cG9ydC1wZGYtb3B0aW9ucy1kaWFsb2cgZm9yIHJlZmVyZW5jZS5cbiAgICpcbiAgICogQHBhcmFtIGludGVybmFsRXhwb3J0UGRmT3B0aW9ucyBUaGUgaW50ZXJuYWwgRXhwb3J0UERGT3B0aW9ucyBwcmVzIG1vZGVsIHVzZWQgdG8gY29uZmlndXJlIHRoZSBvdXRwdXQgUERGIGZpbGUuXG4gICAqIEBwYXJhbSBleHRlcm5hbEV4cG9ydFBkZk9wdGlvbnMgVGhlIGV4dGVybmFsIEV4cG9ydFBERk9wdGlvbnMgdXNlci1mYWNpbmcgb2JqZWN0IHBhc3NlZCB0byBleHBvcnRQREZBc3luYy5cbiAgICogQHBhcmFtIHNoZWV0TmFtZXMgVGhlIGxpc3Qgb2Ygc2hlZXRzIHNlbGVjdGVkIGZvciBleHBvcnQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHVwZGF0ZUludGVybmFsRXhwb3J0UERGT3B0aW9ucyhcbiAgICBpbnRlcm5hbEV4cG9ydFBkZk9wdGlvbnM6IEludGVybmFsRXhwb3J0UERGT3B0aW9ucyxcbiAgICBleHRlcm5hbEV4cG9ydFBkZk9wdGlvbnM6IEV4dGVybmFsRXhwb3J0UERGT3B0aW9ucyxcbiAgICBzaGVldE5hbWVzOiBBcnJheTxzdHJpbmc+LFxuICApOiB2b2lkIHtcbiAgICBpbnRlcm5hbEV4cG9ydFBkZk9wdGlvbnMuY3VycmVudFNoZWV0ID0gc2hlZXROYW1lc1swXTtcbiAgICB0aGlzLnVwZGF0ZUV4cG9ydExheW91dE9wdGlvbnMoaW50ZXJuYWxFeHBvcnRQZGZPcHRpb25zLCBleHRlcm5hbEV4cG9ydFBkZk9wdGlvbnMpO1xuICAgIHRoaXMudXBkYXRlU2hlZXRPcHRpb25zKGludGVybmFsRXhwb3J0UGRmT3B0aW9ucywgc2hlZXROYW1lcyk7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIG1ldGhvZCBmb3IgdXBkYXRlSW50ZXJuYWxFeHBvcnRQREZPcHRpb25zLlxuICAgKiBNb2RpZmllcyB0aGUgZXhwb3J0TGF5b3V0T3B0aW9ucyBwcm9wZXJ0eSBvZiB0aGUgaW50ZXJuYWwgRXhwb3J0UERGT3B0aW9ucyBiYXNlZCBvbiB0aGUgZXh0ZXJuYWwgRXhwb3J0UERGT3B0aW9ucy5cbiAgICogU2VlIHRoZSBnZXRFeHBvcnRMYXlvdXRPcHRpb25zIG1ldGhvZCBpbiBAYnJvd3Nlci1jbGllbnRzL2V4cG9ydC1wZGYtb3B0aW9ucy1kaWFsb2cgZm9yIHJlZmVyZW5jZS5cbiAgICpcbiAgICogQHBhcmFtIGludGVybmFsRXhwb3J0UGRmT3B0aW9ucyBUaGUgaW50ZXJuYWwgRXhwb3J0UERGT3B0aW9ucyBwcmVzIG1vZGVsIHVzZWQgdG8gY29uZmlndXJlIHRoZSBvdXRwdXQgUERGIGZpbGUuXG4gICAqIEBwYXJhbSBleHRlcm5hbEV4cG9ydFBkZk9wdGlvbnMgVGhlIGV4dGVybmFsIEV4cG9ydFBERk9wdGlvbnMgdXNlci1mYWNpbmcgb2JqZWN0IHBhc3NlZCB0byBleHBvcnRQREZBc3luYy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdXBkYXRlRXhwb3J0TGF5b3V0T3B0aW9ucyhcbiAgICBpbnRlcm5hbEV4cG9ydFBkZk9wdGlvbnM6IEludGVybmFsRXhwb3J0UERGT3B0aW9ucyxcbiAgICBleHRlcm5hbEV4cG9ydFBkZk9wdGlvbnM6IEV4dGVybmFsRXhwb3J0UERGT3B0aW9ucyxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgZXhwb3J0TGF5b3V0T3B0aW9ucyA9IGludGVybmFsRXhwb3J0UGRmT3B0aW9ucy5leHBvcnRMYXlvdXRPcHRpb25zO1xuXG4gICAgLy8gc2V0dGluZyB0aGUgaW1hZ2UgaGVpZ2h0IGFuZCB3aWR0aCBwcm9wZXJ0aWVzIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzXG4gICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5pbWFnZUhlaWdodCA9IHRoaXMuRGVmYXVsdExheW91dE9wdGlvbnMuaW1hZ2VIZWlnaHQ7XG4gICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5pbWFnZVdpZHRoID0gdGhpcy5EZWZhdWx0TGF5b3V0T3B0aW9ucy5pbWFnZVdpZHRoO1xuXG4gICAgLy8gIHNldHRpbmcgdGhlIG9yaWVudGF0aW9uIHZhbHVlIGZvciB0aGUgZXhwb3J0TGF5b3V0T3B0aW9uc1xuICAgIHN3aXRjaCAoZXh0ZXJuYWxFeHBvcnRQZGZPcHRpb25zLm9yaWVudGF0aW9uKSB7XG4gICAgICBjYXNlIFByaW50T3JpZW50YXRpb24uTGFuZHNjYXBlOlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VPcmllbnRhdGlvbk9wdGlvbiA9IFBhZ2VPcmllbnRhdGlvbi5MYW5kc2NhcGU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludE9yaWVudGF0aW9uLlBvcnRyYWl0OlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VPcmllbnRhdGlvbk9wdGlvbiA9IFBhZ2VPcmllbnRhdGlvbi5Qb3J0cmFpdDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ2ludmFsaWQgb3JpZW50YXRpb24gZm9yIEV4cG9ydFBERk9wdGlvbicpO1xuICAgIH1cblxuICAgIC8vIHNldHRpbmcgdGhlIHBhZ2Ugc2l6ZSB2YWx1ZSBmb3IgdGhlIGV4cG9ydExheW91dE9wdGlvbnNcbiAgICBzd2l0Y2ggKGV4dGVybmFsRXhwb3J0UGRmT3B0aW9ucy5wYWdlU2l6ZSkge1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLkEzOlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VTaXplT3B0aW9uID0gUGFnZVNpemVPcHRpb24uQTM7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLkE0OlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VTaXplT3B0aW9uID0gUGFnZVNpemVPcHRpb24uQTQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLkE1OlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VTaXplT3B0aW9uID0gUGFnZVNpemVPcHRpb24uQTU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLkI0OlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VTaXplT3B0aW9uID0gUGFnZVNpemVPcHRpb24uQjQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLkI1OlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VTaXplT3B0aW9uID0gUGFnZVNpemVPcHRpb24uQjU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLkV4ZWN1dGl2ZTpcbiAgICAgICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5wYWdlU2l6ZU9wdGlvbiA9IFBhZ2VTaXplT3B0aW9uLkV4ZWN1dGl2ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50UGFnZVNpemUuRm9saW86XG4gICAgICAgIGV4cG9ydExheW91dE9wdGlvbnMucGFnZVNpemVPcHRpb24gPSBQYWdlU2l6ZU9wdGlvbi5Gb2xpbztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50UGFnZVNpemUuTGVkZ2VyOlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VTaXplT3B0aW9uID0gUGFnZVNpemVPcHRpb24uTGVkZ2VyO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRQYWdlU2l6ZS5MZWdhbDpcbiAgICAgICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5wYWdlU2l6ZU9wdGlvbiA9IFBhZ2VTaXplT3B0aW9uLkxlZ2FsO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRQYWdlU2l6ZS5MZXR0ZXI6XG4gICAgICAgIGV4cG9ydExheW91dE9wdGlvbnMucGFnZVNpemVPcHRpb24gPSBQYWdlU2l6ZU9wdGlvbi5MZXR0ZXI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLk5vdGU6XG4gICAgICAgIGV4cG9ydExheW91dE9wdGlvbnMucGFnZVNpemVPcHRpb24gPSBQYWdlU2l6ZU9wdGlvbi5Ob3RlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRQYWdlU2l6ZS5RdWFydG86XG4gICAgICAgIGV4cG9ydExheW91dE9wdGlvbnMucGFnZVNpemVPcHRpb24gPSBQYWdlU2l6ZU9wdGlvbi5RdWFydG87XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLlN0YXRlbWVudDpcbiAgICAgICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5wYWdlU2l6ZU9wdGlvbiA9IFBhZ2VTaXplT3B0aW9uLlN0YXRlbWVudDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50UGFnZVNpemUuVGFibG9pZDpcbiAgICAgICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5wYWdlU2l6ZU9wdGlvbiA9IFBhZ2VTaXplT3B0aW9uLlRhYmxvaWQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLlVuc3BlY2lmaWVkOlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VTaXplT3B0aW9uID0gUGFnZVNpemVPcHRpb24uVW5zcGVjaWZpZWQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludGVybmFsRXJyb3IsICdpbnZhbGlkIHBhZ2VTaXplIGZvciBFeHBvcnRQREZPcHRpb24nKTtcbiAgICB9XG5cbiAgICAvLyBzZXR0aW5nIHRoZSBzY2FsaW5nIHZhbHVlcyBmb3IgdGhlIGV4cG9ydExheW91dE9wdGlvbnNcbiAgICBzd2l0Y2ggKGV4dGVybmFsRXhwb3J0UGRmT3B0aW9ucy5zY2FsaW5nKSB7XG4gICAgICBjYXNlIFByaW50U2NhbGluZy5BdE1vc3QxUGFnZUhpZ2g6XG4gICAgICAgIHRoaXMuc2V0Rml0QW5kU2NhbGVWYWx1ZXMoZXhwb3J0TGF5b3V0T3B0aW9ucywgRml0UGFnZXMuRml0T25lSGlnaCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFNjYWxpbmcuQXRNb3N0MVBhZ2VXaWRlOlxuICAgICAgICB0aGlzLnNldEZpdEFuZFNjYWxlVmFsdWVzKGV4cG9ydExheW91dE9wdGlvbnMsIEZpdFBhZ2VzLkZpdE9uZVdpZGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRTY2FsaW5nLkF0TW9zdDJQYWdlc0hpZ2g6XG4gICAgICAgIHRoaXMuc2V0Rml0QW5kU2NhbGVWYWx1ZXMoZXhwb3J0TGF5b3V0T3B0aW9ucywgRml0UGFnZXMuRml0VHdvSGlnaCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFNjYWxpbmcuQXRNb3N0MlBhZ2VzV2lkZTpcbiAgICAgICAgdGhpcy5zZXRGaXRBbmRTY2FsZVZhbHVlcyhleHBvcnRMYXlvdXRPcHRpb25zLCBGaXRQYWdlcy5GaXRUd29XaWRlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50U2NhbGluZy5BdXRvbWF0aWM6XG4gICAgICAgIHRoaXMuc2V0Rml0QW5kU2NhbGVWYWx1ZXMoZXhwb3J0TGF5b3V0T3B0aW9ucywgUGFnZVNjYWxpbmdPcHRpb24uU2NhbGVQY3RBdXRvKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50U2NhbGluZy5QZXJjMTAwOlxuICAgICAgICB0aGlzLnNldEZpdEFuZFNjYWxlVmFsdWVzKGV4cG9ydExheW91dE9wdGlvbnMsIFBhZ2VTY2FsaW5nT3B0aW9uLlNjYWxlUGN0MTAwKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50U2NhbGluZy5QZXJjMjAwOlxuICAgICAgICB0aGlzLnNldEZpdEFuZFNjYWxlVmFsdWVzKGV4cG9ydExheW91dE9wdGlvbnMsIFBhZ2VTY2FsaW5nT3B0aW9uLlNjYWxlUGN0MjAwKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50U2NhbGluZy5QZXJjMjU6XG4gICAgICAgIHRoaXMuc2V0Rml0QW5kU2NhbGVWYWx1ZXMoZXhwb3J0TGF5b3V0T3B0aW9ucywgUGFnZVNjYWxpbmdPcHRpb24uU2NhbGVQY3QyNSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFNjYWxpbmcuUGVyYzQwMDpcbiAgICAgICAgdGhpcy5zZXRGaXRBbmRTY2FsZVZhbHVlcyhleHBvcnRMYXlvdXRPcHRpb25zLCBQYWdlU2NhbGluZ09wdGlvbi5TY2FsZVBjdDQwMCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFNjYWxpbmcuUGVyYzUwOlxuICAgICAgICB0aGlzLnNldEZpdEFuZFNjYWxlVmFsdWVzKGV4cG9ydExheW91dE9wdGlvbnMsIFBhZ2VTY2FsaW5nT3B0aW9uLlNjYWxlUGN0NTApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRTY2FsaW5nLlBlcmM2MDpcbiAgICAgICAgdGhpcy5zZXRGaXRBbmRTY2FsZVZhbHVlcyhleHBvcnRMYXlvdXRPcHRpb25zLCBQYWdlU2NhbGluZ09wdGlvbi5TY2FsZVBjdDYwKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50U2NhbGluZy5QZXJjNzU6XG4gICAgICAgIHRoaXMuc2V0Rml0QW5kU2NhbGVWYWx1ZXMoZXhwb3J0TGF5b3V0T3B0aW9ucywgUGFnZVNjYWxpbmdPcHRpb24uU2NhbGVQY3Q3NSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFNjYWxpbmcuUGVyYzgwOlxuICAgICAgICB0aGlzLnNldEZpdEFuZFNjYWxlVmFsdWVzKGV4cG9ydExheW91dE9wdGlvbnMsIFBhZ2VTY2FsaW5nT3B0aW9uLlNjYWxlUGN0ODApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRTY2FsaW5nLlBlcmM5MDpcbiAgICAgICAgdGhpcy5zZXRGaXRBbmRTY2FsZVZhbHVlcyhleHBvcnRMYXlvdXRPcHRpb25zLCBQYWdlU2NhbGluZ09wdGlvbi5TY2FsZVBjdDkwKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ2ludmFsaWQgc2NhbGluZyBmb3IgRXhwb3J0UERGT3B0aW9uJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciBtZXRob2QgZm9yIHVwZGF0ZUludGVybmFsRXhwb3J0UERGT3B0aW9ucy5cbiAgICogTW9kaWZpZXMgdGhlIHNoZWV0T3B0aW9ucyBwcm9wZXJ0eSBvZiB0aGUgaW50ZXJuYWwgRXhwb3J0UERGT3B0aW9ucyBiYXNlZCBvbiB0aGUgc2hlZXRzIHNlbGVjdGVkIGZvciBleHBvcnQuXG4gICAqIFNlZSB0aGUgaGFuZGxlRXhwb3J0Q2xpY2sgbWV0aG9kIGluIEBicm93c2VyLWNsaWVudHMvZXhwb3J0LXBkZi1vcHRpb25zLWRpYWxvZyBmb3IgcmVmZXJlbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gaW50ZXJuYWxFeHBvcnRQZGZPcHRpb25zIFRoZSBpbnRlcm5hbCBFeHBvcnRQREZPcHRpb25zIHByZXMgbW9kZWwgdXNlZCB0byBjb25maWd1cmUgdGhlIG91dHB1dCBQREYgZmlsZS5cbiAgICogQHBhcmFtIHNoZWV0TmFtZXMgVGhlIGxpc3Qgb2Ygc2hlZXRzIHNlbGVjdGVkIGZvciBleHBvcnQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHVwZGF0ZVNoZWV0T3B0aW9ucyhpbnRlcm5hbEV4cG9ydFBkZk9wdGlvbnM6IEludGVybmFsRXhwb3J0UERGT3B0aW9ucywgc2hlZXROYW1lczogQXJyYXk8c3RyaW5nPik6IHZvaWQge1xuICAgIGNvbnN0IHsgZXhwb3J0TGF5b3V0T3B0aW9ucywgc2hlZXRPcHRpb25zIH0gPSBpbnRlcm5hbEV4cG9ydFBkZk9wdGlvbnM7XG4gICAgLy8gdXBkYXRpbmcgdGhlIGV4cG9ydCBsYXlvdXRzIG9wdGlvbnMgZm9yIGVhY2ggc2hlZXQgYW5kIHNlbGVjdGluZyBzaGVldCBmb3IgZXhwb3J0IGlmIGluY2x1ZGVkIGluIGxpc3RcbiAgICBmb3IgKGNvbnN0IHNoZWV0T3B0aW9uIG9mIHNoZWV0T3B0aW9ucykge1xuICAgICAgc2hlZXRPcHRpb24uZXhwb3J0TGF5b3V0T3B0aW9ucyA9IGV4cG9ydExheW91dE9wdGlvbnM7XG4gICAgICBzaGVldE9wdGlvbi5pc1NlbGVjdGVkID0gc2hlZXROYW1lcy5pbmNsdWRlcyhzaGVldE9wdGlvbi5zaGVldCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciBtZXRob2QgZm9yIHVwZGF0ZUV4cG9ydExheW91dE9wdG9ucy5cbiAgICogVGhpcyBtZXRob2QgaXMgYSBzcG9vZiBvZiB0aGUgZ2V0Rml0QW5kU2NhbGVWYWx1ZXMgbWV0aG9kIHVzZWQgaW4gQGJyb3dzZXItY2xpZW50cy9leHBvcnQtcGRmLW9wdGlvbnMgdG8gc2V0IHRoZSBleHBvcnRMYXlvdXRPcHRpb25zJyBzY2FsaW5nIHByb3BlcnRpZXMuXG4gICAqIEluIHRoZSBmdXR1cmUsIHRoaXMgZmlsZSBzaG91bGQgYmUgcmVmYWN0b3JlZCB0byBpbXBvcnQgdGhlIG1ldGhvZCBkaXJlY3RseSBmcm9tIEBicm93c2VyLWNsaWVudHMvZXhwb3J0LXBkZi1vcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0gc2NhbGluZ1NlbGVjdGlvbiBzdHJpbmcgdXNlZCBmb3Igc2V0dGluZyB0aGUgZXhwb3J0TGF5b3V0T3B0aW9ucyBiYXNlZCBvbiB0aGUgUHJpbnRTY2FsaW5nIHByb3BlcnR5IGZyb20gdGhlIEV4dGVybmFsRXhwb3J0UERGT3B0aW9ucy5cbiAgICogQHBhcmFtIGV4cG9ydExheW91dE9wdGlvbnMgdGhlIEV4cG9ydExheW91dE9wdGlvbnMgdXNlZCBieSB0aGUgaW50ZXJuYWwgRXhwb3J0UERGT3B0aW9ucyBwcmVzIG1vZGVsLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzZXRGaXRBbmRTY2FsZVZhbHVlcyhleHBvcnRMYXlvdXRPcHRpb25zOiBFeHBvcnRMYXlvdXRPcHRpb25zLCBzY2FsaW5nU2VsZWN0aW9uOiBTY2FsaW5nU2VsZWN0aW9uKTogdm9pZCB7XG4gICAgbGV0IHsgcGFnZUZpdEhvcml6b250YWwsIHBhZ2VGaXRWZXJ0aWNhbCwgcGFnZVNjYWxlTW9kZSwgcGFnZVNjYWxlUGVyY2VudCB9ID0gdGhpcy5EZWZhdWx0TGF5b3V0T3B0aW9ucztcblxuICAgIGNvbnN0IGZpdE1hdGNoID0gdGhpcy5maXRSZWdleC5leGVjKHNjYWxpbmdTZWxlY3Rpb24pO1xuICAgIGNvbnN0IHBlcmNlbnRNYXRjaCA9IHRoaXMucGN0UmVnZXguZXhlYyhzY2FsaW5nU2VsZWN0aW9uKTtcblxuICAgIGlmIChmaXRNYXRjaCkge1xuICAgICAgW3BhZ2VGaXRIb3Jpem9udGFsLCBwYWdlRml0VmVydGljYWxdID0gZml0TWF0Y2guc2xpY2UoMSkubWFwKCh2YWx1ZSkgPT4gTnVtYmVyKHZhbHVlKSk7XG4gICAgICBwYWdlU2NhbGVNb2RlID0gU2NhbGVNb2RlLlNjYWxlRml0UGFnZXM7XG4gICAgfSBlbHNlIGlmIChwZXJjZW50TWF0Y2gpIHtcbiAgICAgIFtwYWdlU2NhbGVQZXJjZW50XSA9IHBlcmNlbnRNYXRjaC5zbGljZSgxKS5tYXAoKHZhbHVlKSA9PiBOdW1iZXIodmFsdWUpKTtcbiAgICAgIHBhZ2VTY2FsZU1vZGUgPSBTY2FsZU1vZGUuU2NhbGVQZXJjZW50YWdlO1xuICAgIH1cblxuICAgIC8vIGdldEZpdEFuZFNjYWxlVmFsdWVzIHJldHVybnMgdGhlIHByb3BlcnRpZXMgYmVsb3csIGJ1dCBpbnN0ZWFkIHRoaXMgbWV0aG9kIHdpbGwgc2V0IHRoZW0uXG4gICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5wYWdlRml0SG9yaXpvbnRhbCA9IHBhZ2VGaXRIb3Jpem9udGFsO1xuICAgIGV4cG9ydExheW91dE9wdGlvbnMucGFnZUZpdFZlcnRpY2FsID0gcGFnZUZpdFZlcnRpY2FsO1xuICAgIGV4cG9ydExheW91dE9wdGlvbnMucGFnZVNjYWxlTW9kZSA9IHBhZ2VTY2FsZU1vZGU7XG4gICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5wYWdlU2NhbGVQZXJjZW50ID0gcGFnZVNjYWxlUGVyY2VudDtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGZpdFJlZ2V4ID0gbmV3IFJlZ0V4cCgnZml0KFswLTldKyl4KFswLTldKyknKTtcbiAgcHJpdmF0ZSBzdGF0aWMgcGN0UmVnZXggPSBuZXcgUmVnRXhwKCdwY3QoWzAtOV0rKScpO1xufVxuIiwiaW1wb3J0IHsgRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgRXJyb3JIZWxwZXJzIH0gZnJvbSAnLi9FcnJvckhlbHBlcnMnO1xuXG5leHBvcnQgY2xhc3MgUGFyYW0ge1xuICAvKipcbiAgICogc2VyaWFsaXplcyB0aGUgZGF0ZSBpbnRvIHRoZSBmb3JtYXQgdGhhdCB0aGUgc2VydmVyIGV4cGVjdHMuXG4gICAqIEBwYXJhbSBkYXRlIHRoZSBkYXRlIHRvIHNlcmlhbGl6ZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzZXJpYWxpemVEYXRlRm9yUGxhdGZvcm0oZGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgY29uc3QgeWVhcjogbnVtYmVyID0gZGF0ZS5nZXRVVENGdWxsWWVhcigpO1xuICAgIGNvbnN0IG1vbnRoOiBudW1iZXIgPSBkYXRlLmdldFVUQ01vbnRoKCkgKyAxO1xuICAgIGNvbnN0IGRheTogbnVtYmVyID0gZGF0ZS5nZXRVVENEYXRlKCk7XG4gICAgY29uc3QgaGg6IG51bWJlciA9IGRhdGUuZ2V0VVRDSG91cnMoKTtcbiAgICBjb25zdCBtbTogbnVtYmVyID0gZGF0ZS5nZXRVVENNaW51dGVzKCk7XG4gICAgY29uc3Qgc2VjOiBudW1iZXIgPSBkYXRlLmdldFVUQ1NlY29uZHMoKTtcbiAgICByZXR1cm4gYCR7eWVhcn0tJHttb250aH0tJHtkYXl9ICR7aGh9OiR7bW19OiR7c2VjfWA7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZUJvb2xlYW5Gb3JQbGF0Zm9ybShib29sOiBib29sZWFuKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYm9vbCA/ICd0cnVlJyA6ICdmYWxzZSc7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZU51bWJlckZvclBsYXRmb3JtKG51bTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbnVtLnRvU3RyaW5nKDEwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGUgaW5wdXQgaXMgYSBudW1iZXJcbiAgICovXG4gIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnkgKi9cbiAgcHVibGljIHN0YXRpYyBpc1R5cGVOdW1iZXIoaW5wdXQ6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0eXBlb2YgaW5wdXQgPT09ICdudW1iZXInIHx8IGlucHV0IGluc3RhbmNlb2YgTnVtYmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoZSBpbnB1dCBpcyBhIERhdGVcbiAgICovXG4gIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnkgKi9cbiAgcHVibGljIHN0YXRpYyBpc1R5cGVEYXRlKGlucHV0OiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaW5wdXQgaW5zdGFuY2VvZiBEYXRlO1xuICB9XG5cbiAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueSAqL1xuICBwdWJsaWMgc3RhdGljIGlzVHlwZVN0cmluZyhpbnB1dDogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycgfHwgaW5wdXQgaW5zdGFuY2VvZiBTdHJpbmc7XG4gIH1cblxuICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55ICovXG4gIHB1YmxpYyBzdGF0aWMgaXNUeXBlQm9vbChpbnB1dDogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHR5cGVvZiBpbnB1dCA9PT0gJ2Jvb2xlYW4nIHx8IGlucHV0IGluc3RhbmNlb2YgQm9vbGVhbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBpbnB1dCBpcyBudWxsIG9yIHVuZGVmaW5lZFxuICAgKi9cbiAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueSAqL1xuICBwdWJsaWMgc3RhdGljIGlzTnVsbE9yVW5kZWZpbmVkKGlucHV0OiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaW5wdXQgPT09IG51bGwgfHwgaW5wdXQgPT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnkgKi9cbiAgcHVibGljIHN0YXRpYyBzZXJpYWxpemVQYXJhbWV0ZXJWYWx1ZSh2YWx1ZTogYW55KTogc3RyaW5nIHtcbiAgICBpZiAoUGFyYW0uaXNUeXBlTnVtYmVyKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIFBhcmFtLnNlcmlhbGl6ZU51bWJlckZvclBsYXRmb3JtKHZhbHVlIGFzIG51bWJlcik7XG4gICAgfSBlbHNlIGlmIChQYXJhbS5pc1R5cGVEYXRlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIFBhcmFtLnNlcmlhbGl6ZURhdGVGb3JQbGF0Zm9ybSh2YWx1ZSBhcyBEYXRlKTtcbiAgICB9IGVsc2UgaWYgKFBhcmFtLmlzVHlwZUJvb2wodmFsdWUpKSB7XG4gICAgICByZXR1cm4gUGFyYW0uc2VyaWFsaXplQm9vbGVhbkZvclBsYXRmb3JtKHZhbHVlIGFzIGJvb2xlYW4pO1xuICAgIH0gZWxzZSBpZiAoUGFyYW0uaXNUeXBlU3RyaW5nKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFVuZXhwZWN0ZWQgaW52YWxpZCB2YWx1ZSBmb3I6ICR7dmFsdWV9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoYXQgdGhlIHBhcmFtZXRlciBpcyBhbHJlYWR5IGEgTWFwLCBvciBjb252ZXJ0cyBhbiBvYmplY3QgdG8gYSBNYXAuXG4gICAqIElmIHRoZSBwYXJhbWV0ZXIgaXMgYW4gb2JqZWN0LCB3ZSBjb252ZXJ0IGl0IHRvIGEgTWFwIHVzaW5nIE9iamVjdC5lbnRyaWVzLlxuICAgKiBAdGhyb3dzIGlmIHRoZSBwYXJhbWV0ZXIgaXMgbm90IGFuIG9iamVjdCBvciBNYXBcbiAgICovXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgcHVibGljIHN0YXRpYyBjb252ZXJ0UGFyYW1ldGVyVG9NYXAocGFyYW06IG9iamVjdCwgcGFyYW1OYW1lOiBzdHJpbmcpOiBNYXA8YW55LCBhbnk+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyVHlwZShwYXJhbSwgJ29iamVjdCcsIHBhcmFtTmFtZSk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocGFyYW0pKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgYEV4cGVjdGluZyBvYmplY3Qgb3IgTWFwIGZvcjogJHtwYXJhbU5hbWV9LmApO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJhbSBpbnN0YW5jZW9mIE1hcCA/IHBhcmFtIDogbmV3IE1hcChPYmplY3QuZW50cmllcyhwYXJhbSkpO1xuICB9XG5cbiAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueSAqL1xuICBwdWJsaWMgc3RhdGljIHRyeVBhcnNlTnVtYmVyKHZhbHVlOiBhbnkpOiB7IHBhcnNlZD86IG51bWJlcjsgc3VjY2VzczogYm9vbGVhbiB9IHtcbiAgICBpZiAoUGFyYW0uaXNOdWxsT3JVbmRlZmluZWQodmFsdWUpKSB7XG4gICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIGlmIChQYXJhbS5pc1R5cGVOdW1iZXIodmFsdWUpKSB7XG4gICAgICByZXR1cm4geyBwYXJzZWQ6IHZhbHVlIGFzIG51bWJlciwgc3VjY2VzczogdHJ1ZSB9O1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlU3RyaW5nID0gdmFsdWUudG9TdHJpbmcoKTtcbiAgICBpZiAodmFsdWVTdHJpbmcgPT09ICdOYU4nKSB7XG4gICAgICAvLyAnTmFOJyBwYXJzZXMgYXMgTmFOIHdoaWNoIGlzIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gYSBmYWlsZWQgcGFyc2UuXG4gICAgICByZXR1cm4geyBwYXJzZWQ6IE5hTiwgc3VjY2VzczogdHJ1ZSB9O1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlRmxvYXQodmFsdWVTdHJpbmcpO1xuICAgIGlmIChpc05hTihwYXJzZWQpKSB7XG4gICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IHBhcnNlZCwgc3VjY2VzczogdHJ1ZSB9O1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgU2hlZXRJbmZvLCBTaGVldFR5cGUsIFNpemVDb25zdHJhaW50IH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uL1RhYmxlYXVFcnJvcic7XG5cbmV4cG9ydCBjbGFzcyBTaGVldFV0aWxzIHtcbiAgLy8gVGhpcyBpcyBhIGRpcmVjdCBwb3J0IGZyb20gU2hlZXRTaXplLmNzIC0gU2hlZXRTaXplRmFjdG9yeVxuICBwdWJsaWMgc3RhdGljIGdldFNoZWV0U2l6ZUZyb21TaXplQ29uc3RyYWludHMoc2l6ZUNvbnN0cmFpbnQ6IFNpemVDb25zdHJhaW50KTogQ29udHJhY3QuU2hlZXRTaXplIHtcbiAgICBjb25zdCB7IG1pbldpZHRoLCBtaW5IZWlnaHQsIG1heFdpZHRoLCBtYXhIZWlnaHQgfSA9IHNpemVDb25zdHJhaW50O1xuXG4gICAgaWYgKG1pbkhlaWdodCA9PT0gMCAmJiBtaW5XaWR0aCA9PT0gMCkge1xuICAgICAgaWYgKG1heEhlaWdodCA9PT0gMCAmJiBtYXhXaWR0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGJlaGF2aW9yOiBDb250cmFjdC5TaGVldFNpemVCZWhhdmlvci5BdXRvbWF0aWMsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGJlaGF2aW9yOiBDb250cmFjdC5TaGVldFNpemVCZWhhdmlvci5BdE1vc3QsXG4gICAgICAgIG1heFNpemU6IHsgd2lkdGg6IG1heFdpZHRoLCBoZWlnaHQ6IG1heEhlaWdodCB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAobWF4SGVpZ2h0ID09PSAwICYmIG1heFdpZHRoID09PSAwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBiZWhhdmlvcjogQ29udHJhY3QuU2hlZXRTaXplQmVoYXZpb3IuQXRMZWFzdCxcbiAgICAgICAgbWluU2l6ZTogeyB3aWR0aDogbWluV2lkdGgsIGhlaWdodDogbWluSGVpZ2h0IH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChtYXhIZWlnaHQgPT09IG1pbkhlaWdodCAmJiBtYXhXaWR0aCA9PT0gbWluV2lkdGggJiYgbWluV2lkdGggPiAwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBiZWhhdmlvcjogQ29udHJhY3QuU2hlZXRTaXplQmVoYXZpb3IuRXhhY3RseSxcbiAgICAgICAgbWluU2l6ZTogeyB3aWR0aDogbWluV2lkdGgsIGhlaWdodDogbWluSGVpZ2h0IH0sXG4gICAgICAgIG1heFNpemU6IHsgd2lkdGg6IG1pbldpZHRoLCBoZWlnaHQ6IG1pbkhlaWdodCB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyAnRml0IFdpZHRoJyBmb3IgYSBEU0QgbGF5b3V0XG4gICAgY29uc3QgaXNEc2RMYXlvdXQgPSBtaW5XaWR0aCA9PT0gMCAmJiBtYXhXaWR0aCA9PT0gMDtcblxuICAgIHJldHVybiB7XG4gICAgICBiZWhhdmlvcjogQ29udHJhY3QuU2hlZXRTaXplQmVoYXZpb3IuUmFuZ2UsXG4gICAgICBtaW5TaXplOiB7IHdpZHRoOiBtaW5XaWR0aCwgaGVpZ2h0OiBtaW5IZWlnaHQgfSxcbiAgICAgIG1heFNpemU6IHsgd2lkdGg6IGlzRHNkTGF5b3V0ID8gMjE0NzQ4MzY0NyA6IG1heFdpZHRoLCBoZWlnaHQ6IG1heEhlaWdodCB9LFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGNyZWF0ZUF1dG9tYXRpY1NpemUoKTogQ29udHJhY3QuU2hlZXRTaXplIHtcbiAgICBsZXQgYmVoYXZpb3IgPSBDb250cmFjdC5TaGVldFNpemVCZWhhdmlvci5BdXRvbWF0aWM7XG4gICAgbGV0IG1pblNpemUgPSB7IHdpZHRoOiAwLCBoZWlnaHQ6IDAgfTtcbiAgICBsZXQgbWF4U2l6ZSA9IHsgd2lkdGg6IDAsIGhlaWdodDogMCB9O1xuICAgIHJldHVybiB7IGJlaGF2aW9yLCBtaW5TaXplLCBtYXhTaXplIH07XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGdldFB1Ymxpc2hlZFNoZWV0SW5mb0J5TmFtZShuYW1lOiBzdHJpbmcsIHNoZWV0SW5mb3M6IEFycmF5PFNoZWV0SW5mbz4pOiBTaGVldEluZm8gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHNoZWV0SW5mbyA9IHNoZWV0SW5mb3MuZmluZCgoc2hlZXQpID0+IHNoZWV0Lm5hbWUgPT09IG5hbWUpO1xuICAgIHJldHVybiBzaGVldEluZm87XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGdldFNoZWV0VHlwZUVudW0oaW50ZXJuYWxTaGVldFR5cGU6IFNoZWV0VHlwZSk6IENvbnRyYWN0LlNoZWV0VHlwZSB7XG4gICAgbGV0IHNoZWV0VHlwZTogQ29udHJhY3QuU2hlZXRUeXBlO1xuICAgIHN3aXRjaCAoaW50ZXJuYWxTaGVldFR5cGUpIHtcbiAgICAgIGNhc2UgU2hlZXRUeXBlLldvcmtzaGVldDoge1xuICAgICAgICBzaGVldFR5cGUgPSBDb250cmFjdC5TaGVldFR5cGUuV29ya3NoZWV0O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgU2hlZXRUeXBlLkRhc2hib2FyZDoge1xuICAgICAgICBzaGVldFR5cGUgPSBDb250cmFjdC5TaGVldFR5cGUuRGFzaGJvYXJkO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgU2hlZXRUeXBlLlN0b3J5OiB7XG4gICAgICAgIHNoZWV0VHlwZSA9IENvbnRyYWN0LlNoZWV0VHlwZS5TdG9yeTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuU2hhcmVkRXJyb3JDb2Rlcy5TZXJ2ZXJFcnJvciwgJ0ludmFsaWQgU2hlZXRUeXBlJyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzaGVldFR5cGU7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzVmFsaWRTaGVldFNpemUoc2l6ZU9iamVjdDogQ29udHJhY3QuU2l6ZSB8IENvbnRyYWN0LlNoZWV0U2l6ZSk6IHNpemVPYmplY3QgaXMgQ29udHJhY3QuU2hlZXRTaXplIHtcbiAgICByZXR1cm4gKDxDb250cmFjdC5TaGVldFNpemU+c2l6ZU9iamVjdCkuYmVoYXZpb3IgIT09IHVuZGVmaW5lZDtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uL1RhYmxlYXVFcnJvcic7XG5pbXBvcnQgeyBEZWZlcnJlZCwgVW5yZWdpc3RlclRpbWVvdXRJbk1pbGxpc2Vjb25kcyB9IGZyb20gJy4vRGVmZXJyZWQnO1xuXG4vKipcbiAqIEEgRGVmZXJyZWQgd3JhcHBlciBjbGFzcyBhZGRpbmcgZnVuY3Rpb25hbGl0eSB0byByZWplY3QgdW5yZXNwb25zaXZlIHByb21pc2VzIGFmdGVyIHRpbWVvdXRcbiAqXG4gKiB0aGlzIGNsYXNzIGhhbmRsZXMgdHdvIHRoaW5nczpcblxuICogICAgMS4gQWRkcyB0aW1lb3V0IGxvZ2ljIGZvciBkZWZlcnJlZFxuICogICAgMi4gSXQgYmxvY2tzIG11bHRpcGxlIGNhbGxzIGZyb20gZXhlY3V0aW5nIGF0IHRoZSBzYW1lIHRpbWUuXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIFNob3J0TGl2ZWREZWZlcnJlZFxuICogQHRlbXBsYXRlIFRSZXNvbHZlIFRoZSB0eXBlIHVzZWQgdG8gcmVzb2x2ZSB0aGUgcHJvbWlzZS5cbiAqIEB0ZW1wbGF0ZSBUUmVqZWN0IFRoZSB0eXBlIHVzZWQgdG8gcmVqZWN0IHRoZSBwcm9taXNlLiBEZWZhdWx0cyB0byBhbnkuXG4gKlxuICovXG5leHBvcnQgY2xhc3MgU2hvcnRMaXZlZERlZmVycmVkPFRSZXNvbHZlLCBUUmVqZWN0ID0gYW55PiB7XG4gIHByaXZhdGUgX2RlZmVycmVkOiBEZWZlcnJlZDxUUmVzb2x2ZSwgVFJlamVjdD4gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX3RpbWVvdXRJZDtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfdGltZW91dEluTWlsbGlzZWNvbmRzID0gVW5yZWdpc3RlclRpbWVvdXRJbk1pbGxpc2Vjb25kcykge31cblxuICBwdWJsaWMgZ2V0TmV3UHJvbWlzZU9yVGhyb3dJZkJ1c3koKTogUHJvbWlzZTxUUmVzb2x2ZT4ge1xuICAgIGlmICh0aGlzLl9kZWZlcnJlZCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5TaGFyZWRFcnJvckNvZGVzLkFwaUV4ZWN1dGlvbkVycm9yLCAnVGhpcyBhcGkgY2Fubm90IGJlIGV4ZWN1dGVkIHRpbGwgcHJldmlvdXMgY2FsbCBpcyByZXNvbHZlZC4nKTtcbiAgICB9XG4gICAgdGhpcy5fZGVmZXJyZWQgPSBuZXcgRGVmZXJyZWQoKTtcblxuICAgIHRoaXMuX3RpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgICBDb250cmFjdC5TaGFyZWRFcnJvckNvZGVzLlRpbWVvdXQsXG4gICAgICAgIGBBcGkgZmFpbGVkIHRvIGNvbXBsZXRlIGluICR7dGhpcy5fdGltZW91dEluTWlsbGlzZWNvbmRzIC8gMTAwMH0gc2Vjb25kc2AsXG4gICAgICApO1xuICAgICAgdGhpcy5yZWplY3QoZXJyb3IpO1xuICAgIH0sIHRoaXMuX3RpbWVvdXRJbk1pbGxpc2Vjb25kcyk7XG5cbiAgICByZXR1cm4gdGhpcy5fZGVmZXJyZWQucHJvbWlzZTtcbiAgfVxuXG4gIHB1YmxpYyByZXNvbHZlKHJlc3BvbnNlOiBUUmVzb2x2ZSB8IFByb21pc2VMaWtlPFRSZXNvbHZlPik6IHZvaWQge1xuICAgIGlmICh0aGlzLl9kZWZlcnJlZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXRJZCk7XG4gICAgICB0aGlzLl9kZWZlcnJlZC5yZXNvbHZlKHJlc3BvbnNlKTtcbiAgICAgIHRoaXMuX2RlZmVycmVkID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZWplY3QoZXJyb3I6IGFueSk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9kZWZlcnJlZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXRJZCk7XG4gICAgICB0aGlzLl9kZWZlcnJlZC5yZWplY3QoZXJyb3IpO1xuICAgICAgdGhpcy5fZGVmZXJyZWQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBFcnJvckNvZGVzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4vVGFibGVhdUVycm9yJztcbmltcG9ydCB7IFZlcnNpb25OdW1iZXJDb250cmFjdCB9IGZyb20gJy4vVmVyc2lvbk51bWJlckNvbnRyYWN0JztcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIGV4dGVuc2lvbnMsIGVtYmVkZGluZ1xuICogYW5kIGV4dGVuc2lvbnMtYXBpLXR5cGVzIGxpYnJhcnlcbiAqL1xuZXhwb3J0IGNsYXNzIFZlcnNpb25OdW1iZXIgaW1wbGVtZW50cyBWZXJzaW9uTnVtYmVyQ29udHJhY3Qge1xuICBwdWJsaWMgbWFqb3I6IG51bWJlcjtcbiAgcHVibGljIG1pbm9yOiBudW1iZXI7XG4gIHB1YmxpYyBmaXg6IG51bWJlcjtcbiAgcHVibGljIGJ1aWxkOiBudW1iZXI7XG4gIHB1YmxpYyBpc0FscGhhOiBib29sZWFuO1xuXG4gIC8vIHByaXZhdGUgY29uc3RydWN0b3Igc28gZXZlcnlvbmUgdXNlcyB0aGUgc2luZ2xldG9uIGluc3RhbmNlXG4gIC8vIGJ1aWxkIG51bWJlcnMgaGF2ZSB0aGlzIGZvcm06IE0ubS5mLXByZS5OXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih2ZXJzaW9uU3RyaW5nOiBzdHJpbmcsIGlzQWxwaGE6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBwYXJ0U3RyID0gdmVyc2lvblN0cmluZy5zcGxpdCgnLScpO1xuICAgIHRoaXMuYnVpbGQgPSB0aGlzLmdldEJ1aWxkTnVtYmVyKHBhcnRTdHJbMV0pO1xuICAgIHZlcnNpb25TdHJpbmcgPSBwYXJ0U3RyWzBdO1xuXG4gICAgY29uc3QgcGFydHMgPSB2ZXJzaW9uU3RyaW5nLnNwbGl0KCcuJykubWFwKChwKSA9PiBwYXJzZUludChwLCAxMCkpO1xuICAgIGlmIChwYXJ0cy5sZW5ndGggIT09IDMpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgSW52YWxpZCB2ZXJzaW9uIG51bWJlcjogJHt2ZXJzaW9uU3RyaW5nfWApO1xuICAgIH1cblxuICAgIHRoaXMubWFqb3IgPSBwYXJ0c1swXTtcbiAgICB0aGlzLm1pbm9yID0gcGFydHNbMV07XG4gICAgdGhpcy5maXggPSBwYXJ0c1syXTtcbiAgICB0aGlzLmlzQWxwaGEgPSBpc0FscGhhO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRCdWlsZE51bWJlcihwcmVSZWxlYXNlU3RyaW5nOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGNvbnN0IG5vQnVpbGROdW1iZXIgPSAtMTtcbiAgICBpZiAoIXByZVJlbGVhc2VTdHJpbmcpIHtcbiAgICAgIHJldHVybiBub0J1aWxkTnVtYmVyO1xuICAgIH1cblxuICAgIC8vIFRoZSBwcmVSZWxlYXNlIHN0cmluZyBoYXMgdGhpcyBmb3JtOiBwcmUuTiwgYnV0IHdlIGRvbid0IGRlcGVuZCBvbiB0aGUgYWN0dWFsIHN0cmluZyBiZWluZyAncHJlJ1xuICAgIGNvbnN0IHBhcnRTdHIgPSBwcmVSZWxlYXNlU3RyaW5nLnNwbGl0KCcuJyk7XG4gICAgcmV0dXJuIHBhcnRTdHJbMV0gPyBwYXJzZUludChwYXJ0U3RyWzFdLCAxMCkgOiBub0J1aWxkTnVtYmVyO1xuICB9XG5cbiAgcHVibGljIGdldCBmb3JtYXR0ZWRWYWx1ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLm1ham9yfS4ke3RoaXMubWlub3J9LiR7dGhpcy5maXh9YDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZnVsbEZvcm1hdHRlZFZhbHVlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMubWFqb3J9LiR7dGhpcy5taW5vcn0uJHt0aGlzLmZpeH0tcHJlLiR7dGhpcy5idWlsZH1gO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBDcmVhdGVFeHRlcm5hbENvbXBhdGlibGVWZXJzaW9uQ29udmVydGVyLFxuICBFeGVjdXRlUGFyYW1ldGVycyxcbiAgRXhlY3V0ZVJlc3BvbnNlLFxuICBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcixcbiAgSW50ZXJuYWxBcGlEaXNwYXRjaGVyLFxuICBJTlRFUk5BTF9DT05UUkFDVF9WRVJTSU9OLFxuICBOb3RpZmljYXRpb24sXG4gIE5vdGlmaWNhdGlvbkhhbmRsZXIsXG4gIFZlcmJJZCxcbiAgVmVyc2lvbkxlc3NUaGFuLFxuICBWZXJzaW9uTnVtYmVyLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBJbnRlcm5hbEFwaURpc3BhdGNoZXIgd2hpY2ggc3VwcG9ydHMgdXBncmFkaW5nIGFuZCBkb3duZ3JhZGluZyB0aGUgaW5wdXRcbiAqIGludGVybmFsIGNvbnRyYWN0IHRvIHRoZSB2ZXJzaW9uIHRoYXQgdGhpcyBtb2R1bGUgaXMgYnVpbHQgYWdhaW5zdFxuICpcbiAqIEBjbGFzcyBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXJcbiAqIEBpbXBsZW1lbnRzIHtJbnRlcm5hbEFwaURpc3BhdGNoZXJ9XG4gKi9cbmV4cG9ydCBjbGFzcyBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIgaW1wbGVtZW50cyBJbnRlcm5hbEFwaURpc3BhdGNoZXIge1xuICBwcml2YXRlIF92ZXJzaW9uQ29udmVydGVyOiBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcjtcbiAgcHJpdmF0ZSBfbm90aWZpY2F0aW9uSGFuZGxlcnM6IEFycmF5PE5vdGlmaWNhdGlvbkhhbmRsZXI+O1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXJcbiAgICogV2UgaGF2ZSBtdWx0aXBsZSB2ZXJzaW9uIGNvbnZlcnRpbmcgZGlzcGF0Y2hlcnMgdGhhdCB3b3JrIHRvZ2V0aGVyLlxuICAgKiBJZiBuZWVkZWQsIHRoZSBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIgd3JhcHMgZWl0aGVyIHRoZSBJbnRlcm5hbEFwaURpc3BhdGNoZXIgKGRlc2t0b3ApXG4gICAqIG9yIHRoZSBDcm9zc0ZyYW1lRGlzcGF0Y2hlciAoc2VydmVyKS5cbiAgICogVGhlIEludGVybmFsL0Nyb3NzRnJhbWUgZGlzcGF0Y2hlcnMgaGFuZGxlIGFuIHVwZGF0ZWQgcGxhdGZvcm0gd2l0aCBhbiBvbGRlciBleHRlcm5hbCBsaWJyYXJ5LlxuICAgKiAoVGhlIENyb3NzRnJhbWVEaXNwYXRjaGVyIHNlbmRzIG1lc3NhZ2VzIGFjcm9zcyB0aGUgZnJhbWUsIGFuZCBpdCBpcyBoYW5kbGVkIGJ5IHRoZSBQcmVzTGF5ZXJIYW5kbGVyLilcbiAgICogTWVhbndoaWxlLCB0aGUgVmVyc2lvbmVkRXh0ZXJuYWxBcGlEaXNwYXRjaGVyIGhhbmRsZXMgYW4gdXBkYXRlZCBleHRlcm5hbCBsaWJyYXJ5IHdpdGggYW4gb2xkZXIgcGxhdGZvcm0uXG5cbiAgICogQHBhcmFtIF9hcGlEZWxlZ2F0ZURpc3BhdGNoZXIgVGhlIGRlbGVnYXRlIHRoYXQgZG9lcyB0aGUgYWN0dWFsIHdvcmsuXG4gICAqIEBwYXJhbSBwbGF0Zm9ybVZlcnNpb25OdW1iZXIgVGhlIHZlcnNpb24gb2YgdGhlIGludGVybmFsIGNvbnRyYWN0IHdoaWNoIHRoZSBwbGF0Zm9ybSBtb2R1bGUgaXMgdXNpbmcuXG4gICAqIFRoaXMgbnVtYmVyIHdpbGwgYmUgdXNlZCB0byBmaWd1cmUgb3V0IGhvdyB0byBkb3duZ3JhZGUgaW5jb21pbmcgY29tbWFuZHMgYW5kIHVwZ3JhZGUgdGhlIHJlc3VsdHNcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9hcGlEZWxlZ2F0ZURpc3BhdGNoZXI6IEludGVybmFsQXBpRGlzcGF0Y2hlciwgcGxhdGZvcm1WZXJzaW9uTnVtYmVyOiBWZXJzaW9uTnVtYmVyKSB7XG4gICAgdGhpcy5fdmVyc2lvbkNvbnZlcnRlciA9IENyZWF0ZUV4dGVybmFsQ29tcGF0aWJsZVZlcnNpb25Db252ZXJ0ZXIoSU5URVJOQUxfQ09OVFJBQ1RfVkVSU0lPTiwgcGxhdGZvcm1WZXJzaW9uTnVtYmVyKTtcblxuICAgIHRoaXMuX25vdGlmaWNhdGlvbkhhbmRsZXJzID0gW107XG4gICAgX2FwaURlbGVnYXRlRGlzcGF0Y2hlci5yZWdpc3Rlck5vdGlmaWNhdGlvbkhhbmRsZXIoKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uKTogdm9pZCA9PiB7XG4gICAgICBpZiAodGhpcy5fbm90aWZpY2F0aW9uSGFuZGxlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHVwZ3JhZGVkTm90aWZpY2F0aW9uID0gdGhpcy5fdmVyc2lvbkNvbnZlcnRlci51cGdyYWRlTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbik7XG4gICAgICB0aGlzLl9ub3RpZmljYXRpb25IYW5kbGVycy5mb3JFYWNoKChoYW5kbGVyKSA9PiB7XG4gICAgICAgIGhhbmRsZXIodXBncmFkZWROb3RpZmljYXRpb24pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIG5lZWRzVmVyc2lvbkNvbnZlcnRlcihwbGF0Zm9ybVZlcnNpb246IFZlcnNpb25OdW1iZXIpOiBib29sZWFuIHtcbiAgICAvLyBJZiBvdXIgcGxhdGZvcm0gaXMgbGVzcyB0aGFuIGV4dGVybmFsIGxpYnJhcnkgdmVyc2lvbiwgdGhlbiB3ZSBuZWVkIGEgY29udmVydGVyXG4gICAgcmV0dXJuIFZlcnNpb25MZXNzVGhhbihwbGF0Zm9ybVZlcnNpb24sIElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT04pO1xuICB9XG5cbiAgcHVibGljIGV4ZWN1dGUodmVyYjogVmVyYklkLCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyk6IFByb21pc2U8RXhlY3V0ZVJlc3BvbnNlPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRvd25ncmFkZVBhcmFtZXRlcnMgPSB0aGlzLl92ZXJzaW9uQ29udmVydGVyLmRvd25ncmFkZUV4ZWN1dGVDYWxsKHZlcmIsIHBhcmFtZXRlcnMpO1xuICAgICAgcmV0dXJuIHRoaXMuX2FwaURlbGVnYXRlRGlzcGF0Y2hlci5leGVjdXRlKGRvd25ncmFkZVBhcmFtZXRlcnMudmVyYiwgZG93bmdyYWRlUGFyYW1ldGVycy5wYXJhbWV0ZXJzKS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICBjb25zdCB1cGdyYWRlUmVzcG9uc2UgPSB0aGlzLl92ZXJzaW9uQ29udmVydGVyLnVwZ3JhZGVFeGVjdXRlUmV0dXJuKHJlc3BvbnNlLCB2ZXJiLCBwYXJhbWV0ZXJzKTtcbiAgICAgICAgcmV0dXJuIHVwZ3JhZGVSZXNwb25zZTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJOb3RpZmljYXRpb25IYW5kbGVyKGhhbmRsZXI6IE5vdGlmaWNhdGlvbkhhbmRsZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9ub3RpZmljYXRpb25IYW5kbGVycy5wdXNoKGhhbmRsZXIpO1xuICB9XG5cbiAgcHVibGljIHVucmVnaXN0ZXJOb3RpZmljYXRpb25IYW5kbGVyKGhhbmRsZXI6IE5vdGlmaWNhdGlvbkhhbmRsZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9ub3RpZmljYXRpb25IYW5kbGVycyA9IHRoaXMuX25vdGlmaWNhdGlvbkhhbmRsZXJzLmZpbHRlcigoaCkgPT4gaCAhPT0gaGFuZGxlcik7XG4gIH1cbn1cbiIsImV4cG9ydCB7IGRlZmF1bHQgYXMgdjEgfSBmcm9tICcuL3YxLmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdjMgfSBmcm9tICcuL3YzLmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdjQgfSBmcm9tICcuL3Y0LmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdjUgfSBmcm9tICcuL3Y1LmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgTklMIH0gZnJvbSAnLi9uaWwuanMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB2ZXJzaW9uIH0gZnJvbSAnLi92ZXJzaW9uLmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdmFsaWRhdGUgfSBmcm9tICcuL3ZhbGlkYXRlLmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgc3RyaW5naWZ5IH0gZnJvbSAnLi9zdHJpbmdpZnkuanMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBwYXJzZSB9IGZyb20gJy4vcGFyc2UuanMnOyIsIi8qXG4gKiBCcm93c2VyLWNvbXBhdGlibGUgSmF2YVNjcmlwdCBNRDVcbiAqXG4gKiBNb2RpZmljYXRpb24gb2YgSmF2YVNjcmlwdCBNRDVcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ibHVlaW1wL0phdmFTY3JpcHQtTUQ1XG4gKlxuICogQ29weXJpZ2h0IDIwMTEsIFNlYmFzdGlhbiBUc2NoYW5cbiAqIGh0dHBzOi8vYmx1ZWltcC5uZXRcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2U6XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVFxuICpcbiAqIEJhc2VkIG9uXG4gKiBBIEphdmFTY3JpcHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuIE1ENSBNZXNzYWdlXG4gKiBEaWdlc3QgQWxnb3JpdGhtLCBhcyBkZWZpbmVkIGluIFJGQyAxMzIxLlxuICogVmVyc2lvbiAyLjIgQ29weXJpZ2h0IChDKSBQYXVsIEpvaG5zdG9uIDE5OTkgLSAyMDA5XG4gKiBPdGhlciBjb250cmlidXRvcnM6IEdyZWcgSG9sdCwgQW5kcmV3IEtlcGVydCwgWWRuYXIsIExvc3RpbmV0XG4gKiBEaXN0cmlidXRlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2VcbiAqIFNlZSBodHRwOi8vcGFqaG9tZS5vcmcudWsvY3J5cHQvbWQ1IGZvciBtb3JlIGluZm8uXG4gKi9cbmZ1bmN0aW9uIG1kNShieXRlcykge1xuICBpZiAodHlwZW9mIGJ5dGVzID09PSAnc3RyaW5nJykge1xuICAgIHZhciBtc2cgPSB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoYnl0ZXMpKTsgLy8gVVRGOCBlc2NhcGVcblxuICAgIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkobXNnLmxlbmd0aCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1zZy5sZW5ndGg7ICsraSkge1xuICAgICAgYnl0ZXNbaV0gPSBtc2cuY2hhckNvZGVBdChpKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWQ1VG9IZXhFbmNvZGVkQXJyYXkod29yZHNUb01kNShieXRlc1RvV29yZHMoYnl0ZXMpLCBieXRlcy5sZW5ndGggKiA4KSk7XG59XG4vKlxuICogQ29udmVydCBhbiBhcnJheSBvZiBsaXR0bGUtZW5kaWFuIHdvcmRzIHRvIGFuIGFycmF5IG9mIGJ5dGVzXG4gKi9cblxuXG5mdW5jdGlvbiBtZDVUb0hleEVuY29kZWRBcnJheShpbnB1dCkge1xuICB2YXIgb3V0cHV0ID0gW107XG4gIHZhciBsZW5ndGgzMiA9IGlucHV0Lmxlbmd0aCAqIDMyO1xuICB2YXIgaGV4VGFiID0gJzAxMjM0NTY3ODlhYmNkZWYnO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoMzI7IGkgKz0gOCkge1xuICAgIHZhciB4ID0gaW5wdXRbaSA+PiA1XSA+Pj4gaSAlIDMyICYgMHhmZjtcbiAgICB2YXIgaGV4ID0gcGFyc2VJbnQoaGV4VGFiLmNoYXJBdCh4ID4+PiA0ICYgMHgwZikgKyBoZXhUYWIuY2hhckF0KHggJiAweDBmKSwgMTYpO1xuICAgIG91dHB1dC5wdXNoKGhleCk7XG4gIH1cblxuICByZXR1cm4gb3V0cHV0O1xufVxuLyoqXG4gKiBDYWxjdWxhdGUgb3V0cHV0IGxlbmd0aCB3aXRoIHBhZGRpbmcgYW5kIGJpdCBsZW5ndGhcbiAqL1xuXG5cbmZ1bmN0aW9uIGdldE91dHB1dExlbmd0aChpbnB1dExlbmd0aDgpIHtcbiAgcmV0dXJuIChpbnB1dExlbmd0aDggKyA2NCA+Pj4gOSA8PCA0KSArIDE0ICsgMTtcbn1cbi8qXG4gKiBDYWxjdWxhdGUgdGhlIE1ENSBvZiBhbiBhcnJheSBvZiBsaXR0bGUtZW5kaWFuIHdvcmRzLCBhbmQgYSBiaXQgbGVuZ3RoLlxuICovXG5cblxuZnVuY3Rpb24gd29yZHNUb01kNSh4LCBsZW4pIHtcbiAgLyogYXBwZW5kIHBhZGRpbmcgKi9cbiAgeFtsZW4gPj4gNV0gfD0gMHg4MCA8PCBsZW4gJSAzMjtcbiAgeFtnZXRPdXRwdXRMZW5ndGgobGVuKSAtIDFdID0gbGVuO1xuICB2YXIgYSA9IDE3MzI1ODQxOTM7XG4gIHZhciBiID0gLTI3MTczMzg3OTtcbiAgdmFyIGMgPSAtMTczMjU4NDE5NDtcbiAgdmFyIGQgPSAyNzE3MzM4Nzg7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB4Lmxlbmd0aDsgaSArPSAxNikge1xuICAgIHZhciBvbGRhID0gYTtcbiAgICB2YXIgb2xkYiA9IGI7XG4gICAgdmFyIG9sZGMgPSBjO1xuICAgIHZhciBvbGRkID0gZDtcbiAgICBhID0gbWQ1ZmYoYSwgYiwgYywgZCwgeFtpXSwgNywgLTY4MDg3NjkzNik7XG4gICAgZCA9IG1kNWZmKGQsIGEsIGIsIGMsIHhbaSArIDFdLCAxMiwgLTM4OTU2NDU4Nik7XG4gICAgYyA9IG1kNWZmKGMsIGQsIGEsIGIsIHhbaSArIDJdLCAxNywgNjA2MTA1ODE5KTtcbiAgICBiID0gbWQ1ZmYoYiwgYywgZCwgYSwgeFtpICsgM10sIDIyLCAtMTA0NDUyNTMzMCk7XG4gICAgYSA9IG1kNWZmKGEsIGIsIGMsIGQsIHhbaSArIDRdLCA3LCAtMTc2NDE4ODk3KTtcbiAgICBkID0gbWQ1ZmYoZCwgYSwgYiwgYywgeFtpICsgNV0sIDEyLCAxMjAwMDgwNDI2KTtcbiAgICBjID0gbWQ1ZmYoYywgZCwgYSwgYiwgeFtpICsgNl0sIDE3LCAtMTQ3MzIzMTM0MSk7XG4gICAgYiA9IG1kNWZmKGIsIGMsIGQsIGEsIHhbaSArIDddLCAyMiwgLTQ1NzA1OTgzKTtcbiAgICBhID0gbWQ1ZmYoYSwgYiwgYywgZCwgeFtpICsgOF0sIDcsIDE3NzAwMzU0MTYpO1xuICAgIGQgPSBtZDVmZihkLCBhLCBiLCBjLCB4W2kgKyA5XSwgMTIsIC0xOTU4NDE0NDE3KTtcbiAgICBjID0gbWQ1ZmYoYywgZCwgYSwgYiwgeFtpICsgMTBdLCAxNywgLTQyMDYzKTtcbiAgICBiID0gbWQ1ZmYoYiwgYywgZCwgYSwgeFtpICsgMTFdLCAyMiwgLTE5OTA0MDQxNjIpO1xuICAgIGEgPSBtZDVmZihhLCBiLCBjLCBkLCB4W2kgKyAxMl0sIDcsIDE4MDQ2MDM2ODIpO1xuICAgIGQgPSBtZDVmZihkLCBhLCBiLCBjLCB4W2kgKyAxM10sIDEyLCAtNDAzNDExMDEpO1xuICAgIGMgPSBtZDVmZihjLCBkLCBhLCBiLCB4W2kgKyAxNF0sIDE3LCAtMTUwMjAwMjI5MCk7XG4gICAgYiA9IG1kNWZmKGIsIGMsIGQsIGEsIHhbaSArIDE1XSwgMjIsIDEyMzY1MzUzMjkpO1xuICAgIGEgPSBtZDVnZyhhLCBiLCBjLCBkLCB4W2kgKyAxXSwgNSwgLTE2NTc5NjUxMCk7XG4gICAgZCA9IG1kNWdnKGQsIGEsIGIsIGMsIHhbaSArIDZdLCA5LCAtMTA2OTUwMTYzMik7XG4gICAgYyA9IG1kNWdnKGMsIGQsIGEsIGIsIHhbaSArIDExXSwgMTQsIDY0MzcxNzcxMyk7XG4gICAgYiA9IG1kNWdnKGIsIGMsIGQsIGEsIHhbaV0sIDIwLCAtMzczODk3MzAyKTtcbiAgICBhID0gbWQ1Z2coYSwgYiwgYywgZCwgeFtpICsgNV0sIDUsIC03MDE1NTg2OTEpO1xuICAgIGQgPSBtZDVnZyhkLCBhLCBiLCBjLCB4W2kgKyAxMF0sIDksIDM4MDE2MDgzKTtcbiAgICBjID0gbWQ1Z2coYywgZCwgYSwgYiwgeFtpICsgMTVdLCAxNCwgLTY2MDQ3ODMzNSk7XG4gICAgYiA9IG1kNWdnKGIsIGMsIGQsIGEsIHhbaSArIDRdLCAyMCwgLTQwNTUzNzg0OCk7XG4gICAgYSA9IG1kNWdnKGEsIGIsIGMsIGQsIHhbaSArIDldLCA1LCA1Njg0NDY0MzgpO1xuICAgIGQgPSBtZDVnZyhkLCBhLCBiLCBjLCB4W2kgKyAxNF0sIDksIC0xMDE5ODAzNjkwKTtcbiAgICBjID0gbWQ1Z2coYywgZCwgYSwgYiwgeFtpICsgM10sIDE0LCAtMTg3MzYzOTYxKTtcbiAgICBiID0gbWQ1Z2coYiwgYywgZCwgYSwgeFtpICsgOF0sIDIwLCAxMTYzNTMxNTAxKTtcbiAgICBhID0gbWQ1Z2coYSwgYiwgYywgZCwgeFtpICsgMTNdLCA1LCAtMTQ0NDY4MTQ2Nyk7XG4gICAgZCA9IG1kNWdnKGQsIGEsIGIsIGMsIHhbaSArIDJdLCA5LCAtNTE0MDM3ODQpO1xuICAgIGMgPSBtZDVnZyhjLCBkLCBhLCBiLCB4W2kgKyA3XSwgMTQsIDE3MzUzMjg0NzMpO1xuICAgIGIgPSBtZDVnZyhiLCBjLCBkLCBhLCB4W2kgKyAxMl0sIDIwLCAtMTkyNjYwNzczNCk7XG4gICAgYSA9IG1kNWhoKGEsIGIsIGMsIGQsIHhbaSArIDVdLCA0LCAtMzc4NTU4KTtcbiAgICBkID0gbWQ1aGgoZCwgYSwgYiwgYywgeFtpICsgOF0sIDExLCAtMjAyMjU3NDQ2Myk7XG4gICAgYyA9IG1kNWhoKGMsIGQsIGEsIGIsIHhbaSArIDExXSwgMTYsIDE4MzkwMzA1NjIpO1xuICAgIGIgPSBtZDVoaChiLCBjLCBkLCBhLCB4W2kgKyAxNF0sIDIzLCAtMzUzMDk1NTYpO1xuICAgIGEgPSBtZDVoaChhLCBiLCBjLCBkLCB4W2kgKyAxXSwgNCwgLTE1MzA5OTIwNjApO1xuICAgIGQgPSBtZDVoaChkLCBhLCBiLCBjLCB4W2kgKyA0XSwgMTEsIDEyNzI4OTMzNTMpO1xuICAgIGMgPSBtZDVoaChjLCBkLCBhLCBiLCB4W2kgKyA3XSwgMTYsIC0xNTU0OTc2MzIpO1xuICAgIGIgPSBtZDVoaChiLCBjLCBkLCBhLCB4W2kgKyAxMF0sIDIzLCAtMTA5NDczMDY0MCk7XG4gICAgYSA9IG1kNWhoKGEsIGIsIGMsIGQsIHhbaSArIDEzXSwgNCwgNjgxMjc5MTc0KTtcbiAgICBkID0gbWQ1aGgoZCwgYSwgYiwgYywgeFtpXSwgMTEsIC0zNTg1MzcyMjIpO1xuICAgIGMgPSBtZDVoaChjLCBkLCBhLCBiLCB4W2kgKyAzXSwgMTYsIC03MjI1MjE5NzkpO1xuICAgIGIgPSBtZDVoaChiLCBjLCBkLCBhLCB4W2kgKyA2XSwgMjMsIDc2MDI5MTg5KTtcbiAgICBhID0gbWQ1aGgoYSwgYiwgYywgZCwgeFtpICsgOV0sIDQsIC02NDAzNjQ0ODcpO1xuICAgIGQgPSBtZDVoaChkLCBhLCBiLCBjLCB4W2kgKyAxMl0sIDExLCAtNDIxODE1ODM1KTtcbiAgICBjID0gbWQ1aGgoYywgZCwgYSwgYiwgeFtpICsgMTVdLCAxNiwgNTMwNzQyNTIwKTtcbiAgICBiID0gbWQ1aGgoYiwgYywgZCwgYSwgeFtpICsgMl0sIDIzLCAtOTk1MzM4NjUxKTtcbiAgICBhID0gbWQ1aWkoYSwgYiwgYywgZCwgeFtpXSwgNiwgLTE5ODYzMDg0NCk7XG4gICAgZCA9IG1kNWlpKGQsIGEsIGIsIGMsIHhbaSArIDddLCAxMCwgMTEyNjg5MTQxNSk7XG4gICAgYyA9IG1kNWlpKGMsIGQsIGEsIGIsIHhbaSArIDE0XSwgMTUsIC0xNDE2MzU0OTA1KTtcbiAgICBiID0gbWQ1aWkoYiwgYywgZCwgYSwgeFtpICsgNV0sIDIxLCAtNTc0MzQwNTUpO1xuICAgIGEgPSBtZDVpaShhLCBiLCBjLCBkLCB4W2kgKyAxMl0sIDYsIDE3MDA0ODU1NzEpO1xuICAgIGQgPSBtZDVpaShkLCBhLCBiLCBjLCB4W2kgKyAzXSwgMTAsIC0xODk0OTg2NjA2KTtcbiAgICBjID0gbWQ1aWkoYywgZCwgYSwgYiwgeFtpICsgMTBdLCAxNSwgLTEwNTE1MjMpO1xuICAgIGIgPSBtZDVpaShiLCBjLCBkLCBhLCB4W2kgKyAxXSwgMjEsIC0yMDU0OTIyNzk5KTtcbiAgICBhID0gbWQ1aWkoYSwgYiwgYywgZCwgeFtpICsgOF0sIDYsIDE4NzMzMTMzNTkpO1xuICAgIGQgPSBtZDVpaShkLCBhLCBiLCBjLCB4W2kgKyAxNV0sIDEwLCAtMzA2MTE3NDQpO1xuICAgIGMgPSBtZDVpaShjLCBkLCBhLCBiLCB4W2kgKyA2XSwgMTUsIC0xNTYwMTk4MzgwKTtcbiAgICBiID0gbWQ1aWkoYiwgYywgZCwgYSwgeFtpICsgMTNdLCAyMSwgMTMwOTE1MTY0OSk7XG4gICAgYSA9IG1kNWlpKGEsIGIsIGMsIGQsIHhbaSArIDRdLCA2LCAtMTQ1NTIzMDcwKTtcbiAgICBkID0gbWQ1aWkoZCwgYSwgYiwgYywgeFtpICsgMTFdLCAxMCwgLTExMjAyMTAzNzkpO1xuICAgIGMgPSBtZDVpaShjLCBkLCBhLCBiLCB4W2kgKyAyXSwgMTUsIDcxODc4NzI1OSk7XG4gICAgYiA9IG1kNWlpKGIsIGMsIGQsIGEsIHhbaSArIDldLCAyMSwgLTM0MzQ4NTU1MSk7XG4gICAgYSA9IHNhZmVBZGQoYSwgb2xkYSk7XG4gICAgYiA9IHNhZmVBZGQoYiwgb2xkYik7XG4gICAgYyA9IHNhZmVBZGQoYywgb2xkYyk7XG4gICAgZCA9IHNhZmVBZGQoZCwgb2xkZCk7XG4gIH1cblxuICByZXR1cm4gW2EsIGIsIGMsIGRdO1xufVxuLypcbiAqIENvbnZlcnQgYW4gYXJyYXkgYnl0ZXMgdG8gYW4gYXJyYXkgb2YgbGl0dGxlLWVuZGlhbiB3b3Jkc1xuICogQ2hhcmFjdGVycyA+MjU1IGhhdmUgdGhlaXIgaGlnaC1ieXRlIHNpbGVudGx5IGlnbm9yZWQuXG4gKi9cblxuXG5mdW5jdGlvbiBieXRlc1RvV29yZHMoaW5wdXQpIHtcbiAgaWYgKGlucHV0Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHZhciBsZW5ndGg4ID0gaW5wdXQubGVuZ3RoICogODtcbiAgdmFyIG91dHB1dCA9IG5ldyBVaW50MzJBcnJheShnZXRPdXRwdXRMZW5ndGgobGVuZ3RoOCkpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoODsgaSArPSA4KSB7XG4gICAgb3V0cHV0W2kgPj4gNV0gfD0gKGlucHV0W2kgLyA4XSAmIDB4ZmYpIDw8IGkgJSAzMjtcbiAgfVxuXG4gIHJldHVybiBvdXRwdXQ7XG59XG4vKlxuICogQWRkIGludGVnZXJzLCB3cmFwcGluZyBhdCAyXjMyLiBUaGlzIHVzZXMgMTYtYml0IG9wZXJhdGlvbnMgaW50ZXJuYWxseVxuICogdG8gd29yayBhcm91bmQgYnVncyBpbiBzb21lIEpTIGludGVycHJldGVycy5cbiAqL1xuXG5cbmZ1bmN0aW9uIHNhZmVBZGQoeCwgeSkge1xuICB2YXIgbHN3ID0gKHggJiAweGZmZmYpICsgKHkgJiAweGZmZmYpO1xuICB2YXIgbXN3ID0gKHggPj4gMTYpICsgKHkgPj4gMTYpICsgKGxzdyA+PiAxNik7XG4gIHJldHVybiBtc3cgPDwgMTYgfCBsc3cgJiAweGZmZmY7XG59XG4vKlxuICogQml0d2lzZSByb3RhdGUgYSAzMi1iaXQgbnVtYmVyIHRvIHRoZSBsZWZ0LlxuICovXG5cblxuZnVuY3Rpb24gYml0Um90YXRlTGVmdChudW0sIGNudCkge1xuICByZXR1cm4gbnVtIDw8IGNudCB8IG51bSA+Pj4gMzIgLSBjbnQ7XG59XG4vKlxuICogVGhlc2UgZnVuY3Rpb25zIGltcGxlbWVudCB0aGUgZm91ciBiYXNpYyBvcGVyYXRpb25zIHRoZSBhbGdvcml0aG0gdXNlcy5cbiAqL1xuXG5cbmZ1bmN0aW9uIG1kNWNtbihxLCBhLCBiLCB4LCBzLCB0KSB7XG4gIHJldHVybiBzYWZlQWRkKGJpdFJvdGF0ZUxlZnQoc2FmZUFkZChzYWZlQWRkKGEsIHEpLCBzYWZlQWRkKHgsIHQpKSwgcyksIGIpO1xufVxuXG5mdW5jdGlvbiBtZDVmZihhLCBiLCBjLCBkLCB4LCBzLCB0KSB7XG4gIHJldHVybiBtZDVjbW4oYiAmIGMgfCB+YiAmIGQsIGEsIGIsIHgsIHMsIHQpO1xufVxuXG5mdW5jdGlvbiBtZDVnZyhhLCBiLCBjLCBkLCB4LCBzLCB0KSB7XG4gIHJldHVybiBtZDVjbW4oYiAmIGQgfCBjICYgfmQsIGEsIGIsIHgsIHMsIHQpO1xufVxuXG5mdW5jdGlvbiBtZDVoaChhLCBiLCBjLCBkLCB4LCBzLCB0KSB7XG4gIHJldHVybiBtZDVjbW4oYiBeIGMgXiBkLCBhLCBiLCB4LCBzLCB0KTtcbn1cblxuZnVuY3Rpb24gbWQ1aWkoYSwgYiwgYywgZCwgeCwgcywgdCkge1xuICByZXR1cm4gbWQ1Y21uKGMgXiAoYiB8IH5kKSwgYSwgYiwgeCwgcywgdCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IG1kNTsiLCJleHBvcnQgZGVmYXVsdCAnMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwJzsiLCJpbXBvcnQgdmFsaWRhdGUgZnJvbSAnLi92YWxpZGF0ZS5qcyc7XG5cbmZ1bmN0aW9uIHBhcnNlKHV1aWQpIHtcbiAgaWYgKCF2YWxpZGF0ZSh1dWlkKSkge1xuICAgIHRocm93IFR5cGVFcnJvcignSW52YWxpZCBVVUlEJyk7XG4gIH1cblxuICB2YXIgdjtcbiAgdmFyIGFyciA9IG5ldyBVaW50OEFycmF5KDE2KTsgLy8gUGFyc2UgIyMjIyMjIyMtLi4uLi0uLi4uLS4uLi4tLi4uLi4uLi4uLi4uXG5cbiAgYXJyWzBdID0gKHYgPSBwYXJzZUludCh1dWlkLnNsaWNlKDAsIDgpLCAxNikpID4+PiAyNDtcbiAgYXJyWzFdID0gdiA+Pj4gMTYgJiAweGZmO1xuICBhcnJbMl0gPSB2ID4+PiA4ICYgMHhmZjtcbiAgYXJyWzNdID0gdiAmIDB4ZmY7IC8vIFBhcnNlIC4uLi4uLi4uLSMjIyMtLi4uLi0uLi4uLS4uLi4uLi4uLi4uLlxuXG4gIGFycls0XSA9ICh2ID0gcGFyc2VJbnQodXVpZC5zbGljZSg5LCAxMyksIDE2KSkgPj4+IDg7XG4gIGFycls1XSA9IHYgJiAweGZmOyAvLyBQYXJzZSAuLi4uLi4uLi0uLi4uLSMjIyMtLi4uLi0uLi4uLi4uLi4uLi5cblxuICBhcnJbNl0gPSAodiA9IHBhcnNlSW50KHV1aWQuc2xpY2UoMTQsIDE4KSwgMTYpKSA+Pj4gODtcbiAgYXJyWzddID0gdiAmIDB4ZmY7IC8vIFBhcnNlIC4uLi4uLi4uLS4uLi4tLi4uLi0jIyMjLS4uLi4uLi4uLi4uLlxuXG4gIGFycls4XSA9ICh2ID0gcGFyc2VJbnQodXVpZC5zbGljZSgxOSwgMjMpLCAxNikpID4+PiA4O1xuICBhcnJbOV0gPSB2ICYgMHhmZjsgLy8gUGFyc2UgLi4uLi4uLi4tLi4uLi0uLi4uLS4uLi4tIyMjIyMjIyMjIyMjXG4gIC8vIChVc2UgXCIvXCIgdG8gYXZvaWQgMzItYml0IHRydW5jYXRpb24gd2hlbiBiaXQtc2hpZnRpbmcgaGlnaC1vcmRlciBieXRlcylcblxuICBhcnJbMTBdID0gKHYgPSBwYXJzZUludCh1dWlkLnNsaWNlKDI0LCAzNiksIDE2KSkgLyAweDEwMDAwMDAwMDAwICYgMHhmZjtcbiAgYXJyWzExXSA9IHYgLyAweDEwMDAwMDAwMCAmIDB4ZmY7XG4gIGFyclsxMl0gPSB2ID4+PiAyNCAmIDB4ZmY7XG4gIGFyclsxM10gPSB2ID4+PiAxNiAmIDB4ZmY7XG4gIGFyclsxNF0gPSB2ID4+PiA4ICYgMHhmZjtcbiAgYXJyWzE1XSA9IHYgJiAweGZmO1xuICByZXR1cm4gYXJyO1xufVxuXG5leHBvcnQgZGVmYXVsdCBwYXJzZTsiLCJleHBvcnQgZGVmYXVsdCAvXig/OlswLTlhLWZdezh9LVswLTlhLWZdezR9LVsxLTVdWzAtOWEtZl17M30tWzg5YWJdWzAtOWEtZl17M30tWzAtOWEtZl17MTJ9fDAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCkkL2k7IiwiLy8gVW5pcXVlIElEIGNyZWF0aW9uIHJlcXVpcmVzIGEgaGlnaCBxdWFsaXR5IHJhbmRvbSAjIGdlbmVyYXRvci4gSW4gdGhlIGJyb3dzZXIgd2UgdGhlcmVmb3JlXG4vLyByZXF1aXJlIHRoZSBjcnlwdG8gQVBJIGFuZCBkbyBub3Qgc3VwcG9ydCBidWlsdC1pbiBmYWxsYmFjayB0byBsb3dlciBxdWFsaXR5IHJhbmRvbSBudW1iZXJcbi8vIGdlbmVyYXRvcnMgKGxpa2UgTWF0aC5yYW5kb20oKSkuXG52YXIgZ2V0UmFuZG9tVmFsdWVzO1xudmFyIHJuZHM4ID0gbmV3IFVpbnQ4QXJyYXkoMTYpO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcm5nKCkge1xuICAvLyBsYXp5IGxvYWQgc28gdGhhdCBlbnZpcm9ubWVudHMgdGhhdCBuZWVkIHRvIHBvbHlmaWxsIGhhdmUgYSBjaGFuY2UgdG8gZG8gc29cbiAgaWYgKCFnZXRSYW5kb21WYWx1ZXMpIHtcbiAgICAvLyBnZXRSYW5kb21WYWx1ZXMgbmVlZHMgdG8gYmUgaW52b2tlZCBpbiBhIGNvbnRleHQgd2hlcmUgXCJ0aGlzXCIgaXMgYSBDcnlwdG8gaW1wbGVtZW50YXRpb24uIEFsc28sXG4gICAgLy8gZmluZCB0aGUgY29tcGxldGUgaW1wbGVtZW50YXRpb24gb2YgY3J5cHRvIChtc0NyeXB0bykgb24gSUUxMS5cbiAgICBnZXRSYW5kb21WYWx1ZXMgPSB0eXBlb2YgY3J5cHRvICE9PSAndW5kZWZpbmVkJyAmJiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzICYmIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChjcnlwdG8pIHx8IHR5cGVvZiBtc0NyeXB0byAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcyA9PT0gJ2Z1bmN0aW9uJyAmJiBtc0NyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChtc0NyeXB0byk7XG5cbiAgICBpZiAoIWdldFJhbmRvbVZhbHVlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKCkgbm90IHN1cHBvcnRlZC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS91dWlkanMvdXVpZCNnZXRyYW5kb212YWx1ZXMtbm90LXN1cHBvcnRlZCcpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBnZXRSYW5kb21WYWx1ZXMocm5kczgpO1xufSIsIi8vIEFkYXB0ZWQgZnJvbSBDaHJpcyBWZW5lc3MnIFNIQTEgY29kZSBhdFxuLy8gaHR0cDovL3d3dy5tb3ZhYmxlLXR5cGUuY28udWsvc2NyaXB0cy9zaGExLmh0bWxcbmZ1bmN0aW9uIGYocywgeCwgeSwgeikge1xuICBzd2l0Y2ggKHMpIHtcbiAgICBjYXNlIDA6XG4gICAgICByZXR1cm4geCAmIHkgXiB+eCAmIHo7XG5cbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4geCBeIHkgXiB6O1xuXG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuIHggJiB5IF4geCAmIHogXiB5ICYgejtcblxuICAgIGNhc2UgMzpcbiAgICAgIHJldHVybiB4IF4geSBeIHo7XG4gIH1cbn1cblxuZnVuY3Rpb24gUk9UTCh4LCBuKSB7XG4gIHJldHVybiB4IDw8IG4gfCB4ID4+PiAzMiAtIG47XG59XG5cbmZ1bmN0aW9uIHNoYTEoYnl0ZXMpIHtcbiAgdmFyIEsgPSBbMHg1YTgyNzk5OSwgMHg2ZWQ5ZWJhMSwgMHg4ZjFiYmNkYywgMHhjYTYyYzFkNl07XG4gIHZhciBIID0gWzB4Njc0NTIzMDEsIDB4ZWZjZGFiODksIDB4OThiYWRjZmUsIDB4MTAzMjU0NzYsIDB4YzNkMmUxZjBdO1xuXG4gIGlmICh0eXBlb2YgYnl0ZXMgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFyIG1zZyA9IHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChieXRlcykpOyAvLyBVVEY4IGVzY2FwZVxuXG4gICAgYnl0ZXMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgKytpKSB7XG4gICAgICBieXRlcy5wdXNoKG1zZy5jaGFyQ29kZUF0KGkpKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoIUFycmF5LmlzQXJyYXkoYnl0ZXMpKSB7XG4gICAgLy8gQ29udmVydCBBcnJheS1saWtlIHRvIEFycmF5XG4gICAgYnl0ZXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChieXRlcyk7XG4gIH1cblxuICBieXRlcy5wdXNoKDB4ODApO1xuICB2YXIgbCA9IGJ5dGVzLmxlbmd0aCAvIDQgKyAyO1xuICB2YXIgTiA9IE1hdGguY2VpbChsIC8gMTYpO1xuICB2YXIgTSA9IG5ldyBBcnJheShOKTtcblxuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgTjsgKytfaSkge1xuICAgIHZhciBhcnIgPSBuZXcgVWludDMyQXJyYXkoMTYpO1xuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCAxNjsgKytqKSB7XG4gICAgICBhcnJbal0gPSBieXRlc1tfaSAqIDY0ICsgaiAqIDRdIDw8IDI0IHwgYnl0ZXNbX2kgKiA2NCArIGogKiA0ICsgMV0gPDwgMTYgfCBieXRlc1tfaSAqIDY0ICsgaiAqIDQgKyAyXSA8PCA4IHwgYnl0ZXNbX2kgKiA2NCArIGogKiA0ICsgM107XG4gICAgfVxuXG4gICAgTVtfaV0gPSBhcnI7XG4gIH1cblxuICBNW04gLSAxXVsxNF0gPSAoYnl0ZXMubGVuZ3RoIC0gMSkgKiA4IC8gTWF0aC5wb3coMiwgMzIpO1xuICBNW04gLSAxXVsxNF0gPSBNYXRoLmZsb29yKE1bTiAtIDFdWzE0XSk7XG4gIE1bTiAtIDFdWzE1XSA9IChieXRlcy5sZW5ndGggLSAxKSAqIDggJiAweGZmZmZmZmZmO1xuXG4gIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IE47ICsrX2kyKSB7XG4gICAgdmFyIFcgPSBuZXcgVWludDMyQXJyYXkoODApO1xuXG4gICAgZm9yICh2YXIgdCA9IDA7IHQgPCAxNjsgKyt0KSB7XG4gICAgICBXW3RdID0gTVtfaTJdW3RdO1xuICAgIH1cblxuICAgIGZvciAodmFyIF90ID0gMTY7IF90IDwgODA7ICsrX3QpIHtcbiAgICAgIFdbX3RdID0gUk9UTChXW190IC0gM10gXiBXW190IC0gOF0gXiBXW190IC0gMTRdIF4gV1tfdCAtIDE2XSwgMSk7XG4gICAgfVxuXG4gICAgdmFyIGEgPSBIWzBdO1xuICAgIHZhciBiID0gSFsxXTtcbiAgICB2YXIgYyA9IEhbMl07XG4gICAgdmFyIGQgPSBIWzNdO1xuICAgIHZhciBlID0gSFs0XTtcblxuICAgIGZvciAodmFyIF90MiA9IDA7IF90MiA8IDgwOyArK190Mikge1xuICAgICAgdmFyIHMgPSBNYXRoLmZsb29yKF90MiAvIDIwKTtcbiAgICAgIHZhciBUID0gUk9UTChhLCA1KSArIGYocywgYiwgYywgZCkgKyBlICsgS1tzXSArIFdbX3QyXSA+Pj4gMDtcbiAgICAgIGUgPSBkO1xuICAgICAgZCA9IGM7XG4gICAgICBjID0gUk9UTChiLCAzMCkgPj4+IDA7XG4gICAgICBiID0gYTtcbiAgICAgIGEgPSBUO1xuICAgIH1cblxuICAgIEhbMF0gPSBIWzBdICsgYSA+Pj4gMDtcbiAgICBIWzFdID0gSFsxXSArIGIgPj4+IDA7XG4gICAgSFsyXSA9IEhbMl0gKyBjID4+PiAwO1xuICAgIEhbM10gPSBIWzNdICsgZCA+Pj4gMDtcbiAgICBIWzRdID0gSFs0XSArIGUgPj4+IDA7XG4gIH1cblxuICByZXR1cm4gW0hbMF0gPj4gMjQgJiAweGZmLCBIWzBdID4+IDE2ICYgMHhmZiwgSFswXSA+PiA4ICYgMHhmZiwgSFswXSAmIDB4ZmYsIEhbMV0gPj4gMjQgJiAweGZmLCBIWzFdID4+IDE2ICYgMHhmZiwgSFsxXSA+PiA4ICYgMHhmZiwgSFsxXSAmIDB4ZmYsIEhbMl0gPj4gMjQgJiAweGZmLCBIWzJdID4+IDE2ICYgMHhmZiwgSFsyXSA+PiA4ICYgMHhmZiwgSFsyXSAmIDB4ZmYsIEhbM10gPj4gMjQgJiAweGZmLCBIWzNdID4+IDE2ICYgMHhmZiwgSFszXSA+PiA4ICYgMHhmZiwgSFszXSAmIDB4ZmYsIEhbNF0gPj4gMjQgJiAweGZmLCBIWzRdID4+IDE2ICYgMHhmZiwgSFs0XSA+PiA4ICYgMHhmZiwgSFs0XSAmIDB4ZmZdO1xufVxuXG5leHBvcnQgZGVmYXVsdCBzaGExOyIsImltcG9ydCB2YWxpZGF0ZSBmcm9tICcuL3ZhbGlkYXRlLmpzJztcbi8qKlxuICogQ29udmVydCBhcnJheSBvZiAxNiBieXRlIHZhbHVlcyB0byBVVUlEIHN0cmluZyBmb3JtYXQgb2YgdGhlIGZvcm06XG4gKiBYWFhYWFhYWC1YWFhYLVhYWFgtWFhYWC1YWFhYWFhYWFhYWFhcbiAqL1xuXG52YXIgYnl0ZVRvSGV4ID0gW107XG5cbmZvciAodmFyIGkgPSAwOyBpIDwgMjU2OyArK2kpIHtcbiAgYnl0ZVRvSGV4LnB1c2goKGkgKyAweDEwMCkudG9TdHJpbmcoMTYpLnN1YnN0cigxKSk7XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeShhcnIpIHtcbiAgdmFyIG9mZnNldCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMDtcbiAgLy8gTm90ZTogQmUgY2FyZWZ1bCBlZGl0aW5nIHRoaXMgY29kZSEgIEl0J3MgYmVlbiB0dW5lZCBmb3IgcGVyZm9ybWFuY2VcbiAgLy8gYW5kIHdvcmtzIGluIHdheXMgeW91IG1heSBub3QgZXhwZWN0LiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3V1aWRqcy91dWlkL3B1bGwvNDM0XG4gIHZhciB1dWlkID0gKGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDJdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgM11dICsgJy0nICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA0XV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDVdXSArICctJyArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgNl1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA3XV0gKyAnLScgKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDhdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgOV1dICsgJy0nICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxMF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxMV1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxMl1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxM11dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxNF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxNV1dKS50b0xvd2VyQ2FzZSgpOyAvLyBDb25zaXN0ZW5jeSBjaGVjayBmb3IgdmFsaWQgVVVJRC4gIElmIHRoaXMgdGhyb3dzLCBpdCdzIGxpa2VseSBkdWUgdG8gb25lXG4gIC8vIG9mIHRoZSBmb2xsb3dpbmc6XG4gIC8vIC0gT25lIG9yIG1vcmUgaW5wdXQgYXJyYXkgdmFsdWVzIGRvbid0IG1hcCB0byBhIGhleCBvY3RldCAobGVhZGluZyB0b1xuICAvLyBcInVuZGVmaW5lZFwiIGluIHRoZSB1dWlkKVxuICAvLyAtIEludmFsaWQgaW5wdXQgdmFsdWVzIGZvciB0aGUgUkZDIGB2ZXJzaW9uYCBvciBgdmFyaWFudGAgZmllbGRzXG5cbiAgaWYgKCF2YWxpZGF0ZSh1dWlkKSkge1xuICAgIHRocm93IFR5cGVFcnJvcignU3RyaW5naWZpZWQgVVVJRCBpcyBpbnZhbGlkJyk7XG4gIH1cblxuICByZXR1cm4gdXVpZDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgc3RyaW5naWZ5OyIsImltcG9ydCBybmcgZnJvbSAnLi9ybmcuanMnO1xuaW1wb3J0IHN0cmluZ2lmeSBmcm9tICcuL3N0cmluZ2lmeS5qcyc7IC8vICoqYHYxKClgIC0gR2VuZXJhdGUgdGltZS1iYXNlZCBVVUlEKipcbi8vXG4vLyBJbnNwaXJlZCBieSBodHRwczovL2dpdGh1Yi5jb20vTGlvc0svVVVJRC5qc1xuLy8gYW5kIGh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvbGlicmFyeS91dWlkLmh0bWxcblxudmFyIF9ub2RlSWQ7XG5cbnZhciBfY2xvY2tzZXE7IC8vIFByZXZpb3VzIHV1aWQgY3JlYXRpb24gdGltZVxuXG5cbnZhciBfbGFzdE1TZWNzID0gMDtcbnZhciBfbGFzdE5TZWNzID0gMDsgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS91dWlkanMvdXVpZCBmb3IgQVBJIGRldGFpbHNcblxuZnVuY3Rpb24gdjEob3B0aW9ucywgYnVmLCBvZmZzZXQpIHtcbiAgdmFyIGkgPSBidWYgJiYgb2Zmc2V0IHx8IDA7XG4gIHZhciBiID0gYnVmIHx8IG5ldyBBcnJheSgxNik7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgbm9kZSA9IG9wdGlvbnMubm9kZSB8fCBfbm9kZUlkO1xuICB2YXIgY2xvY2tzZXEgPSBvcHRpb25zLmNsb2Nrc2VxICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmNsb2Nrc2VxIDogX2Nsb2Nrc2VxOyAvLyBub2RlIGFuZCBjbG9ja3NlcSBuZWVkIHRvIGJlIGluaXRpYWxpemVkIHRvIHJhbmRvbSB2YWx1ZXMgaWYgdGhleSdyZSBub3RcbiAgLy8gc3BlY2lmaWVkLiAgV2UgZG8gdGhpcyBsYXppbHkgdG8gbWluaW1pemUgaXNzdWVzIHJlbGF0ZWQgdG8gaW5zdWZmaWNpZW50XG4gIC8vIHN5c3RlbSBlbnRyb3B5LiAgU2VlICMxODlcblxuICBpZiAobm9kZSA9PSBudWxsIHx8IGNsb2Nrc2VxID09IG51bGwpIHtcbiAgICB2YXIgc2VlZEJ5dGVzID0gb3B0aW9ucy5yYW5kb20gfHwgKG9wdGlvbnMucm5nIHx8IHJuZykoKTtcblxuICAgIGlmIChub2RlID09IG51bGwpIHtcbiAgICAgIC8vIFBlciA0LjUsIGNyZWF0ZSBhbmQgNDgtYml0IG5vZGUgaWQsICg0NyByYW5kb20gYml0cyArIG11bHRpY2FzdCBiaXQgPSAxKVxuICAgICAgbm9kZSA9IF9ub2RlSWQgPSBbc2VlZEJ5dGVzWzBdIHwgMHgwMSwgc2VlZEJ5dGVzWzFdLCBzZWVkQnl0ZXNbMl0sIHNlZWRCeXRlc1szXSwgc2VlZEJ5dGVzWzRdLCBzZWVkQnl0ZXNbNV1dO1xuICAgIH1cblxuICAgIGlmIChjbG9ja3NlcSA9PSBudWxsKSB7XG4gICAgICAvLyBQZXIgNC4yLjIsIHJhbmRvbWl6ZSAoMTQgYml0KSBjbG9ja3NlcVxuICAgICAgY2xvY2tzZXEgPSBfY2xvY2tzZXEgPSAoc2VlZEJ5dGVzWzZdIDw8IDggfCBzZWVkQnl0ZXNbN10pICYgMHgzZmZmO1xuICAgIH1cbiAgfSAvLyBVVUlEIHRpbWVzdGFtcHMgYXJlIDEwMCBuYW5vLXNlY29uZCB1bml0cyBzaW5jZSB0aGUgR3JlZ29yaWFuIGVwb2NoLFxuICAvLyAoMTU4Mi0xMC0xNSAwMDowMCkuICBKU051bWJlcnMgYXJlbid0IHByZWNpc2UgZW5vdWdoIGZvciB0aGlzLCBzb1xuICAvLyB0aW1lIGlzIGhhbmRsZWQgaW50ZXJuYWxseSBhcyAnbXNlY3MnIChpbnRlZ2VyIG1pbGxpc2Vjb25kcykgYW5kICduc2VjcydcbiAgLy8gKDEwMC1uYW5vc2Vjb25kcyBvZmZzZXQgZnJvbSBtc2Vjcykgc2luY2UgdW5peCBlcG9jaCwgMTk3MC0wMS0wMSAwMDowMC5cblxuXG4gIHZhciBtc2VjcyA9IG9wdGlvbnMubXNlY3MgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMubXNlY3MgOiBEYXRlLm5vdygpOyAvLyBQZXIgNC4yLjEuMiwgdXNlIGNvdW50IG9mIHV1aWQncyBnZW5lcmF0ZWQgZHVyaW5nIHRoZSBjdXJyZW50IGNsb2NrXG4gIC8vIGN5Y2xlIHRvIHNpbXVsYXRlIGhpZ2hlciByZXNvbHV0aW9uIGNsb2NrXG5cbiAgdmFyIG5zZWNzID0gb3B0aW9ucy5uc2VjcyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5uc2VjcyA6IF9sYXN0TlNlY3MgKyAxOyAvLyBUaW1lIHNpbmNlIGxhc3QgdXVpZCBjcmVhdGlvbiAoaW4gbXNlY3MpXG5cbiAgdmFyIGR0ID0gbXNlY3MgLSBfbGFzdE1TZWNzICsgKG5zZWNzIC0gX2xhc3ROU2VjcykgLyAxMDAwMDsgLy8gUGVyIDQuMi4xLjIsIEJ1bXAgY2xvY2tzZXEgb24gY2xvY2sgcmVncmVzc2lvblxuXG4gIGlmIChkdCA8IDAgJiYgb3B0aW9ucy5jbG9ja3NlcSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY2xvY2tzZXEgPSBjbG9ja3NlcSArIDEgJiAweDNmZmY7XG4gIH0gLy8gUmVzZXQgbnNlY3MgaWYgY2xvY2sgcmVncmVzc2VzIChuZXcgY2xvY2tzZXEpIG9yIHdlJ3ZlIG1vdmVkIG9udG8gYSBuZXdcbiAgLy8gdGltZSBpbnRlcnZhbFxuXG5cbiAgaWYgKChkdCA8IDAgfHwgbXNlY3MgPiBfbGFzdE1TZWNzKSAmJiBvcHRpb25zLm5zZWNzID09PSB1bmRlZmluZWQpIHtcbiAgICBuc2VjcyA9IDA7XG4gIH0gLy8gUGVyIDQuMi4xLjIgVGhyb3cgZXJyb3IgaWYgdG9vIG1hbnkgdXVpZHMgYXJlIHJlcXVlc3RlZFxuXG5cbiAgaWYgKG5zZWNzID49IDEwMDAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwidXVpZC52MSgpOiBDYW4ndCBjcmVhdGUgbW9yZSB0aGFuIDEwTSB1dWlkcy9zZWNcIik7XG4gIH1cblxuICBfbGFzdE1TZWNzID0gbXNlY3M7XG4gIF9sYXN0TlNlY3MgPSBuc2VjcztcbiAgX2Nsb2Nrc2VxID0gY2xvY2tzZXE7IC8vIFBlciA0LjEuNCAtIENvbnZlcnQgZnJvbSB1bml4IGVwb2NoIHRvIEdyZWdvcmlhbiBlcG9jaFxuXG4gIG1zZWNzICs9IDEyMjE5MjkyODAwMDAwOyAvLyBgdGltZV9sb3dgXG5cbiAgdmFyIHRsID0gKChtc2VjcyAmIDB4ZmZmZmZmZikgKiAxMDAwMCArIG5zZWNzKSAlIDB4MTAwMDAwMDAwO1xuICBiW2krK10gPSB0bCA+Pj4gMjQgJiAweGZmO1xuICBiW2krK10gPSB0bCA+Pj4gMTYgJiAweGZmO1xuICBiW2krK10gPSB0bCA+Pj4gOCAmIDB4ZmY7XG4gIGJbaSsrXSA9IHRsICYgMHhmZjsgLy8gYHRpbWVfbWlkYFxuXG4gIHZhciB0bWggPSBtc2VjcyAvIDB4MTAwMDAwMDAwICogMTAwMDAgJiAweGZmZmZmZmY7XG4gIGJbaSsrXSA9IHRtaCA+Pj4gOCAmIDB4ZmY7XG4gIGJbaSsrXSA9IHRtaCAmIDB4ZmY7IC8vIGB0aW1lX2hpZ2hfYW5kX3ZlcnNpb25gXG5cbiAgYltpKytdID0gdG1oID4+PiAyNCAmIDB4ZiB8IDB4MTA7IC8vIGluY2x1ZGUgdmVyc2lvblxuXG4gIGJbaSsrXSA9IHRtaCA+Pj4gMTYgJiAweGZmOyAvLyBgY2xvY2tfc2VxX2hpX2FuZF9yZXNlcnZlZGAgKFBlciA0LjIuMiAtIGluY2x1ZGUgdmFyaWFudClcblxuICBiW2krK10gPSBjbG9ja3NlcSA+Pj4gOCB8IDB4ODA7IC8vIGBjbG9ja19zZXFfbG93YFxuXG4gIGJbaSsrXSA9IGNsb2Nrc2VxICYgMHhmZjsgLy8gYG5vZGVgXG5cbiAgZm9yICh2YXIgbiA9IDA7IG4gPCA2OyArK24pIHtcbiAgICBiW2kgKyBuXSA9IG5vZGVbbl07XG4gIH1cblxuICByZXR1cm4gYnVmIHx8IHN0cmluZ2lmeShiKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdjE7IiwiaW1wb3J0IHYzNSBmcm9tICcuL3YzNS5qcyc7XG5pbXBvcnQgbWQ1IGZyb20gJy4vbWQ1LmpzJztcbnZhciB2MyA9IHYzNSgndjMnLCAweDMwLCBtZDUpO1xuZXhwb3J0IGRlZmF1bHQgdjM7IiwiaW1wb3J0IHN0cmluZ2lmeSBmcm9tICcuL3N0cmluZ2lmeS5qcyc7XG5pbXBvcnQgcGFyc2UgZnJvbSAnLi9wYXJzZS5qcyc7XG5cbmZ1bmN0aW9uIHN0cmluZ1RvQnl0ZXMoc3RyKSB7XG4gIHN0ciA9IHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChzdHIpKTsgLy8gVVRGOCBlc2NhcGVcblxuICB2YXIgYnl0ZXMgPSBbXTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgIGJ5dGVzLnB1c2goc3RyLmNoYXJDb2RlQXQoaSkpO1xuICB9XG5cbiAgcmV0dXJuIGJ5dGVzO1xufVxuXG5leHBvcnQgdmFyIEROUyA9ICc2YmE3YjgxMC05ZGFkLTExZDEtODBiNC0wMGMwNGZkNDMwYzgnO1xuZXhwb3J0IHZhciBVUkwgPSAnNmJhN2I4MTEtOWRhZC0xMWQxLTgwYjQtMDBjMDRmZDQzMGM4JztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChuYW1lLCB2ZXJzaW9uLCBoYXNoZnVuYykge1xuICBmdW5jdGlvbiBnZW5lcmF0ZVVVSUQodmFsdWUsIG5hbWVzcGFjZSwgYnVmLCBvZmZzZXQpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgdmFsdWUgPSBzdHJpbmdUb0J5dGVzKHZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG5hbWVzcGFjZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIG5hbWVzcGFjZSA9IHBhcnNlKG5hbWVzcGFjZSk7XG4gICAgfVxuXG4gICAgaWYgKG5hbWVzcGFjZS5sZW5ndGggIT09IDE2KSB7XG4gICAgICB0aHJvdyBUeXBlRXJyb3IoJ05hbWVzcGFjZSBtdXN0IGJlIGFycmF5LWxpa2UgKDE2IGl0ZXJhYmxlIGludGVnZXIgdmFsdWVzLCAwLTI1NSknKTtcbiAgICB9IC8vIENvbXB1dGUgaGFzaCBvZiBuYW1lc3BhY2UgYW5kIHZhbHVlLCBQZXIgNC4zXG4gICAgLy8gRnV0dXJlOiBVc2Ugc3ByZWFkIHN5bnRheCB3aGVuIHN1cHBvcnRlZCBvbiBhbGwgcGxhdGZvcm1zLCBlLmcuIGBieXRlcyA9XG4gICAgLy8gaGFzaGZ1bmMoWy4uLm5hbWVzcGFjZSwgLi4uIHZhbHVlXSlgXG5cblxuICAgIHZhciBieXRlcyA9IG5ldyBVaW50OEFycmF5KDE2ICsgdmFsdWUubGVuZ3RoKTtcbiAgICBieXRlcy5zZXQobmFtZXNwYWNlKTtcbiAgICBieXRlcy5zZXQodmFsdWUsIG5hbWVzcGFjZS5sZW5ndGgpO1xuICAgIGJ5dGVzID0gaGFzaGZ1bmMoYnl0ZXMpO1xuICAgIGJ5dGVzWzZdID0gYnl0ZXNbNl0gJiAweDBmIHwgdmVyc2lvbjtcbiAgICBieXRlc1s4XSA9IGJ5dGVzWzhdICYgMHgzZiB8IDB4ODA7XG5cbiAgICBpZiAoYnVmKSB7XG4gICAgICBvZmZzZXQgPSBvZmZzZXQgfHwgMDtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAxNjsgKytpKSB7XG4gICAgICAgIGJ1ZltvZmZzZXQgKyBpXSA9IGJ5dGVzW2ldO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYnVmO1xuICAgIH1cblxuICAgIHJldHVybiBzdHJpbmdpZnkoYnl0ZXMpO1xuICB9IC8vIEZ1bmN0aW9uI25hbWUgaXMgbm90IHNldHRhYmxlIG9uIHNvbWUgcGxhdGZvcm1zICgjMjcwKVxuXG5cbiAgdHJ5IHtcbiAgICBnZW5lcmF0ZVVVSUQubmFtZSA9IG5hbWU7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1lbXB0eVxuICB9IGNhdGNoIChlcnIpIHt9IC8vIEZvciBDb21tb25KUyBkZWZhdWx0IGV4cG9ydCBzdXBwb3J0XG5cblxuICBnZW5lcmF0ZVVVSUQuRE5TID0gRE5TO1xuICBnZW5lcmF0ZVVVSUQuVVJMID0gVVJMO1xuICByZXR1cm4gZ2VuZXJhdGVVVUlEO1xufSIsImltcG9ydCBybmcgZnJvbSAnLi9ybmcuanMnO1xuaW1wb3J0IHN0cmluZ2lmeSBmcm9tICcuL3N0cmluZ2lmeS5qcyc7XG5cbmZ1bmN0aW9uIHY0KG9wdGlvbnMsIGJ1Ziwgb2Zmc2V0KSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgcm5kcyA9IG9wdGlvbnMucmFuZG9tIHx8IChvcHRpb25zLnJuZyB8fCBybmcpKCk7IC8vIFBlciA0LjQsIHNldCBiaXRzIGZvciB2ZXJzaW9uIGFuZCBgY2xvY2tfc2VxX2hpX2FuZF9yZXNlcnZlZGBcblxuICBybmRzWzZdID0gcm5kc1s2XSAmIDB4MGYgfCAweDQwO1xuICBybmRzWzhdID0gcm5kc1s4XSAmIDB4M2YgfCAweDgwOyAvLyBDb3B5IGJ5dGVzIHRvIGJ1ZmZlciwgaWYgcHJvdmlkZWRcblxuICBpZiAoYnVmKSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHx8IDA7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDE2OyArK2kpIHtcbiAgICAgIGJ1ZltvZmZzZXQgKyBpXSA9IHJuZHNbaV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1ZjtcbiAgfVxuXG4gIHJldHVybiBzdHJpbmdpZnkocm5kcyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHY0OyIsImltcG9ydCB2MzUgZnJvbSAnLi92MzUuanMnO1xuaW1wb3J0IHNoYTEgZnJvbSAnLi9zaGExLmpzJztcbnZhciB2NSA9IHYzNSgndjUnLCAweDUwLCBzaGExKTtcbmV4cG9ydCBkZWZhdWx0IHY1OyIsImltcG9ydCBSRUdFWCBmcm9tICcuL3JlZ2V4LmpzJztcblxuZnVuY3Rpb24gdmFsaWRhdGUodXVpZCkge1xuICByZXR1cm4gdHlwZW9mIHV1aWQgPT09ICdzdHJpbmcnICYmIFJFR0VYLnRlc3QodXVpZCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHZhbGlkYXRlOyIsImltcG9ydCB2YWxpZGF0ZSBmcm9tICcuL3ZhbGlkYXRlLmpzJztcblxuZnVuY3Rpb24gdmVyc2lvbih1dWlkKSB7XG4gIGlmICghdmFsaWRhdGUodXVpZCkpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ0ludmFsaWQgVVVJRCcpO1xuICB9XG5cbiAgcmV0dXJuIHBhcnNlSW50KHV1aWQuc3Vic3RyKDE0LCAxKSwgMTYpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB2ZXJzaW9uOyIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiLyoqXG4gKiBUaGlzIGlzIHlvdXIgbWFpbi4gVGhpcyBpcyB3aGVyZSB5b3UgcmUtZXhwb3J0IGV2ZXJ5dGhpbmcgeW91IHdhbnQgdG8gYmUgcHVibGljbHkgYXZhaWxhYmxlLlxuICpcbiAqIFRoZSBidWlsZCBlbmZvcmNlcyB0aGF0IHRoZSBmaWxlIGhhcyB0aGUgc2FtZSBuYW1lIGFzIHRoZSBnbG9iYWwgdmFyaWFibGUgdGhhdCBpcyBleHBvcnRlZC5cbiAqL1xuXG5pbXBvcnQgeyBBcGlWZXJzaW9uIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5cbi8vIER1ZSB0byB0aGUgd2F5IHdlIGNvbmZpZ3VyZWQgd2VicGFjaywgd2Ugc2hvdWxkIGJlIGV4cG9ydGluZyB0aGluZ3Mgd2hpY2ggd2lsbCBiZSB1bmRlclxuLy8gYSBnbG9iYWwgdmFyaWFibGUgY2FsbGVkIFwidGFibGVhdVwiLiBFeHBvcnQgZXZlcnl0aGluZyB3ZSB3YW50IHRvIGJlIHZpc2libGUgdW5kZXIgdGFibGVhdVxuLy8gZnJvbSB0aGlzIGZpbGUuXG5pbXBvcnQgeyBFeHRlbnNpb25zSW1wbCB9IGZyb20gJy4vRXh0ZW5zaW9uc0FwaS9JbXBsL0V4dGVuc2lvbnNJbXBsJztcbmltcG9ydCB7IEV4dGVuc2lvbnMgfSBmcm9tICcuL0V4dGVuc2lvbnNBcGkvTmFtZXNwYWNlcy9FeHRlbnNpb25zJztcblxuZGVjbGFyZSBsZXQgVkVSU0lPTl9JU19BTFBIQTogYm9vbGVhbjtcbmNvbnN0IGlzQWxwaGE6IGJvb2xlYW4gPSB0eXBlb2YgVkVSU0lPTl9JU19BTFBIQSAhPT0gJ3VuZGVmaW5lZCcgPyBWRVJTSU9OX0lTX0FMUEhBIDogZmFsc2U7XG5cbmRlY2xhcmUgbGV0IEFQSV9WRVJTSU9OX05VTUJFUjogc3RyaW5nO1xuQXBpVmVyc2lvbi5TZXRWZXJzaW9uTnVtYmVyKHR5cGVvZiBBUElfVkVSU0lPTl9OVU1CRVIgIT09ICd1bmRlZmluZWQnID8gQVBJX1ZFUlNJT05fTlVNQkVSIDogJzAuMC4wJywgaXNBbHBoYSk7XG5cbmNvbnN0IGV4dGVuc2lvbkltcGwgPSBuZXcgRXh0ZW5zaW9uc0ltcGwoKTtcbmV4cG9ydCBjb25zdCBleHRlbnNpb25zID0gbmV3IEV4dGVuc2lvbnMoZXh0ZW5zaW9uSW1wbCk7XG5cbi8vIEV4cG9ydCBFbnVtc1xuLy8gVGhlc2Ugc2hvdyB1cCB1bmRlciB0aGUgdGFibGVhdSBvYmplY3QuIEkuZS4gdGFibGVhdS5FeHRlbnNpb25Db250ZXh0LlNlcnZlclxuZXhwb3J0IHtcbiAgQW5hbHl0aWNzT2JqZWN0VHlwZSxcbiAgQW5ub3RhdGlvblR5cGUsXG4gIENsYXNzTmFtZUtleSxcbiAgQ29sdW1uVHlwZSxcbiAgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlLFxuICBEYXNoYm9hcmRPYmplY3RUeXBlLFxuICBEYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5VHlwZSxcbiAgRGF0YVR5cGUsXG4gIERhdGVSYW5nZVR5cGUsXG4gIERpYWxvZ1N0eWxlLFxuICBFbmNvZGluZ1R5cGUsXG4gIEVycm9yQ29kZXMsXG4gIEV4dGVuc2lvbkNvbnRleHQsXG4gIEV4dGVuc2lvbk1vZGUsXG4gIEZpZWxkQWdncmVnYXRpb25UeXBlLFxuICBGaWVsZFJvbGVUeXBlLFxuICBGaWx0ZXJEb21haW5UeXBlLFxuICBGaWx0ZXJOdWxsT3B0aW9uLFxuICBGaWx0ZXJUeXBlLFxuICBGaWx0ZXJVcGRhdGVUeXBlLFxuICBIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlLFxuICBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgTWFya1R5cGUsXG4gIFBhcmFtZXRlclZhbHVlVHlwZSxcbiAgUGVyaW9kVHlwZSxcbiAgUXVpY2tUYWJsZUNhbGNUeXBlLFxuICBSZWxhdGl2ZURhdGVGaWx0ZXJPcHRpb25zLFxuICBSZXBsYXlTcGVlZFR5cGUsXG4gIFNlbGVjdGlvblVwZGF0ZVR5cGUsXG4gIFNlbGVjdE9wdGlvbnMsXG4gIFNoZWV0VHlwZSxcbiAgU29ydERpcmVjdGlvbixcbiAgVGFibGVhdUV2ZW50VHlwZSxcbiAgVHJlbmRMaW5lTW9kZWxUeXBlLFxuICBWaXpJbWFnZUVuY29kaW5nVHlwZSxcbiAgVml6SW1hZ2VQYWxldHRlVHlwZSxcbiAgVml6SW1hZ2VTaXplU2V0dGluZ0FsaWdubWVudFR5cGUsXG4gIFZpekltYWdlU2l6ZVNldHRpbmdUeXBlLFxuICBWaXpJbWFnZVNvcnREaXJlY3Rpb25UeXBlLFxuICBab25lVmlzaWJpbGl0eVR5cGUsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file diff --git a/lib/tableau.extensions.1.latest.min.js b/lib/tableau.extensions.1.latest.min.js index 877a210..d267ad3 100644 --- a/lib/tableau.extensions.1.latest.min.js +++ b/lib/tableau.extensions.1.latest.min.js @@ -1,2 +1,2 @@ -(()=>{var e={3e3:(e,t,r)=>{r(5092);var n=r(7880);e.exports=n("Array","find")},8315:(e,t,r)=>{r(8504),r(5684);var n=r(340);e.exports=n.Array.from},80:(e,t,r)=>{r(3924),r(472),r(7912),r(8504);var n=r(340);e.exports=n.Map},5668:(e,t,r)=>{r(1300);var n=r(340);e.exports=n.Number.isInteger},5816:(e,t,r)=>{r(3656);var n=r(340);e.exports=n.Number.isNaN},3680:(e,t,r)=>{r(6544);var n=r(340);e.exports=n.Number.parseFloat},9308:(e,t,r)=>{r(7972);var n=r(340);e.exports=n.Number.parseInt},8824:(e,t,r)=>{r(6368);var n=r(340);e.exports=n.Object.assign},8512:(e,t,r)=>{r(8292);var n=r(340);e.exports=n.Object.entries},9232:(e,t,r)=>{r(920);var n=r(340);e.exports=n.Object.setPrototypeOf},9336:(e,t,r)=>{r(6140),r(3924),r(7912),r(7448),r(3936),r(5428),r(1517),r(8504);var n=r(340);e.exports=n.Promise},1381:(e,t,r)=>{var n=r(1600),i=r(984),o=r(1532),a=n.TypeError;e.exports=function(e){if(i(e))return e;throw a(o(e)+" is not a function")}},6372:(e,t,r)=>{var n=r(1600),i=r(5220),o=r(1532),a=n.TypeError;e.exports=function(e){if(i(e))return e;throw a(o(e)+" is not a constructor")}},4040:(e,t,r)=>{var n=r(1600),i=r(984),o=n.String,a=n.TypeError;e.exports=function(e){if("object"==typeof e||i(e))return e;throw a("Can't set "+o(e)+" as a prototype")}},5868:(e,t,r)=>{var n=r(3668),i=r(124),o=r(7072),a=n("unscopables"),s=Array.prototype;null==s[a]&&o.f(s,a,{configurable:!0,value:i(null)}),e.exports=function(e){s[a][e]=!0}},2932:(e,t,r)=>{var n=r(1600),i=r(2408),o=n.TypeError;e.exports=function(e,t){if(i(t,e))return e;throw o("Incorrect invocation")}},3736:(e,t,r)=>{var n=r(1600),i=r(9952),o=n.String,a=n.TypeError;e.exports=function(e){if(i(e))return e;throw a(o(e)+" is not an object")}},8208:(e,t,r)=>{"use strict";var n=r(1600),i=r(5616),o=r(3032),a=r(3848),s=r(3140),u=r(4064),l=r(5220),c=r(9183),p=r(4135),d=r(4944),f=r(8132),h=n.Array;e.exports=function(e){var t=a(e),r=l(this),n=arguments.length,y=n>1?arguments[1]:void 0,m=void 0!==y;m&&(y=i(y,n>2?arguments[2]:void 0));var g,v,b,I,S,T,_=f(t),P=0;if(!_||this==h&&u(_))for(g=c(t),v=r?new this(g):h(g);g>P;P++)T=m?y(t[P],P):t[P],p(v,P,T);else for(S=(I=d(t,_)).next,v=r?new this:[];!(b=o(S,I)).done;P++)T=m?s(I,y,[b.value,P],!0):b.value,p(v,P,T);return v.length=P,v}},6024:(e,t,r)=>{var n=r(3068),i=r(7920),o=r(9183),a=function(e){return function(t,r,a){var s,u=n(t),l=o(u),c=i(a,l);if(e&&r!=r){for(;l>c;)if((s=u[c++])!=s)return!0}else for(;l>c;c++)if((e||c in u)&&u[c]===r)return e||c||0;return!e&&-1}};e.exports={includes:a(!0),indexOf:a(!1)}},9560:(e,t,r)=>{var n=r(5616),i=r(604),o=r(3188),a=r(3848),s=r(9183),u=r(1220),l=i([].push),c=function(e){var t=1==e,r=2==e,i=3==e,c=4==e,p=6==e,d=7==e,f=5==e||p;return function(h,y,m,g){for(var v,b,I=a(h),S=o(I),T=n(y,m),_=s(S),P=0,A=g||u,E=t?A(h,_):r||d?A(h,0):void 0;_>P;P++)if((f||P in S)&&(b=T(v=S[P],P,I),e))if(t)E[P]=b;else if(b)switch(e){case 3:return!0;case 5:return v;case 6:return P;case 2:l(E,v)}else switch(e){case 4:return!1;case 7:l(E,v)}return p?-1:i||c?c:E}};e.exports={forEach:c(0),map:c(1),filter:c(2),some:c(3),every:c(4),find:c(5),findIndex:c(6),filterReject:c(7)}},6100:(e,t,r)=>{var n=r(604);e.exports=n([].slice)},4096:(e,t,r)=>{var n=r(1600),i=r(5240),o=r(5220),a=r(9952),s=r(3668)("species"),u=n.Array;e.exports=function(e){var t;return i(e)&&(t=e.constructor,(o(t)&&(t===u||i(t.prototype))||a(t)&&null===(t=t[s]))&&(t=void 0)),void 0===t?u:t}},1220:(e,t,r)=>{var n=r(4096);e.exports=function(e,t){return new(n(e))(0===t?0:t)}},3140:(e,t,r)=>{var n=r(3736),i=r(1792);e.exports=function(e,t,r,o){try{return o?t(n(r)[0],r[1]):t(r)}catch(t){i(e,"throw",t)}}},6344:(e,t,r)=>{var n=r(3668)("iterator"),i=!1;try{var o=0,a={next:function(){return{done:!!o++}},return:function(){i=!0}};a[n]=function(){return this},Array.from(a,(function(){throw 2}))}catch(e){}e.exports=function(e,t){if(!t&&!i)return!1;var r=!1;try{var o={};o[n]=function(){return{next:function(){return{done:r=!0}}}},e(o)}catch(e){}return r}},4108:(e,t,r)=>{var n=r(604),i=n({}.toString),o=n("".slice);e.exports=function(e){return o(i(e),8,-1)}},1248:(e,t,r)=>{var n=r(1600),i=r(7796),o=r(984),a=r(4108),s=r(3668)("toStringTag"),u=n.Object,l="Arguments"==a(function(){return arguments}());e.exports=i?a:function(e){var t,r,n;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(r=function(e,t){try{return e[t]}catch(e){}}(t=u(e),s))?r:l?a(t):"Object"==(n=a(t))&&o(t.callee)?"Arguments":n}},5032:(e,t,r)=>{var n=r(604),i=r(6100),o=n("".replace),a=n("".split),s=n([].join),u=String(Error("zxcasd").stack),l=/\n\s*at [^:]*:[^\n]*/,c=l.test(u),p=/@[^\n]*\n/.test(u)&&!/zxcasd/.test(u);e.exports=function(e,t){if("string"!=typeof e)return e;if(c)for(;t--;)e=o(e,l,"");else if(p)return s(i(a(e,"\n"),t),"\n");return e}},9920:(e,t,r)=>{"use strict";var n=r(7072).f,i=r(124),o=r(7431),a=r(5616),s=r(2932),u=r(9928),l=r(2648),c=r(9688),p=r(2828),d=r(8756).fastKey,f=r(7932),h=f.set,y=f.getterFor;e.exports={getConstructor:function(e,t,r,l){var c=e((function(e,n){s(e,f),h(e,{type:t,index:i(null),first:void 0,last:void 0,size:0}),p||(e.size=0),null!=n&&u(n,e[l],{that:e,AS_ENTRIES:r})})),f=c.prototype,m=y(t),g=function(e,t,r){var n,i,o=m(e),a=v(e,t);return a?a.value=r:(o.last=a={index:i=d(t,!0),key:t,value:r,previous:n=o.last,next:void 0,removed:!1},o.first||(o.first=a),n&&(n.next=a),p?o.size++:e.size++,"F"!==i&&(o.index[i]=a)),e},v=function(e,t){var r,n=m(e),i=d(t);if("F"!==i)return n.index[i];for(r=n.first;r;r=r.next)if(r.key==t)return r};return o(f,{clear:function(){for(var e=m(this),t=e.index,r=e.first;r;)r.removed=!0,r.previous&&(r.previous=r.previous.next=void 0),delete t[r.index],r=r.next;e.first=e.last=void 0,p?e.size=0:this.size=0},delete:function(e){var t=this,r=m(t),n=v(t,e);if(n){var i=n.next,o=n.previous;delete r.index[n.index],n.removed=!0,o&&(o.next=i),i&&(i.previous=o),r.first==n&&(r.first=i),r.last==n&&(r.last=o),p?r.size--:t.size--}return!!n},forEach:function(e){for(var t,r=m(this),n=a(e,arguments.length>1?arguments[1]:void 0);t=t?t.next:r.first;)for(n(t.value,t.key,this);t&&t.removed;)t=t.previous},has:function(e){return!!v(this,e)}}),o(f,r?{get:function(e){var t=v(this,e);return t&&t.value},set:function(e,t){return g(this,0===e?0:e,t)}}:{add:function(e){return g(this,e=0===e?0:e,e)}}),p&&n(f,"size",{get:function(){return m(this).size}}),c},setStrong:function(e,t,r){var n=t+" Iterator",i=y(t),o=y(n);l(e,t,(function(e,t){h(this,{type:n,target:e,state:i(e),kind:t,last:void 0})}),(function(){for(var e=o(this),t=e.kind,r=e.last;r&&r.removed;)r=r.previous;return e.target&&(e.last=r=r?r.next:e.state.first)?"keys"==t?{value:r.key,done:!1}:"values"==t?{value:r.value,done:!1}:{value:[r.key,r.value],done:!1}:(e.target=void 0,{value:void 0,done:!0})}),r?"entries":"values",!r,!0),c(t)}}},6064:(e,t,r)=>{"use strict";var n=r(7248),i=r(1600),o=r(604),a=r(4232),s=r(5028),u=r(8756),l=r(9928),c=r(2932),p=r(984),d=r(9952),f=r(7004),h=r(6344),y=r(9540),m=r(7692);e.exports=function(e,t,r){var g=-1!==e.indexOf("Map"),v=-1!==e.indexOf("Weak"),b=g?"set":"add",I=i[e],S=I&&I.prototype,T=I,_={},P=function(e){var t=o(S[e]);s(S,e,"add"==e?function(e){return t(this,0===e?0:e),this}:"delete"==e?function(e){return!(v&&!d(e))&&t(this,0===e?0:e)}:"get"==e?function(e){return v&&!d(e)?void 0:t(this,0===e?0:e)}:"has"==e?function(e){return!(v&&!d(e))&&t(this,0===e?0:e)}:function(e,r){return t(this,0===e?0:e,r),this})};if(a(e,!p(I)||!(v||S.forEach&&!f((function(){(new I).entries().next()})))))T=r.getConstructor(t,e,g,b),u.enable();else if(a(e,!0)){var A=new T,E=A[b](v?{}:-0,1)!=A,w=f((function(){A.has(1)})),D=h((function(e){new I(e)})),O=!v&&f((function(){for(var e=new I,t=5;t--;)e[b](t,t);return!e.has(-0)}));D||((T=t((function(e,t){c(e,S);var r=m(new I,e,T);return null!=t&&l(t,r[b],{that:r,AS_ENTRIES:g}),r}))).prototype=S,S.constructor=T),(w||O)&&(P("delete"),P("has"),g&&P("get")),(O||E)&&P(b),v&&S.clear&&delete S.clear}return _[e]=T,n({global:!0,forced:T!=I},_),y(T,e),v||r.setStrong(T,e,g),T}},4640:(e,t,r)=>{var n=r(9180),i=r(4092),o=r(2920),a=r(7072);e.exports=function(e,t){for(var r=i(t),s=a.f,u=o.f,l=0;l{var n=r(7004);e.exports=!n((function(){function e(){}return e.prototype.constructor=null,Object.getPrototypeOf(new e)!==e.prototype}))},9292:(e,t,r)=>{"use strict";var n=r(804).IteratorPrototype,i=r(124),o=r(364),a=r(9540),s=r(2204),u=function(){return this};e.exports=function(e,t,r){var l=t+" Iterator";return e.prototype=i(n,{next:o(1,r)}),a(e,l,!1,!0),s[l]=u,e}},4768:(e,t,r)=>{var n=r(2828),i=r(7072),o=r(364);e.exports=n?function(e,t,r){return i.f(e,t,o(1,r))}:function(e,t,r){return e[t]=r,e}},364:e=>{e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},4135:(e,t,r)=>{"use strict";var n=r(4061),i=r(7072),o=r(364);e.exports=function(e,t,r){var a=n(t);a in e?i.f(e,a,o(0,r)):e[a]=r}},2648:(e,t,r)=>{"use strict";var n=r(7248),i=r(3032),o=r(7408),a=r(8492),s=r(984),u=r(9292),l=r(6232),c=r(3440),p=r(9540),d=r(4768),f=r(5028),h=r(3668),y=r(2204),m=r(804),g=a.PROPER,v=a.CONFIGURABLE,b=m.IteratorPrototype,I=m.BUGGY_SAFARI_ITERATORS,S=h("iterator"),T="keys",_="values",P="entries",A=function(){return this};e.exports=function(e,t,r,a,h,m,E){u(r,t,a);var w,D,O,x=function(e){if(e===h&&N)return N;if(!I&&e in k)return k[e];switch(e){case T:case _:case P:return function(){return new r(this,e)}}return function(){return new r(this)}},F=t+" Iterator",C=!1,k=e.prototype,M=k[S]||k["@@iterator"]||h&&k[h],N=!I&&M||x(h),R="Array"==t&&k.entries||M;if(R&&(w=l(R.call(new e)))!==Object.prototype&&w.next&&(o||l(w)===b||(c?c(w,b):s(w[S])||f(w,S,A)),p(w,F,!0,!0),o&&(y[F]=A)),g&&h==_&&M&&M.name!==_&&(!o&&v?d(k,"name",_):(C=!0,N=function(){return i(M,this)})),h)if(D={values:x(_),keys:m?N:x(T),entries:x(P)},E)for(O in D)(I||C||!(O in k))&&f(k,O,D[O]);else n({target:t,proto:!0,forced:I||C},D);return o&&!E||k[S]===N||f(k,S,N,{name:h}),y[t]=N,D}},2828:(e,t,r)=>{var n=r(7004);e.exports=!n((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},7300:(e,t,r)=>{var n=r(1600),i=r(9952),o=n.document,a=i(o)&&i(o.createElement);e.exports=function(e){return a?o.createElement(e):{}}},4532:e=>{e.exports="object"==typeof window},264:(e,t,r)=>{var n=r(5316),i=r(1600);e.exports=/ipad|iphone|ipod/i.test(n)&&void 0!==i.Pebble},1588:(e,t,r)=>{var n=r(5316);e.exports=/(?:ipad|iphone|ipod).*applewebkit/i.test(n)},3640:(e,t,r)=>{var n=r(4108),i=r(1600);e.exports="process"==n(i.process)},7888:(e,t,r)=>{var n=r(5316);e.exports=/web0s(?!.*chrome)/i.test(n)},5316:(e,t,r)=>{var n=r(6532);e.exports=n("navigator","userAgent")||""},2592:(e,t,r)=>{var n,i,o=r(1600),a=r(5316),s=o.process,u=o.Deno,l=s&&s.versions||u&&u.version,c=l&&l.v8;c&&(i=(n=c.split("."))[0]>0&&n[0]<4?1:+(n[0]+n[1])),!i&&a&&(!(n=a.match(/Edge\/(\d+)/))||n[1]>=74)&&(n=a.match(/Chrome\/(\d+)/))&&(i=+n[1]),e.exports=i},7880:(e,t,r)=>{var n=r(1600),i=r(604);e.exports=function(e,t){return i(n[e].prototype[t])}},8675:e=>{e.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},4464:(e,t,r)=>{var n=r(7004),i=r(364);e.exports=!n((function(){var e=Error("a");return!("stack"in e)||(Object.defineProperty(e,"stack",i(1,7)),7!==e.stack)}))},7248:(e,t,r)=>{var n=r(1600),i=r(2920).f,o=r(4768),a=r(5028),s=r(2984),u=r(4640),l=r(4232);e.exports=function(e,t){var r,c,p,d,f,h=e.target,y=e.global,m=e.stat;if(r=y?n:m?n[h]||s(h,{}):(n[h]||{}).prototype)for(c in t){if(d=t[c],p=e.noTargetGet?(f=i(r,c))&&f.value:r[c],!l(y?c:h+(m?".":"#")+c,e.forced)&&void 0!==p){if(typeof d==typeof p)continue;u(d,p)}(e.sham||p&&p.sham)&&o(d,"sham",!0),a(r,c,d,e)}}},7004:e=>{e.exports=function(e){try{return!!e()}catch(e){return!0}}},1748:(e,t,r)=>{var n=r(7004);e.exports=!n((function(){return Object.isExtensible(Object.preventExtensions({}))}))},9756:e=>{var t=Function.prototype,r=t.apply,n=t.bind,i=t.call;e.exports="object"==typeof Reflect&&Reflect.apply||(n?i.bind(r):function(){return i.apply(r,arguments)})},5616:(e,t,r)=>{var n=r(604),i=r(1381),o=n(n.bind);e.exports=function(e,t){return i(e),void 0===t?e:o?o(e,t):function(){return e.apply(t,arguments)}}},3032:e=>{var t=Function.prototype.call;e.exports=t.bind?t.bind(t):function(){return t.apply(t,arguments)}},8492:(e,t,r)=>{var n=r(2828),i=r(9180),o=Function.prototype,a=n&&Object.getOwnPropertyDescriptor,s=i(o,"name"),u=s&&"something"===function(){}.name,l=s&&(!n||n&&a(o,"name").configurable);e.exports={EXISTS:s,PROPER:u,CONFIGURABLE:l}},604:e=>{var t=Function.prototype,r=t.bind,n=t.call,i=r&&r.bind(n);e.exports=r?function(e){return e&&i(n,e)}:function(e){return e&&function(){return n.apply(e,arguments)}}},6532:(e,t,r)=>{var n=r(1600),i=r(984);e.exports=function(e,t){return arguments.length<2?(r=n[e],i(r)?r:void 0):n[e]&&n[e][t];var r}},8132:(e,t,r)=>{var n=r(1248),i=r(8808),o=r(2204),a=r(3668)("iterator");e.exports=function(e){if(null!=e)return i(e,a)||i(e,"@@iterator")||o[n(e)]}},4944:(e,t,r)=>{var n=r(1600),i=r(3032),o=r(1381),a=r(3736),s=r(1532),u=r(8132),l=n.TypeError;e.exports=function(e,t){var r=arguments.length<2?u(e):t;if(o(r))return a(i(r,e));throw l(s(e)+" is not iterable")}},8808:(e,t,r)=>{var n=r(1381);e.exports=function(e,t){var r=e[t];return null==r?void 0:n(r)}},1600:(e,t,r)=>{var n=function(e){return e&&e.Math==Math&&e};e.exports=n("object"==typeof globalThis&&globalThis)||n("object"==typeof window&&window)||n("object"==typeof self&&self)||n("object"==typeof r.g&&r.g)||function(){return this}()||Function("return this")()},9180:(e,t,r)=>{var n=r(604),i=r(3848),o=n({}.hasOwnProperty);e.exports=Object.hasOwn||function(e,t){return o(i(e),t)}},6632:e=>{e.exports={}},5651:(e,t,r)=>{var n=r(1600);e.exports=function(e,t){var r=n.console;r&&r.error&&(1==arguments.length?r.error(e):r.error(e,t))}},2960:(e,t,r)=>{var n=r(6532);e.exports=n("document","documentElement")},2339:(e,t,r)=>{var n=r(2828),i=r(7004),o=r(7300);e.exports=!n&&!i((function(){return 7!=Object.defineProperty(o("div"),"a",{get:function(){return 7}}).a}))},3188:(e,t,r)=>{var n=r(1600),i=r(604),o=r(7004),a=r(4108),s=n.Object,u=i("".split);e.exports=o((function(){return!s("z").propertyIsEnumerable(0)}))?function(e){return"String"==a(e)?u(e,""):s(e)}:s},7692:(e,t,r)=>{var n=r(984),i=r(9952),o=r(3440);e.exports=function(e,t,r){var a,s;return o&&n(a=t.constructor)&&a!==r&&i(s=a.prototype)&&s!==r.prototype&&o(e,s),e}},1727:(e,t,r)=>{var n=r(604),i=r(984),o=r(6376),a=n(Function.toString);i(o.inspectSource)||(o.inspectSource=function(e){return a(e)}),e.exports=o.inspectSource},7660:(e,t,r)=>{var n=r(9952),i=r(4768);e.exports=function(e,t){n(t)&&"cause"in t&&i(e,"cause",t.cause)}},8756:(e,t,r)=>{var n=r(7248),i=r(604),o=r(6632),a=r(9952),s=r(9180),u=r(7072).f,l=r(4880),c=r(7316),p=r(6536),d=r(1748),f=!1,h=p("meta"),y=0,m=Object.isExtensible||function(){return!0},g=function(e){u(e,h,{value:{objectID:"O"+y++,weakData:{}}})},v=e.exports={enable:function(){v.enable=function(){},f=!0;var e=l.f,t=i([].splice),r={};r[h]=1,e(r).length&&(l.f=function(r){for(var n=e(r),i=0,o=n.length;i{var n,i,o,a=r(8736),s=r(1600),u=r(604),l=r(9952),c=r(4768),p=r(9180),d=r(6376),f=r(280),h=r(6632),y="Object already initialized",m=s.TypeError,g=s.WeakMap;if(a||d.state){var v=d.state||(d.state=new g),b=u(v.get),I=u(v.has),S=u(v.set);n=function(e,t){if(I(v,e))throw new m(y);return t.facade=e,S(v,e,t),t},i=function(e){return b(v,e)||{}},o=function(e){return I(v,e)}}else{var T=f("state");h[T]=!0,n=function(e,t){if(p(e,T))throw new m(y);return t.facade=e,c(e,T,t),t},i=function(e){return p(e,T)?e[T]:{}},o=function(e){return p(e,T)}}e.exports={set:n,get:i,has:o,enforce:function(e){return o(e)?i(e):n(e,{})},getterFor:function(e){return function(t){var r;if(!l(t)||(r=i(t)).type!==e)throw m("Incompatible receiver, "+e+" required");return r}}}},4064:(e,t,r)=>{var n=r(3668),i=r(2204),o=n("iterator"),a=Array.prototype;e.exports=function(e){return void 0!==e&&(i.Array===e||a[o]===e)}},5240:(e,t,r)=>{var n=r(4108);e.exports=Array.isArray||function(e){return"Array"==n(e)}},984:e=>{e.exports=function(e){return"function"==typeof e}},5220:(e,t,r)=>{var n=r(604),i=r(7004),o=r(984),a=r(1248),s=r(6532),u=r(1727),l=function(){},c=[],p=s("Reflect","construct"),d=/^\s*(?:class|function)\b/,f=n(d.exec),h=!d.exec(l),y=function(e){if(!o(e))return!1;try{return p(l,c,e),!0}catch(e){return!1}};e.exports=!p||i((function(){var e;return y(y.call)||!y(Object)||!y((function(){e=!0}))||e}))?function(e){if(!o(e))return!1;switch(a(e)){case"AsyncFunction":case"GeneratorFunction":case"AsyncGeneratorFunction":return!1}return h||!!f(d,u(e))}:y},4232:(e,t,r)=>{var n=r(7004),i=r(984),o=/#|\.prototype\./,a=function(e,t){var r=u[s(e)];return r==c||r!=l&&(i(t)?n(t):!!t)},s=a.normalize=function(e){return String(e).replace(o,".").toLowerCase()},u=a.data={},l=a.NATIVE="N",c=a.POLYFILL="P";e.exports=a},992:(e,t,r)=>{var n=r(9952),i=Math.floor;e.exports=Number.isInteger||function(e){return!n(e)&&isFinite(e)&&i(e)===e}},9952:(e,t,r)=>{var n=r(984);e.exports=function(e){return"object"==typeof e?null!==e:n(e)}},7408:e=>{e.exports=!1},1836:(e,t,r)=>{var n=r(1600),i=r(6532),o=r(984),a=r(2408),s=r(7216),u=n.Object;e.exports=s?function(e){return"symbol"==typeof e}:function(e){var t=i("Symbol");return o(t)&&a(t.prototype,u(e))}},9928:(e,t,r)=>{var n=r(1600),i=r(5616),o=r(3032),a=r(3736),s=r(1532),u=r(4064),l=r(9183),c=r(2408),p=r(4944),d=r(8132),f=r(1792),h=n.TypeError,y=function(e,t){this.stopped=e,this.result=t},m=y.prototype;e.exports=function(e,t,r){var n,g,v,b,I,S,T,_=r&&r.that,P=!(!r||!r.AS_ENTRIES),A=!(!r||!r.IS_ITERATOR),E=!(!r||!r.INTERRUPTED),w=i(t,_),D=function(e){return n&&f(n,"normal",e),new y(!0,e)},O=function(e){return P?(a(e),E?w(e[0],e[1],D):w(e[0],e[1])):E?w(e,D):w(e)};if(A)n=e;else{if(!(g=d(e)))throw h(s(e)+" is not iterable");if(u(g)){for(v=0,b=l(e);b>v;v++)if((I=O(e[v]))&&c(m,I))return I;return new y(!1)}n=p(e,g)}for(S=n.next;!(T=o(S,n)).done;){try{I=O(T.value)}catch(e){f(n,"throw",e)}if("object"==typeof I&&I&&c(m,I))return I}return new y(!1)}},1792:(e,t,r)=>{var n=r(3032),i=r(3736),o=r(8808);e.exports=function(e,t,r){var a,s;i(e);try{if(!(a=o(e,"return"))){if("throw"===t)throw r;return r}a=n(a,e)}catch(e){s=!0,a=e}if("throw"===t)throw r;if(s)throw a;return i(a),r}},804:(e,t,r)=>{"use strict";var n,i,o,a=r(7004),s=r(984),u=r(124),l=r(6232),c=r(5028),p=r(3668),d=r(7408),f=p("iterator"),h=!1;[].keys&&("next"in(o=[].keys())?(i=l(l(o)))!==Object.prototype&&(n=i):h=!0),null==n||a((function(){var e={};return n[f].call(e)!==e}))?n={}:d&&(n=u(n)),s(n[f])||c(n,f,(function(){return this})),e.exports={IteratorPrototype:n,BUGGY_SAFARI_ITERATORS:h}},2204:e=>{e.exports={}},9183:(e,t,r)=>{var n=r(1868);e.exports=function(e){return n(e.length)}},3104:(e,t,r)=>{var n,i,o,a,s,u,l,c,p=r(1600),d=r(5616),f=r(2920).f,h=r(5952).set,y=r(1588),m=r(264),g=r(7888),v=r(3640),b=p.MutationObserver||p.WebKitMutationObserver,I=p.document,S=p.process,T=p.Promise,_=f(p,"queueMicrotask"),P=_&&_.value;P||(n=function(){var e,t;for(v&&(e=S.domain)&&e.exit();i;){t=i.fn,i=i.next;try{t()}catch(e){throw i?a():o=void 0,e}}o=void 0,e&&e.enter()},y||v||g||!b||!I?!m&&T&&T.resolve?((l=T.resolve(void 0)).constructor=T,c=d(l.then,l),a=function(){c(n)}):v?a=function(){S.nextTick(n)}:(h=d(h,p),a=function(){h(n)}):(s=!0,u=I.createTextNode(""),new b(n).observe(u,{characterData:!0}),a=function(){u.data=s=!s})),e.exports=P||function(e){var t={fn:e,next:void 0};o&&(o.next=t),i||(i=t,a()),o=t}},3459:(e,t,r)=>{var n=r(1600);e.exports=n.Promise},3880:(e,t,r)=>{var n=r(2592),i=r(7004);e.exports=!!Object.getOwnPropertySymbols&&!i((function(){var e=Symbol();return!String(e)||!(Object(e)instanceof Symbol)||!Symbol.sham&&n&&n<41}))},8736:(e,t,r)=>{var n=r(1600),i=r(984),o=r(1727),a=n.WeakMap;e.exports=i(a)&&/native code/.test(o(a))},8071:(e,t,r)=>{"use strict";var n=r(1381),i=function(e){var t,r;this.promise=new e((function(e,n){if(void 0!==t||void 0!==r)throw TypeError("Bad Promise constructor");t=e,r=n})),this.resolve=n(t),this.reject=n(r)};e.exports.f=function(e){return new i(e)}},5744:(e,t,r)=>{var n=r(748);e.exports=function(e,t){return void 0===e?arguments.length<2?"":t:n(e)}},6016:(e,t,r)=>{var n=r(1600),i=r(7004),o=r(604),a=r(748),s=r(1688).trim,u=r(5320),l=o("".charAt),c=n.parseFloat,p=n.Symbol,d=p&&p.iterator,f=1/c(u+"-0")!=-1/0||d&&!i((function(){c(Object(d))}));e.exports=f?function(e){var t=s(a(e)),r=c(t);return 0===r&&"-"==l(t,0)?-0:r}:c},6556:(e,t,r)=>{var n=r(1600),i=r(7004),o=r(604),a=r(748),s=r(1688).trim,u=r(5320),l=n.parseInt,c=n.Symbol,p=c&&c.iterator,d=/^[+-]?0x/i,f=o(d.exec),h=8!==l(u+"08")||22!==l(u+"0x16")||p&&!i((function(){l(Object(p))}));e.exports=h?function(e,t){var r=s(a(e));return l(r,t>>>0||(f(d,r)?16:10))}:l},6984:(e,t,r)=>{"use strict";var n=r(2828),i=r(604),o=r(3032),a=r(7004),s=r(9880),u=r(2128),l=r(5988),c=r(3848),p=r(3188),d=Object.assign,f=Object.defineProperty,h=i([].concat);e.exports=!d||a((function(){if(n&&1!==d({b:1},d(f({},"a",{enumerable:!0,get:function(){f(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var e={},t={},r=Symbol(),i="abcdefghijklmnopqrst";return e[r]=7,i.split("").forEach((function(e){t[e]=e})),7!=d({},e)[r]||s(d({},t)).join("")!=i}))?function(e,t){for(var r=c(e),i=arguments.length,a=1,d=u.f,f=l.f;i>a;)for(var y,m=p(arguments[a++]),g=d?h(s(m),d(m)):s(m),v=g.length,b=0;v>b;)y=g[b++],n&&!o(f,m,y)||(r[y]=m[y]);return r}:d},124:(e,t,r)=>{var n,i=r(3736),o=r(1904),a=r(8675),s=r(6632),u=r(2960),l=r(7300),c=r(280),p="prototype",d="script",f=c("IE_PROTO"),h=function(){},y=function(e){return"<"+d+">"+e+""},m=function(e){e.write(y("")),e.close();var t=e.parentWindow.Object;return e=null,t},g=function(){try{n=new ActiveXObject("htmlfile")}catch(e){}var e,t,r;g="undefined"!=typeof document?document.domain&&n?m(n):(t=l("iframe"),r="java"+d+":",t.style.display="none",u.appendChild(t),t.src=String(r),(e=t.contentWindow.document).open(),e.write(y("document.F=Object")),e.close(),e.F):m(n);for(var i=a.length;i--;)delete g[p][a[i]];return g()};s[f]=!0,e.exports=Object.create||function(e,t){var r;return null!==e?(h[p]=i(e),r=new h,h[p]=null,r[f]=e):r=g(),void 0===t?r:o(r,t)}},1904:(e,t,r)=>{var n=r(2828),i=r(7072),o=r(3736),a=r(3068),s=r(9880);e.exports=n?Object.defineProperties:function(e,t){o(e);for(var r,n=a(t),u=s(t),l=u.length,c=0;l>c;)i.f(e,r=u[c++],n[r]);return e}},7072:(e,t,r)=>{var n=r(1600),i=r(2828),o=r(2339),a=r(3736),s=r(4061),u=n.TypeError,l=Object.defineProperty;t.f=i?l:function(e,t,r){if(a(e),t=s(t),a(r),o)try{return l(e,t,r)}catch(e){}if("get"in r||"set"in r)throw u("Accessors not supported");return"value"in r&&(e[t]=r.value),e}},2920:(e,t,r)=>{var n=r(2828),i=r(3032),o=r(5988),a=r(364),s=r(3068),u=r(4061),l=r(9180),c=r(2339),p=Object.getOwnPropertyDescriptor;t.f=n?p:function(e,t){if(e=s(e),t=u(t),c)try{return p(e,t)}catch(e){}if(l(e,t))return a(!i(o.f,e,t),e[t])}},7316:(e,t,r)=>{var n=r(4108),i=r(3068),o=r(4880).f,a=r(6100),s="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];e.exports.f=function(e){return s&&"Window"==n(e)?function(e){try{return o(e)}catch(e){return a(s)}}(e):o(i(e))}},4880:(e,t,r)=>{var n=r(9912),i=r(8675).concat("length","prototype");t.f=Object.getOwnPropertyNames||function(e){return n(e,i)}},2128:(e,t)=>{t.f=Object.getOwnPropertySymbols},6232:(e,t,r)=>{var n=r(1600),i=r(9180),o=r(984),a=r(3848),s=r(280),u=r(1040),l=s("IE_PROTO"),c=n.Object,p=c.prototype;e.exports=u?c.getPrototypeOf:function(e){var t=a(e);if(i(t,l))return t[l];var r=t.constructor;return o(r)&&t instanceof r?r.prototype:t instanceof c?p:null}},2408:(e,t,r)=>{var n=r(604);e.exports=n({}.isPrototypeOf)},9912:(e,t,r)=>{var n=r(604),i=r(9180),o=r(3068),a=r(6024).indexOf,s=r(6632),u=n([].push);e.exports=function(e,t){var r,n=o(e),l=0,c=[];for(r in n)!i(s,r)&&i(n,r)&&u(c,r);for(;t.length>l;)i(n,r=t[l++])&&(~a(c,r)||u(c,r));return c}},9880:(e,t,r)=>{var n=r(9912),i=r(8675);e.exports=Object.keys||function(e){return n(e,i)}},5988:(e,t)=>{"use strict";var r={}.propertyIsEnumerable,n=Object.getOwnPropertyDescriptor,i=n&&!r.call({1:2},1);t.f=i?function(e){var t=n(this,e);return!!t&&t.enumerable}:r},3440:(e,t,r)=>{var n=r(604),i=r(3736),o=r(4040);e.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var e,t=!1,r={};try{(e=n(Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set))(r,[]),t=r instanceof Array}catch(e){}return function(r,n){return i(r),o(n),t?e(r,n):r.__proto__=n,r}}():void 0)},5556:(e,t,r)=>{var n=r(2828),i=r(604),o=r(9880),a=r(3068),s=i(r(5988).f),u=i([].push),l=function(e){return function(t){for(var r,i=a(t),l=o(i),c=l.length,p=0,d=[];c>p;)r=l[p++],n&&!s(i,r)||u(d,e?[r,i[r]]:i[r]);return d}};e.exports={entries:l(!0),values:l(!1)}},2816:(e,t,r)=>{"use strict";var n=r(7796),i=r(1248);e.exports=n?{}.toString:function(){return"[object "+i(this)+"]"}},7540:(e,t,r)=>{var n=r(1600),i=r(3032),o=r(984),a=r(9952),s=n.TypeError;e.exports=function(e,t){var r,n;if("string"===t&&o(r=e.toString)&&!a(n=i(r,e)))return n;if(o(r=e.valueOf)&&!a(n=i(r,e)))return n;if("string"!==t&&o(r=e.toString)&&!a(n=i(r,e)))return n;throw s("Can't convert object to primitive value")}},4092:(e,t,r)=>{var n=r(6532),i=r(604),o=r(4880),a=r(2128),s=r(3736),u=i([].concat);e.exports=n("Reflect","ownKeys")||function(e){var t=o.f(s(e)),r=a.f;return r?u(t,r(e)):t}},340:(e,t,r)=>{var n=r(1600);e.exports=n},2699:e=>{e.exports=function(e){try{return{error:!1,value:e()}}catch(e){return{error:!0,value:e}}}},9467:(e,t,r)=>{var n=r(3736),i=r(9952),o=r(8071);e.exports=function(e,t){if(n(e),i(t)&&t.constructor===e)return t;var r=o.f(e);return(0,r.resolve)(t),r.promise}},7431:(e,t,r)=>{var n=r(5028);e.exports=function(e,t,r){for(var i in t)n(e,i,t[i],r);return e}},5028:(e,t,r)=>{var n=r(1600),i=r(984),o=r(9180),a=r(4768),s=r(2984),u=r(1727),l=r(7932),c=r(8492).CONFIGURABLE,p=l.get,d=l.enforce,f=String(String).split("String");(e.exports=function(e,t,r,u){var l,p=!!u&&!!u.unsafe,h=!!u&&!!u.enumerable,y=!!u&&!!u.noTargetGet,m=u&&void 0!==u.name?u.name:t;i(r)&&("Symbol("===String(m).slice(0,7)&&(m="["+String(m).replace(/^Symbol\(([^)]*)\)/,"$1")+"]"),(!o(r,"name")||c&&r.name!==m)&&a(r,"name",m),(l=d(r)).source||(l.source=f.join("string"==typeof m?m:""))),e!==n?(p?!y&&e[t]&&(h=!0):delete e[t],h?e[t]=r:a(e,t,r)):h?e[t]=r:s(t,r)})(Function.prototype,"toString",(function(){return i(this)&&p(this).source||u(this)}))},1840:(e,t,r)=>{var n=r(1600).TypeError;e.exports=function(e){if(null==e)throw n("Can't call method on "+e);return e}},2984:(e,t,r)=>{var n=r(1600),i=Object.defineProperty;e.exports=function(e,t){try{i(n,e,{value:t,configurable:!0,writable:!0})}catch(r){n[e]=t}return t}},9688:(e,t,r)=>{"use strict";var n=r(6532),i=r(7072),o=r(3668),a=r(2828),s=o("species");e.exports=function(e){var t=n(e),r=i.f;a&&t&&!t[s]&&r(t,s,{configurable:!0,get:function(){return this}})}},9540:(e,t,r)=>{var n=r(7072).f,i=r(9180),o=r(3668)("toStringTag");e.exports=function(e,t,r){e&&!i(e=r?e:e.prototype,o)&&n(e,o,{configurable:!0,value:t})}},280:(e,t,r)=>{var n=r(4624),i=r(6536),o=n("keys");e.exports=function(e){return o[e]||(o[e]=i(e))}},6376:(e,t,r)=>{var n=r(1600),i=r(2984),o="__core-js_shared__",a=n[o]||i(o,{});e.exports=a},4624:(e,t,r)=>{var n=r(7408),i=r(6376);(e.exports=function(e,t){return i[e]||(i[e]=void 0!==t?t:{})})("versions",[]).push({version:"3.19.0",mode:n?"pure":"global",copyright:"© 2021 Denis Pushkarev (zloirock.ru)"})},7171:(e,t,r)=>{var n=r(3736),i=r(6372),o=r(3668)("species");e.exports=function(e,t){var r,a=n(e).constructor;return void 0===a||null==(r=n(a)[o])?t:i(r)}},5160:(e,t,r)=>{var n=r(604),i=r(9824),o=r(748),a=r(1840),s=n("".charAt),u=n("".charCodeAt),l=n("".slice),c=function(e){return function(t,r){var n,c,p=o(a(t)),d=i(r),f=p.length;return d<0||d>=f?e?"":void 0:(n=u(p,d))<55296||n>56319||d+1===f||(c=u(p,d+1))<56320||c>57343?e?s(p,d):n:e?l(p,d,d+2):c-56320+(n-55296<<10)+65536}};e.exports={codeAt:c(!1),charAt:c(!0)}},1688:(e,t,r)=>{var n=r(604),i=r(1840),o=r(748),a=r(5320),s=n("".replace),u="["+a+"]",l=RegExp("^"+u+u+"*"),c=RegExp(u+u+"*$"),p=function(e){return function(t){var r=o(i(t));return 1&e&&(r=s(r,l,"")),2&e&&(r=s(r,c,"")),r}};e.exports={start:p(1),end:p(2),trim:p(3)}},5952:(e,t,r)=>{var n,i,o,a,s=r(1600),u=r(9756),l=r(5616),c=r(984),p=r(9180),d=r(7004),f=r(2960),h=r(6100),y=r(7300),m=r(1588),g=r(3640),v=s.setImmediate,b=s.clearImmediate,I=s.process,S=s.Dispatch,T=s.Function,_=s.MessageChannel,P=s.String,A=0,E={},w="onreadystatechange";try{n=s.location}catch(e){}var D=function(e){if(p(E,e)){var t=E[e];delete E[e],t()}},O=function(e){return function(){D(e)}},x=function(e){D(e.data)},F=function(e){s.postMessage(P(e),n.protocol+"//"+n.host)};v&&b||(v=function(e){var t=h(arguments,1);return E[++A]=function(){u(c(e)?e:T(e),void 0,t)},i(A),A},b=function(e){delete E[e]},g?i=function(e){I.nextTick(O(e))}:S&&S.now?i=function(e){S.now(O(e))}:_&&!m?(a=(o=new _).port2,o.port1.onmessage=x,i=l(a.postMessage,a)):s.addEventListener&&c(s.postMessage)&&!s.importScripts&&n&&"file:"!==n.protocol&&!d(F)?(i=F,s.addEventListener("message",x,!1)):i=w in y("script")?function(e){f.appendChild(y("script"))[w]=function(){f.removeChild(this),D(e)}}:function(e){setTimeout(O(e),0)}),e.exports={set:v,clear:b}},7920:(e,t,r)=>{var n=r(9824),i=Math.max,o=Math.min;e.exports=function(e,t){var r=n(e);return r<0?i(r+t,0):o(r,t)}},3068:(e,t,r)=>{var n=r(3188),i=r(1840);e.exports=function(e){return n(i(e))}},9824:e=>{var t=Math.ceil,r=Math.floor;e.exports=function(e){var n=+e;return n!=n||0===n?0:(n>0?r:t)(n)}},1868:(e,t,r)=>{var n=r(9824),i=Math.min;e.exports=function(e){return e>0?i(n(e),9007199254740991):0}},3848:(e,t,r)=>{var n=r(1600),i=r(1840),o=n.Object;e.exports=function(e){return o(i(e))}},2312:(e,t,r)=>{var n=r(1600),i=r(3032),o=r(9952),a=r(1836),s=r(8808),u=r(7540),l=r(3668),c=n.TypeError,p=l("toPrimitive");e.exports=function(e,t){if(!o(e)||a(e))return e;var r,n=s(e,p);if(n){if(void 0===t&&(t="default"),r=i(n,e,t),!o(r)||a(r))return r;throw c("Can't convert object to primitive value")}return void 0===t&&(t="number"),u(e,t)}},4061:(e,t,r)=>{var n=r(2312),i=r(1836);e.exports=function(e){var t=n(e,"string");return i(t)?t:t+""}},7796:(e,t,r)=>{var n={};n[r(3668)("toStringTag")]="z",e.exports="[object z]"===String(n)},748:(e,t,r)=>{var n=r(1600),i=r(1248),o=n.String;e.exports=function(e){if("Symbol"===i(e))throw TypeError("Cannot convert a Symbol value to a string");return o(e)}},1532:(e,t,r)=>{var n=r(1600).String;e.exports=function(e){try{return n(e)}catch(e){return"Object"}}},6536:(e,t,r)=>{var n=r(604),i=0,o=Math.random(),a=n(1..toString);e.exports=function(e){return"Symbol("+(void 0===e?"":e)+")_"+a(++i+o,36)}},7216:(e,t,r)=>{var n=r(3880);e.exports=n&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},3668:(e,t,r)=>{var n=r(1600),i=r(4624),o=r(9180),a=r(6536),s=r(3880),u=r(7216),l=i("wks"),c=n.Symbol,p=c&&c.for,d=u?c:c&&c.withoutSetter||a;e.exports=function(e){if(!o(l,e)||!s&&"string"!=typeof l[e]){var t="Symbol."+e;s&&o(c,e)?l[e]=c[e]:l[e]=u&&p?p(t):d(t)}return l[e]}},5320:e=>{e.exports="\t\n\v\f\r                 \u2028\u2029\ufeff"},6140:(e,t,r)=>{"use strict";var n=r(7248),i=r(1600),o=r(2408),a=r(6232),s=r(3440),u=r(4640),l=r(124),c=r(4768),p=r(364),d=r(5032),f=r(7660),h=r(9928),y=r(5744),m=r(4464),g=i.Error,v=[].push,b=function(e,t){var r=o(I,this)?this:l(I),n=arguments.length>2?arguments[2]:void 0;s&&(r=s(new g(void 0),a(r))),c(r,"message",y(t,"")),m&&c(r,"stack",d(r.stack,1)),f(r,n);var i=[];return h(e,v,{that:i}),c(r,"errors",i),r};s?s(b,g):u(b,g);var I=b.prototype=l(g.prototype,{constructor:p(1,b),message:p(1,""),name:p(1,"AggregateError")});n({global:!0},{AggregateError:b})},5092:(e,t,r)=>{"use strict";var n=r(7248),i=r(9560).find,o=r(5868),a="find",s=!0;a in[]&&Array(1)[a]((function(){s=!1})),n({target:"Array",proto:!0,forced:s},{find:function(e){return i(this,e,arguments.length>1?arguments[1]:void 0)}}),o(a)},5684:(e,t,r)=>{var n=r(7248),i=r(8208);n({target:"Array",stat:!0,forced:!r(6344)((function(e){Array.from(e)}))},{from:i})},3924:(e,t,r)=>{"use strict";var n=r(3068),i=r(5868),o=r(2204),a=r(7932),s=r(2648),u="Array Iterator",l=a.set,c=a.getterFor(u);e.exports=s(Array,"Array",(function(e,t){l(this,{type:u,target:n(e),index:0,kind:t})}),(function(){var e=c(this),t=e.target,r=e.kind,n=e.index++;return!t||n>=t.length?(e.target=void 0,{value:void 0,done:!0}):"keys"==r?{value:n,done:!1}:"values"==r?{value:t[n],done:!1}:{value:[n,t[n]],done:!1}}),"values"),o.Arguments=o.Array,i("keys"),i("values"),i("entries")},472:(e,t,r)=>{"use strict";r(6064)("Map",(function(e){return function(){return e(this,arguments.length?arguments[0]:void 0)}}),r(9920))},1300:(e,t,r)=>{r(7248)({target:"Number",stat:!0},{isInteger:r(992)})},3656:(e,t,r)=>{r(7248)({target:"Number",stat:!0},{isNaN:function(e){return e!=e}})},6544:(e,t,r)=>{var n=r(7248),i=r(6016);n({target:"Number",stat:!0,forced:Number.parseFloat!=i},{parseFloat:i})},7972:(e,t,r)=>{var n=r(7248),i=r(6556);n({target:"Number",stat:!0,forced:Number.parseInt!=i},{parseInt:i})},6368:(e,t,r)=>{var n=r(7248),i=r(6984);n({target:"Object",stat:!0,forced:Object.assign!==i},{assign:i})},8292:(e,t,r)=>{var n=r(7248),i=r(5556).entries;n({target:"Object",stat:!0},{entries:function(e){return i(e)}})},920:(e,t,r)=>{r(7248)({target:"Object",stat:!0},{setPrototypeOf:r(3440)})},7912:(e,t,r)=>{var n=r(7796),i=r(5028),o=r(2816);n||i(Object.prototype,"toString",o,{unsafe:!0})},3936:(e,t,r)=>{"use strict";var n=r(7248),i=r(3032),o=r(1381),a=r(8071),s=r(2699),u=r(9928);n({target:"Promise",stat:!0},{allSettled:function(e){var t=this,r=a.f(t),n=r.resolve,l=r.reject,c=s((function(){var r=o(t.resolve),a=[],s=0,l=1;u(e,(function(e){var o=s++,u=!1;l++,i(r,t,e).then((function(e){u||(u=!0,a[o]={status:"fulfilled",value:e},--l||n(a))}),(function(e){u||(u=!0,a[o]={status:"rejected",reason:e},--l||n(a))}))})),--l||n(a)}));return c.error&&l(c.value),r.promise}})},5428:(e,t,r)=>{"use strict";var n=r(7248),i=r(1381),o=r(6532),a=r(3032),s=r(8071),u=r(2699),l=r(9928),c="No one promise resolved";n({target:"Promise",stat:!0},{any:function(e){var t=this,r=o("AggregateError"),n=s.f(t),p=n.resolve,d=n.reject,f=u((function(){var n=i(t.resolve),o=[],s=0,u=1,f=!1;l(e,(function(e){var i=s++,l=!1;u++,a(n,t,e).then((function(e){l||f||(f=!0,p(e))}),(function(e){l||f||(l=!0,o[i]=e,--u||d(new r(o,c)))}))})),--u||d(new r(o,c))}));return f.error&&d(f.value),n.promise}})},1517:(e,t,r)=>{"use strict";var n=r(7248),i=r(7408),o=r(3459),a=r(7004),s=r(6532),u=r(984),l=r(7171),c=r(9467),p=r(5028);if(n({target:"Promise",proto:!0,real:!0,forced:!!o&&a((function(){o.prototype.finally.call({then:function(){}},(function(){}))}))},{finally:function(e){var t=l(this,s("Promise")),r=u(e);return this.then(r?function(r){return c(t,e()).then((function(){return r}))}:e,r?function(r){return c(t,e()).then((function(){throw r}))}:e)}}),!i&&u(o)){var d=s("Promise").prototype.finally;o.prototype.finally!==d&&p(o.prototype,"finally",d,{unsafe:!0})}},7448:(e,t,r)=>{"use strict";var n,i,o,a,s=r(7248),u=r(7408),l=r(1600),c=r(6532),p=r(3032),d=r(3459),f=r(5028),h=r(7431),y=r(3440),m=r(9540),g=r(9688),v=r(1381),b=r(984),I=r(9952),S=r(2932),T=r(1727),_=r(9928),P=r(6344),A=r(7171),E=r(5952).set,w=r(3104),D=r(9467),O=r(5651),x=r(8071),F=r(2699),C=r(7932),k=r(4232),M=r(3668),N=r(4532),R=r(3640),V=r(2592),j=M("species"),z="Promise",L=C.get,U=C.set,B=C.getterFor(z),H=d&&d.prototype,W=d,G=H,Y=l.TypeError,K=l.document,Q=l.process,q=x.f,Z=q,X=!!(K&&K.createEvent&&l.dispatchEvent),J=b(l.PromiseRejectionEvent),$="unhandledrejection",ee=!1,te=k(z,(function(){var e=T(W),t=e!==String(W);if(!t&&66===V)return!0;if(u&&!G.finally)return!0;if(V>=51&&/native code/.test(e))return!1;var r=new W((function(e){e(1)})),n=function(e){e((function(){}),(function(){}))};return(r.constructor={})[j]=n,!(ee=r.then((function(){}))instanceof n)||!t&&N&&!J})),re=te||!P((function(e){W.all(e).catch((function(){}))})),ne=function(e){var t;return!(!I(e)||!b(t=e.then))&&t},ie=function(e,t){if(!e.notified){e.notified=!0;var r=e.reactions;w((function(){for(var n=e.value,i=1==e.state,o=0;r.length>o;){var a,s,u,l=r[o++],c=i?l.ok:l.fail,d=l.resolve,f=l.reject,h=l.domain;try{c?(i||(2===e.rejection&&ue(e),e.rejection=1),!0===c?a=n:(h&&h.enter(),a=c(n),h&&(h.exit(),u=!0)),a===l.promise?f(Y("Promise-chain cycle")):(s=ne(a))?p(s,a,d,f):d(a)):f(n)}catch(e){h&&!u&&h.exit(),f(e)}}e.reactions=[],e.notified=!1,t&&!e.rejection&&ae(e)}))}},oe=function(e,t,r){var n,i;X?((n=K.createEvent("Event")).promise=t,n.reason=r,n.initEvent(e,!1,!0),l.dispatchEvent(n)):n={promise:t,reason:r},!J&&(i=l["on"+e])?i(n):e===$&&O("Unhandled promise rejection",r)},ae=function(e){p(E,l,(function(){var t,r=e.facade,n=e.value;if(se(e)&&(t=F((function(){R?Q.emit("unhandledRejection",n,r):oe($,r,n)})),e.rejection=R||se(e)?2:1,t.error))throw t.value}))},se=function(e){return 1!==e.rejection&&!e.parent},ue=function(e){p(E,l,(function(){var t=e.facade;R?Q.emit("rejectionHandled",t):oe("rejectionhandled",t,e.value)}))},le=function(e,t,r){return function(n){e(t,n,r)}},ce=function(e,t,r){e.done||(e.done=!0,r&&(e=r),e.value=t,e.state=2,ie(e,!0))},pe=function(e,t,r){if(!e.done){e.done=!0,r&&(e=r);try{if(e.facade===t)throw Y("Promise can't be resolved itself");var n=ne(t);n?w((function(){var r={done:!1};try{p(n,t,le(pe,r,e),le(ce,r,e))}catch(t){ce(r,t,e)}})):(e.value=t,e.state=1,ie(e,!1))}catch(t){ce({done:!1},t,e)}}};if(te&&(G=(W=function(e){S(this,G),v(e),p(n,this);var t=L(this);try{e(le(pe,t),le(ce,t))}catch(e){ce(t,e)}}).prototype,(n=function(e){U(this,{type:z,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:0,value:void 0})}).prototype=h(G,{then:function(e,t){var r=B(this),n=r.reactions,i=q(A(this,W));return i.ok=!b(e)||e,i.fail=b(t)&&t,i.domain=R?Q.domain:void 0,r.parent=!0,n[n.length]=i,0!=r.state&&ie(r,!1),i.promise},catch:function(e){return this.then(void 0,e)}}),i=function(){var e=new n,t=L(e);this.promise=e,this.resolve=le(pe,t),this.reject=le(ce,t)},x.f=q=function(e){return e===W||e===o?new i(e):Z(e)},!u&&b(d)&&H!==Object.prototype)){a=H.then,ee||(f(H,"then",(function(e,t){var r=this;return new W((function(e,t){p(a,r,e,t)})).then(e,t)}),{unsafe:!0}),f(H,"catch",G.catch,{unsafe:!0}));try{delete H.constructor}catch(e){}y&&y(H,G)}s({global:!0,wrap:!0,forced:te},{Promise:W}),m(W,z,!1,!0),g(z),o=c(z),s({target:z,stat:!0,forced:te},{reject:function(e){var t=q(this);return p(t.reject,void 0,e),t.promise}}),s({target:z,stat:!0,forced:u||te},{resolve:function(e){return D(u&&this===o?W:this,e)}}),s({target:z,stat:!0,forced:re},{all:function(e){var t=this,r=q(t),n=r.resolve,i=r.reject,o=F((function(){var r=v(t.resolve),o=[],a=0,s=1;_(e,(function(e){var u=a++,l=!1;s++,p(r,t,e).then((function(e){l||(l=!0,o[u]=e,--s||n(o))}),i)})),--s||n(o)}));return o.error&&i(o.value),r.promise},race:function(e){var t=this,r=q(t),n=r.reject,i=F((function(){var i=v(t.resolve);_(e,(function(e){p(i,t,e).then(r.resolve,n)}))}));return i.error&&n(i.value),r.promise}})},8504:(e,t,r)=>{"use strict";var n=r(5160).charAt,i=r(748),o=r(7932),a=r(2648),s="String Iterator",u=o.set,l=o.getterFor(s);a(String,"String",(function(e){u(this,{type:s,string:i(e),index:0})}),(function(){var e,t=l(this),r=t.string,i=t.index;return i>=r.length?{value:void 0,done:!0}:(e=n(r,i),t.index+=e.length,{value:e,done:!1})}))},1808:e=>{!function(){var t=new RegExp("^[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}$","i");function r(e){for(var t="",r=0;r{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this._type=e}return Object.defineProperty(e.prototype,"type",{get:function(){return this._type},enumerable:!0,configurable:!0}),e}();t.TableauEvent=r},3248:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=function(e){function t(t,r){var n=e.call(this,t)||this;return n._sheet=r,n}return i(t,e),Object.defineProperty(t.prototype,"sheet",{get:function(){return this._sheet},enumerable:!0,configurable:!0}),t}(r(7112).TableauEvent);t.TableauSheetEvent=o},4144:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=function(e){function t(t,r){var n=e.call(this,t,r)||this;return n._worksheet=r,n}return i(t,e),Object.defineProperty(t.prototype,"worksheet",{get:function(){return this._worksheet},enumerable:!0,configurable:!0}),t}(r(3248).TableauSheetEvent);t.TableauWorksheetEvent=o},4164:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=function(e){function t(t){var r=e.call(this,o.TableauEventType.WorkbookFormattingChanged)||this;return r._formatting=t,r}return i(t,e),Object.defineProperty(t.prototype,"formatting",{get:function(){return this._formatting},enumerable:!0,configurable:!0}),t}(r(7112).TableauEvent);t.WorkbookFormattingChangedEvent=a},4712:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=function(e){function t(t,r){var n=e.call(this,o.TableauEventType.WorksheetFormattingChanged,t)||this;return n._formatting=r,n}return i(t,e),Object.defineProperty(t.prototype,"formatting",{get:function(){return this._formatting},enumerable:!0,configurable:!0}),t}(r(4144).TableauWorksheetEvent);t.WorksheetFormattingChangedEvent=a},92:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.BentonSansFontFamilyName="Benton Sans",t.BentonSansLowDPIFontFamilyName="Benton Sans Low-DPI",t.BentonSansBookFontFaceName="Benton Sans Book",t.BentonSansBookItalicFontFaceName="Benton Sans Book Italic",t.BentonSansSemiDemiFontFaceName="Benton Sans SemiDemi",t.BentonSansSemiDemiItalicFontFaceName="Benton Sans SemiDemi Italic",t.BentonSansLightFontFaceName="Benton Sans Light",t.BentonSansMediumFontFaceName="Benton Sans Medium",t.SupportedBentonSansFontFaces=[t.BentonSansBookFontFaceName,t.BentonSansBookItalicFontFaceName,t.BentonSansSemiDemiFontFaceName,t.BentonSansSemiDemiItalicFontFaceName,t.BentonSansLightFontFaceName,t.BentonSansMediumFontFaceName]},8396:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t,r,n){this._userId=e,this._siteId=t,this._siteNamespace=r,this._workbookId=n}return Object.defineProperty(e.prototype,"userId",{get:function(){return this._userId},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"siteId",{get:function(){return this._siteId},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"siteNamespace",{get:function(){return this._siteNamespace},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"workbookId",{get:function(){return this._workbookId},enumerable:!0,configurable:!0}),e}();t.ConnectedServer=r},5920:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(5136),a=r(1468),s=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),t.prototype.getAllDataSourcesAsync=function(){var e=this;return o.ApiServiceRegistry.get(a.ExtensionsRegistryId).getService("data-source-service").getAllDataSourcesAsync().then((function(t){var r=t,n=[];return Object.values(r.dataSources).forEach((function(t){n.push(e.createDataSourceFromInfo(t))})),n}))},t.prototype.createDataSourceFromInfo=function(e){var t=new o.DataSourceImpl(e,a.ExtensionsRegistryId),r=new o.DataSource(t);return t.initializeWithPublicInterfaces(r),r},t}(o.WorkbookImpl);t.ExtensionWorkbookImpl=s},976:function(e,t,r){"use strict";var n=this&&this.__spreadArrays||function(){for(var e=0,t=0,r=arguments.length;t0;)r.deleteRule(r.cssRules.length-1);e.formattingSheets.map((function(e){t.applyFormattingSheetToStyleSheet(e,r)}))}},e.prototype.applyFormattingSheetToStyleSheet=function(e,t){var r="",n=e.cssProperties;n.fontFamily&&(r+="font-family: "+n.fontFamily.toString()+"; "),n.fontSize&&(r+="font-size: "+n.fontSize.toString()+"; "),n.fontWeight&&(r+="font-weight: "+n.fontWeight.toString()+"; "),n.fontStyle&&(r+="font-style: "+n.fontStyle.toString()+"; "),n.textDecoration&&(r+="text-decoration: "+n.textDecoration.toString()+"; "),n.color&&(r+="color: "+n.color+"; ");var i="."+e.classNameKey+" { "+r+" }";t.insertRule(i,t.cssRules.length)},e.prototype.initializeWorkbookFormattingChangedEventCallback=function(e){var t=this;a.ApiServiceRegistry.get(g.ExtensionsRegistryId).getService("notification-service").registerHandler(o.NotificationId.WorkbookFormattingChanged,(function(){return!0}),(function(r){r&&(t.initializeTableauFonts(e,r),t.applyAllFormatting(r))}))},e.prototype.initializeTableauFonts=function(e,t){var r,i=this,a=n(v.SupportedBentonSansFontFaces,T.SupportedTableauFontFaces);if(t.formattingSheets.forEach((function(e){e.cssProperties.fontFamily&&a.push(e.cssProperties.fontFamily)})),a.length>0){var s=((r={})[o.ParameterId.FontNameListItems]=a,r);e.execute(o.VerbId.GetFonts,s).then((function(e){i.loadFonts(e.result)})).catch()}},e.prototype.loadFonts=function(e){var t=this;e.forEach((function(e){T.SupportedTableauFontFaces.includes(e.fontName)?t.loadTableauFonts(e):v.SupportedBentonSansFontFaces.includes(e.fontName)?t.loadBentonSansFonts(e):document.fonts.add(new FontFace(e.fontName,e.fontBinaryInfo))}))},e.prototype.initializeDashboardContent=function(e,t){var r=new a.SheetInfoImpl(e.name,i.SheetType.Dashboard,{width:e.size.w,height:e.size.h},void 0,!0),n=new a.DashboardImpl(r,e.zones,t,g.ExtensionsRegistryId,null,e.activeDashboardObjectId),o=new s.Dashboard(n);return new c.DashboardContent(o)},e.prototype.initializeWorksheetContent=function(e){var t=new a.SheetInfoImpl(e.visualId.worksheet,i.SheetType.Worksheet,{width:e.size.w,height:e.size.h},void 0,!0),r=new a.WorksheetImpl(t,g.ExtensionsRegistryId,e.visualId,null,null,e.backgroundColor,h.WorkbookFormattingEnvUtil.convertToWorkbookFormatting(e.formatting)),n=new l.Worksheet(r);return new y.WorksheetContent(n)},e.prototype.initializeSettings=function(e){var t=new S.SettingsImpl(e);return new d.Settings(t)},e.prototype.initializeContextMenuCallbacks=function(e){a.ApiServiceRegistry.get(g.ExtensionsRegistryId).getService("notification-service").registerHandler(o.NotificationId.ContextMenuClick,(function(){return!0}),(function(t){if(e){if(!e[t.id])throw new a.TableauError(i.ErrorCodes.InternalError,"Received unexpected context menu Id from event: "+t.id);e[t.id]()}}))},e.prototype.loadTableauFonts=function(e){switch(e.fontName){case T.TableauBookFontFaceName:document.fonts.add(new FontFace(T.TableauBookFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"}));break;case T.TableauLightFontFaceName:document.fonts.add(new FontFace(T.TableauLightFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"}));break;case T.TableauRegularFontFaceName:document.fonts.add(new FontFace(T.TableauRegularFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"}));break;case T.TableauSemiBoldFontFaceName:document.fonts.add(new FontFace(T.TableauSemiboldFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"})),document.fonts.add(new FontFace(T.TableauRegularFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"}));break;case T.TableauBoldFontFaceName:document.fonts.add(new FontFace(T.TableauBoldFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"})),document.fonts.add(new FontFace(T.TableauBoldFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"})),document.fonts.add(new FontFace(T.TableauMediumFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"})),document.fonts.add(new FontFace(T.TableauSemiboldFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"}));break;case T.TableauMediumFontFaceName:document.fonts.add(new FontFace(T.TableauMediumFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"})),document.fonts.add(new FontFace(T.TableauLightFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"})),document.fonts.add(new FontFace(T.TableauBookFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"}));break;default:throw new a.TableauError(i.ErrorCodes.InternalError,"'attempted to load unsupported font: "+e.fontName+".'")}},e.prototype.loadBentonSansFonts=function(e){switch(e.fontName){case v.BentonSansBookFontFaceName:document.fonts.add(new FontFace(v.BentonSansFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"})),document.fonts.add(new FontFace(v.BentonSansLowDPIFontFamilyName,e.fontBinaryInfo,{weight:"100",style:"normal"}));break;case v.BentonSansLightFontFaceName:document.fonts.add(new FontFace(v.BentonSansFontFamilyName,e.fontBinaryInfo,{weight:"100",style:"normal"}));break;case v.BentonSansMediumFontFaceName:document.fonts.add(new FontFace(v.BentonSansFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"})),document.fonts.add(new FontFace(v.BentonSansLowDPIFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"}));break;case v.BentonSansSemiDemiFontFaceName:document.fonts.add(new FontFace(v.BentonSansLowDPIFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"}));break;case v.BentonSansBookItalicFontFaceName:document.fonts.add(new FontFace(v.BentonSansFontFamilyName,e.fontBinaryInfo,{style:"italic"}));break;case v.BentonSansSemiDemiItalicFontFaceName:document.fonts.add(new FontFace(v.BentonSansLowDPIFontFamilyName,e.fontBinaryInfo,{style:"italic"}));break;default:throw new a.TableauError(i.ErrorCodes.InternalError,"'attempted to load unsupported font: "+e.fontName+".'")}},e}();t.ExtensionsImpl=P},7269:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(3448);!function(e){function t(e){var t;return e&&void 0!==e.isAlpha||window.__warningIssued?(null===(t=e)||void 0===t?void 0:t.isAlpha)&&window.__platformIsOfficialRelease&&window.__tableauDesktopDispatcher.then((function(e){e(n.INTERNAL_CONTRACT_VERSION).execute(n.VerbId.BlockExtension,{}).catch()})).catch():(console.warn("This is a beta version of the Extensions API. Please upgrade to an official release."),window.__warningIssued=!0),window.__tableauDesktopDispatcher}e.getDesktopDispatcherPromise=t,e.hasDesktopApiDispatcherPromise=function(e){return!!t(e)}}(t.LegacyInternalApiDispatcherHolder||(t.LegacyInternalApiDispatcherHolder={}))},5436:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3448),s=r(5136),u=r(7112),l=r(1468),c=function(e){function t(t){var r=e.call(this,o.TableauEventType.SettingsChanged)||this;return r._newSettings=t,r}return i(t,e),Object.defineProperty(t.prototype,"newSettings",{get:function(){return this._newSettings},enumerable:!0,configurable:!0}),t}(u.TableauEvent),p=function(){function e(e){this._saveInProgress=!1,this.initializeSettings(e)}return e.prototype.erase=function(e){s.ErrorHelpers.verifyParameter(e,"key"),this._currentSettings[e]&&(this.verifySettingsAreUnlocked(),delete this._currentSettings[e],this._isModified=!0)},e.prototype.get=function(e){return s.ErrorHelpers.verifyParameter(e,"key"),this._currentSettings[e]},e.prototype.getAll=function(){return Object.assign({},this._currentSettings)},Object.defineProperty(e.prototype,"isModified",{get:function(){return this._isModified},enumerable:!0,configurable:!0}),e.prototype.saveAsync=function(){var e=this;return this.verifySettingsAreUnlocked(),this._isModified?(this._saveInProgress=!0,s.ApiServiceRegistry.get(l.ExtensionsRegistryId).getService("SettingsService").saveSettingsAsync(this._currentSettings).then((function(t){return e._saveInProgress=!1,e._isModified=!1,void 0===e._currentSettings?e._currentSettings=t:Object.assign(e._currentSettings,t),t}),(function(t){return e._saveInProgress=!1,Promise.reject(t)}))):Promise.resolve(this._currentSettings)},e.prototype.set=function(e,t){s.ErrorHelpers.verifyStringParameter(e,"key"),s.ErrorHelpers.verifyParameter(t,"value"),this.verifySettingsAreUnlocked(),this._currentSettings[e]=t,this._isModified=!0},e.prototype.initializeEvents=function(){var e,t=this,r=new Array;try{e=s.ApiServiceRegistry.get(l.ExtensionsRegistryId).getService("notification-service")}catch(e){return r}var n=new s.SingleEventManagerImpl(o.TableauEventType.SettingsChanged);return e.registerHandler(a.NotificationId.SettingsChanged,(function(){return!0}),(function(e){t._currentSettings=e.newSettings,n.triggerEvent((function(){return new c(e.newSettings)}))})),r.push(n),r},e.prototype.initializeSettings=function(e){s.ErrorHelpers.verifyParameter(e,"settingsInfo"),s.ErrorHelpers.verifyParameter(e.settingsValues,"settingsInfo.SettingsValues"),this._currentSettings=e.settingsValues,this._isModified=!1},e.prototype.verifySettingsAreUnlocked=function(){if(this._saveInProgress)throw new s.TableauError(o.ErrorCodes.SettingSaveInProgress,e.ASYNC_SAVE_IN_PROGRESS)},e.ASYNC_SAVE_IN_PROGRESS="Async Save is in progress, updating settings is not allowed.",e}();t.SettingsImpl=p},2200:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.TableauBookFontFamilyName="Tableau Book",t.TableauLightFontFamilyName="Tableau Light",t.TableauRegularFontFamilyName="Tableau Regular",t.TableauMediumFontFamilyName="Tableau Medium",t.TableauSemiboldFontFamilyName="Tableau Semibold",t.TableauBoldFontFamilyName="Tableau Bold",t.TableauBookFontFaceName="Tableau Book",t.TableauBoldFontFaceName="Tableau Bold",t.TableauLightFontFaceName="Tableau Light",t.TableauMediumFontFaceName="Tableau Medium",t.TableauRegularFontFaceName="Tableau Regular",t.TableauSemiBoldFontFaceName="Tableau Semi Bold",t.SupportedTableauFontFaces=[t.TableauBookFontFaceName,t.TableauBoldFontFaceName,t.TableauLightFontFaceName,t.TableauMediumFontFaceName,t.TableauRegularFontFaceName,t.TableauSemiBoldFontFaceName]},1024:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(7419),o=r(3448),a=r(5136),s=r(1468),u=function(){function e(){}return e.prototype.displayDialogAsync=function(e,t,r){var u=a.ApiServiceRegistry.get(s.ExtensionsRegistryId).getService("UIService"),l=a.ApiServiceRegistry.get(s.ExtensionsRegistryId).getService("notification-service");return new Promise((function(s,c){u.displayDialogAsync(e,t||"",r).then((function(){var e=l.registerHandler(o.NotificationId.ExtensionDialogUpdate,(function(){return!0}),(function(t){if(t.isCloseEvent){if(void 0===t.closePayload)throw new a.TableauError(n.ErrorCodes.InternalError,"closePayload is undefined");s(t.closePayload)}else c(new a.TableauError(i.ErrorCodes.DialogClosedByUser,"Extension dialog closed by user."));e()}))})).catch((function(e){c(e)}))}))},e.prototype.closeDialog=function(e){a.ApiServiceRegistry.get(s.ExtensionsRegistryId).getService("UIService").closeDialog(e)},e}();t.UIImpl=u},4252:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3448),s=r(5136),u=r(6416),l=r(4164),c=r(1468),p=r(3192),d=r(6132),f=r(5548),h=function(e){function t(t){var r=e.call(this,t)||this;return r._dashboardImpl=t,t.initializeWithPublicInterfaces(),r.initializeEvents().forEach((function(e){return r.addNewEventType(e)})),r}return i(t,e),Object.defineProperty(t.prototype,"worksheets",{get:function(){return this._dashboardImpl.worksheetsImpl.map((function(e){return new f.Worksheet(e)}))},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"objects",{get:function(){return this._dashboardImpl.objects.map((function(e){return new p.DashboardObject(e)}))},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"activeDashboardObjectId",{get:function(){return this._dashboardImpl.activeDashboardObjectId},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"activeDashboardName",{get:function(){return this._dashboardImpl.activeDashboardName},enumerable:!0,configurable:!0}),t.prototype.setZoneVisibilityAsync=function(e){return this._dashboardImpl.setDashboardObjectVisibilityAsync(e)},t.prototype.setDashboardObjectVisibilityAsync=function(e){return this._dashboardImpl.setDashboardObjectVisibilityAsync(e)},t.prototype.getDashboardObjectById=function(e){var t=this._dashboardImpl.getDashboardObjectById(e);return t&&new p.DashboardObject(t)},t.prototype.initializeEvents=function(){var e,t=this,r=new Array;try{e=s.ApiServiceRegistry.get(c.ExtensionsRegistryId).getService("notification-service")}catch(e){return r}var n=new s.SingleEventManagerImpl(o.TableauEventType.DashboardLayoutChanged);e.registerHandler(a.NotificationId.DashboardLayoutChanged,(function(){return!0}),(function(e){var r=t._dashboardImpl.updateZones(e.zones,e.activeZoneId,e.activeDashboardName);n.triggerEvent((function(){return new u.DashboardLayoutChangedEvent(r)}))})),r.push(n);var i=new s.SingleEventManagerImpl(o.TableauEventType.WorkbookFormattingChanged);return e.registerHandler(a.NotificationId.WorkbookFormattingChanged,(function(){return!0}),(function(e){i.triggerEvent((function(){return new l.WorkbookFormattingChangedEvent(e)}))})),r.push(i),r},t.prototype.moveAndResizeDashboardObjectsAsync=function(e){return this._dashboardImpl.moveAndResizeDashboardObjectsAsync(e)},t.prototype.replayAnimationAsync=function(e){return this._dashboardImpl.replayAnimationAsync(e)},t.prototype.getFiltersAsync=function(){return this._dashboardImpl.getFiltersAsync()},t.prototype.applyFilterAsync=function(e,t,r,n){return this._dashboardImpl.applyFilterAsync(e,t,r,n)},t}(d.Sheet);t.Dashboard=h},3192:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(4252),i=r(5548),o=function(){function e(e){this._dashboardObjectImpl=e}return Object.defineProperty(e.prototype,"dashboard",{get:function(){return new n.Dashboard(this._dashboardObjectImpl.dashboardImpl)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"type",{get:function(){return this._dashboardObjectImpl.type},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"position",{get:function(){return this._dashboardObjectImpl.position},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"size",{get:function(){return this._dashboardObjectImpl.size},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"worksheet",{get:function(){if(this._dashboardObjectImpl.worksheetImpl)return new i.Worksheet(this._dashboardObjectImpl.worksheetImpl)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"name",{get:function(){return this._dashboardObjectImpl.name},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isFloating",{get:function(){return this._dashboardObjectImpl.isFloating},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isVisible",{get:function(){return this._dashboardObjectImpl.isVisible},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"id",{get:function(){return this._dashboardObjectImpl.id},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"fieldId",{get:function(){return this._dashboardObjectImpl.fieldId},enumerable:!0,configurable:!0}),e}();t.DashboardObject=o},4592:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3448),s=r(5136),u=r(864),l=r(1468),c=function(e){function t(t,r){var n=e.call(this)||this;return n.parameterImpl=t,n.initializeEvents(r).forEach((function(e){return n.addNewEventType(e)})),n}return i(t,e),Object.defineProperty(t.prototype,"name",{get:function(){return this.parameterImpl.name},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"currentValue",{get:function(){return this.parameterImpl.currentValue},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"dataType",{get:function(){return this.parameterImpl.dataType},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"allowableValues",{get:function(){return this.parameterImpl.allowableValues},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"id",{get:function(){return this.parameterImpl.id},enumerable:!0,configurable:!0}),t.prototype.changeValueAsync=function(e){return this.parameterImpl.changeValueAsync(e)},t.prototype.initializeEvents=function(e){var t=this;s.ErrorHelpers.verifyInternalValue(e,"sheet");var r,n=new Array;try{r=s.ApiServiceRegistry.get(l.ExtensionsRegistryId).getService("notification-service")}catch(e){return n}var i=new s.SingleEventManagerImpl(o.TableauEventType.ParameterChanged);return r.registerHandler(a.NotificationId.ParameterChanged,(function(e){return e===t.parameterImpl.id}),(function(t){i.triggerEvent((function(){return new u.ParameterChangedEvent(t,e)}))})),n.push(i),n},t}(s.EventListenerManager);t.Parameter=c},6132:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(5136),s=r(4592),u=function(e){function t(t){var r=e.call(this)||this;return r._sheetImpl=t,r}return i(t,e),Object.defineProperty(t.prototype,"name",{get:function(){return this._sheetImpl.name},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"sheetType",{get:function(){return this._sheetImpl.sheetType},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"size",{get:function(){if(this.isValidSize(this._sheetImpl.size))return this._sheetImpl.size;throw new a.TableauError(o.EmbeddingErrorCodes.ImplementationError,"Size not implemented")},enumerable:!0,configurable:!0}),t.prototype.isValidSize=function(e){var t=e;return void 0!==t.width&&void 0!==t.height},t.prototype.findParameterAsync=function(e){var t=this;return this._sheetImpl.findParameterAsync(e).then((function(e){return new Promise(e?function(r){return r(new s.Parameter(e,t))}:function(e){return e(void 0)})}))},t.prototype.getParametersAsync=function(){var e=this;return this._sheetImpl.getParametersAsync().then((function(t){return t.map((function(t){return new s.Parameter(t,e)}))}))},t}(a.EventListenerManager);t.Sheet=u},9224:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this._workbookImpl=e}return e.prototype.getAllDataSourcesAsync=function(){return this._workbookImpl.getAllDataSourcesAsync()},e}();t.Workbook=r},5548:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(7419),s=r(3448),u=r(5136),l=r(1672),c=r(5572),p=r(3464),d=r(4712),f=r(1468),h=r(4252),y=function(e){function t(t){var r=e.call(this,t)||this;return r._worksheetImpl=t,r.initializeEvents().forEach((function(e){return r.addNewEventType(e)})),r}return i(t,e),Object.defineProperty(t.prototype,"parentDashboard",{get:function(){if(null==this._worksheetImpl.parentDashboard)throw new u.TableauError(o.SharedErrorCodes.ImplementationError,"Parent dashboard not implemented");return new h.Dashboard(this._worksheetImpl.parentDashboard)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"backgroundColor",{get:function(){if(null==this._worksheetImpl.backgroundColor)throw new u.TableauError(o.SharedErrorCodes.ImplementationError,"Worksheet background color is not available");return this._worksheetImpl.backgroundColor},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"formatting",{get:function(){if(null==this._worksheetImpl.formatting)throw new u.TableauError(o.SharedErrorCodes.ImplementationError,"Worksheet formatting information is not available");return this._worksheetImpl.formatting},enumerable:!0,configurable:!0}),t.prototype.initializeEvents=function(){var e,t=this,r=new Array;try{e=u.ApiServiceRegistry.get(f.ExtensionsRegistryId).getService("notification-service")}catch(e){return r}var n=new u.SingleEventManagerImpl(a.TableauEventType.MarkSelectionChanged);e.registerHandler(s.NotificationId.SelectedMarksChanged,(function(e){var r=e;return t.visualIdsAreEqual(r,t._worksheetImpl.visualId)}),(function(){return n.triggerEvent((function(){return new c.MarksSelectedEvent(t)}))}));var i=new u.SingleEventManagerImpl(a.TableauEventType.FilterChanged);e.registerHandler(s.NotificationId.FilterChanged,(function(e){var r=e;return t._worksheetImpl.visualId.worksheet===r.visualId.worksheet}),(function(e){i.triggerEvent((function(){return new l.FilterChangedEvent(t,e.fieldName,e.fieldId)}))}));var o=new u.SingleEventManagerImpl(a.TableauEventType.SummaryDataChanged);e.registerHandler(s.NotificationId.SummaryDataChanged,(function(e){var r=e;return t._worksheetImpl.visualId.worksheet===r.visualId.worksheet}),(function(e){o.triggerEvent((function(){return new p.SummaryDataChangedEvent(t)}))}));var h=new u.SingleEventManagerImpl(a.TableauEventType.WorksheetFormattingChanged);return e.registerHandler(s.NotificationId.WorksheetFormattingChanged,(function(e){var r=e;return t._worksheetImpl.visualId.worksheet===r.visualId.worksheet}),(function(e){h.triggerEvent((function(){return new d.WorksheetFormattingChangedEvent(t,e)}))})),r.push(n),r.push(i),r.push(o),r.push(h),r},t.prototype.applyFilterAsync=function(e,t,r,n){return this._worksheetImpl.applyFilterAsync(e,t,r,n)},t.prototype.applyRangeFilterAsync=function(e,t){return this._worksheetImpl.applyRangeFilterAsync(e,t)},t.prototype.applyHierarchicalFilterAsync=function(e,t,r,n){return this._worksheetImpl.applyHierarchicalFilterAsync(e,t,r,n)},t.prototype.applyRelativeDateFilterAsync=function(e,t){return this._worksheetImpl.applyRelativeDateFilterAsync(e,t)},t.prototype.clearFilterAsync=function(e){return this._worksheetImpl.clearFilterAsync(e)},t.prototype.getDataSourcesAsync=function(){return this._worksheetImpl.getDataSourcesAsync()},t.prototype.getFiltersAsync=function(){return this._worksheetImpl.getFiltersAsync()},t.prototype.getSelectedMarksAsync=function(){return this._worksheetImpl.getSelectedMarksAsync()},t.prototype.getHighlightedMarksAsync=function(){return this._worksheetImpl.getHighlightedMarksAsync()},t.prototype.getSummaryDataAsync=function(e){return this._worksheetImpl.getSummaryDataAsync(e)},t.prototype.getSummaryDataReaderAsync=function(e,t){return this._worksheetImpl.getSummaryDataReaderAsync(e,t)},t.prototype.getSummaryColumnsInfoAsync=function(){return this._worksheetImpl.getSummaryColumnsInfoAsync()},t.prototype.getUnderlyingDataAsync=function(e){return console.warn("Worksheet.getUnderlyingDataAsync is deprecated. Please use Worksheet.getUnderlyingTablesAsync and Worksheet.getUnderlyingTableDataAsync"),this._worksheetImpl.getUnderlyingDataAsync(e)},t.prototype.getUnderlyingTablesAsync=function(){return this._worksheetImpl.getUnderlyingTablesAsync()},t.prototype.getUnderlyingTableDataAsync=function(e,t){return this._worksheetImpl.getUnderlyingTableDataAsync(e,t)},t.prototype.getUnderlyingTableDataReaderAsync=function(e,t,r){return this._worksheetImpl.getUnderlyingTableDataReaderAsync(e,t,r)},t.prototype.getVisualSpecificationAsync=function(){return this._worksheetImpl.getVisualSpecificationAsync()},t.prototype.addMarksCardFieldsAsync=function(e,t,r,n){return this._worksheetImpl.addMarksCardFieldsAsync(e,t,r,n)},t.prototype.moveMarksCardFieldAsync=function(e,t,r,n){return void 0===n&&(n=1),this._worksheetImpl.moveMarksCardFieldAsync(e,t,r,n)},t.prototype.spliceMarksCardFieldsAsync=function(e,t,r,n,i){return this._worksheetImpl.spliceMarksCardFieldsAsync(e,t,r,n,i)},t.prototype.clearSelectedMarksAsync=function(){return this._worksheetImpl.clearSelectedMarksAsync()},t.prototype.selectMarksByIDAsync=function(e,t){return this._worksheetImpl.selectMarksByIdAsync(e,t)},t.prototype.selectMarksByValueAsync=function(e,t){return this._worksheetImpl.selectMarksByValueAsync(e,t)},t.prototype.selectMarksByIdAsync=function(e,t){return this._worksheetImpl.selectMarksByIdAsync(e,t)},t.prototype.annotateMarkAsync=function(e,t){return this._worksheetImpl.annotateMarkAsync(e,t)},t.prototype.getAnnotationsAsync=function(){return this._worksheetImpl.getAnnotationsAsync()},t.prototype.removeAnnotationAsync=function(e){return this._worksheetImpl.removeAnnotationAsync(e)},t.prototype.hoverTupleAsync=function(e,t,r){return void 0===r&&(r=!0),this._worksheetImpl.hoverTupleAsync(e,t,r)},t.prototype.selectTuplesAsync=function(e,t,r){return this._worksheetImpl.selectTuplesAsync(e,t,r)},t.prototype.getTooltipTextAsync=function(e){return this._worksheetImpl.getTooltipTextAsync(e)},t.prototype.leaveMarkNavigationAsync=function(){return this._worksheetImpl.leaveMarkNavigationAsync()},t.prototype.editAliasesDialogAsync=function(e){return this._worksheetImpl.editAliasesDialogAsync(e)},t.prototype.visualIdsAreEqual=function(e,t){return e&&t&&e.worksheet===t.worksheet&&e.dashboard===t.dashboard&&e.storyboard===t.storyboard&&e.storyPointID===t.storyPointID},t}(r(6132).Sheet);t.Worksheet=y},893:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this._dashboard=e}return Object.defineProperty(e.prototype,"dashboard",{get:function(){return this._dashboard},enumerable:!0,configurable:!0}),e}();t.DashboardContent=r},520:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(5136),i=r(8396),o=r(8012),a=function(){function e(e){this._apiVersion=n.ApiVersion.Instance&&n.ApiVersion.Instance.formattedValue,this._context=n.InternalToExternalEnumMappings.extensionContext.convert(e.extensionContext),this._formatting=o.WorkbookFormattingEnvUtil.convertToWorkbookFormatting(e.workbookFormatting),this._language=e.extensionLanguage,this._country=e.extensionCountry,this._locale=e.extensionLocale,this._mode=n.InternalToExternalEnumMappings.extensionMode.convert(e.extensionMode),this._operatingSystem=e.operatingSystem,this._tableauVersion=e.tableauVersion,this._uniqueUserId=e.uniqueUserId,e.userId&&(this.connectedServer=new i.ConnectedServer(e.userId,e.siteId,e.siteNamespace,e.workbookId),this.featureFlags=e.featureFlags)}return Object.defineProperty(e.prototype,"apiVersion",{get:function(){return this._apiVersion},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"context",{get:function(){return this._context},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"workbookFormatting",{get:function(){return this._formatting},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"language",{get:function(){return this._language},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"country",{get:function(){return this._country},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"locale",{get:function(){return this._locale},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"mode",{get:function(){return this._mode},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"operatingSystem",{get:function(){return this._operatingSystem},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"tableauVersion",{get:function(){return this._tableauVersion},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"uniqueUserId",{get:function(){return this._uniqueUserId},enumerable:!0,configurable:!0}),e}();t.Environment=a},5408:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this.extensionImpl=e,this.extensionImpl=e}return Object.defineProperty(e.prototype,"dashboardContent",{get:function(){return this.extensionImpl.dashboardContent},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"worksheetContent",{get:function(){return this.extensionImpl.worksheetContent},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"environment",{get:function(){return this.extensionImpl.environment},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"settings",{get:function(){return this.extensionImpl.settings},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"ui",{get:function(){return this.extensionImpl.ui},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"workbook",{get:function(){return this.extensionImpl.workbook},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"dashboardObjectId",{get:function(){return this.extensionImpl.extensionZoneId},enumerable:!0,configurable:!0}),e.prototype.initializeAsync=function(e){return this.extensionImpl.initializeAsync(!1,e).then()},e.prototype.initializeDialogAsync=function(){return this.extensionImpl.initializeAsync(!0)},e.prototype.createVizImageAsync=function(e){return this.extensionImpl.createVizImageAsync(e)},e.prototype.setClickThroughAsync=function(e){return this.extensionImpl.setClickThroughAsync(e)},e}();t.Extensions=r},652:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=function(e){function t(t){var r=e.call(this)||this;return r._settingsImpl=t,r._settingsImpl.initializeEvents().forEach((function(e){return r.addNewEventType(e)})),r}return i(t,e),t.prototype.erase=function(e){this._settingsImpl.erase(e)},t.prototype.get=function(e){return this._settingsImpl.get(e)},t.prototype.getAll=function(){return this._settingsImpl.getAll()},Object.defineProperty(t.prototype,"isModified",{get:function(){return this._settingsImpl.isModified},enumerable:!0,configurable:!0}),t.prototype.saveAsync=function(){return this._settingsImpl.saveAsync()},t.prototype.set=function(e,t){this._settingsImpl.set(e,t)},t}(r(5136).EventListenerManager);t.Settings=o},1964:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this._impl=e}return e.prototype.displayDialogAsync=function(e,t,r){return this._impl.displayDialogAsync(e,t,r)},e.prototype.closeDialog=function(e){this._impl.closeDialog(e)},e}();t.UI=r},8012:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(5136),i=function(){function e(){}return e.convertToWorkbookFormatting=function(e){return e?{formattingSheets:e.formattingSheets.map((function(e){return{classNameKey:n.InternalToExternalEnumMappings.classNameKey.convert(e.classNameKey),cssProperties:(t=e.classNameKey,r=e.cssProperties,"tableau-row-dividers"===t||"tableau-column-dividers"===t?{borderColor:r.borderColor,borderStyle:r.borderStyle,borderWidth:r.borderWidth}:{fontFamily:r.fontFamily,fontSize:r.fontSize,fontWeight:r.fontWeight,fontStyle:r.fontStyle,textDecoration:r.textDecoration,color:r.color})};var t,r}))}:void 0},e}();t.WorkbookFormattingEnvUtil=i},7e3:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this._worksheet=e}return Object.defineProperty(e.prototype,"worksheet",{get:function(){return this._worksheet},enumerable:!0,configurable:!0}),e}();t.WorksheetContent=r},6336:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(3448),a=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"InitializationService"},enumerable:!0,configurable:!0}),t.prototype.initializeDashboardExtensionsAsync=function(e,t){var r,n=((r={})[o.ParameterId.FunctionName]="initializeDashboardExtensionsAsync",r[o.ParameterId.ExtensionContextMenuIds]=t,r[o.ParameterId.IsExtensionDialog]=e,r);return this.execute(o.VerbId.InitializeExtension,n).then((function(e){return e.result}))},t}(r(5136).ServiceImplBase);t.InitializationServiceImpl=a},5432:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3448),s=r(5136),u=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"SettingsService"},enumerable:!0,configurable:!0}),t.prototype.saveSettingsAsync=function(e){var t,r=((t={})[a.ParameterId.FunctionName]="saveSettingsAsync",t[a.ParameterId.SettingsValues]=e,t);return this.execute(a.VerbId.SaveExtensionSettings,r).then((function(e){var t=e.result;if(!t||!t.settingsValues)throw new s.TableauError(o.ErrorCodes.InternalError,"Unexpected error savings settings.");return t.settingsValues}))},t}(s.ServiceImplBase);t.SettingsServiceImpl=u},752:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3448),s=r(5136),u=o.DialogStyle.Window,l=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"UIService"},enumerable:!0,configurable:!0}),t.prototype.displayDialogAsync=function(e,t,r){var n,i=((n={})[a.ParameterId.FunctionName]="displayDialogAsync",n[a.ParameterId.ExtensionDialogUrl]=e,n[a.ParameterId.ExtensionDialogPayload]=t,n),l=r&&r.height?r.height:400,c=r&&r.width?r.width:600,p=r&&r.dialogStyle?r.dialogStyle:u;if(l<=0||c<=0)throw new s.TableauError(o.ErrorCodes.InvalidParameter,"Size parameters for displayDialogAsync must be positive");return i[a.ParameterId.ExtensionDialogH]=l,i[a.ParameterId.ExtensionDialogW]=c,s.ErrorHelpers.verifyEnumValue(p,o.DialogStyle,"DialogStyle"),i[a.ParameterId.ExtensionDialogStyle]=s.ExternalToInternalEnumMappings.dialogStyles.convert(p),this.execute(a.VerbId.DisplayDialog,i).then((function(e){switch(e.result){case a.ExtensionDialogResult.DialogAlreadyOpen:throw new s.TableauError(o.ErrorCodes.DialogAlreadyOpen,"There already exists an open dialog for this extension.");case a.ExtensionDialogResult.InvalidDomain:throw new s.TableauError(o.ErrorCodes.InvalidDomainDialog,"The url of an extension dialog must match the domain of the parent extension.");default:return}}))},t.prototype.closeDialog=function(e){var t,r=((t={})[a.ParameterId.FunctionName]="closeDialog",t);return e&&(r[a.ParameterId.ExtensionDialogPayload]=e),this.execute(a.VerbId.CloseDialog,r).then((function(){}))},t.prototype.setClickThroughAsync=function(e,t){var r;if(s.ErrorHelpers.verifyParameterType(e,"boolean","clickThroughEnabled"),void 0===t||t<=0)throw new s.TableauError(o.ErrorCodes.InternalError,"Extension Id is invalid.");var n=((r={})[a.ParameterId.ExtensionZoneId]=t,r[a.ParameterId.ClickThroughEnabled]=e,r);return this.execute(a.VerbId.SetClickThrough,n).then((function(){}))},t}(s.ServiceImplBase);t.UIServiceImpl=l},6616:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(5136),i=r(6336),o=r(5432),a=r(752),s=r(1468);t.registerAllExtensionsServices=function(e){n.ApiServiceRegistry.get(s.ExtensionsRegistryId).registerService(new o.SettingsServiceImpl(e,s.ExtensionsRegistryId)),n.ApiServiceRegistry.get(s.ExtensionsRegistryId).registerService(new a.UIServiceImpl(e,s.ExtensionsRegistryId))},t.registerInitializationExtensionsServices=function(e){n.ApiServiceRegistry.get(s.ExtensionsRegistryId).registerService(new i.InitializationServiceImpl(e,s.ExtensionsRegistryId))}},1468:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ExtensionsRegistryId=0},268:(e,t,r)=>{"use strict";function n(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}Object.defineProperty(t,"__esModule",{value:!0}),n(r(4171));var i=r(3536);t.ApiMenuType=i.ApiMenuType,t.CrosstabFileFormat=i.CrosstabFileFormat,t.DeviceType=i.DeviceType,t.EmbeddingErrorCodes=i.EmbeddingErrorCodes,t.EmbeddingTableauEventType=i.TableauEventType,t.FileFormats=i.FileFormats,t.PrintOrientation=i.PrintOrientation,t.PrintPageSize=i.PrintPageSize,t.PrintScaling=i.PrintScaling,t.PulseErrorMessageVisibility=i.PulseErrorMessageVisibility,t.PulseLayout=i.PulseLayout,t.PulseTimeDimension=i.PulseTimeDimension,t.SheetSizeBehavior=i.SheetSizeBehavior,t.TableauDialogType=i.TableauDialogType,t.Toolbar=i.Toolbar,n(r(828)),n(r(3432)),n(r(1480)),n(r(5488))},5840:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(4744);t.ErrorCodes=n.ErrorCodes,t.ExtensionContext=n.ExtensionContext,t.ExtensionMode=n.ExtensionMode,t.TableauEventType=n.TableauEventType,t.VizImageEncodingType=n.VizImageEncodingType,t.VizImagePaletteType=n.VizImagePaletteType,t.VizImageSizeSettingAlignmentType=n.VizImageSizeSettingAlignmentType,t.VizImageSizeSettingType=n.VizImageSizeSettingType,t.VizImageSortDirectionType=n.VizImageSortDirectionType,function(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}(r(5488))},7419:(e,t,r)=>{"use strict";function n(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}Object.defineProperty(t,"__esModule",{value:!0}),n(r(268)),n(r(5840))},4171:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.AskDataAttributes||(t.AskDataAttributes={})).Origin="origin",r.ShowEmbed="show-embed",r.ShowPin="show-pin",r.ShowSave="show-save",r.ShowShare="show-share"},3536:(e,t)=>{"use strict";var r,n,i,o,a,s,u,l,c,p,d,f,h,y,m,g;Object.defineProperty(t,"__esModule",{value:!0}),(g=t.CrosstabFileFormat||(t.CrosstabFileFormat={})).CSV="csv",g.Excel="xlsx",(m=t.DeviceType||(t.DeviceType={})).Default="default",m.Desktop="desktop",m.Tablet="tablet",m.Phone="phone",(y=t.EmbeddingErrorCodes||(t.EmbeddingErrorCodes={})).AuthFailed="auth-failed",y.BrowserNotCapable="browser-not-capable",y.DownloadWorkbookNotAllowed="download-workbook-not-allowed",y.FilterCannotBePerformed="filter-cannot-be-performed",y.IndexOutOfRange="index-out-of-range",y.InternalError="internal-error",y.InvalidCustomViewName="invalid-custom-view-name",y.InvalidDateParameter="invalid-date-parameter",y.invalidFilterFieldNameOrValue="invalid-filter-field-name",y.InvalidParameter="invalid-parameter",y.InvalidTimeDimension="invalid-time-dimension",y.InvalidSize="invalid-size",y.InvalidSheetType="invalid-sheet-type",y.InvalidSizeBehavior="invalid-size-behavior",y.InvalidSizeBehaviorOnWorksheet="invalid-size-behavior-on-worksheet",y.InvalidUrl="invalid-url",y.MissingMaxSize="missing-max-size",y.MissingMinSize="missing-min-size",y.MissingMinMaxSize="missing-min-max-size",y.MissingParameter="missing-parameter",y.MissingRangeNForRelativeDateFilters="missing-range-n-for-relative-date-filters",y.NoUrlForHiddenWorksheet="no-url-for-hidden-worksheet",y.NoUrlOrParentElementNotFound="no-url-or-parent-element-not-found",y.NotActiveSheet="not-active-sheet",y.NullOrEmptyParameter="null-or-empty-parameter",y.SheetNotInWorkbook="sheet-not-in-workbook",y.StaleDataReference="stale-data-reference",y.UnknownAuthError="unknown-auth-error",y.UnsupportedEventName="unsupported-event-name",y.VizAlreadyInManager="viz-already-in-manager",y.ImplementationError="wrong-implementation",y.NotImplemented="not-implemented",y.EventInitializationError="event-initialization-error",y.IncompatibleVersionError="incompatible-version-error",y.UnknownDialogType="unknown-dialog-type",y.FilterMissingOrNotImplemented="filter-missing-not-implemented",y.StoryPointIdMismatch="storypoint-id-mismatch",(h=t.FileFormats||(t.FileFormats={})).PDF="pdf",h.PNG="png",(f=t.PrintOrientation||(t.PrintOrientation={})).Portrait="portrait",f.Landscape="landscape",(d=t.PrintPageSize||(t.PrintPageSize={})).Letter="letter",d.Legal="legal",d.Note="note",d.Folio="folio",d.Tabloid="tabloid",d.Ledger="ledger",d.Statement="statement",d.Executive="executive",d.A3="A3",d.A4="A4",d.A5="A5",d.B4="B4",d.B5="B5",d.Quarto="quarto",d.Unspecified="unspecified",(p=t.PrintScaling||(t.PrintScaling={})).Automatic="automatic",p.Perc25="25%",p.Perc50="50%",p.Perc60="60%",p.Perc75="75%",p.Perc80="80%",p.Perc90="90%",p.Perc100="100%",p.Perc200="200%",p.Perc400="400%",p.AtMost1PageHigh="at-most-1-page-high",p.AtMost2PagesHigh="at-most-2-pages-high",p.AtMost1PageWide="at-most-1-page-wide",p.AtMost2PagesWide="at-most-2-pages-wide",(c=t.RevertVizSelection||(t.RevertVizSelection={})).All="all",c.Axes="axes",c.Filters="filters",c.Sorts="sorts",c.Shelves="shelves",(l=t.ToolbarButtons||(t.ToolbarButtons={})).Alerts="alerts",l.AskData="askData",l.CustomViews="customViews",l.DataDetails="dataDetails",l.Share="share",l.Subscribe="subscribe",(u=t.Toolbar||(t.Toolbar={})).Top="top",u.Bottom="bottom",u.Hidden="hidden",(s=t.SheetSizeBehavior||(t.SheetSizeBehavior={})).Automatic="automatic",s.Exactly="exactly",s.Range="range",s.AtLeast="atleast",s.AtMost="atmost",(a=t.PulseLayout||(t.PulseLayout={})).Default="default",a.Card="card",a.Ban="ban",(o=t.PulseTimeDimension||(t.PulseTimeDimension={})).Today="Today",o.Yesterday="Yesterday",o.WeekToDate="WeekToDate",o.LastWeek="LastWeek",o.MonthToDate="MonthToDate",o.LastMonth="LastMonth",o.QuarterToDate="QuarterToDate",o.LastQuarter="LastQuarter",o.YearToDate="YearToDate",o.LastYear="LastYear",(i=t.PulseErrorMessageVisibility||(t.PulseErrorMessageVisibility={})).Visible="visible",i.Hidden="hidden",i.Suppressed="suppressed",(n=t.TableauEventType||(t.TableauEventType={})).CustomViewLoaded="customviewloaded",n.CustomViewRemoved="customviewremoved",n.CustomViewSaved="customviewsaved",n.CustomViewSetDefault="customviewsetdefault",n.EditButtonClicked="editbuttonclicked",n.EditInDesktopButtonClicked="editindesktopbuttonclicked",n.FilterChanged="filterchanged",n.FirstVizSizeKnown="firstvizsizeknown",n.FirstInteractive="firstinteractive",n.CustomMarkContextMenuEvent="custommarkcontextmenu",n.MarkSelectionChanged="markselectionchanged",n.ParameterChanged="parameterchanged",n.ToolbarStateChanged="toolbarstatechanged",n.WorkbookReadyToClose="workbookreadytoclose",n.WorkbookPublished="workbookpublished",n.WorkbookPublishedAs="workbookpublishedas",n.UrlAction="urlaction",n.TabSwitched="tabswitched",n.StoryPointSwitched="storypointswitched",n.VizLoadError="vizloaderror",n.IframeSrcUpdated="iframesrcupdated",n.SummaryDataChanged="summarydatachanged",n.ReadyToReceiveAuthToken="readytoreceiveauthtoken",n.FirstPulseMetricSizeKnown="firstpulsemetricsizeknown",n.PulseError="pulseerror",n.PulseFiltersChanged="pulsefilterschanged",n.PulseInsightDiscovered="pulseinsightdiscovered",n.PulseTimeDimensionChanged="pulsetimedimensionchanged",n.PulseUrlChanged="pulseurlchanged",(t.ApiMenuType||(t.ApiMenuType={})).Ubertip="ubertip",(r=t.TableauDialogType||(t.TableauDialogType={})).ExportPDF="export-pdf",r.ExportPowerPoint="export-powerpoint",r.ExportData="export-data",r.ExportCrossTab="export-cross-tab",r.ExportWorkbook="export-workbook",r.Share="share"},828:(e,t)=>{"use strict";var r,n,i;Object.defineProperty(t,"__esModule",{value:!0}),(i=t.PulseAttributes||(t.PulseAttributes={})).DisableExploreFilter="disable-explore-filter",i.Layout="layout",i.OnFirstInteractive="onFirstInteractive",i.OnFirstPulseMetricSizeKnown="onFirstPulseMetricSizeKnown",i.OnPulseUrlError="onPulseError",i.OnPulseFiltersChanged="onPulseFiltersChanged",i.OnPulseInsightDiscovered="onPulseInsightDiscovered",i.OnPulseTimeDimensionChanged="onPulseTimeDimensionChanged",i.OnPulseUrlChanged="onPulseUrlChanged",i.TimeDimension="time-dimension",i.TokenOptional="token-optional",(n=t.PulseChildElements||(t.PulseChildElements={})).IframeStyle="iframe-style",n.ThemeParameter="theme-parameter",n.PulseFilter="pulse-filter",(r=t.PulseChildElementAttributes||(t.PulseChildElementAttributes={})).Name="name",r.Field="field",r.Value="value",r.Type="type"},3432:(e,t)=>{"use strict";var r,n,i,o,a;Object.defineProperty(t,"__esModule",{value:!0}),(a=t.VizSharedAttributes||(t.VizSharedAttributes={})).TouchOptimize="touch-optimize",a.HideEditInDesktopButton="hide-edit-in-desktop-button",a.SuppressDefaultEditBehavior="suppress-default-edit-behavior",a.DisableVersionCheck="disable-version-check",a.OnEditInDesktopButtonClicked="onEditInDesktopButtonClicked",a.OnFirstVizSizeKnown="onFirstVizSizeKnown",a.OnFirstInteractive="onFirstInteractive",(o=t.VizAttributes||(t.VizAttributes={})).DisableUrlActionsPopups="disable-url-actions",o.HideTabs="hide-tabs",o.Toolbar="toolbar",o.InstanceIdToClone="instance-id-to-clone",o.Device="device",o.HideEditButton="hide-edit-button",o.OnEditButtonClicked="onEditButtonClicked",o.OnFilterChanged="onFilterChanged",o.OnCustomMarkContextMenuEvent="onCustomMarkContextMenuEvent",o.OnMarkSelectionChanged="onMarkSelectionChanged",o.OnParameterChanged="onParameterChanged",o.OnToolbarStateChanged="onToolbarStateChanged",o.OnUrlAction="onUrlAction",o.OnTabSwitched="onTabSwitched",o.OnCustomViewLoaded="onCustomViewLoaded",o.OnCustomViewRemoved="onCustomViewRemoved",o.OnCustomViewSaved="onCustomViewSaved",o.OnCustomViewSetDefault="onCustomViewSetDefault",o.OnStoryPointSwitched="onStoryPointSwitched",o.OnSummaryDataChanged="onSummaryDataChanged",o.OnReadyToReceiveAuthToken="onReadyToReceiveAuthToken",(i=t.VizAuthoringAttributes||(t.VizAuthoringAttributes={})).OnWorkbookPublished="onWorkbookPublished",i.OnWorkbookPublishedAs="onWorkbookPublishedAs",i.OnWorkbookReadyToClose="onWorkbookReadyToClose",i.HideCloseButton="hide-close-button",(n=t.VizChildElements||(t.VizChildElements={})).VizFilter="viz-filter",n.VizParameter="viz-parameter",n.CustomParameter="custom-parameter",n.IframeStyle="iframe-style",(r=t.VizChildElementAttributes||(t.VizChildElementAttributes={})).Field="field",r.Value="value",r.Name="name"},1480:(e,t)=>{"use strict";var r,n,i,o;Object.defineProperty(t,"__esModule",{value:!0}),(o=t.WebComponentAttributes||(t.WebComponentAttributes={})).Src="src",o.Width="width",o.Height="height",o.Token="token",o.Debug="debug",o.IframeAuth="iframe-auth",o.OnVizLoadError="onvizloaderror",o.ForceTokenSync="force-token-sync",(i=t.EmbeddedIframeAttributes||(t.EmbeddedIframeAttributes={})).Loading="iframe-attr-loading",i.Style="iframe-attr-style",i.Class="iframe-attr-class",(n=t.WebComponentChildElements||(t.WebComponentChildElements={})).CustomParameter="custom-parameter",n.IframeStyle="iframe-style",(r=t.WebComponentChildElementAttributes||(t.WebComponentChildElementAttributes={})).Field="field",r.Value="value",r.Name="name"},4744:e=>{"use strict";var t;!function(e){var t,r,n,i,o,a,s,u,l;(l=e.ErrorCodes||(e.ErrorCodes={})).APINotInitialized="api-not-initialized",l.VisibilityError="visibility-error",l.DialogAlreadyOpen="dialog-already-open",l.DialogClosedByUser="dialog-closed-by-user",l.InternalError="internal-error",l.InvalidDomainDialog="invalid-dialog-domain",l.InvalidParameter="invalid-parameter",l.MissingFilter="missing-filter",l.MissingParameter="missing-parameter",l.ServerError="server-error",l.SettingSaveInProgress="setting-save-in-progress",l.UnsupportedEventName="unsupported-event-name",l.UnsupportedMethodForDataSourceType="unsupported-method-for-data-source-type",(u=e.ExtensionContext||(e.ExtensionContext={})).Desktop="desktop",u.Server="server",(s=e.ExtensionMode||(e.ExtensionMode={})).Authoring="authoring",s.Viewing="viewing",(a=e.TableauEventType||(e.TableauEventType={})).FilterChanged="filter-changed",a.MarkSelectionChanged="mark-selection-changed",a.SummaryDataChanged="summary-data-changed",a.ParameterChanged="parameter-changed",a.SettingsChanged="settings-changed",a.DashboardLayoutChanged="dashboard-layout-changed",a.WorkbookFormattingChanged="workbook-formatting-changed",a.WorksheetFormattingChanged="worksheet-formatting-changed",(o=e.VizImageEncodingType||(e.VizImageEncodingType={})).Discrete="discrete",o.Continuous="continuous",(i=e.VizImageSortDirectionType||(e.VizImageSortDirectionType={})).Ascending="ascending",i.Descending="descending",(n=e.VizImagePaletteType||(e.VizImagePaletteType={})).CustomDiverging="custom-diverging",n.CustomSequential="custom-sequential",(r=e.VizImageSizeSettingType||(e.VizImageSizeSettingType={})).Fixed="fixed",r.Manual="manual",(t=e.VizImageSizeSettingAlignmentType||(e.VizImageSizeSettingAlignmentType={})).Right="right",t.Left="left",t.Center="center"}(t||(t={})),e.exports=t},4912:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.SharedErrorCodes||(t.SharedErrorCodes={})).CrosstabCreationError="crosstab-creation-error",r.DataCreationError="data-creation-error",r.InvalidAggregationFieldName="invalid-aggregation-field-name",r.InvalidFilterFieldName="invalid-filter-name",r.InvalidFilterFieldValue="invalid-filter-fieldValue",r.InvalidSelectionDate="invalid-selection-date",r.InvalidSelectionFieldName="invalid-selection-fieldName",r.InvalidSelectionValue="invalid-selection-value",r.InvalidSelectionSheet="invalid-selection-sheet",r.InternalError="internal-error",r.InvalidParameter="invalid-parameter",r.PDFCreationError="pdf-creation-error",r.PowerPointCreationError="powerpoint-creation-error",r.NotActiveSheet="not-active-sheet",r.ImplementationError="wrong-implementation",r.ApiExecutionError="api-execution-error",r.ServerError="server-error",r.Timeout="timeout"},808:function(e){"use strict";var t,r=this&&this.__assign||function(){return r=Object.assign||function(e){for(var t,r=1,n=arguments.length;r{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}(r(4912));var n=r(808);t.AnalyticsObjectType=n.AnalyticsObjectType,t.AnnotationType=n.AnnotationType,t.ClassNameKey=n.ClassNameKey,t.ColumnType=n.ColumnType,t.DashboardLayoutChange=n.DashboardLayoutChange,t.DashboardObjectType=n.DashboardObjectType,t.DashboardObjectVisibilityType=n.DashboardObjectVisibilityType,t.DataType=n.DataType,t.DateRangeType=n.DateRangeType,t.DialogStyle=n.DialogStyle,t.EncodingType=n.EncodingType,t.FieldAggregationType=n.FieldAggregationType,t.FieldRoleType=n.FieldRoleType,t.FilterDomainType=n.FilterDomainType,t.FilterNullOption=n.FilterNullOption,t.FilterType=n.FilterType,t.FilterUpdateType=n.FilterUpdateType,t.HierarchicalLevelSelectionState=n.HierarchicalLevelSelectionState,t.IncludeDataValuesOption=n.IncludeDataValuesOption,t.MarkType=n.MarkType,t.ParameterValueType=n.ParameterValueType,t.PeriodType=n.PeriodType,t.QuickTableCalcType=n.QuickTableCalcType,t.ReplaySpeedType=n.ReplaySpeedType,t.SelectOptions=n.SelectOptions,t.SelectionUpdateType=n.SelectionUpdateType,t.SheetType=n.SheetType,t.SortDirection=n.SortDirection,t.TrendLineModelType=n.TrendLineModelType,t.ZoneVisibilityType=n.ZoneVisibilityType},3448:(e,t,r)=>{"use strict";function n(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}Object.defineProperty(t,"__esModule",{value:!0}),r(5668),r(5816),r(8824);var i=r(5892);t.INTERNAL_CONTRACT_VERSION=i,n(r(6716)),n(r(1080)),n(r(5824)),n(r(4547)),n(r(2400)),n(r(2496)),n(r(2472)),n(r(552)),n(r(3256)),n(r(7204)),n(r(3760)),n(r(4528)),n(r(3388)),t.MESSAGING_VERSION={major:1,minor:0,fix:0}},6716:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(1080),i=function(){function e(){}return e.isSpecial=function(e){return e.length>2&&"%"===e[0]&&"%"===e[e.length-1]},e.parseBoolean=function(e){var t=e.toLowerCase();return"true"!==t&&"false"!==t?this.specialValueIndicator:"true"===t},e.parseNumber=function(e){var t=Number(e);return isNaN(t)?this.specialValueIndicator:t},e.parseDate=function(e){var t=new Date(e);return Number.isNaN(t.getTime())?null:t},e.parseDateTime=function(e){var t=e.replace(" ","T").concat("Z"),r=new Date(t);return Number.isNaN(r.getTime())?null:r},e.convertValueAsStringToValue=function(e,t){if(null!=e){if(this.isSpecial(e))return e;switch(t){case n.DataType.Bool:return this.parseBoolean(e);case n.DataType.Int:case n.DataType.Float:return this.parseNumber(e);case n.DataType.Date:return null===this.parseDate(e)?this.specialValueIndicator:e;case n.DataType.DateTime:return null===this.parseDateTime(e)?this.specialValueIndicator:e;case n.DataType.Spatial:case n.DataType.String:default:return e}}},e.convertValueToNativeValue=function(e,t){if(null==e)return null;switch(t){case n.DataType.Bool:case n.DataType.Int:case n.DataType.Float:return"string"==typeof e?null:e;case n.DataType.Date:return this.parseDate(e);case n.DataType.DateTime:return this.parseDateTime(e);case n.DataType.String:return this.isSpecial(e)?null:e;case n.DataType.Spatial:default:return e}},e.convertStringValueToNativeValue=function(e,t){return this.convertValueToNativeValue(this.convertValueAsStringToValue(e,t),t)},e.specialValueIndicator="%null%",e}();t.DataTypeConverter=i},1080:(e,t)=>{"use strict";var r,n,i,o,a,s,u,l,c,p,d,f,h,y,m,g,v,b,I,S,T,_,P,A,E,w,D,O,x,F,C,k,M,N;Object.defineProperty(t,"__esModule",{value:!0}),(N=t.ExtensionContext||(t.ExtensionContext={})).Desktop="desktop",N.Server="server",N.Unknown="unknown",(M=t.ExtensionMode||(t.ExtensionMode={})).Authoring="authoring",M.Viewing="viewing",M.Unknown="unknown",(k=t.AnnotateEnum||(t.AnnotateEnum={})).Mark="mark",k.Point="point",k.Area="area",(C=t.ColumnType||(t.ColumnType={})).Discrete="discrete",C.Continuous="continuous",C.Unknown="unknown",(F=t.DashboardObjectType||(t.DashboardObjectType={})).Blank="blank",F.Worksheet="worksheet",F.QuickFilter="quick-filter",F.ParameterControl="parameter-control",F.PageFilter="page-filter",F.Legend="legend",F.Title="title",F.Text="text",F.Image="image",F.WebPage="web-page",F.Extension="extension",(x=t.DataType||(t.DataType={})).String="string",x.Int="int",x.Float="float",x.Bool="bool",x.Date="date",x.DateTime="date-time",x.Spatial="spatial",x.Unknown="unknown",(O=t.DialogStyle||(t.DialogStyle={})).Window="window",O.Modal="modal",O.Modeless="modeless",(D=t.EncodedDataType||(t.EncodedDataType={})).Number="number",D.String="string",D.Date="date",D.Boolean="boolean",(w=t.ErrorCodes||(t.ErrorCodes={})).INITIALIZATION_ERROR="initialization-error",w.INTERNAL_ERROR="internal-error",w.MISSING_ENUM_MAPPING="missing-enum-mapping",w.MISSING_PARAMETER="missing-parameter",w.PERMISSION_DENIED="permission-denied",w.PRES_MODEL_PARSING_ERROR="pres-model-parsing-error",w.VERSION_NOT_CONFIGURED="version-not-configured",w.VISIBILITY_ERROR="visibility-error",w.UNKNOWN_VERB_ID="unknown-verb-id",(E=t.FieldAggregationType||(t.FieldAggregationType={})).Sum="sum",E.Avg="avg",E.Min="min",E.Max="max",E.Stdev="stdev",E.Stdevp="stdevp",E.Var="var",E.Varp="varp",E.Collect="collect",E.Count="count",E.Countd="countd",E.Median="median",E.Attr="attr",E.None="none",E.Year="year",E.Qtr="qtr",E.Month="month",E.Day="day",E.Hour="hour",E.Minute="minute",E.Second="second",E.Week="week",E.Weekday="weekday",E.MonthYear="month-year",E.Mdy="mdy",E.End="end",E.TruncYear="trunc-year",E.TruncQtr="trunc-qtr",E.TruncMonth="trunc-month",E.TruncWeek="trunc-week",E.TruncDay="trunc-day",E.TruncHour="trunc-hour",E.TruncMinute="trunc-minute",E.TruncSecond="trunc-second",E.Quart1="quart1",E.Quart3="quart3",E.Skewness="skewness",E.Kurtosis="kurtosis",E.InOut="in-out",E.User="user",(A=t.FieldRoleType||(t.FieldRoleType={})).Dimension="dimension",A.Measure="measure",A.Unknown="unknown",(P=t.FilterUpdateType||(t.FilterUpdateType={})).Add="add",P.All="all",P.Replace="replace",P.Remove="remove",(_=t.SheetType||(t.SheetType={})).Dashboard="dashboard",_.Story="story",_.Worksheet="worksheet",(T=t.DomainRestrictionType||(t.DomainRestrictionType={})).All="all",T.List="list",T.Range="range",(S=t.DateStepPeriod||(t.DateStepPeriod={})).Years="years",S.Quarters="quarters",S.Months="months",S.Weeks="weeks",S.Days="days",S.Hours="hours",S.Minutes="minutes",S.Seconds="seconds",(I=t.FilterNullOption||(t.FilterNullOption={})).NullValues="nullvalues",I.NonNullValues="nonnullvalues",I.AllValues="allvalues",(b=t.FilterDomainType||(t.FilterDomainType={})).Relevant="relevant",b.Database="database",(v=t.SelectionUpdateType||(t.SelectionUpdateType={})).Replace="select-replace",v.Add="select-add",v.Remove="select-remove",(g=t.SelectOptions||(t.SelectOptions={})).Simple="select-options-simple",g.Toggle="select-options-toggle",g.Menu="select-options-menu",g.Range="select-options-range",g.Search="select-options-search",(m=t.QuantitativeIncludedValues||(t.QuantitativeIncludedValues={})).IncludeNull="include-null",m.IncludeNonNull="include-non-null",m.IncludeAll="include-all",(y=t.HierarchicalLevelSelectionState||(t.HierarchicalLevelSelectionState={})).AllSelected="all-selected",y.NoneSelected="none-selected",y.SomeSelected="some-selected",y.UnknownSelected="unknown-selected",(h=t.MarkType||(t.MarkType={})).Bar="bar",h.Line="line",h.Area="area",h.Square="square",h.Circle="circle",h.Shape="shape",h.Text="text",h.Map="map",h.Pie="pie",h.GanttBar="gantt-bar",h.Polygon="polygon",h.Heatmap="heatmap",h.VizExtension="viz-extension",(f=t.FilterType||(t.FilterType={})).Categorical="categorical",f.Range="range",f.RelativeDate="relativeDate",f.Hierarchical="hierarchical",(d=t.DateRangeType||(t.DateRangeType={})).Last="last",d.LastN="lastN",d.Next="next",d.NextN="nextN",d.Current="current",d.ToDate="toDate",(p=t.ExtensionDialogResult||(t.ExtensionDialogResult={})).DialogAlreadyOpen="dialog-already-open",p.InvalidDomain="invalid-domain",p.Success="success",(c=t.ApiShowDataTableFormat||(t.ApiShowDataTableFormat={})).NativeValuesOnly="native-values-only",c.FormattedValuesOnly="formatted-values-only",c.NativeAndFormattedValues="native-and-formatted-values",(l=t.PageSizeOption||(t.PageSizeOption={})).Letter="letter",l.Legal="legal",l.Note="note",l.Folio="folio",l.Tabloid="tabloid",l.Ledger="ledger",l.Statement="statement",l.Executive="executive",l.A3="a3",l.A4="a4",l.A5="a5",l.B4="b4",l.B5="b5",l.Quarto="quarto",l.Unspecified="unspecified",(u=t.PageOrientation||(t.PageOrientation={})).Printer="printer",u.Portrait="portrait",u.Landscape="landscape",(s=t.ScaleMode||(t.ScaleMode={})).ScaleAuto="auto",s.ScalePercentage="percent",s.ScaleFitPages="fit-pages",(a=t.PageScalingOption||(t.PageScalingOption={})).ScalePctAuto="auto",a.ScalePct400="pct400",a.ScalePct200="pct200",a.ScalePct100="pct100",a.ScalePct90="pct90",a.ScalePct80="pct80",a.ScalePct75="pct75",a.ScalePct60="pct60",a.ScalePct50="pct50",a.ScalePct25="pct25",(o=t.FitPages||(t.FitPages={})).FitOneHigh="fit0x1",o.FitTwoHigh="fit0x2",o.FitOneWide="fit1x0",o.FitTwoWide="fit2x0",(i=t.EncodingType||(t.EncodingType={})).Color="color",i.Size="size",i.Label="label",i.Detail="detail",i.Tooltip="tooltip",i.Shape="shape",i.Path="path",i.Angle="angle",i.Geometry="geometry",i.Custom="custom",(n=t.PulseTimeDimension||(t.PulseTimeDimension={})).Today="Today",n.Yesterday="Yesterday",n.WeekToDate="WeekToDate",n.LastWeek="LastWeek",n.MonthToDate="MonthToDate",n.LastMonth="LastMonth",n.QuarterToDate="QuarterToDate",n.LastQuarter="LastQuarter",n.YearToDate="YearToDate",n.LastYear="LastYear",(r=t.PulseErrorMessageVisibility||(t.PulseErrorMessageVisibility={})).Visible="visible",r.Hidden="hidden",r.Suppressed="suppressed"},5824:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.NotificationId||(t.NotificationId={})).CustomMarkContextMenuClicked="custom-mark-context-menu-clicked",r.ContextMenuClick="context-menu-click",r.CustomViewRemoved="custom-view-removed",r.CustomViewSaved="custom-view-saved",r.CustomViewSetDefault="custom-view-set-default",r.CustomViewsLoaded="custom-views-loaded",r.DashboardLayoutChanged="dashboard-layout-changed",r.EditButtonClicked="edit-button-clicked",r.EditInDesktopButtonClicked="edit-in-desktop-button-clicked",r.ExtensionDialogUpdate="extension-dialog-update",r.FilterChanged="filter-changed",r.FirstVizSizeKnown="first-viz-size-known",r.FirstPulseMetricSizeKnown="first-pulse-metric-size-known",r.ParameterChanged="parameter-changed",r.PulseError="pulse-error",r.PulseFiltersChanged="pulse-filters-changed",r.PulseInsightDiscovered="pulse-insight-discovered",r.PulseInteractive="pulse-interactive",r.PulseTimeDimensionChanged="pulse-time-dimension-changed",r.PulseUrlChanged="pulse-url-changed",r.SelectedMarksChanged="selected-marks-changed",r.SettingsChanged="settings-changed",r.SummaryDataChanged="summary-data-changed",r.TestConversionNotification="test-conversion-notification",r.ToolbarStateChanged="toolbar-state-changed",r.VizInteractive="viz-interactive",r.AskDataInteractive="ask-data-interactive",r.WorkbookReadyToClose="workbook-ready-to-close",r.WorkbookFormattingChanged="workbook-formatting-changed",r.WorkbookPublished="workbook-published",r.WorkbookPublishedAs="workbook-published-as",r.WorksheetFormattingChanged="worksheet-formatting-changed",r.UrlAction="url-action",r.TabSwitched="tab-switched",r.StoryPointSwitched="story-point-switched",r.ReadyToReceiveAuthToken="ready-to-receive-auth-token"},4547:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.ParameterId||(t.ParameterId={})).ActiveTablesInfo="active-tables-info",r.AnchorDate="anchor-date",r.AnnotateEnum="annotate-enum",r.AnnotationList="annotation-list",r.ApplyWorksheetFormatting="apply-worksheet-formatting",r.CategoricalDomain="categorical-domain",r.ClickThroughEnabled="click-through-enabled",r.Columns="columns",r.ColumnsToInclude="columns-to-include",r.ColumnsToIncludeById="columns-to-include-by-id",r.ConnectionDescriptionSummaries="connection-description-summaries",r.CurrentSheetType="current-sheet-type",r.CustomView="custom-view",r.CustomViewIsDefault="custom-view-is-default",r.CustomViewIsPublic="custom-view-is-public",r.CustomViewLuid="custom-view-luid",r.CustomViewName="custom-view-name",r.CustomViews="custom-views",r.Dashboard="dashboard",r.DashboardFilters="dashboard-filters",r.DashboardName="dashboard",r.DashboardObjectPositionAndSizeUpdate="dashboard-object-position-and-size-update",r.DashboardObjectPositionAndSizeUpdateList="dashboard-object-position-and-size-update-list",r.DataRowIndex="data-row-index",r.DataSchema="data-schema",r.DataSource="data-source",r.DataSourceDataTable="data-source-data-table",r.DataSourceId="data-source-id",r.DataSourceName="data-source-name",r.DataTable="data-table",r.DataTableReader="data-table-reader",r.DateRangeType="date-range-type",r.DeleteCount="delete-count",r.DeltaTimeMs="delta-time-ms",r.DimValSelectionModels="dimensionValueSelectionModels",r.DomainType="domain-type",r.EmbeddingAbstractQuery="embedding-abstract-query",r.EmbeddingBootstrapInfo="embedding-bootstrap-info",r.EncodingType="encoding-type",r.ExportCrosstabSheetMap="export-crosstab-sheet-map",r.ExportFile="export-file",r.ExportOriginUrl="export-origin-url",r.ExportPdfOptions="export-pdf-options",r.ExtensionBootstrapInfo="extension-bootstrap-info",r.ExtensionContextMenuIds="extension-context-menu-ids",r.ExtensionDialogH="extension-dialog-height",r.ExtensionDialogPayload="extension-dialog-payload",r.ExtensionDialogResult="extension-dialog-result",r.ExtensionDialogStyle="extension-dialog-style",r.ExtensionDialogUrl="extension-dialog-url",r.ExtensionDialogW="extension-dialog-width",r.ExtensionLocator="extension-locator",r.ExtensionSettingsInfo="extension-settings-info",r.ExtensionZoneId="extension-zone-id",r.ExternalMenuDescription="external-menu-description",r.ExternalMenuHeader="external-menu-header",r.ExternalMenuItemDisplayName="external-menu-item-display-name",r.ExternalMenuItemId="external-menu-item-id",r.Field="field",r.FieldCount="field-count",r.FieldId="field-id",r.FieldName="field-name",r.FilterLevels="filter-levels",r.FilterRangeMax="filter-range-max",r.FilterRangeMin="filter-range-min",r.FilterRangeNullOption="filter-range-null-option",r.FilterUpdateType="filter-update-type",r.FilterValues="filter-values",r.FontNameListItems="font-name-list-items",r.FormattedText="formatted-text",r.FunctionName="function-name",r.FromIndex="from-index",r.HierValSelectionModels="hierarchicalValueSelectionModels",r.HighlightedData="highlighted-data",r.HoverTupleInteraction="hover-tuple-interaction",r.IgnoreAliases="ignore-aliases",r.IgnoreSelection="ignore-selection",r.IncludeAllColumns="include-all-columns",r.InvalidAggFieldName="invalid-agg-field-name",r.InvalidDates="invalid-dates",r.InvalidFieldCaption="invalid-field-caption",r.InvalidFields="invalid-fields",r.InvalidValues="invalid-values",r.IsExcludeMode="is-exclude",r.IsExtensionDialog="is-extension-dialog",r.JoinDescription="join-description",r.LogicalTableId="logical-table-id",r.LogicalTableInfoList="logical-table-info-list",r.MarksCardIndex="marks-card-index",r.MaxHeight="max-height",r.MaxRows="max-rows",r.MaxWidth="max-width",r.MinHeight="min-height",r.MinWidth="min-width",r.PageRowCount="page-row-count",r.ParameterCaption="paremeter-caption",r.ParameterError="parameter-error",r.ParameterFieldName="parameter-field-name",r.ParameterInfo="parameter-info",r.ParameterInfos="parameter-infos",r.ParameterValue="parameter-value",r.PeriodType="period-type",r.PulseFieldName="fieldName",r.PulseFieldNames="fieldNames",r.PulseFilterDomainType="domainType",r.PulseFilterDomainSearchTerm="searchTerm",r.PulsePageSize="pageSize",r.PulseNextPageToken="nextPageToken",r.PulseFilters="filters",r.PulseTimeDimension="timeDimension",r.QuantitativeDomain="quantitative-dmain",r.QuantRangeSelectionModels="quantativeRangeSelectionModels",r.RangeN="range-n",r.ReplaySpeed="replay-speed",r.SelectedData="selected-data",r.SelectedSheetNames="selected-sheet-names",r.Selection="selection",r.SelectionList="selection-list",r.SelectionUpdateType="selectionUpdateType",r.SelectTuplesInteraction="select-tuples-interaction",r.SendNotifications="send-notifications",r.SettingsValues="settings-values",r.SharedFilterSheets="shared-filter-sheets",r.SharedFiltersInfo="shared-filters-info",r.SheetIdentifier="sheet-identifier",r.SheetName="sheet-name",r.SheetPath="sheet-path",r.ShouldRefreshDS="should-refresh-ds",r.ShowDataTableFormat="show-data-table-format",r.StartIndex="start-index",r.State="state",r.StoryPointIndex="story-point-index",r.StoryPointInfo="story-point-info",r.SwitchToSheetName="switch-to-sheet-name",r.TargetPoint="target-point",r.TestConversionParameter="test-conversion-parameter",r.Text="formatted-text",r.ToIndex="to-index",r.TooltipContext="tooltip-context",r.TooltipTextRequest="tooltip-text-request",r.TooltipText="tooltip-text",r.UnderlyingDataTable="underlying-data-table",r.UnderlyingSummaryDataTable="underlying-summary-data-table",r.Url="url",r.UseTabDelimiters="use-tab-delimiters",r.ViewDataTableCacheId="view-data-table-cache-id",r.ViewDataTableId="view-data-table-id",r.VisualId="visual-id",r.VisualSpecification="visual-specification",r.VizAPIInputJson="vizapi-input-json",r.VizAPIStateWithDataModel="vizapi-state-with-data-model",r.VizAPIStateWarningMsg="vizapi-state-warning-msg",r.VizAPISVG="vizapi-svg",r.WorksheetName="worksheet-name",r.WorksheetFilters="worksheet-filters",r.ZoneIdsVisibilityMap="zone-ids-visibility-map"},2400:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.VerbId||(t.VerbId={})).ActivateNextStoryPoint="activate-next-story-point",r.ActivatePreviousStoryPoint="activate-previous-story-point",r.ActivateSheet="activateSheet",r.ActivateStoryPoint="activate-story-point",r.AddMarksCardFields="add-marks-card-fields",r.AppendExternalMenuItem="append-external-menu-item",r.ApplyCategoricalFilter="categorical-filter",r.ApplyPulseFilters="apply-pulse-filters",r.ApplyPulseTimeDimension="apply-pulse-time-dimension",r.ApplyRangeFilter="range-filter",r.ApplyRelativeDateFilter="apply-relative-date-Filter",r.Authenticate="authenticate",r.BlockExtension="block-extension",r.ChangeParameterValue="change-parameter-value",r.ChangeSharedFilter="change-shared-filter",r.ClearAllPulseFilters="clear-all-pulse-filters",r.ClearFilter="clear-filter",r.ClearPulseFilters="clear-pulse-filters",r.ClearSelectedMarks="clear-selected-marks",r.CloseDialog="close-dialog",r.CreateAnnotation="create-annotation",r.DashboardCategoricalFilter="dashboard-categorical-filter",r.DisplayDialog="display-dialog",r.DownloadWorkbook="download-workbook",r.EditAliasesDialog="edit-aliases-dialog",r.ExecuteExternalMenuItem="execute-external-menu-item",r.ExportCrosstab="export-crosstab",r.ExportCrosstabCsvDownload="export-crosstab-csv-download",r.ExportCrosstabExcelDownload="export-crosstab-excel-download",r.ExportData="export-data",r.ExportDataDownload="export-data-download",r.ExportImage="export-image",r.ExportPdf="export-pdf",r.ExportPdfDownload="export-pdf-download",r.ExportPowerpoint="export-powerpoint",r.ExportPowerpointDownload="export-powerpoint-download",r.FindParameter="find-parameter",r.GetActiveTables="get-active-tables",r.GetAllDataSources="get-all-data-sources",r.GetAnnotations="get-annotations",r.GetCategoricalDomain="get-categorical-domain",r.GetConnectionDescriptionSummaries="get-connection-description-summaries",r.GetCurrentSrc="get-current-src",r.GetCustomViews="get-custom-views",r.GetDashboardFilters="get-dashboard-filters",r.GetDataSource="get-datasource",r.GetDataSourceData="get-datasource-data",r.GetDataSources="get-data-sources",r.GetDataSummaryData="get-summary-data",r.GetDataSummaryDataReader="get-summary-data-reader",r.GetDataTableReaderPage="get-data-table-reader-page",r.GetEmbeddingAbstractQueryWithDataModel="get-embedding-abstract-query-with-data-model",r.GetEmbeddingClientInfo="get-embedding-client-info",r.GetVizStateWithDataModel="get-viz-state-with-data-model",r.GetExportCrosstabSheetMap="get-export-crosstab-sheet-map",r.GetExportPdfOptions="get-export-pdf-options",r.GetField="get-field",r.GetFieldAndDataSource="get-field-and-datasource",r.GetVisualSpecification="get-visual-specification",r.GetFilters="get-filters",r.GetFonts="get-fonts",r.GetHighlightedMarks="get-highlighted-marks",r.GetJoinDescription="get-join-description",r.GetLogicalTableData="get-logical-table-data",r.GetLogicalTableDataReader="get-logical-table-data-reader",r.GetLogicalTables="get-logical-tables",r.GetParametersForSheet="get-parameters-for-sheet",r.GetPulseCategoricalDomain="get-pulse-categorical-domain",r.GetPulseFilters="get-pulse-filters",r.GetPulseTimeDimension="get-pulse-time-dimension",r.GetRangeDomain="get-range-domain",r.GetSelectedMarks="get-selected-marks",r.GetSharedFilter="get-shared-filter",r.GetTooltipText="get-tooltip-text",r.GetUnderlyingData="get-underlying-data",r.GetUnderlyingTableData="get-underlying-table-data",r.GetUnderlyingTableDataReader="get-underlying-table-data-reader",r.GetUnderlyingTables="get-underlying-tables",r.HierarchicalFilter="hierachical-filter",r.InitializeExtension="initialize-extension",r.MoveAndResizeZones="move-and-resize-zones",r.MoveMarksCardField="move-marks-card-field",r.RaiseLeaveMarkNavNotification="raise-leave-mark-nav-notification",r.RaiseHoverTupleNotification="raise-hover-tuple-notification",r.RaiseSelectTuplesNotification="raise-select-tuples-notification",r.Redo="redo",r.RefreshDataSource="refresh-data-source",r.ReleaseDataTableReader="release-data-table-reader",r.RemoveAnnotation="remove-annotation",r.RemoveCustomView="remove-custom-view",r.RemoveExternalMenuItem="remove-external-menu-item",r.RenameExternalMenu="rename-external-menu",r.ReplayAnimation="replay-animation",r.RevertStoryPoint="revert-story-point",r.RevertWorkbook="revert-workbook",r.SaveExtensionSettings="save-extension-settings",r.SaveWorkbookAsCustomView="save-workbook-as-custom-view",r.SelectByValue="select-by-value",r.SetActiveCustomViewAsDefault="set-active-custom-view-as-default",r.SetAutoUpdate="set-auto-update",r.SetClickThrough="set-click-through",r.SetVizStateWithDataModel="set-viz-state-with-data-model",r.SetSheetSize="set-sheet-size",r.SetZoneVisibility="set-zone-visibility",r.Share="share",r.ShowCustomView="show-custom-view",r.SpliceMarksCardFields="splice-marks-card-fields",r.TestConversionVerb="test-conversion-verb",r.Undo="undo",r.UpdateCustomView="update-custom-view",r.VizAPI="viz-api"},2496:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.AskDataOptionNames||(t.AskDataOptionNames={})).token="token",r.origin="origin",r.showEmbed="showEmbed",r.showPin="showPin",r.showSave="showSave",r.showShare="showShare",r.debug=":jsdebug",r.ApiID=":apiID",r.ApiExternalVersion=":apiExternalVersion",r.ApiInternalVersion=":apiInternalVersion",r.AskDataWebComponent=":askDataWebComponent"},2472:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.PulseOptionNames||(t.PulseOptionNames={})).embed="embed",r.token="token",r.disableExploreFilter="disableExploreFilter",r.layout="embed_layout",r.theme="embed_theme",r.ApiExternalVersion=":apiExternalVersion",r.ApiInternalVersion=":apiInternalVersion",r.PulseWebComponent=":pulseWebComponent"},552:(e,t)=>{"use strict";var r,n,i;Object.defineProperty(t,"__esModule",{value:!0}),function(e){e.ONE="1",e.ALERTS=":alerts",e.ALIAS="alias",e.ALLOW_DEFERRED_BOOTSTRAP=":allowDeferredBootstrap",e.ALLOW_AUTOGEN_WORKSHEET_PHONE_LAYOUTS="allowAutogenWorksheetPhoneLayouts",e.API_ID=":apiID",e.APP=":app",e.ATTACHMENT="attachment",e.IS_IPAD_APP="app",e.ANIMATE_TRANSITION=":animate_transition",e.ASCENDING="ascending",e.AUTHENTICATION="authentication",e.ATTRIBUTES="attributes",e.AUTHORING_SHEET=":authSheet",e.AXIS="axis",e.BOOTSTRAP_WHEN_NOTIFIED=":bootstrapWhenNotified",e.BROWSER_BACK_BUTTON_UNDO=":browserBackButtonUndo",e.BROWSER_RENDERING_ON="isBrowserRendering",e.BROWSER_RENDERING_THRESHOLD="browserRenderingThreshold",e.CHARSET="charset",e.CLIENT_DIMENSION="clientDimension",e.CLIENT_IP="client_ip",e.CLIENT_NUM="clientNum",e.COLON_EMBEDDED=":embedded",e.COLON_MOBILE=":mobile",e.COLON_DEEP_LINKING_DISABLED=":deepLinkingDisabled",e.COLON_WATERMARK=":watermark",e.COMMENTS=":comments",e.COMMENTING_ENABLED=":commentingEnabled",e.COMMENTING_MENTIONS_ENABLED=":commentingMentions",e.CONNECTION="connection",e.CREATED_BY_FEATURE="createdByFeature",e.CRYPTED_PASSWORD="crypted",e.CSSDEBUG=":cssdebug",e.CSV="csv",e.CUSTOM_VIEWS=":customViews",e.CV=":cv",e.CV_ID="cvId",e.DASHBOARD_PORT_SIZE="dashboardPortSize",e.DATA_DETAILS=":dataDetails",e.DATASOURCE="datasource",e.DEBUG=":debug",e.DELAY=":delay",e.DEPTH="depth",e.DEVICE_TYPE=":device",e.DEVICE_PIXEL_RATIO="devicePixelRatio",e.DEVICE_PREVIEW_MODE=":devicepreviewmode",e.DIMENSIONS=":dimensions",e.DISABLE_SHARED_SESSIONS=":disable_shared_sessions",e.DISABLE_URL_ACTIONS_POPUPS=":disableUrlActionsPopups",e.DIRECTION="direction",e.DISPLAY_OVERLAY=":display_overlay",e.DISPLAY_SHARE=":display_share",e.DISPLAY_SPINNER=":display_spinner",e.DISPLAY_STATIC_IMAGE=":display_static_image",e.DISPLAY_TABS="display_tabs",e.DISPLAY_VIEW_COUNT=":display_count",e.IGNORE_STICKY_SESSION=":ignore_sticky_session",e.INCREMENT_VIEW_COUNT=":increment_view_count",e.DOCMODE="docmode",e.DOMAIN="domain",e.DO_WORK="do_work",e.DX="dx",e.DY="dy",e.EDIT_DATA_ALERT=":editDataAlert",e.EMBED=":embed",e.EMBEDDED="embedded",e.ENCRYPTED="encrypted",e.API_EXTERNAL_VERSION=":apiExternalVersion",e.API_INTERNAL_VERSION=":apiInternalVersion",e.EXCLUDE="exclude",e.EXPORT_FORMAT=":export_format",e.FIELDNAME="fieldname",e.FIELD_NAME="field_name",e.FIELD_SEP="field_sep",e.FILE="file",e.FILTER_TILE_SIZE="filterTileSize",e.FN="fn",e.FOCUS="focus",e.FORCE_CACHE="force_cache",e.FORMAT="format",e.FORMAT_DATA_VALUE_LOCALLY="formatDataValueLocally",e.FROM_WG=":from_wg",e.GRAPHQL_DATABASE_ID=":graphQLDatabaseId",e.GRAPHQL_TABLE_ID=":graphQLTableId",e.GUID=":guid",e.H="h",e.HIDDEN="hidden",e.HIDE_CLOSE_BUTTON=":hideCloseButton",e.HIDE_EDIT_BUTTON=":hideEditButton",e.HIDE_EDIT_IN_DESKTOP_BUTTON=":hideEditInDesktopButton",e.HIGH_DPI=":highdpi",e.IMAGE_SIZE_LIMIT="imageSizeLimit",e.TRANSPARENT_LINE_MARKS_LIMIT="transparentLineMarkLimit",e.CLIENT_RENDER_PIXEL_LIMIT="clientRenderPixelLimit",e.IN="in",e.INSTANCE_ID=":iid",e.IS_GUEST_REDIRECT_FROM_VIZPORTAL=":isGuestRedirectFromVizportal",e.IS_MARK_ANIMATION_ENABLED="isMarkAnimationEnabled",e.IS_VIZPORTAL=":isVizPortal",e.INPUT_="input_string",e.JSDEBUG=":jsdebug",e.JSON="json",e.JSON_ONLY=":jsonOnly",e.KEEPFILE="keepfile",e.KEY="key",e.LANGUAGE="language",e.LANGUAGE_REQUESTED=":language",e.LINKTARGET=":linktarget",e.LOAD_ORDER_ID=":loadOrderID",e.LOAD_NEWEST_REVISION=":loadNewestRevision",e.LOCAL_PATHS=":localPaths",e.LOCALE="locale",e.LOCATION_ID="locationid",e.LOCATION_TYPE="locationtype",e.WORKBOOK_LOCALE="workbookLocale",e.MAXROWS="maxrows",e.MAX_AGE="maxAge",e.MAX_ROWS="maxRows",e.METHOD="method",e.MOBILE="mobile",e.MODIFIER="modifier",e.NAME="name",e.NAV_TYPE="navType",e.NAV_SRC="navSrc",e.NOATTACHMENT="no-attachment",e.NO_OVERWRITE="no_overwrite",e.OPEN_AUTHORING_IN_TOP_WINDOW=":openAuthoringInTopWindow",e.OPENID_HD=":openid_hd",e.OPENID_LOGIN_HINT=":openid_login_hint",e.OAUTHREQUEST="oauthrequest",e.OAUTH_CREDENTIAL_IDS="oauth_credential_ids",e.OFFLINE_MODE=":offlinemode",e.ORIGIN=":origin",e.OVERLAY=":overlay",e.P="p",e.PATH="path",e.PANE_RESOLVER_X="paneResolverX",e.PANE_RESOLVER_Y="paneResolverY",e.PARAM="param",e.PARENT_ID="parent_id",e.PASSWORD="password",e.PATTERN="pattern",e.PIXEL_RATIO=":pixelratio",e.PREFIX=":prefix",e.PREVIEW=":preview",e.PRIMARY_CONTENT_URL="primary_content_url",e.PROJECT="project",e.PROTOCOL="protocol",e.PSEUDO=":pseudo",e.QUERY="query",e.R="r",e.RANGE_TYPE="range_type",e.RECORD_SEP="record_sep",e.RECORD_CLIENT_PERFORMANCE=":record_client_performance",e.RECORD_PERFORMANCE=":record_performance",e.RECOVER_OLD_SESSION_ID=":recover_old_session_id",e.RECOVER_SESSION_STATE_TICKETS=":recover_session_state_tickets",e.REFRESH=":refresh",e.REFRESHUNMODIFIED=":refreshunmodified",e.REGION="region",e.RELOAD_ON_CUSTOM_VIEW_SAVE=":reloadOnCustomViewSave",e.RENDER=":render",e.RENDER_MAPS_CLIENT_SIDE="renderMapsClientSide",e.RETRY=":retry",e.REUSE="reuse",e.REUSE_FOREVER="reuse_forever",e.REVERT=":revert",e.SAVE_DB_PASSWORDS="save_db_passwords",e.SELECT_X="select_x",e.SELECT_Y="select_y",e.SESSION_FEATURE_PREFIX=":ff_",e.SESSION_FLAGS=":session_feature_flags",e.SHARE_BUTTON="share_button",e.SHEET_ID="sheet_id",e.SHARED="shared",e.SHOWALL="showall",e.SHOW_APP_BANNER=":showAppBanner",e.SHOW_ASK_DATA=":showAskData",e.SHOW_PARAMS="showParams",e.SHOW_SHARE_OPTIONS=":showShareOptions",e.SIZE=":size",e.SOURCE="source",e.STATE="state",e.STICKY_SESSION_KEY="stickySessionKey",e.SUBSCRIPTIONS=":subscriptions",e.SUMMARY="summary",e.SUPPRESS_DEFAULT_EDIT_BEHAVIOR=":suppressDefaultEditBehavior",e.SYNC_SESSION=":sync_session",e.SYNC_SESSION_STATE="sync_session_state",e.TABS=":tabs",e.TARGET="target",e.TARGET_SITE="target_site",e.TOOLBAR=":toolbar",e.TOOLTIP=":tooltip",e.TS="ts",e.UNDERLYING_TABLE_ID="underlying_table_id",e.UNDERLYING_TABLE_CAPTION="underlying_table_caption",e.UPDATE_TYPE="update_type",e.USE_GUEST=":useGuest",e.USE_INLINE_IMAGES="use_inline_images",e.USERAGENT="useragent",e.USERNAME="username",e.VALUE="value",e.VERBOSE_MODE="verboseMode",e.VIEW_ID="views_id",e.VIZ_SNAPSHOT_ID="viz_snapshot_id",e.VW=":vw",e.W="w",e.WORKSHEET_PORT_SIZE="worksheetPortSize",e.WATERMARK="watermark",e.WATERMARK_MARGIN=":watermark_margin",e.WB=":wb",e.WHICH="which",e.X="x",e.Y="y",e.ZID="zid",e.ZONE_ID="zone_id",e.KEYCHAIN_VERSION="keychain_version",e.DATASOURCE_ID="datasource_id",e.DATASOURCE_NAME="datasource_name",e.LENS_ID="lens_id",e.WIDTH="width",e.HEIGHT="height",e.LAYOUT_VIEWS="views",e.LAYOUT_MENUS="menus",e.LAYOUT_GEOMETRY="geometry",e.LAYOUT_PAGES="pages",e.LAYOUT_CACHEURL="cacheurl",e.LAYOUT_SHEET="sheet",e.LAYOUT_DEPTH="depth"}(r||(r={})),function(e){e.SHOW_VIZ_HOME=":showVizHome"}(n||(n={})),(i=t.VizOptionNames||(t.VizOptionNames={})).Size=":size",i.Embed=":embed",i.ApiInternalVersion=":apiInternalVersion",i.ApiExternalVersion=":apiExternalVersion",i.ShowVizHome=":showVizHome",i.Jsdebug=":jsdebug",i.BootstrapWhenNotified=":bootstrapWhenNotified",i.NavType="navType",i.NavSrc="navSrc",i.debug=":jsdebug",i.ApiID=":apiID",i.disableUrlActionsPopups=":disableUrlActionsPopups",i.hideTabs=":tabs",i.toolbar=":toolbar",i.device=":device",i.instanceIdToClone=":iid",i.touchOptimize="mobile",i.hideEditButton=":hideEditButton",i.hideEditInDesktopButton=":hideEditInDesktopButton",i.suppressDefaultEditBehavior=":suppressDefaultEditBehavior",i.hideCloseButton=":hideCloseButton"},3256:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(1808),i=r(3448),o=r(1680),a=r(4020),s=r(7204),u=function(){function e(e,t,r){this.thisWindow=e,this.otherWindow=t,this.otherWindowOrigin=r}return e.prototype.startListening=function(){var e=this;if(!this.unregisterFunction){var t=this.onMessageReceived.bind(this);this.thisWindow.addEventListener("message",t,!0),this.unregisterFunction=function(){return e.thisWindow.removeEventListener("message",t,!0)}}},e.prototype.stopListening=function(){this.unregisterFunction&&(this.unregisterFunction(),this.unregisterFunction=void 0)},e.prototype.setInitializeMessageHandler=function(e){this.initializeMessageHandler=e},e.prototype.setCommandResponseMessageHandler=function(e){this.commandResponseMessageHandler=e},e.prototype.setCommandMessageHandler=function(e){this.commandMessageHandler=e},e.prototype.setNotificationMessageHandler=function(e){this.notificationMessageHandler=e},e.prototype.setHandshakeMessageHandler=function(e){this.handshakeMessageHandler=e},e.prototype.prepareInitializationMessage=function(e,t,r){var i={msgGuid:n.raw(),msgType:s.MessageType.Initialize,crossFrameVersion:t,apiVersion:e,options:r};return this.prepareMessage(i)},e.prototype.prepareCommandMessage=function(e,t){var r={msgGuid:n.raw(),msgType:s.MessageType.Command,verbId:e,parameters:t};return this.prepareMessage(r)},e.prototype.prepareCommandResponseMessage=function(e,t,r){var i={msgGuid:n.raw(),msgType:s.MessageType.CommandResponse,commandGuid:e,data:t,error:r};return r&&(i.error=JSON.parse(JSON.stringify(r))),this.prepareMessage(i)},e.prototype.prepareNotificationMessage=function(e,t){var r={msgGuid:n.raw(),msgType:s.MessageType.Notification,notificationId:e,data:t};return this.prepareMessage(r)},e.prototype.prepareAckMessage=function(){var e={msgGuid:n.raw(),msgType:s.MessageType.Ack,platformVersion:i.INTERNAL_CONTRACT_VERSION};return this.prepareMessage(e)},e.prototype.prepareMessage=function(e){if(!this.otherWindow||!this.otherWindowOrigin)throw"Other window not initialized, cannot dispatch messages";return new o.CrossFramePreparedMessage(e,this.otherWindow,this.otherWindowOrigin)},e.prototype.onMessageReceived=function(e){if((!this.otherWindow||e.source===this.otherWindow)&&e.data){var t=e.data;if(a.isMessage(t))switch(t.msgType){case s.MessageType.Initialize:if(!a.isInitMessage(t)||!this.initializeMessageHandler)return;this.initializeMessageHandler(t,e.source);break;case s.MessageType.CommandResponse:if(!a.isCommandResponseMessage(t)||!this.commandResponseMessageHandler)return;this.commandResponseMessageHandler(t,e.source);break;case s.MessageType.Command:if(!a.isCommandMessage(t)||!this.commandMessageHandler)return;this.commandMessageHandler(t,e.source);break;case s.MessageType.Notification:if(!a.isNotificationMessage(t)||!this.notificationMessageHandler)return;this.notificationMessageHandler(t,e.source);break;case s.MessageType.Handshake:if(!a.isHandshakeMessage(t)||!this.handshakeMessageHandler)return;this.handshakeMessageHandler(t,e.source)}}},e.prototype.setOtherWindow=function(e){this.otherWindow=e},e.prototype.setOtherWindowOrigin=function(e){this.otherWindowOrigin=e},e}();t.CrossFrameMessenger=u},1680:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t,r){this._message=e,this._target=t,this._origin=r}return Object.defineProperty(e.prototype,"messageGuid",{get:function(){return this._message.msgGuid},enumerable:!0,configurable:!0}),e.prototype.send=function(){return this._target.postMessage(this._message,this._origin),this},e}();t.CrossFramePreparedMessage=r},4020:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(1808),i=r(5824),o=r(7204),a=new Set([i.NotificationId.EditButtonClicked,i.NotificationId.EditInDesktopButtonClicked,i.NotificationId.WorkbookPublished,i.NotificationId.WorkbookReadyToClose,i.NotificationId.ReadyToReceiveAuthToken]);function s(e){if(!e)return!1;var t=e;return!(!(t&&t.msgGuid&&t.msgType)||!n.isGuid(t.msgGuid)||"string"!=typeof t.msgType||[o.MessageType.Command,o.MessageType.CommandResponse,o.MessageType.Initialize,o.MessageType.Notification,o.MessageType.Handshake].indexOf(t.msgType)<0)}function u(e){if(!e)return!1;var t=e;return"object"==typeof t&&"number"==typeof t.fix&&"number"==typeof t.minor&&"number"==typeof t.major}t.isMessage=s,t.isVersion=u,t.isInitMessage=function(e){if(!s(e))return!1;var t=e;return!!(t.msgType===o.MessageType.Initialize&&t.apiVersion&&u(t.apiVersion)&&t.crossFrameVersion&&u(t.crossFrameVersion))},t.isCommandResponseMessage=function(e){if(!s(e))return!1;var t=e;return!(t.msgType!==o.MessageType.CommandResponse||!n.isGuid(t.commandGuid)||!t.data&&!t.error)},t.isCommandMessage=function(e){if(!s(e))return!1;var t=e;return!(t.msgType!==o.MessageType.Command||!t.parameters||"object"!=typeof t.parameters||!t.verbId||"string"!=typeof t.verbId)},t.isNotificationMessage=function(e){if(!s(e))return!1;var t=e;return!(t.msgType!==o.MessageType.Notification||!t.data&&!a.has(t.notificationId)||!t.notificationId||"string"!=typeof t.notificationId)},t.isHandshakeMessage=function(e){return!!s(e)&&e.msgType===o.MessageType.Handshake}},7204:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.MessageType||(t.MessageType={})).Initialize="initialize",r.Notification="notification",r.Command="command",r.CommandResponse="command-response",r.Handshake="v-handshake",r.Ack="v-ack"},9220:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(){}return e.prototype.upgradeExecuteCall=function(e,t){return{verb:e,parameters:t}},e.prototype.downgradeExecuteReturn=function(e){return e},e.prototype.downgradeNotification=function(e){return e},e}();t.IdentityVersionConverter=r},2320:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t,r,n,i){if(this._externalMajorVersion=e,this._platformMajorVersion=t,this._upgradeExecuteTranslations=r,this._downgradeExecuteTranslations=n,this._downgradeNotificationTranslations=i,this._externalMajorVersion>this._platformMajorVersion)throw new Error("Cannot convert between external version "+this._externalMajorVersion+" and "+this._platformMajorVersion)}return e.fromData=function(e,t,r,n,i){return new this(e.major,t.major,r,n,i)},e.prototype.upgradeExecuteCall=function(e,t){for(var r={verb:e,parameters:t},n=0,i=this._upgradeExecuteTranslations;n{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(9220),i=r(2320),o=r(720);function a(e,t){return e.major===t.major&&e.minor===t.minor}function s(e,t,r,o,s){var l=e.major,c=e.minor,p=t.major;if(l>p)throw new Error("External version must be less than or equal to platform version.\n externalMajorVersion="+l+" platformMajorVersion="+p);if(a(e,t))return new n.IdentityVersionConverter;var d=u(l,p,c,r),f=u(l,p,c,o),h=u(l,p,c,s);return f.reverse(),h.reverse(),i.StackingVersionConverter.fromData(e,t,d,f,h)}function u(e,t,r,n){for(var i=[],o=e;o<=t;o++)if(o in n)for(var a=o===e?r:0,s=l(Object.keys(n[o])),u=a;u<=s;u++)u in n[o]&&i.push.apply(i,n[o][u]);return i}function l(e){return e.map((function(e){return Number(e)})).reduce((function(e,t){return e>t?e:t}))}t.VersionLessThan=function(e,t){return!(e.major>t.major)&&(e.major{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(5824);t.DowngradeWorksheetNames=function(e){var t=e.result;return void 0!==t.extensionDashboardInfo&&t.extensionDashboardInfo.zones.forEach((function(e){e.sheetInfo&&(e.name=e.sheetInfo.name)})),e},t.DowngradeFlipboardZoneID=function(e){if(e.notificationId===n.NotificationId.SelectedMarksChanged){var t=e.data;void 0===t.flipboardZoneID&&(t.flipboardZoneID=0)}return e};var i=["tableau-row-dividers","tableau-column-dividers","tableau-pane"];t.DowngradeWorksheetFomatting175=function(e){return r=i,(null===(o=null===(n=a=(t=e).result)||void 0===n?void 0:n.extensionWorksheetInfo)||void 0===o?void 0:o.formatting)&&(a.extensionWorksheetInfo.formatting.formattingSheets=a.extensionWorksheetInfo.formatting.formattingSheets.filter((function(e){return!r.includes(e.classNameKey)}))),t;var t,r,n,o,a},t.DowngradeWorksheetFomattingNotification175=function(e){return function(e,t){if(e.notificationId===n.NotificationId.WorksheetFormattingChanged){var r=e.data;e.data=r.formattingSheets.filter((function(e){return!t.includes(e.classNameKey)}))}return e}(e,i)}},4528:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(){}return e.prototype.downgradeExecuteCall=function(e,t){return{verb:e,parameters:t}},e.prototype.upgradeExecuteReturn=function(e,t,r){return e},e.prototype.upgradeNotification=function(e){return e},e}();t.ExternalIdentityVersionConverter=r},5768:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t,r,n,i){if(this._externalVersion=e,this._platformVersion=t,this._downgradeExecuteCallTranslations=r,this._upgradeExecuteReturnTranslations=n,this._upgradeNotificationTranslations=i,this._externalVersion.major>this._platformVersion.major)throw new Error("Cannot convert between external version "+this._externalVersion.major+"\n and "+this._platformVersion.major)}return e.prototype.downgradeExecuteCall=function(e,t){for(var r={verb:e,parameters:t},n=0,i=this._downgradeExecuteCallTranslations;n{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(3760),i=r(4528),o=r(5768),a=r(2088);function s(e,t,r,a,s){var l=e.major,c=t.major,p=t.minor;if(l>c)throw new Error("External version must be less than or equal to platform version.\n externalMajorVersion="+l+" platformMajorVersion="+c);if(l{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(3448);function i(e){void 0!==e&&void 0!==e.dataTable&&Array.isArray(e.dataTable)&&e.dataTable.forEach((function(t){t.forEach((function(t,r){var i=t.value;null!==i&&(t.value=n.DataTypeConverter.convertValueAsStringToValue(i,e.headers[r].dataType))}))}))}t.UpgradeDataTableTypes=function(e,t,r){if(!e)return e;var n=e.result;if(void 0!==n.data&&void 0!==n.isSummary)return i(n.data),e;var o=e.result;return void 0!==o.data&&Array.isArray(o.data)?(o.data.forEach((function(e){i(e)})),e):e},t.UpgradeDataTableRowsAndColumns=function(e,t,r){return function(e){return e===n.VerbId.GetDataSummaryData}(t)&&r[n.ParameterId.MaxRows]&&(e=function(e,t){var r=e.result;return r.data&&Array.isArray(r.data.dataTable)?(t>0&&t{"use strict";function n(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}Object.defineProperty(t,"__esModule",{value:!0});var i=r(2808);t.ApiVersion=i.ApiVersion,n(r(5184));var o=r(8540);t.CrossFrameDispatcher=o.CrossFrameDispatcher;var a=r(8340);t.DataSource=a.DataSource;var s=r(1044);t.ExternalToInternalEnumMappings=s.ExternalToInternalEnumMappings;var u=r(6557);t.InternalToExternalEnumMappings=u.InternalToExternalEnumMappings;var l=r(2680);t.EventListenerManager=l.EventListenerManager;var c=r(1072);t.Field=c.Field;var p=r(2520);t.CustomViewImpl=p.CustomViewImpl;var d=r(1940);t.DashboardImpl=d.DashboardImpl;var f=r(6488);t.DashboardObjectImpl=f.DashboardObjectImpl;var h=r(2180);t.DataSourceImpl=h.DataSourceImpl;var y=r(8552);t.ParameterImpl=y.ParameterImpl;var m=r(8332);t.SheetImpl=m.SheetImpl;var g=r(1116);t.SheetInfoImpl=g.SheetInfoImpl;var v=r(5144);t.SingleEventManagerImpl=v.SingleEventManagerImpl;var b=r(6804);t.StoryImpl=b.StoryImpl;var I=r(2608);t.StoryPointImpl=I.StoryPointImpl;var S=r(6068);t.StoryPointInfoImpl=S.StoryPointInfoImpl;var T=r(3044);t.WorkbookImpl=T.WorkbookImpl;var _=r(6500);t.WorksheetImpl=_.WorksheetImpl;var P=r(3987);t.Point=P.Point,n(r(8672)),n(r(3008));var A=r(1832);t.ClientInfoServiceImpl=A.ClientInfoServiceImpl;var E=r(1288);t.NotificationServiceImpl=E.NotificationServiceImpl;var w=r(6428);t.NotificationServiceImplBase=w.NotificationServiceImplBase,t.Registration=w.Registration;var D=r(1776);t.ServiceImplBase=D.ServiceImplBase;var O=r(4109);t.SizeServiceImpl=O.SizeServiceImpl;var x=r(2248);t.StoryActivationServiceImpl=x.StoryActivationServiceImpl;var F=r(6664);t.TableauError=F.TableauError;var C=r(1724);t.Deferred=C.Deferred;var k=r(7480);t.ErrorHelpers=k.ErrorHelpers;var M=r(5044);t.ExportHelpers=M.ExportHelpers;var N=r(2780);t.SheetUtils=N.SheetUtils;var R=r(1576);t.VersionNumber=R.VersionNumber;var V=r(8648);t.VersionedExternalApiDispatcher=V.VersionedExternalApiDispatcher},2808:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(1576),i=function(){function e(){}return Object.defineProperty(e,"Instance",{get:function(){return e._instance},enumerable:!0,configurable:!0}),e.SetVersionNumber=function(t,r){e._instance=new n.VersionNumber(t,r)},e}();t.ApiVersion=i},716:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this._connectionInfo=e}return Object.defineProperty(e.prototype,"name",{get:function(){return this._connectionInfo.name},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"id",{get:function(){return this._connectionInfo.id},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"serverURI",{get:function(){return this._connectionInfo.serverURI},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"type",{get:function(){return this._connectionInfo.type},enumerable:!0,configurable:!0}),e}();t.ConnectionSummary=r},5184:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(3448),i=r(8540);t.doCrossFrameBootstrap=function(e,t,r){return new Promise((function(o,a){var s;(s=function(e){try{return e.self!==e.parent}catch(e){return!0}}(e)?e.parent:e.opener)||a("This extension is not running inside an iframe, desktop, or popup window. Initialization failed.");var u=new n.CrossFrameMessenger(e,s,"*"),l=u.prepareInitializationMessage(t,n.MESSAGING_VERSION,r);u.setCommandResponseMessageHandler((function(e){e.commandGuid===l.messageGuid&&o((function(){return new i.CrossFrameDispatcher(u)}))})),u.startListening(),l.send()}))}},8540:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=function(){function e(e){if(this._messenger=e,this._pendingPromises={},this._notificationHandlers=[],!this._messenger)throw"Missing messenger object";this._messenger.setCommandResponseMessageHandler(this.onCommandResponse.bind(this)),this._messenger.setNotificationMessageHandler(this.onNotification.bind(this))}return e.prototype.execute=function(e,t){var r=this,n=this._messenger.prepareCommandMessage(e,t),i=new Promise((function(e,t){r._pendingPromises[n.messageGuid]={resolve:e,reject:t}}));return n.send(),i},e.prototype.registerNotificationHandler=function(e){this._notificationHandlers.push(e)},e.prototype.unregisterNotificationHandler=function(e){this._notificationHandlers=this._notificationHandlers.filter((function(t){return t!==e}))},e.prototype.onCommandResponse=function(e){if(!(Object.keys(this._pendingPromises).indexOf(e.commandGuid)<0)){var t=this._pendingPromises[e.commandGuid];e.error&&t.reject(e.error),e.data&&t.resolve({result:e.data}),delete this._pendingPromises[e.commandGuid]}},e.prototype.onNotification=function(e){for(var t=0,r=this._notificationHandlers;t{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this._dataSourceImpl=e}return Object.defineProperty(e.prototype,"name",{get:function(){return this._dataSourceImpl.name},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"id",{get:function(){return this._dataSourceImpl.id},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"fields",{get:function(){return this._dataSourceImpl.fields},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"extractUpdateTime",{get:function(){return this._dataSourceImpl.extractUpdateTime},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isExtract",{get:function(){return this._dataSourceImpl.isExtract},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isPublished",{get:function(){return this._dataSourceImpl.isPublished},enumerable:!0,configurable:!0}),e.prototype.publishedUrl=function(){return this._dataSourceImpl.publishedUrl()},e.prototype.refreshAsync=function(){return this._dataSourceImpl.refreshAsync()},e.prototype.getActiveTablesAsync=function(){return console.warn("DataSource.getActiveTablesAsync is deprecated. Please use DataSource.getLogicalTablesAsync."),this._dataSourceImpl.getActiveTablesAsync()},e.prototype.getConnectionSummariesAsync=function(){return this._dataSourceImpl.getConnectionSummariesAsync()},e.prototype.getUnderlyingDataAsync=function(e){return console.warn("DataSource.getUnderlyingDataAsync is deprecated. Please use DataSource.getLogicalTablesAsync and DataSource.getLogicalTableDataAsync."),this._dataSourceImpl.getUnderlyingDataAsync(e)},e.prototype.getLogicalTablesAsync=function(){return this._dataSourceImpl.getLogicalTablesAsync()},e.prototype.getLogicalTableDataAsync=function(e,t){return this._dataSourceImpl.getLogicalTableDataAsync(e,t)},e.prototype.getLogicalTableDataReaderAsync=function(e,t,r){return this._dataSourceImpl.getLogicalTableDataReaderAsync(e,t,r)},e}();t.DataSource=r},1044:(e,t,r)=>{"use strict";var n,i,o,a,s,u,l,c,p,d;Object.defineProperty(t,"__esModule",{value:!0});var f=r(7419),h=r(3448),y=r(5520),m=function(){function e(){}return e.filterDomainType=new y.EnumConverter(((n={})[f.FilterDomainType.Relevant]=h.FilterDomainType.Relevant,n[f.FilterDomainType.Database]=h.FilterDomainType.Database,n)),e.nullOptions=new y.EnumConverter(((i={})[f.FilterNullOption.AllValues]=h.FilterNullOption.AllValues,i[f.FilterNullOption.NonNullValues]=h.FilterNullOption.NonNullValues,i[f.FilterNullOption.NullValues]=h.FilterNullOption.NullValues,i)),e.filterUpdateType=new y.EnumConverter(((o={})[f.FilterUpdateType.Add]=h.FilterUpdateType.Add,o[f.FilterUpdateType.All]=h.FilterUpdateType.All,o[f.FilterUpdateType.Remove]=h.FilterUpdateType.Remove,o[f.FilterUpdateType.Replace]=h.FilterUpdateType.Replace,o)),e.setVisibilityType=new y.EnumConverter(((a={})[f.ZoneVisibilityType.Show]=!0,a[f.ZoneVisibilityType.Hide]=!1,a)),e.setReplaySpeedType=new y.EnumConverter(((s={})[f.ReplaySpeedType.Slow]=2,s[f.ReplaySpeedType.Normal]=1,s[f.ReplaySpeedType.Fast]=.5,s)),e.sheetType=new y.EnumConverter(((u={})[f.SheetType.Dashboard]=h.SheetType.Dashboard,u[f.SheetType.Worksheet]=h.SheetType.Worksheet,u[f.SheetType.Story]=h.SheetType.Story,u)),e.showDataTableFormatType=new y.EnumConverter(((l={})[f.IncludeDataValuesOption.AllValues]=h.ApiShowDataTableFormat.NativeAndFormattedValues,l[f.IncludeDataValuesOption.OnlyNativeValues]=h.ApiShowDataTableFormat.NativeValuesOnly,l[f.IncludeDataValuesOption.OnlyFormattedValues]=h.ApiShowDataTableFormat.FormattedValuesOnly,l)),e.periodType=new y.EnumConverter(((c={})[f.PeriodType.Years]=h.DateStepPeriod.Years,c[f.PeriodType.Quarters]=h.DateStepPeriod.Quarters,c[f.PeriodType.Months]=h.DateStepPeriod.Months,c[f.PeriodType.Weeks]=h.DateStepPeriod.Weeks,c[f.PeriodType.Days]=h.DateStepPeriod.Days,c[f.PeriodType.Hours]=h.DateStepPeriod.Hours,c[f.PeriodType.Minutes]=h.DateStepPeriod.Minutes,c[f.PeriodType.Seconds]=h.DateStepPeriod.Seconds,c)),e.dateRangeType=new y.EnumConverter(((p={})[f.DateRangeType.Last]=h.DateRangeType.Last,p[f.DateRangeType.LastN]=h.DateRangeType.LastN,p[f.DateRangeType.Next]=h.DateRangeType.Next,p[f.DateRangeType.NextN]=h.DateRangeType.NextN,p[f.DateRangeType.Current]=h.DateRangeType.Current,p[f.DateRangeType.ToDate]=h.DateRangeType.ToDate,p)),e.dialogStyles=new y.EnumConverter(((d={})[f.DialogStyle.Window]=h.DialogStyle.Window,d[f.DialogStyle.Modal]=h.DialogStyle.Modal,d[f.DialogStyle.Modeless]=h.DialogStyle.Modeless,d)),e}();t.ExternalToInternalEnumMappings=m},6557:(e,t,r)=>{"use strict";var n,i,o,a,s,u,l,c,p,d,f,h,y,m,g,v,b,I;Object.defineProperty(t,"__esModule",{value:!0});var S=r(7419),T=r(3448),_=r(5520),P=function(){function e(){}return e.extensionContext=new _.EnumConverter(((n={})[T.ExtensionContext.Desktop]=S.ExtensionContext.Desktop,n[T.ExtensionContext.Server]=S.ExtensionContext.Server,n)),e.extensionMode=new _.EnumConverter(((i={})[T.ExtensionMode.Authoring]=S.ExtensionMode.Authoring,i[T.ExtensionMode.Viewing]=S.ExtensionMode.Viewing,i)),e.columnType=new _.EnumConverter(((o={})[T.ColumnType.Continuous]=S.ColumnType.Continuous,o[T.ColumnType.Discrete]=S.ColumnType.Discrete,o[T.ColumnType.Unknown]=S.ColumnType.Unknown,o)),e.fieldAggregationType=new _.EnumConverter(((a={})[T.FieldAggregationType.Attr]=S.FieldAggregationType.Attr,a[T.FieldAggregationType.Avg]=S.FieldAggregationType.Avg,a[T.FieldAggregationType.Collect]=S.FieldAggregationType.Collect,a[T.FieldAggregationType.Count]=S.FieldAggregationType.Count,a[T.FieldAggregationType.Countd]=S.FieldAggregationType.Countd,a[T.FieldAggregationType.Day]=S.FieldAggregationType.Day,a[T.FieldAggregationType.End]=S.FieldAggregationType.End,a[T.FieldAggregationType.Hour]=S.FieldAggregationType.Hour,a[T.FieldAggregationType.InOut]=S.FieldAggregationType.InOut,a[T.FieldAggregationType.Kurtosis]=S.FieldAggregationType.Kurtosis,a[T.FieldAggregationType.Max]=S.FieldAggregationType.Max,a[T.FieldAggregationType.Mdy]=S.FieldAggregationType.Mdy,a[T.FieldAggregationType.Median]=S.FieldAggregationType.Median,a[T.FieldAggregationType.Min]=S.FieldAggregationType.Min,a[T.FieldAggregationType.Minute]=S.FieldAggregationType.Minute,a[T.FieldAggregationType.MonthYear]=S.FieldAggregationType.MonthYear,a[T.FieldAggregationType.None]=S.FieldAggregationType.None,a[T.FieldAggregationType.Qtr]=S.FieldAggregationType.Qtr,a[T.FieldAggregationType.Quart1]=S.FieldAggregationType.Quart1,a[T.FieldAggregationType.Quart3]=S.FieldAggregationType.Quart3,a[T.FieldAggregationType.Second]=S.FieldAggregationType.Second,a[T.FieldAggregationType.Skewness]=S.FieldAggregationType.Skewness,a[T.FieldAggregationType.Stdev]=S.FieldAggregationType.Stdev,a[T.FieldAggregationType.Stdevp]=S.FieldAggregationType.Stdevp,a[T.FieldAggregationType.Sum]=S.FieldAggregationType.Sum,a[T.FieldAggregationType.TruncDay]=S.FieldAggregationType.TruncDay,a[T.FieldAggregationType.TruncHour]=S.FieldAggregationType.TruncHour,a[T.FieldAggregationType.TruncMinute]=S.FieldAggregationType.TruncMinute,a[T.FieldAggregationType.TruncMonth]=S.FieldAggregationType.TruncMonth,a[T.FieldAggregationType.TruncQtr]=S.FieldAggregationType.TruncQtr,a[T.FieldAggregationType.TruncSecond]=S.FieldAggregationType.TruncSecond,a[T.FieldAggregationType.TruncWeek]=S.FieldAggregationType.TruncWeek,a[T.FieldAggregationType.TruncYear]=S.FieldAggregationType.TruncYear,a[T.FieldAggregationType.User]=S.FieldAggregationType.User,a[T.FieldAggregationType.Var]=S.FieldAggregationType.Var,a[T.FieldAggregationType.Varp]=S.FieldAggregationType.Varp,a[T.FieldAggregationType.Week]=S.FieldAggregationType.Week,a[T.FieldAggregationType.Weekday]=S.FieldAggregationType.Weekday,a[T.FieldAggregationType.Year]=S.FieldAggregationType.Year,a)),e.fieldRoleType=new _.EnumConverter(((s={})[T.FieldRoleType.Dimension]=S.FieldRoleType.Dimension,s[T.FieldRoleType.Measure]=S.FieldRoleType.Measure,s[T.FieldRoleType.Unknown]=S.FieldRoleType.Unknown,s)),e.sheetType=new _.EnumConverter(((u={})[T.SheetType.Dashboard]=S.SheetType.Dashboard,u[T.SheetType.Story]=S.SheetType.Story,u[T.SheetType.Worksheet]=S.SheetType.Worksheet,u)),e.dashboardObjectType=new _.EnumConverter(((l={})[T.DashboardObjectType.Extension]=S.DashboardObjectType.Extension,l[T.DashboardObjectType.Blank]=S.DashboardObjectType.Blank,l[T.DashboardObjectType.Image]=S.DashboardObjectType.Image,l[T.DashboardObjectType.Legend]=S.DashboardObjectType.Legend,l[T.DashboardObjectType.PageFilter]=S.DashboardObjectType.PageFilter,l[T.DashboardObjectType.ParameterControl]=S.DashboardObjectType.ParameterControl,l[T.DashboardObjectType.QuickFilter]=S.DashboardObjectType.QuickFilter,l[T.DashboardObjectType.Text]=S.DashboardObjectType.Text,l[T.DashboardObjectType.Title]=S.DashboardObjectType.Title,l[T.DashboardObjectType.WebPage]=S.DashboardObjectType.WebPage,l[T.DashboardObjectType.Worksheet]=S.DashboardObjectType.Worksheet,l)),e.dataType=new _.EnumConverter(((c={})[T.DataType.Bool]=S.DataType.Bool,c[T.DataType.Date]=S.DataType.Date,c[T.DataType.DateTime]=S.DataType.DateTime,c[T.DataType.Float]=S.DataType.Float,c[T.DataType.Int]=S.DataType.Int,c[T.DataType.Spatial]=S.DataType.Spatial,c[T.DataType.String]=S.DataType.String,c)),e.filterUpdateType=new _.EnumConverter(((p={})[T.FilterUpdateType.Add]=S.FilterUpdateType.Add,p[T.FilterUpdateType.All]=S.FilterUpdateType.All,p[T.FilterUpdateType.Remove]=S.FilterUpdateType.Remove,p[T.FilterUpdateType.Replace]=S.FilterUpdateType.Replace,p)),e.allowableValues=new _.EnumConverter(((d={})[T.DomainRestrictionType.All]=S.ParameterValueType.All,d[T.DomainRestrictionType.List]=S.ParameterValueType.List,d[T.DomainRestrictionType.Range]=S.ParameterValueType.Range,d)),e.dateStepPeriod=new _.EnumConverter(((f={})[T.DateStepPeriod.Years]=S.PeriodType.Years,f[T.DateStepPeriod.Quarters]=S.PeriodType.Quarters,f[T.DateStepPeriod.Months]=S.PeriodType.Months,f[T.DateStepPeriod.Weeks]=S.PeriodType.Weeks,f[T.DateStepPeriod.Days]=S.PeriodType.Days,f[T.DateStepPeriod.Hours]=S.PeriodType.Hours,f[T.DateStepPeriod.Minutes]=S.PeriodType.Minutes,f[T.DateStepPeriod.Seconds]=S.PeriodType.Seconds,f)),e.dateRangeType=new _.EnumConverter(((h={})[T.DateRangeType.Current]=S.DateRangeType.Current,h[T.DateRangeType.Last]=S.DateRangeType.Last,h[T.DateRangeType.LastN]=S.DateRangeType.LastN,h[T.DateRangeType.Next]=S.DateRangeType.Next,h[T.DateRangeType.NextN]=S.DateRangeType.NextN,h[T.DateRangeType.ToDate]=S.DateRangeType.ToDate,h)),e.errorCode=new _.EnumConverter(((y={})[T.ErrorCodes.INITIALIZATION_ERROR]=S.ErrorCodes.InternalError,y[T.ErrorCodes.INTERNAL_ERROR]=S.ErrorCodes.InternalError,y[T.ErrorCodes.MISSING_ENUM_MAPPING]=S.ErrorCodes.InternalError,y[T.ErrorCodes.MISSING_PARAMETER]=S.ErrorCodes.InternalError,y[T.ErrorCodes.PERMISSION_DENIED]=S.ErrorCodes.InternalError,y[T.ErrorCodes.PRES_MODEL_PARSING_ERROR]=S.ErrorCodes.InternalError,y[T.ErrorCodes.UNKNOWN_VERB_ID]=S.ErrorCodes.InternalError,y[T.ErrorCodes.VERSION_NOT_CONFIGURED]=S.ErrorCodes.APINotInitialized,y[T.ErrorCodes.VISIBILITY_ERROR]=S.ErrorCodes.VisibilityError,y),S.ErrorCodes.InternalError),e.filterType=new _.EnumConverter(((m={})[T.FilterType.Categorical]=S.FilterType.Categorical,m[T.FilterType.Range]=S.FilterType.Range,m[T.FilterType.RelativeDate]=S.FilterType.RelativeDate,m[T.FilterType.Hierarchical]=S.FilterType.Hierarchical,m)),e.classNameKey=new _.EnumConverter(((g={})["tableau-dashboard-title"]=S.ClassNameKey.DashboardTitle,g["tableau-story-title"]=S.ClassNameKey.StoryTitle,g["tableau-tooltip"]=S.ClassNameKey.Tooltip,g["tableau-worksheet"]=S.ClassNameKey.Worksheet,g["tableau-worksheet-title"]=S.ClassNameKey.WorksheetTitle,g["tableau-pane"]=S.ClassNameKey.Pane,g["tableau-row-dividers"]=S.ClassNameKey.RowDividers,g["tableau-column-dividers"]=S.ClassNameKey.ColumnDividers,g["dashboard-title"]=S.ClassNameKey.DashboardTitle,g["story-title"]=S.ClassNameKey.StoryTitle,g.tooltip=S.ClassNameKey.Tooltip,g.worksheet=S.ClassNameKey.Worksheet,g["worksheet-title"]=S.ClassNameKey.WorksheetTitle,g.pane=S.ClassNameKey.Pane,g["row-dividers"]=S.ClassNameKey.RowDividers,g["column-dividers"]=S.ClassNameKey.ColumnDividers,g)),e.hierarchicalLevelSelectionState=new _.EnumConverter(((v={})[T.HierarchicalLevelSelectionState.AllSelected]=S.HierarchicalLevelSelectionState.AllSelected,v[T.HierarchicalLevelSelectionState.NoneSelected]=S.HierarchicalLevelSelectionState.NoneSelected,v[T.HierarchicalLevelSelectionState.SomeSelected]=S.HierarchicalLevelSelectionState.SomeSelected,v[T.HierarchicalLevelSelectionState.UnknownSelected]=S.HierarchicalLevelSelectionState.UnknownSelected,v)),e.annotationType=new _.EnumConverter(((b={})[T.AnnotateEnum.Area]=S.AnnotationType.Area,b[T.AnnotateEnum.Mark]=S.AnnotationType.Mark,b[T.AnnotateEnum.Point]=S.AnnotationType.Point,b)),e.markType=new _.EnumConverter(((I={})[T.MarkType.Area]=S.MarkType.Area,I[T.MarkType.Bar]=S.MarkType.Bar,I[T.MarkType.Circle]=S.MarkType.Circle,I[T.MarkType.GanttBar]=S.MarkType.GanttBar,I[T.MarkType.Heatmap]=S.MarkType.Heatmap,I[T.MarkType.Line]=S.MarkType.Line,I[T.MarkType.Map]=S.MarkType.Map,I[T.MarkType.Pie]=S.MarkType.Pie,I[T.MarkType.Polygon]=S.MarkType.Polygon,I[T.MarkType.Shape]=S.MarkType.Shape,I[T.MarkType.Square]=S.MarkType.Square,I[T.MarkType.Text]=S.MarkType.Text,I[T.MarkType.VizExtension]=S.MarkType.VizExtension,I)),e}();t.InternalToExternalEnumMappings=P},2680:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(6664),o=function(){function e(){this._eventListenerManagers={}}return e.prototype.addEventListener=function(e,t){if(!this._eventListenerManagers.hasOwnProperty(e))throw new i.TableauError(n.ErrorCodes.UnsupportedEventName,"Cannot add event, unsupported event type: "+e);return this._eventListenerManagers[e].addEventListener(t)},e.prototype.removeEventListener=function(e,t){if(!this._eventListenerManagers.hasOwnProperty(e))throw new i.TableauError(n.ErrorCodes.UnsupportedEventName,"Cannot remove event, unsupported event type: "+e);return this._eventListenerManagers[e].removeEventListener(t)},e.prototype.addNewEventType=function(e){this._eventListenerManagers[e.eventType]=e},e}();t.EventListenerManager=o},1072:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this._fieldImpl=e}return Object.defineProperty(e.prototype,"name",{get:function(){return this._fieldImpl.name},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"id",{get:function(){return this._fieldImpl.id},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"description",{get:function(){return this._fieldImpl.description},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"dataType",{get:function(){return this._fieldImpl.dataType},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"aggregation",{get:function(){return this._fieldImpl.aggregation},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"dataSource",{get:function(){return this._fieldImpl.dataSource},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"role",{get:function(){return this._fieldImpl.role},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"columnType",{get:function(){return this._fieldImpl.columnType},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isCalculatedField",{get:function(){return this._fieldImpl.isCalculatedField},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isCombinedField",{get:function(){return this._fieldImpl.isCombinedField},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isGenerated",{get:function(){return this._fieldImpl.isGenerated},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isGeospatial",{get:function(){return this._fieldImpl.isGeospatial},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isHidden",{get:function(){return this._fieldImpl.isHidden},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isPresentOnPublishedDatasource",{get:function(){return this._fieldImpl.isPresentOnPublishedDatasource},enumerable:!0,configurable:!0}),e}();t.Field=r},2520:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(5136),i=function(){function e(e,t){this._registryId=t,this._luid=e.luid,this._name=e.name,this._shared=e.shared,this._isDefault=e.isDefault,this._ownerName=e.owner.userFriendlyName,this._url=e.url}return Object.defineProperty(e.prototype,"luid",{get:function(){return this._luid},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"name",{get:function(){return this._name},set:function(e){this._name=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"shared",{get:function(){return this._shared},set:function(e){this._shared=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isDefault",{get:function(){return this._isDefault},set:function(e){this._isDefault=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"ownerName",{get:function(){return this._ownerName},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"url",{get:function(){return this._url},enumerable:!0,configurable:!0}),e.prototype.saveAsync=function(){return n.ApiServiceRegistry.get(this._registryId).getService("viz-service").saveAsync(this)},e}();t.CustomViewImpl=i},1940:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(7419),s=r(3448),u=r(6557),l=r(3987),c=r(3008),p=r(6664),d=r(7480),f=r(6488),h=r(8332),y=r(1116),m=r(6500),g=function(e){function t(t,r,n,i,o,a){void 0===a&&(a=0);var s=e.call(this,t,i)||this;return s._zones=r,s._sheetPath=n,s._parentStoryPointImpl=o,s._activeDashboardObjectId=a,s}return i(t,e),Object.defineProperty(t.prototype,"worksheetsImpl",{get:function(){return this._worksheetsImpl},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"objects",{get:function(){return this._objects},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"parentStoryPoint",{get:function(){return this._parentStoryPointImpl},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"activeDashboardObjectId",{get:function(){return this._activeDashboardObjectId},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"activeDashboardName",{get:function(){return this._sheetPath.sheetName},enumerable:!0,configurable:!0}),t.prototype.initializeWithPublicInterfaces=function(){this._worksheetsImpl=new Array,this._objects=new Array,this.zoneMap=new Map;for(var e=0,t=this._zones;e{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t,r,n,i,o,a,s,u,l){this._dashboardImpl=e,this._type=t,this._position=r,this._size=n,this._worksheetImpl=i,this._name=o,this._isFloating=a,this._isVisible=s,this._id=u,this._fieldId=l}return Object.defineProperty(e.prototype,"dashboardImpl",{get:function(){return this._dashboardImpl},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"type",{get:function(){return this._type},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"position",{get:function(){return this._position},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"size",{get:function(){return this._size},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"worksheetImpl",{get:function(){return this._worksheetImpl},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"name",{get:function(){return this._name},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isFloating",{get:function(){return this._isFloating},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isVisible",{get:function(){return this._isVisible},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"id",{get:function(){return this._id},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"fieldId",{get:function(){return this._fieldId},enumerable:!0,configurable:!0}),e}();t.DashboardObjectImpl=r},2180:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(716),o=r(1072),a=r(624),s=r(3008),u=r(7603),l=r(7480),c=r(5288),p=function(){function e(e,t){var r=this;this._dataSourceInfo=e,this._registryId=t,this._fields=e.fields.map((function(e){var t=new c.FieldImpl(e,r);return new o.Field(t)}))}return Object.defineProperty(e.prototype,"name",{get:function(){return this._dataSourceInfo.name},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"id",{get:function(){return this._dataSourceInfo.id},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"extractUpdateTime",{get:function(){return this._dataSourceInfo.extractUpdateTime},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"fields",{get:function(){return this._fields},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isExtract",{get:function(){return this._dataSourceInfo.isExtract},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isPublished",{get:function(){return this._dataSourceInfo.isPublished},enumerable:!0,configurable:!0}),e.prototype.publishedUrl=function(){return this._dataSourceInfo.publishedUrl},e.prototype.getMaxPageRowLimit=function(){return 1e4},e.prototype.refreshAsync=function(){return s.ApiServiceRegistry.get(this._registryId).getService("data-source-service").refreshAsync(this._dataSourceInfo.id)},e.prototype.getConnectionSummariesAsync=function(){return s.ApiServiceRegistry.get(this._registryId).getService("data-source-service").getConnectionSummariesAsync(this._dataSourceInfo.id).then((function(e){return e.map((function(e){return new i.ConnectionSummary(e)}))}))},e.prototype.getActiveTablesAsync=function(){return s.ApiServiceRegistry.get(this._registryId).getService("data-source-service").getActiveTablesAsync(this._dataSourceInfo.id).then((function(e){return e.map((function(e){return new u.TableSummary(e)}))}))},e.prototype.getUnderlyingDataAsync=function(e){return e=e||{},s.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getDataSourceDataAsync(this.id,!!e.ignoreAliases,e.maxRows||0,e.columnsToInclude||[],e.columnsToIncludeById||[],e.includeDataValuesOption||n.IncludeDataValuesOption.AllValues)},e.prototype.getLogicalTableDataAsync=function(e,t){return t=t||{},s.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getLogicalTableDataAsync(this.id,e,!!t.ignoreAliases,t.maxRows||0,t.columnsToInclude||[],t.columnsToIncludeById||[],t.includeDataValuesOption||n.IncludeDataValuesOption.AllValues)},e.prototype.getLogicalTableDataReaderAsync=function(e,t,r){return r=r||{},s.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getLogicalTableDataReaderAsync(this.id,e,t||this.getMaxPageRowLimit(),!!r.ignoreAliases,r.columnsToIncludeById||[],r.includeDataValuesOption||n.IncludeDataValuesOption.AllValues)},e.prototype.initializeWithPublicInterfaces=function(e){l.ErrorHelpers.verifyInternalValue(e,"dataSource"),this._fields=this._dataSourceInfo.fields.map((function(t){var r=new c.FieldImpl(t,e);return new o.Field(r)}))},e.prototype.getLogicalTablesAsync=function(){return s.ApiServiceRegistry.get(this._registryId).getService("data-source-service").getLogicalTablesAsync(this.id).then((function(e){return e.map((function(e){return new a.LogicalTable(e)}))}))},e}();t.DataSourceImpl=p},5288:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(3448),o=r(6557),a=function(){function e(e,t){this._fieldInfo=e,this._parentDataSource=t}return Object.defineProperty(e.prototype,"name",{get:function(){return this._fieldInfo.name},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"id",{get:function(){return this._fieldInfo.id},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"description",{get:function(){return this._fieldInfo.description},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"dataType",{get:function(){var e;return null!=(e=this._fieldInfo.dataType)?e:n.DataType.Unknown},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"aggregation",{get:function(){return o.InternalToExternalEnumMappings.fieldAggregationType.convert(this._fieldInfo.aggregation)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"dataSource",{get:function(){if(!this._parentDataSource)throw new Error("Data source information is not available for this field. Please use getFieldAsync method to get field's data source information");return this._parentDataSource},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"role",{get:function(){return o.InternalToExternalEnumMappings.fieldRoleType.convert(this._fieldInfo.role)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"columnType",{get:function(){var e=this._fieldInfo.columnType||i.ColumnType.Unknown;return o.InternalToExternalEnumMappings.columnType.convert(e)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isCalculatedField",{get:function(){return this._fieldInfo.isCalculatedField},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isCombinedField",{get:function(){return this._fieldInfo.isCombinedField},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isGenerated",{get:function(){return this._fieldInfo.isGenerated},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isGeospatial",{get:function(){return this._fieldInfo.isGeospatial},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isHidden",{get:function(){return this._fieldInfo.isHidden},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isPresentOnPublishedDatasource",{get:function(){return this._fieldInfo.isPresentOnPublishedDatasource},enumerable:!0,configurable:!0}),e}();t.FieldImpl=a},8552:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(6557),o=r(3008),a=r(8052),s=r(7480),u=r(1172),l=function(){function e(e,t){this._registryId=t,this.setParameterInfo(e)}return Object.defineProperty(e.prototype,"name",{get:function(){return this._parameterInfo.name},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"currentValue",{get:function(){return a.DataValueFactory.MakeParameterDataValue(this._parameterInfo.currentValue,this._parameterInfo.dataType)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"dataType",{get:function(){return i.InternalToExternalEnumMappings.dataType.convert(this._parameterInfo.dataType)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"id",{get:function(){return this._globalFieldName},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"allowableValues",{get:function(){return this._allowableValues},enumerable:!0,configurable:!0}),e.prototype.changeValueAsync=function(e){var t=this;s.ErrorHelpers.verifyParameter(e,"newValue");var r=u.Param.serializeParameterValue(e);return o.ApiServiceRegistry.get(this._registryId).getService("parameters-service").changeParameterValueAsync(this._globalFieldName,r).then((function(e){return t.setParameterInfo(e),t.currentValue}))},e.prototype.setParameterInfo=function(e){this._parameterInfo=e,this._globalFieldName=e.fieldName;var t,r,o,s,u,l=i.InternalToExternalEnumMappings.allowableValues.convert(e.allowableValuesType);l===n.ParameterValueType.List?t=(e.allowableValues||[]).map((function(t){return a.DataValueFactory.MakeParameterDataValue(t,e.dataType)})):l===n.ParameterValueType.Range&&(r=e.minValue&&a.DataValueFactory.MakeParameterDataValue(e.minValue,e.dataType),o=e.maxValue&&a.DataValueFactory.MakeParameterDataValue(e.maxValue,e.dataType),s=e.stepSize,u=e.dateStepPeriod&&i.InternalToExternalEnumMappings.dateStepPeriod.convert(e.dateStepPeriod)),this._allowableValues={type:l,allowableValues:t,minValue:r,maxValue:o,stepSize:s,dateStepPeriod:u}},e}();t.ParameterImpl=l},8332:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(3008),o=r(6664),a=r(7480),s=r(1172),u=r(2780),l=function(){function e(e,t){this._sheetInfoImpl=e,this._registryId=t}return Object.defineProperty(e.prototype,"name",{get:function(){return this._sheetInfoImpl.name},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"sheetType",{get:function(){return this._sheetInfoImpl.sheetType},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"sheetPath",{get:function(){return this._sheetInfoImpl.sheetPath},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"size",{get:function(){return this._sheetInfoImpl.sheetSize},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"hidden",{get:function(){if(void 0!==this._sheetInfoImpl.isHidden)return this._sheetInfoImpl.isHidden;throw new o.TableauError(n.EmbeddingErrorCodes.ImplementationError,"isHidden not implemented")},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"active",{get:function(){if(void 0!==this._sheetInfoImpl.isActive)return this._sheetInfoImpl.isActive;throw new o.TableauError(n.EmbeddingErrorCodes.ImplementationError,"active not implemented")},set:function(e){void 0!==this._sheetInfoImpl.isActive&&(this._sheetInfoImpl.active=e)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"index",{get:function(){if(void 0!==this._sheetInfoImpl.index)return this._sheetInfoImpl.index;throw new o.TableauError(n.EmbeddingErrorCodes.ImplementationError,"index not implemented")},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"url",{get:function(){if(void 0!==this._sheetInfoImpl.url)return this._sheetInfoImpl.url;throw new o.TableauError(n.EmbeddingErrorCodes.ImplementationError,"url not implemented")},enumerable:!0,configurable:!0}),e.prototype.getSheetSize=function(){if(!u.SheetUtils.isValidSheetSize(this.size))throw new o.TableauError(n.EmbeddingErrorCodes.InternalError,"size is not of type SheetSize");return this.size},e.prototype.findParameterAsync=function(e){return a.ErrorHelpers.verifyParameter(e,"parameterName"),i.ApiServiceRegistry.get(this._registryId).getService("parameters-service").findParameterByNameAsync(e)},e.prototype.getParametersAsync=function(){return i.ApiServiceRegistry.get(this._registryId).getService("parameters-service").getParametersForSheetAsync(this.sheetPath)},e.prototype.changeSizeAsync=function(e){var t=this,r=new o.TableauError(n.EmbeddingErrorCodes.InvalidSize,"Invalid sheet size parameter");if(!e||!e.behavior)throw r;var a=this.normalizeSheetSize(e),s=a.behavior===n.SheetSizeBehavior.Automatic;if(!s&&!a.minSize&&!a.maxSize)throw r;if(!s&&this.sheetType===n.SheetType.Worksheet)throw new o.TableauError(n.EmbeddingErrorCodes.InvalidSizeBehaviorOnWorksheet,"Only SheetSizeBehavior.Automatic is allowed on Worksheets");if(s&&this.getSheetSize().behavior===a.behavior)return Promise.resolve(e);var l=this.processNewSize(a);return i.ApiServiceRegistry.get(this._registryId).getService("size-service").changeSizeAsync(this.name,l).then((function(){return i.ApiServiceRegistry.get(t._registryId).getService("client-info-service").getClientInfoAsync().then((function(e){var r=e.publishedSheets.find((function(e){return e.name===t.name}));if(!r)throw new o.TableauError(n.SharedErrorCodes.InternalError,"Can't find sheet with name "+t.name);var i=u.SheetUtils.getSheetSizeFromSizeConstraints(r.sizeConstraint);return t._sheetInfoImpl.sheetSize=i,i}))}))},e.prototype.normalizeSheetSize=function(t){var r=t.behavior;return a.ErrorHelpers.verifyEnumValue(r,n.SheetSizeBehavior,"SheetSizeBehavior"),{behavior:r,minSize:e.parseDimensions(t.minSize),maxSize:e.parseDimensions(t.maxSize)}},e.prototype.processNewSize=function(e){var t,r,i,a,u=e.behavior,l=e.minSize,c=e.maxSize,p=!s.Param.isNullOrUndefined(null===(t=l)||void 0===t?void 0:t.width),d=!s.Param.isNullOrUndefined(null===(r=l)||void 0===r?void 0:r.height),f=!s.Param.isNullOrUndefined(null===(i=c)||void 0===i?void 0:i.width),h=!s.Param.isNullOrUndefined(null===(a=c)||void 0===a?void 0:a.height),y=p&&d,m=f&&h;switch(u){case n.SheetSizeBehavior.Automatic:return{behavior:u};case n.SheetSizeBehavior.AtMost:if(!c||!m)throw new o.TableauError(n.EmbeddingErrorCodes.MissingMaxSize,"Missing maxSize for SheetSizeBehavior.AtMost");if((v={width:c.width,height:c.height}).width<0||v.height<0)throw new o.TableauError(n.EmbeddingErrorCodes.InvalidSize,"Size value cannot be less than zero");return{behavior:u,maxSize:v};case n.SheetSizeBehavior.AtLeast:if(!l||!y)throw new o.TableauError(n.EmbeddingErrorCodes.MissingMinSize,"Missing minSize for SheetSizeBehavior.AtLeast");if((g={width:l.width,height:l.height}).width<0||g.height<0)throw new o.TableauError(n.EmbeddingErrorCodes.InvalidSize,"Size value cannot be less than zero");return{behavior:u,minSize:g};case n.SheetSizeBehavior.Range:if(!(l&&c&&y&&m))throw new o.TableauError(n.EmbeddingErrorCodes.MissingMinMaxSize,"Missing minSize or maxSize for SheetSizeBehavior.Range");var g={width:l.width,height:l.height},v={width:c.width,height:c.height};if(g.width<0||g.height<0||v.width<0||v.height<0||g.width>v.width||g.height>v.height)throw new o.TableauError(n.EmbeddingErrorCodes.InvalidSize,"Missing minSize or maxSize for SheetSizeBehavior.Range");return{behavior:u,minSize:g,maxSize:v};case n.SheetSizeBehavior.Exactly:if(l&&c){if(y&&m){if(g={width:l.width,height:l.height},v={width:c.width,height:c.height},g.width!==v.width||g.height!==v.height)throw new o.TableauError(n.EmbeddingErrorCodes.InvalidSize,"Conflicting size values for SheetSizeBehavior.Exactly");return{behavior:u,minSize:g,maxSize:v}}if(y)return{behavior:u,minSize:g={width:l.width,height:l.height},maxSize:g};if(m)return{behavior:u,minSize:v={width:c.width,height:c.height},maxSize:v}}throw new o.TableauError(n.EmbeddingErrorCodes.InvalidSize,"Invalid sheet size parameter");default:throw new o.TableauError(n.SharedErrorCodes.InternalError,"Unsupported sheet size behavior: "+u)}},e.parseDimensions=function(e){var t={width:void 0,height:void 0};if(!e)return t;var r=s.Param.tryParseNumber(e.width),n=r.success,i=r.parsed,o=s.Param.tryParseNumber(e.height),a=o.success,u=o.parsed;return n&&a?{width:i,height:u}:n?{width:i}:a?{height:u}:t},e}();t.SheetImpl=l},1116:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=function(){function e(e,t,r,n,i,o,a){this._name=e,this._sheetType=t,this._sheetSize=r,this._index=n,this._isActive=i,this._isHidden=o,this._url=a}return Object.defineProperty(e.prototype,"name",{get:function(){return this._name},set:function(e){this._name=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"sheetSize",{get:function(){return this._sheetSize},set:function(e){this._sheetSize=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"sheetType",{get:function(){return this._sheetType},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"sheetPath",{get:function(){return{sheetName:this.name,isDashboard:this.sheetType===n.SheetType.Dashboard}},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"index",{get:function(){return this._index},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isActive",{get:function(){return this._isActive},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"active",{set:function(e){this._isActive=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isHidden",{get:function(){return this._isHidden},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"url",{get:function(){return this._url},enumerable:!0,configurable:!0}),e}();t.SheetInfoImpl=i},5144:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this._eventType=e,this._handlers=[]}return Object.defineProperty(e.prototype,"eventType",{get:function(){return this._eventType},enumerable:!0,configurable:!0}),e.prototype.addEventListener=function(e){var t=this;return this._handlers.push(e),function(){return t.removeEventListener(e)}},e.prototype.removeEventListener=function(e){var t=this._handlers.length;return this._handlers=this._handlers.filter((function(t){return t!==e})),t>this._handlers.length},e.prototype.triggerEvent=function(e){for(var t=0,r=this._handlers;t=this._storyPointInfoImpls.length)throw new s.TableauError(o.EmbeddingErrorCodes.IndexOutOfRange,"The index passed to this command is out of range.");if(e===this._activeStoryPointImpl.index)return Promise.resolve(this._activeStoryPointImpl);var t=this._deferred.getNewPromiseOrThrowIfBusy();return a.ApiServiceRegistry.get(this._registryId).getService("story-activation-service").activateStoryPointAsync(e),t},t.prototype.revertStoryPointAsync=function(e){var t=this;if(u.ErrorHelpers.verifyParameter(e,"index"),u.ErrorHelpers.verifyParameterType(e,"number","index"),e<0||e>=this._storyPointInfoImpls.length)throw new s.TableauError(o.EmbeddingErrorCodes.IndexOutOfRange,"The index passed to this command is out of range.");return a.ApiServiceRegistry.get(this._registryId).getService("story-activation-service").revertStoryPointAsync(e).then((function(e){return t.updateStoryInfo(e.index,e),new d.StoryPointInfoImpl(e.caption,e.index,e.storyPointId,!1,e.updated,t)}))},t.prototype.clearPendingPromises=function(){this._deferred&&this._deferred.reject("All pending promises cleared")},t}(c.SheetImpl);t.StoryImpl=f},2608:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(6664),o=r(2780),a=r(1940),s=r(1116),u=r(6500),l=function(){function e(e,t,r,n){this._storyPointInfoImpl=e,n&&(this._containedSheetImpl=this.createContainedSheet(n,t,r))}return Object.defineProperty(e.prototype,"index",{get:function(){return this._storyPointInfoImpl.index},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"caption",{get:function(){return this._storyPointInfoImpl.caption},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"active",{get:function(){return this._storyPointInfoImpl.active},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"updated",{get:function(){return this._storyPointInfoImpl.updated},set:function(e){this._storyPointInfoImpl.updated=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"parentStory",{get:function(){return this._storyPointInfoImpl.parentStory},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"containedSheet",{get:function(){return this._containedSheetImpl},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"storyPointId",{get:function(){return this._storyPointInfoImpl.storyPointId},enumerable:!0,configurable:!0}),e.prototype.createContainedSheet=function(e,t,r){var l,c=o.SheetUtils.getPublishedSheetInfoByName(e.name,t),p=o.SheetUtils.createAutomaticSize(),d=void 0===c,f=c?c.url:"",h=new s.SheetInfoImpl(e.name,o.SheetUtils.getSheetTypeEnum(e.sheetType),p,-1,!1,d,f);switch(h.sheetType){case n.SheetType.Worksheet:var y={worksheet:h.name};l=new u.WorksheetImpl(h,r,y,null,this);break;case n.SheetType.Dashboard:var m={sheetName:h.name,isDashboard:!0};l=new a.DashboardImpl(h,e.dashboardZones,m,r,this);break;default:throw new i.TableauError(n.SharedErrorCodes.ServerError,"Invalid SheetType")}return l},e}();t.StoryPointImpl=l},6068:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t,r,n,i,o){this._caption=e,this._index=t,this._storyPointId=r,this._active=n,this._updated=i,this._parentStoryImpl=o}return Object.defineProperty(e.prototype,"caption",{get:function(){return this._caption},set:function(e){this._caption=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"index",{get:function(){return this._index},set:function(e){this._index=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"storyPointId",{get:function(){return this._storyPointId},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"active",{get:function(){return this._active},set:function(e){this._active=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"updated",{get:function(){return this._updated},set:function(e){this._updated=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"parentStory",{get:function(){return this._parentStoryImpl},enumerable:!0,configurable:!0}),e}();t.StoryPointInfoImpl=r},3044:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.WorkbookImpl=function(){}},6500:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(7419),s=r(8340),u=r(624),l=r(3483),c=r(3008),p=r(6664),d=r(7480),f=r(2180),h=function(e){function t(t,r,n,i,o,a,s){void 0===a&&(a=null),void 0===s&&(s=null);var u=e.call(this,t,r)||this;return u._visualId=n,u._parentDashboardImpl=i,u._parentStoryPointImpl=o,u._backgroundColor=a,u._formatting=s,u}return i(t,e),Object.defineProperty(t.prototype,"parentDashboard",{get:function(){return this._parentDashboardImpl},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"parentStoryPoint",{get:function(){return this._parentStoryPointImpl},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"visualId",{get:function(){return this._visualId},enumerable:!0,configurable:!0}),t.prototype.getMaxPageRowLimit=function(){return 1e4},Object.defineProperty(t.prototype,"backgroundColor",{get:function(){return this._backgroundColor},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"formatting",{get:function(){return this._formatting},enumerable:!0,configurable:!0}),t.prototype.applyFilterAsync=function(e,t,r,n){return d.ErrorHelpers.verifyEnumValue(r,o.FilterUpdateType,"Contract.FilterUpdateType"),this.verifyActiveSheet(),c.ApiServiceRegistry.get(this._registryId).getService("filter-service").applyFilterAsync(this.visualId,e,t,r,n)},t.prototype.applyRangeFilterAsync=function(e,t){return d.ErrorHelpers.verifyParameter(e,"fieldName"),d.ErrorHelpers.verifyParameter(t,"filterOptions"),t.nullOption?d.ErrorHelpers.verifyEnumValue(t.nullOption,a.FilterNullOption,"FilterNullOption"):d.ErrorHelpers.verifyRangeParamType(t.min,t.max),this.verifyActiveSheet(),c.ApiServiceRegistry.get(this._registryId).getService("filter-service").applyRangeFilterAsync(this.visualId,e,t)},t.prototype.applyHierarchicalFilterAsync=function(e,t,r,n){if(d.ErrorHelpers.verifyParameter(e,"fieldName"),d.ErrorHelpers.verifyParameter(t,"values"),d.ErrorHelpers.verifyEnumValue(r,o.FilterUpdateType,"Contract.FilterUpdateType"),!Array.isArray(t)&&!t.levels)throw new p.TableauError(a.ErrorCodes.InvalidParameter,"values parameter for applyHierarchicalFilterAsync must be an array or contain a levels key");return this.verifyActiveSheet(),c.ApiServiceRegistry.get(this._registryId).getService("filter-service").applyHierarchicalFilterAsync(this.visualId,e,t,r,n)},t.prototype.clearFilterAsync=function(e){return d.ErrorHelpers.verifyParameter(e,"fieldName"),this.verifyActiveSheet(),c.ApiServiceRegistry.get(this._registryId).getService("filter-service").clearFilterAsync(this.visualId,e)},t.prototype.applyRelativeDateFilterAsync=function(e,t){return d.ErrorHelpers.verifyStringParameter(e,"fieldName"),d.ErrorHelpers.verifyParameter(t,"options"),d.ErrorHelpers.verifyEnumValue(t.periodType,a.PeriodType,"PeriodType"),d.ErrorHelpers.verifyEnumValue(t.rangeType,a.DateRangeType,"DateRangeType"),this.verifyActiveSheet(),c.ApiServiceRegistry.get(this._registryId).getService("filter-service").applyRelativeDateFilterAsync(this.visualId,e,t)},t.prototype.getDataSourcesAsync=function(){var e=this;return this.verifyActiveSheet(),c.ApiServiceRegistry.get(this._registryId).getService("data-source-service").getDataSourcesAsync(this.visualId).then((function(t){var r=t,n=r.worksheetDataSchemaMap[e.name],i=[],o=n.primaryDataSource;i.push(e.createDataSourceFromInfo(r.dataSources[o]));for(var a=0,s=n.referencedDataSourceList;a{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this._logicalTable=e}return Object.defineProperty(e.prototype,"id",{get:function(){return this._logicalTable.id},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"caption",{get:function(){return this._logicalTable.caption},enumerable:!0,configurable:!0}),e}();t.LogicalTable=r},5064:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.TooltipTextRequestModel=function(e,t){this.visualIdPresModel=e,this.tupleId=t}},6296:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3008),s=r(7480),u=function(){function e(e,t,r,n,i){this._worksheetName=e,this._fieldName=t,this._filterType=r,this._fieldId=n,this._registryId=i}return Object.defineProperty(e.prototype,"worksheetName",{get:function(){return this._worksheetName},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"fieldName",{get:function(){return this._fieldName},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"fieldId",{get:function(){return this._fieldId},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"filterType",{get:function(){return this._filterType},enumerable:!0,configurable:!0}),e.prototype.getFieldAsync=function(){return a.ApiServiceRegistry.get(this._registryId).getService("data-source-service").getFieldAsync(this._fieldId)},e.prototype.getAppliedWorksheetsAsync=function(){return a.ApiServiceRegistry.get(this._registryId).getService("filter-service").getAppliedWorksheetsAsync(this._worksheetName,this._fieldId)},e.prototype.setAppliedWorksheetsAsync=function(e){s.ErrorHelpers.verifyParameter(e,"applyToWorksheets");var t=new Set(e);return a.ApiServiceRegistry.get(this._registryId).getService("filter-service").setAppliedWorksheetsAsync(this._worksheetName,this._fieldName,this._fieldId,Array.from(t))},e}();t.Filter=u;var l=function(e){function t(t,r,n,i,o,a,s,u){var l=e.call(this,t,r,i,n,o)||this;return l._appliedValues=a,l._isExcludeMode=s,l._isAllSelected=u,l}return i(t,e),Object.defineProperty(t.prototype,"isAllSelected",{get:function(){return this._isAllSelected},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"appliedValues",{get:function(){return this._appliedValues},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"isExcludeMode",{get:function(){return this._isExcludeMode},enumerable:!0,configurable:!0}),t.prototype.getDomainAsync=function(e){return e||(e=o.FilterDomainType.Relevant),s.ErrorHelpers.verifyEnumValue(e,o.FilterDomainType,"FilterDomainType"),a.ApiServiceRegistry.get(this._registryId).getService("filter-service").getCategoricalDomainAsync(this._worksheetName,this._fieldId,e)},t}(u);t.CategoricalFilter=l;var c=function(){function e(e,t,r){this._value=e,this._hierarchicalPath=t,this._level=r}return Object.defineProperty(e.prototype,"value",{get:function(){return this._value},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"hierarchicalPath",{get:function(){return this._hierarchicalPath},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"level",{get:function(){return this._level},enumerable:!0,configurable:!0}),e}();t.HierarchicalDataValue=c;var p=function(){function e(e,t){this._name=e,this._levelSelectionState=t}return Object.defineProperty(e.prototype,"name",{get:function(){return this._name},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"levelSelectionState",{get:function(){return this._levelSelectionState},enumerable:!0,configurable:!0}),e}();t.HierarchicalLevelDetail=p;var d=function(e){function t(t,r,n,i,o,a,s,u,l,c,p){var d=e.call(this,t,r,i,n,o)||this;return d._dimensionName=a,d._hierarchyCaption=s,d._numberOfLevels=u,d._levelDetails=l,d._appliedValues=c,d._isAllSelected=p,d}return i(t,e),t.prototype.getDomainAsync=function(e){throw new Error("Method not implemented.")},Object.defineProperty(t.prototype,"dimensionName",{get:function(){return this._dimensionName},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"hierarchyCaption",{get:function(){return this._hierarchyCaption},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"numberOfLevels",{get:function(){return this._numberOfLevels},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"levelDetails",{get:function(){return this._levelDetails},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"isAllSelected",{get:function(){return this._isAllSelected},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"appliedValues",{get:function(){return this._appliedValues},enumerable:!0,configurable:!0}),t}(u);t.HierarchicalFilter=d;var f=function(e){function t(t,r,n,i,o,a,s,u){var l=e.call(this,t,r,i,n,o)||this;return l._min=a,l._max=s,l._includeNullValues=u,l}return i(t,e),Object.defineProperty(t.prototype,"minValue",{get:function(){return this._min},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"maxValue",{get:function(){return this._max},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"includeNullValues",{get:function(){return this._includeNullValues},enumerable:!0,configurable:!0}),t.prototype.getDomainAsync=function(e){var t=a.ApiServiceRegistry.get(this._registryId).getService("filter-service");return e||(e=o.FilterDomainType.Relevant),s.ErrorHelpers.verifyEnumValue(e,o.FilterDomainType,"FilterDomainType"),t.getRangeDomainAsync(this._worksheetName,this._fieldId,e)},t}(u);t.RangeFilter=f;var h=function(e){function t(t,r,n,i,o,a,s,u,l){var c=e.call(this,t,r,i,n,o)||this;return c._anchorDate=a,c._periodType=s,c._rangeType=u,c._rangeN=l,c}return i(t,e),Object.defineProperty(t.prototype,"anchorDate",{get:function(){return this._anchorDate},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"periodType",{get:function(){return this._periodType},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"rangeType",{get:function(){return this._rangeType},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"rangeN",{get:function(){return this._rangeN},enumerable:!0,configurable:!0}),t}(u);t.RelativeDateFilter=h;var y=function(){function e(e,t){this._values=e,this._domainType=t}return Object.defineProperty(e.prototype,"values",{get:function(){return this._values},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"type",{get:function(){return this._domainType},enumerable:!0,configurable:!0}),e}();t.CategoricalDomain=y;var m=function(){function e(e,t,r){this._min=e,this._max=t,this._domainType=r}return Object.defineProperty(e.prototype,"type",{get:function(){return this._domainType},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"min",{get:function(){return this._min},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"max",{get:function(){return this._max},enumerable:!0,configurable:!0}),e}();t.RangeDomain=m},5068:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t,r,n,i,o){this._data=e,this._columns=t,this._totalRowCount=r,this._isTotalRowCountLimited=n,this._isSummaryData=i,this._marksInfo=o,this._name=i?"Summary Data Table":"Underlying Data Table"}return Object.defineProperty(e.prototype,"name",{get:function(){return this._name},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"data",{get:function(){return this._data},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"columns",{get:function(){return this._columns},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"marksInfo",{get:function(){return this._marksInfo},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"totalRowCount",{get:function(){return this._totalRowCount},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isTotalRowCountLimited",{get:function(){return this._isTotalRowCountLimited},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isSummaryData",{get:function(){return this._isSummaryData},enumerable:!0,configurable:!0}),e}();t.DataTable=r;var n=function(){function e(e,t,r){this._type=e,this._color=t,this._tupleId=r}return Object.defineProperty(e.prototype,"type",{get:function(){return this._type},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"color",{get:function(){return this._color},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"tupleId",{get:function(){return this._tupleId},enumerable:!0,configurable:!0}),e}();t.MarkInfo=n;var i=function(){function e(e,t,r,n,i){this._fieldName=e,this._fieldId=t,this._dataType=r,this._isReferenced=n,this._index=i}return Object.defineProperty(e.prototype,"fieldName",{get:function(){return this._fieldName},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"fieldId",{get:function(){return this._fieldId},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"dataType",{get:function(){return this._dataType},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isReferenced",{get:function(){return this._isReferenced},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"index",{get:function(){return this._index},enumerable:!0,configurable:!0}),e}();t.Column=i;var o=function(){function e(e,t,r,n,i){this._value=e,this._nativeValue=t,this._formattedValue=r,this._aliasValue=n,this._hasAlias=i}return Object.defineProperty(e.prototype,"value",{get:function(){return this._value},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"nativeValue",{get:function(){return this._nativeValue},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"formattedValue",{get:function(){return this._formattedValue},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"aliasValue",{get:function(){return this._aliasValue},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"hasAlias",{get:function(){return this._hasAlias},enumerable:!0,configurable:!0}),e}();t.DataValue=o},7968:function(e,t,r){"use strict";var n=this&&this.__awaiter||function(e,t,r,n){return new(r||(r=Promise))((function(i,o){function a(e){try{u(n.next(e))}catch(e){o(e)}}function s(e){try{u(n.throw(e))}catch(e){o(e)}}function u(e){var t;e.done?i(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(a,s)}u((n=n.apply(e,t||[])).next())}))},i=this&&this.__generator||function(e,t){var r,n,i,o,a={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return o={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function s(o){return function(s){return function(o){if(r)throw new TypeError("Generator is already executing.");for(;a;)try{if(r=1,n&&(i=2&o[0]?n.return:o[0]?n.throw||((i=n.return)&&i.call(n),0):n.next)&&!(i=i.call(n,o[1])).done)return i;switch(n=0,i&&(o=[2&o[0],i.value]),o[0]){case 0:case 1:i=o;break;case 4:return a.label++,{value:o[1],done:!1};case 5:a.label++,n=o[1],o=[0];continue;case 7:o=a.ops.pop(),a.trys.pop();continue;default:if(!((i=(i=a.trys).length>0&&i[i.length-1])||6!==o[0]&&2!==o[0])){a=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t){this._x=e,this._y=t}return Object.defineProperty(e.prototype,"x",{get:function(){return this._x},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"y",{get:function(){return this._y},enumerable:!0,configurable:!0}),e}();t.Point=r},3483:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.GetDataType||(t.GetDataType={})).Summary="summary",r.Underlying="underlying"},8672:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(3008),i=r(3964),o=r(8028),a=r(1384),s=r(9196),u=r(4924),l=r(3851),c=r(8864),p=r(7712),d=r(1288),f=r(7260),h=r(8784),y=r(4109),m=r(6096),g=r(744),v=r(8856);t.registerAllSharedServices=function(e,t){n.ApiServiceRegistry.get(t).registerService(new o.AnimationServiceImpl(e,t)),n.ApiServiceRegistry.get(t).registerService(new s.DataSourceServiceImpl(e,t)),n.ApiServiceRegistry.get(t).registerService(new u.ExportServiceImpl(e,t)),n.ApiServiceRegistry.get(t).registerService(new p.GetDataServiceImpl(e,t)),n.ApiServiceRegistry.get(t).registerService(new c.FilterServiceImpl(e,t)),n.ApiServiceRegistry.get(t).registerService(new d.NotificationServiceImpl(e)),n.ApiServiceRegistry.get(t).registerService(new f.ParametersServiceImpl(e,t)),n.ApiServiceRegistry.get(t).registerService(new h.SelectionServiceImpl(e,t)),n.ApiServiceRegistry.get(t).registerService(new a.AnnotationServiceImpl(e,t)),n.ApiServiceRegistry.get(t).registerService(new v.ZoneServiceImpl(e,t)),n.ApiServiceRegistry.get(t).registerService(new y.SizeServiceImpl(e,t)),n.ApiServiceRegistry.get(t).registerService(new m.VisualModelServiceImpl(e,t)),n.ApiServiceRegistry.get(t).registerService(new g.VizServiceImpl(e,t)),n.ApiServiceRegistry.get(t).registerService(new l.ExternalContextMenuServiceImpl(e,t)),n.ApiServiceRegistry.get(t).registerService(new i.AccessibilityServiceImpl(e,t))}},3008:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(6664);"undefined"!=typeof window&&(window.__tableauApiServiceRegistry=window.__tableauApiServiceRegistry||{});var o=function(){function e(){this._services={}}return e.prototype.registerService=function(e){this._services[e.serviceName]=e},e.prototype.getService=function(e){if(!this._services.hasOwnProperty(e))throw new i.TableauError(n.ErrorCodes.InternalError,"Service not registered: "+e);return this._services[e]},e}(),a=function(){function e(){}return e.get=function(t){if(window.__tableauApiServiceRegistry&&window.__tableauApiServiceRegistry[t]||e.setInstance(t,new o),!window.__tableauApiServiceRegistry[t])throw new i.TableauError(n.ErrorCodes.InternalError,"Service registry failed");return window.__tableauApiServiceRegistry[t]},e.setInstance=function(e,t){window.__tableauApiServiceRegistry||(window.__tableauApiServiceRegistry={}),window.__tableauApiServiceRegistry[e]=t},e.clearRegistry=function(){window.__tableauApiServiceRegistry={}},e}();t.ApiServiceRegistry=a},3964:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(3448),a=r(5064),s=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"accessibility"},enumerable:!0,configurable:!0}),t.prototype.getTooltipTextAsync=function(e,t){var r,n=new a.TooltipTextRequestModel(e,t),i=((r={})[o.ParameterId.FunctionName]="getTooltipTextAsync",r[o.ParameterId.TooltipTextRequest]=n,r);return this.execute(o.VerbId.GetTooltipText,i).then((function(e){return e.result}))},t.prototype.leaveMarkNavigationAsync=function(e){var t,r=((t={})[o.ParameterId.FunctionName]="leaveMarkNavigationAsync",t[o.ParameterId.VisualId]=e,t);return this.execute(o.VerbId.RaiseLeaveMarkNavNotification,r).then((function(e){}))},t}(r(1776).ServiceImplBase);t.AccessibilityServiceImpl=s},8028:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3448),s=r(1044),u=r(7480),l=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"animation-service"},enumerable:!0,configurable:!0}),t.prototype.replayAsync=function(e){var t,r=((t={})[a.ParameterId.ReplaySpeed]=1,t);return u.ErrorHelpers.verifyEnumValue(e,o.ReplaySpeedType,"ReplaySpeedType"),r[a.ParameterId.ReplaySpeed]=s.ExternalToInternalEnumMappings.setReplaySpeedType.convert(e),this.execute(a.VerbId.ReplayAnimation,r).then((function(e){}))},t}(r(1776).ServiceImplBase);t.AnimationServiceImpl=l},1384:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3448),s=r(6557),u=r(7104),l=r(6664),c=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"annotation-service"},enumerable:!0,configurable:!0}),t.prototype.annotateMarkAsync=function(e,t,r){var n,i=this.parseMarkSelectionIds([t]),o=""+r+"",s=((n={})[a.ParameterId.FunctionName]="annotateMarkAsync",n[a.ParameterId.VisualId]=e,n[a.ParameterId.AnnotateEnum]=a.AnnotateEnum.Mark,n[a.ParameterId.TargetPoint]={x:0,y:0},n[a.ParameterId.SelectionList]=[i.selection],n[a.ParameterId.FormattedText]=o,n);return this.execute(a.VerbId.CreateAnnotation,s).then((function(e){}))},t.prototype.getAnnotationsAsync=function(e){var t,r=this,n=((t={})[a.ParameterId.FunctionName]="getAnnotationsAsync",t[a.ParameterId.VisualId]=e,t);return this.execute(a.VerbId.GetAnnotations,n).then((function(e){var t=e.result;return r.annotationFilterMap(t)}))},t.prototype.removeAnnotationAsync=function(e,t){var r,n=this.parseAnnotationSelectionIds([t]),i=((r={})[a.ParameterId.FunctionName]="removeAnnotationAsync",r[a.ParameterId.VisualId]=e,r[a.ParameterId.SelectionList]=[n.selection],r);return this.execute(a.VerbId.RemoveAnnotation,i).then((function(e){}))},t.prototype.parseMarkSelectionIds=function(e){var t=[],r=new u.SelectionModelsContainer;if(e.forEach((function(e){var r=e.tupleId;if(!(null!=r&&r>0))throw new l.TableauError(o.ErrorCodes.InternalError,"invalid tupleId");t.push(r.toString())})),0!==t.length){var n=new u.TupleSelectionModel;n.selectionType="tuples",n.objectIds=t,r.selection=n}return r},t.prototype.parseAnnotationSelectionIds=function(e){var t=[],r=new u.SelectionModelsContainer;if(e.forEach((function(e){var r=e.annotationId;if(!(null!=r&&r>=0))throw new l.TableauError(o.ErrorCodes.InternalError,"invalid annotationId");t.push(r.toString())})),0!==t.length){var n=new u.TupleSelectionModel;n.selectionType="annotations",n.objectIds=t,r.selection=n}return r},t.prototype.mapAnnotation=function(e){return{annotationHTML:e.annotationText,annotationId:e.annotationId,annotationText:e.annotationPlainText,annotationType:s.InternalToExternalEnumMappings.annotationType.convert(e.annotateEnum),tupleId:e.tupleId}},t.prototype.annotationFilterMap=function(e){var t=this;return e.map((function(e){return t.mapAnnotation(e)}))},t}(r(1776).ServiceImplBase);t.AnnotationServiceImpl=c},1832:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(3448),a=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"client-info-service"},enumerable:!0,configurable:!0}),t.prototype.getClientInfoAsync=function(){var e,t=o.VerbId.GetEmbeddingClientInfo,r=((e={})[o.ParameterId.FunctionName]="getClientInfoAsync",e);return this.execute(t,r).then((function(e){return e.result}))},t}(r(1776).ServiceImplBase);t.ClientInfoServiceImpl=a},9196:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3448),s=r(8340),u=r(1072),l=r(2180),c=r(5288),p=r(6664),d=function(e){function t(t,r){return e.call(this,t,r)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"data-source-service"},enumerable:!0,configurable:!0}),t.prototype.refreshAsync=function(e){var t,r=((t={})[a.ParameterId.FunctionName]="refreshAsync",t[a.ParameterId.DeltaTimeMs]=0,t[a.ParameterId.ShouldRefreshDS]=!0,t);return e&&(r[a.ParameterId.DataSourceId]=e),this.execute(a.VerbId.RefreshDataSource,r).then((function(e){}))},t.prototype.getActiveTablesAsync=function(e){var t,r=((t={})[a.ParameterId.FunctionName]="getActiveTablesAsync",t[a.ParameterId.DataSourceId]=e,t);return this.execute(a.VerbId.GetActiveTables,r).then((function(t){var r=t.result;if(0===r.tables.length)throw new p.TableauError(o.ErrorCodes.UnsupportedMethodForDataSourceType,"getActiveTables is not supported for: "+e);return r.tables}))},t.prototype.getDataSourcesAsync=function(e){var t,r=((t={})[a.ParameterId.FunctionName]="getDataSourcesAsync",t[a.ParameterId.VisualId]=e,t);return this.execute(a.VerbId.GetDataSources,r).then((function(e){return e.result}))},t.prototype.getAllDataSourcesAsync=function(){var e,t=((e={})[a.ParameterId.FunctionName]="getAllDataSourcesAsync",e);return this.execute(a.VerbId.GetAllDataSources,t).then((function(e){return e.result}))},t.prototype.getConnectionSummariesAsync=function(e){var t,r=((t={})[a.ParameterId.FunctionName]="getConnectionSummariesAsync",t[a.ParameterId.DataSourceId]=e,t);return this.execute(a.VerbId.GetConnectionDescriptionSummaries,r).then((function(e){return e.result}))},t.prototype.getFieldAsync=function(e){var t,r=this,n=a.VerbId.GetFieldAndDataSource,i=((t={})[a.ParameterId.FunctionName]="getFieldAsync",t[a.ParameterId.FieldId]=e,t);return this.execute(n,i).then((function(e){var t=e.result[a.ParameterId.DataSource],n=e.result[a.ParameterId.Field];return r.convertField(n,r.convertDataSource(t))}))},t.prototype.getLogicalTablesAsync=function(e){var t,r=((t={})[a.ParameterId.FunctionName]="getLogicalTablesAsync",t[a.ParameterId.DataSourceId]=e,t);return this.execute(a.VerbId.GetLogicalTables,r).then((function(e){return e.result}))},t.prototype.getUnderlyingTablesAsync=function(e){var t,r=((t={})[a.ParameterId.FunctionName]="getUnderlyingTablesAsync",t[a.ParameterId.VisualId]=e,t);return this.execute(a.VerbId.GetUnderlyingTables,r).then((function(e){return e.result}))},t.prototype.convertField=function(e,t){return new u.Field(new c.FieldImpl(e,t))},t.prototype.convertDataSource=function(e){return new s.DataSource(new l.DataSourceImpl(e,this._registryId))},t}(r(1776).ServiceImplBase);t.DataSourceServiceImpl=d},4924:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),o=this&&this.__awaiter||function(e,t,r,n){return new(r||(r=Promise))((function(i,o){function a(e){try{u(n.next(e))}catch(e){o(e)}}function s(e){try{u(n.throw(e))}catch(e){o(e)}}function u(e){var t;e.done?i(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(a,s)}u((n=n.apply(e,t||[])).next())}))},a=this&&this.__generator||function(e,t){var r,n,i,o,a={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return o={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function s(o){return function(s){return function(o){if(r)throw new TypeError("Generator is already executing.");for(;a;)try{if(r=1,n&&(i=2&o[0]?n.return:o[0]?n.throw||((i=n.return)&&i.call(n),0):n.next)&&!(i=i.call(n,o[1])).done)return i;switch(n=0,i&&(o=[2&o[0],i.value]),o[0]){case 0:case 1:i=o;break;case 4:return a.label++,{value:o[1],done:!1};case 5:a.label++,n=o[1],o=[0];continue;case 7:o=a.ops.pop(),a.trys.pop();continue;default:if(!((i=(i=a.trys).length>0&&i[i.length-1])||6!==o[0]&&2!==o[0])){a=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0&&i[i.length-1])||6!==o[0]&&2!==o[0])){a=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0?s[l.ParameterId.FilterLevels]=u:r.length>0?s[l.ParameterId.FilterValues]=r:s[l.ParameterId.FilterLevels]=[],s[l.ParameterId.FilterUpdateType]=p.ExternalToInternalEnumMappings.filterUpdateType.convert(n),s[l.ParameterId.IsExcludeMode]=i&&!!i.isExcludeMode,this.execute(a,s).then((function(e){return t}))},t.prototype.clearFilterAsync=function(e,t){var r,n=l.VerbId.ClearFilter,i=((r={})[l.ParameterId.FunctionName]="clearFilterAsync",r);return i[l.ParameterId.VisualId]=e,i[l.ParameterId.FieldName]=t,this.execute(n,i).then((function(e){return t}))},t.prototype.applyRelativeDateFilterAsync=function(e,t,r){var n,i=l.VerbId.ApplyRelativeDateFilter,o=((n={})[l.ParameterId.FunctionName]="applyRelativeDateFilterAsync",n);if(o[l.ParameterId.VisualId]=e,o[l.ParameterId.FieldName]=t,o[l.ParameterId.PeriodType]=p.ExternalToInternalEnumMappings.periodType.convert(r.periodType),o[l.ParameterId.DateRangeType]=p.ExternalToInternalEnumMappings.dateRangeType.convert(r.rangeType),r.rangeType===s.DateRangeType.LastN||r.rangeType===s.DateRangeType.NextN){if(void 0===r.rangeN||null===r.rangeN)throw new c.TableauError(s.EmbeddingErrorCodes.MissingRangeNForRelativeDateFilters,"Missing rangeN field for a relative date filter of LASTN or NEXTN.");o[l.ParameterId.RangeN]=r.rangeN}return void 0!==r.anchorDate&&null!==r.anchorDate&&(o[l.ParameterId.AnchorDate]=this.convertAnchorDate(r.anchorDate)),this.execute(i,o).then((function(e){return e.result}))},t.prototype.getFiltersAsync=function(e){var t,r=this,n=l.VerbId.GetFilters,i=((t={})[l.ParameterId.FunctionName]="getFiltersAsync",t);return i[l.ParameterId.VisualId]=e,this.execute(n,i).then((function(e){var t=e.result;return r.convertDomainFilters(t)}))},t.prototype.getCategoricalDomainAsync=function(e,t,r){var n,i=this,o=l.VerbId.GetCategoricalDomain,a=((n={})[l.ParameterId.FunctionName]="getCategoricalDomainAsync",n);return a[l.ParameterId.VisualId]={worksheet:e},a[l.ParameterId.FieldId]=t,a[l.ParameterId.DomainType]=p.ExternalToInternalEnumMappings.filterDomainType.convert(r),this.execute(o,a).then((function(e){var t=e.result;return i.convertCategoricalDomain(t,r)}))},t.prototype.getRangeDomainAsync=function(e,t,r){var n,i=this,o=l.VerbId.GetRangeDomain,a=((n={})[l.ParameterId.FunctionName]="getRangeDomainAsync",n);return a[l.ParameterId.VisualId]={worksheet:e},a[l.ParameterId.FieldId]=t,a[l.ParameterId.DomainType]=p.ExternalToInternalEnumMappings.filterDomainType.convert(r),this.execute(o,a).then((function(e){var t=e.result;return i.convertRangeDomain(t,r)}))},t.prototype.getDashboardFiltersAsync=function(){var e,t=this,r=l.VerbId.GetDashboardFilters,n=((e={})[l.ParameterId.FunctionName]="getDashboardFiltersAsync",e);return this.execute(r,n).then((function(e){var r=e.result;return t.convertDomainFilters(r)}))},t.prototype.applyDashboardFilterAsync=function(e,t,r,n){var i,o=l.VerbId.DashboardCategoricalFilter,a=((i={})[l.ParameterId.FunctionName]="applyDashboardFilterAsync",i);return a[l.ParameterId.FieldName]=e,a[l.ParameterId.FilterValues]=t,a[l.ParameterId.FilterUpdateType]=p.ExternalToInternalEnumMappings.filterUpdateType.convert(r),a[l.ParameterId.IsExcludeMode]=n&&!!n.isExcludeMode,this.execute(o,a).then((function(e){return e.result}))},t.prototype.getAppliedWorksheetsAsync=function(e,t){var r;return o(this,void 0,void 0,(function(){var n,i;return a(this,(function(o){switch(o.label){case 0:return[4,this.executeGetAppliedWorksheets(e,t,"getAppliedWorksheetsAsync")];case 1:return n=o.sent(),i=[],null===(r=n.worksheets)||void 0===r||r.map((function(e){e.isSelected&&i.push(e.worksheetName)})),[2,i]}}))}))},t.prototype.setAppliedWorksheetsAsync=function(e,t,r,n){return o(this,void 0,void 0,(function(){var i,o,u,p,d;return a(this,(function(a){switch(a.label){case 0:return[4,this.executeGetAppliedWorksheets(e,r,"getAppliedWorksheetsAsyncInternal")];case 1:if(!(i=a.sent())||!i.worksheets)throw new c.TableauError(s.SharedErrorCodes.InternalError,"This filter does not apply to multiple worksheets");if(o=[],u="",i.worksheets.forEach((function(e){e.isActive&&(u=e.worksheetName),(e.isSelected||e.isEnabled)&&o.push(e.worksheetName)})),""===u)throw new c.TableauError(s.SharedErrorCodes.InternalError,"No active worksheet");if(!n.includes(u))throw new c.TableauError(s.SharedErrorCodes.InternalError,u+" must be included in the applied worksheets");return n.forEach((function(e){if(!o.includes(e))throw new c.TableauError(s.SharedErrorCodes.InternalError,"The field "+t+" isn't applicable to the worksheet "+e)})),p=l.VerbId.ChangeSharedFilter,(d={})[l.ParameterId.FunctionName]="setAppliedWorksheetsAsync",d[l.ParameterId.VisualId]={worksheet:e},d[l.ParameterId.FieldId]=r,d[l.ParameterId.SharedFilterSheets]=n,[2,this.execute(p,d).then((function(e){return n}))]}}))}))},t.prototype.executeGetAppliedWorksheets=function(e,t,r){var n=l.VerbId.GetSharedFilter,i={};return i[l.ParameterId.FunctionName]=r,i[l.ParameterId.VisualId]={worksheet:e},i[l.ParameterId.FieldId]=t,this.execute(n,i).then((function(e){return e.result}))},t.prototype.convertDomainFilters=function(e){var t=this,r=[];return e.forEach((function(e){switch(e.filterType){case l.FilterType.Categorical:if(!(n=e))throw new Error("Invalid Categorical Filter");r.push(t.convertCategoricalFilter(n));break;case l.FilterType.Hierarchical:if(!(n=e))throw new Error("Invalid Hierarchical Filter");r.push(t.convertHierarchicalFilter(n));break;case l.FilterType.Range:if(!(n=e))throw new Error("Invalid Range Filter");r.push(t.convertRangeFilter(n));break;case l.FilterType.RelativeDate:var n;if(!(n=e))throw new Error("Invalid Relative Date Filter");r.push(t.convertRelativeDateFilter(n))}})),r},t.prototype.convertCategoricalFilter=function(e){var t=e.values.map((function(e){return h.DataValueFactory.MakeFilterDataValue(e)}));return new f.CategoricalFilter(e.visualId.worksheet,e.fieldCaption,e.fieldName,l.FilterType.Categorical,this._registryId,t,e.isExclude,e.isAllSelected)},t.prototype.convertHierarchicalFilter=function(e){var t=e.values.map((function(e){return new f.HierarchicalDataValue(h.DataValueFactory.MakeFilterDataValue(e.value),e.hierarchicalPath,e.level)})),r=e.levelInfo.map((function(e){return new f.HierarchicalLevelDetail(e.name,d.InternalToExternalEnumMappings.hierarchicalLevelSelectionState.convert(e.levelSelectionState))}));return new f.HierarchicalFilter(e.visualId.worksheet,e.fieldCaption,e.fieldName,l.FilterType.Hierarchical,this._registryId,e.dimensionName,e.hierarchyCaption,e.levels,r,t,e.isAllSelected)},t.prototype.convertRangeFilter=function(e){var t=h.DataValueFactory.MakeFilterDataValue(e.min),r=h.DataValueFactory.MakeFilterDataValue(e.max);return new f.RangeFilter(e.visualId.worksheet,e.fieldCaption,e.fieldName,l.FilterType.Range,this._registryId,t,r,e.includeNullValues)},t.prototype.convertRelativeDateFilter=function(e){var t=h.DataValueFactory.MakeFilterDataValue(e.anchorDate);return new f.RelativeDateFilter(e.visualId.worksheet,e.fieldCaption,e.fieldName,s.FilterType.RelativeDate,this._registryId,t,d.InternalToExternalEnumMappings.dateStepPeriod.convert(e.periodType),d.InternalToExternalEnumMappings.dateRangeType.convert(e.rangeType),e.rangeN)},t.prototype.convertCategoricalDomain=function(e,t){var r=e.values.map((function(e){return h.DataValueFactory.MakeFilterDataValue(e)}));return new f.CategoricalDomain(r,t)},t.prototype.convertRangeDomain=function(e,t){var r=h.DataValueFactory.MakeFilterDataValue(e.min),n=h.DataValueFactory.MakeFilterDataValue(e.max);return new f.RangeDomain(r,n,t)},t.prototype.convertAnchorDate=function(e){var t=e.getUTCFullYear(),r=e.getUTCMonth()+1,n=e.getUTCDate(),i=e.getUTCHours(),o=e.getUTCMinutes(),a=e.getUTCSeconds();if(isNaN(t)||isNaN(r)||isNaN(n)||isNaN(i)||isNaN(o)||isNaN(a))throw new c.TableauError(s.EmbeddingErrorCodes.InvalidDateParameter,"Invalid date parameter: anchorDate");return t+"-"+r+"-"+n+" "+i+":"+o+":"+a},t.prototype.apiFilterHandlerCheckForCommandError=function(e){if(e[u.ParameterId.ParameterError]){if(e[u.ParameterId.InvalidFieldCaption])throw new c.TableauError(s.SharedErrorCodes.InvalidFilterFieldName,e[u.ParameterId.InvalidFieldCaption]);if(e[u.ParameterId.InvalidValues])throw new c.TableauError(s.SharedErrorCodes.InvalidFilterFieldValue,e[u.ParameterId.InvalidValues]);if(e[u.ParameterId.InvalidAggFieldName])throw new c.TableauError(s.SharedErrorCodes.InvalidAggregationFieldName,e[u.ParameterId.InvalidAggFieldName]);throw new c.TableauError(s.SharedErrorCodes.ServerError,"Server Error")}},t}(r(1776).ServiceImplBase);t.FilterServiceImpl=m},7712:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3448),s=r(6680),u=r(5136),l=r(1044),c=r(5068),p=r(7968),d=r(8052),f=r(3483),h=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.viewDataTableCacheId=s.v4(),t}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"get-data-service"},enumerable:!0,configurable:!0}),t.prototype.getMaxRowLimit=function(){return 1e4},t.prototype.getViewDataTableCacheId=function(){return this.viewDataTableCacheId},t.prototype.getLimitedMaxRows=function(e,t){return e>0&&e{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t){this._filterFn=e,this._callbackFn=t}return e.prototype.onNotification=function(e){this._filterFn(e)&&this._callbackFn(e)},e}();t.Registration=r;var n=function(){function e(e){this.dispatcher=e,this._handlers={},this.dispatcher.registerNotificationHandler(this.onNotification.bind(this))}return e.prototype.registerHandler=function(e,t,n){var i=this,o=this._handlers[e]||new Array,a=new r(t,n);return o.push(a),this._handlers[e]=o,function(){return i.removeRegistration(e,a)}},e.prototype.hasHandlersForNotificationType=function(e){return this._handlers.hasOwnProperty(e)},e.prototype.onNotification=function(e){this.hasHandlersForNotificationType(e.notificationId)&&this._handlers[e.notificationId].forEach((function(t){return t.onNotification(e.data)}))},e.prototype.removeRegistration=function(e,t){this.hasHandlersForNotificationType(e)&&(this._handlers[e]=this._handlers[e].filter((function(e){return e!==t})))},e}();t.NotificationServiceImplBase=n},7260:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3448),s=r(8552),u=r(6664),l=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"parameters-service"},enumerable:!0,configurable:!0}),t.prototype.getParametersForSheetAsync=function(e){var t,r=((t={})[a.ParameterId.FunctionName]="getParametersForSheetAsync",t[a.ParameterId.SheetPath]=e,t);return this.getParametersAsync(r)},t.prototype.getAllParametersAsync=function(){var e,t=((e={})[a.ParameterId.FunctionName]="getParametersForSheetAsync",e);return this.getParametersAsync(t)},t.prototype.getParametersAsync=function(e){var t=this;return this.execute(a.VerbId.GetParametersForSheet,e).then((function(e){return e.result.map((function(e){return new s.ParameterImpl(e,t._registryId)}))}))},t.prototype.changeParameterValueAsync=function(e,t){var r,n=((r={})[a.ParameterId.FunctionName]="changeParameterValueAsync",r[a.ParameterId.ParameterFieldName]=e,r[a.ParameterId.ParameterValue]=t,r);return this.execute(a.VerbId.ChangeParameterValue,n).then((function(e){return e.result}))},t.prototype.findParameterByNameAsync=function(e){return this.findParameterAsync(e,void 0)},t.prototype.findParameterByGlobalFieldNameAsync=function(e){return this.findParameterAsync(void 0,e)},t.prototype.findParameterAsync=function(e,t){var r,n=this,i=((r={})[a.ParameterId.FunctionName]="findParameterAsync",r);if(void 0!==e)i[a.ParameterId.ParameterCaption]=e;else{if(void 0===t)throw new u.TableauError(o.ErrorCodes.InvalidParameter,"name or fieldName must be provided to find parameter");i[a.ParameterId.ParameterFieldName]=t}return this.execute(a.VerbId.FindParameter,i).then((function(e){if("fieldName"in e.result){var t=e.result;return new s.ParameterImpl(t,n._registryId)}}))},t}(r(1776).ServiceImplBase);t.ParametersServiceImpl=l},8784:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3448),s=r(7104),u=r(6664),l=r(1172),c=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"selection-service"},enumerable:!0,configurable:!0}),t.prototype.clearSelectedMarksAsync=function(e){var t,r=((t={})[a.ParameterId.FunctionName]="clearSelectedMarksAsync",t[a.ParameterId.VisualId]=e,t);return this.execute(a.VerbId.ClearSelectedMarks,r).then((function(e){}))},t.prototype.selectMarksByValueAsync=function(e,t,r){var n,i=this;if(0===t.length)throw new u.TableauError(o.ErrorCodes.InvalidParameter,"Selection criteria missing for selecting marks by value");var s=this.validateSelectionUpdateType(r),l=this.parseSelectionMarks(t),c=((n={})[a.ParameterId.FunctionName]="selectMarksByValueAsync",n[a.ParameterId.VisualId]=e,n[a.ParameterId.SelectionUpdateType]=s,n);return l.hierModelArr&&l.hierModelArr.length&&(c[a.ParameterId.HierValSelectionModels]=l.hierModelArr),l.quantModelArr&&l.quantModelArr.length&&(c[a.ParameterId.QuantRangeSelectionModels]=l.quantModelArr),l.dimModelArr&&l.dimModelArr.length&&(c[a.ParameterId.DimValSelectionModels]=l.dimModelArr),this.execute(a.VerbId.SelectByValue,c).then((function(e){i.apiFilterHandlerCheckForCommandError(e.result)}))},t.prototype.hoverTupleAsync=function(e,t,r,n){var i,o=new s.HoverTupleInteractionModel(e,this.ensureTupleIDIsNonNegative(t),r,n),u=((i={})[a.ParameterId.FunctionName]="hoverTupleAsync",i[a.ParameterId.HoverTupleInteraction]=o,i);return this.execute(a.VerbId.RaiseHoverTupleNotification,u).then((function(e){}))},t.prototype.selectTuplesAsync=function(e,t,r,n){var i,o=new s.SelectTuplesInteractionModel(e,t,r,n),u=((i={})[a.ParameterId.FunctionName]="selectTuplesAsync",i[a.ParameterId.SelectTuplesInteraction]=o,i);return this.execute(a.VerbId.RaiseSelectTuplesNotification,u).then((function(e){}))},t.prototype.apiFilterHandlerCheckForCommandError=function(e){if(e[a.ParameterId.ParameterError]){if(e[a.ParameterId.InvalidFields])throw new u.TableauError(o.SharedErrorCodes.InvalidSelectionFieldName,e[a.ParameterId.InvalidFields]);if(e[a.ParameterId.InvalidValues])throw new u.TableauError(o.SharedErrorCodes.InvalidSelectionValue,e[a.ParameterId.InvalidValues]);if(e[a.ParameterId.InvalidDates])throw new u.TableauError(o.SharedErrorCodes.InvalidSelectionDate,e[a.ParameterId.InvalidDates])}},t.prototype.selectMarksByIdAsync=function(e,t,r){var n;if(0===t.length)throw new u.TableauError(o.ErrorCodes.InvalidParameter,"Marks info missing for selecting marks by Id");var i=this.validateSelectionUpdateType(r),s=this.parseSelectionIds(t),l=((n={})[a.ParameterId.FunctionName]="selectMarksByIdAsync",n[a.ParameterId.VisualId]=e,n[a.ParameterId.SelectionUpdateType]=i,n[a.ParameterId.Selection]=s.selection,n);return this.execute(a.VerbId.SelectByValue,l).then((function(e){}))},t.prototype.parseSelectionIds=function(e){for(var t=[],r=new s.SelectionModelsContainer,n=0;n0?e:0},t}(r(1776).ServiceImplBase);t.SelectionServiceImpl=c},1776:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(6557),i=r(6664),o=r(5520),a=function(){function e(e,t){this._dispatcher=e,this._registryId=t}return e.prototype.execute=function(e,t){return this._dispatcher.execute(e,t).catch((function(e){var t=e,r=n.InternalToExternalEnumMappings.errorCode.convert(t.errorCode,o.ShouldThrow.No);throw new i.TableauError(r,t.message)}))},e}();t.ServiceImplBase=a},4109:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(3448),a=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"size-service"},enumerable:!0,configurable:!0}),t.prototype.changeSizeAsync=function(e,t){var r,n,i,a,s,u=((r={})[o.ParameterId.FunctionName]="changeSizeAsync",r[o.ParameterId.SheetName]=e,r[o.ParameterId.MinHeight]=(null===(n=t.minSize)||void 0===n?void 0:n.height)||0,r[o.ParameterId.MinWidth]=(null===(i=t.minSize)||void 0===i?void 0:i.width)||0,r[o.ParameterId.MaxHeight]=(null===(a=t.maxSize)||void 0===a?void 0:a.height)||0,r[o.ParameterId.MaxWidth]=(null===(s=t.maxSize)||void 0===s?void 0:s.width)||0,r);return this.execute(o.VerbId.SetSheetSize,u).then((function(e){}))},t}(r(1776).ServiceImplBase);t.SizeServiceImpl=a},2248:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(3448),a=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"story-activation-service"},enumerable:!0,configurable:!0}),t.prototype.activateNextStoryPointAsync=function(){var e,t=o.VerbId.ActivateNextStoryPoint,r=((e={})[o.ParameterId.FunctionName]="activateNextStoryPointAsync",e);return this.execute(t,r).then((function(e){}))},t.prototype.activatePreviousStoryPointAsync=function(){var e,t=o.VerbId.ActivatePreviousStoryPoint,r=((e={})[o.ParameterId.FunctionName]="activatePreviousStoryPointAsync",e);return this.execute(t,r).then((function(e){}))},t.prototype.activateStoryPointAsync=function(e){var t,r=o.VerbId.ActivateStoryPoint,n=((t={})[o.ParameterId.FunctionName]="activateStoryPointAsync",t);return n[o.ParameterId.StoryPointIndex]=e,this.execute(r,n).then((function(e){}))},t.prototype.revertStoryPointAsync=function(e){var t,r=o.VerbId.RevertStoryPoint,n=((t={})[o.ParameterId.FunctionName]="revertStoryPointAsync",t);return n[o.ParameterId.StoryPointIndex]=e,this.execute(r,n).then((function(e){return e.result}))},t}(r(1776).ServiceImplBase);t.StoryActivationServiceImpl=a},6096:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(3448),a=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"visual-model-service"},enumerable:!0,configurable:!0}),t.prototype.getVisualSpecificationAsync=function(e){var t,r=((t={})[o.ParameterId.FunctionName]="getVisualSpecificationAsync",t[o.ParameterId.WorksheetName]=e.worksheet,t);return this.execute(o.VerbId.GetVisualSpecification,r).then((function(e){return e.result}))},t.prototype.addMarksCardFieldsAsync=function(e,t,r,n,i){var a,s=((a={})[o.ParameterId.FunctionName]="addMarksCardFieldsAsync",a[o.ParameterId.WorksheetName]=e.worksheet,a[o.ParameterId.MarksCardIndex]=t,a[o.ParameterId.EncodingType]=r,a[o.ParameterId.Columns]=n,a[o.ParameterId.StartIndex]=i,a);return this.execute(o.VerbId.AddMarksCardFields,s).then((function(){}))},t.prototype.moveMarksCardFieldAsync=function(e,t,r,n,i){var a;void 0===i&&(i=1);var s=((a={})[o.ParameterId.FunctionName]="addMarksCardFieldsAsync",a[o.ParameterId.WorksheetName]=e.worksheet,a[o.ParameterId.MarksCardIndex]=t,a[o.ParameterId.FromIndex]=r,a[o.ParameterId.ToIndex]=n,a[o.ParameterId.FieldCount]=i,a);return this.execute(o.VerbId.MoveMarksCardField,s).then((function(){}))},t.prototype.spliceMarksCardFieldsAsync=function(e,t,r,n,i,a){var s,u=((s={})[o.ParameterId.FunctionName]="spliceMarksCardFieldsAsync",s[o.ParameterId.WorksheetName]=e.worksheet,s[o.ParameterId.MarksCardIndex]=t,s[o.ParameterId.EncodingType]=r,s[o.ParameterId.StartIndex]=n,s[o.ParameterId.DeleteCount]=i,s[o.ParameterId.Columns]=a,s);return this.execute(o.VerbId.SpliceMarksCardFields,u).then((function(){}))},t.prototype.editAliasesDialogAsync=function(e){var t,r=((t={})[o.ParameterId.FunctionName]="editAliasesDialogAsync",t[o.ParameterId.FieldId]=e,t);return this.execute(o.VerbId.EditAliasesDialog,r).then((function(){}))},t}(r(1776).ServiceImplBase);t.VisualModelServiceImpl=a},744:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(3448),a=r(2520),s=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"viz-service"},enumerable:!0,configurable:!0}),t.prototype.createVizImageAsync=function(e){var t,r=((t={})[o.ParameterId.FunctionName]="createVizImageAsync",t[o.ParameterId.VizAPIInputJson]=JSON.stringify(e),t);return this.execute(o.VerbId.VizAPI,r).then((function(e){return e.result}))},t.prototype.activateSheetAsync=function(e){var t,r=((t={})[o.ParameterId.FunctionName]="activateSheetAsync",t[o.ParameterId.SwitchToSheetName]=e,t);return this.execute(o.VerbId.ActivateSheet,r).then((function(){}))},t.prototype.getCustomViewsAsync=function(){var e,t=this,r=((e={})[o.ParameterId.FunctionName]="getCustomViewsAsync",e);return this.execute(o.VerbId.GetCustomViews,r).then((function(e){return e.result.map((function(e){return new a.CustomViewImpl(e,t._registryId)}))}))},t.prototype.showCustomViewAsync=function(e){var t,r=this,n=((t={})[o.ParameterId.FunctionName]="showCustomViewAsync",t[o.ParameterId.CustomViewName]=e||"",t);return this.execute(o.VerbId.ShowCustomView,n).then((function(e){var t,n=e.result;return(null===(t=n)||void 0===t?void 0:t.luid)?new a.CustomViewImpl(n,r._registryId):void 0}))},t.prototype.removeCustomViewAsync=function(e){var t,r=this,n=((t={})[o.ParameterId.FunctionName]="removeCustomViewAsync",t[o.ParameterId.CustomViewName]=e,t);return this.execute(o.VerbId.RemoveCustomView,n).then((function(e){var t=e.result;return new a.CustomViewImpl(t,r._registryId)}))},t.prototype.saveCustomViewAsync=function(e){var t,r=this,n=((t={})[o.ParameterId.FunctionName]="saveCustomViewAsync",t[o.ParameterId.CustomViewName]=e,t[o.ParameterId.CustomViewIsDefault]=!1,t);return this.execute(o.VerbId.SaveWorkbookAsCustomView,n).then((function(e){var t=e.result;return new a.CustomViewImpl(t,r._registryId)}))},t.prototype.setActiveCustomViewAsDefaultAsync=function(){var e,t=((e={})[o.ParameterId.FunctionName]="setActiveCustomViewAsDefaultAsync",e);return this.execute(o.VerbId.SetActiveCustomViewAsDefault,t).then((function(){}))},t.prototype.saveAsync=function(e){var t,r=this,n=((t={})[o.ParameterId.FunctionName]="saveAsync",t[o.ParameterId.CustomViewLuid]=e.luid,t[o.ParameterId.CustomViewName]=e.name,t[o.ParameterId.CustomViewIsDefault]=e.isDefault,t[o.ParameterId.CustomViewIsPublic]=e.shared,t);return this.execute(o.VerbId.UpdateCustomView,n).then((function(e){var t=e.result;return new a.CustomViewImpl(t,r._registryId)}))},t.prototype.getCurrentSrcAsync=function(){var e,t=((e={})[o.ParameterId.FunctionName]="getCurrentSrcAsync",e);return this.execute(o.VerbId.GetCurrentSrc,t).then((function(e){return e.result}))},t}(r(1776).ServiceImplBase);t.VizServiceImpl=s},8856:function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},n(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=r(7419),a=r(3448),s=r(1044),u=r(7480),l=r(1172),c=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),Object.defineProperty(t.prototype,"serviceName",{get:function(){return"zone-service"},enumerable:!0,configurable:!0}),t.prototype.setVisibilityAsync=function(e,t,r){var n,i=((n={})[a.ParameterId.FunctionName]="setVisibilityAsync",n[a.ParameterId.Dashboard]=e,n[a.ParameterId.ZoneIdsVisibilityMap]={},n);return l.Param.convertParameterToMap(r,"zoneVisibilityMap").forEach((function(e,r){u.ErrorHelpers.verifyZoneIsValid(t,Number.parseInt(r,10)),u.ErrorHelpers.verifyEnumValue(e,o.DashboardObjectVisibilityType,"DashboardObjectVisibilityType"),i[a.ParameterId.ZoneIdsVisibilityMap][r]=s.ExternalToInternalEnumMappings.setVisibilityType.convert(e)})),this.execute(a.VerbId.SetZoneVisibility,i).then((function(e){}))},t.prototype.moveAndResizeAsync=function(e,t,r){var n,i=((n={})[a.ParameterId.Dashboard]=e,n[a.ParameterId.DashboardObjectPositionAndSizeUpdateList]=r,n);return r.forEach((function(e){u.ErrorHelpers.verifyZoneIsValidAndFloating(t,e.dashboardObjectID),u.ErrorHelpers.verifyWidthAndHeightOfDashboardObjectPositionAndSizeUpdate(e)})),this.execute(a.VerbId.MoveAndResizeZones,i).then((function(e){}))},t}(r(1776).ServiceImplBase);t.ZoneServiceImpl=c},7603:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e){this._tableInfo=e}return Object.defineProperty(e.prototype,"name",{get:function(){return this._tableInfo.name},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"id",{get:function(){return this._tableInfo.id},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"connectionId",{get:function(){return this._tableInfo.connectionId},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"customSQL",{get:function(){return this._tableInfo.customSQL},enumerable:!0,configurable:!0}),e}();t.TableSummary=r},6664:function(e,t){"use strict";var r,n=this&&this.__extends||(r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},r(e,t)},function(e,t){function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)});Object.defineProperty(t,"__esModule",{value:!0});var i=function(e){function t(r,n){var i=e.call(this,r+": "+n)||this;return i._errorCode=r,Object.setPrototypeOf(i,t.prototype),i}return n(t,e),Object.defineProperty(t.prototype,"errorCode",{get:function(){return this._errorCode},enumerable:!0,configurable:!0}),t}(Error);t.TableauError=i},8052:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(3448),i=r(5068),o=function(){function e(){}return e.MakeParameterDataValue=function(e,t){return new i.DataValue(e.value,n.DataTypeConverter.convertStringValueToNativeValue(e.value,t),e.formattedValue,e.aliasedValue,e.hasAlias)},e.MakeFilterDataValue=function(e){return new i.DataValue(e.value,e.value,e.formattedValue)},e.MakeTableDataValue=function(e,t){return new i.DataValue(e.value,void 0!==e.value?n.DataTypeConverter.convertValueToNativeValue(e.value,t):void 0,e.formattedValue)},e}();t.DataValueFactory=o},1724:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(){var e=this;this._promise=new Promise((function(t,r){e._resolve=t,e._reject=r}))}return Object.defineProperty(e.prototype,"promise",{get:function(){return this._promise},enumerable:!0,configurable:!0}),e.prototype.resolve=function(e){this._resolve&&this._resolve(e)},e.prototype.reject=function(e){this._reject&&this._reject(e)},e}();t.Deferred=r,t.UnregisterTimeoutInMilliseconds=3e4},5520:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n,i=r(7419),o=r(6664),a=function(){function e(e,t){this._mappings=e,this._defaultVal=t}return e.prototype.convert=function(e,t){if(void 0===t&&(t=n.Yes),this._mappings.hasOwnProperty(e))return this._mappings[e];if(void 0!==this._defaultVal&&t!==n.Yes)return this._defaultVal;throw new o.TableauError(i.ErrorCodes.InternalError,"Enum Mapping not found for: "+e)},e}();t.EnumConverter=a,function(e){e.Yes="yes",e.No="no"}(n=t.ShouldThrow||(t.ShouldThrow={}))},7480:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(6664),o=r(1172),a=function(){function e(){}return e.apiNotImplemented=function(e){return new i.TableauError(n.SharedErrorCodes.InternalError,e+" API not yet implemented.")},e.verifyInternalValue=function(e,t){if(null==e)throw new i.TableauError(n.SharedErrorCodes.InternalError,e+" is invalid value for: "+t)},e.verifyParameter=function(e,t){if(null==e)throw new i.TableauError(n.SharedErrorCodes.InvalidParameter,e+" is invalid value for parameter: "+t)},e.verifyParameterType=function(e,t,r){if(typeof e!==t)throw new i.TableauError(n.SharedErrorCodes.InvalidParameter,e+" has invalid type for parameter: "+r+".")},e.verifyStringParameter=function(e,t){if(null==e||""===e)throw new i.TableauError(n.SharedErrorCodes.InvalidParameter,e+" is invalid value for paramter: "+t)},e.isValidEnumValue=function(e,t){var r=!1;return Object.keys(t).forEach((function(n){t[n]===e.toString()&&(r=!0)})),r},e.verifyEnumValue=function(t,r,o){if(!e.isValidEnumValue(t,r))throw new i.TableauError(n.SharedErrorCodes.InvalidParameter,t+" is invalid value for enum: "+o+".")},e.verifyRange=function(e,t,r){if(!(t<=e&&e{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(3448),i=r(7419),o=r(6664),a=function(){function e(){}return e.updateInternalExportPDFOptions=function(e,t,r){e.currentSheet=r[0],this.updateExportLayoutOptions(e,t),this.updateSheetOptions(e,r)},e.updateExportLayoutOptions=function(e,t){var r=e.exportLayoutOptions;switch(r.imageHeight=this.DefaultLayoutOptions.imageHeight,r.imageWidth=this.DefaultLayoutOptions.imageWidth,t.orientation){case i.PrintOrientation.Landscape:r.pageOrientationOption=n.PageOrientation.Landscape;break;case i.PrintOrientation.Portrait:r.pageOrientationOption=n.PageOrientation.Portrait;break;default:throw new o.TableauError(i.SharedErrorCodes.InternalError,"invalid orientation for ExportPDFOption")}switch(t.pageSize){case i.PrintPageSize.A3:r.pageSizeOption=n.PageSizeOption.A3;break;case i.PrintPageSize.A4:r.pageSizeOption=n.PageSizeOption.A4;break;case i.PrintPageSize.A5:r.pageSizeOption=n.PageSizeOption.A5;break;case i.PrintPageSize.B4:r.pageSizeOption=n.PageSizeOption.B4;break;case i.PrintPageSize.B5:r.pageSizeOption=n.PageSizeOption.B5;break;case i.PrintPageSize.Executive:r.pageSizeOption=n.PageSizeOption.Executive;break;case i.PrintPageSize.Folio:r.pageSizeOption=n.PageSizeOption.Folio;break;case i.PrintPageSize.Ledger:r.pageSizeOption=n.PageSizeOption.Ledger;break;case i.PrintPageSize.Legal:r.pageSizeOption=n.PageSizeOption.Legal;break;case i.PrintPageSize.Letter:r.pageSizeOption=n.PageSizeOption.Letter;break;case i.PrintPageSize.Note:r.pageSizeOption=n.PageSizeOption.Note;break;case i.PrintPageSize.Quarto:r.pageSizeOption=n.PageSizeOption.Quarto;break;case i.PrintPageSize.Statement:r.pageSizeOption=n.PageSizeOption.Statement;break;case i.PrintPageSize.Tabloid:r.pageSizeOption=n.PageSizeOption.Tabloid;break;case i.PrintPageSize.Unspecified:r.pageSizeOption=n.PageSizeOption.Unspecified;break;default:throw new o.TableauError(i.SharedErrorCodes.InternalError,"invalid pageSize for ExportPDFOption")}switch(t.scaling){case i.PrintScaling.AtMost1PageHigh:this.setFitAndScaleValues(r,n.FitPages.FitOneHigh);break;case i.PrintScaling.AtMost1PageWide:this.setFitAndScaleValues(r,n.FitPages.FitOneWide);break;case i.PrintScaling.AtMost2PagesHigh:this.setFitAndScaleValues(r,n.FitPages.FitTwoHigh);break;case i.PrintScaling.AtMost2PagesWide:this.setFitAndScaleValues(r,n.FitPages.FitTwoWide);break;case i.PrintScaling.Automatic:this.setFitAndScaleValues(r,n.PageScalingOption.ScalePctAuto);break;case i.PrintScaling.Perc100:this.setFitAndScaleValues(r,n.PageScalingOption.ScalePct100);break;case i.PrintScaling.Perc200:this.setFitAndScaleValues(r,n.PageScalingOption.ScalePct200);break;case i.PrintScaling.Perc25:this.setFitAndScaleValues(r,n.PageScalingOption.ScalePct25);break;case i.PrintScaling.Perc400:this.setFitAndScaleValues(r,n.PageScalingOption.ScalePct400);break;case i.PrintScaling.Perc50:this.setFitAndScaleValues(r,n.PageScalingOption.ScalePct50);break;case i.PrintScaling.Perc60:this.setFitAndScaleValues(r,n.PageScalingOption.ScalePct60);break;case i.PrintScaling.Perc75:this.setFitAndScaleValues(r,n.PageScalingOption.ScalePct75);break;case i.PrintScaling.Perc80:this.setFitAndScaleValues(r,n.PageScalingOption.ScalePct80);break;case i.PrintScaling.Perc90:this.setFitAndScaleValues(r,n.PageScalingOption.ScalePct90);break;default:throw new o.TableauError(i.SharedErrorCodes.InternalError,"invalid scaling for ExportPDFOption")}},e.updateSheetOptions=function(e,t){for(var r=e.exportLayoutOptions,n=0,i=e.sheetOptions;n{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(6664),o=r(7480),a=function(){function e(){}return e.serializeDateForPlatform=function(e){return e.getUTCFullYear()+"-"+(e.getUTCMonth()+1)+"-"+e.getUTCDate()+" "+e.getUTCHours()+":"+e.getUTCMinutes()+":"+e.getUTCSeconds()},e.serializeBooleanForPlatform=function(e){return e?"true":"false"},e.serializeNumberForPlatform=function(e){return e.toString(10)},e.isTypeNumber=function(e){return"number"==typeof e||e instanceof Number},e.isTypeDate=function(e){return e instanceof Date},e.isTypeString=function(e){return"string"==typeof e||e instanceof String},e.isTypeBool=function(e){return"boolean"==typeof e||e instanceof Boolean},e.isNullOrUndefined=function(e){return null==e},e.serializeParameterValue=function(t){if(e.isTypeNumber(t))return e.serializeNumberForPlatform(t);if(e.isTypeDate(t))return e.serializeDateForPlatform(t);if(e.isTypeBool(t))return e.serializeBooleanForPlatform(t);if(e.isTypeString(t))return t;throw new i.TableauError(n.ErrorCodes.InternalError,"Unexpected invalid value for: "+t)},e.convertParameterToMap=function(e,t){if(o.ErrorHelpers.verifyParameterType(e,"object",t),Array.isArray(e))throw new i.TableauError(n.ErrorCodes.InvalidParameter,"Expecting object or Map for: "+t+".");return e instanceof Map?e:new Map(Object.entries(e))},e.tryParseNumber=function(t){if(e.isNullOrUndefined(t))return{success:!1};if(e.isTypeNumber(t))return{parsed:t,success:!0};var r=t.toString();if("NaN"===r)return{parsed:NaN,success:!0};var n=parseFloat(r);return isNaN(n)?{success:!1}:{parsed:n,success:!0}},e}();t.Param=a},2780:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(3448),o=r(6664),a=function(){function e(){}return e.getSheetSizeFromSizeConstraints=function(e){var t=e.minWidth,r=e.minHeight,i=e.maxWidth,o=e.maxHeight;if(0===r&&0===t)return 0===o&&0===i?{behavior:n.SheetSizeBehavior.Automatic}:{behavior:n.SheetSizeBehavior.AtMost,maxSize:{width:i,height:o}};if(0===o&&0===i)return{behavior:n.SheetSizeBehavior.AtLeast,minSize:{width:t,height:r}};if(o===r&&i===t&&t>0)return{behavior:n.SheetSizeBehavior.Exactly,minSize:{width:t,height:r},maxSize:{width:t,height:r}};var a=0===t&&0===i;return{behavior:n.SheetSizeBehavior.Range,minSize:{width:t,height:r},maxSize:{width:a?2147483647:i,height:o}}},e.createAutomaticSize=function(){return{behavior:n.SheetSizeBehavior.Automatic,minSize:{width:0,height:0},maxSize:{width:0,height:0}}},e.getPublishedSheetInfoByName=function(e,t){return t.find((function(t){return t.name===e}))},e.getSheetTypeEnum=function(e){var t;switch(e){case i.SheetType.Worksheet:t=n.SheetType.Worksheet;break;case i.SheetType.Dashboard:t=n.SheetType.Dashboard;break;case i.SheetType.Story:t=n.SheetType.Story;break;default:throw new o.TableauError(n.SharedErrorCodes.ServerError,"Invalid SheetType")}return t},e.isValidSheetSize=function(e){return void 0!==e.behavior},e}();t.SheetUtils=a},3036:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(6664),o=r(1724),a=function(){function e(e){void 0===e&&(e=o.UnregisterTimeoutInMilliseconds),this._timeoutInMilliseconds=e}return e.prototype.getNewPromiseOrThrowIfBusy=function(){var e=this;if(this._deferred)throw new i.TableauError(n.SharedErrorCodes.ApiExecutionError,"This api cannot be executed till previous call is resolved.");return this._deferred=new o.Deferred,this._timeoutId=setTimeout((function(){var t=new i.TableauError(n.SharedErrorCodes.Timeout,"Api failed to complete in "+e._timeoutInMilliseconds/1e3+" seconds");e.reject(t)}),this._timeoutInMilliseconds),this._deferred.promise},e.prototype.resolve=function(e){this._deferred&&(clearTimeout(this._timeoutId),this._deferred.resolve(e),this._deferred=void 0)},e.prototype.reject=function(e){this._deferred&&(clearTimeout(this._timeoutId),this._deferred.reject(e),this._deferred=void 0)},e}();t.ShortLivedDeferred=a},1576:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(7419),i=r(6664),o=function(){function e(e,t){var r=e.split("-");this.build=this.getBuildNumber(r[1]);var o=(e=r[0]).split(".").map((function(e){return parseInt(e,10)}));if(3!==o.length)throw new i.TableauError(n.ErrorCodes.InternalError,"Invalid version number: "+e);this.major=o[0],this.minor=o[1],this.fix=o[2],this.isAlpha=t}return e.prototype.getBuildNumber=function(e){if(!e)return-1;var t=e.split(".");return t[1]?parseInt(t[1],10):-1},Object.defineProperty(e.prototype,"formattedValue",{get:function(){return this.major+"."+this.minor+"."+this.fix},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"fullFormattedValue",{get:function(){return this.major+"."+this.minor+"."+this.fix+"-pre."+this.build},enumerable:!0,configurable:!0}),e}();t.VersionNumber=o},8648:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(3448),i=function(){function e(e,t){var r=this;this._apiDelegateDispatcher=e,this._versionConverter=n.CreateExternalCompatibleVersionConverter(n.INTERNAL_CONTRACT_VERSION,t),this._notificationHandlers=[],e.registerNotificationHandler((function(e){if(0!==r._notificationHandlers.length){var t=r._versionConverter.upgradeNotification(e);r._notificationHandlers.forEach((function(e){e(t)}))}}))}return e.needsVersionConverter=function(e){return n.VersionLessThan(e,n.INTERNAL_CONTRACT_VERSION)},e.prototype.execute=function(e,t){var r=this;try{var n=this._versionConverter.downgradeExecuteCall(e,t);return this._apiDelegateDispatcher.execute(n.verb,n.parameters).then((function(n){return r._versionConverter.upgradeExecuteReturn(n,e,t)}))}catch(e){return Promise.reject(e)}},e.prototype.registerNotificationHandler=function(e){this._notificationHandlers.push(e)},e.prototype.unregisterNotificationHandler=function(e){this._notificationHandlers=this._notificationHandlers.filter((function(t){return t!==e}))},e}();t.VersionedExternalApiDispatcher=i},6680:(e,t,r)=>{"use strict";var n;r.r(t),r.d(t,{NIL:()=>x,parse:()=>m,stringify:()=>c,v1:()=>y,v3:()=>A,v4:()=>E,v5:()=>O,validate:()=>s,version:()=>F});var i=new Uint8Array(16);function o(){if(!n&&!(n="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto)))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return n(i)}const a=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i,s=function(e){return"string"==typeof e&&a.test(e)};for(var u=[],l=0;l<256;++l)u.push((l+256).toString(16).substr(1));const c=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,r=(u[e[t+0]]+u[e[t+1]]+u[e[t+2]]+u[e[t+3]]+"-"+u[e[t+4]]+u[e[t+5]]+"-"+u[e[t+6]]+u[e[t+7]]+"-"+u[e[t+8]]+u[e[t+9]]+"-"+u[e[t+10]]+u[e[t+11]]+u[e[t+12]]+u[e[t+13]]+u[e[t+14]]+u[e[t+15]]).toLowerCase();if(!s(r))throw TypeError("Stringified UUID is invalid");return r};var p,d,f=0,h=0;const y=function(e,t,r){var n=t&&r||0,i=t||new Array(16),a=(e=e||{}).node||p,s=void 0!==e.clockseq?e.clockseq:d;if(null==a||null==s){var u=e.random||(e.rng||o)();null==a&&(a=p=[1|u[0],u[1],u[2],u[3],u[4],u[5]]),null==s&&(s=d=16383&(u[6]<<8|u[7]))}var l=void 0!==e.msecs?e.msecs:Date.now(),y=void 0!==e.nsecs?e.nsecs:h+1,m=l-f+(y-h)/1e4;if(m<0&&void 0===e.clockseq&&(s=s+1&16383),(m<0||l>f)&&void 0===e.nsecs&&(y=0),y>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");f=l,h=y,d=s;var g=(1e4*(268435455&(l+=122192928e5))+y)%4294967296;i[n++]=g>>>24&255,i[n++]=g>>>16&255,i[n++]=g>>>8&255,i[n++]=255&g;var v=l/4294967296*1e4&268435455;i[n++]=v>>>8&255,i[n++]=255&v,i[n++]=v>>>24&15|16,i[n++]=v>>>16&255,i[n++]=s>>>8|128,i[n++]=255&s;for(var b=0;b<6;++b)i[n+b]=a[b];return t||c(i)},m=function(e){if(!s(e))throw TypeError("Invalid UUID");var t,r=new Uint8Array(16);return r[0]=(t=parseInt(e.slice(0,8),16))>>>24,r[1]=t>>>16&255,r[2]=t>>>8&255,r[3]=255&t,r[4]=(t=parseInt(e.slice(9,13),16))>>>8,r[5]=255&t,r[6]=(t=parseInt(e.slice(14,18),16))>>>8,r[7]=255&t,r[8]=(t=parseInt(e.slice(19,23),16))>>>8,r[9]=255&t,r[10]=(t=parseInt(e.slice(24,36),16))/1099511627776&255,r[11]=t/4294967296&255,r[12]=t>>>24&255,r[13]=t>>>16&255,r[14]=t>>>8&255,r[15]=255&t,r};function g(e,t,r){function n(e,n,i,o){if("string"==typeof e&&(e=function(e){e=unescape(encodeURIComponent(e));for(var t=[],r=0;r>>9<<4)+1}function b(e,t){var r=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(r>>16)<<16|65535&r}function I(e,t,r,n,i,o){return b((a=b(b(t,e),b(n,o)))<<(s=i)|a>>>32-s,r);var a,s}function S(e,t,r,n,i,o,a){return I(t&r|~t&n,e,t,i,o,a)}function T(e,t,r,n,i,o,a){return I(t&n|r&~n,e,t,i,o,a)}function _(e,t,r,n,i,o,a){return I(t^r^n,e,t,i,o,a)}function P(e,t,r,n,i,o,a){return I(r^(t|~n),e,t,i,o,a)}const A=g("v3",48,(function(e){if("string"==typeof e){var t=unescape(encodeURIComponent(e));e=new Uint8Array(t.length);for(var r=0;r>5]>>>i%32&255,a=parseInt(n.charAt(o>>>4&15)+n.charAt(15&o),16);t.push(a)}return t}(function(e,t){e[t>>5]|=128<>5]|=(255&e[n/8])<>>32-t}const O=g("v5",80,(function(e){var t=[1518500249,1859775393,2400959708,3395469782],r=[1732584193,4023233417,2562383102,271733878,3285377520];if("string"==typeof e){var n=unescape(encodeURIComponent(e));e=[];for(var i=0;i>>0;b=v,v=g,g=D(m,30)>>>0,m=y,y=T}r[0]=r[0]+y>>>0,r[1]=r[1]+m>>>0,r[2]=r[2]+g>>>0,r[3]=r[3]+v>>>0,r[4]=r[4]+b>>>0}return[r[0]>>24&255,r[0]>>16&255,r[0]>>8&255,255&r[0],r[1]>>24&255,r[1]>>16&255,r[1]>>8&255,255&r[1],r[2]>>24&255,r[2]>>16&255,r[2]>>8&255,255&r[2],r[3]>>24&255,r[3]>>16&255,r[3]>>8&255,255&r[3],r[4]>>24&255,r[4]>>16&255,r[4]>>8&255,255&r[4]]})),x="00000000-0000-0000-0000-000000000000",F=function(e){if(!s(e))throw TypeError("Invalid UUID");return parseInt(e.substr(14,1),16)}},5892:e=>{"use strict";e.exports=JSON.parse('{"major":1,"minor":179,"fix":0}')}},t={};function r(n){var i=t[n];if(void 0!==i)return i.exports;var o=t[n]={exports:{}};return e[n].call(o.exports,o,o.exports,r),o.exports}r.d=(e,t)=>{for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var n={};(()=>{"use strict";var e=n;Object.defineProperty(e,"__esModule",{value:!0});var t=r(5136);r(3e3),r(8315),r(80),r(5668),r(5816),r(3680),r(9308),r(8824),r(8512),r(9232),r(9336);var i=r(976),o=r(5408),a="undefined"!=typeof VERSION_IS_ALPHA&&VERSION_IS_ALPHA;t.ApiVersion.SetVersionNumber("1.14.0-pre.9",a);var s=new i.ExtensionsImpl;e.extensions=new o.Extensions(s);var u=r(7419);e.AnalyticsObjectType=u.AnalyticsObjectType,e.AnnotationType=u.AnnotationType,e.ClassNameKey=u.ClassNameKey,e.ColumnType=u.ColumnType,e.DashboardLayoutChange=u.DashboardLayoutChange,e.DashboardObjectType=u.DashboardObjectType,e.DashboardObjectVisibilityType=u.DashboardObjectVisibilityType,e.DataType=u.DataType,e.DateRangeType=u.DateRangeType,e.DialogStyle=u.DialogStyle,e.EncodingType=u.EncodingType,e.ErrorCodes=u.ErrorCodes,e.ExtensionContext=u.ExtensionContext,e.ExtensionMode=u.ExtensionMode,e.FieldAggregationType=u.FieldAggregationType,e.FieldRoleType=u.FieldRoleType,e.FilterDomainType=u.FilterDomainType,e.FilterNullOption=u.FilterNullOption,e.FilterType=u.FilterType,e.FilterUpdateType=u.FilterUpdateType,e.HierarchicalLevelSelectionState=u.HierarchicalLevelSelectionState,e.IncludeDataValuesOption=u.IncludeDataValuesOption,e.MarkType=u.MarkType,e.ParameterValueType=u.ParameterValueType,e.PeriodType=u.PeriodType,e.QuickTableCalcType=u.QuickTableCalcType,e.ReplaySpeedType=u.ReplaySpeedType,e.SelectOptions=u.SelectOptions,e.SelectionUpdateType=u.SelectionUpdateType,e.SheetType=u.SheetType,e.SortDirection=u.SortDirection,e.TableauEventType=u.TableauEventType,e.TrendLineModelType=u.TrendLineModelType,e.VizImageEncodingType=u.VizImageEncodingType,e.VizImagePaletteType=u.VizImagePaletteType,e.VizImageSizeSettingAlignmentType=u.VizImageSizeSettingAlignmentType,e.VizImageSizeSettingType=u.VizImageSizeSettingType,e.VizImageSortDirectionType=u.VizImageSortDirectionType,e.ZoneVisibilityType=u.ZoneVisibilityType})(),window.tableau=n})(); -//# sourceMappingURL=tableau.extensions.1.14.0-pre.9.min.js.map \ No newline at end of file +(()=>{var e={1808:e=>{!function(){var t=new RegExp("^[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}$","i");function r(e){for(var t="",r=0;r{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(7112);class n extends i.TableauEvent{constructor(e){super(a.TableauEventType.DashboardLayoutChanged),this._dashboardLayoutChangeDetails=e}get dashboardLayoutChangeDetails(){return this._dashboardLayoutChangeDetails}}t.DashboardLayoutChangedEvent=n},1672:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(5136),n=r(4144);class s extends n.TableauWorksheetEvent{constructor(e,t,r){super(a.TableauEventType.FilterChanged,e),this._fieldName=t,this._fieldId=r}get fieldName(){return this._fieldName}get fieldId(){return this._fieldId}getFilterAsync(){return this._worksheet.getFiltersAsync().then((e=>{const t=this.fieldId?e.find((e=>e.fieldId===this.fieldId),this):e.find((e=>e.fieldName===this.fieldName),this);if(!t)throw new i.TableauError(a.ErrorCodes.MissingFilter,`cannot find filter: ${this._fieldName}`);return t}))}}t.FilterChangedEvent=s},5572:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(4144);class n extends i.TableauWorksheetEvent{constructor(e){super(a.TableauEventType.MarkSelectionChanged,e)}getMarksAsync(){return this.worksheet.getSelectedMarksAsync()}}t.MarksSelectedEvent=n},864:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(5136),n=r(4592),s=r(3848),o=r(3248);class l extends o.TableauSheetEvent{constructor(e,t){super(a.TableauEventType.ParameterChanged,t),this._globalFieldName=e}getParameterAsync(){return i.ApiServiceRegistry.get(s.ExtensionsRegistryId).getService("parameters-service").findParameterByGlobalFieldNameAsync(this._globalFieldName).then((e=>{if(void 0===e)throw new i.TableauError(a.ErrorCodes.MissingParameter,`Cannot find parameter: ${this._globalFieldName}`);return new n.Parameter(e,this.sheet)}))}}t.ParameterChangedEvent=l},3464:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(4144);class n extends i.TableauWorksheetEvent{constructor(e){super(a.TableauEventType.SummaryDataChanged,e)}}t.SummaryDataChangedEvent=n},7112:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.TableauEvent=class{constructor(e){this._type=e}get type(){return this._type}}},3248:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7112);class i extends a.TableauEvent{constructor(e,t){super(e),this._sheet=t}get sheet(){return this._sheet}}t.TableauSheetEvent=i},4144:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3248);class i extends a.TableauSheetEvent{constructor(e,t){super(e,t),this._worksheet=t}get worksheet(){return this._worksheet}}t.TableauWorksheetEvent=i},4164:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(7112);class n extends i.TableauEvent{constructor(e){super(a.TableauEventType.WorkbookFormattingChanged),this._formatting=e}get formatting(){return this._formatting}}t.WorkbookFormattingChangedEvent=n},4712:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(4144);class n extends i.TableauWorksheetEvent{constructor(e,t){super(a.TableauEventType.WorksheetFormattingChanged,e),this._formatting=t}get formatting(){return this._formatting}}t.WorksheetFormattingChangedEvent=n},92:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.BentonSansFontFamilyName="Benton Sans",t.BentonSansLowDPIFontFamilyName="Benton Sans Low-DPI",t.BentonSansBookFontFaceName="Benton Sans Book",t.BentonSansBookItalicFontFaceName="Benton Sans Book Italic",t.BentonSansSemiDemiFontFaceName="Benton Sans SemiDemi",t.BentonSansSemiDemiItalicFontFaceName="Benton Sans SemiDemi Italic",t.BentonSansLightFontFaceName="Benton Sans Light",t.BentonSansMediumFontFaceName="Benton Sans Medium",t.SupportedBentonSansFontFaces=[t.BentonSansBookFontFaceName,t.BentonSansBookItalicFontFaceName,t.BentonSansSemiDemiFontFaceName,t.BentonSansSemiDemiItalicFontFaceName,t.BentonSansLightFontFaceName,t.BentonSansMediumFontFaceName]},8396:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ConnectedServer=class{constructor(e,t,r,a){this._userId=e,this._siteId=t,this._siteNamespace=r,this._workbookId=a}get userId(){return this._userId}get siteId(){return this._siteId}get siteNamespace(){return this._siteNamespace}get workbookId(){return this._workbookId}}},5920:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(5136),i=r(3848);class n extends a.WorkbookImpl{getAllDataSourcesAsync(){return a.ApiServiceRegistry.get(i.ExtensionsRegistryId).getService("data-source-service").getAllDataSourcesAsync().then((e=>{const t=e,r=[];return Object.values(t.dataSources).forEach((e=>{r.push(this.createDataSourceFromInfo(e))})),r}))}createDataSourceFromInfo(e){const t=new a.DataSourceImpl(e,i.ExtensionsRegistryId),r=new a.DataSource(t);return t.initializeWithPublicInterfaces(r),r}}t.ExtensionWorkbookImpl=n},976:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(5136),s=r(4252),o=r(9224),l=r(5548),d=r(893),c=r(520),u=r(3032),h=r(1964),p=r(8012),m=r(7e3),g=r(6616),y=r(3848),I=r(92),v=r(5920),S=r(7269),T=r(5436),b=r(2200),f=r(1024);t.ExtensionsImpl=class{initializeAsync(e,t){return this._initializationPromise||(this._initializationPromise=new Promise(((r,a)=>{var s;const o={isAlpha:n.ApiVersion.Instance.isAlpha};if(S.LegacyInternalApiDispatcherHolder.hasDesktopApiDispatcherPromise(o))null===(s=S.LegacyInternalApiDispatcherHolder.getDesktopDispatcherPromise(o))||void 0===s||s.then((r=>this.onDispatcherReceived(r,e,t))).then((e=>{r(e)})).catch((e=>{a(e)}));else{const s=this.onDispatcherReceived.bind(this);n.doCrossFrameBootstrap(window,i.INTERNAL_CONTRACT_VERSION,o).then((r=>s(r,e,t))).then((e=>{r(e)})).catch((e=>{a(e)}))}}))),this._initializationPromise}createVizImageAsync(e){return n.ApiServiceRegistry.get(y.ExtensionsRegistryId).getService("viz-service").createVizImageAsync(e)}setClickThroughAsync(e){return n.ApiServiceRegistry.get(y.ExtensionsRegistryId).getService("UIService").setClickThroughAsync(e,this.extensionZoneId)}isDashboardExtensionLocator(e){if(!e.dashboardPath)throw new n.TableauError(a.ErrorCodes.InternalError,"Unexpected error during initialization.");return!0}onDispatcherReceived(e,t,r){let a=e(i.INTERNAL_CONTRACT_VERSION);g.registerInitializationExtensionsServices(a);const s=n.ApiServiceRegistry.get(y.ExtensionsRegistryId).getService("InitializationService"),l=r?Object.keys(r):[];return s.initializeDashboardExtensionsAsync(t,l).then((e=>{const t=e.extensionEnvironment.platformVersion?e.extensionEnvironment.platformVersion:{major:1,minor:9,fix:0};return n.VersionedExternalApiDispatcher.needsVersionConverter(t)&&(a=new n.VersionedExternalApiDispatcher(a,t)),n.registerAllSharedServices(a,y.ExtensionsRegistryId),g.registerAllExtensionsServices(a),e.extensionDashboardInfo&&this.isDashboardExtensionLocator(e.extensionInstance.locator)&&(this.dashboardContent=this.initializeDashboardContent(e.extensionDashboardInfo,e.extensionInstance.locator.dashboardPath),this.extensionZoneId=e.extensionDashboardInfo.extensionZoneId),e.extensionWorksheetInfo&&(this.worksheetContent=this.initializeWorksheetContent(e.extensionWorksheetInfo)),this.environment=new c.Environment(e.extensionEnvironment),this.settings=this.initializeSettings(e.extensionSettingsInfo),this.ui=new h.UI(new f.UIImpl),this.workbook=new o.Workbook(new v.ExtensionWorkbookImpl),e.extensionEnvironment.workbookFormatting&&(this.initializeTableauFonts(a,e.extensionEnvironment.workbookFormatting),this.applyAllFormatting(e.extensionEnvironment.workbookFormatting)),this.initializeContextMenuCallbacks(r),this.initializeWorkbookFormattingChangedEventCallback(a),e.extensionDialogPayload}))}applyAllFormatting(e){if(this._styleElement||(this._styleElement=document.createElement("style"),this._styleElement.id="Tableau-Extension-Formatting",document.head.appendChild(this._styleElement)),!this._styleElement.sheet||!e)return;const t=this._styleElement.sheet;for(;t.cssRules.length>0;)t.deleteRule(t.cssRules.length-1);e.formattingSheets.map((e=>{this.applyFormattingSheetToStyleSheet(e,t)}))}applyFormattingSheetToStyleSheet(e,t){let r="";const a=e.cssProperties;a.fontFamily&&(r+="font-family: "+a.fontFamily.toString()+"; "),a.fontSize&&(r+="font-size: "+a.fontSize.toString()+"; "),a.fontWeight&&(r+="font-weight: "+a.fontWeight.toString()+"; "),a.fontStyle&&(r+="font-style: "+a.fontStyle.toString()+"; "),a.textDecoration&&(r+="text-decoration: "+a.textDecoration.toString()+"; "),a.color&&(r+="color: "+a.color+"; ");const i="."+e.classNameKey+" { "+r+" }";t.insertRule(i,t.cssRules.length)}initializeWorkbookFormattingChangedEventCallback(e){n.ApiServiceRegistry.get(y.ExtensionsRegistryId).getService("notification-service").registerHandler(i.NotificationId.WorkbookFormattingChanged,(()=>!0),(t=>{t&&(this.initializeTableauFonts(e,t),this.applyAllFormatting(t))}))}initializeTableauFonts(e,t){const r=[...I.SupportedBentonSansFontFaces,...b.SupportedTableauFontFaces];if(t.formattingSheets.forEach((e=>{e.cssProperties.fontFamily&&r.push(e.cssProperties.fontFamily)})),r.length>0){const t={[i.ParameterId.FontNameListItems]:r};e.execute(i.VerbId.GetFonts,t).then((e=>{this.loadFonts(e.result)})).catch()}}loadFonts(e){e.forEach((e=>{b.SupportedTableauFontFaces.includes(e.fontName)?this.loadTableauFonts(e):I.SupportedBentonSansFontFaces.includes(e.fontName)?this.loadBentonSansFonts(e):document.fonts.add(new FontFace(e.fontName,e.fontBinaryInfo))}))}initializeDashboardContent(e,t){const r=new n.SheetInfoImpl(e.name,a.SheetType.Dashboard,{width:e.size.w,height:e.size.h},void 0,!0),i=new n.DashboardImpl(r,e.zones,t,y.ExtensionsRegistryId,null,e.activeDashboardObjectId),o=new s.Dashboard(i);return new d.DashboardContent(o)}initializeWorksheetContent(e){const t=new n.SheetInfoImpl(e.visualId.worksheet,a.SheetType.Worksheet,{width:e.size.w,height:e.size.h},void 0,!0),r=new n.WorksheetImpl(t,y.ExtensionsRegistryId,e.visualId,null,null,e.backgroundColor,p.WorkbookFormattingEnvUtil.convertToWorkbookFormatting(e.formatting)),i=new l.Worksheet(r);return new m.WorksheetContent(i)}initializeSettings(e){const t=new T.SettingsImpl(e);return new u.Settings(t)}initializeContextMenuCallbacks(e){n.ApiServiceRegistry.get(y.ExtensionsRegistryId).getService("notification-service").registerHandler(i.NotificationId.ContextMenuClick,(()=>!0),(t=>{if(e){if(!e[t.id])throw new n.TableauError(a.ErrorCodes.InternalError,`Received unexpected context menu Id from event: ${t.id}`);e[t.id]()}}))}loadTableauFonts(e){switch(e.fontName){case b.TableauBookFontFaceName:document.fonts.add(new FontFace(b.TableauBookFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"}));break;case b.TableauLightFontFaceName:document.fonts.add(new FontFace(b.TableauLightFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"}));break;case b.TableauRegularFontFaceName:document.fonts.add(new FontFace(b.TableauRegularFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"}));break;case b.TableauSemiBoldFontFaceName:document.fonts.add(new FontFace(b.TableauSemiboldFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"})),document.fonts.add(new FontFace(b.TableauRegularFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"}));break;case b.TableauBoldFontFaceName:document.fonts.add(new FontFace(b.TableauBoldFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"})),document.fonts.add(new FontFace(b.TableauBoldFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"})),document.fonts.add(new FontFace(b.TableauMediumFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"})),document.fonts.add(new FontFace(b.TableauSemiboldFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"}));break;case b.TableauMediumFontFaceName:document.fonts.add(new FontFace(b.TableauMediumFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"})),document.fonts.add(new FontFace(b.TableauLightFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"})),document.fonts.add(new FontFace(b.TableauBookFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"}));break;default:throw new n.TableauError(a.ErrorCodes.InternalError,`'attempted to load unsupported font: ${e.fontName}.'`)}}loadBentonSansFonts(e){switch(e.fontName){case I.BentonSansBookFontFaceName:document.fonts.add(new FontFace(I.BentonSansFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"})),document.fonts.add(new FontFace(I.BentonSansLowDPIFontFamilyName,e.fontBinaryInfo,{weight:"100",style:"normal"}));break;case I.BentonSansLightFontFaceName:document.fonts.add(new FontFace(I.BentonSansFontFamilyName,e.fontBinaryInfo,{weight:"100",style:"normal"}));break;case I.BentonSansMediumFontFaceName:document.fonts.add(new FontFace(I.BentonSansFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"})),document.fonts.add(new FontFace(I.BentonSansLowDPIFontFamilyName,e.fontBinaryInfo,{weight:"bold",style:"normal"}));break;case I.BentonSansSemiDemiFontFaceName:document.fonts.add(new FontFace(I.BentonSansLowDPIFontFamilyName,e.fontBinaryInfo,{weight:"normal",style:"normal"}));break;case I.BentonSansBookItalicFontFaceName:document.fonts.add(new FontFace(I.BentonSansFontFamilyName,e.fontBinaryInfo,{style:"italic"}));break;case I.BentonSansSemiDemiItalicFontFaceName:document.fonts.add(new FontFace(I.BentonSansLowDPIFontFamilyName,e.fontBinaryInfo,{style:"italic"}));break;default:throw new n.TableauError(a.ErrorCodes.InternalError,`'attempted to load unsupported font: ${e.fontName}.'`)}}}},7269:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3448);!function(e){function t(e){var t;return e&&void 0!==e.isAlpha||window.__warningIssued?(null===(t=e)||void 0===t?void 0:t.isAlpha)&&window.__platformIsOfficialRelease&&window.__tableauDesktopDispatcher.then((e=>{e(a.INTERNAL_CONTRACT_VERSION).execute(a.VerbId.BlockExtension,{}).catch()})).catch():(console.warn("This is a beta version of the Extensions API. Please upgrade to an official release."),window.__warningIssued=!0),window.__tableauDesktopDispatcher}e.getDesktopDispatcherPromise=t,e.hasDesktopApiDispatcherPromise=function(e){return!!t(e)}}(t.LegacyInternalApiDispatcherHolder||(t.LegacyInternalApiDispatcherHolder={}))},5436:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(5136),s=r(7112),o=r(3848);class l extends s.TableauEvent{constructor(e){super(a.TableauEventType.SettingsChanged),this._newSettings=e}get newSettings(){return this._newSettings}}class d{constructor(e){this._saveInProgress=!1,this.initializeSettings(e)}erase(e){n.ErrorHelpers.verifyParameter(e,"key"),this._currentSettings[e]&&(this.verifySettingsAreUnlocked(),delete this._currentSettings[e],this._isModified=!0)}get(e){return n.ErrorHelpers.verifyParameter(e,"key"),this._currentSettings[e]}getAll(){return Object.assign({},this._currentSettings)}get isModified(){return this._isModified}saveAsync(){return this.verifySettingsAreUnlocked(),this._isModified?(this._saveInProgress=!0,n.ApiServiceRegistry.get(o.ExtensionsRegistryId).getService("SettingsService").saveSettingsAsync(this._currentSettings).then((e=>(this._saveInProgress=!1,this._isModified=!1,void 0===this._currentSettings?this._currentSettings=e:Object.assign(this._currentSettings,e),e)),(e=>(this._saveInProgress=!1,Promise.reject(e))))):Promise.resolve(this._currentSettings)}set(e,t){n.ErrorHelpers.verifyStringParameter(e,"key"),n.ErrorHelpers.verifyParameter(t,"value"),this.verifySettingsAreUnlocked(),this._currentSettings[e]=t,this._isModified=!0}initializeEvents(){const e=new Array;let t;try{t=n.ApiServiceRegistry.get(o.ExtensionsRegistryId).getService("notification-service")}catch(t){return e}const r=new n.SingleEventManagerImpl(a.TableauEventType.SettingsChanged);return t.registerHandler(i.NotificationId.SettingsChanged,(()=>!0),(e=>{this._currentSettings=e.newSettings,r.triggerEvent((()=>new l(e.newSettings)))})),e.push(r),e}initializeSettings(e){n.ErrorHelpers.verifyParameter(e,"settingsInfo"),n.ErrorHelpers.verifyParameter(e.settingsValues,"settingsInfo.SettingsValues"),this._currentSettings=e.settingsValues,this._isModified=!1}verifySettingsAreUnlocked(){if(this._saveInProgress)throw new n.TableauError(a.ErrorCodes.SettingSaveInProgress,d.ASYNC_SAVE_IN_PROGRESS)}}t.SettingsImpl=d,d.ASYNC_SAVE_IN_PROGRESS="Async Save is in progress, updating settings is not allowed."},2200:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.TableauBookFontFamilyName="Tableau Book",t.TableauLightFontFamilyName="Tableau Light",t.TableauRegularFontFamilyName="Tableau Regular",t.TableauMediumFontFamilyName="Tableau Medium",t.TableauSemiboldFontFamilyName="Tableau Semibold",t.TableauBoldFontFamilyName="Tableau Bold",t.TableauBookFontFaceName="Tableau Book",t.TableauBoldFontFaceName="Tableau Bold",t.TableauLightFontFaceName="Tableau Light",t.TableauMediumFontFaceName="Tableau Medium",t.TableauRegularFontFaceName="Tableau Regular",t.TableauSemiBoldFontFaceName="Tableau Semi Bold",t.SupportedTableauFontFaces=[t.TableauBookFontFaceName,t.TableauBoldFontFaceName,t.TableauLightFontFaceName,t.TableauMediumFontFaceName,t.TableauRegularFontFaceName,t.TableauSemiBoldFontFaceName]},1024:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(7419),n=r(3448),s=r(5136),o=r(7112),l=r(3848);class d extends o.TableauEvent{constructor(e){super(a.TableauEventType.DialogMessageReceived),this.message=e}}t.DialogMessageEvent=d,t.UIImpl=class{constructor(){}displayDialogAsync(e,t,r){const o=s.ApiServiceRegistry.get(l.ExtensionsRegistryId).getService("UIService"),d=s.ApiServiceRegistry.get(l.ExtensionsRegistryId).getService("notification-service");return new Promise(((l,c)=>{o.displayDialogAsync(e,t||"",r).then((()=>{const e=d.registerHandler(n.NotificationId.ExtensionDialogUpdate,(()=>!0),(t=>{if(t.isCloseEvent){if(void 0===t.closePayload)throw new s.TableauError(a.ErrorCodes.InternalError,"closePayload is undefined");l(t.closePayload)}else c(new s.TableauError(i.ErrorCodes.DialogClosedByUser,"Extension dialog closed by user."));e()}))})).catch((e=>{c(e)}))}))}sendDialogMessageAsync(e,t){s.ApiServiceRegistry.get(l.ExtensionsRegistryId).getService("UIService").sendDialogMessageAsync(e,t)}closeDialog(e){s.ApiServiceRegistry.get(l.ExtensionsRegistryId).getService("UIService").closeDialog(e)}initializeEvents(){const e=new Array;let t;try{t=s.ApiServiceRegistry.get(l.ExtensionsRegistryId).getService("notification-service")}catch(t){return e}const r=new s.SingleEventManagerImpl(a.TableauEventType.DialogMessageReceived);return t.registerHandler(n.NotificationId.ExtensionDialogMessage,(()=>!0),(e=>{r.triggerEvent((()=>new d(e.message)))})),e.push(r),e}}},4252:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(5136),s=r(6416),o=r(4164),l=r(3848),d=r(3192),c=r(8512),u=r(5548);class h extends c.Sheet{constructor(e){super(e),this._dashboardImpl=e,e.initializeWithPublicInterfaces(),this.initializeEvents().forEach((e=>this.addNewEventType(e)))}get worksheets(){return this._dashboardImpl.worksheetsImpl.map((e=>new u.Worksheet(e)))}get objects(){return this._dashboardImpl.objects.map((e=>new d.DashboardObject(e)))}get activeDashboardObjectId(){return this._dashboardImpl.activeDashboardObjectId}get activeDashboardName(){return this._dashboardImpl.activeDashboardName}setZoneVisibilityAsync(e){return this._dashboardImpl.setDashboardObjectVisibilityAsync(e)}setDashboardObjectVisibilityAsync(e){return this._dashboardImpl.setDashboardObjectVisibilityAsync(e)}getDashboardObjectById(e){const t=this._dashboardImpl.getDashboardObjectById(e);return t&&new d.DashboardObject(t)}initializeEvents(){const e=new Array;let t;try{t=n.ApiServiceRegistry.get(l.ExtensionsRegistryId).getService("notification-service")}catch(t){return e}const r=new n.SingleEventManagerImpl(a.TableauEventType.DashboardLayoutChanged);t.registerHandler(i.NotificationId.DashboardLayoutChanged,(()=>!0),(e=>{const t=this._dashboardImpl.updateZones(e.zones,e.activeZoneId,e.activeDashboardName);r.triggerEvent((()=>new s.DashboardLayoutChangedEvent(t)))})),e.push(r);const d=new n.SingleEventManagerImpl(a.TableauEventType.WorkbookFormattingChanged);return t.registerHandler(i.NotificationId.WorkbookFormattingChanged,(()=>!0),(e=>{d.triggerEvent((()=>new o.WorkbookFormattingChangedEvent(e)))})),e.push(d),e}moveAndResizeDashboardObjectsAsync(e){return this._dashboardImpl.moveAndResizeDashboardObjectsAsync(e)}replayAnimationAsync(e){return this._dashboardImpl.replayAnimationAsync(e)}getFiltersAsync(){return this._dashboardImpl.getFiltersAsync()}applyFilterAsync(e,t,r,a){return this._dashboardImpl.applyFilterAsync(e,t,r,a)}}t.Dashboard=h},3192:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(4252),i=r(5548);t.DashboardObject=class{constructor(e){this._dashboardObjectImpl=e}get dashboard(){return new a.Dashboard(this._dashboardObjectImpl.dashboardImpl)}get type(){return this._dashboardObjectImpl.type}get position(){return this._dashboardObjectImpl.position}get size(){return this._dashboardObjectImpl.size}get worksheet(){if(this._dashboardObjectImpl.worksheetImpl)return new i.Worksheet(this._dashboardObjectImpl.worksheetImpl)}get name(){return this._dashboardObjectImpl.name}get isFloating(){return this._dashboardObjectImpl.isFloating}get isVisible(){return this._dashboardObjectImpl.isVisible}get id(){return this._dashboardObjectImpl.id}get fieldId(){return this._dashboardObjectImpl.fieldId}}},4592:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(5136),s=r(864),o=r(3848);class l extends n.EventListenerManager{constructor(e,t){super(),this.parameterImpl=e,this.initializeEvents(t).forEach((e=>this.addNewEventType(e)))}get name(){return this.parameterImpl.name}get currentValue(){return this.parameterImpl.currentValue}get dataType(){return this.parameterImpl.dataType}get allowableValues(){return this.parameterImpl.allowableValues}get id(){return this.parameterImpl.id}changeValueAsync(e){return this.parameterImpl.changeValueAsync(e)}initializeEvents(e){n.ErrorHelpers.verifyInternalValue(e,"sheet");const t=new Array;let r;try{r=n.ApiServiceRegistry.get(o.ExtensionsRegistryId).getService("notification-service")}catch(e){return t}const l=new n.SingleEventManagerImpl(a.TableauEventType.ParameterChanged);return r.registerHandler(i.NotificationId.ParameterChanged,(e=>e===this.parameterImpl.id),(t=>{l.triggerEvent((()=>new s.ParameterChangedEvent(t,e)))})),t.push(l),t}}t.Parameter=l},8512:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(5136),n=r(4592);class s extends i.EventListenerManager{constructor(e){super(),this._sheetImpl=e}get name(){return this._sheetImpl.name}get sheetType(){return this._sheetImpl.sheetType}get size(){if(this.isValidSize(this._sheetImpl.size))return this._sheetImpl.size;throw new i.TableauError(a.EmbeddingErrorCodes.ImplementationError,"Size not implemented")}isValidSize(e){const t=e;return void 0!==t.width&&void 0!==t.height}findParameterAsync(e){return this._sheetImpl.findParameterAsync(e).then((e=>new Promise(e?t=>t(new n.Parameter(e,this)):e=>e(void 0))))}getParametersAsync(){return this._sheetImpl.getParametersAsync().then((e=>e.map((e=>new n.Parameter(e,this)))))}}t.Sheet=s},9224:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Workbook=class{constructor(e){this._workbookImpl=e}getAllDataSourcesAsync(){return this._workbookImpl.getAllDataSourcesAsync()}}},5548:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(7419),n=r(3448),s=r(5136),o=r(1672),l=r(5572),d=r(3464),c=r(4712),u=r(3848),h=r(4252),p=r(8512);class m extends p.Sheet{constructor(e){super(e),this._worksheetImpl=e,this.initializeEvents().forEach((e=>this.addNewEventType(e)))}get parentDashboard(){if(null==this._worksheetImpl.parentDashboard)throw new s.TableauError(a.SharedErrorCodes.ImplementationError,"Parent dashboard not implemented");return new h.Dashboard(this._worksheetImpl.parentDashboard)}get backgroundColor(){if(null==this._worksheetImpl.backgroundColor)throw new s.TableauError(a.SharedErrorCodes.ImplementationError,"Worksheet background color is not available");return this._worksheetImpl.backgroundColor}get formatting(){if(null==this._worksheetImpl.formatting)throw new s.TableauError(a.SharedErrorCodes.ImplementationError,"Worksheet formatting information is not available");return this._worksheetImpl.formatting}initializeEvents(){const e=new Array;let t;try{t=s.ApiServiceRegistry.get(u.ExtensionsRegistryId).getService("notification-service")}catch(t){return e}const r=new s.SingleEventManagerImpl(i.TableauEventType.MarkSelectionChanged);t.registerHandler(n.NotificationId.SelectedMarksChanged,(e=>{const t=e;return this.visualIdsAreEqual(t,this._worksheetImpl.visualId)}),(()=>r.triggerEvent((()=>new l.MarksSelectedEvent(this)))));const a=new s.SingleEventManagerImpl(i.TableauEventType.FilterChanged);t.registerHandler(n.NotificationId.FilterChanged,(e=>{const t=e;return this._worksheetImpl.visualId.worksheet===t.visualId.worksheet}),(e=>{a.triggerEvent((()=>new o.FilterChangedEvent(this,e.fieldName,e.fieldId)))}));const h=new s.SingleEventManagerImpl(i.TableauEventType.SummaryDataChanged);t.registerHandler(n.NotificationId.SummaryDataChanged,(e=>{const t=e;return this._worksheetImpl.visualId.worksheet===t.visualId.worksheet}),(e=>{h.triggerEvent((()=>new d.SummaryDataChangedEvent(this)))}));const p=new s.SingleEventManagerImpl(i.TableauEventType.WorksheetFormattingChanged);return t.registerHandler(n.NotificationId.WorksheetFormattingChanged,(e=>{const t=e;return this._worksheetImpl.visualId.worksheet===t.visualId.worksheet}),(e=>{p.triggerEvent((()=>new c.WorksheetFormattingChangedEvent(this,e)))})),e.push(r),e.push(a),e.push(h),e.push(p),e}applyFilterAsync(e,t,r,a){return this._worksheetImpl.applyFilterAsync(e,t,r,a)}applyRangeFilterAsync(e,t){return this._worksheetImpl.applyRangeFilterAsync(e,t)}applyHierarchicalFilterAsync(e,t,r,a){return this._worksheetImpl.applyHierarchicalFilterAsync(e,t,r,a)}applyRelativeDateFilterAsync(e,t){return this._worksheetImpl.applyRelativeDateFilterAsync(e,t)}clearFilterAsync(e){return this._worksheetImpl.clearFilterAsync(e)}getDataSourcesAsync(){return this._worksheetImpl.getDataSourcesAsync()}getFiltersAsync(){return this._worksheetImpl.getFiltersAsync()}getSelectedMarksAsync(){return this._worksheetImpl.getSelectedMarksAsync()}getHighlightedMarksAsync(){return this._worksheetImpl.getHighlightedMarksAsync()}getSummaryDataAsync(e){return this._worksheetImpl.getSummaryDataAsync(e)}getSummaryDataReaderAsync(e,t){return this._worksheetImpl.getSummaryDataReaderAsync(e,t)}getSummaryColumnsInfoAsync(){return this._worksheetImpl.getSummaryColumnsInfoAsync()}getUnderlyingDataAsync(e){return console.warn("Worksheet.getUnderlyingDataAsync is deprecated. Please use Worksheet.getUnderlyingTablesAsync and Worksheet.getUnderlyingTableDataAsync"),this._worksheetImpl.getUnderlyingDataAsync(e)}getUnderlyingTablesAsync(){return this._worksheetImpl.getUnderlyingTablesAsync()}getUnderlyingTableDataAsync(e,t){return this._worksheetImpl.getUnderlyingTableDataAsync(e,t)}getUnderlyingTableDataReaderAsync(e,t,r){return this._worksheetImpl.getUnderlyingTableDataReaderAsync(e,t,r)}getVisualSpecificationAsync(){return this._worksheetImpl.getVisualSpecificationAsync()}addMarksCardFieldsAsync(e,t,r,a){return this._worksheetImpl.addMarksCardFieldsAsync(e,t,r,a)}moveMarksCardFieldAsync(e,t,r,a=1){return this._worksheetImpl.moveMarksCardFieldAsync(e,t,r,a)}spliceMarksCardFieldsAsync(e,t,r,a,i){return this._worksheetImpl.spliceMarksCardFieldsAsync(e,t,r,a,i)}clearSelectedMarksAsync(){return this._worksheetImpl.clearSelectedMarksAsync()}selectMarksByIDAsync(e,t){return this._worksheetImpl.selectMarksByIdAsync(e,t)}selectMarksByValueAsync(e,t){return this._worksheetImpl.selectMarksByValueAsync(e,t)}selectMarksByIdAsync(e,t){return this._worksheetImpl.selectMarksByIdAsync(e,t)}annotateMarkAsync(e,t){return this._worksheetImpl.annotateMarkAsync(e,t)}getAnnotationsAsync(){return this._worksheetImpl.getAnnotationsAsync()}removeAnnotationAsync(e){return this._worksheetImpl.removeAnnotationAsync(e)}hoverTupleAsync(e,t,r=!0){return this._worksheetImpl.hoverTupleAsync(e,t,r)}selectTuplesAsync(e,t,r){return this._worksheetImpl.selectTuplesAsync(e,t,r)}getTooltipTextAsync(e){return this._worksheetImpl.getTooltipTextAsync(e)}leaveMarkNavigationAsync(){return this._worksheetImpl.leaveMarkNavigationAsync()}editAliasesDialogAsync(e){return this._worksheetImpl.editAliasesDialogAsync(e)}visualIdsAreEqual(e,t){return e&&t&&e.worksheet===t.worksheet&&e.dashboard===t.dashboard&&e.storyboard===t.storyboard&&e.storyPointID===t.storyPointID}}t.Worksheet=m},893:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DashboardContent=class{constructor(e){this._dashboard=e}get dashboard(){return this._dashboard}}},520:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(5136),i=r(8396),n=r(8012);t.Environment=class{constructor(e){this._apiVersion=a.ApiVersion.Instance&&a.ApiVersion.Instance.formattedValue,this._context=a.InternalToExternalEnumMappings.extensionContext.convert(e.extensionContext),this._formatting=n.WorkbookFormattingEnvUtil.convertToWorkbookFormatting(e.workbookFormatting),this._language=e.extensionLanguage,this._country=e.extensionCountry,this._locale=e.extensionLocale,this._mode=a.InternalToExternalEnumMappings.extensionMode.convert(e.extensionMode),this._operatingSystem=e.operatingSystem,this._tableauVersion=e.tableauVersion,this._uniqueUserId=e.uniqueUserId,e.userId&&(this.connectedServer=new i.ConnectedServer(e.userId,e.siteId,e.siteNamespace,e.workbookId),this.featureFlags=e.featureFlags)}get apiVersion(){return this._apiVersion}get context(){return this._context}get workbookFormatting(){return this._formatting}get language(){return this._language}get country(){return this._country}get locale(){return this._locale}get mode(){return this._mode}get operatingSystem(){return this._operatingSystem}get tableauVersion(){return this._tableauVersion}get uniqueUserId(){return this._uniqueUserId}}},5408:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Extensions=class{constructor(e){this.extensionImpl=e,this.extensionImpl=e}get dashboardContent(){return this.extensionImpl.dashboardContent}get worksheetContent(){return this.extensionImpl.worksheetContent}get environment(){return this.extensionImpl.environment}get settings(){return this.extensionImpl.settings}get ui(){return this.extensionImpl.ui}get workbook(){return this.extensionImpl.workbook}get dashboardObjectId(){return this.extensionImpl.extensionZoneId}initializeAsync(e){return this.extensionImpl.initializeAsync(!1,e).then()}initializeDialogAsync(){return this.extensionImpl.initializeAsync(!0)}createVizImageAsync(e){return this.extensionImpl.createVizImageAsync(e)}setClickThroughAsync(e){return this.extensionImpl.setClickThroughAsync(e)}}},3032:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(5136);class i extends a.EventListenerManager{constructor(e){super(),this._settingsImpl=e,this._settingsImpl.initializeEvents().forEach((e=>this.addNewEventType(e)))}erase(e){this._settingsImpl.erase(e)}get(e){return this._settingsImpl.get(e)}getAll(){return this._settingsImpl.getAll()}get isModified(){return this._settingsImpl.isModified}saveAsync(){return this._settingsImpl.saveAsync()}set(e,t){this._settingsImpl.set(e,t)}}t.Settings=i},1964:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(5136);class i extends a.EventListenerManager{constructor(e){super(),this._impl=e,this._impl.initializeEvents().forEach((e=>this.addNewEventType(e)))}displayDialogAsync(e,t,r){return this._impl.displayDialogAsync(e,t,r)}sendDialogMessageAsync(e,t){return this._impl.sendDialogMessageAsync(e,t)}closeDialog(e){this._impl.closeDialog(e)}}t.UI=i},8012:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(5136);t.WorkbookFormattingEnvUtil=class{static convertToWorkbookFormatting(e){if(e)return{formattingSheets:e.formattingSheets.map((e=>{return{classNameKey:a.InternalToExternalEnumMappings.classNameKey.convert(e.classNameKey),cssProperties:(t=e.classNameKey,r=e.cssProperties,"tableau-row-dividers"===t||"tableau-column-dividers"===t?{borderColor:r.borderColor,borderStyle:r.borderStyle,borderWidth:r.borderWidth}:{fontFamily:r.fontFamily,fontSize:r.fontSize,fontWeight:r.fontWeight,fontStyle:r.fontStyle,textDecoration:r.textDecoration,color:r.color})};var t,r}))}}}},7e3:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.WorksheetContent=class{constructor(e){this._worksheet=e}get worksheet(){return this._worksheet}}},6336:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3448),i=r(5136);class n extends i.ServiceImplBase{get serviceName(){return"InitializationService"}initializeDashboardExtensionsAsync(e,t){const r={[a.ParameterId.FunctionName]:"initializeDashboardExtensionsAsync",[a.ParameterId.ExtensionContextMenuIds]:t,[a.ParameterId.IsExtensionDialog]:e};return this.execute(a.VerbId.InitializeExtension,r).then((e=>e.result))}}t.InitializationServiceImpl=n},5432:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(5136);class s extends n.ServiceImplBase{get serviceName(){return"SettingsService"}saveSettingsAsync(e){const t={[i.ParameterId.FunctionName]:"saveSettingsAsync",[i.ParameterId.SettingsValues]:e};return this.execute(i.VerbId.SaveExtensionSettings,t).then((e=>{const t=e.result;if(!t||!t.settingsValues)throw new n.TableauError(a.ErrorCodes.InternalError,"Unexpected error savings settings.");return t.settingsValues}))}}t.SettingsServiceImpl=s},752:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(5136),s=a.DialogStyle.Window;class o extends n.ServiceImplBase{get serviceName(){return"UIService"}displayDialogAsync(e,t,r){const o={[i.ParameterId.FunctionName]:"displayDialogAsync",[i.ParameterId.ExtensionDialogUrl]:e,[i.ParameterId.ExtensionDialogPayload]:t},l=r&&r.height?r.height:400,d=r&&r.width?r.width:600,c=r&&r.dialogStyle?r.dialogStyle:s;if(l<=0||d<=0)throw new n.TableauError(a.ErrorCodes.InvalidParameter,"Size parameters for displayDialogAsync must be positive");return o[i.ParameterId.ExtensionDialogH]=l,o[i.ParameterId.ExtensionDialogW]=d,n.ErrorHelpers.verifyEnumValue(c,a.DialogStyle,"DialogStyle"),o[i.ParameterId.ExtensionDialogStyle]=n.ExternalToInternalEnumMappings.dialogStyles.convert(c),this.execute(i.VerbId.DisplayDialog,o).then((e=>{switch(e.result){case i.ExtensionDialogResult.DialogAlreadyOpen:throw new n.TableauError(a.ErrorCodes.DialogAlreadyOpen,"There already exists an open dialog for this extension.");case i.ExtensionDialogResult.InvalidDomain:throw new n.TableauError(a.ErrorCodes.InvalidDomainDialog,"The url of an extension dialog must match the domain of the parent extension.");default:return}}))}closeDialog(e){const t={[i.ParameterId.FunctionName]:"closeDialog"};return e&&(t[i.ParameterId.ExtensionDialogPayload]=e),this.execute(i.VerbId.CloseDialog,t).then((()=>{}))}sendDialogMessageAsync(e,t){const r={[i.ParameterId.FunctionName]:"sendDialogMessage",[i.ParameterId.ExtensionDialogMessage]:e};return t&&(r[i.ParameterId.ExtensionDialogUrl]=t),this.execute(i.VerbId.SendDialogMessage,r).then((()=>{}))}setClickThroughAsync(e,t){if(n.ErrorHelpers.verifyParameterType(e,"boolean","clickThroughEnabled"),void 0===t||t<=0)throw new n.TableauError(a.ErrorCodes.InternalError,"Extension Id is invalid.");const r={[i.ParameterId.ExtensionZoneId]:t,[i.ParameterId.ClickThroughEnabled]:e};return this.execute(i.VerbId.SetClickThrough,r).then((()=>{}))}}t.UIServiceImpl=o},6616:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(5136),i=r(6336),n=r(5432),s=r(752),o=r(3848);t.registerAllExtensionsServices=function(e){a.ApiServiceRegistry.get(o.ExtensionsRegistryId).registerService(new n.SettingsServiceImpl(e,o.ExtensionsRegistryId)),a.ApiServiceRegistry.get(o.ExtensionsRegistryId).registerService(new s.UIServiceImpl(e,o.ExtensionsRegistryId))},t.registerInitializationExtensionsServices=function(e){a.ApiServiceRegistry.get(o.ExtensionsRegistryId).registerService(new i.InitializationServiceImpl(e,o.ExtensionsRegistryId))}},3848:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ExtensionsRegistryId=0},268:(e,t,r)=>{"use strict";function a(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}Object.defineProperty(t,"__esModule",{value:!0}),a(r(4171));var i=r(3536);t.ApiMenuType=i.ApiMenuType,t.CrosstabFileFormat=i.CrosstabFileFormat,t.DeviceType=i.DeviceType,t.EmbeddingErrorCodes=i.EmbeddingErrorCodes,t.EmbeddingTableauEventType=i.TableauEventType,t.FileFormats=i.FileFormats,t.PrintOrientation=i.PrintOrientation,t.PrintPageSize=i.PrintPageSize,t.PrintScaling=i.PrintScaling,t.PulseErrorMessageVisibility=i.PulseErrorMessageVisibility,t.PulseLayout=i.PulseLayout,t.PulseTimeDimension=i.PulseTimeDimension,t.SheetSizeBehavior=i.SheetSizeBehavior,t.TableauDialogType=i.TableauDialogType,t.Toolbar=i.Toolbar,a(r(828)),a(r(3432)),a(r(1480)),a(r(5488))},5840:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var a=r(4744);t.ErrorCodes=a.ErrorCodes,t.ExtensionContext=a.ExtensionContext,t.ExtensionMode=a.ExtensionMode,t.TableauEventType=a.TableauEventType,t.VizImageEncodingType=a.VizImageEncodingType,t.VizImagePaletteType=a.VizImagePaletteType,t.VizImageSizeSettingAlignmentType=a.VizImageSizeSettingAlignmentType,t.VizImageSizeSettingType=a.VizImageSizeSettingType,t.VizImageSortDirectionType=a.VizImageSortDirectionType,function(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}(r(5488))},7419:(e,t,r)=>{"use strict";function a(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}Object.defineProperty(t,"__esModule",{value:!0}),a(r(268)),a(r(5840))},4171:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.AskDataAttributes||(t.AskDataAttributes={})).Origin="origin",r.ShowEmbed="show-embed",r.ShowPin="show-pin",r.ShowSave="show-save",r.ShowShare="show-share"},3536:(e,t)=>{"use strict";var r,a,i,n,s,o,l,d,c,u,h,p,m,g,y,I;Object.defineProperty(t,"__esModule",{value:!0}),(I=t.CrosstabFileFormat||(t.CrosstabFileFormat={})).CSV="csv",I.Excel="xlsx",(y=t.DeviceType||(t.DeviceType={})).Default="default",y.Desktop="desktop",y.Tablet="tablet",y.Phone="phone",(g=t.EmbeddingErrorCodes||(t.EmbeddingErrorCodes={})).AuthFailed="auth-failed",g.BrowserNotCapable="browser-not-capable",g.DownloadWorkbookNotAllowed="download-workbook-not-allowed",g.FilterCannotBePerformed="filter-cannot-be-performed",g.IndexOutOfRange="index-out-of-range",g.InternalError="internal-error",g.InvalidCustomViewName="invalid-custom-view-name",g.InvalidDateParameter="invalid-date-parameter",g.invalidFilterFieldNameOrValue="invalid-filter-field-name",g.InvalidParameter="invalid-parameter",g.InvalidTimeDimension="invalid-time-dimension",g.InvalidSize="invalid-size",g.InvalidSheetType="invalid-sheet-type",g.InvalidSizeBehavior="invalid-size-behavior",g.InvalidSizeBehaviorOnWorksheet="invalid-size-behavior-on-worksheet",g.InvalidUrl="invalid-url",g.MissingMaxSize="missing-max-size",g.MissingMinSize="missing-min-size",g.MissingMinMaxSize="missing-min-max-size",g.MissingParameter="missing-parameter",g.MissingRangeNForRelativeDateFilters="missing-range-n-for-relative-date-filters",g.NoUrlForHiddenWorksheet="no-url-for-hidden-worksheet",g.NoUrlOrParentElementNotFound="no-url-or-parent-element-not-found",g.NotActiveSheet="not-active-sheet",g.NullOrEmptyParameter="null-or-empty-parameter",g.SheetNotInWorkbook="sheet-not-in-workbook",g.StaleDataReference="stale-data-reference",g.UnknownAuthError="unknown-auth-error",g.UnsupportedEventName="unsupported-event-name",g.VizAlreadyInManager="viz-already-in-manager",g.ImplementationError="wrong-implementation",g.NotImplemented="not-implemented",g.EventInitializationError="event-initialization-error",g.IncompatibleVersionError="incompatible-version-error",g.UnknownDialogType="unknown-dialog-type",g.FilterMissingOrNotImplemented="filter-missing-not-implemented",g.StoryPointIdMismatch="storypoint-id-mismatch",(m=t.FileFormats||(t.FileFormats={})).PDF="pdf",m.PNG="png",(p=t.PrintOrientation||(t.PrintOrientation={})).Portrait="portrait",p.Landscape="landscape",(h=t.PrintPageSize||(t.PrintPageSize={})).Letter="letter",h.Legal="legal",h.Note="note",h.Folio="folio",h.Tabloid="tabloid",h.Ledger="ledger",h.Statement="statement",h.Executive="executive",h.A3="A3",h.A4="A4",h.A5="A5",h.B4="B4",h.B5="B5",h.Quarto="quarto",h.Unspecified="unspecified",(u=t.PrintScaling||(t.PrintScaling={})).Automatic="automatic",u.Perc25="25%",u.Perc50="50%",u.Perc60="60%",u.Perc75="75%",u.Perc80="80%",u.Perc90="90%",u.Perc100="100%",u.Perc200="200%",u.Perc400="400%",u.AtMost1PageHigh="at-most-1-page-high",u.AtMost2PagesHigh="at-most-2-pages-high",u.AtMost1PageWide="at-most-1-page-wide",u.AtMost2PagesWide="at-most-2-pages-wide",(c=t.RevertVizSelection||(t.RevertVizSelection={})).All="all",c.Axes="axes",c.Filters="filters",c.Sorts="sorts",c.Shelves="shelves",(d=t.ToolbarButtons||(t.ToolbarButtons={})).Alerts="alerts",d.AskData="askData",d.CustomViews="customViews",d.DataDetails="dataDetails",d.Share="share",d.Subscribe="subscribe",(l=t.Toolbar||(t.Toolbar={})).Top="top",l.Bottom="bottom",l.Hidden="hidden",(o=t.SheetSizeBehavior||(t.SheetSizeBehavior={})).Automatic="automatic",o.Exactly="exactly",o.Range="range",o.AtLeast="atleast",o.AtMost="atmost",(s=t.PulseLayout||(t.PulseLayout={})).Default="default",s.Card="card",s.Ban="ban",(n=t.PulseTimeDimension||(t.PulseTimeDimension={})).Today="Today",n.Yesterday="Yesterday",n.WeekToDate="WeekToDate",n.LastWeek="LastWeek",n.MonthToDate="MonthToDate",n.LastMonth="LastMonth",n.QuarterToDate="QuarterToDate",n.LastQuarter="LastQuarter",n.YearToDate="YearToDate",n.LastYear="LastYear",(i=t.PulseErrorMessageVisibility||(t.PulseErrorMessageVisibility={})).Visible="visible",i.Hidden="hidden",i.Suppressed="suppressed",(a=t.TableauEventType||(t.TableauEventType={})).CustomViewLoaded="customviewloaded",a.CustomViewRemoved="customviewremoved",a.CustomViewSaved="customviewsaved",a.CustomViewSetDefault="customviewsetdefault",a.EditButtonClicked="editbuttonclicked",a.EditInDesktopButtonClicked="editindesktopbuttonclicked",a.FilterChanged="filterchanged",a.FirstVizSizeKnown="firstvizsizeknown",a.FirstInteractive="firstinteractive",a.CustomMarkContextMenuEvent="custommarkcontextmenu",a.MarkSelectionChanged="markselectionchanged",a.ParameterChanged="parameterchanged",a.ToolbarStateChanged="toolbarstatechanged",a.WorkbookReadyToClose="workbookreadytoclose",a.WorkbookPublished="workbookpublished",a.WorkbookPublishedAs="workbookpublishedas",a.UrlAction="urlaction",a.TabSwitched="tabswitched",a.StoryPointSwitched="storypointswitched",a.VizLoadError="vizloaderror",a.IframeSrcUpdated="iframesrcupdated",a.SummaryDataChanged="summarydatachanged",a.ReadyToReceiveAuthToken="readytoreceiveauthtoken",a.FirstPulseMetricSizeKnown="firstpulsemetricsizeknown",a.PulseError="pulseerror",a.PulseFiltersChanged="pulsefilterschanged",a.PulseInsightDiscovered="pulseinsightdiscovered",a.PulseMetricSizeChanged="pulsemetricsizechanged",a.PulseTimeDimensionChanged="pulsetimedimensionchanged",a.PulseUrlChanged="pulseurlchanged",(t.ApiMenuType||(t.ApiMenuType={})).Ubertip="ubertip",(r=t.TableauDialogType||(t.TableauDialogType={})).ExportPDF="export-pdf",r.ExportPowerPoint="export-powerpoint",r.ExportData="export-data",r.ExportCrossTab="export-cross-tab",r.ExportWorkbook="export-workbook",r.Share="share"},828:(e,t)=>{"use strict";var r,a,i;Object.defineProperty(t,"__esModule",{value:!0}),(i=t.PulseAttributes||(t.PulseAttributes={})).DisableExploreFilter="disable-explore-filter",i.Layout="layout",i.OnFirstInteractive="onFirstInteractive",i.OnFirstPulseMetricSizeKnown="onFirstPulseMetricSizeKnown",i.OnPulseUrlError="onPulseError",i.OnPulseFiltersChanged="onPulseFiltersChanged",i.OnPulseInsightDiscovered="onPulseInsightDiscovered",i.OnPulseMetricSizeChanged="onPulseMetricSizeChanged",i.OnPulseTimeDimensionChanged="onPulseTimeDimensionChanged",i.OnPulseUrlChanged="onPulseUrlChanged",i.TimeDimension="time-dimension",i.TokenOptional="token-optional",(a=t.PulseChildElements||(t.PulseChildElements={})).IframeStyle="iframe-style",a.ThemeParameter="theme-parameter",a.PulseFilter="pulse-filter",(r=t.PulseChildElementAttributes||(t.PulseChildElementAttributes={})).Name="name",r.Field="field",r.Value="value",r.Type="type"},3432:(e,t)=>{"use strict";var r,a,i,n,s;Object.defineProperty(t,"__esModule",{value:!0}),(s=t.VizSharedAttributes||(t.VizSharedAttributes={})).TouchOptimize="touch-optimize",s.HideEditInDesktopButton="hide-edit-in-desktop-button",s.SuppressDefaultEditBehavior="suppress-default-edit-behavior",s.DisableVersionCheck="disable-version-check",s.OnEditInDesktopButtonClicked="onEditInDesktopButtonClicked",s.OnFirstVizSizeKnown="onFirstVizSizeKnown",s.OnFirstInteractive="onFirstInteractive",(n=t.VizAttributes||(t.VizAttributes={})).DisableUrlActionsPopups="disable-url-actions",n.HideTabs="hide-tabs",n.Toolbar="toolbar",n.InstanceIdToClone="instance-id-to-clone",n.Device="device",n.HideEditButton="hide-edit-button",n.OnEditButtonClicked="onEditButtonClicked",n.OnFilterChanged="onFilterChanged",n.OnCustomMarkContextMenuEvent="onCustomMarkContextMenuEvent",n.OnMarkSelectionChanged="onMarkSelectionChanged",n.OnParameterChanged="onParameterChanged",n.OnToolbarStateChanged="onToolbarStateChanged",n.OnUrlAction="onUrlAction",n.OnTabSwitched="onTabSwitched",n.OnCustomViewLoaded="onCustomViewLoaded",n.OnCustomViewRemoved="onCustomViewRemoved",n.OnCustomViewSaved="onCustomViewSaved",n.OnCustomViewSetDefault="onCustomViewSetDefault",n.OnStoryPointSwitched="onStoryPointSwitched",n.OnSummaryDataChanged="onSummaryDataChanged",n.OnReadyToReceiveAuthToken="onReadyToReceiveAuthToken",(i=t.VizAuthoringAttributes||(t.VizAuthoringAttributes={})).OnWorkbookPublished="onWorkbookPublished",i.OnWorkbookPublishedAs="onWorkbookPublishedAs",i.OnWorkbookReadyToClose="onWorkbookReadyToClose",i.HideCloseButton="hide-close-button",(a=t.VizChildElements||(t.VizChildElements={})).VizFilter="viz-filter",a.VizParameter="viz-parameter",a.CustomParameter="custom-parameter",a.IframeStyle="iframe-style",(r=t.VizChildElementAttributes||(t.VizChildElementAttributes={})).Field="field",r.Value="value",r.Name="name"},1480:(e,t)=>{"use strict";var r,a,i,n;Object.defineProperty(t,"__esModule",{value:!0}),(n=t.WebComponentAttributes||(t.WebComponentAttributes={})).Src="src",n.Width="width",n.Height="height",n.Token="token",n.Debug="debug",n.IframeAuth="iframe-auth",n.OnVizLoadError="onvizloaderror",n.ForceTokenSync="force-token-sync",(i=t.EmbeddedIframeAttributes||(t.EmbeddedIframeAttributes={})).Loading="iframe-attr-loading",i.Style="iframe-attr-style",i.Class="iframe-attr-class",(a=t.WebComponentChildElements||(t.WebComponentChildElements={})).CustomParameter="custom-parameter",a.IframeStyle="iframe-style",(r=t.WebComponentChildElementAttributes||(t.WebComponentChildElementAttributes={})).Field="field",r.Value="value",r.Name="name"},4744:e=>{"use strict";var t;!function(e){let t,r,a,i,n,s,o,l,d;!function(e){e.APINotInitialized="api-not-initialized",e.VisibilityError="visibility-error",e.DialogAlreadyOpen="dialog-already-open",e.DialogClosedByUser="dialog-closed-by-user",e.InternalError="internal-error",e.InvalidDomainDialog="invalid-dialog-domain",e.InvalidParameter="invalid-parameter",e.MissingFilter="missing-filter",e.MissingParameter="missing-parameter",e.ServerError="server-error",e.SettingSaveInProgress="setting-save-in-progress",e.UnsupportedEventName="unsupported-event-name",e.UnsupportedMethodForDataSourceType="unsupported-method-for-data-source-type"}(t=e.ErrorCodes||(e.ErrorCodes={})),function(e){e.Desktop="desktop",e.Server="server",e.Cloud="cloud",e.PublicWeb="public-web",e.PublicDesktop="public-desktop"}(r=e.ExtensionContext||(e.ExtensionContext={})),function(e){e.Authoring="authoring",e.Viewing="viewing"}(a=e.ExtensionMode||(e.ExtensionMode={})),function(e){e.DialogMessageReceived="dialog-message-received",e.FilterChanged="filter-changed",e.MarkSelectionChanged="mark-selection-changed",e.SummaryDataChanged="summary-data-changed",e.ParameterChanged="parameter-changed",e.SettingsChanged="settings-changed",e.DashboardLayoutChanged="dashboard-layout-changed",e.WorkbookFormattingChanged="workbook-formatting-changed",e.WorksheetFormattingChanged="worksheet-formatting-changed"}(i=e.TableauEventType||(e.TableauEventType={})),function(e){e.Discrete="discrete",e.Continuous="continuous"}(n=e.VizImageEncodingType||(e.VizImageEncodingType={})),function(e){e.Ascending="ascending",e.Descending="descending"}(s=e.VizImageSortDirectionType||(e.VizImageSortDirectionType={})),function(e){e.CustomDiverging="custom-diverging",e.CustomSequential="custom-sequential"}(o=e.VizImagePaletteType||(e.VizImagePaletteType={})),function(e){e.Fixed="fixed",e.Manual="manual"}(l=e.VizImageSizeSettingType||(e.VizImageSizeSettingType={})),function(e){e.Right="right",e.Left="left",e.Center="center"}(d=e.VizImageSizeSettingAlignmentType||(e.VizImageSizeSettingAlignmentType={}))}(t||(t={})),e.exports=t},4912:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.SharedErrorCodes||(t.SharedErrorCodes={})).CrosstabCreationError="crosstab-creation-error",r.DataCreationError="data-creation-error",r.InvalidAggregationFieldName="invalid-aggregation-field-name",r.InvalidFilterFieldName="invalid-filter-name",r.InvalidFilterFieldValue="invalid-filter-fieldValue",r.InvalidSelectionDate="invalid-selection-date",r.InvalidSelectionFieldName="invalid-selection-fieldName",r.InvalidSelectionValue="invalid-selection-value",r.InvalidSelectionSheet="invalid-selection-sheet",r.InternalError="internal-error",r.InvalidParameter="invalid-parameter",r.PDFCreationError="pdf-creation-error",r.PowerPointCreationError="powerpoint-creation-error",r.NotActiveSheet="not-active-sheet",r.ImplementationError="wrong-implementation",r.ApiExecutionError="api-execution-error",r.ServerError="server-error",r.Timeout="timeout"},808:e=>{"use strict";var t;!function(e){let t,r,a,i,n,s,o,l,d,c,u,h,p,m,g,y,I,v,S,T,b,f,E,A,P,_,w,D,C;!function(e){e.Cluster="cluster",e.Forecast="forecast",e.TrendLine="trend-line"}(t=e.AnalyticsObjectType||(e.AnalyticsObjectType={})),function(e){e.Mark="mark",e.Point="point",e.Area="area"}(r=e.AnnotationType||(e.AnnotationType={})),function(e){e.Discrete="discrete",e.Continuous="continuous",e.Unknown="unknown"}(a=e.ColumnType||(e.ColumnType={})),function(e){e.WorksheetTitle="tableau-worksheet-title",e.Worksheet="tableau-worksheet",e.Tooltip="tableau-tooltip",e.StoryTitle="tableau-story-title",e.DashboardTitle="tableau-dashboard-title",e.Pane="tableau-pane",e.RowDividers="tableau-row-dividers",e.ColumnDividers="tableau-column-dividers"}(i=e.ClassNameKey||(e.ClassNameKey={})),function(e){e.Blank="blank",e.Worksheet="worksheet",e.QuickFilter="quick-filter",e.ParameterControl="parameter-control",e.PageFilter="page-filter",e.Legend="legend",e.Title="title",e.Text="text",e.Image="image",e.WebPage="web-page",e.Extension="extension"}(n=e.DashboardObjectType||(e.DashboardObjectType={})),function(e){e.Show="show",e.Hide="hide"}(s=e.DashboardObjectVisibilityType||(e.DashboardObjectVisibilityType={})),function(e){e.String="string",e.Int="int",e.Float="float",e.Bool="bool",e.Date="date",e.DateTime="date-time",e.Spatial="spatial",e.Unknown="unknown"}(o=e.DataType||(e.DataType={})),function(e){e.Added="added",e.Removed="removed",e.IsFloatingChanged="is-floating-changed",e.IsVisibleChanged="is-visible-changed",e.PositionChanged="position-changed",e.SizeChanged="size-changed",e.NameChanged="name-changed",e.Selected="selected",e.Deselected="deselected",e.DashboardChanged="dashboard-changed"}(l=e.DashboardLayoutChange||(e.DashboardLayoutChange={})),function(e){e.Last="last",e.LastN="last-n",e.Next="next",e.NextN="next-n",e.Current="current",e.ToDate="to-date"}(d=e.DateRangeType||(e.DateRangeType={})),function(e){e.Window="window",e.Modal="modal",e.Modeless="modeless"}(c=e.DialogStyle||(e.DialogStyle={})),function(e){e.Column="column",e.Row="row",e.Page="page",e.Filter="filter",e.MarksType="marks-type",e.MeasureValues="measure-values",e.Color="color",e.Size="size",e.Label="label",e.Detail="detail",e.Tooltip="tooltip",e.Shape="shape",e.Path="path",e.Angle="angle",e.Geometry="geometry",e.Custom="custom"}(u=e.EncodingType||(e.EncodingType={})),function(e){e.Sum="sum",e.Avg="avg",e.Min="min",e.Max="max",e.Stdev="stdev",e.Stdevp="stdevp",e.Var="var",e.Varp="varp",e.Collect="collect",e.Count="count",e.Countd="countd",e.Median="median",e.Attr="attr",e.None="none",e.Year="year",e.Qtr="qtr",e.Month="month",e.Day="day",e.Hour="hour",e.Minute="minute",e.Second="second",e.Week="week",e.Weekday="weekday",e.MonthYear="month-year",e.Mdy="mdy",e.End="end",e.TruncYear="trunc-year",e.TruncQtr="trunc-qtr",e.TruncMonth="trunc-month",e.TruncWeek="trunc-week",e.TruncDay="trunc-day",e.TruncHour="trunc-hour",e.TruncMinute="trunc-minute",e.TruncSecond="trunc-second",e.Quart1="quart1",e.Quart3="quart3",e.Skewness="skewness",e.Kurtosis="kurtosis",e.InOut="in-out",e.User="user"}(h=e.FieldAggregationType||(e.FieldAggregationType={})),function(e){e.Dimension="dimension",e.Measure="measure",e.Unknown="unknown"}(p=e.FieldRoleType||(e.FieldRoleType={})),function(e){e.Categorical="categorical",e.Range="range",e.Hierarchical="hierarchical",e.RelativeDate="relative-date"}(m=e.FilterType||(e.FilterType={})),function(e){e.Add="add",e.All="all",e.Replace="replace",e.Remove="remove"}(g=e.FilterUpdateType||(e.FilterUpdateType={})),function(e){e.Relevant="relevant",e.Database="database"}(y=e.FilterDomainType||(e.FilterDomainType={})),function(e){e.NullValues="null-values",e.NonNullValues="non-null-values",e.AllValues="all-values"}(I=e.FilterNullOption||(e.FilterNullOption={})),function(e){e.AllValues="all-values",e.OnlyNativeValues="only-native-values",e.OnlyFormattedValues="only-formatted-values"}(v=e.IncludeDataValuesOption||(e.IncludeDataValuesOption={})),function(e){e.Bar="bar",e.Line="line",e.Area="area",e.Square="square",e.Circle="circle",e.Shape="shape",e.Text="text",e.Map="map",e.Pie="pie",e.GanttBar="gantt-bar",e.Polygon="polygon",e.Heatmap="heatmap",e.VizExtension="viz-extension"}(S=e.MarkType||(e.MarkType={})),function(e){e.All="all",e.List="list",e.Range="range"}(T=e.ParameterValueType||(e.ParameterValueType={})),function(e){e.Years="years",e.Quarters="quarters",e.Months="months",e.Weeks="weeks",e.Days="days",e.Hours="hours",e.Minutes="minutes",e.Seconds="seconds"}(b=e.PeriodType||(e.PeriodType={})),function(e){e.RunningTotal="running-total",e.Difference="difference",e.PercentDifference="percent-difference",e.PercentOfTotal="percent-of-total",e.Rank="rank",e.Percentile="percentile",e.MovingAverage="moving-average",e.YTDTotal="ytd-total",e.CompoundGrowthRate="compound-growth-rate",e.YearOverYearGrowth="year-over-year-growth",e.YTDGrowth="ytd-growth",e.Undefined="undefined"}(f=e.QuickTableCalcType||(e.QuickTableCalcType={})),function(e){e.Replace="select-replace",e.Add="select-add",e.Remove="select-remove"}(E=e.SelectionUpdateType||(e.SelectionUpdateType={})),function(e){e.Simple="select-options-simple",e.Toggle="select-options-toggle"}(A=e.SelectOptions||(e.SelectOptions={})),function(e){e.Dashboard="dashboard",e.Story="story",e.Worksheet="worksheet"}(P=e.SheetType||(e.SheetType={})),function(e){e.Increasing="increasing",e.Decreasing="decreasing"}(_=e.SortDirection||(e.SortDirection={})),function(e){e.Linear="linear",e.Logarithmic="logarithmic",e.Exponential="exponential",e.Polynomial="polynomial"}(w=e.TrendLineModelType||(e.TrendLineModelType={})),function(e){e.Slow="slow",e.Normal="normal",e.Fast="fast"}(D=e.ReplaySpeedType||(e.ReplaySpeedType={})),function(e){e.AllSelected="all-selected",e.NoneSelected="none-selected",e.SomeSelected="some-selected",e.UnknownSelected="unknown-selected"}(C=e.HierarchicalLevelSelectionState||(e.HierarchicalLevelSelectionState={})),e.ZoneVisibilityType=Object.assign({},s)}(t||(t={})),e.exports=t},5488:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}(r(4912));var a=r(808);t.AnalyticsObjectType=a.AnalyticsObjectType,t.AnnotationType=a.AnnotationType,t.ClassNameKey=a.ClassNameKey,t.ColumnType=a.ColumnType,t.DashboardLayoutChange=a.DashboardLayoutChange,t.DashboardObjectType=a.DashboardObjectType,t.DashboardObjectVisibilityType=a.DashboardObjectVisibilityType,t.DataType=a.DataType,t.DateRangeType=a.DateRangeType,t.DialogStyle=a.DialogStyle,t.EncodingType=a.EncodingType,t.FieldAggregationType=a.FieldAggregationType,t.FieldRoleType=a.FieldRoleType,t.FilterDomainType=a.FilterDomainType,t.FilterNullOption=a.FilterNullOption,t.FilterType=a.FilterType,t.FilterUpdateType=a.FilterUpdateType,t.HierarchicalLevelSelectionState=a.HierarchicalLevelSelectionState,t.IncludeDataValuesOption=a.IncludeDataValuesOption,t.MarkType=a.MarkType,t.ParameterValueType=a.ParameterValueType,t.PeriodType=a.PeriodType,t.QuickTableCalcType=a.QuickTableCalcType,t.ReplaySpeedType=a.ReplaySpeedType,t.SelectOptions=a.SelectOptions,t.SelectionUpdateType=a.SelectionUpdateType,t.SheetType=a.SheetType,t.SortDirection=a.SortDirection,t.TrendLineModelType=a.TrendLineModelType,t.ZoneVisibilityType=a.ZoneVisibilityType},3448:(e,t,r)=>{"use strict";function a(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}Object.defineProperty(t,"__esModule",{value:!0});const i=r(5892);t.INTERNAL_CONTRACT_VERSION=i,a(r(6716)),a(r(1080)),a(r(5824)),a(r(4547)),a(r(2400)),a(r(2496)),a(r(2472)),a(r(552)),a(r(3256)),a(r(7204)),a(r(4528)),a(r(3388)),a(r(3760)),t.MESSAGING_VERSION={major:1,minor:0,fix:0}},6716:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(1080);class i{static isSpecial(e){return e.length>2&&"%"===e[0]&&"%"===e[e.length-1]}static parseBoolean(e){const t=e.toLowerCase();return"true"!==t&&"false"!==t?this.specialValueIndicator:"true"===t}static parseNumber(e){const t=Number(e);return isNaN(t)?this.specialValueIndicator:t}static parseDate(e){const t=new Date(e);return Number.isNaN(t.getTime())?null:t}static parseDateTime(e){const t=e.replace(" ","T").concat("Z"),r=new Date(t);return Number.isNaN(r.getTime())?null:r}static convertValueAsStringToValue(e,t){if(null!=e){if(this.isSpecial(e))return e;switch(t){case a.DataType.Bool:return this.parseBoolean(e);case a.DataType.Int:case a.DataType.Float:return this.parseNumber(e);case a.DataType.Date:return null===this.parseDate(e)?this.specialValueIndicator:e;case a.DataType.DateTime:return null===this.parseDateTime(e)?this.specialValueIndicator:e;case a.DataType.Spatial:case a.DataType.String:default:return e}}}static convertValueToNativeValue(e,t){if(null==e)return null;switch(t){case a.DataType.Bool:case a.DataType.Int:case a.DataType.Float:return"string"==typeof e?null:e;case a.DataType.Date:return this.parseDate(e);case a.DataType.DateTime:return this.parseDateTime(e);case a.DataType.String:return this.isSpecial(e)?null:e;case a.DataType.Spatial:default:return e}}static convertStringValueToNativeValue(e,t){return this.convertValueToNativeValue(this.convertValueAsStringToValue(e,t),t)}}t.DataTypeConverter=i,i.specialValueIndicator="%null%"},1080:(e,t)=>{"use strict";var r,a,i,n,s,o,l,d,c,u,h,p,m,g,y,I,v,S,T,b,f,E,A,P,_,w,D,C,F,x,M,k,N,R;Object.defineProperty(t,"__esModule",{value:!0}),(R=t.ExtensionContext||(t.ExtensionContext={})).Desktop="desktop",R.Server="server",R.Unknown="unknown",R.Cloud="cloud",R.PublicWeb="public-web",R.PublicDesktop="public-desktop",(N=t.ExtensionMode||(t.ExtensionMode={})).Authoring="authoring",N.Viewing="viewing",N.Unknown="unknown",(k=t.AnnotateEnum||(t.AnnotateEnum={})).Mark="mark",k.Point="point",k.Area="area",(M=t.ColumnType||(t.ColumnType={})).Discrete="discrete",M.Continuous="continuous",M.Unknown="unknown",(x=t.DashboardObjectType||(t.DashboardObjectType={})).Blank="blank",x.Worksheet="worksheet",x.QuickFilter="quick-filter",x.ParameterControl="parameter-control",x.PageFilter="page-filter",x.Legend="legend",x.Title="title",x.Text="text",x.Image="image",x.WebPage="web-page",x.Extension="extension",(F=t.DataType||(t.DataType={})).String="string",F.Int="int",F.Float="float",F.Bool="bool",F.Date="date",F.DateTime="date-time",F.Spatial="spatial",F.Unknown="unknown",(C=t.DialogStyle||(t.DialogStyle={})).Window="window",C.Modal="modal",C.Modeless="modeless",(D=t.EncodedDataType||(t.EncodedDataType={})).Number="number",D.String="string",D.Date="date",D.Boolean="boolean",(w=t.ErrorCodes||(t.ErrorCodes={})).INITIALIZATION_ERROR="initialization-error",w.INTERNAL_ERROR="internal-error",w.MISSING_ENUM_MAPPING="missing-enum-mapping",w.MISSING_PARAMETER="missing-parameter",w.PERMISSION_DENIED="permission-denied",w.PRES_MODEL_PARSING_ERROR="pres-model-parsing-error",w.VERSION_NOT_CONFIGURED="version-not-configured",w.VISIBILITY_ERROR="visibility-error",w.UNKNOWN_VERB_ID="unknown-verb-id",(_=t.FieldAggregationType||(t.FieldAggregationType={})).Sum="sum",_.Avg="avg",_.Min="min",_.Max="max",_.Stdev="stdev",_.Stdevp="stdevp",_.Var="var",_.Varp="varp",_.Collect="collect",_.Count="count",_.Countd="countd",_.Median="median",_.Attr="attr",_.None="none",_.Year="year",_.Qtr="qtr",_.Month="month",_.Day="day",_.Hour="hour",_.Minute="minute",_.Second="second",_.Week="week",_.Weekday="weekday",_.MonthYear="month-year",_.Mdy="mdy",_.End="end",_.TruncYear="trunc-year",_.TruncQtr="trunc-qtr",_.TruncMonth="trunc-month",_.TruncWeek="trunc-week",_.TruncDay="trunc-day",_.TruncHour="trunc-hour",_.TruncMinute="trunc-minute",_.TruncSecond="trunc-second",_.Quart1="quart1",_.Quart3="quart3",_.Skewness="skewness",_.Kurtosis="kurtosis",_.InOut="in-out",_.User="user",(P=t.FieldRoleType||(t.FieldRoleType={})).Dimension="dimension",P.Measure="measure",P.Unknown="unknown",(A=t.FilterUpdateType||(t.FilterUpdateType={})).Add="add",A.All="all",A.Replace="replace",A.Remove="remove",(E=t.SheetType||(t.SheetType={})).Dashboard="dashboard",E.Story="story",E.Worksheet="worksheet",(f=t.DomainRestrictionType||(t.DomainRestrictionType={})).All="all",f.List="list",f.Range="range",(b=t.DateStepPeriod||(t.DateStepPeriod={})).Years="years",b.Quarters="quarters",b.Months="months",b.Weeks="weeks",b.Days="days",b.Hours="hours",b.Minutes="minutes",b.Seconds="seconds",(T=t.FilterNullOption||(t.FilterNullOption={})).NullValues="nullvalues",T.NonNullValues="nonnullvalues",T.AllValues="allvalues",(S=t.FilterDomainType||(t.FilterDomainType={})).Relevant="relevant",S.Database="database",(v=t.SelectionUpdateType||(t.SelectionUpdateType={})).Replace="select-replace",v.Add="select-add",v.Remove="select-remove",(I=t.SelectOptions||(t.SelectOptions={})).Simple="select-options-simple",I.Toggle="select-options-toggle",I.Menu="select-options-menu",I.Range="select-options-range",I.Search="select-options-search",(y=t.QuantitativeIncludedValues||(t.QuantitativeIncludedValues={})).IncludeNull="include-null",y.IncludeNonNull="include-non-null",y.IncludeAll="include-all",(g=t.HierarchicalLevelSelectionState||(t.HierarchicalLevelSelectionState={})).AllSelected="all-selected",g.NoneSelected="none-selected",g.SomeSelected="some-selected",g.UnknownSelected="unknown-selected",(m=t.MarkType||(t.MarkType={})).Bar="bar",m.Line="line",m.Area="area",m.Square="square",m.Circle="circle",m.Shape="shape",m.Text="text",m.Map="map",m.Pie="pie",m.GanttBar="gantt-bar",m.Polygon="polygon",m.Heatmap="heatmap",m.VizExtension="viz-extension",(p=t.FilterType||(t.FilterType={})).Categorical="categorical",p.Range="range",p.RelativeDate="relativeDate",p.Hierarchical="hierarchical",(h=t.DateRangeType||(t.DateRangeType={})).Last="last",h.LastN="lastN",h.Next="next",h.NextN="nextN",h.Current="current",h.ToDate="toDate",(u=t.ExtensionDialogResult||(t.ExtensionDialogResult={})).DialogAlreadyOpen="dialog-already-open",u.InvalidDomain="invalid-domain",u.Success="success",(c=t.ApiShowDataTableFormat||(t.ApiShowDataTableFormat={})).NativeValuesOnly="native-values-only",c.FormattedValuesOnly="formatted-values-only",c.NativeAndFormattedValues="native-and-formatted-values",(d=t.PageSizeOption||(t.PageSizeOption={})).Letter="letter",d.Legal="legal",d.Note="note",d.Folio="folio",d.Tabloid="tabloid",d.Ledger="ledger",d.Statement="statement",d.Executive="executive",d.A3="a3",d.A4="a4",d.A5="a5",d.B4="b4",d.B5="b5",d.Quarto="quarto",d.Unspecified="unspecified",(l=t.PageOrientation||(t.PageOrientation={})).Printer="printer",l.Portrait="portrait",l.Landscape="landscape",(o=t.ScaleMode||(t.ScaleMode={})).ScaleAuto="auto",o.ScalePercentage="percent",o.ScaleFitPages="fit-pages",(s=t.PageScalingOption||(t.PageScalingOption={})).ScalePctAuto="auto",s.ScalePct400="pct400",s.ScalePct200="pct200",s.ScalePct100="pct100",s.ScalePct90="pct90",s.ScalePct80="pct80",s.ScalePct75="pct75",s.ScalePct60="pct60",s.ScalePct50="pct50",s.ScalePct25="pct25",(n=t.FitPages||(t.FitPages={})).FitOneHigh="fit0x1",n.FitTwoHigh="fit0x2",n.FitOneWide="fit1x0",n.FitTwoWide="fit2x0",(i=t.EncodingType||(t.EncodingType={})).Color="color",i.Size="size",i.Label="label",i.Detail="detail",i.Tooltip="tooltip",i.Shape="shape",i.Path="path",i.Angle="angle",i.Geometry="geometry",i.Custom="custom",(a=t.PulseTimeDimension||(t.PulseTimeDimension={})).Today="Today",a.Yesterday="Yesterday",a.WeekToDate="WeekToDate",a.LastWeek="LastWeek",a.MonthToDate="MonthToDate",a.LastMonth="LastMonth",a.QuarterToDate="QuarterToDate",a.LastQuarter="LastQuarter",a.YearToDate="YearToDate",a.LastYear="LastYear",(r=t.PulseErrorMessageVisibility||(t.PulseErrorMessageVisibility={})).Visible="visible",r.Hidden="hidden",r.Suppressed="suppressed"},5824:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.NotificationId||(t.NotificationId={})).CustomMarkContextMenuClicked="custom-mark-context-menu-clicked",r.ContextMenuClick="context-menu-click",r.CustomViewRemoved="custom-view-removed",r.CustomViewSaved="custom-view-saved",r.CustomViewSetDefault="custom-view-set-default",r.CustomViewsLoaded="custom-views-loaded",r.DashboardLayoutChanged="dashboard-layout-changed",r.EditButtonClicked="edit-button-clicked",r.EditInDesktopButtonClicked="edit-in-desktop-button-clicked",r.ExtensionDialogUpdate="extension-dialog-update",r.ExtensionDialogMessage="extension-dialog-message",r.FilterChanged="filter-changed",r.FirstVizSizeKnown="first-viz-size-known",r.FirstPulseMetricSizeKnown="first-pulse-metric-size-known",r.ParameterChanged="parameter-changed",r.PulseError="pulse-error",r.PulseFiltersChanged="pulse-filters-changed",r.PulseMetricSizeChanged="pulse-metric-size-changed",r.PulseInsightDiscovered="pulse-insight-discovered",r.PulseInteractive="pulse-interactive",r.PulseTimeDimensionChanged="pulse-time-dimension-changed",r.PulseUrlChanged="pulse-url-changed",r.SelectedMarksChanged="selected-marks-changed",r.SettingsChanged="settings-changed",r.SummaryDataChanged="summary-data-changed",r.TestConversionNotification="test-conversion-notification",r.ToolbarStateChanged="toolbar-state-changed",r.VizInteractive="viz-interactive",r.AskDataInteractive="ask-data-interactive",r.WorkbookReadyToClose="workbook-ready-to-close",r.WorkbookFormattingChanged="workbook-formatting-changed",r.WorkbookPublished="workbook-published",r.WorkbookPublishedAs="workbook-published-as",r.WorksheetFormattingChanged="worksheet-formatting-changed",r.UrlAction="url-action",r.TabSwitched="tab-switched",r.StoryPointSwitched="story-point-switched",r.ReadyToReceiveAuthToken="ready-to-receive-auth-token"},4547:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.ParameterId||(t.ParameterId={})).ActiveTablesInfo="active-tables-info",r.AnchorDate="anchor-date",r.AnnotateEnum="annotate-enum",r.AnnotationList="annotation-list",r.ApplyWorksheetFormatting="apply-worksheet-formatting",r.CategoricalDomain="categorical-domain",r.ClickThroughEnabled="click-through-enabled",r.Columns="columns",r.ColumnsToInclude="columns-to-include",r.ColumnsToIncludeById="columns-to-include-by-id",r.ConnectionDescriptionSummaries="connection-description-summaries",r.CurrentSheetType="current-sheet-type",r.CustomView="custom-view",r.CustomViewIsDefault="custom-view-is-default",r.CustomViewIsPublic="custom-view-is-public",r.CustomViewLuid="custom-view-luid",r.CustomViewName="custom-view-name",r.CustomViews="custom-views",r.Dashboard="dashboard",r.DashboardFilters="dashboard-filters",r.DashboardName="dashboard",r.DashboardObjectPositionAndSizeUpdate="dashboard-object-position-and-size-update",r.DashboardObjectPositionAndSizeUpdateList="dashboard-object-position-and-size-update-list",r.DataRowIndex="data-row-index",r.DataSchema="data-schema",r.DataSource="data-source",r.DataSourceDataTable="data-source-data-table",r.DataSourceId="data-source-id",r.DataSourceName="data-source-name",r.DataTable="data-table",r.DataTableReader="data-table-reader",r.DateRangeType="date-range-type",r.DeleteCount="delete-count",r.DeltaTimeMs="delta-time-ms",r.DimValSelectionModels="dimensionValueSelectionModels",r.DomainType="domain-type",r.EmbeddingAbstractQuery="embedding-abstract-query",r.EmbeddingBootstrapInfo="embedding-bootstrap-info",r.EncodingType="encoding-type",r.ExportCrosstabSheetMap="export-crosstab-sheet-map",r.ExportFile="export-file",r.ExportOriginUrl="export-origin-url",r.ExportPdfOptions="export-pdf-options",r.ExtensionBootstrapInfo="extension-bootstrap-info",r.ExtensionContextMenuIds="extension-context-menu-ids",r.ExtensionDialogH="extension-dialog-height",r.ExtensionDialogMessage="extension-dialog-message",r.ExtensionDialogPayload="extension-dialog-payload",r.ExtensionDialogResult="extension-dialog-result",r.ExtensionDialogStyle="extension-dialog-style",r.ExtensionDialogUrl="extension-dialog-url",r.ExtensionDialogW="extension-dialog-width",r.ExtensionLocator="extension-locator",r.ExtensionSettingsInfo="extension-settings-info",r.ExtensionZoneId="extension-zone-id",r.ExternalMenuDescription="external-menu-description",r.ExternalMenuHeader="external-menu-header",r.ExternalMenuItemDisplayName="external-menu-item-display-name",r.ExternalMenuItemId="external-menu-item-id",r.Field="field",r.FieldCount="field-count",r.FieldId="field-id",r.FieldName="field-name",r.FilterLevels="filter-levels",r.FilterRangeMax="filter-range-max",r.FilterRangeMin="filter-range-min",r.FilterRangeNullOption="filter-range-null-option",r.FilterUpdateType="filter-update-type",r.FilterValues="filter-values",r.FontNameListItems="font-name-list-items",r.FormattedText="formatted-text",r.FunctionName="function-name",r.FromIndex="from-index",r.HierValSelectionModels="hierarchicalValueSelectionModels",r.HighlightedData="highlighted-data",r.HoverTupleInteraction="hover-tuple-interaction",r.IgnoreAliases="ignore-aliases",r.IgnoreSelection="ignore-selection",r.IncludeAllColumns="include-all-columns",r.InvalidAggFieldName="invalid-agg-field-name",r.InvalidDates="invalid-dates",r.InvalidFieldCaption="invalid-field-caption",r.InvalidFields="invalid-fields",r.InvalidValues="invalid-values",r.IsAnalyticsAssistantAvailable="is-analytics-assistant-available",r.IsExcludeMode="is-exclude",r.IsExtensionDialog="is-extension-dialog",r.IsFromCalcDialog="is-from-calc-dialog",r.JoinDescription="join-description",r.LogicalTableId="logical-table-id",r.LogicalTableInfoList="logical-table-info-list",r.MarksCardIndex="marks-card-index",r.MaxHeight="max-height",r.MaxRows="max-rows",r.MaxWidth="max-width",r.MinHeight="min-height",r.MinWidth="min-width",r.PageRowCount="page-row-count",r.ParameterCaption="paremeter-caption",r.ParameterError="parameter-error",r.ParameterFieldName="parameter-field-name",r.ParameterInfo="parameter-info",r.ParameterInfos="parameter-infos",r.ParameterValue="parameter-value",r.PeriodType="period-type",r.PulseFieldName="fieldName",r.PulseFieldNames="fieldNames",r.PulseFilterDomainType="domainType",r.PulseFilterDomainSearchTerm="searchTerm",r.PulsePageSize="pageSize",r.PulseNextPageToken="nextPageToken",r.PulseFilters="filters",r.PulseTimeDimension="timeDimension",r.QuantitativeDomain="quantitative-dmain",r.QuantRangeSelectionModels="quantativeRangeSelectionModels",r.RangeN="range-n",r.ReplaySpeed="replay-speed",r.SelectedData="selected-data",r.SelectedSheetNames="selected-sheet-names",r.Selection="selection",r.SelectionList="selection-list",r.SelectionUpdateType="selectionUpdateType",r.SelectTuplesInteraction="select-tuples-interaction",r.SendNotifications="send-notifications",r.SettingsValues="settings-values",r.SharedFilterSheets="shared-filter-sheets",r.SharedFiltersInfo="shared-filters-info",r.SheetIdentifier="sheet-identifier",r.SheetName="sheet-name",r.SheetPath="sheet-path",r.ShouldRefreshDS="should-refresh-ds",r.ShowDataTableFormat="show-data-table-format",r.StartIndex="start-index",r.State="state",r.StoryPointIndex="story-point-index",r.StoryPointInfo="story-point-info",r.SwitchToSheetName="switch-to-sheet-name",r.TargetPoint="target-point",r.TestConversionParameter="test-conversion-parameter",r.Text="formatted-text",r.ToIndex="to-index",r.TooltipContext="tooltip-context",r.TooltipTextRequest="tooltip-text-request",r.TooltipText="tooltip-text",r.UnderlyingDataTable="underlying-data-table",r.UnderlyingSummaryDataTable="underlying-summary-data-table",r.Url="url",r.UseTabDelimiters="use-tab-delimiters",r.ViewDataTableCacheId="view-data-table-cache-id",r.ViewDataTableId="view-data-table-id",r.VisualId="visual-id",r.VisualSpecification="visual-specification",r.VizAPIInputJson="vizapi-input-json",r.VizAPIStateWithDataModel="vizapi-state-with-data-model",r.VizAPIStateWarningMsg="vizapi-state-warning-msg",r.VizAPISVG="vizapi-svg",r.WorksheetName="worksheet-name",r.WorksheetFilters="worksheet-filters",r.ZoneIdsVisibilityMap="zone-ids-visibility-map"},2400:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.VerbId||(t.VerbId={})).ActivateNextStoryPoint="activate-next-story-point",r.ActivatePreviousStoryPoint="activate-previous-story-point",r.ActivateSheet="activateSheet",r.ActivateStoryPoint="activate-story-point",r.AddMarksCardFields="add-marks-card-fields",r.AppendExternalMenuItem="append-external-menu-item",r.ApplyCategoricalFilter="categorical-filter",r.ApplyPulseFilters="apply-pulse-filters",r.ApplyPulseTimeDimension="apply-pulse-time-dimension",r.ApplyRangeFilter="range-filter",r.ApplyRelativeDateFilter="apply-relative-date-Filter",r.Authenticate="authenticate",r.BlockExtension="block-extension",r.ChangeParameterValue="change-parameter-value",r.ChangeSharedFilter="change-shared-filter",r.ClearAllPulseFilters="clear-all-pulse-filters",r.ClearFilter="clear-filter",r.ClearPulseFilters="clear-pulse-filters",r.ClearSelectedMarks="clear-selected-marks",r.CloseDialog="close-dialog",r.CreateAnnotation="create-annotation",r.DashboardCategoricalFilter="dashboard-categorical-filter",r.DisplayDialog="display-dialog",r.DownloadWorkbook="download-workbook",r.EditAliasesDialog="edit-aliases-dialog",r.ExecuteExternalMenuItem="execute-external-menu-item",r.ExportCrosstab="export-crosstab",r.ExportCrosstabCsvDownload="export-crosstab-csv-download",r.ExportCrosstabExcelDownload="export-crosstab-excel-download",r.ExportData="export-data",r.ExportDataDownload="export-data-download",r.ExportImage="export-image",r.ExportPdf="export-pdf",r.ExportPdfDownload="export-pdf-download",r.ExportPowerpoint="export-powerpoint",r.ExportPowerpointDownload="export-powerpoint-download",r.FindParameter="find-parameter",r.GetActiveTables="get-active-tables",r.GetAllDataSources="get-all-data-sources",r.GetAnnotations="get-annotations",r.GetCategoricalDomain="get-categorical-domain",r.GetConnectionDescriptionSummaries="get-connection-description-summaries",r.GetCurrentSrc="get-current-src",r.GetCustomViews="get-custom-views",r.GetDashboardFilters="get-dashboard-filters",r.GetDataSource="get-datasource",r.GetDataSourceData="get-datasource-data",r.GetDataSources="get-data-sources",r.GetDataSummaryData="get-summary-data",r.GetDataSummaryDataReader="get-summary-data-reader",r.GetDataTableReaderPage="get-data-table-reader-page",r.GetEmbeddingAbstractQueryWithDataModel="get-embedding-abstract-query-with-data-model",r.GetEmbeddingClientInfo="get-embedding-client-info",r.GetVizStateWithDataModel="get-viz-state-with-data-model",r.GetExportCrosstabSheetMap="get-export-crosstab-sheet-map",r.GetExportPdfOptions="get-export-pdf-options",r.GetField="get-field",r.GetFieldAndDataSource="get-field-and-datasource",r.GetVisualSpecification="get-visual-specification",r.GetFilters="get-filters",r.GetFonts="get-fonts",r.GetHighlightedMarks="get-highlighted-marks",r.GetJoinDescription="get-join-description",r.GetLogicalTableData="get-logical-table-data",r.GetLogicalTableDataReader="get-logical-table-data-reader",r.GetLogicalTables="get-logical-tables",r.GetParametersForSheet="get-parameters-for-sheet",r.GetPulseCategoricalDomain="get-pulse-categorical-domain",r.GetPulseFilters="get-pulse-filters",r.GetPulseTimeDimension="get-pulse-time-dimension",r.GetRangeDomain="get-range-domain",r.GetSelectedMarks="get-selected-marks",r.GetSharedFilter="get-shared-filter",r.GetTooltipText="get-tooltip-text",r.GetUnderlyingData="get-underlying-data",r.GetUnderlyingTableData="get-underlying-table-data",r.GetUnderlyingTableDataReader="get-underlying-table-data-reader",r.GetUnderlyingTables="get-underlying-tables",r.HierarchicalFilter="hierachical-filter",r.InitializeExtension="initialize-extension",r.IsAnalyticsAssistantAvailable="is-analytics-assistant-available",r.LaunchAnalyticsAssistant="launch-analytics-assistant",r.MoveAndResizeZones="move-and-resize-zones",r.MoveMarksCardField="move-marks-card-field",r.RaiseLeaveMarkNavNotification="raise-leave-mark-nav-notification",r.RaiseHoverTupleNotification="raise-hover-tuple-notification",r.RaiseSelectTuplesNotification="raise-select-tuples-notification",r.Redo="redo",r.RefreshDataSource="refresh-data-source",r.ReleaseDataTableReader="release-data-table-reader",r.RemoveAnnotation="remove-annotation",r.RemoveCustomView="remove-custom-view",r.RemoveExternalMenuItem="remove-external-menu-item",r.RenameExternalMenu="rename-external-menu",r.ReplayAnimation="replay-animation",r.RevertStoryPoint="revert-story-point",r.RevertWorkbook="revert-workbook",r.SaveExtensionSettings="save-extension-settings",r.SaveWorkbookAsCustomView="save-workbook-as-custom-view",r.SelectByValue="select-by-value",r.SetActiveCustomViewAsDefault="set-active-custom-view-as-default",r.SetAutoUpdate="set-auto-update",r.SetClickThrough="set-click-through",r.SendDialogMessage="send-dialog-message",r.SetVizStateWithDataModel="set-viz-state-with-data-model",r.SetSheetSize="set-sheet-size",r.SetZoneVisibility="set-zone-visibility",r.Share="share",r.ShowCustomView="show-custom-view",r.SpliceMarksCardFields="splice-marks-card-fields",r.TestConversionVerb="test-conversion-verb",r.Undo="undo",r.UpdateCustomView="update-custom-view",r.VizAPI="viz-api"},2496:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.AskDataOptionNames||(t.AskDataOptionNames={})).token="token",r.origin="origin",r.showEmbed="showEmbed",r.showPin="showPin",r.showSave="showSave",r.showShare="showShare",r.debug=":jsdebug",r.ApiID=":apiID",r.ApiExternalVersion=":apiExternalVersion",r.ApiInternalVersion=":apiInternalVersion",r.AskDataWebComponent=":askDataWebComponent"},2472:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.PulseOptionNames||(t.PulseOptionNames={})).embed="embed",r.token="token",r.disableExploreFilter="disableExploreFilter",r.layout="embed_layout",r.theme="embed_theme",r.ApiExternalVersion=":apiExternalVersion",r.ApiInternalVersion=":apiInternalVersion",r.PulseWebComponent=":pulseWebComponent"},552:(e,t)=>{"use strict";var r,a,i;Object.defineProperty(t,"__esModule",{value:!0}),function(e){e.ONE="1",e.ALERTS=":alerts",e.ALIAS="alias",e.ALLOW_DEFERRED_BOOTSTRAP=":allowDeferredBootstrap",e.ALLOW_AUTOGEN_WORKSHEET_PHONE_LAYOUTS="allowAutogenWorksheetPhoneLayouts",e.API_ID=":apiID",e.APP=":app",e.ATTACHMENT="attachment",e.IS_IPAD_APP="app",e.ANIMATE_TRANSITION=":animate_transition",e.ASCENDING="ascending",e.AUTHENTICATION="authentication",e.ATTRIBUTES="attributes",e.AUTHORING_SHEET=":authSheet",e.AXIS="axis",e.BOOTSTRAP_WHEN_NOTIFIED=":bootstrapWhenNotified",e.BROWSER_BACK_BUTTON_UNDO=":browserBackButtonUndo",e.BROWSER_RENDERING_ON="isBrowserRendering",e.BROWSER_RENDERING_THRESHOLD="browserRenderingThreshold",e.CHARSET="charset",e.CLIENT_DIMENSION="clientDimension",e.CLIENT_IP="client_ip",e.CLIENT_NUM="clientNum",e.COLON_EMBEDDED=":embedded",e.COLON_MOBILE=":mobile",e.COLON_DEEP_LINKING_DISABLED=":deepLinkingDisabled",e.COLON_WATERMARK=":watermark",e.COMMENTS=":comments",e.COMMENTING_ENABLED=":commentingEnabled",e.COMMENTING_MENTIONS_ENABLED=":commentingMentions",e.CONNECTION="connection",e.CREATED_BY_FEATURE="createdByFeature",e.CRYPTED_PASSWORD="crypted",e.CSSDEBUG=":cssdebug",e.CSV="csv",e.CUSTOM_VIEWS=":customViews",e.CV=":cv",e.CV_ID="cvId",e.DASHBOARD_PORT_SIZE="dashboardPortSize",e.DATA_DETAILS=":dataDetails",e.DATASOURCE="datasource",e.DEBUG=":debug",e.DELAY=":delay",e.DEPTH="depth",e.DEVICE_TYPE=":device",e.DEVICE_PIXEL_RATIO="devicePixelRatio",e.DEVICE_PREVIEW_MODE=":devicepreviewmode",e.DIMENSIONS=":dimensions",e.DISABLE_SHARED_SESSIONS=":disable_shared_sessions",e.DISABLE_URL_ACTIONS_POPUPS=":disableUrlActionsPopups",e.DIRECTION="direction",e.DISPLAY_OVERLAY=":display_overlay",e.DISPLAY_SHARE=":display_share",e.DISPLAY_SPINNER=":display_spinner",e.DISPLAY_STATIC_IMAGE=":display_static_image",e.DISPLAY_TABS="display_tabs",e.DISPLAY_VIEW_COUNT=":display_count",e.IGNORE_STICKY_SESSION=":ignore_sticky_session",e.INCREMENT_VIEW_COUNT=":increment_view_count",e.DOCMODE="docmode",e.DOMAIN="domain",e.DO_WORK="do_work",e.DX="dx",e.DY="dy",e.EDIT_DATA_ALERT=":editDataAlert",e.EMBED=":embed",e.EMBEDDED="embedded",e.ENCRYPTED="encrypted",e.API_EXTERNAL_VERSION=":apiExternalVersion",e.API_INTERNAL_VERSION=":apiInternalVersion",e.EXCLUDE="exclude",e.EXPORT_FORMAT=":export_format",e.FIELDNAME="fieldname",e.FIELD_NAME="field_name",e.FIELD_SEP="field_sep",e.FILE="file",e.FILTER_TILE_SIZE="filterTileSize",e.FN="fn",e.FOCUS="focus",e.FORCE_CACHE="force_cache",e.FORMAT="format",e.FORMAT_DATA_VALUE_LOCALLY="formatDataValueLocally",e.FROM_WG=":from_wg",e.GRAPHQL_DATABASE_ID=":graphQLDatabaseId",e.GRAPHQL_TABLE_ID=":graphQLTableId",e.GUID=":guid",e.H="h",e.HIDDEN="hidden",e.HIDE_CLOSE_BUTTON=":hideCloseButton",e.HIDE_EDIT_BUTTON=":hideEditButton",e.HIDE_EDIT_IN_DESKTOP_BUTTON=":hideEditInDesktopButton",e.HIGH_DPI=":highdpi",e.IMAGE_SIZE_LIMIT="imageSizeLimit",e.TRANSPARENT_LINE_MARKS_LIMIT="transparentLineMarkLimit",e.CLIENT_RENDER_PIXEL_LIMIT="clientRenderPixelLimit",e.IN="in",e.INSTANCE_ID=":iid",e.IS_GUEST_REDIRECT_FROM_VIZPORTAL=":isGuestRedirectFromVizportal",e.IS_MARK_ANIMATION_ENABLED="isMarkAnimationEnabled",e.IS_VIZPORTAL=":isVizPortal",e.INPUT_="input_string",e.JSDEBUG=":jsdebug",e.JSON="json",e.JSON_ONLY=":jsonOnly",e.KEEPFILE="keepfile",e.KEY="key",e.LANGUAGE="language",e.LANGUAGE_REQUESTED=":language",e.LINKTARGET=":linktarget",e.LOAD_ORDER_ID=":loadOrderID",e.LOAD_NEWEST_REVISION=":loadNewestRevision",e.LOCAL_PATHS=":localPaths",e.LOCALE="locale",e.LOCATION_ID="locationid",e.LOCATION_TYPE="locationtype",e.WORKBOOK_LOCALE="workbookLocale",e.MAXROWS="maxrows",e.MAX_AGE="maxAge",e.MAX_ROWS="maxRows",e.METHOD="method",e.MOBILE="mobile",e.MODIFIER="modifier",e.NAME="name",e.NAV_TYPE="navType",e.NAV_SRC="navSrc",e.NOATTACHMENT="no-attachment",e.NO_OVERWRITE="no_overwrite",e.OPEN_AUTHORING_IN_TOP_WINDOW=":openAuthoringInTopWindow",e.OPENID_HD=":openid_hd",e.OPENID_LOGIN_HINT=":openid_login_hint",e.OAUTHREQUEST="oauthrequest",e.OAUTH_CREDENTIAL_IDS="oauth_credential_ids",e.OFFLINE_MODE=":offlinemode",e.ORIGIN=":origin",e.OVERLAY=":overlay",e.P="p",e.PATH="path",e.PANE_RESOLVER_X="paneResolverX",e.PANE_RESOLVER_Y="paneResolverY",e.PARAM="param",e.PARENT_ID="parent_id",e.PASSWORD="password",e.PATTERN="pattern",e.PIXEL_RATIO=":pixelratio",e.PREFIX=":prefix",e.PREVIEW=":preview",e.PRIMARY_CONTENT_URL="primary_content_url",e.PROJECT="project",e.PROTOCOL="protocol",e.PSEUDO=":pseudo",e.QUERY="query",e.R="r",e.RANGE_TYPE="range_type",e.RECORD_SEP="record_sep",e.RECORD_CLIENT_PERFORMANCE=":record_client_performance",e.RECORD_PERFORMANCE=":record_performance",e.RECOVER_OLD_SESSION_ID=":recover_old_session_id",e.RECOVER_SESSION_STATE_TICKETS=":recover_session_state_tickets",e.REFRESH=":refresh",e.REFRESHUNMODIFIED=":refreshunmodified",e.REGION="region",e.RELOAD_ON_CUSTOM_VIEW_SAVE=":reloadOnCustomViewSave",e.RENDER=":render",e.RENDER_MAPS_CLIENT_SIDE="renderMapsClientSide",e.RETRY=":retry",e.REUSE="reuse",e.REUSE_FOREVER="reuse_forever",e.REVERT=":revert",e.SAVE_DB_PASSWORDS="save_db_passwords",e.SELECT_X="select_x",e.SELECT_Y="select_y",e.SESSION_FEATURE_PREFIX=":ff_",e.SESSION_FLAGS=":session_feature_flags",e.SHARE_BUTTON="share_button",e.SHEET_ID="sheet_id",e.SHARED="shared",e.SHOWALL="showall",e.SHOW_APP_BANNER=":showAppBanner",e.SHOW_ASK_DATA=":showAskData",e.SHOW_PARAMS="showParams",e.SHOW_SHARE_OPTIONS=":showShareOptions",e.SIZE=":size",e.SOURCE="source",e.STATE="state",e.STICKY_SESSION_KEY="stickySessionKey",e.SUBSCRIPTIONS=":subscriptions",e.SUMMARY="summary",e.SUPPRESS_DEFAULT_EDIT_BEHAVIOR=":suppressDefaultEditBehavior",e.SYNC_SESSION=":sync_session",e.SYNC_SESSION_STATE="sync_session_state",e.TABS=":tabs",e.TARGET="target",e.TARGET_SITE="target_site",e.TOOLBAR=":toolbar",e.TOOLTIP=":tooltip",e.TS="ts",e.UNDERLYING_TABLE_ID="underlying_table_id",e.UNDERLYING_TABLE_CAPTION="underlying_table_caption",e.UPDATE_TYPE="update_type",e.USE_GUEST=":useGuest",e.USE_INLINE_IMAGES="use_inline_images",e.USERAGENT="useragent",e.USERNAME="username",e.VALUE="value",e.VERBOSE_MODE="verboseMode",e.VIEW_ID="views_id",e.VIZ_SNAPSHOT_ID="viz_snapshot_id",e.VW=":vw",e.W="w",e.WORKSHEET_PORT_SIZE="worksheetPortSize",e.WATERMARK="watermark",e.WATERMARK_MARGIN=":watermark_margin",e.WB=":wb",e.WHICH="which",e.X="x",e.Y="y",e.ZID="zid",e.ZONE_ID="zone_id",e.KEYCHAIN_VERSION="keychain_version",e.DATASOURCE_ID="datasource_id",e.DATASOURCE_NAME="datasource_name",e.LENS_ID="lens_id",e.WIDTH="width",e.HEIGHT="height",e.LAYOUT_VIEWS="views",e.LAYOUT_MENUS="menus",e.LAYOUT_GEOMETRY="geometry",e.LAYOUT_PAGES="pages",e.LAYOUT_CACHEURL="cacheurl",e.LAYOUT_SHEET="sheet",e.LAYOUT_DEPTH="depth"}(r||(r={})),function(e){e.SHOW_VIZ_HOME=":showVizHome"}(a||(a={})),(i=t.VizOptionNames||(t.VizOptionNames={})).Size=":size",i.Embed=":embed",i.ApiInternalVersion=":apiInternalVersion",i.ApiExternalVersion=":apiExternalVersion",i.ShowVizHome=":showVizHome",i.Jsdebug=":jsdebug",i.BootstrapWhenNotified=":bootstrapWhenNotified",i.NavType="navType",i.NavSrc="navSrc",i.debug=":jsdebug",i.ApiID=":apiID",i.disableUrlActionsPopups=":disableUrlActionsPopups",i.hideTabs=":tabs",i.toolbar=":toolbar",i.device=":device",i.instanceIdToClone=":iid",i.touchOptimize="mobile",i.hideEditButton=":hideEditButton",i.hideEditInDesktopButton=":hideEditInDesktopButton",i.suppressDefaultEditBehavior=":suppressDefaultEditBehavior",i.hideCloseButton=":hideCloseButton"},3256:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(1808),i=r(3448),n=r(1680),s=r(4020),o=r(7204);t.CrossFrameMessenger=class{constructor(e,t,r){this.thisWindow=e,this.otherWindow=t,this.otherWindowOrigin=r}startListening(){if(!this.unregisterFunction){const e=this.onMessageReceived.bind(this);this.thisWindow.addEventListener("message",e,!0),this.unregisterFunction=()=>this.thisWindow.removeEventListener("message",e,!0)}}stopListening(){this.unregisterFunction&&(this.unregisterFunction(),this.unregisterFunction=void 0)}setInitializeMessageHandler(e){this.initializeMessageHandler=e}setCommandResponseMessageHandler(e){this.commandResponseMessageHandler=e}setCommandMessageHandler(e){this.commandMessageHandler=e}setNotificationMessageHandler(e){this.notificationMessageHandler=e}setHandshakeMessageHandler(e){this.handshakeMessageHandler=e}prepareInitializationMessage(e,t,r){const i={msgGuid:a.raw(),msgType:o.MessageType.Initialize,crossFrameVersion:t,apiVersion:e,options:r};return this.prepareMessage(i)}prepareCommandMessage(e,t){const r={msgGuid:a.raw(),msgType:o.MessageType.Command,verbId:e,parameters:t};return this.prepareMessage(r)}prepareCommandResponseMessage(e,t,r){const i={msgGuid:a.raw(),msgType:o.MessageType.CommandResponse,commandGuid:e,data:t,error:r};return r&&(i.error=JSON.parse(JSON.stringify(r))),this.prepareMessage(i)}prepareNotificationMessage(e,t){const r={msgGuid:a.raw(),msgType:o.MessageType.Notification,notificationId:e,data:t};return this.prepareMessage(r)}prepareAckMessage(){const e={msgGuid:a.raw(),msgType:o.MessageType.Ack,platformVersion:i.INTERNAL_CONTRACT_VERSION};return this.prepareMessage(e)}prepareMessage(e){if(!this.otherWindow||!this.otherWindowOrigin)throw"Other window not initialized, cannot dispatch messages";return new n.CrossFramePreparedMessage(e,this.otherWindow,this.otherWindowOrigin)}onMessageReceived(e){if(this.otherWindow&&e.source!==this.otherWindow)return;if(!e.data)return;const t=e.data;if(s.isMessage(t))switch(t.msgType){case o.MessageType.Initialize:if(!s.isInitMessage(t)||!this.initializeMessageHandler)return;this.initializeMessageHandler(t,e.source);break;case o.MessageType.CommandResponse:if(!s.isCommandResponseMessage(t)||!this.commandResponseMessageHandler)return;this.commandResponseMessageHandler(t,e.source);break;case o.MessageType.Command:if(!s.isCommandMessage(t)||!this.commandMessageHandler)return;this.commandMessageHandler(t,e.source);break;case o.MessageType.Notification:if(!s.isNotificationMessage(t)||!this.notificationMessageHandler)return;this.notificationMessageHandler(t,e.source);break;case o.MessageType.Handshake:if(!s.isHandshakeMessage(t)||!this.handshakeMessageHandler)return;this.handshakeMessageHandler(t,e.source)}}setOtherWindow(e){this.otherWindow=e}setOtherWindowOrigin(e){this.otherWindowOrigin=e}}},1680:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.CrossFramePreparedMessage=class{constructor(e,t,r){this._message=e,this._target=t,this._origin=r}get messageGuid(){return this._message.msgGuid}send(){return this._target.postMessage(this._message,this._origin),this}}},4020:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(1808),i=r(5824),n=r(7204),s=new Set([i.NotificationId.EditButtonClicked,i.NotificationId.EditInDesktopButtonClicked,i.NotificationId.WorkbookPublished,i.NotificationId.WorkbookReadyToClose,i.NotificationId.ReadyToReceiveAuthToken]);function o(e){if(!e)return!1;const t=e;return!!(t&&t.msgGuid&&t.msgType)&&(!!a.isGuid(t.msgGuid)&&("string"==typeof t.msgType&&!([n.MessageType.Command,n.MessageType.CommandResponse,n.MessageType.Initialize,n.MessageType.Notification,n.MessageType.Handshake].indexOf(t.msgType)<0)))}function l(e){if(!e)return!1;const t=e;return"object"==typeof t&&"number"==typeof t.fix&&"number"==typeof t.minor&&"number"==typeof t.major}t.isMessage=o,t.isVersion=l,t.isInitMessage=function(e){if(!o(e))return!1;const t=e;return!!(t.msgType===n.MessageType.Initialize&&t.apiVersion&&l(t.apiVersion)&&t.crossFrameVersion&&l(t.crossFrameVersion))},t.isCommandResponseMessage=function(e){if(!o(e))return!1;const t=e;return!(t.msgType!==n.MessageType.CommandResponse||!a.isGuid(t.commandGuid)||!t.data&&!t.error)},t.isCommandMessage=function(e){if(!o(e))return!1;const t=e;return!(t.msgType!==n.MessageType.Command||!t.parameters||"object"!=typeof t.parameters||!t.verbId||"string"!=typeof t.verbId)},t.isNotificationMessage=function(e){if(!o(e))return!1;const t=e;return!(t.msgType!==n.MessageType.Notification||!t.data&&!s.has(t.notificationId)||!t.notificationId||"string"!=typeof t.notificationId)},t.isHandshakeMessage=function(e){return!!o(e)&&e.msgType===n.MessageType.Handshake}},7204:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.MessageType||(t.MessageType={})).Initialize="initialize",r.Notification="notification",r.Command="command",r.CommandResponse="command-response",r.Handshake="v-handshake",r.Ack="v-ack"},1600:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.IdentityVersionConverter=class{upgradeExecuteCall(e,t){return{verb:e,parameters:t}}downgradeExecuteReturn(e){return e}downgradeNotification(e){return e}}},2320:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.StackingVersionConverter=class{constructor(e,t,r,a,i){if(this._externalMajorVersion=e,this._platformMajorVersion=t,this._upgradeExecuteTranslations=r,this._downgradeExecuteTranslations=a,this._downgradeNotificationTranslations=i,this._externalMajorVersion>this._platformMajorVersion)throw new Error(`Cannot convert between external version ${this._externalMajorVersion} and ${this._platformMajorVersion}`)}static fromData(e,t,r,a,i){return new this(e.major,t.major,r,a,i)}upgradeExecuteCall(e,t){let r={verb:e,parameters:t};for(const e of this._upgradeExecuteTranslations)r=e(r.verb,r.parameters);return r}downgradeExecuteReturn(e){let t=e;for(const e of this._downgradeExecuteTranslations)t=e(t);return t}downgradeNotification(e){let t=e;for(const e of this._downgradeNotificationTranslations)t=e(t);return t}}},3760:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(1600),i=r(2320),n=r(720);function s(e,t){return e.major===t.major&&e.minor===t.minor}function o(e,t,r,n,o){const d=e.major,c=e.minor,u=t.major;if(d>u)throw new Error(`External version must be less than or equal to platform version.\n externalMajorVersion=${d} platformMajorVersion=${u}`);if(s(e,t))return new a.IdentityVersionConverter;const h=l(d,u,c,r),p=l(d,u,c,n),m=l(d,u,c,o);return p.reverse(),m.reverse(),i.StackingVersionConverter.fromData(e,t,h,p,m)}function l(e,t,r,a){const i=[];for(let n=e;n<=t;n++)if(n in a){const t=n===e?r:0,s=d(Object.keys(a[n]));for(let e=t;e<=s;e++)e in a[n]&&i.push(...a[n][e])}return i}function d(e){return e.map((e=>Number(e))).reduce(((e,t)=>e>t?e:t))}t.VersionLessThan=function(e,t){return!(e.major>t.major)&&(e.major{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3448),i=r(5824);t.DowngradeWorksheetNames=function(e){const t=e.result;return void 0!==t.extensionDashboardInfo&&t.extensionDashboardInfo.zones.forEach((e=>{e.sheetInfo&&(e.name=e.sheetInfo.name)})),e},t.DowngradeFlipboardZoneID=function(e){if(e.notificationId===i.NotificationId.SelectedMarksChanged){const t=e.data;void 0===t.flipboardZoneID&&(t.flipboardZoneID=0)}return e};const n=["tableau-row-dividers","tableau-column-dividers","tableau-pane"];t.DowngradeWorksheetFomatting175=e=>function(e,t){var r,a;const i=e.result;return(null===(a=null===(r=i)||void 0===r?void 0:r.extensionWorksheetInfo)||void 0===a?void 0:a.formatting)&&(i.extensionWorksheetInfo.formatting.formattingSheets=i.extensionWorksheetInfo.formatting.formattingSheets.filter((e=>!t.includes(e.classNameKey)))),e}(e,n),t.DowngradeWorksheetFomattingNotification175=e=>function(e,t){if(e.notificationId===i.NotificationId.WorksheetFormattingChanged){const r=e.data;e.data=r.formattingSheets.filter((e=>!t.includes(e.classNameKey)))}return e}(e,n),t.DowngradeExtensionEnvironmentContext=function(e){const t=e.result;if(void 0!==t.extensionEnvironment){const e=t.extensionEnvironment.extensionContext;e===a.ExtensionContext.PublicWeb||e===a.ExtensionContext.Cloud?t.extensionEnvironment.extensionContext=a.ExtensionContext.Server:e===a.ExtensionContext.PublicDesktop&&(t.extensionEnvironment.extensionContext=a.ExtensionContext.Desktop)}return e}},4528:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ExternalIdentityVersionConverter=class{downgradeExecuteCall(e,t){return{verb:e,parameters:t}}upgradeExecuteReturn(e,t,r){return e}upgradeNotification(e){return e}}},5768:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ExternalStackingVersionConverter=class{constructor(e,t,r,a,i){if(this._externalVersion=e,this._platformVersion=t,this._downgradeExecuteCallTranslations=r,this._upgradeExecuteReturnTranslations=a,this._upgradeNotificationTranslations=i,this._externalVersion.major>this._platformVersion.major)throw new Error(`Cannot convert between external version ${this._externalVersion.major}\n and ${this._platformVersion.major}`)}downgradeExecuteCall(e,t){let r={verb:e,parameters:t};for(const e of this._downgradeExecuteCallTranslations)r=e(r.verb,r.parameters);return r}upgradeExecuteReturn(e,t,r){let a=e;for(const e of this._upgradeExecuteReturnTranslations)a=e(a,t,r);return a}upgradeNotification(e){let t=e;for(const e of this._upgradeNotificationTranslations)t=e(t);return t}}},3388:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3760),i=r(4528),n=r(5768);function s(e,t,r,s,l){const d=e.major,c=t.major,u=t.minor;if(d>c)throw new Error(`External version must be less than or equal to platform version.\n externalMajorVersion=${d} platformMajorVersion=${c}`);if(d{"use strict";function a(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}Object.defineProperty(t,"__esModule",{value:!0});var i=r(2808);t.ApiVersion=i.ApiVersion,a(r(5184));var n=r(8540);t.CrossFrameDispatcher=n.CrossFrameDispatcher;var s=r(8340);t.DataSource=s.DataSource;var o=r(1044);t.ExternalToInternalEnumMappings=o.ExternalToInternalEnumMappings;var l=r(6557);t.InternalToExternalEnumMappings=l.InternalToExternalEnumMappings;var d=r(2680);t.EventListenerManager=d.EventListenerManager;var c=r(1072);t.Field=c.Field;var u=r(2520);t.CustomViewImpl=u.CustomViewImpl;var h=r(1940);t.DashboardImpl=h.DashboardImpl;var p=r(6488);t.DashboardObjectImpl=p.DashboardObjectImpl;var m=r(2180);t.DataSourceImpl=m.DataSourceImpl;var g=r(8552);t.ParameterImpl=g.ParameterImpl;var y=r(8332);t.SheetImpl=y.SheetImpl;var I=r(8736);t.SheetInfoImpl=I.SheetInfoImpl;var v=r(5144);t.SingleEventManagerImpl=v.SingleEventManagerImpl;var S=r(6804);t.StoryImpl=S.StoryImpl;var T=r(2608);t.StoryPointImpl=T.StoryPointImpl;var b=r(6068);t.StoryPointInfoImpl=b.StoryPointInfoImpl;var f=r(3044);t.WorkbookImpl=f.WorkbookImpl;var E=r(6500);t.WorksheetImpl=E.WorksheetImpl;var A=r(6368);t.Point=A.Point,a(r(8672)),a(r(3008));var P=r(1832);t.ClientInfoServiceImpl=P.ClientInfoServiceImpl;var _=r(1288);t.NotificationServiceImpl=_.NotificationServiceImpl;var w=r(8808);t.NotificationServiceImplBase=w.NotificationServiceImplBase,t.Registration=w.Registration;var D=r(1776);t.ServiceImplBase=D.ServiceImplBase;var C=r(4109);t.SizeServiceImpl=C.SizeServiceImpl;var F=r(2248);t.StoryActivationServiceImpl=F.StoryActivationServiceImpl;var x=r(6664);t.TableauError=x.TableauError;var M=r(1724);t.Deferred=M.Deferred;var k=r(7480);t.ErrorHelpers=k.ErrorHelpers;var N=r(5044);t.ExportHelpers=N.ExportHelpers;var R=r(2780);t.SheetUtils=R.SheetUtils;var V=r(1576);t.VersionNumber=V.VersionNumber;var O=r(8648);t.VersionedExternalApiDispatcher=O.VersionedExternalApiDispatcher},2808:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(1576);class i{static get Instance(){return i._instance}static SetVersionNumber(e,t){i._instance=new a.VersionNumber(e,t)}}t.ApiVersion=i},716:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ConnectionSummary=class{constructor(e){this._connectionInfo=e}get name(){return this._connectionInfo.name}get id(){return this._connectionInfo.id}get serverURI(){return this._connectionInfo.serverURI}get type(){return this._connectionInfo.type}}},5184:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3448),i=r(8540);t.doCrossFrameBootstrap=function(e,t,r){return new Promise(((n,s)=>{let o;o=function(e){try{return e.self!==e.parent}catch(e){return!0}}(e)?e.parent:e.opener,o||s("This extension is not running inside an iframe, desktop, or popup window. Initialization failed.");const l=new a.CrossFrameMessenger(e,o,"*"),d=l.prepareInitializationMessage(t,a.MESSAGING_VERSION,r);l.setCommandResponseMessageHandler((function(e){e.commandGuid===d.messageGuid&&n((()=>new i.CrossFrameDispatcher(l)))})),l.startListening(),d.send()}))}},8540:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419);t.CrossFrameDispatcher=class{constructor(e){if(this._messenger=e,this._pendingPromises={},this._notificationHandlers=[],!this._messenger)throw"Missing messenger object";this._messenger.setCommandResponseMessageHandler(this.onCommandResponse.bind(this)),this._messenger.setNotificationMessageHandler(this.onNotification.bind(this))}execute(e,t){const r=this._messenger.prepareCommandMessage(e,t),a=new Promise(((e,t)=>{this._pendingPromises[r.messageGuid]={resolve:e,reject:t}}));return r.send(),a}registerNotificationHandler(e){this._notificationHandlers.push(e)}unregisterNotificationHandler(e){this._notificationHandlers=this._notificationHandlers.filter((t=>t!==e))}onCommandResponse(e){if(Object.keys(this._pendingPromises).indexOf(e.commandGuid)<0)return;const t=this._pendingPromises[e.commandGuid];e.error&&t.reject(e.error),e.data&&t.resolve({result:e.data}),delete this._pendingPromises[e.commandGuid]}onNotification(e){for(const t of this._notificationHandlers)try{t({notificationId:e.notificationId,data:e.data})}catch(e){if(e.errorCode===a.EmbeddingErrorCodes.IncompatibleVersionError)throw e}}}},8340:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DataSource=class{constructor(e){this._dataSourceImpl=e}get name(){return this._dataSourceImpl.name}get id(){return this._dataSourceImpl.id}get fields(){return this._dataSourceImpl.fields}get extractUpdateTime(){return this._dataSourceImpl.extractUpdateTime}get isExtract(){return this._dataSourceImpl.isExtract}get isPublished(){return this._dataSourceImpl.isPublished}publishedUrl(){return this._dataSourceImpl.publishedUrl()}refreshAsync(){return this._dataSourceImpl.refreshAsync()}getActiveTablesAsync(){return console.warn("DataSource.getActiveTablesAsync is deprecated. Please use DataSource.getLogicalTablesAsync."),this._dataSourceImpl.getActiveTablesAsync()}getConnectionSummariesAsync(){return this._dataSourceImpl.getConnectionSummariesAsync()}getUnderlyingDataAsync(e){return console.warn("DataSource.getUnderlyingDataAsync is deprecated. Please use DataSource.getLogicalTablesAsync and DataSource.getLogicalTableDataAsync."),this._dataSourceImpl.getUnderlyingDataAsync(e)}getLogicalTablesAsync(){return this._dataSourceImpl.getLogicalTablesAsync()}getLogicalTableDataAsync(e,t){return this._dataSourceImpl.getLogicalTableDataAsync(e,t)}getLogicalTableDataReaderAsync(e,t,r){return this._dataSourceImpl.getLogicalTableDataReaderAsync(e,t,r)}}},1044:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(5520);class s{}t.ExternalToInternalEnumMappings=s,s.filterDomainType=new n.EnumConverter({[a.FilterDomainType.Relevant]:i.FilterDomainType.Relevant,[a.FilterDomainType.Database]:i.FilterDomainType.Database}),s.nullOptions=new n.EnumConverter({[a.FilterNullOption.AllValues]:i.FilterNullOption.AllValues,[a.FilterNullOption.NonNullValues]:i.FilterNullOption.NonNullValues,[a.FilterNullOption.NullValues]:i.FilterNullOption.NullValues}),s.filterUpdateType=new n.EnumConverter({[a.FilterUpdateType.Add]:i.FilterUpdateType.Add,[a.FilterUpdateType.All]:i.FilterUpdateType.All,[a.FilterUpdateType.Remove]:i.FilterUpdateType.Remove,[a.FilterUpdateType.Replace]:i.FilterUpdateType.Replace}),s.setVisibilityType=new n.EnumConverter({[a.ZoneVisibilityType.Show]:!0,[a.ZoneVisibilityType.Hide]:!1}),s.setReplaySpeedType=new n.EnumConverter({[a.ReplaySpeedType.Slow]:2,[a.ReplaySpeedType.Normal]:1,[a.ReplaySpeedType.Fast]:.5}),s.sheetType=new n.EnumConverter({[a.SheetType.Dashboard]:i.SheetType.Dashboard,[a.SheetType.Worksheet]:i.SheetType.Worksheet,[a.SheetType.Story]:i.SheetType.Story}),s.showDataTableFormatType=new n.EnumConverter({[a.IncludeDataValuesOption.AllValues]:i.ApiShowDataTableFormat.NativeAndFormattedValues,[a.IncludeDataValuesOption.OnlyNativeValues]:i.ApiShowDataTableFormat.NativeValuesOnly,[a.IncludeDataValuesOption.OnlyFormattedValues]:i.ApiShowDataTableFormat.FormattedValuesOnly}),s.periodType=new n.EnumConverter({[a.PeriodType.Years]:i.DateStepPeriod.Years,[a.PeriodType.Quarters]:i.DateStepPeriod.Quarters,[a.PeriodType.Months]:i.DateStepPeriod.Months,[a.PeriodType.Weeks]:i.DateStepPeriod.Weeks,[a.PeriodType.Days]:i.DateStepPeriod.Days,[a.PeriodType.Hours]:i.DateStepPeriod.Hours,[a.PeriodType.Minutes]:i.DateStepPeriod.Minutes,[a.PeriodType.Seconds]:i.DateStepPeriod.Seconds}),s.dateRangeType=new n.EnumConverter({[a.DateRangeType.Last]:i.DateRangeType.Last,[a.DateRangeType.LastN]:i.DateRangeType.LastN,[a.DateRangeType.Next]:i.DateRangeType.Next,[a.DateRangeType.NextN]:i.DateRangeType.NextN,[a.DateRangeType.Current]:i.DateRangeType.Current,[a.DateRangeType.ToDate]:i.DateRangeType.ToDate}),s.dialogStyles=new n.EnumConverter({[a.DialogStyle.Window]:i.DialogStyle.Window,[a.DialogStyle.Modal]:i.DialogStyle.Modal,[a.DialogStyle.Modeless]:i.DialogStyle.Modeless})},6557:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(5520);class s{}t.InternalToExternalEnumMappings=s,s.extensionContext=new n.EnumConverter({[i.ExtensionContext.Desktop]:a.ExtensionContext.Desktop,[i.ExtensionContext.Server]:a.ExtensionContext.Server,[i.ExtensionContext.PublicWeb]:a.ExtensionContext.PublicWeb,[i.ExtensionContext.PublicDesktop]:a.ExtensionContext.PublicDesktop,[i.ExtensionContext.Cloud]:a.ExtensionContext.Cloud}),s.extensionMode=new n.EnumConverter({[i.ExtensionMode.Authoring]:a.ExtensionMode.Authoring,[i.ExtensionMode.Viewing]:a.ExtensionMode.Viewing}),s.columnType=new n.EnumConverter({[i.ColumnType.Continuous]:a.ColumnType.Continuous,[i.ColumnType.Discrete]:a.ColumnType.Discrete,[i.ColumnType.Unknown]:a.ColumnType.Unknown}),s.fieldAggregationType=new n.EnumConverter({[i.FieldAggregationType.Attr]:a.FieldAggregationType.Attr,[i.FieldAggregationType.Avg]:a.FieldAggregationType.Avg,[i.FieldAggregationType.Collect]:a.FieldAggregationType.Collect,[i.FieldAggregationType.Count]:a.FieldAggregationType.Count,[i.FieldAggregationType.Countd]:a.FieldAggregationType.Countd,[i.FieldAggregationType.Day]:a.FieldAggregationType.Day,[i.FieldAggregationType.End]:a.FieldAggregationType.End,[i.FieldAggregationType.Hour]:a.FieldAggregationType.Hour,[i.FieldAggregationType.InOut]:a.FieldAggregationType.InOut,[i.FieldAggregationType.Kurtosis]:a.FieldAggregationType.Kurtosis,[i.FieldAggregationType.Max]:a.FieldAggregationType.Max,[i.FieldAggregationType.Mdy]:a.FieldAggregationType.Mdy,[i.FieldAggregationType.Median]:a.FieldAggregationType.Median,[i.FieldAggregationType.Min]:a.FieldAggregationType.Min,[i.FieldAggregationType.Minute]:a.FieldAggregationType.Minute,[i.FieldAggregationType.MonthYear]:a.FieldAggregationType.MonthYear,[i.FieldAggregationType.None]:a.FieldAggregationType.None,[i.FieldAggregationType.Qtr]:a.FieldAggregationType.Qtr,[i.FieldAggregationType.Quart1]:a.FieldAggregationType.Quart1,[i.FieldAggregationType.Quart3]:a.FieldAggregationType.Quart3,[i.FieldAggregationType.Second]:a.FieldAggregationType.Second,[i.FieldAggregationType.Skewness]:a.FieldAggregationType.Skewness,[i.FieldAggregationType.Stdev]:a.FieldAggregationType.Stdev,[i.FieldAggregationType.Stdevp]:a.FieldAggregationType.Stdevp,[i.FieldAggregationType.Sum]:a.FieldAggregationType.Sum,[i.FieldAggregationType.TruncDay]:a.FieldAggregationType.TruncDay,[i.FieldAggregationType.TruncHour]:a.FieldAggregationType.TruncHour,[i.FieldAggregationType.TruncMinute]:a.FieldAggregationType.TruncMinute,[i.FieldAggregationType.TruncMonth]:a.FieldAggregationType.TruncMonth,[i.FieldAggregationType.TruncQtr]:a.FieldAggregationType.TruncQtr,[i.FieldAggregationType.TruncSecond]:a.FieldAggregationType.TruncSecond,[i.FieldAggregationType.TruncWeek]:a.FieldAggregationType.TruncWeek,[i.FieldAggregationType.TruncYear]:a.FieldAggregationType.TruncYear,[i.FieldAggregationType.User]:a.FieldAggregationType.User,[i.FieldAggregationType.Var]:a.FieldAggregationType.Var,[i.FieldAggregationType.Varp]:a.FieldAggregationType.Varp,[i.FieldAggregationType.Week]:a.FieldAggregationType.Week,[i.FieldAggregationType.Weekday]:a.FieldAggregationType.Weekday,[i.FieldAggregationType.Year]:a.FieldAggregationType.Year}),s.fieldRoleType=new n.EnumConverter({[i.FieldRoleType.Dimension]:a.FieldRoleType.Dimension,[i.FieldRoleType.Measure]:a.FieldRoleType.Measure,[i.FieldRoleType.Unknown]:a.FieldRoleType.Unknown}),s.sheetType=new n.EnumConverter({[i.SheetType.Dashboard]:a.SheetType.Dashboard,[i.SheetType.Story]:a.SheetType.Story,[i.SheetType.Worksheet]:a.SheetType.Worksheet}),s.dashboardObjectType=new n.EnumConverter({[i.DashboardObjectType.Extension]:a.DashboardObjectType.Extension,[i.DashboardObjectType.Blank]:a.DashboardObjectType.Blank,[i.DashboardObjectType.Image]:a.DashboardObjectType.Image,[i.DashboardObjectType.Legend]:a.DashboardObjectType.Legend,[i.DashboardObjectType.PageFilter]:a.DashboardObjectType.PageFilter,[i.DashboardObjectType.ParameterControl]:a.DashboardObjectType.ParameterControl,[i.DashboardObjectType.QuickFilter]:a.DashboardObjectType.QuickFilter,[i.DashboardObjectType.Text]:a.DashboardObjectType.Text,[i.DashboardObjectType.Title]:a.DashboardObjectType.Title,[i.DashboardObjectType.WebPage]:a.DashboardObjectType.WebPage,[i.DashboardObjectType.Worksheet]:a.DashboardObjectType.Worksheet}),s.dataType=new n.EnumConverter({[i.DataType.Bool]:a.DataType.Bool,[i.DataType.Date]:a.DataType.Date,[i.DataType.DateTime]:a.DataType.DateTime,[i.DataType.Float]:a.DataType.Float,[i.DataType.Int]:a.DataType.Int,[i.DataType.Spatial]:a.DataType.Spatial,[i.DataType.String]:a.DataType.String}),s.filterUpdateType=new n.EnumConverter({[i.FilterUpdateType.Add]:a.FilterUpdateType.Add,[i.FilterUpdateType.All]:a.FilterUpdateType.All,[i.FilterUpdateType.Remove]:a.FilterUpdateType.Remove,[i.FilterUpdateType.Replace]:a.FilterUpdateType.Replace}),s.allowableValues=new n.EnumConverter({[i.DomainRestrictionType.All]:a.ParameterValueType.All,[i.DomainRestrictionType.List]:a.ParameterValueType.List,[i.DomainRestrictionType.Range]:a.ParameterValueType.Range}),s.dateStepPeriod=new n.EnumConverter({[i.DateStepPeriod.Years]:a.PeriodType.Years,[i.DateStepPeriod.Quarters]:a.PeriodType.Quarters,[i.DateStepPeriod.Months]:a.PeriodType.Months,[i.DateStepPeriod.Weeks]:a.PeriodType.Weeks,[i.DateStepPeriod.Days]:a.PeriodType.Days,[i.DateStepPeriod.Hours]:a.PeriodType.Hours,[i.DateStepPeriod.Minutes]:a.PeriodType.Minutes,[i.DateStepPeriod.Seconds]:a.PeriodType.Seconds}),s.dateRangeType=new n.EnumConverter({[i.DateRangeType.Current]:a.DateRangeType.Current,[i.DateRangeType.Last]:a.DateRangeType.Last,[i.DateRangeType.LastN]:a.DateRangeType.LastN,[i.DateRangeType.Next]:a.DateRangeType.Next,[i.DateRangeType.NextN]:a.DateRangeType.NextN,[i.DateRangeType.ToDate]:a.DateRangeType.ToDate}),s.errorCode=new n.EnumConverter({[i.ErrorCodes.INITIALIZATION_ERROR]:a.ErrorCodes.InternalError,[i.ErrorCodes.INTERNAL_ERROR]:a.ErrorCodes.InternalError,[i.ErrorCodes.MISSING_ENUM_MAPPING]:a.ErrorCodes.InternalError,[i.ErrorCodes.MISSING_PARAMETER]:a.ErrorCodes.InternalError,[i.ErrorCodes.PERMISSION_DENIED]:a.ErrorCodes.InternalError,[i.ErrorCodes.PRES_MODEL_PARSING_ERROR]:a.ErrorCodes.InternalError,[i.ErrorCodes.UNKNOWN_VERB_ID]:a.ErrorCodes.InternalError,[i.ErrorCodes.VERSION_NOT_CONFIGURED]:a.ErrorCodes.APINotInitialized,[i.ErrorCodes.VISIBILITY_ERROR]:a.ErrorCodes.VisibilityError},a.ErrorCodes.InternalError),s.filterType=new n.EnumConverter({[i.FilterType.Categorical]:a.FilterType.Categorical,[i.FilterType.Range]:a.FilterType.Range,[i.FilterType.RelativeDate]:a.FilterType.RelativeDate,[i.FilterType.Hierarchical]:a.FilterType.Hierarchical}),s.classNameKey=new n.EnumConverter({"tableau-dashboard-title":a.ClassNameKey.DashboardTitle,"tableau-story-title":a.ClassNameKey.StoryTitle,"tableau-tooltip":a.ClassNameKey.Tooltip,"tableau-worksheet":a.ClassNameKey.Worksheet,"tableau-worksheet-title":a.ClassNameKey.WorksheetTitle,"tableau-pane":a.ClassNameKey.Pane,"tableau-row-dividers":a.ClassNameKey.RowDividers,"tableau-column-dividers":a.ClassNameKey.ColumnDividers,"dashboard-title":a.ClassNameKey.DashboardTitle,"story-title":a.ClassNameKey.StoryTitle,tooltip:a.ClassNameKey.Tooltip,worksheet:a.ClassNameKey.Worksheet,"worksheet-title":a.ClassNameKey.WorksheetTitle,pane:a.ClassNameKey.Pane,"row-dividers":a.ClassNameKey.RowDividers,"column-dividers":a.ClassNameKey.ColumnDividers}),s.hierarchicalLevelSelectionState=new n.EnumConverter({[i.HierarchicalLevelSelectionState.AllSelected]:a.HierarchicalLevelSelectionState.AllSelected,[i.HierarchicalLevelSelectionState.NoneSelected]:a.HierarchicalLevelSelectionState.NoneSelected,[i.HierarchicalLevelSelectionState.SomeSelected]:a.HierarchicalLevelSelectionState.SomeSelected,[i.HierarchicalLevelSelectionState.UnknownSelected]:a.HierarchicalLevelSelectionState.UnknownSelected}),s.annotationType=new n.EnumConverter({[i.AnnotateEnum.Area]:a.AnnotationType.Area,[i.AnnotateEnum.Mark]:a.AnnotationType.Mark,[i.AnnotateEnum.Point]:a.AnnotationType.Point}),s.markType=new n.EnumConverter({[i.MarkType.Area]:a.MarkType.Area,[i.MarkType.Bar]:a.MarkType.Bar,[i.MarkType.Circle]:a.MarkType.Circle,[i.MarkType.GanttBar]:a.MarkType.GanttBar,[i.MarkType.Heatmap]:a.MarkType.Heatmap,[i.MarkType.Line]:a.MarkType.Line,[i.MarkType.Map]:a.MarkType.Map,[i.MarkType.Pie]:a.MarkType.Pie,[i.MarkType.Polygon]:a.MarkType.Polygon,[i.MarkType.Shape]:a.MarkType.Shape,[i.MarkType.Square]:a.MarkType.Square,[i.MarkType.Text]:a.MarkType.Text,[i.MarkType.VizExtension]:a.MarkType.VizExtension})},2680:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(6664);t.EventListenerManager=class{constructor(){this._eventListenerManagers={}}addEventListener(e,t){if(!this._eventListenerManagers.hasOwnProperty(e))throw new i.TableauError(a.ErrorCodes.UnsupportedEventName,`Cannot add event, unsupported event type: ${e}`);return this._eventListenerManagers[e].addEventListener(t)}removeEventListener(e,t){if(!this._eventListenerManagers.hasOwnProperty(e))throw new i.TableauError(a.ErrorCodes.UnsupportedEventName,`Cannot remove event, unsupported event type: ${e}`);return this._eventListenerManagers[e].removeEventListener(t)}addNewEventType(e){this._eventListenerManagers[e.eventType]=e}}},1072:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Field=class{constructor(e){this._fieldImpl=e}get name(){return this._fieldImpl.name}get id(){return this._fieldImpl.id}get description(){return this._fieldImpl.description}get dataType(){return this._fieldImpl.dataType}get aggregation(){return this._fieldImpl.aggregation}get dataSource(){return this._fieldImpl.dataSource}get role(){return this._fieldImpl.role}get columnType(){return this._fieldImpl.columnType}get isCalculatedField(){return this._fieldImpl.isCalculatedField}get isCombinedField(){return this._fieldImpl.isCombinedField}get isGenerated(){return this._fieldImpl.isGenerated}get isGeospatial(){return this._fieldImpl.isGeospatial}get isHidden(){return this._fieldImpl.isHidden}get isPresentOnPublishedDatasource(){return this._fieldImpl.isPresentOnPublishedDatasource}}},2520:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(5136);t.CustomViewImpl=class{constructor(e,t){this._registryId=t,this._luid=e.luid,this._name=e.name,this._shared=e.shared,this._isDefault=e.isDefault,this._ownerName=e.owner.userFriendlyName,this._url=e.url}get luid(){return this._luid}get name(){return this._name}set name(e){this._name=e}get shared(){return this._shared}set shared(e){this._shared=e}get isDefault(){return this._isDefault}set isDefault(e){this._isDefault=e}get ownerName(){return this._ownerName}get url(){return this._url}saveAsync(){return a.ApiServiceRegistry.get(this._registryId).getService("viz-service").saveAsync(this)}}},1940:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(7419),n=r(3448),s=r(6557),o=r(6368),l=r(3008),d=r(6664),c=r(7480),u=r(6488),h=r(8332),p=r(8736),m=r(6500);class g extends h.SheetImpl{constructor(e,t,r,a,i,n=0){super(e,a),this._zones=t,this._sheetPath=r,this._parentStoryPointImpl=i,this._activeDashboardObjectId=n}get worksheetsImpl(){return this._worksheetsImpl}get objects(){return this._objects}get parentStoryPoint(){return this._parentStoryPointImpl}get activeDashboardObjectId(){return this._activeDashboardObjectId}get activeDashboardName(){return this._sheetPath.sheetName}initializeWithPublicInterfaces(){this._worksheetsImpl=new Array,this._objects=new Array,this.zoneMap=new Map;for(const e of this._zones){let t;const r={width:e.width,height:e.height},a=!1;if(e.zoneType===n.DashboardObjectType.Worksheet||e.zoneType===n.DashboardObjectType.QuickFilter){let s="",o="",l=!1;e.sheetInfo?(s=e.sheetInfo.name,o=e.sheetInfo.url||"",l=""===o):s=e.name;const d=new p.SheetInfoImpl(s,i.SheetType.Worksheet,r,this._worksheetsImpl.length,a,l,o),c={worksheet:s,dashboard:this._sheetInfoImpl.name,storyboard:this._sheetPath.storyboard,flipboardZoneID:this._sheetPath.flipboardZoneID,storyPointID:this._sheetPath.storyPointID};t=new m.WorksheetImpl(d,this._registryId,c,this,this._parentStoryPointImpl),e.zoneType===n.DashboardObjectType.Worksheet&&this._worksheetsImpl.push(t)}const l=new o.Point(e.x,e.y),d=new u.DashboardObjectImpl(this,s.InternalToExternalEnumMappings.dashboardObjectType.convert(e.zoneType),l,r,t,e.name,void 0!==e.isFloating&&e.isFloating,void 0===e.isVisible||e.isVisible,e.zoneId,e.fieldId);this._objects.push(d),this.zoneMap.set(e.zoneId,d)}}setDashboardObjectVisibilityAsync(e){return l.ApiServiceRegistry.get(this._registryId).getService("zone-service").setVisibilityAsync(this.name,this.zoneMap,e)}getDashboardObjectById(e){return this.zoneMap.get(e)}updateZones(e,t=0,r=""){const a=this._objects,n=this.zoneMap,s=this._activeDashboardObjectId,o=this._sheetPath.sheetName;this._zones=e,this._activeDashboardObjectId=t,r&&(this._sheetPath.sheetName=r,this._sheetInfoImpl.name=r),this.initializeWithPublicInterfaces();const l=this._objects,d=this.zoneMap,c=new Map;return a.forEach((e=>{const t=e.id;if(!d.has(t))return void this.addChange(t,c,i.DashboardLayoutChange.Removed);const r=d.get(t);e.isFloating!==r.isFloating&&this.addChange(t,c,i.DashboardLayoutChange.IsFloatingChanged),e.isVisible!==r.isVisible&&this.addChange(t,c,i.DashboardLayoutChange.IsVisibleChanged),e.name!==r.name&&this.addChange(t,c,i.DashboardLayoutChange.NameChanged),e.position.x===r.position.x&&e.position.y===r.position.y||this.addChange(t,c,i.DashboardLayoutChange.PositionChanged),e.size.width===r.size.width&&e.size.height===r.size.height||this.addChange(t,c,i.DashboardLayoutChange.SizeChanged)})),l.forEach((e=>{n.has(e.id)||this.addChange(e.id,c,i.DashboardLayoutChange.Added)})),s!==t&&(0!==t&&this.addChange(t,c,i.DashboardLayoutChange.Selected),0!==s&&this.addChange(s,c,i.DashboardLayoutChange.Deselected)),r&&o!==r&&this.addChange(0,c,i.DashboardLayoutChange.DashboardChanged),c}addChange(e,t,r){t.has(e)||t.set(e,[]),t.get(e).push(r)}moveAndResizeDashboardObjectsAsync(e){return l.ApiServiceRegistry.get(this._registryId).getService("zone-service").moveAndResizeAsync(this.name,this.zoneMap,e)}replayAnimationAsync(e){return l.ApiServiceRegistry.get(this._registryId).getService("animation-service").replayAsync(e)}getFiltersAsync(){return this.verifyActiveSheetOrEmbeddedInActiveStoryPoint(),l.ApiServiceRegistry.get(this._registryId).getService("filter-service").getDashboardFiltersAsync()}applyFilterAsync(e,t,r,n){if(c.ErrorHelpers.verifyEnumValue(r,a.FilterUpdateType,"FilterUpdateType"),c.ErrorHelpers.verifyStringParameter(e,"fieldName"),!Array.isArray(t))throw new d.TableauError(i.ErrorCodes.InvalidParameter,"values parameter for applyDashboardFilterAsync must be an array");return this.verifyActiveSheetOrEmbeddedInActiveStoryPoint(),l.ApiServiceRegistry.get(this._registryId).getService("filter-service").applyDashboardFilterAsync(e,t,r,n)}getWorksheetNamesFromZones(){const e=[];for(const t of this._zones){if(t.zoneType!==n.DashboardObjectType.Worksheet)continue;const r=t.sheetInfo?t.sheetInfo.name:t.name;e.push(r)}return e}verifyActiveSheetOrEmbeddedInActiveStoryPoint(){const e=this.active,t=null!=this.parentStoryPoint&&this.parentStoryPoint.active;if(!e&&!t)throw new d.TableauError(i.SharedErrorCodes.NotActiveSheet,"Operation not allowed on non-active sheet")}}t.DashboardImpl=g},6488:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DashboardObjectImpl=class{constructor(e,t,r,a,i,n,s,o,l,d){this._dashboardImpl=e,this._type=t,this._position=r,this._size=a,this._worksheetImpl=i,this._name=n,this._isFloating=s,this._isVisible=o,this._id=l,this._fieldId=d}get dashboardImpl(){return this._dashboardImpl}get type(){return this._type}get position(){return this._position}get size(){return this._size}get worksheetImpl(){return this._worksheetImpl}get name(){return this._name}get isFloating(){return this._isFloating}get isVisible(){return this._isVisible}get id(){return this._id}get fieldId(){return this._fieldId}}},2180:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(716),n=r(1072),s=r(624),o=r(3008),l=r(7603),d=r(7480),c=r(5288);t.DataSourceImpl=class{constructor(e,t){this._dataSourceInfo=e,this._registryId=t,this._fields=e.fields.map((e=>{const t=new c.FieldImpl(e,this);return new n.Field(t)}))}get name(){return this._dataSourceInfo.name}get id(){return this._dataSourceInfo.id}get extractUpdateTime(){return this._dataSourceInfo.extractUpdateTime}get fields(){return this._fields}get isExtract(){return this._dataSourceInfo.isExtract}get isPublished(){return this._dataSourceInfo.isPublished}publishedUrl(){return this._dataSourceInfo.publishedUrl}getMaxPageRowLimit(){return 1e4}refreshAsync(){return o.ApiServiceRegistry.get(this._registryId).getService("data-source-service").refreshAsync(this._dataSourceInfo.id)}getConnectionSummariesAsync(){return o.ApiServiceRegistry.get(this._registryId).getService("data-source-service").getConnectionSummariesAsync(this._dataSourceInfo.id).then((e=>e.map((e=>new i.ConnectionSummary(e)))))}getActiveTablesAsync(){return o.ApiServiceRegistry.get(this._registryId).getService("data-source-service").getActiveTablesAsync(this._dataSourceInfo.id).then((e=>e.map((e=>new l.TableSummary(e)))))}getUnderlyingDataAsync(e){return e=e||{},o.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getDataSourceDataAsync(this.id,!!e.ignoreAliases,e.maxRows||0,e.columnsToInclude||[],e.columnsToIncludeById||[],e.includeDataValuesOption||a.IncludeDataValuesOption.AllValues)}getLogicalTableDataAsync(e,t){return t=t||{},o.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getLogicalTableDataAsync(this.id,e,!!t.ignoreAliases,t.maxRows||0,t.columnsToInclude||[],t.columnsToIncludeById||[],t.includeDataValuesOption||a.IncludeDataValuesOption.AllValues)}getLogicalTableDataReaderAsync(e,t,r){return r=r||{},o.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getLogicalTableDataReaderAsync(this.id,e,t||this.getMaxPageRowLimit(),!!r.ignoreAliases,r.columnsToIncludeById||[],r.includeDataValuesOption||a.IncludeDataValuesOption.AllValues)}initializeWithPublicInterfaces(e){d.ErrorHelpers.verifyInternalValue(e,"dataSource"),this._fields=this._dataSourceInfo.fields.map((t=>{const r=new c.FieldImpl(t,e);return new n.Field(r)}))}getLogicalTablesAsync(){return o.ApiServiceRegistry.get(this._registryId).getService("data-source-service").getLogicalTablesAsync(this.id).then((e=>e.map((e=>new s.LogicalTable(e)))))}}},5288:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(6557);t.FieldImpl=class{constructor(e,t){this._fieldInfo=e,this._parentDataSource=t}get name(){return this._fieldInfo.name}get id(){return this._fieldInfo.id}get description(){return this._fieldInfo.description}get dataType(){var e;return null!=(e=this._fieldInfo.dataType)?e:a.DataType.Unknown}get aggregation(){return n.InternalToExternalEnumMappings.fieldAggregationType.convert(this._fieldInfo.aggregation)}get dataSource(){if(!this._parentDataSource)throw new Error("Data source information is not available for this field. Please use getFieldAsync method to get field's data source information");return this._parentDataSource}get role(){return n.InternalToExternalEnumMappings.fieldRoleType.convert(this._fieldInfo.role)}get columnType(){let e=this._fieldInfo.columnType||i.ColumnType.Unknown;return n.InternalToExternalEnumMappings.columnType.convert(e)}get isCalculatedField(){return this._fieldInfo.isCalculatedField}get isCombinedField(){return this._fieldInfo.isCombinedField}get isGenerated(){return this._fieldInfo.isGenerated}get isGeospatial(){return this._fieldInfo.isGeospatial}get isHidden(){return this._fieldInfo.isHidden}get isPresentOnPublishedDatasource(){return this._fieldInfo.isPresentOnPublishedDatasource}}},8552:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(6557),n=r(3008),s=r(8052),o=r(7480),l=r(1172);t.ParameterImpl=class{constructor(e,t){this._registryId=t,this.setParameterInfo(e)}get name(){return this._parameterInfo.name}get currentValue(){return s.DataValueFactory.MakeParameterDataValue(this._parameterInfo.currentValue,this._parameterInfo.dataType)}get dataType(){return i.InternalToExternalEnumMappings.dataType.convert(this._parameterInfo.dataType)}get id(){return this._globalFieldName}get allowableValues(){return this._allowableValues}changeValueAsync(e){o.ErrorHelpers.verifyParameter(e,"newValue");const t=l.Param.serializeParameterValue(e);return n.ApiServiceRegistry.get(this._registryId).getService("parameters-service").changeParameterValueAsync(this._globalFieldName,t).then((e=>(this.setParameterInfo(e),this.currentValue)))}setParameterInfo(e){this._parameterInfo=e,this._globalFieldName=e.fieldName;const t=i.InternalToExternalEnumMappings.allowableValues.convert(e.allowableValuesType);let r,n,o,l,d;t===a.ParameterValueType.List?r=(e.allowableValues||[]).map((t=>s.DataValueFactory.MakeParameterDataValue(t,e.dataType))):t===a.ParameterValueType.Range&&(n=e.minValue&&s.DataValueFactory.MakeParameterDataValue(e.minValue,e.dataType),o=e.maxValue&&s.DataValueFactory.MakeParameterDataValue(e.maxValue,e.dataType),l=e.stepSize,d=e.dateStepPeriod&&i.InternalToExternalEnumMappings.dateStepPeriod.convert(e.dateStepPeriod)),this._allowableValues={type:t,allowableValues:r,minValue:n,maxValue:o,stepSize:l,dateStepPeriod:d}}}},8332:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3008),n=r(6664),s=r(7480),o=r(1172),l=r(2780);class d{constructor(e,t){this._sheetInfoImpl=e,this._registryId=t}get name(){return this._sheetInfoImpl.name}get sheetType(){return this._sheetInfoImpl.sheetType}get sheetPath(){return this._sheetInfoImpl.sheetPath}get size(){return this._sheetInfoImpl.sheetSize}get hidden(){if(void 0!==this._sheetInfoImpl.isHidden)return this._sheetInfoImpl.isHidden;throw new n.TableauError(a.EmbeddingErrorCodes.ImplementationError,"isHidden not implemented")}get active(){if(void 0!==this._sheetInfoImpl.isActive)return this._sheetInfoImpl.isActive;throw new n.TableauError(a.EmbeddingErrorCodes.ImplementationError,"active not implemented")}set active(e){void 0!==this._sheetInfoImpl.isActive&&(this._sheetInfoImpl.active=e)}get index(){if(void 0!==this._sheetInfoImpl.index)return this._sheetInfoImpl.index;throw new n.TableauError(a.EmbeddingErrorCodes.ImplementationError,"index not implemented")}get url(){if(void 0!==this._sheetInfoImpl.url)return this._sheetInfoImpl.url;throw new n.TableauError(a.EmbeddingErrorCodes.ImplementationError,"url not implemented")}getSheetSize(){if(!l.SheetUtils.isValidSheetSize(this.size))throw new n.TableauError(a.EmbeddingErrorCodes.InternalError,"size is not of type SheetSize");return this.size}findParameterAsync(e){return s.ErrorHelpers.verifyParameter(e,"parameterName"),i.ApiServiceRegistry.get(this._registryId).getService("parameters-service").findParameterByNameAsync(e)}getParametersAsync(){return i.ApiServiceRegistry.get(this._registryId).getService("parameters-service").getParametersForSheetAsync(this.sheetPath)}changeSizeAsync(e){const t=new n.TableauError(a.EmbeddingErrorCodes.InvalidSize,"Invalid sheet size parameter");if(!e||!e.behavior)throw t;const r=this.normalizeSheetSize(e),s=r.behavior===a.SheetSizeBehavior.Automatic;if(!s&&!r.minSize&&!r.maxSize)throw t;if(!s&&this.sheetType===a.SheetType.Worksheet)throw new n.TableauError(a.EmbeddingErrorCodes.InvalidSizeBehaviorOnWorksheet,"Only SheetSizeBehavior.Automatic is allowed on Worksheets");if(s&&this.getSheetSize().behavior===r.behavior)return Promise.resolve(e);const o=this.processNewSize(r);return i.ApiServiceRegistry.get(this._registryId).getService("size-service").changeSizeAsync(this.name,o).then((()=>i.ApiServiceRegistry.get(this._registryId).getService("client-info-service").getClientInfoAsync().then((e=>{const t=e.publishedSheets.find((e=>e.name===this.name));if(!t)throw new n.TableauError(a.SharedErrorCodes.InternalError,`Can't find sheet with name ${this.name}`);const r=l.SheetUtils.getSheetSizeFromSizeConstraints(t.sizeConstraint);return this._sheetInfoImpl.sheetSize=r,r}))))}normalizeSheetSize(e){const{behavior:t}=e;return s.ErrorHelpers.verifyEnumValue(t,a.SheetSizeBehavior,"SheetSizeBehavior"),{behavior:t,minSize:d.parseDimensions(e.minSize),maxSize:d.parseDimensions(e.maxSize)}}processNewSize(e){var t,r,i,s;const{behavior:l,minSize:d,maxSize:c}=e,u=!o.Param.isNullOrUndefined(null===(t=d)||void 0===t?void 0:t.width),h=!o.Param.isNullOrUndefined(null===(r=d)||void 0===r?void 0:r.height),p=!o.Param.isNullOrUndefined(null===(i=c)||void 0===i?void 0:i.width),m=!o.Param.isNullOrUndefined(null===(s=c)||void 0===s?void 0:s.height),g=u&&h,y=p&&m;switch(l){case a.SheetSizeBehavior.Automatic:return{behavior:l};case a.SheetSizeBehavior.AtMost:{if(!c||!y)throw new n.TableauError(a.EmbeddingErrorCodes.MissingMaxSize,"Missing maxSize for SheetSizeBehavior.AtMost");const e={width:c.width,height:c.height};if(e.width<0||e.height<0)throw new n.TableauError(a.EmbeddingErrorCodes.InvalidSize,"Size value cannot be less than zero");return{behavior:l,maxSize:e}}case a.SheetSizeBehavior.AtLeast:{if(!d||!g)throw new n.TableauError(a.EmbeddingErrorCodes.MissingMinSize,"Missing minSize for SheetSizeBehavior.AtLeast");const e={width:d.width,height:d.height};if(e.width<0||e.height<0)throw new n.TableauError(a.EmbeddingErrorCodes.InvalidSize,"Size value cannot be less than zero");return{behavior:l,minSize:e}}case a.SheetSizeBehavior.Range:{if(!(d&&c&&g&&y))throw new n.TableauError(a.EmbeddingErrorCodes.MissingMinMaxSize,"Missing minSize or maxSize for SheetSizeBehavior.Range");const e={width:d.width,height:d.height},t={width:c.width,height:c.height};if(e.width<0||e.height<0||t.width<0||t.height<0||e.width>t.width||e.height>t.height)throw new n.TableauError(a.EmbeddingErrorCodes.InvalidSize,"Missing minSize or maxSize for SheetSizeBehavior.Range");return{behavior:l,minSize:e,maxSize:t}}case a.SheetSizeBehavior.Exactly:if(d&&c){if(g&&y){const e={width:d.width,height:d.height},t={width:c.width,height:c.height};if(e.width!==t.width||e.height!==t.height)throw new n.TableauError(a.EmbeddingErrorCodes.InvalidSize,"Conflicting size values for SheetSizeBehavior.Exactly");return{behavior:l,minSize:e,maxSize:t}}if(g){const e={width:d.width,height:d.height};return{behavior:l,minSize:e,maxSize:e}}if(y){const e={width:c.width,height:c.height};return{behavior:l,minSize:e,maxSize:e}}}throw new n.TableauError(a.EmbeddingErrorCodes.InvalidSize,"Invalid sheet size parameter");default:throw new n.TableauError(a.SharedErrorCodes.InternalError,`Unsupported sheet size behavior: ${l}`)}}}t.SheetImpl=d,d.parseDimensions=e=>{const t={width:void 0,height:void 0};if(!e)return t;const{success:r,parsed:a}=o.Param.tryParseNumber(e.width),{success:i,parsed:n}=o.Param.tryParseNumber(e.height);return r&&i?{width:a,height:n}:r?{width:a}:i?{height:n}:t}},8736:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419);t.SheetInfoImpl=class{constructor(e,t,r,a,i,n,s){this._name=e,this._sheetType=t,this._sheetSize=r,this._index=a,this._isActive=i,this._isHidden=n,this._url=s}get name(){return this._name}set name(e){this._name=e}get sheetSize(){return this._sheetSize}set sheetSize(e){this._sheetSize=e}get sheetType(){return this._sheetType}get sheetPath(){return{sheetName:this.name,isDashboard:this.sheetType===a.SheetType.Dashboard}}get index(){return this._index}get isActive(){return this._isActive}set active(e){this._isActive=e}get isHidden(){return this._isHidden}get url(){return this._url}}},5144:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SingleEventManagerImpl=class{constructor(e){this._eventType=e,this._handlers=[]}get eventType(){return this._eventType}addEventListener(e){return this._handlers.push(e),()=>this.removeEventListener(e)}removeEventListener(e){const t=this._handlers.length;return this._handlers=this._handlers.filter((t=>t!==e)),t>this._handlers.length}triggerEvent(e){for(const t of this._handlers)try{t(e())}catch(e){continue}}}},6804:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3008),n=r(6664),s=r(7480),o=r(3036),l=r(8332),d=r(2608),c=r(6068);class u extends l.SheetImpl{constructor(e,t,r,a){super(e,a),this._sheetInfoImpl=e,this._publishedSheetInfos=r,this._registryId=a,this._storyPointInfoImpls=[],this._deferred=new o.ShortLivedDeferred,this.initializeStory(t)}initializeStory(e){e.storyPoints.forEach((t=>{const r=t.index===e.activeStoryPointIndex,a=new c.StoryPointInfoImpl(t.caption,t.index,t.storyPointId,r,t.updated,this);this._storyPointInfoImpls.push(a),r&&(this._activeStoryPointImpl=new d.StoryPointImpl(a,this._publishedSheetInfos,this._registryId,t.containedSheetInfo))}))}updateStoryInfo(e,t){if(!this._storyPointInfoImpls)return;let r=this._storyPointInfoImpls[e];if(r.storyPointId!==t.storyPointId)throw new n.TableauError(a.EmbeddingErrorCodes.StoryPointIdMismatch,`We should not be updating a story point when the IDs don't match. Existing storyPointID=${r.storyPointId}, newStoryPointID=${t.storyPointId}`);r.caption=t.caption,r.updated=t.updated,this._activeStoryPointImpl.storyPointId===t.storyPointId&&(this._activeStoryPointImpl.updated=r.updated)}updateStory(e){this._storyPointInfoImpls&&(this._storyPointInfoImpls.forEach((t=>{t.storyPointId===e.storyPointId?(t.caption=e.caption,t.index=e.index,t.active=!0,t.updated=e.updated,this._activeStoryPointImpl=new d.StoryPointImpl(t,this._publishedSheetInfos,this._registryId,e.containedSheetInfo)):t.active=!1})),this.activeStoryPoint&&this._deferred.resolve(this.activeStoryPoint))}get activeStoryPoint(){return this._activeStoryPointImpl}get storyPointsInfo(){return this._storyPointInfoImpls}get isActive(){return this._sheetInfoImpl.active}get isHidden(){return!!this._sheetInfoImpl.isHidden}activateNextStoryPointAsync(){if(this._activeStoryPointImpl.index===this._storyPointInfoImpls.length-1)return Promise.resolve(this._activeStoryPointImpl);let e=this._deferred.getNewPromiseOrThrowIfBusy();return i.ApiServiceRegistry.get(this._registryId).getService("story-activation-service").activateNextStoryPointAsync(),e}activatePreviousStoryPointAsync(){if(0===this._activeStoryPointImpl.index)return Promise.resolve(this._activeStoryPointImpl);let e=this._deferred.getNewPromiseOrThrowIfBusy();return i.ApiServiceRegistry.get(this._registryId).getService("story-activation-service").activatePreviousStoryPointAsync(),e}activateStoryPointAsync(e){if(s.ErrorHelpers.verifyParameter(e,"index"),s.ErrorHelpers.verifyParameterType(e,"number","index"),e<0||e>=this._storyPointInfoImpls.length)throw new n.TableauError(a.EmbeddingErrorCodes.IndexOutOfRange,"The index passed to this command is out of range.");if(e===this._activeStoryPointImpl.index)return Promise.resolve(this._activeStoryPointImpl);let t=this._deferred.getNewPromiseOrThrowIfBusy();return i.ApiServiceRegistry.get(this._registryId).getService("story-activation-service").activateStoryPointAsync(e),t}revertStoryPointAsync(e){if(s.ErrorHelpers.verifyParameter(e,"index"),s.ErrorHelpers.verifyParameterType(e,"number","index"),e<0||e>=this._storyPointInfoImpls.length)throw new n.TableauError(a.EmbeddingErrorCodes.IndexOutOfRange,"The index passed to this command is out of range.");return i.ApiServiceRegistry.get(this._registryId).getService("story-activation-service").revertStoryPointAsync(e).then((e=>(this.updateStoryInfo(e.index,e),new c.StoryPointInfoImpl(e.caption,e.index,e.storyPointId,!1,e.updated,this))))}clearPendingPromises(){this._deferred&&this._deferred.reject("All pending promises cleared")}}t.StoryImpl=u},2608:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(6664),n=r(2780),s=r(1940),o=r(8736),l=r(6500);t.StoryPointImpl=class{constructor(e,t,r,a){this._storyPointInfoImpl=e,a&&(this._containedSheetImpl=this.createContainedSheet(a,t,r))}get index(){return this._storyPointInfoImpl.index}get caption(){return this._storyPointInfoImpl.caption}get active(){return this._storyPointInfoImpl.active}get updated(){return this._storyPointInfoImpl.updated}set updated(e){this._storyPointInfoImpl.updated=e}get parentStory(){return this._storyPointInfoImpl.parentStory}get containedSheet(){return this._containedSheetImpl}get storyPointId(){return this._storyPointInfoImpl.storyPointId}createContainedSheet(e,t,r){const d=n.SheetUtils.getPublishedSheetInfoByName(e.name,t),c=n.SheetUtils.createAutomaticSize(),u=void 0===d,h=d?d.url:"",p=new o.SheetInfoImpl(e.name,n.SheetUtils.getSheetTypeEnum(e.sheetType),c,-1,!1,u,h);let m;switch(p.sheetType){case a.SheetType.Worksheet:{const e={worksheet:p.name};m=new l.WorksheetImpl(p,r,e,null,this);break}case a.SheetType.Dashboard:{const t={sheetName:p.name,isDashboard:!0};m=new s.DashboardImpl(p,e.dashboardZones,t,r,this);break}default:throw new i.TableauError(a.SharedErrorCodes.ServerError,"Invalid SheetType")}return m}}},6068:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.StoryPointInfoImpl=class{constructor(e,t,r,a,i,n){this._caption=e,this._index=t,this._storyPointId=r,this._active=a,this._updated=i,this._parentStoryImpl=n}get caption(){return this._caption}set caption(e){this._caption=e}get index(){return this._index}set index(e){this._index=e}get storyPointId(){return this._storyPointId}get active(){return this._active}set active(e){this._active=e}get updated(){return this._updated}set updated(e){this._updated=e}get parentStory(){return this._parentStoryImpl}}},3044:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.WorkbookImpl=class{}},6500:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(7419),n=r(8340),s=r(624),o=r(3483),l=r(3008),d=r(6664),c=r(7480),u=r(2180),h=r(8332);class p extends h.SheetImpl{constructor(e,t,r,a,i,n=null,s=null){super(e,t),this._visualId=r,this._parentDashboardImpl=a,this._parentStoryPointImpl=i,this._backgroundColor=n,this._formatting=s}get parentDashboard(){return this._parentDashboardImpl}get parentStoryPoint(){return this._parentStoryPointImpl}get visualId(){return this._visualId}getMaxPageRowLimit(){return 1e4}get backgroundColor(){return this._backgroundColor}get formatting(){return this._formatting}applyFilterAsync(e,t,r,i){return c.ErrorHelpers.verifyEnumValue(r,a.FilterUpdateType,"Contract.FilterUpdateType"),this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("filter-service").applyFilterAsync(this.visualId,e,t,r,i)}applyRangeFilterAsync(e,t){return c.ErrorHelpers.verifyParameter(e,"fieldName"),c.ErrorHelpers.verifyParameter(t,"filterOptions"),t.nullOption?c.ErrorHelpers.verifyEnumValue(t.nullOption,i.FilterNullOption,"FilterNullOption"):c.ErrorHelpers.verifyRangeParamType(t.min,t.max),this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("filter-service").applyRangeFilterAsync(this.visualId,e,t)}applyHierarchicalFilterAsync(e,t,r,n){if(c.ErrorHelpers.verifyParameter(e,"fieldName"),c.ErrorHelpers.verifyParameter(t,"values"),c.ErrorHelpers.verifyEnumValue(r,a.FilterUpdateType,"Contract.FilterUpdateType"),!Array.isArray(t)&&!t.levels)throw new d.TableauError(i.ErrorCodes.InvalidParameter,"values parameter for applyHierarchicalFilterAsync must be an array or contain a levels key");return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("filter-service").applyHierarchicalFilterAsync(this.visualId,e,t,r,n)}clearFilterAsync(e){return c.ErrorHelpers.verifyParameter(e,"fieldName"),this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("filter-service").clearFilterAsync(this.visualId,e)}applyRelativeDateFilterAsync(e,t){return c.ErrorHelpers.verifyStringParameter(e,"fieldName"),c.ErrorHelpers.verifyParameter(t,"options"),c.ErrorHelpers.verifyEnumValue(t.periodType,i.PeriodType,"PeriodType"),c.ErrorHelpers.verifyEnumValue(t.rangeType,i.DateRangeType,"DateRangeType"),this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("filter-service").applyRelativeDateFilterAsync(this.visualId,e,t)}getDataSourcesAsync(){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("data-source-service").getDataSourcesAsync(this.visualId).then((e=>{const t=e,r=t.worksheetDataSchemaMap[this.name],a=[],i=r.primaryDataSource;a.push(this.createDataSourceFromInfo(t.dataSources[i]));for(const e of r.referencedDataSourceList)e!==i&&a.push(this.createDataSourceFromInfo(t.dataSources[e]));return a}))}getFiltersAsync(){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("filter-service").getFiltersAsync(this.visualId)}getSelectedMarksAsync(){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getSelectedMarksAsync(this.visualId)}getHighlightedMarksAsync(){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getHighlightedMarksAsync(this.visualId)}getSummaryDataAsync(e){var t;return this.verifyActiveSheet(),e=e||{},l.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getUnderlyingDataAsync(this.visualId,o.GetDataType.Summary,!!e.ignoreAliases,!!e.ignoreSelection,!0,e.columnsToIncludeById||[],e.maxRows||0,e.includeDataValuesOption||i.IncludeDataValuesOption.AllValues,null!=(t=e.applyWorksheetFormatting)&&t)}getSummaryDataReaderAsync(e,t){var r;return this.verifyActiveSheet(),t=t||{},l.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getSummaryDataReaderAsync(this.visualId,e||this.getMaxPageRowLimit(),!!t.ignoreAliases,!!t.ignoreSelection,!0,t.columnsToIncludeById||[],t.includeDataValuesOption||i.IncludeDataValuesOption.AllValues,null!=(r=t.applyWorksheetFormatting)&&r)}getVisualSpecificationAsync(){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("visual-model-service").getVisualSpecificationAsync(this.visualId)}addMarksCardFieldsAsync(e,t,r,a){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("visual-model-service").addMarksCardFieldsAsync(this.visualId,e,t,r,a)}moveMarksCardFieldAsync(e,t,r,a){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("visual-model-service").moveMarksCardFieldAsync(this.visualId,e,t,r,a)}spliceMarksCardFieldsAsync(e,t,r,a,i){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("visual-model-service").spliceMarksCardFieldsAsync(this.visualId,e,t,r,a,i)}getSummaryColumnsInfoAsync(){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getSummaryColumnsInfoAsync(this.visualId)}getUnderlyingDataAsync(e){var t;return this.verifyActiveSheet(),e=e||{},l.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getUnderlyingDataAsync(this.visualId,o.GetDataType.Underlying,!!e.ignoreAliases,!!e.ignoreSelection,!!e.includeAllColumns,e.columnsToIncludeById||[],e.maxRows||0,e.includeDataValuesOption||i.IncludeDataValuesOption.AllValues,null!=(t=e.applyWorksheetFormatting)&&t)}getUnderlyingTablesAsync(){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("data-source-service").getUnderlyingTablesAsync(this.visualId).then((e=>e.map((e=>new s.LogicalTable(e)))))}getUnderlyingTableDataAsync(e,t){var r;return this.verifyActiveSheet(),t=t||{},l.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getUnderlyingTableDataAsync(this.visualId,e,!!t.ignoreAliases,!!t.ignoreSelection,!!t.includeAllColumns,t.columnsToIncludeById||[],t.maxRows||0,t.includeDataValuesOption||i.IncludeDataValuesOption.AllValues,null!=(r=t.applyWorksheetFormatting)&&r)}getUnderlyingTableDataReaderAsync(e,t,r){var a;return this.verifyActiveSheet(),r=r||{},l.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getUnderlyingTableDataReaderAsync(this.visualId,e,t||this.getMaxPageRowLimit(),!!r.ignoreAliases,!!r.ignoreSelection,!!r.includeAllColumns,r.columnsToIncludeById||[],r.includeDataValuesOption||i.IncludeDataValuesOption.AllValues,null!=(a=r.applyWorksheetFormatting)&&a)}clearSelectedMarksAsync(){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("selection-service").clearSelectedMarksAsync(this.visualId)}selectMarksByValueAsync(e,t){return c.ErrorHelpers.verifyParameter(e,"fieldName"),c.ErrorHelpers.verifyEnumValue(t,i.SelectionUpdateType,"SelectionUpdateType"),this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("selection-service").selectMarksByValueAsync(this.visualId,e,t)}selectMarksByIdAsync(e,t){return c.ErrorHelpers.verifyParameter(e,"fieldName"),c.ErrorHelpers.verifyEnumValue(t,i.SelectionUpdateType,"SelectionUpdateType"),this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("selection-service").selectMarksByIdAsync(this.visualId,e,t)}annotateMarkAsync(e,t){return c.ErrorHelpers.verifyParameter(e,"mark"),this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("annotation-service").annotateMarkAsync(this.visualId,e,t)}getAnnotationsAsync(){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("annotation-service").getAnnotationsAsync(this.visualId)}removeAnnotationAsync(e){return c.ErrorHelpers.verifyParameter(e,"annotation"),this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("annotation-service").removeAnnotationAsync(this.visualId,e)}appendContextMenuAsync(e,t){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("external-context-menu-service").appendContextMenuAsync(this.visualId.worksheet,e,t)}removeContextMenuAsync(e,t){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("external-context-menu-service").removeContextMenuAsync(this.visualId.worksheet,e,t)}executeContextMenuAsync(e,t){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("external-context-menu-service").executeContextMenuAsync(this.visualId.worksheet,e,t)}renameContextMenuAsync(e,t,r){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("external-context-menu-service").renameContextMenuAsync(this.visualId.worksheet,e,t,r)}hoverTupleAsync(e,t,r){return this.isInsideDashboardExtension()?Promise.reject(new d.TableauError(a.SharedErrorCodes.ImplementationError,"hoverTupleAsync is not supported in dashboard extensions")):l.ApiServiceRegistry.get(this._registryId).getService("selection-service").hoverTupleAsync(this.visualId,e,t,r)}selectTuplesAsync(e,t,r){return this.isInsideDashboardExtension()?Promise.reject(new d.TableauError(a.SharedErrorCodes.ImplementationError,"selectTuplesAsync is not supported in dashboard extensions")):l.ApiServiceRegistry.get(this._registryId).getService("selection-service").selectTuplesAsync(this.visualId,e,t,r)}getTooltipTextAsync(e){return this.isInsideDashboardExtension()?Promise.reject(new d.TableauError(a.SharedErrorCodes.ImplementationError,"getTooltipTextAsync is not supported in dashboard extensions")):l.ApiServiceRegistry.get(this._registryId).getService("accessibility").getTooltipTextAsync(this.visualId,e)}leaveMarkNavigationAsync(){return this.isInsideDashboardExtension()?Promise.reject(new d.TableauError(a.SharedErrorCodes.ImplementationError,"leaveMarkNavigationAsync is not supported in dashboard extensions")):l.ApiServiceRegistry.get(this._registryId).getService("accessibility").leaveMarkNavigationAsync(this.visualId)}editAliasesDialogAsync(e){return l.ApiServiceRegistry.get(this._registryId).getService("visual-model-service").editAliasesDialogAsync(e)}createDataSourceFromInfo(e){const t=new u.DataSourceImpl(e,this._registryId),r=new n.DataSource(t);return t.initializeWithPublicInterfaces(r),r}verifyActiveSheet(){const e=this.active,t=this.isInsideActiveDashboard(),r=this.isInsideActiveStoryPoint();if(!e&&!t&&!r)throw new d.TableauError(i.SharedErrorCodes.NotActiveSheet,"Operation not allowed on non-active sheet")}isInsideActiveStoryPoint(){return this._parentStoryPointImpl&&this._parentStoryPointImpl.active}isInsideActiveDashboard(){return this._parentDashboardImpl&&this._parentDashboardImpl.active}isInsideDashboardExtension(){return null!==this._parentDashboardImpl}}t.WorksheetImpl=p},624:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.LogicalTable=class{constructor(e){this._logicalTable=e}get id(){return this._logicalTable.id}get caption(){return this._logicalTable.caption}}},5064:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.TooltipTextRequestModel=class{constructor(e,t){this.visualIdPresModel=e,this.tupleId=t}}},6296:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3008),n=r(7480);class s{constructor(e,t,r,a,i){this._worksheetName=e,this._fieldName=t,this._filterType=r,this._fieldId=a,this._registryId=i}get worksheetName(){return this._worksheetName}get fieldName(){return this._fieldName}get fieldId(){return this._fieldId}get filterType(){return this._filterType}getFieldAsync(){return i.ApiServiceRegistry.get(this._registryId).getService("data-source-service").getFieldAsync(this._fieldId)}getAppliedWorksheetsAsync(){return i.ApiServiceRegistry.get(this._registryId).getService("filter-service").getAppliedWorksheetsAsync(this._worksheetName,this._fieldId)}setAppliedWorksheetsAsync(e){n.ErrorHelpers.verifyParameter(e,"applyToWorksheets");const t=new Set(e);return i.ApiServiceRegistry.get(this._registryId).getService("filter-service").setAppliedWorksheetsAsync(this._worksheetName,this._fieldName,this._fieldId,Array.from(t))}}t.Filter=s,t.CategoricalFilter=class extends s{constructor(e,t,r,a,i,n,s,o){super(e,t,a,r,i),this._appliedValues=n,this._isExcludeMode=s,this._isAllSelected=o}get isAllSelected(){return this._isAllSelected}get appliedValues(){return this._appliedValues}get isExcludeMode(){return this._isExcludeMode}getDomainAsync(e){return e||(e=a.FilterDomainType.Relevant),n.ErrorHelpers.verifyEnumValue(e,a.FilterDomainType,"FilterDomainType"),i.ApiServiceRegistry.get(this._registryId).getService("filter-service").getCategoricalDomainAsync(this._worksheetName,this._fieldId,e)}},t.HierarchicalDataValue=class{constructor(e,t,r){this._value=e,this._hierarchicalPath=t,this._level=r}get value(){return this._value}get hierarchicalPath(){return this._hierarchicalPath}get level(){return this._level}},t.HierarchicalLevelDetail=class{constructor(e,t){this._name=e,this._levelSelectionState=t}get name(){return this._name}get levelSelectionState(){return this._levelSelectionState}},t.HierarchicalFilter=class extends s{constructor(e,t,r,a,i,n,s,o,l,d,c){super(e,t,a,r,i),this._dimensionName=n,this._hierarchyCaption=s,this._numberOfLevels=o,this._levelDetails=l,this._appliedValues=d,this._isAllSelected=c}getDomainAsync(e){throw new Error("Method not implemented.")}get dimensionName(){return this._dimensionName}get hierarchyCaption(){return this._hierarchyCaption}get numberOfLevels(){return this._numberOfLevels}get levelDetails(){return this._levelDetails}get isAllSelected(){return this._isAllSelected}get appliedValues(){return this._appliedValues}},t.RangeFilter=class extends s{constructor(e,t,r,a,i,n,s,o){super(e,t,a,r,i),this._min=n,this._max=s,this._includeNullValues=o}get minValue(){return this._min}get maxValue(){return this._max}get includeNullValues(){return this._includeNullValues}getDomainAsync(e){const t=i.ApiServiceRegistry.get(this._registryId).getService("filter-service");return e||(e=a.FilterDomainType.Relevant),n.ErrorHelpers.verifyEnumValue(e,a.FilterDomainType,"FilterDomainType"),t.getRangeDomainAsync(this._worksheetName,this._fieldId,e)}},t.RelativeDateFilter=class extends s{constructor(e,t,r,a,i,n,s,o,l){super(e,t,a,r,i),this._anchorDate=n,this._periodType=s,this._rangeType=o,this._rangeN=l}get anchorDate(){return this._anchorDate}get periodType(){return this._periodType}get rangeType(){return this._rangeType}get rangeN(){return this._rangeN}},t.CategoricalDomain=class{constructor(e,t){this._values=e,this._domainType=t}get values(){return this._values}get type(){return this._domainType}},t.RangeDomain=class{constructor(e,t,r){this._min=e,this._max=t,this._domainType=r}get type(){return this._domainType}get min(){return this._min}get max(){return this._max}}},5068:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DataTable=class{constructor(e,t,r,a,i,n){this._data=e,this._columns=t,this._totalRowCount=r,this._isTotalRowCountLimited=a,this._isSummaryData=i,this._marksInfo=n,this._name=i?"Summary Data Table":"Underlying Data Table"}get name(){return this._name}get data(){return this._data}get columns(){return this._columns}get marksInfo(){return this._marksInfo}get totalRowCount(){return this._totalRowCount}get isTotalRowCountLimited(){return this._isTotalRowCountLimited}get isSummaryData(){return this._isSummaryData}},t.MarkInfo=class{constructor(e,t,r){this._type=e,this._color=t,this._tupleId=r}get type(){return this._type}get color(){return this._color}get tupleId(){return this._tupleId}},t.Column=class{constructor(e,t,r,a,i){this._fieldName=e,this._fieldId=t,this._dataType=r,this._isReferenced=a,this._index=i}get fieldName(){return this._fieldName}get fieldId(){return this._fieldId}get dataType(){return this._dataType}get isReferenced(){return this._isReferenced}get index(){return this._index}},t.DataValue=class{constructor(e,t,r,a,i){this._value=e,this._nativeValue=t,this._formattedValue=r,this._aliasValue=a,this._hasAlias=i}get value(){return this._value}get nativeValue(){return this._nativeValue}get formattedValue(){return this._formattedValue}get aliasValue(){return this._aliasValue}get hasAlias(){return this._hasAlias}}},7968:function(e,t,r){"use strict";var a=this&&this.__awaiter||function(e,t,r,a){return new(r||(r=Promise))((function(i,n){function s(e){try{l(a.next(e))}catch(e){n(e)}}function o(e){try{l(a.throw(e))}catch(e){n(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(s,o)}l((a=a.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0});const i=r(3008),n=r(7480);t.DataTableReader=class{constructor(e,t,r,a){this._id=e,this._totalRowCount=t,this._pageRowCount=r,this._registryId=a,this._pageCount=Math.ceil(t/r)}get totalRowCount(){return this._totalRowCount}get pageCount(){return this._pageCount}getPageAsync(e){return n.ErrorHelpers.verifyRange(e,0,this._pageCount),i.ApiServiceRegistry.get(this._registryId).getService("get-data-service").getPageAsync(this._id,e,this._pageRowCount)}getAllPagesAsync(e){return a(this,void 0,void 0,(function*(){const t=yield this.getPageAsync(0);e=e||this.totalRowCount;const r=Math.min(e,this.totalRowCount),a=Math.ceil(r/this._pageRowCount),i=Math.min(a,400),n=i{"use strict";Object.defineProperty(t,"__esModule",{value:!0});class r{}t.SelectionModel=r;class a extends r{constructor(){super(...arguments),this.selectValues=[]}}t.ValueSelectionModel=a,t.HierarchicalSelectionModel=class extends a{},t.RangeSelectionModel=class extends r{},t.DimensionSelectionModel=class extends a{},t.TupleSelectionModel=class{constructor(){this.objectIds=[]}},t.SelectionModelsContainer=class{constructor(){this.hierModelArr=[],this.dimModelArr=[],this.quantModelArr=[]}},t.SelectTuplesInteractionModel=class{constructor(e,t=[],r,a){this.visualIdPresModel=e,this.tupleIds=t,this.selectOptions=r,this.tooltipContext=a}},t.HoverTupleInteractionModel=class{constructor(e,t,r,a){this.visualIdPresModel=e,this.tupleId=t,this.tooltipContext=r,this.allowHoverActions=a}}},6368:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Point=class{constructor(e,t){this._x=e,this._y=t}get x(){return this._x}get y(){return this._y}}},3483:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),(r=t.GetDataType||(t.GetDataType={})).Summary="summary",r.Underlying="underlying"},8672:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3008),i=r(3964),n=r(8028),s=r(1384),o=r(9196),l=r(4924),d=r(3851),c=r(8864),u=r(7712),h=r(1288),p=r(7260),m=r(8784),g=r(4109),y=r(6096),I=r(744),v=r(8856);t.registerAllSharedServices=function(e,t){a.ApiServiceRegistry.get(t).registerService(new n.AnimationServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new o.DataSourceServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new l.ExportServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new u.GetDataServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new c.FilterServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new h.NotificationServiceImpl(e)),a.ApiServiceRegistry.get(t).registerService(new p.ParametersServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new m.SelectionServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new s.AnnotationServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new v.ZoneServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new g.SizeServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new y.VisualModelServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new I.VizServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new d.ExternalContextMenuServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new i.AccessibilityServiceImpl(e,t))}},3008:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(6664);"undefined"!=typeof window&&(window.__tableauApiServiceRegistry=window.__tableauApiServiceRegistry||{});class n{constructor(){this._services={}}registerService(e){this._services[e.serviceName]=e}getService(e){if(!this._services.hasOwnProperty(e))throw new i.TableauError(a.ErrorCodes.InternalError,`Service not registered: ${e}`);return this._services[e]}}class s{static get(e){if(window.__tableauApiServiceRegistry&&window.__tableauApiServiceRegistry[e]||s.setInstance(e,new n),!window.__tableauApiServiceRegistry[e])throw new i.TableauError(a.ErrorCodes.InternalError,"Service registry failed");return window.__tableauApiServiceRegistry[e]}static setInstance(e,t){window.__tableauApiServiceRegistry||(window.__tableauApiServiceRegistry={}),window.__tableauApiServiceRegistry[e]=t}static clearRegistry(){window.__tableauApiServiceRegistry={}}constructor(){}}t.ApiServiceRegistry=s},3964:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3448),i=r(5064),n=r(1776);class s extends n.ServiceImplBase{get serviceName(){return"accessibility"}getTooltipTextAsync(e,t){let r=new i.TooltipTextRequestModel(e,t);const n={[a.ParameterId.FunctionName]:"getTooltipTextAsync",[a.ParameterId.TooltipTextRequest]:r};return this.execute(a.VerbId.GetTooltipText,n).then((e=>e.result))}leaveMarkNavigationAsync(e){const t={[a.ParameterId.FunctionName]:"leaveMarkNavigationAsync",[a.ParameterId.VisualId]:e};return this.execute(a.VerbId.RaiseLeaveMarkNavNotification,t).then((e=>{}))}}t.AccessibilityServiceImpl=s},8028:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(1044),s=r(7480),o=r(1776);class l extends o.ServiceImplBase{get serviceName(){return"animation-service"}replayAsync(e){const t={[i.ParameterId.ReplaySpeed]:1};return s.ErrorHelpers.verifyEnumValue(e,a.ReplaySpeedType,"ReplaySpeedType"),t[i.ParameterId.ReplaySpeed]=n.ExternalToInternalEnumMappings.setReplaySpeedType.convert(e),this.execute(i.VerbId.ReplayAnimation,t).then((e=>{}))}}t.AnimationServiceImpl=l},1384:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(6557),s=r(7104),o=r(6664),l=r(1776);class d extends l.ServiceImplBase{get serviceName(){return"annotation-service"}annotateMarkAsync(e,t,r){const a=this.parseMarkSelectionIds([t]),n=`${r}`,s={[i.ParameterId.FunctionName]:"annotateMarkAsync",[i.ParameterId.VisualId]:e,[i.ParameterId.AnnotateEnum]:i.AnnotateEnum.Mark,[i.ParameterId.TargetPoint]:{x:0,y:0},[i.ParameterId.SelectionList]:[a.selection],[i.ParameterId.FormattedText]:n};return this.execute(i.VerbId.CreateAnnotation,s).then((e=>{}))}getAnnotationsAsync(e){const t={[i.ParameterId.FunctionName]:"getAnnotationsAsync",[i.ParameterId.VisualId]:e};return this.execute(i.VerbId.GetAnnotations,t).then((e=>{const t=e.result;return this.annotationFilterMap(t)}))}removeAnnotationAsync(e,t){const r=this.parseAnnotationSelectionIds([t]),a={[i.ParameterId.FunctionName]:"removeAnnotationAsync",[i.ParameterId.VisualId]:e,[i.ParameterId.SelectionList]:[r.selection]};return this.execute(i.VerbId.RemoveAnnotation,a).then((e=>{}))}parseMarkSelectionIds(e){const t=[],r=new s.SelectionModelsContainer;if(e.forEach((e=>{const r=e.tupleId;if(!(null!=r&&r>0))throw new o.TableauError(a.ErrorCodes.InternalError,"invalid tupleId");t.push(r.toString())})),0!==t.length){const e=new s.TupleSelectionModel;e.selectionType="tuples",e.objectIds=t,r.selection=e}return r}parseAnnotationSelectionIds(e){const t=[],r=new s.SelectionModelsContainer;if(e.forEach((e=>{const r=e.annotationId;if(!(null!=r&&r>=0))throw new o.TableauError(a.ErrorCodes.InternalError,"invalid annotationId");t.push(r.toString())})),0!==t.length){const e=new s.TupleSelectionModel;e.selectionType="annotations",e.objectIds=t,r.selection=e}return r}mapAnnotation(e){return{annotationHTML:e.annotationText,annotationId:e.annotationId,annotationText:e.annotationPlainText,annotationType:n.InternalToExternalEnumMappings.annotationType.convert(e.annotateEnum),tupleId:e.tupleId}}annotationFilterMap(e){return e.map((e=>this.mapAnnotation(e)))}}t.AnnotationServiceImpl=d},1832:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3448),i=r(1776);class n extends i.ServiceImplBase{get serviceName(){return"client-info-service"}getClientInfoAsync(){const e=a.VerbId.GetEmbeddingClientInfo,t={[a.ParameterId.FunctionName]:"getClientInfoAsync"};return this.execute(e,t).then((e=>e.result))}}t.ClientInfoServiceImpl=n},9196:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(8340),s=r(1072),o=r(2180),l=r(5288),d=r(6664),c=r(1776);class u extends c.ServiceImplBase{constructor(e,t){super(e,t)}get serviceName(){return"data-source-service"}refreshAsync(e){const t={[i.ParameterId.FunctionName]:"refreshAsync",[i.ParameterId.DeltaTimeMs]:0,[i.ParameterId.ShouldRefreshDS]:!0};return e&&(t[i.ParameterId.DataSourceId]=e),this.execute(i.VerbId.RefreshDataSource,t).then((e=>{}))}getActiveTablesAsync(e){const t={[i.ParameterId.FunctionName]:"getActiveTablesAsync",[i.ParameterId.DataSourceId]:e};return this.execute(i.VerbId.GetActiveTables,t).then((t=>{const r=t.result;if(0===r.tables.length)throw new d.TableauError(a.ErrorCodes.UnsupportedMethodForDataSourceType,`getActiveTables is not supported for: ${e}`);return r.tables}))}getDataSourcesAsync(e){const t={[i.ParameterId.FunctionName]:"getDataSourcesAsync",[i.ParameterId.VisualId]:e};return this.execute(i.VerbId.GetDataSources,t).then((e=>e.result))}getAllDataSourcesAsync(){const e={[i.ParameterId.FunctionName]:"getAllDataSourcesAsync"};return this.execute(i.VerbId.GetAllDataSources,e).then((e=>e.result))}getConnectionSummariesAsync(e){const t={[i.ParameterId.FunctionName]:"getConnectionSummariesAsync",[i.ParameterId.DataSourceId]:e};return this.execute(i.VerbId.GetConnectionDescriptionSummaries,t).then((e=>e.result))}getFieldAsync(e){const t=i.VerbId.GetFieldAndDataSource,r={[i.ParameterId.FunctionName]:"getFieldAsync",[i.ParameterId.FieldId]:e};return this.execute(t,r).then((e=>{const t=e.result[i.ParameterId.DataSource],r=e.result[i.ParameterId.Field];return this.convertField(r,this.convertDataSource(t))}))}getLogicalTablesAsync(e){const t={[i.ParameterId.FunctionName]:"getLogicalTablesAsync",[i.ParameterId.DataSourceId]:e};return this.execute(i.VerbId.GetLogicalTables,t).then((e=>e.result))}getUnderlyingTablesAsync(e){const t={[i.ParameterId.FunctionName]:"getUnderlyingTablesAsync",[i.ParameterId.VisualId]:e};return this.execute(i.VerbId.GetUnderlyingTables,t).then((e=>e.result))}convertField(e,t){return new s.Field(new l.FieldImpl(e,t))}convertDataSource(e){return new n.DataSource(new o.DataSourceImpl(e,this._registryId))}}t.DataSourceServiceImpl=u},4924:function(e,t,r){"use strict";var a=this&&this.__awaiter||function(e,t,r,a){return new(r||(r=Promise))((function(i,n){function s(e){try{l(a.next(e))}catch(e){n(e)}}function o(e){try{l(a.throw(e))}catch(e){n(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(s,o)}l((a=a.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0});const i=r(3448),n=r(7419),s=r(1044),o=r(5044),l=r(7480),d=r(6664),c=r(1776);class u extends c.ServiceImplBase{get serviceName(){return"export-service"}getExportCrosstabSheetMapAsync(e){const t=i.VerbId.GetExportCrosstabSheetMap,r={[i.ParameterId.FunctionName]:"getExportCrosstabSheetMapAsync",[i.ParameterId.CurrentSheetType]:s.ExternalToInternalEnumMappings.sheetType.convert(e)};return this.execute(t,r).then((e=>e.result))}exportCrosstabAsync(e,t,r,s){return a(this,void 0,void 0,(function*(){l.ErrorHelpers.verifySheetName(r,e),l.ErrorHelpers.verifyEnumValue(t,n.CrosstabFileFormat,"CrosstabFileFormat");const a=yield this.getExportCrosstabSheetMapAsync(s);if(!a[e])throw new d.TableauError(n.SharedErrorCodes.InternalError,"missing sheet doc id from sheetMap");const o={[i.ParameterId.FunctionName]:"exportCrosstabAsync",[i.ParameterId.SheetIdentifier]:a[e],[i.ParameterId.SendNotifications]:!0};let c;switch(t){case n.CrosstabFileFormat.CSV:c=i.VerbId.ExportCrosstabCsvDownload,o[i.ParameterId.UseTabDelimiters]=!0;break;case n.CrosstabFileFormat.Excel:c=i.VerbId.ExportCrosstabExcelDownload;break;default:throw new d.TableauError(n.SharedErrorCodes.InternalError,"unsupported Crosstab file format.")}return this.execute(c,o).then((e=>e.result)).catch((()=>{throw new d.TableauError(n.SharedErrorCodes.CrosstabCreationError,"An unexpected error occurred while generating the document.")}))}))}exportDataAsync(e,t){var r;l.ErrorHelpers.verifyExportDataOptions(t);const a=new Set(t.columnsToIncludeById),s=Array.from(a),o=i.VerbId.ExportDataDownload,c={[i.ParameterId.FunctionName]:"exportDataAsync",[i.ParameterId.VisualId]:e,[i.ParameterId.IgnoreAliases]:(r=t.ignoreAliases,null!=r&&r),[i.ParameterId.ColumnsToIncludeById]:s};return this.execute(o,c).then((()=>{})).catch((()=>{throw new d.TableauError(n.SharedErrorCodes.DataCreationError,"An unexpected error occurred while generating the document.")}))}exportPowerPointAsync(e,t){l.ErrorHelpers.verifySheetNamesForPDFAndPPT(e,t);const r=i.VerbId.ExportPowerpointDownload,a={[i.ParameterId.FunctionName]:"exportPowerPointAsync",[i.ParameterId.ExportOriginUrl]:"",[i.ParameterId.SelectedSheetNames]:e};return this.execute(r,a).then((e=>e.result)).catch((()=>{throw new d.TableauError(n.SharedErrorCodes.PowerPointCreationError,"An error occured while attempting to generate the PowerPoint file.")}))}exportPDFAsync(e,t,r){return a(this,void 0,void 0,(function*(){l.ErrorHelpers.verifyExportPDFOptions(t),l.ErrorHelpers.verifySheetNamesForPDFAndPPT(e,r);const a=yield this.getExportPDFOptionsAsync();o.ExportHelpers.updateInternalExportPDFOptions(a,t,e);const s=i.VerbId.ExportPdfDownload,c={[i.ParameterId.FunctionName]:"exportPDFAsync",[i.ParameterId.ExportPdfOptions]:a};return this.execute(s,c).then((e=>e.result)).catch((()=>{throw new d.TableauError(n.SharedErrorCodes.PDFCreationError,"Unable to create PDF because something went wrong. Try again.")}))}))}getExportPDFOptionsAsync(){const e=i.VerbId.GetExportPdfOptions,t={[i.ParameterId.FunctionName]:"getExportPdfOptionsAsync"};return this.execute(e,t).then((e=>e.result))}}t.ExportServiceImpl=u},3851:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3448),i=r(1776);class n extends i.ServiceImplBase{get serviceName(){return"external-context-menu-service"}appendContextMenuAsync(e,t,r){const i=a.VerbId.AppendExternalMenuItem,n={[a.ParameterId.FunctionName]:"appendContextMenuAsync",[a.ParameterId.WorksheetName]:e,[a.ParameterId.ExternalMenuItemDisplayName]:r.displayName};return this.execute(i,n).then((e=>e.result))}removeContextMenuAsync(e,t,r){const i=a.VerbId.RemoveExternalMenuItem,n={[a.ParameterId.FunctionName]:"removeContextMenuAsync",[a.ParameterId.WorksheetName]:e,[a.ParameterId.ExternalMenuItemId]:r};return this.execute(i,n).then((e=>{}))}executeContextMenuAsync(e,t,r){const i=a.VerbId.ExecuteExternalMenuItem,n={[a.ParameterId.FunctionName]:"executeContextMenuAsync",[a.ParameterId.WorksheetName]:e,[a.ParameterId.ExternalMenuItemId]:r};return this.execute(i,n).then((e=>{}))}renameContextMenuAsync(e,t,r,i){const n=a.VerbId.RenameExternalMenu,s={[a.ParameterId.FunctionName]:"renameContextMenuAsync",[a.ParameterId.WorksheetName]:e,[a.ParameterId.ExternalMenuHeader]:r,[a.ParameterId.ExternalMenuDescription]:i};return this.execute(n,s).then((e=>{}))}}t.ExternalContextMenuServiceImpl=n},8864:function(e,t,r){"use strict";var a=this&&this.__awaiter||function(e,t,r,a){return new(r||(r=Promise))((function(i,n){function s(e){try{l(a.next(e))}catch(e){n(e)}}function o(e){try{l(a.throw(e))}catch(e){n(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(s,o)}l((a=a.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0});const i=r(7419),n=r(3448),s=r(3448),o=r(5136),l=r(1044),d=r(6557),c=r(6296),u=r(8052),h=r(1172),p=r(1776);class m extends p.ServiceImplBase{get serviceName(){return"filter-service"}applyFilterAsync(e,t,r,a,n){const d=s.VerbId.ApplyCategoricalFilter,c={[s.ParameterId.FunctionName]:"applyFilterAsync"};if(c[s.ParameterId.VisualId]=e,c[s.ParameterId.FieldName]=t,!Array.isArray(r))throw new o.TableauError(i.ErrorCodes.InvalidParameter,"values parameter for applyFilterAsync must be an array");return c[s.ParameterId.FilterValues]=r,c[s.ParameterId.FilterUpdateType]=l.ExternalToInternalEnumMappings.filterUpdateType.convert(a),c[s.ParameterId.IsExcludeMode]=void 0!==n&&void 0!==n.isExcludeMode&&n.isExcludeMode,this.execute(d,c).then((e=>t))}applyRangeFilterAsync(e,t,r){const a=s.VerbId.ApplyRangeFilter,i={[s.ParameterId.FunctionName]:"applyRangeFilterAsync"};if(void 0!==r.min&&null!==r.min){let e;e=r.min instanceof Date?h.Param.serializeDateForPlatform(r.min):r.min,i[s.ParameterId.FilterRangeMin]=e}if(void 0!==r.max&&null!==r.max){let e;e=r.max instanceof Date?h.Param.serializeDateForPlatform(r.max):r.max,i[s.ParameterId.FilterRangeMax]=e}return r.nullOption&&(i[s.ParameterId.FilterRangeNullOption]=l.ExternalToInternalEnumMappings.nullOptions.convert(r.nullOption)),i[s.ParameterId.FieldName]=t,i[s.ParameterId.VisualId]=e,this.execute(a,i).then((e=>(this.apiFilterHandlerCheckForCommandError(e.result),t)))}applyHierarchicalFilterAsync(e,t,r,a,i){const n=s.VerbId.HierarchicalFilter,o={[s.ParameterId.FunctionName]:"applyHierarchicalFilterAsync"};o[s.ParameterId.VisualId]=e,o[s.ParameterId.FieldName]=t;const d=r.levels;return Array.isArray(d)&&d.length>0?o[s.ParameterId.FilterLevels]=d:r.length>0?o[s.ParameterId.FilterValues]=r:o[s.ParameterId.FilterLevels]=[],o[s.ParameterId.FilterUpdateType]=l.ExternalToInternalEnumMappings.filterUpdateType.convert(a),o[s.ParameterId.IsExcludeMode]=i&&!!i.isExcludeMode,this.execute(n,o).then((e=>t))}clearFilterAsync(e,t){const r=s.VerbId.ClearFilter,a={[s.ParameterId.FunctionName]:"clearFilterAsync"};return a[s.ParameterId.VisualId]=e,a[s.ParameterId.FieldName]=t,this.execute(r,a).then((e=>t))}applyRelativeDateFilterAsync(e,t,r){const a=s.VerbId.ApplyRelativeDateFilter,n={[s.ParameterId.FunctionName]:"applyRelativeDateFilterAsync"};if(n[s.ParameterId.VisualId]=e,n[s.ParameterId.FieldName]=t,n[s.ParameterId.PeriodType]=l.ExternalToInternalEnumMappings.periodType.convert(r.periodType),n[s.ParameterId.DateRangeType]=l.ExternalToInternalEnumMappings.dateRangeType.convert(r.rangeType),r.rangeType===i.DateRangeType.LastN||r.rangeType===i.DateRangeType.NextN){if(void 0===r.rangeN||null===r.rangeN)throw new o.TableauError(i.EmbeddingErrorCodes.MissingRangeNForRelativeDateFilters,"Missing rangeN field for a relative date filter of LASTN or NEXTN.");n[s.ParameterId.RangeN]=r.rangeN}return void 0!==r.anchorDate&&null!==r.anchorDate&&(n[s.ParameterId.AnchorDate]=this.convertAnchorDate(r.anchorDate)),this.execute(a,n).then((e=>e.result))}getFiltersAsync(e){const t=s.VerbId.GetFilters,r={[s.ParameterId.FunctionName]:"getFiltersAsync"};return r[s.ParameterId.VisualId]=e,this.execute(t,r).then((e=>{const t=e.result;return this.convertDomainFilters(t)}))}getCategoricalDomainAsync(e,t,r){const a=s.VerbId.GetCategoricalDomain,i={[s.ParameterId.FunctionName]:"getCategoricalDomainAsync"};return i[s.ParameterId.VisualId]={worksheet:e},i[s.ParameterId.FieldId]=t,i[s.ParameterId.DomainType]=l.ExternalToInternalEnumMappings.filterDomainType.convert(r),this.execute(a,i).then((e=>{const t=e.result;return this.convertCategoricalDomain(t,r)}))}getRangeDomainAsync(e,t,r){const a=s.VerbId.GetRangeDomain,i={[s.ParameterId.FunctionName]:"getRangeDomainAsync"};return i[s.ParameterId.VisualId]={worksheet:e},i[s.ParameterId.FieldId]=t,i[s.ParameterId.DomainType]=l.ExternalToInternalEnumMappings.filterDomainType.convert(r),this.execute(a,i).then((e=>{const t=e.result;return this.convertRangeDomain(t,r)}))}getDashboardFiltersAsync(){const e=s.VerbId.GetDashboardFilters,t={[s.ParameterId.FunctionName]:"getDashboardFiltersAsync"};return this.execute(e,t).then((e=>{const t=e.result;return this.convertDomainFilters(t)}))}applyDashboardFilterAsync(e,t,r,a){const i=s.VerbId.DashboardCategoricalFilter,n={[s.ParameterId.FunctionName]:"applyDashboardFilterAsync"};return n[s.ParameterId.FieldName]=e,n[s.ParameterId.FilterValues]=t,n[s.ParameterId.FilterUpdateType]=l.ExternalToInternalEnumMappings.filterUpdateType.convert(r),n[s.ParameterId.IsExcludeMode]=a&&!!a.isExcludeMode,this.execute(i,n).then((e=>e.result))}getAppliedWorksheetsAsync(e,t){var r;return a(this,void 0,void 0,(function*(){const a=yield this.executeGetAppliedWorksheets(e,t,"getAppliedWorksheetsAsync"),i=[];return null===(r=a.worksheets)||void 0===r||r.map((e=>{e.isSelected&&i.push(e.worksheetName)})),i}))}setAppliedWorksheetsAsync(e,t,r,n){return a(this,void 0,void 0,(function*(){const a=yield this.executeGetAppliedWorksheets(e,r,"getAppliedWorksheetsAsyncInternal");if(!a||!a.worksheets)throw new o.TableauError(i.SharedErrorCodes.InternalError,"This filter does not apply to multiple worksheets");const l=[];let d="";if(a.worksheets.forEach((e=>{e.isActive&&(d=e.worksheetName),(e.isSelected||e.isEnabled)&&l.push(e.worksheetName)})),""===d)throw new o.TableauError(i.SharedErrorCodes.InternalError,"No active worksheet");if(!n.includes(d))throw new o.TableauError(i.SharedErrorCodes.InternalError,`${d} must be included in the applied worksheets`);n.forEach((e=>{if(!l.includes(e))throw new o.TableauError(i.SharedErrorCodes.InternalError,`The field ${t} isn't applicable to the worksheet ${e}`)}));const c=s.VerbId.ChangeSharedFilter,u={};return u[s.ParameterId.FunctionName]="setAppliedWorksheetsAsync",u[s.ParameterId.VisualId]={worksheet:e},u[s.ParameterId.FieldId]=r,u[s.ParameterId.SharedFilterSheets]=n,this.execute(c,u).then((e=>n))}))}executeGetAppliedWorksheets(e,t,r){const a=s.VerbId.GetSharedFilter,i={};return i[s.ParameterId.FunctionName]=r,i[s.ParameterId.VisualId]={worksheet:e},i[s.ParameterId.FieldId]=t,this.execute(a,i).then((e=>e.result))}convertDomainFilters(e){const t=[];return e.forEach((e=>{switch(e.filterType){case s.FilterType.Categorical:{const r=e;if(!r)throw new Error("Invalid Categorical Filter");t.push(this.convertCategoricalFilter(r));break}case s.FilterType.Hierarchical:{const r=e;if(!r)throw new Error("Invalid Hierarchical Filter");t.push(this.convertHierarchicalFilter(r));break}case s.FilterType.Range:{const r=e;if(!r)throw new Error("Invalid Range Filter");t.push(this.convertRangeFilter(r));break}case s.FilterType.RelativeDate:{const r=e;if(!r)throw new Error("Invalid Relative Date Filter");t.push(this.convertRelativeDateFilter(r));break}}})),t}convertCategoricalFilter(e){const t=e.values.map((e=>u.DataValueFactory.MakeFilterDataValue(e)));return new c.CategoricalFilter(e.visualId.worksheet,e.fieldCaption,e.fieldName,s.FilterType.Categorical,this._registryId,t,e.isExclude,e.isAllSelected)}convertHierarchicalFilter(e){const t=e.values.map((e=>new c.HierarchicalDataValue(u.DataValueFactory.MakeFilterDataValue(e.value),e.hierarchicalPath,e.level))),r=e.levelInfo.map((e=>new c.HierarchicalLevelDetail(e.name,d.InternalToExternalEnumMappings.hierarchicalLevelSelectionState.convert(e.levelSelectionState))));return new c.HierarchicalFilter(e.visualId.worksheet,e.fieldCaption,e.fieldName,s.FilterType.Hierarchical,this._registryId,e.dimensionName,e.hierarchyCaption,e.levels,r,t,e.isAllSelected)}convertRangeFilter(e){const t=u.DataValueFactory.MakeFilterDataValue(e.min),r=u.DataValueFactory.MakeFilterDataValue(e.max);return new c.RangeFilter(e.visualId.worksheet,e.fieldCaption,e.fieldName,s.FilterType.Range,this._registryId,t,r,e.includeNullValues)}convertRelativeDateFilter(e){const t=u.DataValueFactory.MakeFilterDataValue(e.anchorDate);return new c.RelativeDateFilter(e.visualId.worksheet,e.fieldCaption,e.fieldName,i.FilterType.RelativeDate,this._registryId,t,d.InternalToExternalEnumMappings.dateStepPeriod.convert(e.periodType),d.InternalToExternalEnumMappings.dateRangeType.convert(e.rangeType),e.rangeN)}convertCategoricalDomain(e,t){const r=e.values.map((e=>u.DataValueFactory.MakeFilterDataValue(e)));return new c.CategoricalDomain(r,t)}convertRangeDomain(e,t){const r=u.DataValueFactory.MakeFilterDataValue(e.min),a=u.DataValueFactory.MakeFilterDataValue(e.max);return new c.RangeDomain(r,a,t)}convertAnchorDate(e){const t=e.getUTCFullYear(),r=e.getUTCMonth()+1,a=e.getUTCDate(),n=e.getUTCHours(),s=e.getUTCMinutes(),l=e.getUTCSeconds();if(isNaN(t)||isNaN(r)||isNaN(a)||isNaN(n)||isNaN(s)||isNaN(l))throw new o.TableauError(i.EmbeddingErrorCodes.InvalidDateParameter,"Invalid date parameter: anchorDate");return`${t}-${r}-${a} ${n}:${s}:${l}`}apiFilterHandlerCheckForCommandError(e){if(e[n.ParameterId.ParameterError]){if(e[n.ParameterId.InvalidFieldCaption])throw new o.TableauError(i.SharedErrorCodes.InvalidFilterFieldName,e[n.ParameterId.InvalidFieldCaption]);if(e[n.ParameterId.InvalidValues])throw new o.TableauError(i.SharedErrorCodes.InvalidFilterFieldValue,e[n.ParameterId.InvalidValues]);if(e[n.ParameterId.InvalidAggFieldName])throw new o.TableauError(i.SharedErrorCodes.InvalidAggregationFieldName,e[n.ParameterId.InvalidAggFieldName]);throw new o.TableauError(i.SharedErrorCodes.ServerError,"Server Error")}}}t.FilterServiceImpl=m},7712:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(6680),s=r(5136),o=r(1044),l=r(5068),d=r(7968),c=r(8052),u=r(3483),h=r(1776);class p extends h.ServiceImplBase{constructor(){super(...arguments),this.viewDataTableCacheId=n.v4()}get serviceName(){return"get-data-service"}getMaxRowLimit(){return 1e4}getViewDataTableCacheId(){return this.viewDataTableCacheId}getLimitedMaxRows(e,t){return e>0&&e{const t=e.result;return this.processResultsTable(t.data,t.isSummary)}))}getSummaryDataReaderAsync(e,t,r,a,n,s,l,c){const u={[i.ParameterId.FunctionName]:"getSummaryDataReaderAsync",[i.ParameterId.ViewDataTableCacheId]:this.getViewDataTableCacheId(),[i.ParameterId.VisualId]:e,[i.ParameterId.PageRowCount]:t,[i.ParameterId.IgnoreAliases]:r,[i.ParameterId.IgnoreSelection]:a,[i.ParameterId.IncludeAllColumns]:n,[i.ParameterId.ColumnsToIncludeById]:this.verifyIncludeColumnArray(s),[i.ParameterId.ShowDataTableFormat]:o.ExternalToInternalEnumMappings.showDataTableFormatType.convert(l),[i.ParameterId.ApplyWorksheetFormatting]:c};return this.execute(i.VerbId.GetDataSummaryDataReader,u).then((e=>{const r=e.result;return new d.DataTableReader(r.id,r.totalRowCount,t,this._registryId)}))}getSummaryColumnsInfoAsync(e){const t=i.VerbId.GetDataSummaryData,r={[i.ParameterId.FunctionName]:"getSummaryColumnsInfoAsync",[i.ParameterId.VisualId]:e,[i.ParameterId.IgnoreAliases]:!0,[i.ParameterId.IgnoreSelection]:!0,[i.ParameterId.IncludeAllColumns]:!0,[i.ParameterId.MaxRows]:1,[i.ParameterId.ShowDataTableFormat]:i.ApiShowDataTableFormat.NativeValuesOnly};return this.execute(t,r).then((e=>e.result.data.headers.map((e=>new l.Column(e.fieldCaption,e.fieldName,e.dataType,e.isReferenced,e.index)))))}getSelectedMarksAsync(e){const t={[i.ParameterId.FunctionName]:"getSelectedMarksAsync",[i.ParameterId.VisualId]:e};return this.execute(i.VerbId.GetSelectedMarks,t).then((e=>({data:e.result.data.map((e=>this.processResultsTable(e,!0)))})))}getHighlightedMarksAsync(e){const t={[i.ParameterId.FunctionName]:"getHighlightedMarksAsync",[i.ParameterId.VisualId]:e};return this.execute(i.VerbId.GetHighlightedMarks,t).then((e=>({data:e.result.data.map((e=>this.processResultsTable(e,!0)))})))}getDataSourceDataAsync(e,t,r,a,n,s){const l={[i.ParameterId.FunctionName]:"getDataSourceDataAsync",[i.ParameterId.DataSourceId]:e,[i.ParameterId.IgnoreAliases]:t,[i.ParameterId.MaxRows]:this.getLimitedMaxRows(r,this.getMaxRowLimit()+1),[i.ParameterId.ColumnsToInclude]:this.verifyIncludeColumnArray(a),[i.ParameterId.ColumnsToIncludeById]:this.verifyIncludeColumnArray(n),[i.ParameterId.ShowDataTableFormat]:o.ExternalToInternalEnumMappings.showDataTableFormatType.convert(s)};return this.execute(i.VerbId.GetDataSourceData,l).then((e=>{const t=e.result;return this.processResultsTable(t.data,!1)}))}getLogicalTableDataAsync(e,t,r,a,n,s,l){const d={[i.ParameterId.FunctionName]:"getLogicalTableDataAsync",[i.ParameterId.ColumnsToInclude]:n,[i.ParameterId.ColumnsToIncludeById]:this.verifyIncludeColumnArray(s),[i.ParameterId.DataSourceId]:e,[i.ParameterId.IgnoreAliases]:r,[i.ParameterId.LogicalTableId]:t,[i.ParameterId.MaxRows]:this.getLimitedMaxRows(a,this.getMaxRowLimit()+1),[i.ParameterId.ShowDataTableFormat]:o.ExternalToInternalEnumMappings.showDataTableFormatType.convert(l)};return this.execute(i.VerbId.GetLogicalTableData,d).then((e=>{const t=e.result;return this.processResultsTable(t.data,!1)}))}getLogicalTableDataReaderAsync(e,t,r,a,n,s){r=this.getLimitedMaxRows(r,this.getMaxRowLimit());const l={[i.ParameterId.FunctionName]:"getLogicalTableDataReaderAsync",[i.ParameterId.ViewDataTableCacheId]:this.getViewDataTableCacheId(),[i.ParameterId.DataSourceId]:e,[i.ParameterId.LogicalTableId]:t,[i.ParameterId.PageRowCount]:r,[i.ParameterId.IgnoreAliases]:a,[i.ParameterId.ColumnsToIncludeById]:this.verifyIncludeColumnArray(n),[i.ParameterId.ShowDataTableFormat]:o.ExternalToInternalEnumMappings.showDataTableFormatType.convert(s)};return this.execute(i.VerbId.GetLogicalTableDataReader,l).then((e=>{const t=e.result;return new d.DataTableReader(t.id,t.totalRowCount,r,this._registryId)}))}getUnderlyingTableDataAsync(e,t,r,a,n,s,l,d,c){const u={[i.ParameterId.FunctionName]:"getUnderlyingTableDataAsync",[i.ParameterId.VisualId]:e,[i.ParameterId.LogicalTableId]:t,[i.ParameterId.IgnoreAliases]:r,[i.ParameterId.IgnoreSelection]:a,[i.ParameterId.IncludeAllColumns]:n,[i.ParameterId.ColumnsToIncludeById]:this.verifyIncludeColumnArray(s),[i.ParameterId.MaxRows]:this.getLimitedMaxRows(l,this.getMaxRowLimit()+1),[i.ParameterId.ShowDataTableFormat]:o.ExternalToInternalEnumMappings.showDataTableFormatType.convert(d),[i.ParameterId.ApplyWorksheetFormatting]:c};return this.execute(i.VerbId.GetUnderlyingTableData,u).then((e=>{const t=e.result;return this.processResultsTable(t.data,!1)}))}getUnderlyingTableDataReaderAsync(e,t,r,a,n,s,l,c,u){r=this.getLimitedMaxRows(r,this.getMaxRowLimit());const h={[i.ParameterId.FunctionName]:"getUnderlyingTableDataReaderAsync",[i.ParameterId.ViewDataTableCacheId]:this.getViewDataTableCacheId(),[i.ParameterId.VisualId]:e,[i.ParameterId.LogicalTableId]:t,[i.ParameterId.IgnoreAliases]:a,[i.ParameterId.IgnoreSelection]:n,[i.ParameterId.IncludeAllColumns]:s,[i.ParameterId.ColumnsToIncludeById]:this.verifyIncludeColumnArray(l),[i.ParameterId.ShowDataTableFormat]:o.ExternalToInternalEnumMappings.showDataTableFormatType.convert(c),[i.ParameterId.PageRowCount]:r,[i.ParameterId.ApplyWorksheetFormatting]:u};return this.execute(i.VerbId.GetUnderlyingTableDataReader,h).then((e=>{const t=e.result;return new d.DataTableReader(t.id,t.totalRowCount,r,this._registryId)}))}getPageAsync(e,t,r){const a={[i.ParameterId.FunctionName]:"getPageAsync",[i.ParameterId.ViewDataTableCacheId]:this.getViewDataTableCacheId(),[i.ParameterId.ViewDataTableId]:e,[i.ParameterId.DataRowIndex]:t*r};return this.execute(i.VerbId.GetDataTableReaderPage,a).then((t=>{const r=t.result;return this.processResultsPage(r,e===p.summaryTableId)}))}releaseAsync(e){const t={[i.ParameterId.FunctionName]:"release",[i.ParameterId.ViewDataTableCacheId]:this.getViewDataTableCacheId(),[i.ParameterId.ViewDataTableId]:e};return this.execute(i.VerbId.ReleaseDataTableReader,t).then((e=>{}))}verifyIncludeColumnArray(e){if(!Array.isArray(e))throw new s.TableauError(a.ErrorCodes.InvalidParameter,"columnsToInclude and columnsToIncludeById must be valid arrays");const t=new Set(e);return Array.from(t)}processResultsTable(e,t){const r=e.headers.map((e=>new l.Column(e.fieldCaption,e.fieldName,e.dataType,e.isReferenced,e.index)));let a;e.marks&&(a=e.marks.map((e=>new l.MarkInfo(e.type,e.color,e.tupleId))));const i=!1===t&&e.dataTable.length===this.getMaxRowLimit()+1;i&&(e.dataTable.length-=1);const n=e.dataTable.map((e=>e.map(((e,t)=>c.DataValueFactory.MakeTableDataValue(e,r[t].dataType)))));return a?new l.DataTable(n,r,n.length,i,t,a):new l.DataTable(n,r,n.length,i,t)}processResultsPage(e,t){const r=e.headers.map((e=>new l.Column(e.fieldCaption,e.fieldName,e.dataType,e.isReferenced,e.index)));let a;e.marks&&(a=e.marks.map((e=>new l.MarkInfo(e.type,e.color,e.tupleId))));const i=e.dataTable.map((e=>e.map(((e,t)=>c.DataValueFactory.MakeTableDataValue(e,r[t].dataType)))));return a?new l.DataTable(i,r,i.length,!1,t,a):new l.DataTable(i,r,i.length,!1,t)}}t.GetDataServiceImpl=p,p.summaryTableId=""},1288:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(8808);class i extends a.NotificationServiceImplBase{get serviceName(){return"notification-service"}}t.NotificationServiceImpl=i},8808:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});class r{constructor(e,t){this._filterFn=e,this._callbackFn=t}onNotification(e){this._filterFn(e)&&this._callbackFn(e)}}t.Registration=r,t.NotificationServiceImplBase=class{constructor(e){this.dispatcher=e,this._handlers={},this.dispatcher.registerNotificationHandler(this.onNotification.bind(this))}registerHandler(e,t,a){const i=this._handlers[e]||new Array,n=new r(t,a);return i.push(n),this._handlers[e]=i,()=>this.removeRegistration(e,n)}hasHandlersForNotificationType(e){return this._handlers.hasOwnProperty(e)}onNotification(e){this.hasHandlersForNotificationType(e.notificationId)&&this._handlers[e.notificationId].forEach((t=>t.onNotification(e.data)))}removeRegistration(e,t){this.hasHandlersForNotificationType(e)&&(this._handlers[e]=this._handlers[e].filter((e=>e!==t)))}}},7260:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(8552),s=r(6664),o=r(1776);class l extends o.ServiceImplBase{get serviceName(){return"parameters-service"}getParametersForSheetAsync(e){const t={[i.ParameterId.FunctionName]:"getParametersForSheetAsync",[i.ParameterId.SheetPath]:e};return this.getParametersAsync(t)}getAllParametersAsync(){const e={[i.ParameterId.FunctionName]:"getParametersForSheetAsync"};return this.getParametersAsync(e)}getParametersAsync(e){return this.execute(i.VerbId.GetParametersForSheet,e).then((e=>e.result.map((e=>new n.ParameterImpl(e,this._registryId)))))}changeParameterValueAsync(e,t){const r={[i.ParameterId.FunctionName]:"changeParameterValueAsync",[i.ParameterId.ParameterFieldName]:e,[i.ParameterId.ParameterValue]:t};return this.execute(i.VerbId.ChangeParameterValue,r).then((e=>e.result))}findParameterByNameAsync(e){return this.findParameterAsync(e,void 0)}findParameterByGlobalFieldNameAsync(e){return this.findParameterAsync(void 0,e)}findParameterAsync(e,t){const r={[i.ParameterId.FunctionName]:"findParameterAsync"};if(void 0!==e)r[i.ParameterId.ParameterCaption]=e;else{if(void 0===t)throw new s.TableauError(a.ErrorCodes.InvalidParameter,"name or fieldName must be provided to find parameter");r[i.ParameterId.ParameterFieldName]=t}return this.execute(i.VerbId.FindParameter,r).then((e=>{if("fieldName"in e.result){const t=e.result;return new n.ParameterImpl(t,this._registryId)}}))}}t.ParametersServiceImpl=l},8784:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(7104),s=r(6664),o=r(1172),l=r(1776);class d extends l.ServiceImplBase{get serviceName(){return"selection-service"}clearSelectedMarksAsync(e){const t={[i.ParameterId.FunctionName]:"clearSelectedMarksAsync",[i.ParameterId.VisualId]:e};return this.execute(i.VerbId.ClearSelectedMarks,t).then((e=>{}))}selectMarksByValueAsync(e,t,r){if(0===t.length)throw new s.TableauError(a.ErrorCodes.InvalidParameter,"Selection criteria missing for selecting marks by value");const n=this.validateSelectionUpdateType(r),o=this.parseSelectionMarks(t),l={[i.ParameterId.FunctionName]:"selectMarksByValueAsync",[i.ParameterId.VisualId]:e,[i.ParameterId.SelectionUpdateType]:n};return o.hierModelArr&&o.hierModelArr.length&&(l[i.ParameterId.HierValSelectionModels]=o.hierModelArr),o.quantModelArr&&o.quantModelArr.length&&(l[i.ParameterId.QuantRangeSelectionModels]=o.quantModelArr),o.dimModelArr&&o.dimModelArr.length&&(l[i.ParameterId.DimValSelectionModels]=o.dimModelArr),this.execute(i.VerbId.SelectByValue,l).then((e=>{this.apiFilterHandlerCheckForCommandError(e.result)}))}hoverTupleAsync(e,t,r,a){let s=new n.HoverTupleInteractionModel(e,this.ensureTupleIDIsNonNegative(t),r,a);const o={[i.ParameterId.FunctionName]:"hoverTupleAsync",[i.ParameterId.HoverTupleInteraction]:s};return this.execute(i.VerbId.RaiseHoverTupleNotification,o).then((e=>{}))}selectTuplesAsync(e,t,r,a){let s=new n.SelectTuplesInteractionModel(e,t,r,a);const o={[i.ParameterId.FunctionName]:"selectTuplesAsync",[i.ParameterId.SelectTuplesInteraction]:s};return this.execute(i.VerbId.RaiseSelectTuplesNotification,o).then((e=>{}))}apiFilterHandlerCheckForCommandError(e){if(e[i.ParameterId.ParameterError]){if(e[i.ParameterId.InvalidFields])throw new s.TableauError(a.SharedErrorCodes.InvalidSelectionFieldName,e[i.ParameterId.InvalidFields]);if(e[i.ParameterId.InvalidValues])throw new s.TableauError(a.SharedErrorCodes.InvalidSelectionValue,e[i.ParameterId.InvalidValues]);if(e[i.ParameterId.InvalidDates])throw new s.TableauError(a.SharedErrorCodes.InvalidSelectionDate,e[i.ParameterId.InvalidDates])}}selectMarksByIdAsync(e,t,r){if(0===t.length)throw new s.TableauError(a.ErrorCodes.InvalidParameter,"Marks info missing for selecting marks by Id");const n=this.validateSelectionUpdateType(r),o=this.parseSelectionIds(t),l={[i.ParameterId.FunctionName]:"selectMarksByIdAsync",[i.ParameterId.VisualId]:e,[i.ParameterId.SelectionUpdateType]:n,[i.ParameterId.Selection]:o.selection};return this.execute(i.VerbId.SelectByValue,l).then((e=>{}))}parseSelectionIds(e){const t=[],r=new n.SelectionModelsContainer;for(let r=0;r0?e:0}}t.SelectionServiceImpl=d},1776:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(6557),i=r(6664),n=r(5520);t.ServiceImplBase=class{constructor(e,t){this._dispatcher=e,this._registryId=t}execute(e,t){return this._dispatcher.execute(e,t).catch((e=>{const t=e,r=a.InternalToExternalEnumMappings.errorCode.convert(t.errorCode,n.ShouldThrow.No);throw new i.TableauError(r,t.message)}))}}},4109:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3448),i=r(1776);class n extends i.ServiceImplBase{get serviceName(){return"size-service"}changeSizeAsync(e,t){var r,i,n,s;const o={[a.ParameterId.FunctionName]:"changeSizeAsync",[a.ParameterId.SheetName]:e,[a.ParameterId.MinHeight]:(null===(r=t.minSize)||void 0===r?void 0:r.height)||0,[a.ParameterId.MinWidth]:(null===(i=t.minSize)||void 0===i?void 0:i.width)||0,[a.ParameterId.MaxHeight]:(null===(n=t.maxSize)||void 0===n?void 0:n.height)||0,[a.ParameterId.MaxWidth]:(null===(s=t.maxSize)||void 0===s?void 0:s.width)||0};return this.execute(a.VerbId.SetSheetSize,o).then((e=>{}))}}t.SizeServiceImpl=n},2248:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3448),i=r(1776);class n extends i.ServiceImplBase{get serviceName(){return"story-activation-service"}activateNextStoryPointAsync(){const e=a.VerbId.ActivateNextStoryPoint,t={[a.ParameterId.FunctionName]:"activateNextStoryPointAsync"};return this.execute(e,t).then((e=>{}))}activatePreviousStoryPointAsync(){const e=a.VerbId.ActivatePreviousStoryPoint,t={[a.ParameterId.FunctionName]:"activatePreviousStoryPointAsync"};return this.execute(e,t).then((e=>{}))}activateStoryPointAsync(e){const t=a.VerbId.ActivateStoryPoint,r={[a.ParameterId.FunctionName]:"activateStoryPointAsync"};return r[a.ParameterId.StoryPointIndex]=e,this.execute(t,r).then((e=>{}))}revertStoryPointAsync(e){const t=a.VerbId.RevertStoryPoint,r={[a.ParameterId.FunctionName]:"revertStoryPointAsync"};return r[a.ParameterId.StoryPointIndex]=e,this.execute(t,r).then((e=>e.result))}}t.StoryActivationServiceImpl=n},6096:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3448),i=r(1776);class n extends i.ServiceImplBase{get serviceName(){return"visual-model-service"}getVisualSpecificationAsync(e){const t={[a.ParameterId.FunctionName]:"getVisualSpecificationAsync",[a.ParameterId.WorksheetName]:e.worksheet};return this.execute(a.VerbId.GetVisualSpecification,t).then((e=>e.result))}addMarksCardFieldsAsync(e,t,r,i,n){const s={[a.ParameterId.FunctionName]:"addMarksCardFieldsAsync",[a.ParameterId.WorksheetName]:e.worksheet,[a.ParameterId.MarksCardIndex]:t,[a.ParameterId.EncodingType]:r,[a.ParameterId.Columns]:i,[a.ParameterId.StartIndex]:n};return this.execute(a.VerbId.AddMarksCardFields,s).then((()=>{}))}moveMarksCardFieldAsync(e,t,r,i,n=1){const s={[a.ParameterId.FunctionName]:"addMarksCardFieldsAsync",[a.ParameterId.WorksheetName]:e.worksheet,[a.ParameterId.MarksCardIndex]:t,[a.ParameterId.FromIndex]:r,[a.ParameterId.ToIndex]:i,[a.ParameterId.FieldCount]:n};return this.execute(a.VerbId.MoveMarksCardField,s).then((()=>{}))}spliceMarksCardFieldsAsync(e,t,r,i,n,s){const o={[a.ParameterId.FunctionName]:"spliceMarksCardFieldsAsync",[a.ParameterId.WorksheetName]:e.worksheet,[a.ParameterId.MarksCardIndex]:t,[a.ParameterId.EncodingType]:r,[a.ParameterId.StartIndex]:i,[a.ParameterId.DeleteCount]:n,[a.ParameterId.Columns]:s};return this.execute(a.VerbId.SpliceMarksCardFields,o).then((()=>{}))}editAliasesDialogAsync(e){const t={[a.ParameterId.FunctionName]:"editAliasesDialogAsync",[a.ParameterId.FieldId]:e};return this.execute(a.VerbId.EditAliasesDialog,t).then((()=>{}))}}t.VisualModelServiceImpl=n},744:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3448),i=r(2520),n=r(1776);class s extends n.ServiceImplBase{get serviceName(){return"viz-service"}createVizImageAsync(e){const t={[a.ParameterId.FunctionName]:"createVizImageAsync",[a.ParameterId.VizAPIInputJson]:JSON.stringify(e)};return this.execute(a.VerbId.VizAPI,t).then((e=>e.result))}activateSheetAsync(e){const t={[a.ParameterId.FunctionName]:"activateSheetAsync",[a.ParameterId.SwitchToSheetName]:e};return this.execute(a.VerbId.ActivateSheet,t).then((()=>{}))}getCustomViewsAsync(){const e={[a.ParameterId.FunctionName]:"getCustomViewsAsync"};return this.execute(a.VerbId.GetCustomViews,e).then((e=>e.result.map((e=>new i.CustomViewImpl(e,this._registryId)))))}showCustomViewAsync(e){const t={[a.ParameterId.FunctionName]:"showCustomViewAsync",[a.ParameterId.CustomViewName]:e||""};return this.execute(a.VerbId.ShowCustomView,t).then((e=>{var t;const r=e.result;return(null===(t=r)||void 0===t?void 0:t.luid)?new i.CustomViewImpl(r,this._registryId):void 0}))}removeCustomViewAsync(e){const t={[a.ParameterId.FunctionName]:"removeCustomViewAsync",[a.ParameterId.CustomViewName]:e};return this.execute(a.VerbId.RemoveCustomView,t).then((e=>{const t=e.result;return new i.CustomViewImpl(t,this._registryId)}))}saveCustomViewAsync(e){const t={[a.ParameterId.FunctionName]:"saveCustomViewAsync",[a.ParameterId.CustomViewName]:e,[a.ParameterId.CustomViewIsDefault]:!1};return this.execute(a.VerbId.SaveWorkbookAsCustomView,t).then((e=>{const t=e.result;return new i.CustomViewImpl(t,this._registryId)}))}setActiveCustomViewAsDefaultAsync(){const e={[a.ParameterId.FunctionName]:"setActiveCustomViewAsDefaultAsync"};return this.execute(a.VerbId.SetActiveCustomViewAsDefault,e).then((()=>{}))}saveAsync(e){const t={[a.ParameterId.FunctionName]:"saveAsync",[a.ParameterId.CustomViewLuid]:e.luid,[a.ParameterId.CustomViewName]:e.name,[a.ParameterId.CustomViewIsDefault]:e.isDefault,[a.ParameterId.CustomViewIsPublic]:e.shared};return this.execute(a.VerbId.UpdateCustomView,t).then((e=>{const t=e.result;return new i.CustomViewImpl(t,this._registryId)}))}getCurrentSrcAsync(){const e={[a.ParameterId.FunctionName]:"getCurrentSrcAsync"};return this.execute(a.VerbId.GetCurrentSrc,e).then((e=>e.result))}}t.VizServiceImpl=s},8856:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(1044),s=r(7480),o=r(1172),l=r(1776);class d extends l.ServiceImplBase{get serviceName(){return"zone-service"}setVisibilityAsync(e,t,r){const l={[i.ParameterId.FunctionName]:"setVisibilityAsync",[i.ParameterId.Dashboard]:e,[i.ParameterId.ZoneIdsVisibilityMap]:{}};return o.Param.convertParameterToMap(r,"zoneVisibilityMap").forEach(((e,r)=>{s.ErrorHelpers.verifyZoneIsValid(t,Number.parseInt(r,10)),s.ErrorHelpers.verifyEnumValue(e,a.DashboardObjectVisibilityType,"DashboardObjectVisibilityType"),l[i.ParameterId.ZoneIdsVisibilityMap][r]=n.ExternalToInternalEnumMappings.setVisibilityType.convert(e)})),this.execute(i.VerbId.SetZoneVisibility,l).then((e=>{}))}moveAndResizeAsync(e,t,r){const a={[i.ParameterId.Dashboard]:e,[i.ParameterId.DashboardObjectPositionAndSizeUpdateList]:r};return r.forEach((e=>{s.ErrorHelpers.verifyZoneIsValidAndFloating(t,e.dashboardObjectID),s.ErrorHelpers.verifyWidthAndHeightOfDashboardObjectPositionAndSizeUpdate(e)})),this.execute(i.VerbId.MoveAndResizeZones,a).then((e=>{}))}}t.ZoneServiceImpl=d},7603:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.TableSummary=class{constructor(e){this._tableInfo=e}get name(){return this._tableInfo.name}get id(){return this._tableInfo.id}get connectionId(){return this._tableInfo.connectionId}get customSQL(){return this._tableInfo.customSQL}}},6664:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});class r extends Error{constructor(e,t){super(`${e}: ${t}`),this._errorCode=e,Object.setPrototypeOf(this,r.prototype)}get errorCode(){return this._errorCode}}t.TableauError=r},8052:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3448),i=r(5068);t.DataValueFactory=class{static MakeParameterDataValue(e,t){return new i.DataValue(e.value,a.DataTypeConverter.convertStringValueToNativeValue(e.value,t),e.formattedValue,e.aliasedValue,e.hasAlias)}static MakeFilterDataValue(e){return new i.DataValue(e.value,e.value,e.formattedValue)}static MakeTableDataValue(e,t){return new i.DataValue(e.value,void 0!==e.value?a.DataTypeConverter.convertValueToNativeValue(e.value,t):void 0,e.formattedValue)}}},1724:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Deferred=class{constructor(){this._promise=new Promise(((e,t)=>{this._resolve=e,this._reject=t}))}get promise(){return this._promise}resolve(e){this._resolve&&this._resolve(e)}reject(e){this._reject&&this._reject(e)}},t.UnregisterTimeoutInMilliseconds=3e4},5520:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(6664);var n;t.EnumConverter=class{constructor(e,t){this._mappings=e,this._defaultVal=t}convert(e,t=n.Yes){if(this._mappings.hasOwnProperty(e))return this._mappings[e];if(void 0!==this._defaultVal&&t!==n.Yes)return this._defaultVal;throw new i.TableauError(a.ErrorCodes.InternalError,`Enum Mapping not found for: ${e}`)}},function(e){e.Yes="yes",e.No="no"}(n=t.ShouldThrow||(t.ShouldThrow={}))},7480:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(6664),n=r(1172);class s{static apiNotImplemented(e){return new i.TableauError(a.SharedErrorCodes.InternalError,`${e} API not yet implemented.`)}static verifyInternalValue(e,t){if(null==e)throw new i.TableauError(a.SharedErrorCodes.InternalError,`${e} is invalid value for: ${t}`)}static verifyParameter(e,t){if(null==e)throw new i.TableauError(a.SharedErrorCodes.InvalidParameter,`${e} is invalid value for parameter: ${t}`)}static verifyParameterType(e,t,r){if(typeof e!==t)throw new i.TableauError(a.SharedErrorCodes.InvalidParameter,`${e} has invalid type for parameter: ${r}.`)}static verifyStringParameter(e,t){if(null==e||""===e)throw new i.TableauError(a.SharedErrorCodes.InvalidParameter,`${e} is invalid value for paramter: ${t}`)}static isValidEnumValue(e,t){let r=!1;return Object.keys(t).forEach((a=>{t[a]===e.toString()&&(r=!0)})),r}static verifyEnumValue(e,t,r){if(!s.isValidEnumValue(e,t))throw new i.TableauError(a.SharedErrorCodes.InvalidParameter,`${e} is invalid value for enum: ${r}.`)}static verifyRange(e,t,r){if(!(t<=e&&et.exportableSheetNamesFromDashboard.includes(e)))||e.every((e=>t.exportableSheetNamesFromWorkbook.includes(e)))||1===e.length&&e[0]===t.currentSheetName))throw new i.TableauError(a.SharedErrorCodes.InvalidSelectionSheet,"sheetNames parameter must have all its entries be exportable sheet names from the dashboard or all its entries be exportable sheet names from the workbook")}static verifyExportPDFOptions(e){try{this.verifyEnumValue(e.orientation,a.PrintOrientation,"PrintOrientation"),this.verifyEnumValue(e.pageSize,a.PrintPageSize,"PrintPageSize"),this.verifyEnumValue(e.scaling,a.PrintScaling,"PrintScaling")}catch(e){throw new i.TableauError(a.SharedErrorCodes.InvalidParameter,"options parameter must be of type ExportPDFOptions")}}}t.ErrorHelpers=s},5044:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3448),i=r(7419),n=r(6664);class s{static updateInternalExportPDFOptions(e,t,r){e.currentSheet=r[0],this.updateExportLayoutOptions(e,t),this.updateSheetOptions(e,r)}static updateExportLayoutOptions(e,t){const r=e.exportLayoutOptions;switch(r.imageHeight=this.DefaultLayoutOptions.imageHeight,r.imageWidth=this.DefaultLayoutOptions.imageWidth,t.orientation){case i.PrintOrientation.Landscape:r.pageOrientationOption=a.PageOrientation.Landscape;break;case i.PrintOrientation.Portrait:r.pageOrientationOption=a.PageOrientation.Portrait;break;default:throw new n.TableauError(i.SharedErrorCodes.InternalError,"invalid orientation for ExportPDFOption")}switch(t.pageSize){case i.PrintPageSize.A3:r.pageSizeOption=a.PageSizeOption.A3;break;case i.PrintPageSize.A4:r.pageSizeOption=a.PageSizeOption.A4;break;case i.PrintPageSize.A5:r.pageSizeOption=a.PageSizeOption.A5;break;case i.PrintPageSize.B4:r.pageSizeOption=a.PageSizeOption.B4;break;case i.PrintPageSize.B5:r.pageSizeOption=a.PageSizeOption.B5;break;case i.PrintPageSize.Executive:r.pageSizeOption=a.PageSizeOption.Executive;break;case i.PrintPageSize.Folio:r.pageSizeOption=a.PageSizeOption.Folio;break;case i.PrintPageSize.Ledger:r.pageSizeOption=a.PageSizeOption.Ledger;break;case i.PrintPageSize.Legal:r.pageSizeOption=a.PageSizeOption.Legal;break;case i.PrintPageSize.Letter:r.pageSizeOption=a.PageSizeOption.Letter;break;case i.PrintPageSize.Note:r.pageSizeOption=a.PageSizeOption.Note;break;case i.PrintPageSize.Quarto:r.pageSizeOption=a.PageSizeOption.Quarto;break;case i.PrintPageSize.Statement:r.pageSizeOption=a.PageSizeOption.Statement;break;case i.PrintPageSize.Tabloid:r.pageSizeOption=a.PageSizeOption.Tabloid;break;case i.PrintPageSize.Unspecified:r.pageSizeOption=a.PageSizeOption.Unspecified;break;default:throw new n.TableauError(i.SharedErrorCodes.InternalError,"invalid pageSize for ExportPDFOption")}switch(t.scaling){case i.PrintScaling.AtMost1PageHigh:this.setFitAndScaleValues(r,a.FitPages.FitOneHigh);break;case i.PrintScaling.AtMost1PageWide:this.setFitAndScaleValues(r,a.FitPages.FitOneWide);break;case i.PrintScaling.AtMost2PagesHigh:this.setFitAndScaleValues(r,a.FitPages.FitTwoHigh);break;case i.PrintScaling.AtMost2PagesWide:this.setFitAndScaleValues(r,a.FitPages.FitTwoWide);break;case i.PrintScaling.Automatic:this.setFitAndScaleValues(r,a.PageScalingOption.ScalePctAuto);break;case i.PrintScaling.Perc100:this.setFitAndScaleValues(r,a.PageScalingOption.ScalePct100);break;case i.PrintScaling.Perc200:this.setFitAndScaleValues(r,a.PageScalingOption.ScalePct200);break;case i.PrintScaling.Perc25:this.setFitAndScaleValues(r,a.PageScalingOption.ScalePct25);break;case i.PrintScaling.Perc400:this.setFitAndScaleValues(r,a.PageScalingOption.ScalePct400);break;case i.PrintScaling.Perc50:this.setFitAndScaleValues(r,a.PageScalingOption.ScalePct50);break;case i.PrintScaling.Perc60:this.setFitAndScaleValues(r,a.PageScalingOption.ScalePct60);break;case i.PrintScaling.Perc75:this.setFitAndScaleValues(r,a.PageScalingOption.ScalePct75);break;case i.PrintScaling.Perc80:this.setFitAndScaleValues(r,a.PageScalingOption.ScalePct80);break;case i.PrintScaling.Perc90:this.setFitAndScaleValues(r,a.PageScalingOption.ScalePct90);break;default:throw new n.TableauError(i.SharedErrorCodes.InternalError,"invalid scaling for ExportPDFOption")}}static updateSheetOptions(e,t){const{exportLayoutOptions:r,sheetOptions:a}=e;for(const e of a)e.exportLayoutOptions=r,e.isSelected=t.includes(e.sheet)}static setFitAndScaleValues(e,t){let{pageFitHorizontal:r,pageFitVertical:i,pageScaleMode:n,pageScalePercent:s}=this.DefaultLayoutOptions;const o=this.fitRegex.exec(t),l=this.pctRegex.exec(t);o?([r,i]=o.slice(1).map((e=>Number(e))),n=a.ScaleMode.ScaleFitPages):l&&([s]=l.slice(1).map((e=>Number(e))),n=a.ScaleMode.ScalePercentage),e.pageFitHorizontal=r,e.pageFitVertical=i,e.pageScaleMode=n,e.pageScalePercent=s}}t.ExportHelpers=s,s.DefaultDataOptions={ignoreAliases:!1,columnsToIncludeById:[]},s.DefaultPDFOptions={scaling:i.PrintScaling.Automatic,pageSize:i.PrintPageSize.Letter,orientation:i.PrintOrientation.Portrait},s.DefaultLayoutOptions={imageHeight:0,imageWidth:0,pageFitHorizontal:1,pageFitVertical:1,pageOrientationOption:a.PageOrientation.Portrait,pageScaleMode:a.ScaleMode.ScaleAuto,pageScalePercent:100,pageSizeOption:a.PageSizeOption.Letter},s.fitRegex=new RegExp("fit([0-9]+)x([0-9]+)"),s.pctRegex=new RegExp("pct([0-9]+)")},1172:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(6664),n=r(7480);class s{static serializeDateForPlatform(e){return`${e.getUTCFullYear()}-${e.getUTCMonth()+1}-${e.getUTCDate()} ${e.getUTCHours()}:${e.getUTCMinutes()}:${e.getUTCSeconds()}`}static serializeBooleanForPlatform(e){return e?"true":"false"}static serializeNumberForPlatform(e){return e.toString(10)}static isTypeNumber(e){return"number"==typeof e||e instanceof Number}static isTypeDate(e){return e instanceof Date}static isTypeString(e){return"string"==typeof e||e instanceof String}static isTypeBool(e){return"boolean"==typeof e||e instanceof Boolean}static isNullOrUndefined(e){return null==e}static serializeParameterValue(e){if(s.isTypeNumber(e))return s.serializeNumberForPlatform(e);if(s.isTypeDate(e))return s.serializeDateForPlatform(e);if(s.isTypeBool(e))return s.serializeBooleanForPlatform(e);if(s.isTypeString(e))return e;throw new i.TableauError(a.ErrorCodes.InternalError,`Unexpected invalid value for: ${e}`)}static convertParameterToMap(e,t){if(n.ErrorHelpers.verifyParameterType(e,"object",t),Array.isArray(e))throw new i.TableauError(a.ErrorCodes.InvalidParameter,`Expecting object or Map for: ${t}.`);return e instanceof Map?e:new Map(Object.entries(e))}static tryParseNumber(e){if(s.isNullOrUndefined(e))return{success:!1};if(s.isTypeNumber(e))return{parsed:e,success:!0};const t=e.toString();if("NaN"===t)return{parsed:NaN,success:!0};const r=parseFloat(t);return isNaN(r)?{success:!1}:{parsed:r,success:!0}}}t.Param=s},2780:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(3448),n=r(6664);t.SheetUtils=class{static getSheetSizeFromSizeConstraints(e){const{minWidth:t,minHeight:r,maxWidth:i,maxHeight:n}=e;if(0===r&&0===t)return 0===n&&0===i?{behavior:a.SheetSizeBehavior.Automatic}:{behavior:a.SheetSizeBehavior.AtMost,maxSize:{width:i,height:n}};if(0===n&&0===i)return{behavior:a.SheetSizeBehavior.AtLeast,minSize:{width:t,height:r}};if(n===r&&i===t&&t>0)return{behavior:a.SheetSizeBehavior.Exactly,minSize:{width:t,height:r},maxSize:{width:t,height:r}};const s=0===t&&0===i;return{behavior:a.SheetSizeBehavior.Range,minSize:{width:t,height:r},maxSize:{width:s?2147483647:i,height:n}}}static createAutomaticSize(){return{behavior:a.SheetSizeBehavior.Automatic,minSize:{width:0,height:0},maxSize:{width:0,height:0}}}static getPublishedSheetInfoByName(e,t){return t.find((t=>t.name===e))}static getSheetTypeEnum(e){let t;switch(e){case i.SheetType.Worksheet:t=a.SheetType.Worksheet;break;case i.SheetType.Dashboard:t=a.SheetType.Dashboard;break;case i.SheetType.Story:t=a.SheetType.Story;break;default:throw new n.TableauError(a.SharedErrorCodes.ServerError,"Invalid SheetType")}return t}static isValidSheetSize(e){return void 0!==e.behavior}}},3036:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(6664),n=r(1724);t.ShortLivedDeferred=class{constructor(e=n.UnregisterTimeoutInMilliseconds){this._timeoutInMilliseconds=e}getNewPromiseOrThrowIfBusy(){if(this._deferred)throw new i.TableauError(a.SharedErrorCodes.ApiExecutionError,"This api cannot be executed till previous call is resolved.");return this._deferred=new n.Deferred,this._timeoutId=setTimeout((()=>{const e=new i.TableauError(a.SharedErrorCodes.Timeout,`Api failed to complete in ${this._timeoutInMilliseconds/1e3} seconds`);this.reject(e)}),this._timeoutInMilliseconds),this._deferred.promise}resolve(e){this._deferred&&(clearTimeout(this._timeoutId),this._deferred.resolve(e),this._deferred=void 0)}reject(e){this._deferred&&(clearTimeout(this._timeoutId),this._deferred.reject(e),this._deferred=void 0)}}},1576:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(7419),i=r(6664);t.VersionNumber=class{constructor(e,t){const r=e.split("-");this.build=this.getBuildNumber(r[1]);const n=(e=r[0]).split(".").map((e=>parseInt(e,10)));if(3!==n.length)throw new i.TableauError(a.ErrorCodes.InternalError,`Invalid version number: ${e}`);this.major=n[0],this.minor=n[1],this.fix=n[2],this.isAlpha=t}getBuildNumber(e){if(!e)return-1;const t=e.split(".");return t[1]?parseInt(t[1],10):-1}get formattedValue(){return`${this.major}.${this.minor}.${this.fix}`}get fullFormattedValue(){return`${this.major}.${this.minor}.${this.fix}-pre.${this.build}`}}},8648:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=r(3448);t.VersionedExternalApiDispatcher=class{constructor(e,t){this._apiDelegateDispatcher=e,this._versionConverter=a.CreateExternalCompatibleVersionConverter(a.INTERNAL_CONTRACT_VERSION,t),this._notificationHandlers=[],e.registerNotificationHandler((e=>{if(0===this._notificationHandlers.length)return;const t=this._versionConverter.upgradeNotification(e);this._notificationHandlers.forEach((e=>{e(t)}))}))}static needsVersionConverter(e){return a.VersionLessThan(e,a.INTERNAL_CONTRACT_VERSION)}execute(e,t){try{const r=this._versionConverter.downgradeExecuteCall(e,t);return this._apiDelegateDispatcher.execute(r.verb,r.parameters).then((r=>this._versionConverter.upgradeExecuteReturn(r,e,t)))}catch(e){return Promise.reject(e)}}registerNotificationHandler(e){this._notificationHandlers.push(e)}unregisterNotificationHandler(e){this._notificationHandlers=this._notificationHandlers.filter((t=>t!==e))}}},6680:(e,t,r)=>{"use strict";var a;r.r(t),r.d(t,{NIL:()=>F,parse:()=>y,stringify:()=>c,v1:()=>g,v3:()=>P,v4:()=>_,v5:()=>C,validate:()=>o,version:()=>x});var i=new Uint8Array(16);function n(){if(!a&&!(a="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto)))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return a(i)}const s=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i,o=function(e){return"string"==typeof e&&s.test(e)};for(var l=[],d=0;d<256;++d)l.push((d+256).toString(16).substr(1));const c=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,r=(l[e[t+0]]+l[e[t+1]]+l[e[t+2]]+l[e[t+3]]+"-"+l[e[t+4]]+l[e[t+5]]+"-"+l[e[t+6]]+l[e[t+7]]+"-"+l[e[t+8]]+l[e[t+9]]+"-"+l[e[t+10]]+l[e[t+11]]+l[e[t+12]]+l[e[t+13]]+l[e[t+14]]+l[e[t+15]]).toLowerCase();if(!o(r))throw TypeError("Stringified UUID is invalid");return r};var u,h,p=0,m=0;const g=function(e,t,r){var a=t&&r||0,i=t||new Array(16),s=(e=e||{}).node||u,o=void 0!==e.clockseq?e.clockseq:h;if(null==s||null==o){var l=e.random||(e.rng||n)();null==s&&(s=u=[1|l[0],l[1],l[2],l[3],l[4],l[5]]),null==o&&(o=h=16383&(l[6]<<8|l[7]))}var d=void 0!==e.msecs?e.msecs:Date.now(),g=void 0!==e.nsecs?e.nsecs:m+1,y=d-p+(g-m)/1e4;if(y<0&&void 0===e.clockseq&&(o=o+1&16383),(y<0||d>p)&&void 0===e.nsecs&&(g=0),g>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");p=d,m=g,h=o;var I=(1e4*(268435455&(d+=122192928e5))+g)%4294967296;i[a++]=I>>>24&255,i[a++]=I>>>16&255,i[a++]=I>>>8&255,i[a++]=255&I;var v=d/4294967296*1e4&268435455;i[a++]=v>>>8&255,i[a++]=255&v,i[a++]=v>>>24&15|16,i[a++]=v>>>16&255,i[a++]=o>>>8|128,i[a++]=255&o;for(var S=0;S<6;++S)i[a+S]=s[S];return t||c(i)},y=function(e){if(!o(e))throw TypeError("Invalid UUID");var t,r=new Uint8Array(16);return r[0]=(t=parseInt(e.slice(0,8),16))>>>24,r[1]=t>>>16&255,r[2]=t>>>8&255,r[3]=255&t,r[4]=(t=parseInt(e.slice(9,13),16))>>>8,r[5]=255&t,r[6]=(t=parseInt(e.slice(14,18),16))>>>8,r[7]=255&t,r[8]=(t=parseInt(e.slice(19,23),16))>>>8,r[9]=255&t,r[10]=(t=parseInt(e.slice(24,36),16))/1099511627776&255,r[11]=t/4294967296&255,r[12]=t>>>24&255,r[13]=t>>>16&255,r[14]=t>>>8&255,r[15]=255&t,r};function I(e,t,r){function a(e,a,i,n){if("string"==typeof e&&(e=function(e){e=unescape(encodeURIComponent(e));for(var t=[],r=0;r>>9<<4)+1}function S(e,t){var r=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(r>>16)<<16|65535&r}function T(e,t,r,a,i,n){return S((s=S(S(t,e),S(a,n)))<<(o=i)|s>>>32-o,r);var s,o}function b(e,t,r,a,i,n,s){return T(t&r|~t&a,e,t,i,n,s)}function f(e,t,r,a,i,n,s){return T(t&a|r&~a,e,t,i,n,s)}function E(e,t,r,a,i,n,s){return T(t^r^a,e,t,i,n,s)}function A(e,t,r,a,i,n,s){return T(r^(t|~a),e,t,i,n,s)}const P=I("v3",48,(function(e){if("string"==typeof e){var t=unescape(encodeURIComponent(e));e=new Uint8Array(t.length);for(var r=0;r>5]>>>i%32&255,s=parseInt(a.charAt(n>>>4&15)+a.charAt(15&n),16);t.push(s)}return t}(function(e,t){e[t>>5]|=128<>5]|=(255&e[a/8])<>>32-t}const C=I("v5",80,(function(e){var t=[1518500249,1859775393,2400959708,3395469782],r=[1732584193,4023233417,2562383102,271733878,3285377520];if("string"==typeof e){var a=unescape(encodeURIComponent(e));e=[];for(var i=0;i>>0;S=v,v=I,I=D(y,30)>>>0,y=g,g=f}r[0]=r[0]+g>>>0,r[1]=r[1]+y>>>0,r[2]=r[2]+I>>>0,r[3]=r[3]+v>>>0,r[4]=r[4]+S>>>0}return[r[0]>>24&255,r[0]>>16&255,r[0]>>8&255,255&r[0],r[1]>>24&255,r[1]>>16&255,r[1]>>8&255,255&r[1],r[2]>>24&255,r[2]>>16&255,r[2]>>8&255,255&r[2],r[3]>>24&255,r[3]>>16&255,r[3]>>8&255,255&r[3],r[4]>>24&255,r[4]>>16&255,r[4]>>8&255,255&r[4]]})),F="00000000-0000-0000-0000-000000000000",x=function(e){if(!o(e))throw TypeError("Invalid UUID");return parseInt(e.substr(14,1),16)}},5892:e=>{"use strict";e.exports=JSON.parse('{"major":1,"minor":188,"fix":0}')}},t={};function r(a){var i=t[a];if(void 0!==i)return i.exports;var n=t[a]={exports:{}};return e[a].call(n.exports,n,n.exports,r),n.exports}r.d=(e,t)=>{for(var a in t)r.o(t,a)&&!r.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var a={};(()=>{"use strict";var e=a;Object.defineProperty(e,"__esModule",{value:!0});const t=r(5136),i=r(976),n=r(5408),s="undefined"!=typeof VERSION_IS_ALPHA&&VERSION_IS_ALPHA;t.ApiVersion.SetVersionNumber("1.15.0-pre.15",s);const o=new i.ExtensionsImpl;e.extensions=new n.Extensions(o);var l=r(7419);e.AnalyticsObjectType=l.AnalyticsObjectType,e.AnnotationType=l.AnnotationType,e.ClassNameKey=l.ClassNameKey,e.ColumnType=l.ColumnType,e.DashboardLayoutChange=l.DashboardLayoutChange,e.DashboardObjectType=l.DashboardObjectType,e.DashboardObjectVisibilityType=l.DashboardObjectVisibilityType,e.DataType=l.DataType,e.DateRangeType=l.DateRangeType,e.DialogStyle=l.DialogStyle,e.EncodingType=l.EncodingType,e.ErrorCodes=l.ErrorCodes,e.ExtensionContext=l.ExtensionContext,e.ExtensionMode=l.ExtensionMode,e.FieldAggregationType=l.FieldAggregationType,e.FieldRoleType=l.FieldRoleType,e.FilterDomainType=l.FilterDomainType,e.FilterNullOption=l.FilterNullOption,e.FilterType=l.FilterType,e.FilterUpdateType=l.FilterUpdateType,e.HierarchicalLevelSelectionState=l.HierarchicalLevelSelectionState,e.IncludeDataValuesOption=l.IncludeDataValuesOption,e.MarkType=l.MarkType,e.ParameterValueType=l.ParameterValueType,e.PeriodType=l.PeriodType,e.QuickTableCalcType=l.QuickTableCalcType,e.ReplaySpeedType=l.ReplaySpeedType,e.SelectionUpdateType=l.SelectionUpdateType,e.SelectOptions=l.SelectOptions,e.SheetType=l.SheetType,e.SortDirection=l.SortDirection,e.TableauEventType=l.TableauEventType,e.TrendLineModelType=l.TrendLineModelType,e.VizImageEncodingType=l.VizImageEncodingType,e.VizImagePaletteType=l.VizImagePaletteType,e.VizImageSizeSettingAlignmentType=l.VizImageSizeSettingAlignmentType,e.VizImageSizeSettingType=l.VizImageSizeSettingType,e.VizImageSortDirectionType=l.VizImageSortDirectionType,e.ZoneVisibilityType=l.ZoneVisibilityType})(),window.tableau=a})(); +//# sourceMappingURL=tableau.extensions.1.15.0-pre.15.min.js.map \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 15fdeb1..e1821d8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,19 +1,19 @@ { "name": "extensions-api-sdk", - "version": "1.14.0", + "version": "1.15.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "extensions-api-sdk", - "version": "1.14.0", + "version": "1.15.0", "license": "MIT", "dependencies": { "http-server": "^14.1.0" }, "devDependencies": { - "@tableau/extensions-api-types": "1.14.0", - "@tableau/tabextsandbox": "1.14.0", + "@tableau/extensions-api-types": "1.15.0", + "@tableau/tabextsandbox": "1.15.0", "@tableau/tableau-ui": "3.10", "@testing-library/jest-dom": "^5.11.0", "@testing-library/react": "^11.1.0", @@ -1496,18 +1496,19 @@ } }, "node_modules/@tableau/extensions-api-types": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/@tableau/extensions-api-types/-/extensions-api-types-1.14.0.tgz", - "integrity": "sha512-3J4ayxARdYVY8z9bopKQf+RAdXIiNpp7k7VIKBLThRztlVp85bf90dSc6JcxZlgnhumHzdDzFVvLrvDdF++rwA==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@tableau/extensions-api-types/-/extensions-api-types-1.15.0.tgz", + "integrity": "sha512-rSB8M8o6cZeIOmfSEJ+INNxeepdhTaOyoBZ8qV0QpRrK5DyB6W1eW8kMjeovOquPoXDYIQpRRoB9QpHhBLhaCw==", "dev": true, + "license": "MIT", "dependencies": { "@types/lodash": "^4.14.126" } }, "node_modules/@tableau/tabextsandbox": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/@tableau/tabextsandbox/-/tabextsandbox-1.14.0.tgz", - "integrity": "sha512-zDLh8SnqhsNaqcO35yD1AgE8l1JbQf0x/HBdR9GbwOQjiXub7Xd8zE5dMkS+ndsvpQTzBfMNpNvWBEeqYIARCQ==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@tableau/tabextsandbox/-/tabextsandbox-1.15.0.tgz", + "integrity": "sha512-wfc2ppjMXrhxhJ5a7WVo+tRTk8TjplpYwAIiiCWvUzKXjNx6A8qigyBys9QJaIYtL9KhlkqaFV2JOKIzqi5izg==", "dev": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 55c416c..d43857d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "extensions-api-sdk", - "version": "1.14.0", + "version": "1.15.0", "description": "Sample code and documentation for the Tableau Extensions API.", "scripts": { "build": "npm install && npm run lint && webpack --config webpack.config.js", @@ -24,8 +24,8 @@ "http-server": "^14.1.0" }, "devDependencies": { - "@tableau/extensions-api-types": "1.14.0", - "@tableau/tabextsandbox": "1.14.0", + "@tableau/extensions-api-types": "1.15.0", + "@tableau/tabextsandbox": "1.15.0", "@tableau/tableau-ui": "3.10", "@testing-library/jest-dom": "^5.11.0", "@testing-library/react": "^11.1.0",